commit
53c5ccc00a
|
|
@ -50,3 +50,10 @@ vite.config.ts.*
|
||||||
*.sw?
|
*.sw?
|
||||||
.history
|
.history
|
||||||
.cursor
|
.cursor
|
||||||
|
|
||||||
|
# AI
|
||||||
|
.agent
|
||||||
|
.agents
|
||||||
|
.claude
|
||||||
|
.codex
|
||||||
|
skills-lock.json
|
||||||
|
|
|
||||||
4
.npmrc
4
.npmrc
|
|
@ -1,8 +1,8 @@
|
||||||
registry=https://registry.npmmirror.com
|
registry=https://registry.npmmirror.com
|
||||||
public-hoist-pattern[]=lefthook
|
public-hoist-pattern[]=lefthook
|
||||||
public-hoist-pattern[]=eslint
|
public-hoist-pattern[]=eslint
|
||||||
public-hoist-pattern[]=prettier
|
public-hoist-pattern[]=oxfmt
|
||||||
public-hoist-pattern[]=prettier-plugin-tailwindcss
|
public-hoist-pattern[]=oxlint
|
||||||
public-hoist-pattern[]=stylelint
|
public-hoist-pattern[]=stylelint
|
||||||
public-hoist-pattern[]=*postcss*
|
public-hoist-pattern[]=*postcss*
|
||||||
public-hoist-pattern[]=@commitlint/*
|
public-hoist-pattern[]=@commitlint/*
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
dist
|
|
||||||
dev-dist
|
|
||||||
.local
|
|
||||||
.output.js
|
|
||||||
node_modules
|
|
||||||
.nvmrc
|
|
||||||
coverage
|
|
||||||
CODEOWNERS
|
|
||||||
.nitro
|
|
||||||
.output
|
|
||||||
|
|
||||||
|
|
||||||
**/*.svg
|
|
||||||
**/*.sh
|
|
||||||
|
|
||||||
public
|
|
||||||
.npmrc
|
|
||||||
*-lock.yaml
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
export { default } from '@vben/prettier-config';
|
|
||||||
|
|
@ -2,3 +2,7 @@ dist
|
||||||
public
|
public
|
||||||
__tests__
|
__tests__
|
||||||
coverage
|
coverage
|
||||||
|
.codex
|
||||||
|
.claude
|
||||||
|
.agent
|
||||||
|
.agents
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,12 @@
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
// Vue 3 的语言支持
|
// Vue 3 的语言支持
|
||||||
"Vue.volar",
|
"Vue.volar",
|
||||||
// 将 ESLint JavaScript 集成到 VS Code 中。
|
// 将 oxlint 集成到 VS Code 中。
|
||||||
"dbaeumer.vscode-eslint",
|
"oxc.oxc-vscode",
|
||||||
// Visual Studio Code 的官方 Stylelint 扩展
|
// Visual Studio Code 的官方 Stylelint 扩展
|
||||||
"stylelint.vscode-stylelint",
|
"stylelint.vscode-stylelint",
|
||||||
// 使用 Prettier 的代码格式化程序
|
// 使用 oxfmt 的代码格式化程序
|
||||||
"esbenp.prettier-vscode",
|
"oxc.oxc-vscode",
|
||||||
// 支持 dotenv 文件语法
|
// 支持 dotenv 文件语法
|
||||||
"mikestead.dotenv",
|
"mikestead.dotenv",
|
||||||
// 源代码的拼写检查器
|
// 源代码的拼写检查器
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
"tailwindCSS.experimental.configFile": "internal/tailwind-config/src/index.ts",
|
"tailwindCSS.experimental.configFile": "packages/@core/base/design/src/css/global.css",
|
||||||
|
"tailwindCSS.lint.suggestCanonicalClasses": "ignore",
|
||||||
// workbench
|
// workbench
|
||||||
"workbench.list.smoothScrolling": true,
|
"workbench.list.smoothScrolling": true,
|
||||||
"workbench.startupEditor": "newUntitledFile",
|
"workbench.startupEditor": "newUntitledFile",
|
||||||
|
|
@ -31,39 +32,49 @@
|
||||||
"editor.autoClosingOvertype": "always",
|
"editor.autoClosingOvertype": "always",
|
||||||
"editor.autoClosingQuotes": "beforeWhitespace",
|
"editor.autoClosingQuotes": "beforeWhitespace",
|
||||||
"editor.wordSeparators": "`~!@#%^&*()=+[{]}\\|;:'\",.<>/?",
|
"editor.wordSeparators": "`~!@#%^&*()=+[{]}\\|;:'\",.<>/?",
|
||||||
|
"editor.quickSuggestions": {
|
||||||
|
"strings": "on"
|
||||||
|
},
|
||||||
|
|
||||||
|
// lint && format
|
||||||
|
"oxc.enable": true,
|
||||||
|
"oxc.typeAware": true,
|
||||||
|
"oxc.configPath": "oxlint.config.ts",
|
||||||
|
"oxc.fmt.configPath": "oxfmt.config.ts",
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.eslint": "explicit",
|
"source.fixAll.oxc": "explicit",
|
||||||
"source.fixAll.stylelint": "explicit",
|
"source.fixAll.stylelint": "explicit",
|
||||||
"source.organizeImports": "never"
|
"source.organizeImports": "never"
|
||||||
},
|
},
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||||
"[html]": {
|
"[html]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[css]": {
|
"[css]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[scss]": {
|
"[scss]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[javascript]": {
|
"[javascript]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[typescript]": {
|
"[typescript]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[json]": {
|
"[json]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[markdown]": {
|
"[markdown]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[jsonc]": {
|
"[jsonc]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
"[vue]": {
|
"[vue]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
},
|
},
|
||||||
|
|
||||||
// extensions
|
// extensions
|
||||||
"extensions.ignoreRecommendations": true,
|
"extensions.ignoreRecommendations": true,
|
||||||
|
|
||||||
|
|
@ -79,6 +90,7 @@
|
||||||
"files.insertFinalNewline": true,
|
"files.insertFinalNewline": true,
|
||||||
"files.simpleDialog.enable": true,
|
"files.simpleDialog.enable": true,
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
|
"*.css": "tailwindcss",
|
||||||
"*.ejs": "html",
|
"*.ejs": "html",
|
||||||
"*.art": "html",
|
"*.art": "html",
|
||||||
"**/tsconfig.json": "jsonc",
|
"**/tsconfig.json": "jsonc",
|
||||||
|
|
@ -118,7 +130,7 @@
|
||||||
// search
|
// search
|
||||||
"search.searchEditor.singleClickBehaviour": "peekDefinition",
|
"search.searchEditor.singleClickBehaviour": "peekDefinition",
|
||||||
"search.followSymlinks": false,
|
"search.followSymlinks": false,
|
||||||
// 在使用搜索功能时,将这些文件夹/文件排除在外
|
// 使用搜索功能时,将这些文件和文件夹排除在外
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
"**/node_modules": true,
|
"**/node_modules": true,
|
||||||
"**/*.log": true,
|
"**/*.log": true,
|
||||||
|
|
@ -193,7 +205,7 @@
|
||||||
"*": false
|
"*": false
|
||||||
},
|
},
|
||||||
|
|
||||||
"cssVariables.lookupFiles": ["packages/core/base/design/src/**/*.css"],
|
"cssVariables.lookupFiles": ["packages/@core/base/design/src/**/*.css"],
|
||||||
|
|
||||||
"i18n-ally.localesPaths": [
|
"i18n-ally.localesPaths": [
|
||||||
"packages/locales/src/langs",
|
"packages/locales/src/langs",
|
||||||
|
|
@ -218,12 +230,10 @@
|
||||||
"*.env": "$(capture).env.*",
|
"*.env": "$(capture).env.*",
|
||||||
"README.md": "README*,CHANGELOG*,LICENSE,CNAME",
|
"README.md": "README*,CHANGELOG*,LICENSE,CNAME",
|
||||||
"package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,.gitattributes,.gitignore,.gitpod.yml,.npmrc,.browserslistrc,.node-version,.git*,.tazerc.json",
|
"package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,.gitattributes,.gitignore,.gitpod.yml,.npmrc,.browserslistrc,.node-version,.git*,.tazerc.json",
|
||||||
"eslint.config.mjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,stylelint.config.*,.lintstagedrc.mjs,cspell.json,lefthook.yml",
|
"oxlint.config.ts": ".eslintignore,.stylelintignore,.commitlintrc.*,stylelint.config.*,.lintstagedrc.mjs,cspell.json,lefthook.yml,oxfmt.config.*,eslint.config.*"
|
||||||
"tailwind.config.mjs": "postcss.*"
|
|
||||||
},
|
},
|
||||||
"commentTranslate.hover.enabled": false,
|
"commentTranslate.hover.enabled": false,
|
||||||
"commentTranslate.multiLineMerge": true,
|
"commentTranslate.multiLineMerge": true,
|
||||||
"vue.server.hybridMode": true,
|
"vue.server.hybridMode": true,
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
"typescript.tsdk": "node_modules/typescript/lib"
|
||||||
"oxc.enable": false
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
30
README.md
30
README.md
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
## 🐶 新手必读
|
## 🐶 新手必读
|
||||||
|
|
||||||
- nodejs > v20.19.0 | v22 | v24 && pnpm > 10.20.0 (强制使用pnpm)
|
- nodejs >= v20.19.0(推荐 v22 / v24) && pnpm >= 10.32.1(强制使用 pnpm)
|
||||||
- 演示地址【Vue3 + element-plus】:<http://dashboard-vue3.yudao.iocoder.cn>
|
- 演示地址【Vue3 + element-plus】:<http://dashboard-vue3.yudao.iocoder.cn>
|
||||||
- 演示地址【Vue3 + vben5(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn>
|
- 演示地址【Vue3 + vben5(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn>
|
||||||
- 演示地址【Vue2 + element-ui】:<http://dashboard.yudao.iocoder.cn>
|
- 演示地址【Vue2 + element-ui】:<http://dashboard.yudao.iocoder.cn>
|
||||||
|
|
@ -20,12 +20,12 @@
|
||||||
|
|
||||||
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
|
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
|
||||||
|
|
||||||
- 采用最新 [vue-vben-admin](https://github.com/vbenjs/vue-vben-admin) v5 实现
|
- 采用最新 [vue-vben-admin](https://github.com/vbenjs/vue-vben-admin) v5.7.0 实现
|
||||||
- 支持 [Ant Design Vue](https://www.antdv.com/) | [Element Plus](https://element-plus.org/zh-CN/) | [Naive UI](https://www.naiveui.com/) | [TDesign](https://tdesign.tencent.com/) 多种免费开源的中后台模版,具备如下特性:
|
- 支持 [Ant Design Vue](https://www.antdv.com/) | [Element Plus](https://element-plus.org/zh-CN/) | [Naive UI](https://www.naiveui.com/) | [TDesign](https://tdesign.tencent.com/) 多种免费开源的中后台模版,具备如下特性:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- **最新技术栈**:使用 Vue3、Vite7 等前端前沿技术开发
|
- **最新技术栈**:使用 Vue3、Vite8 等前端前沿技术开发
|
||||||
- **TypeScript**: 应用程序级 JavaScript 的语言
|
- **TypeScript**: 应用程序级 JavaScript 的语言
|
||||||
- **主题**: 提供多套主题色彩,可配置自定义主题
|
- **主题**: 提供多套主题色彩,可配置自定义主题
|
||||||
- **国际化**:内置完善的国际化方案
|
- **国际化**:内置完善的国际化方案
|
||||||
|
|
@ -41,24 +41,24 @@
|
||||||
|
|
||||||
| 框架 | 说明 | 版本 |
|
| 框架 | 说明 | 版本 |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| [Vue](https://staging-cn.vuejs.org/) | vue框架 | 3.5.27 |
|
| [Vue](https://staging-cn.vuejs.org/) | vue框架 | 3.5.30 |
|
||||||
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 7.3.1 |
|
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 8.0.0 |
|
||||||
| [Ant Design Vue](https://www.antdv.com/) | Ant Design Vue | 4.2.6 |
|
| [Ant Design Vue](https://www.antdv.com/) | Ant Design Vue | 4.2.6 |
|
||||||
| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.13.1 |
|
| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.13.5 |
|
||||||
| [Naive UI](https://www.naiveui.com/) | Naive UI | 2.43.2 |
|
| [Naive UI](https://www.naiveui.com/) | Naive UI | 2.44.1 |
|
||||||
| [TDesign](https://tdesign.tencent.com/) | TDesign | 1.18.0 |
|
| [TDesign](https://tdesign.tencent.com/) | TDesign | 1.18.5 |
|
||||||
| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 超集 | 5.9.3 |
|
| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 超集 | 5.9.3 |
|
||||||
| [pinia](https://pinia.vuejs.org/) | Vue 存储库替代 vuex5 | 3.0.4 |
|
| [pinia](https://pinia.vuejs.org/) | Vue 存储库替代 vuex5 | 3.0.4 |
|
||||||
| [vueuse](https://vueuse.org/) | 常用工具集 | 14.1.0 |
|
| [vueuse](https://vueuse.org/) | 常用工具集 | 14.2.1 |
|
||||||
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 11.2.8 |
|
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 11.3.0 |
|
||||||
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.6.4 |
|
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 5.0.3 |
|
||||||
| [Tailwind CSS](https://tailwindcss.com/) | 原子 CSS | 3.4.19 |
|
| [Tailwind CSS](https://tailwindcss.com/) | 原子 CSS | 4.2.1 |
|
||||||
| [Iconify](https://iconify.design/) | 图标组件 | 5.0.0 |
|
| [Iconify](https://iconify.design/) | 图标组件 | 5.0.0 |
|
||||||
| [Iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.431 |
|
| [Iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.449 |
|
||||||
| [TinyMCE](https://www.tiny.cloud/) | 富文本编辑器 | 7.3.0 |
|
| [TinyMCE](https://www.tiny.cloud/) | 富文本编辑器 | 7.3.0 |
|
||||||
| [Echarts](https://echarts.apache.org/) | 图表库 | 6.0.0 |
|
| [Echarts](https://echarts.apache.org/) | 图表库 | 6.0.0 |
|
||||||
| [axios](https://axios-http.com/) | http客户端 | 1.13.2 |
|
| [axios](https://axios-http.com/) | http客户端 | 1.13.6 |
|
||||||
| [dayjs](https://day.js.org/) | 日期处理库 | 1.11.19 |
|
| [dayjs](https://day.js.org/) | 日期处理库 | 1.11.20 |
|
||||||
| [vee-validate](https://vee-validate.logaretm.com/) | 表单验证 | 4.15.1 |
|
| [vee-validate](https://vee-validate.logaretm.com/) | 表单验证 | 4.15.1 |
|
||||||
| [zod](https://zod.dev/) | 数据验证 | 3.25.76 |
|
| [zod](https://zod.dev/) | 数据验证 | 3.25.76 |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vben/web-antd",
|
"name": "@vben/web-antd",
|
||||||
"version": "5.6.0",
|
"version": "5.7.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
export { default } from '@vben/tailwind-config/postcss';
|
|
||||||
|
|
@ -2537,12 +2537,12 @@ interface EditorSelection {
|
||||||
normalize: () => Range;
|
normalize: () => Range;
|
||||||
selectorChanged: (selector: string, callback: (active: boolean, args: {
|
selectorChanged: (selector: string, callback: (active: boolean, args: {
|
||||||
node: Node;
|
node: Node;
|
||||||
selector: String;
|
selector: string;
|
||||||
parents: Node[];
|
parents: Node[];
|
||||||
}) => void) => EditorSelection;
|
}) => void) => EditorSelection;
|
||||||
selectorChangedWithUnbind: (selector: string, callback: (active: boolean, args: {
|
selectorChangedWithUnbind: (selector: string, callback: (active: boolean, args: {
|
||||||
node: Node;
|
node: Node;
|
||||||
selector: String;
|
selector: string;
|
||||||
parents: Node[];
|
parents: Node[];
|
||||||
}) => void) => {
|
}) => void) => {
|
||||||
unbind: () => void;
|
unbind: () => void;
|
||||||
|
|
@ -3217,9 +3217,9 @@ interface Tools {
|
||||||
<T, R>(arr: ArrayLike<T> | null | undefined, cb: ArrayCallback<T, R>): R[];
|
<T, R>(arr: ArrayLike<T> | null | undefined, cb: ArrayCallback<T, R>): R[];
|
||||||
<T, R>(obj: Record<string, T> | null | undefined, cb: ObjCallback<T, R>): R[];
|
<T, R>(obj: Record<string, T> | null | undefined, cb: ObjCallback<T, R>): R[];
|
||||||
};
|
};
|
||||||
extend: (obj: Object, ext: Object, ...objs: Object[]) => any;
|
extend: (obj: object, ext: object, ...objs: object[]) => any;
|
||||||
walk: <T extends Record<string, any>>(obj: T, f: WalkCallback<T>, n?: keyof T, scope?: any) => void;
|
walk: <T extends Record<string, any>>(obj: T, f: WalkCallback<T>, n?: keyof T, scope?: any) => void;
|
||||||
resolve: (path: string, o?: Object) => any;
|
resolve: (path: string, o?: object) => any;
|
||||||
explode: (s: string | string[], d?: string | RegExp) => string[];
|
explode: (s: string | string[], d?: string | RegExp) => string[];
|
||||||
_addCacheSuffix: (url: string) => string;
|
_addCacheSuffix: (url: string) => string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,7 @@ setupVbenVxeTable({
|
||||||
vxeUI.renderer.add('CellOperation', {
|
vxeUI.renderer.add('CellOperation', {
|
||||||
renderTableDefault({ attrs, options, props }, { column, row }) {
|
renderTableDefault({ attrs, options, props }, { column, row }) {
|
||||||
const defaultProps = { size: 'small', type: 'link', ...props };
|
const defaultProps = { size: 'small', type: 'link', ...props };
|
||||||
let align = 'end';
|
let align: string;
|
||||||
switch (column.align) {
|
switch (column.align) {
|
||||||
case 'center': {
|
case 'center': {
|
||||||
align = 'center';
|
align = 'center';
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,10 @@ export namespace CrmCustomerLimitConfigApi {
|
||||||
|
|
||||||
/** 客户限制配置类型 */
|
/** 客户限制配置类型 */
|
||||||
export enum LimitConfType {
|
export enum LimitConfType {
|
||||||
/** 锁定客户数限制 */
|
|
||||||
CUSTOMER_LOCK_LIMIT = 2,
|
|
||||||
/** 拥有客户数限制 */
|
/** 拥有客户数限制 */
|
||||||
CUSTOMER_QUANTITY_LIMIT = 1,
|
CUSTOMER_QUANTITY_LIMIT = 1,
|
||||||
|
/** 锁定客户数限制 */
|
||||||
|
CUSTOMER_LOCK_LIMIT = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 查询客户限制配置列表 */
|
/** 查询客户限制配置列表 */
|
||||||
|
|
|
||||||
|
|
@ -35,11 +35,11 @@ export namespace CrmPermissionApi {
|
||||||
* CRM 业务类型枚举
|
* CRM 业务类型枚举
|
||||||
*/
|
*/
|
||||||
export enum BizTypeEnum {
|
export enum BizTypeEnum {
|
||||||
CRM_BUSINESS = 4, // 商机
|
|
||||||
CRM_CLUE = 1, // 线索
|
CRM_CLUE = 1, // 线索
|
||||||
CRM_CONTACT = 3, // 联系人
|
|
||||||
CRM_CONTRACT = 5, // 合同
|
|
||||||
CRM_CUSTOMER = 2, // 客户
|
CRM_CUSTOMER = 2, // 客户
|
||||||
|
CRM_CONTACT = 3, // 联系人
|
||||||
|
CRM_BUSINESS = 4, // 商机
|
||||||
|
CRM_CONTRACT = 5, // 合同
|
||||||
CRM_PRODUCT = 6, // 产品
|
CRM_PRODUCT = 6, // 产品
|
||||||
CRM_RECEIVABLE = 7, // 回款
|
CRM_RECEIVABLE = 7, // 回款
|
||||||
CRM_RECEIVABLE_PLAN = 8, // 回款计划
|
CRM_RECEIVABLE_PLAN = 8, // 回款计划
|
||||||
|
|
|
||||||
|
|
@ -37,16 +37,12 @@ export function getModbusPoint(id: number) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 创建 Modbus 点位配置 */
|
/** 创建 Modbus 点位配置 */
|
||||||
export function createModbusPoint(
|
export function createModbusPoint(data: IotDeviceModbusPointApi.ModbusPoint) {
|
||||||
data: IotDeviceModbusPointApi.ModbusPoint,
|
|
||||||
) {
|
|
||||||
return requestClient.post('/iot/device-modbus-point/create', data);
|
return requestClient.post('/iot/device-modbus-point/create', data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 更新 Modbus 点位配置 */
|
/** 更新 Modbus 点位配置 */
|
||||||
export function updateModbusPoint(
|
export function updateModbusPoint(data: IotDeviceModbusPointApi.ModbusPoint) {
|
||||||
data: IotDeviceModbusPointApi.ModbusPoint,
|
|
||||||
) {
|
|
||||||
return requestClient.put('/iot/device-modbus-point/update', data);
|
return requestClient.put('/iot/device-modbus-point/update', data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,9 @@ function createRequestClient(baseURL: string, options?: RequestClientOptions) {
|
||||||
response.data = apiEncrypt.decryptResponse(response.data);
|
response.data = apiEncrypt.decryptResponse(response.data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('响应数据解密失败:', error);
|
console.error('响应数据解密失败:', error);
|
||||||
throw new Error(`响应数据解密失败: ${(error as Error).message}`);
|
throw new Error(`响应数据解密失败: ${(error as Error).message}`, {
|
||||||
|
cause: error,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ export function useDescription(options?: Partial<DescriptionProps>) {
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
setup(_props, { attrs, slots }) {
|
setup(_props, { attrs, slots }) {
|
||||||
return () => {
|
return () => {
|
||||||
// @ts-ignore - 避免类型实例化过深
|
// @ts-expect-error - 避免类型实例化过深
|
||||||
return h(Description, { ...propsState, ...attrs }, slots);
|
return h(Description, { ...propsState, ...attrs }, slots);
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,11 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, ref, watch } from 'vue';
|
import { onMounted, ref, watch } from 'vue';
|
||||||
|
|
||||||
|
import { AreaLevelEnum } from '@vben/constants';
|
||||||
|
|
||||||
import { Cascader } from 'ant-design-vue';
|
import { Cascader } from 'ant-design-vue';
|
||||||
|
|
||||||
import { getAreaTree } from '#/api/system/area';
|
import { getAreaTree } from '#/api/system/area';
|
||||||
import { AreaLevelEnum } from '@vben/constants';
|
|
||||||
|
|
||||||
defineOptions({ name: 'AreaSelect' });
|
defineOptions({ name: 'AreaSelect' });
|
||||||
|
|
||||||
|
|
@ -40,12 +41,13 @@ interface AreaVO {
|
||||||
interface Props {
|
interface Props {
|
||||||
modelValue?: number[] | string[];
|
modelValue?: number[] | string[];
|
||||||
value?: number[] | string[];
|
value?: number[] | string[];
|
||||||
level?: typeof AreaLevelEnum[keyof typeof AreaLevelEnum];
|
level?: (typeof AreaLevelEnum)[keyof typeof AreaLevelEnum];
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
placeholder?: string;
|
placeholder?: string;
|
||||||
clearable?: boolean;
|
clearable?: boolean;
|
||||||
showAllLevels?: boolean;
|
showAllLevels?: boolean;
|
||||||
separator?: string;
|
separator?: string;
|
||||||
|
// eslint-disable-next-line vue/require-default-prop
|
||||||
formCreateInject?: any;
|
formCreateInject?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,7 +72,7 @@ async function loadAreaTree(): Promise<void> {
|
||||||
const data = await getAreaTree();
|
const data = await getAreaTree();
|
||||||
|
|
||||||
// 根据 level 限制层级
|
// 根据 level 限制层级
|
||||||
areaTree.value = filterTreeByLevel(data || [], props.level);
|
areaTree.value = filterTreeByLevel((data || []) as AreaVO[], props.level);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn('[AreaSelect] 加载地区数据失败:', error);
|
console.warn('[AreaSelect] 加载地区数据失败:', error);
|
||||||
areaTree.value = [];
|
areaTree.value = [];
|
||||||
|
|
@ -99,7 +101,7 @@ function filterTreeByLevel(tree: AreaVO[], maxLevel: number): AreaVO[] {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理选中值变化
|
// 处理选中值变化
|
||||||
function handleChange(value: number[] | undefined): void {
|
function handleChange(value: any): void {
|
||||||
if (value === undefined || value === null) {
|
if (value === undefined || value === null) {
|
||||||
emit('update:modelValue', undefined);
|
emit('update:modelValue', undefined);
|
||||||
emit('update:value', undefined);
|
emit('update:value', undefined);
|
||||||
|
|
|
||||||
|
|
@ -39,15 +39,16 @@ interface DeptVO {
|
||||||
status?: number;
|
status?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @puhui999:linter 报错;
|
|
||||||
/** 接受父组件参数 */
|
/** 接受父组件参数 */
|
||||||
interface Props {
|
interface Props {
|
||||||
|
// eslint-disable-next-line vue/require-default-prop
|
||||||
modelValue?: number | number[] | string | string[];
|
modelValue?: number | number[] | string | string[];
|
||||||
multiple?: boolean;
|
multiple?: boolean;
|
||||||
returnType?: 'id' | 'name';
|
returnType?: 'id' | 'name';
|
||||||
defaultCurrentDept?: boolean;
|
defaultCurrentDept?: boolean;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
placeholder?: string;
|
placeholder?: string;
|
||||||
|
// eslint-disable-next-line vue/require-default-prop
|
||||||
formCreateInject?: any;
|
formCreateInject?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ interface Props {
|
||||||
allowfullscreen?: boolean;
|
allowfullscreen?: boolean;
|
||||||
loading?: 'eager' | 'lazy';
|
loading?: 'eager' | 'lazy';
|
||||||
sandbox?: string;
|
sandbox?: string;
|
||||||
|
// eslint-disable-next-line vue/require-default-prop
|
||||||
formCreateInject?: any;
|
formCreateInject?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,9 +73,9 @@ const showPreview = computed(() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
.iframe-preview {
|
.iframe-preview {
|
||||||
|
overflow: hidden;
|
||||||
border: 1px solid #d9d9d9;
|
border: 1px solid #d9d9d9;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.iframe-content {
|
.iframe-content {
|
||||||
|
|
@ -87,8 +88,8 @@ const showPreview = computed(() => {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
min-height: 200px;
|
min-height: 200px;
|
||||||
|
background-color: #fafafa;
|
||||||
border: 1px dashed #d9d9d9;
|
border: 1px dashed #d9d9d9;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: #fafafa;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -193,7 +193,8 @@ export function useApiSelect(option: ApiSelectProps) {
|
||||||
let parse: any = null;
|
let parse: any = null;
|
||||||
if (props.parseFunc) {
|
if (props.parseFunc) {
|
||||||
// 解析字符串函数
|
// 解析字符串函数
|
||||||
// eslint-disable-next-line no-new-func
|
// oxlint-disable-next-line typescript/no-implied-eval
|
||||||
|
// oxlint-disable-next-line no-new-func, typescript/no-implied-eval
|
||||||
parse = new Function(`return ${props.parseFunc}`)();
|
parse = new Function(`return ${props.parseFunc}`)();
|
||||||
}
|
}
|
||||||
return parse;
|
return parse;
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,14 @@ import formCreate from '@form-create/ant-design-vue';
|
||||||
import { apiSelectRule } from '#/components/form-create/rules/data';
|
import { apiSelectRule } from '#/components/form-create/rules/data';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
useAreaSelectRule,
|
||||||
useDictSelectRule,
|
useDictSelectRule,
|
||||||
useEditorRule,
|
useEditorRule,
|
||||||
|
useIframeRule,
|
||||||
useSelectRule,
|
useSelectRule,
|
||||||
useUploadFileRule,
|
useUploadFileRule,
|
||||||
useUploadImageRule,
|
useUploadImageRule,
|
||||||
useUploadImagesRule,
|
useUploadImagesRule,
|
||||||
useIframeRule,
|
|
||||||
useAreaSelectRule,
|
|
||||||
} from './rules';
|
} from './rules';
|
||||||
|
|
||||||
/** 编码表单 Conf */
|
/** 编码表单 Conf */
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
/* eslint-disable no-template-curly-in-string */
|
|
||||||
const selectRule = [
|
const selectRule = [
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
|
|
@ -134,7 +133,7 @@ const apiSelectRule = [
|
||||||
type: 'input',
|
type: 'input',
|
||||||
field: 'labelField',
|
field: 'labelField',
|
||||||
title: 'label 属性',
|
title: 'label 属性',
|
||||||
info: '可以使用 el 表达式:${属性},来实现复杂数据组合。如:${nickname}-${id}',
|
info: `可以使用 el 表达式:\${属性},来实现复杂数据组合。如:\${nickname}-\${id}`,
|
||||||
props: {
|
props: {
|
||||||
placeholder: 'nickname',
|
placeholder: 'nickname',
|
||||||
},
|
},
|
||||||
|
|
@ -143,7 +142,7 @@ const apiSelectRule = [
|
||||||
type: 'input',
|
type: 'input',
|
||||||
field: 'valueField',
|
field: 'valueField',
|
||||||
title: 'value 属性',
|
title: 'value 属性',
|
||||||
info: '可以使用 el 表达式:${属性},来实现复杂数据组合。如:${nickname}-${id}',
|
info: `可以使用 el 表达式:\${属性},来实现复杂数据组合。如:\${nickname}-\${id}`,
|
||||||
props: {
|
props: {
|
||||||
placeholder: 'id',
|
placeholder: 'id',
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
|
import { AreaLevelEnum } from '@vben/constants';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/form-create/helpers';
|
} from '#/components/form-create/helpers';
|
||||||
import { AreaLevelEnum } from '@vben/constants';
|
|
||||||
|
|
||||||
/** 省市区选择器规则 */
|
/** 省市区选择器规则 */
|
||||||
export function useAreaSelectRule() {
|
export function useAreaSelectRule() {
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ onMounted(async () => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<!-- eslint-disable-next-line vue/no-v-html -->
|
||||||
<div ref="contentRef" class="markdown-view" v-html="renderedMarkdown"></div>
|
<div ref="contentRef" class="markdown-view" v-html="renderedMarkdown"></div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,7 @@ async function handlePreview(file: UploadFile) {
|
||||||
async function handleRemove(file: UploadFile) {
|
async function handleRemove(file: UploadFile) {
|
||||||
if (fileList.value) {
|
if (fileList.value) {
|
||||||
const index = fileList.value.findIndex((item) => item.uid === file.uid);
|
const index = fileList.value.findIndex((item) => item.uid === file.uid);
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
index !== -1 && fileList.value.splice(index, 1);
|
index !== -1 && fileList.value.splice(index, 1);
|
||||||
const value = getValue();
|
const value = getValue();
|
||||||
isInnerOperate.value = true;
|
isInnerOperate.value = true;
|
||||||
|
|
@ -350,6 +351,8 @@ function getValue() {
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.ant-upload-select-picture-card {
|
.ant-upload-select-picture-card {
|
||||||
@apply flex items-center justify-center;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ export const useAuthStore = defineStore('auth', () => {
|
||||||
if (accessStore.loginExpired) {
|
if (accessStore.loginExpired) {
|
||||||
accessStore.setLoginExpired(false);
|
accessStore.setLoginExpired(false);
|
||||||
} else {
|
} else {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
onSuccess
|
onSuccess
|
||||||
? await onSuccess?.()
|
? await onSuccess?.()
|
||||||
: await router.push(
|
: await router.push(
|
||||||
|
|
@ -132,6 +133,7 @@ export const useAuthStore = defineStore('auth', () => {
|
||||||
|
|
||||||
async function fetchUserInfo() {
|
async function fetchUserInfo() {
|
||||||
// 加载
|
// 加载
|
||||||
|
// eslint-disable-next-line no-useless-assignment
|
||||||
let authPermissionInfo: AuthPermissionInfo | null = null;
|
let authPermissionInfo: AuthPermissionInfo | null = null;
|
||||||
authPermissionInfo = await getAuthPermissionInfoApi();
|
authPermissionInfo = await getAuthPermissionInfoApi();
|
||||||
// userStore
|
// userStore
|
||||||
|
|
|
||||||
|
|
@ -34,9 +34,7 @@ export const findIndex = <T = Recordable<any>>(
|
||||||
*/
|
*/
|
||||||
export const isUrl = (path: string): boolean => {
|
export const isUrl = (path: string): boolean => {
|
||||||
// fix:修复hash路由无法跳转的问题
|
// fix:修复hash路由无法跳转的问题
|
||||||
/* eslint-disable regexp/no-unused-capturing-group, regexp/no-super-linear-backtracking, regexp/no-useless-quantifier */
|
|
||||||
const reg =
|
const reg =
|
||||||
/(((^https?:(?:\/\/)?)(?:[-:&=+$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%#/.\w-]*)?\??[-+=&%@.\w]*(?:#\w*)?)?)$/;
|
/(((^https?:(?:\/\/)?)(?:[-:&=+$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%#/.\w-]*)?\??[-+=&%@.\w]*(?:#\w*)?)?)$/;
|
||||||
return reg.test(path);
|
return reg.test(path);
|
||||||
/* eslint-enable regexp/no-unused-capturing-group, regexp/no-super-linear-backtracking, regexp/no-useless-quantifier */
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -571,6 +571,7 @@ onMounted(async () => {
|
||||||
size="small"
|
size="small"
|
||||||
@click="openChatConversationUpdateForm"
|
@click="openChatConversationUpdateForm"
|
||||||
>
|
>
|
||||||
|
<!-- eslint-disable-next-line vue/no-v-html -->
|
||||||
<span v-html="activeConversation?.modelName"></span>
|
<span v-html="activeConversation?.modelName"></span>
|
||||||
<IconifyIcon icon="lucide:settings" class="ml-2 size-4" />
|
<IconifyIcon icon="lucide:settings" class="ml-2 size-4" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ const imageListRef = ref<any>(); // image 列表 ref
|
||||||
const dall3Ref = ref<any>(); // dall3(openai) ref
|
const dall3Ref = ref<any>(); // dall3(openai) ref
|
||||||
const midjourneyRef = ref<any>(); // midjourney ref
|
const midjourneyRef = ref<any>(); // midjourney ref
|
||||||
const stableDiffusionRef = ref<any>(); // stable diffusion ref
|
const stableDiffusionRef = ref<any>(); // stable diffusion ref
|
||||||
|
// @ts-expect-error: template ref is retained for future provider expansion
|
||||||
const commonRef = ref<any>(); // stable diffusion ref
|
const commonRef = ref<any>(); // stable diffusion ref
|
||||||
|
|
||||||
const selectPlatform = ref('common'); // 选中的平台
|
const selectPlatform = ref('common'); // 选中的平台
|
||||||
|
|
@ -45,7 +46,9 @@ const platformOptions = [
|
||||||
const models = ref<AiModelModelApi.Model[]>([]); // 模型列表
|
const models = ref<AiModelModelApi.Model[]>([]); // 模型列表
|
||||||
|
|
||||||
/** 绘画 start */
|
/** 绘画 start */
|
||||||
async function handleDrawStart() {}
|
function handleDrawStart() {
|
||||||
|
// drawing state is handled by child components
|
||||||
|
}
|
||||||
|
|
||||||
/** 绘画 complete */
|
/** 绘画 complete */
|
||||||
async function handleDrawComplete() {
|
async function handleDrawComplete() {
|
||||||
|
|
|
||||||
|
|
@ -150,10 +150,12 @@ defineExpose({
|
||||||
ref="mdContainerRef"
|
ref="mdContainerRef"
|
||||||
class="wh-full overflow-y-auto"
|
class="wh-full overflow-y-auto"
|
||||||
>
|
>
|
||||||
|
<!-- eslint-disable vue/no-v-html -->
|
||||||
<div
|
<div
|
||||||
class="flex flex-col items-center justify-center"
|
class="flex flex-col items-center justify-center"
|
||||||
v-html="html"
|
v-html="html"
|
||||||
></div>
|
></div>
|
||||||
|
<!-- eslint-enable vue/no-v-html -->
|
||||||
</div>
|
</div>
|
||||||
<div ref="mindMapRef" class="wh-full">
|
<div ref="mindMapRef" class="wh-full">
|
||||||
<svg
|
<svg
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ const currentSong = inject<any>('currentSong', {});
|
||||||
{{ currentSong.date }}
|
{{ currentSong.date }}
|
||||||
</div>
|
</div>
|
||||||
<Button size="small" shape="round" class="my-2">信息复用</Button>
|
<Button size="small" shape="round" class="my-2">信息复用</Button>
|
||||||
|
<!-- eslint-disable-next-line vue/no-v-html -->
|
||||||
<div class="text-xs" v-html="currentSong.lyric"></div>
|
<div class="text-xs" v-html="currentSong.lyric"></div>
|
||||||
</Card>
|
</Card>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,9 @@ async function goRun() {
|
||||||
try {
|
try {
|
||||||
convertedParams[paramKey] = convertParamValue(value, dataType);
|
convertedParams[paramKey] = convertParamValue(value, dataType);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
throw new Error(`参数 ${paramKey} 转换失败: ${error.message}`);
|
throw new Error(`参数 ${paramKey} 转换失败: ${error.message}`, {
|
||||||
|
cause: error,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,7 +177,7 @@ function convertParamValue(value: string, dataType: string) {
|
||||||
try {
|
try {
|
||||||
return JSON.parse(value);
|
return JSON.parse(value);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
throw new Error(`JSON格式错误: ${error.message}`);
|
throw new Error(`JSON格式错误: ${error.message}`, { cause: error });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import {
|
||||||
|
|
||||||
import { Button, ButtonGroup, message, Modal, Tooltip } from 'ant-design-vue';
|
import { Button, ButtonGroup, message, Modal, Tooltip } from 'ant-design-vue';
|
||||||
// 模拟流转流程
|
// 模拟流转流程
|
||||||
// @ts-ignore
|
// @ts-expect-error: token simulation package does not ship compatible types
|
||||||
import tokenSimulation from 'bpmn-js-token-simulation';
|
import tokenSimulation from 'bpmn-js-token-simulation';
|
||||||
import BpmnModeler from 'bpmn-js/lib/Modeler';
|
import BpmnModeler from 'bpmn-js/lib/Modeler';
|
||||||
// 代码高亮插件
|
// 代码高亮插件
|
||||||
|
|
@ -132,6 +132,7 @@ const emit = defineEmits([
|
||||||
'element-click',
|
'element-click',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// @ts-expect-error: file input ref is set imperatively by the template
|
||||||
const bpmnCanvas = ref();
|
const bpmnCanvas = ref();
|
||||||
const refFile = ref();
|
const refFile = ref();
|
||||||
|
|
||||||
|
|
@ -178,6 +179,7 @@ const additionalModules = computed(() => {
|
||||||
) {
|
) {
|
||||||
Modules.push(...(props.additionalModel as any[]));
|
Modules.push(...(props.additionalModel as any[]));
|
||||||
} else {
|
} else {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
props.additionalModel && Modules.push(props.additionalModel);
|
props.additionalModel && Modules.push(props.additionalModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -417,6 +419,7 @@ const processSimulation = () => {
|
||||||
// bpmnModeler.get('toggleMode', 'strict'),
|
// bpmnModeler.get('toggleMode', 'strict'),
|
||||||
// "bpmnModeler.get('toggleMode')",
|
// "bpmnModeler.get('toggleMode')",
|
||||||
// );
|
// );
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
props.simulation && bpmnModeler.get('toggleMode', 'strict').toggleMode();
|
props.simulation && bpmnModeler.get('toggleMode', 'strict').toggleMode();
|
||||||
};
|
};
|
||||||
const processRedo = () => {
|
const processRedo = () => {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import { hasPrimaryModifier } from 'diagram-js/lib/util/Mouse';
|
||||||
/**
|
/**
|
||||||
* A provider for BPMN 2.0 elements context pad
|
* A provider for BPMN 2.0 elements context pad
|
||||||
*/
|
*/
|
||||||
export default function ContextPadProvider(
|
function ContextPadProvider(
|
||||||
config,
|
config,
|
||||||
injector,
|
injector,
|
||||||
eventBus,
|
eventBus,
|
||||||
|
|
@ -57,6 +57,8 @@ export default function ContextPadProvider(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default ContextPadProvider;
|
||||||
|
|
||||||
ContextPadProvider.$inject = [
|
ContextPadProvider.$inject = [
|
||||||
'config.contextPad',
|
'config.contextPad',
|
||||||
'injector',
|
'injector',
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { isFunction, isObject } from '@vben/utils';
|
||||||
const WILDCARD = '*';
|
const WILDCARD = '*';
|
||||||
|
|
||||||
function CamundaModdleExtension(eventBus) {
|
function CamundaModdleExtension(eventBus) {
|
||||||
// eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias
|
// eslint-disable-next-line unicorn/no-this-assignment
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
eventBus.on('moddleCopy.canCopyProperty', (context) => {
|
eventBus.on('moddleCopy.canCopyProperty', (context) => {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider';
|
import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider';
|
||||||
|
|
||||||
export default function CustomPalette(
|
function CustomPalette(
|
||||||
palette,
|
palette,
|
||||||
create,
|
create,
|
||||||
elementFactory,
|
elementFactory,
|
||||||
|
|
@ -24,11 +24,21 @@ export default function CustomPalette(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const F = function () {}; // 核心,利用空对象作为中介;
|
CustomPalette.$inject = [
|
||||||
F.prototype = PaletteProvider.prototype; // 核心,将父类的原型赋值给空对象F;
|
'palette',
|
||||||
|
'create',
|
||||||
|
'elementFactory',
|
||||||
|
'spaceTool',
|
||||||
|
'lassoTool',
|
||||||
|
'handTool',
|
||||||
|
'globalConnect',
|
||||||
|
'translate',
|
||||||
|
];
|
||||||
|
|
||||||
// 利用中介函数重写原型链方法
|
CustomPalette.prototype = Object.create(PaletteProvider.prototype);
|
||||||
F.prototype.getPaletteEntries = function () {
|
CustomPalette.prototype.constructor = CustomPalette;
|
||||||
|
|
||||||
|
CustomPalette.prototype.getPaletteEntries = function () {
|
||||||
const actions = {};
|
const actions = {};
|
||||||
const create = this._create;
|
const create = this._create;
|
||||||
const elementFactory = this._elementFactory;
|
const elementFactory = this._elementFactory;
|
||||||
|
|
@ -94,8 +104,7 @@ F.prototype.getPaletteEntries = function () {
|
||||||
'hand-tool': {
|
'hand-tool': {
|
||||||
group: 'tools',
|
group: 'tools',
|
||||||
className: 'bpmn-icon-hand-tool',
|
className: 'bpmn-icon-hand-tool',
|
||||||
title: '激活抓手工具',
|
title: translate('Activate the hand tool'),
|
||||||
// title: translate("Activate the hand tool"),
|
|
||||||
action: {
|
action: {
|
||||||
click(event) {
|
click(event) {
|
||||||
handTool.activateHand(event);
|
handTool.activateHand(event);
|
||||||
|
|
@ -219,16 +228,4 @@ F.prototype.getPaletteEntries = function () {
|
||||||
return actions;
|
return actions;
|
||||||
};
|
};
|
||||||
|
|
||||||
CustomPalette.$inject = [
|
export default CustomPalette;
|
||||||
'palette',
|
|
||||||
'create',
|
|
||||||
'elementFactory',
|
|
||||||
'spaceTool',
|
|
||||||
'lassoTool',
|
|
||||||
'handTool',
|
|
||||||
'globalConnect',
|
|
||||||
'translate',
|
|
||||||
];
|
|
||||||
|
|
||||||
CustomPalette.prototype = new F(); // 核心,将 F的实例赋值给子类;
|
|
||||||
CustomPalette.prototype.constructor = CustomPalette; // 修复子类CustomPalette的构造器指向,防止原型链的混乱;
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* A palette provider for BPMN 2.0 elements.
|
* A palette provider for BPMN 2.0 elements.
|
||||||
*/
|
*/
|
||||||
export default function PaletteProvider(
|
function PaletteProvider(
|
||||||
palette,
|
palette,
|
||||||
create,
|
create,
|
||||||
elementFactory,
|
elementFactory,
|
||||||
|
|
@ -23,6 +23,8 @@ export default function PaletteProvider(
|
||||||
palette.registerProvider(this);
|
palette.registerProvider(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default PaletteProvider;
|
||||||
|
|
||||||
PaletteProvider.$inject = [
|
PaletteProvider.$inject = [
|
||||||
'palette',
|
'palette',
|
||||||
'create',
|
'create',
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
/* eslint-disable no-template-curly-in-string */
|
|
||||||
/**
|
/**
|
||||||
* This is a sample file that should be replaced with the actual translation.
|
* This is a sample file that should be replaced with the actual translation.
|
||||||
*
|
*
|
||||||
|
|
@ -238,10 +237,8 @@ export default {
|
||||||
'Due Date': '到期时间',
|
'Due Date': '到期时间',
|
||||||
'Follow Up Date': '跟踪日期',
|
'Follow Up Date': '跟踪日期',
|
||||||
Priority: '优先级',
|
Priority: '优先级',
|
||||||
'The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)':
|
[`The follow up date as an EL expression (e.g. \${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)`]: `跟踪日期必须符合EL表达式,如: \${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00`,
|
||||||
'跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00',
|
[`The due date as an EL expression (e.g. \${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)`]: `跟踪日期必须符合EL表达式,如: \${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00`,
|
||||||
'The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)':
|
|
||||||
'跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00',
|
|
||||||
Variables: '变量',
|
Variables: '变量',
|
||||||
'Candidate Starter Configuration': '候选人起动器配置',
|
'Candidate Starter Configuration': '候选人起动器配置',
|
||||||
'Candidate Starter Groups': '候选人起动器组',
|
'Candidate Starter Groups': '候选人起动器组',
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ watch(
|
||||||
val +=
|
val +=
|
||||||
props.businessObject.eventDefinitions[0]?.$type.split(':')[1] || '';
|
props.businessObject.eventDefinitions[0]?.$type.split(':')[1] || '';
|
||||||
}
|
}
|
||||||
// @ts-ignore
|
// @ts-expect-error: async component registry is indexed dynamically
|
||||||
customConfigComponent.value = (
|
customConfigComponent.value = (
|
||||||
CustomConfigMap as Record<string, { component: Component }>
|
CustomConfigMap as Record<string, { component: Component }>
|
||||||
)[val]?.component;
|
)[val]?.component;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
<!-- eslint-disable no-unused-vars -->
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { inject, nextTick, onBeforeUnmount, ref, toRaw, watch } from 'vue';
|
import { inject, nextTick, onBeforeUnmount, ref, toRaw, watch } from 'vue';
|
||||||
|
|
||||||
|
|
@ -66,13 +65,13 @@ const bpmnElement = ref<any>(null);
|
||||||
const multiLoopInstance = ref<any>(null);
|
const multiLoopInstance = ref<any>(null);
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
// @ts-ignore
|
|
||||||
bpmnInstances?: () => any;
|
bpmnInstances?: () => any;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const bpmnInstances = () => (window as any)?.bpmnInstances;
|
const bpmnInstances = () => (window as any)?.bpmnInstances;
|
||||||
|
|
||||||
|
// @ts-expect-error: retained for legacy multi-instance mode compatibility
|
||||||
// eslint-disable-next-line unused-imports/no-unused-vars
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
||||||
const getElementLoop = (businessObject: any): void => {
|
const getElementLoop = (businessObject: any): void => {
|
||||||
if (!businessObject.loopCharacteristics) {
|
if (!businessObject.loopCharacteristics) {
|
||||||
|
|
@ -141,8 +140,7 @@ const changeLoopCharacteristicsType = (type: any): void => {
|
||||||
isSequential: true,
|
isSequential: true,
|
||||||
})
|
})
|
||||||
: bpmnInstances().moddle.create('bpmn:MultiInstanceLoopCharacteristics', {
|
: bpmnInstances().moddle.create('bpmn:MultiInstanceLoopCharacteristics', {
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
collection: `\${coll_userList}`,
|
||||||
collection: '${coll_userList}',
|
|
||||||
});
|
});
|
||||||
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
||||||
loopCharacteristics: toRaw(multiLoopInstance.value),
|
loopCharacteristics: toRaw(multiLoopInstance.value),
|
||||||
|
|
@ -233,7 +231,7 @@ const updateLoopAsync = (key: any): void => {
|
||||||
extensionElements: null,
|
extensionElements: null,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
// @ts-ignore
|
// @ts-expect-error: dynamic async flags are assigned by runtime key
|
||||||
asyncAttr[key] = loopInstanceForm.value[key];
|
asyncAttr[key] = loopInstanceForm.value[key];
|
||||||
}
|
}
|
||||||
bpmnInstances().modeling.updateModdleProperties(
|
bpmnInstances().modeling.updateModdleProperties(
|
||||||
|
|
@ -247,23 +245,23 @@ const changeConfig = (config: string): void => {
|
||||||
switch (config) {
|
switch (config) {
|
||||||
case '会签': {
|
case '会签': {
|
||||||
changeLoopCharacteristicsType('ParallelMultiInstance');
|
changeLoopCharacteristicsType('ParallelMultiInstance');
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
|
||||||
updateLoopCondition('${ nrOfCompletedInstances >= nrOfInstances }');
|
updateLoopCondition(`\${ nrOfCompletedInstances >= nrOfInstances }`);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '依次审批': {
|
case '依次审批': {
|
||||||
changeLoopCharacteristicsType('SequentialMultiInstance');
|
changeLoopCharacteristicsType('SequentialMultiInstance');
|
||||||
updateLoopCardinality('1');
|
updateLoopCardinality('1');
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
|
||||||
updateLoopCondition('${ nrOfCompletedInstances >= nrOfInstances }');
|
updateLoopCondition(`\${ nrOfCompletedInstances >= nrOfInstances }`);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '或签': {
|
case '或签': {
|
||||||
changeLoopCharacteristicsType('ParallelMultiInstance');
|
changeLoopCharacteristicsType('ParallelMultiInstance');
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
|
||||||
updateLoopCondition('${ nrOfCompletedInstances > 0 }');
|
updateLoopCondition(`\${ nrOfCompletedInstances > 0 }`);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -331,8 +329,8 @@ const updateLoopCharacteristics = (): void => {
|
||||||
if (approveMethod.value === ApproveMethodType.APPROVE_BY_RATIO) {
|
if (approveMethod.value === ApproveMethodType.APPROVE_BY_RATIO) {
|
||||||
multiLoopInstance.value = bpmnInstances().moddle.create(
|
multiLoopInstance.value = bpmnInstances().moddle.create(
|
||||||
'bpmn:MultiInstanceLoopCharacteristics',
|
'bpmn:MultiInstanceLoopCharacteristics',
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
|
||||||
{ isSequential: false, collection: '${coll_userList}' },
|
{ isSequential: false, collection: `\${coll_userList}` },
|
||||||
);
|
);
|
||||||
multiLoopInstance.value.completionCondition =
|
multiLoopInstance.value.completionCondition =
|
||||||
bpmnInstances().moddle.create('bpmn:FormalExpression', {
|
bpmnInstances().moddle.create('bpmn:FormalExpression', {
|
||||||
|
|
@ -344,20 +342,19 @@ const updateLoopCharacteristics = (): void => {
|
||||||
if (approveMethod.value === ApproveMethodType.ANY_APPROVE) {
|
if (approveMethod.value === ApproveMethodType.ANY_APPROVE) {
|
||||||
multiLoopInstance.value = bpmnInstances().moddle.create(
|
multiLoopInstance.value = bpmnInstances().moddle.create(
|
||||||
'bpmn:MultiInstanceLoopCharacteristics',
|
'bpmn:MultiInstanceLoopCharacteristics',
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
|
||||||
{ isSequential: false, collection: '${coll_userList}' },
|
{ isSequential: false, collection: `\${coll_userList}` },
|
||||||
);
|
);
|
||||||
multiLoopInstance.value.completionCondition =
|
multiLoopInstance.value.completionCondition =
|
||||||
bpmnInstances().moddle.create('bpmn:FormalExpression', {
|
bpmnInstances().moddle.create('bpmn:FormalExpression', {
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
body: `\${ nrOfCompletedInstances > 0 }`,
|
||||||
body: '${ nrOfCompletedInstances > 0 }',
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (approveMethod.value === ApproveMethodType.SEQUENTIAL_APPROVE) {
|
if (approveMethod.value === ApproveMethodType.SEQUENTIAL_APPROVE) {
|
||||||
multiLoopInstance.value = bpmnInstances().moddle.create(
|
multiLoopInstance.value = bpmnInstances().moddle.create(
|
||||||
'bpmn:MultiInstanceLoopCharacteristics',
|
'bpmn:MultiInstanceLoopCharacteristics',
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
|
||||||
{ isSequential: true, collection: '${coll_userList}' },
|
{ isSequential: true, collection: `\${coll_userList}` },
|
||||||
);
|
);
|
||||||
multiLoopInstance.value.loopCardinality = bpmnInstances().moddle.create(
|
multiLoopInstance.value.loopCardinality = bpmnInstances().moddle.create(
|
||||||
'bpmn:FormalExpression',
|
'bpmn:FormalExpression',
|
||||||
|
|
@ -367,8 +364,7 @@ const updateLoopCharacteristics = (): void => {
|
||||||
);
|
);
|
||||||
multiLoopInstance.value.completionCondition =
|
multiLoopInstance.value.completionCondition =
|
||||||
bpmnInstances().moddle.create('bpmn:FormalExpression', {
|
bpmnInstances().moddle.create('bpmn:FormalExpression', {
|
||||||
// eslint-disable-next-line no-template-curly-in-string
|
body: `\${ nrOfCompletedInstances >= nrOfInstances }`,
|
||||||
body: '${ nrOfCompletedInstances >= nrOfInstances }',
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ watch(
|
||||||
() => props.type,
|
() => props.type,
|
||||||
() => {
|
() => {
|
||||||
if (props.type) {
|
if (props.type) {
|
||||||
// @ts-ignore
|
// @ts-expect-error: installed task component map is indexed dynamically
|
||||||
witchTaskComponent.value = installedComponent[props.type].component;
|
witchTaskComponent.value = installedComponent[props.type].component;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ const initCallActivity = () => {
|
||||||
|
|
||||||
// 初始化所有配置项
|
// 初始化所有配置项
|
||||||
Object.keys(formData.value).forEach((key: string) => {
|
Object.keys(formData.value).forEach((key: string) => {
|
||||||
// @ts-ignore
|
// @ts-expect-error: form state is updated through dynamic schema keys
|
||||||
formData.value[key] =
|
formData.value[key] =
|
||||||
bpmnElement.value.businessObject[key] ??
|
bpmnElement.value.businessObject[key] ??
|
||||||
formData.value[key as keyof FormData];
|
formData.value[key as keyof FormData];
|
||||||
|
|
@ -183,6 +183,7 @@ const updateElementExtensions = () => {
|
||||||
watch(
|
watch(
|
||||||
() => props.id,
|
() => props.id,
|
||||||
(val) => {
|
(val) => {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
val &&
|
val &&
|
||||||
val.length > 0 &&
|
val.length > 0 &&
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,6 @@ onMounted(() => {
|
||||||
bpmnRootElements.value
|
bpmnRootElements.value
|
||||||
.filter((el: any) => el.$type === 'bpmn:Message')
|
.filter((el: any) => el.$type === 'bpmn:Message')
|
||||||
.forEach((m: any) => {
|
.forEach((m: any) => {
|
||||||
// @ts-ignore
|
|
||||||
if (bpmnMessageRefsMap.value) {
|
if (bpmnMessageRefsMap.value) {
|
||||||
bpmnMessageRefsMap.value[m.id] = m;
|
bpmnMessageRefsMap.value[m.id] = m;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@ const bpmnInstances = () => (window as any)?.bpmnInstances;
|
||||||
|
|
||||||
const resetTaskForm = () => {
|
const resetTaskForm = () => {
|
||||||
for (const key in defaultTaskForm.value) {
|
for (const key in defaultTaskForm.value) {
|
||||||
// @ts-ignore
|
|
||||||
scriptTaskForm.value[key] =
|
scriptTaskForm.value[key] =
|
||||||
bpmnElement.value?.businessObject[
|
bpmnElement.value?.businessObject[
|
||||||
key as keyof typeof defaultTaskForm.value
|
key as keyof typeof defaultTaskForm.value
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
<!-- eslint-disable unicorn/no-nested-ternary -->
|
||||||
<!-- eslint-disable prettier/prettier -->
|
<!-- eslint-disable prettier/prettier -->
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { inject, nextTick, onBeforeUnmount, ref, watch } from 'vue';
|
import { inject, nextTick, onBeforeUnmount, ref, watch } from 'vue';
|
||||||
|
|
@ -206,9 +207,9 @@ const updateHttpExtensions = (force = false) => {
|
||||||
|
|
||||||
const persisted = HTTP_BOOLEAN_FIELDS.has(name)
|
const persisted = HTTP_BOOLEAN_FIELDS.has(name)
|
||||||
? String(!!rawValue)
|
? String(!!rawValue)
|
||||||
: (rawValue === undefined
|
: rawValue === undefined
|
||||||
? ''
|
? ''
|
||||||
: rawValue.toString());
|
: rawValue.toString();
|
||||||
|
|
||||||
desiredEntries.push([name, persisted]);
|
desiredEntries.push([name, persisted]);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ const deptTreeOptions = ref<any>(); // 部门树
|
||||||
const postOptions = ref<SystemPostApi.Post[]>([]); // 岗位列表
|
const postOptions = ref<SystemPostApi.Post[]>([]); // 岗位列表
|
||||||
const userOptions = ref<SystemUserApi.User[]>([]); // 用户列表
|
const userOptions = ref<SystemUserApi.User[]>([]); // 用户列表
|
||||||
const userGroupOptions = ref<BpmUserGroupApi.UserGroup[]>([]); // 用户组列表
|
const userGroupOptions = ref<BpmUserGroupApi.UserGroup[]>([]); // 用户组列表
|
||||||
|
// @ts-expect-error: tree ref instance type is provided by the UI library at runtime
|
||||||
const treeRef = ref<any>();
|
const treeRef = ref<any>();
|
||||||
|
|
||||||
const { formFieldOptions } = useFormFieldsPermission(FieldPermissionType.READ);
|
const { formFieldOptions } = useFormFieldsPermission(FieldPermissionType.READ);
|
||||||
|
|
@ -128,7 +129,7 @@ const resetTaskForm = () => {
|
||||||
// eslint-disable-next-line unicorn/prefer-switch
|
// eslint-disable-next-line unicorn/prefer-switch
|
||||||
if (userTaskForm.value.candidateStrategy === CandidateStrategy.EXPRESSION) {
|
if (userTaskForm.value.candidateStrategy === CandidateStrategy.EXPRESSION) {
|
||||||
// 特殊:流程表达式,只有一个 input 输入框
|
// 特殊:流程表达式,只有一个 input 输入框
|
||||||
// @ts-ignore
|
// @ts-expect-error: expression strategy stores a scalar in an array-shaped field
|
||||||
userTaskForm.value.candidateParam = [candidateParamStr];
|
userTaskForm.value.candidateParam = [candidateParamStr];
|
||||||
} else if (
|
} else if (
|
||||||
userTaskForm.value.candidateStrategy ===
|
userTaskForm.value.candidateStrategy ===
|
||||||
|
|
@ -152,7 +153,7 @@ const resetTaskForm = () => {
|
||||||
userTaskForm.value.candidateStrategy ===
|
userTaskForm.value.candidateStrategy ===
|
||||||
CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER
|
CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER
|
||||||
) {
|
) {
|
||||||
// @ts-ignore
|
// @ts-expect-error: dynamic candidate param shape varies by strategy
|
||||||
userTaskForm.value.candidateParam = +candidateParamStr;
|
userTaskForm.value.candidateParam = +candidateParamStr;
|
||||||
deptLevel.value = +candidateParamStr;
|
deptLevel.value = +candidateParamStr;
|
||||||
} else if (
|
} else if (
|
||||||
|
|
@ -303,7 +304,7 @@ const openProcessExpressionDialog = async () => {
|
||||||
const selectProcessExpression = (
|
const selectProcessExpression = (
|
||||||
expression: BpmProcessExpressionApi.ProcessExpression,
|
expression: BpmProcessExpressionApi.ProcessExpression,
|
||||||
) => {
|
) => {
|
||||||
// @ts-ignore
|
// @ts-expect-error: modal helper exposes runtime methods outside static typing
|
||||||
userTaskForm.value.candidateParam = [expression.expression];
|
userTaskForm.value.candidateParam = [expression.expression];
|
||||||
updateElementTask();
|
updateElementTask();
|
||||||
};
|
};
|
||||||
|
|
@ -311,7 +312,7 @@ const selectProcessExpression = (
|
||||||
const handleFormUserChange = (e: any) => {
|
const handleFormUserChange = (e: any) => {
|
||||||
if (e === 'PROCESS_START_USER_ID') {
|
if (e === 'PROCESS_START_USER_ID') {
|
||||||
userTaskForm.value.candidateParam = [];
|
userTaskForm.value.candidateParam = [];
|
||||||
// @ts-ignore
|
// @ts-expect-error: modal helper exposes runtime methods outside static typing
|
||||||
userTaskForm.value.candidateStrategy = CandidateStrategy.START_USER;
|
userTaskForm.value.candidateStrategy = CandidateStrategy.START_USER;
|
||||||
}
|
}
|
||||||
updateElementTask();
|
updateElementTask();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import BpmnRenderer from 'bpmn-js/lib/draw/BpmnRenderer';
|
import BpmnRenderer from 'bpmn-js/lib/draw/BpmnRenderer';
|
||||||
|
|
||||||
export default function CustomRenderer(
|
function CustomRenderer(
|
||||||
config,
|
config,
|
||||||
eventBus,
|
eventBus,
|
||||||
styles,
|
styles,
|
||||||
|
|
@ -19,12 +19,10 @@ export default function CustomRenderer(
|
||||||
2000,
|
2000,
|
||||||
);
|
);
|
||||||
|
|
||||||
this.handlers.label = function () {
|
this.handlers.label = () => null;
|
||||||
return null;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const F = function () {}; // 核心,利用空对象作为中介;
|
CustomRenderer.prototype = Object.create(BpmnRenderer.prototype);
|
||||||
F.prototype = BpmnRenderer.prototype; // 核心,将父类的原型赋值给空对象F;
|
CustomRenderer.prototype.constructor = CustomRenderer;
|
||||||
CustomRenderer.prototype = new F(); // 核心,将 F的实例赋值给子类;
|
|
||||||
CustomRenderer.prototype.constructor = CustomRenderer; // 修复子类CustomRenderer的构造器指向,防止原型链的混乱;
|
export default CustomRenderer;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import BpmnRules from 'bpmn-js/lib/features/rules/BpmnRules';
|
import BpmnRules from 'bpmn-js/lib/features/rules/BpmnRules';
|
||||||
|
// eslint-disable-next-line n/no-extraneous-import
|
||||||
import inherits from 'inherits';
|
import inherits from 'inherits';
|
||||||
|
|
||||||
export default function CustomRules(eventBus) {
|
function CustomRules(eventBus) {
|
||||||
BpmnRules.call(this, eventBus);
|
BpmnRules.call(this, eventBus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -14,3 +15,5 @@ CustomRules.prototype.canDrop = function () {
|
||||||
CustomRules.prototype.canMove = function () {
|
CustomRules.prototype.canMove = function () {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default CustomRules;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
function xmlStr2XmlObj(xmlStr) {
|
function xmlStr2XmlObj(xmlStr) {
|
||||||
|
// eslint-disable-next-line no-useless-assignment
|
||||||
let xmlObj = {};
|
let xmlObj = {};
|
||||||
if (document.all) {
|
if (document.all) {
|
||||||
const xmlDom = new window.ActiveXObject('Microsoft.XMLDOM');
|
const xmlDom = new window.ActiveXObject('Microsoft.XMLDOM');
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ const [Drawer, drawerApi] = useVbenDrawer({
|
||||||
// 当前节点
|
// 当前节点
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称
|
// 节点名称
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
||||||
useNodeName(BpmNodeTypeEnum.TRIGGER_NODE);
|
useNodeName(BpmNodeTypeEnum.TRIGGER_NODE);
|
||||||
// 触发器表单配置
|
// 触发器表单配置
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,13 @@ const emits = defineEmits<{
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
|
|
||||||
/** 监控节点的变化 */
|
/** 监控节点的变化 */
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
|
|
||||||
/** 节点名称编辑 */
|
/** 节点名称编辑 */
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
||||||
currentNode,
|
currentNode,
|
||||||
BpmNodeTypeEnum.CHILD_PROCESS_NODE,
|
BpmNodeTypeEnum.CHILD_PROCESS_NODE,
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,11 @@ const emits = defineEmits<{
|
||||||
'update:flowNode': [node: SimpleFlowNode | undefined];
|
'update:flowNode': [node: SimpleFlowNode | undefined];
|
||||||
}>();
|
}>();
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
// 监控节点的变化
|
// 监控节点的变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称编辑
|
// 节点名称编辑
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
||||||
currentNode,
|
currentNode,
|
||||||
BpmNodeTypeEnum.COPY_TASK_NODE,
|
BpmNodeTypeEnum.COPY_TASK_NODE,
|
||||||
|
|
|
||||||
|
|
@ -25,10 +25,11 @@ const emits = defineEmits<{
|
||||||
'update:flowNode': [node: SimpleFlowNode | undefined];
|
'update:flowNode': [node: SimpleFlowNode | undefined];
|
||||||
}>();
|
}>();
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
// 监控节点的变化
|
// 监控节点的变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称编辑
|
// 节点名称编辑
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
||||||
currentNode,
|
currentNode,
|
||||||
BpmNodeTypeEnum.DELAY_TIMER_NODE,
|
BpmNodeTypeEnum.DELAY_TIMER_NODE,
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ const props = defineProps({
|
||||||
// 监控节点变化
|
// 监控节点变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
const processInstance = inject<Ref<any>>('processInstance', ref({}));
|
const processInstance = inject<Ref<any>>('processInstance', ref({}));
|
||||||
|
|
||||||
const [Modal, modalApi] = useVbenModal({
|
const [Modal, modalApi] = useVbenModal({
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ const emits = defineEmits<{
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as any;
|
const { proxy } = getCurrentInstance() as any;
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
const currentNode = ref<SimpleFlowNode>(props.flowNode);
|
const currentNode = ref<SimpleFlowNode>(props.flowNode);
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ const emits = defineEmits<{
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as any;
|
const { proxy } = getCurrentInstance() as any;
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
|
|
||||||
const currentNode = ref<SimpleFlowNode>(props.flowNode);
|
const currentNode = ref<SimpleFlowNode>(props.flowNode);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ const props = defineProps({
|
||||||
|
|
||||||
const emits = defineEmits(['update:childNode']);
|
const emits = defineEmits(['update:childNode']);
|
||||||
const popoverShow = ref(false);
|
const popoverShow = ref(false);
|
||||||
const readonly = inject<Boolean>('readonly'); // 是否只读
|
const readonly = inject<boolean>('readonly'); // 是否只读
|
||||||
|
|
||||||
function addNode(type: number) {
|
function addNode(type: number) {
|
||||||
// 校验:条件分支、包容分支后面,不允许直接添加并行分支
|
// 校验:条件分支、包容分支后面,不允许直接添加并行分支
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ const emits = defineEmits<{
|
||||||
|
|
||||||
const currentNode = ref<SimpleFlowNode>(props.flowNode);
|
const currentNode = ref<SimpleFlowNode>(props.flowNode);
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.flowNode,
|
() => props.flowNode,
|
||||||
|
|
|
||||||
|
|
@ -28,10 +28,11 @@ const emits = defineEmits<{
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
// 监控节点的变化
|
// 监控节点的变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称编辑
|
// 节点名称编辑
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
||||||
currentNode,
|
currentNode,
|
||||||
BpmNodeTypeEnum.ROUTER_BRANCH_NODE,
|
BpmNodeTypeEnum.ROUTER_BRANCH_NODE,
|
||||||
|
|
|
||||||
|
|
@ -32,11 +32,12 @@ defineEmits<{
|
||||||
'update:modelValue': [node: SimpleFlowNode | undefined];
|
'update:modelValue': [node: SimpleFlowNode | undefined];
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const readonly = inject<Boolean>('readonly'); // 是否只读
|
const readonly = inject<boolean>('readonly'); // 是否只读
|
||||||
const tasks = inject<Ref<any[]>>('tasks', ref([]));
|
const tasks = inject<Ref<any[]>>('tasks', ref([]));
|
||||||
// 监控节点变化
|
// 监控节点变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称编辑
|
// 节点名称编辑
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
||||||
currentNode,
|
currentNode,
|
||||||
BpmNodeTypeEnum.START_USER_NODE,
|
BpmNodeTypeEnum.START_USER_NODE,
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ const emits = defineEmits<{
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
// 监控节点的变化
|
// 监控节点的变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称编辑
|
// 节点名称编辑
|
||||||
|
|
|
||||||
|
|
@ -32,11 +32,12 @@ const emits = defineEmits<{
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
// 是否只读
|
// 是否只读
|
||||||
const readonly = inject<Boolean>('readonly');
|
const readonly = inject<boolean>('readonly');
|
||||||
const tasks = inject<Ref<any[]>>('tasks', ref([]));
|
const tasks = inject<Ref<any[]>>('tasks', ref([]));
|
||||||
// 监控节点变化
|
// 监控节点变化
|
||||||
const currentNode = useWatchNode(props);
|
const currentNode = useWatchNode(props);
|
||||||
// 节点名称编辑
|
// 节点名称编辑
|
||||||
|
// @ts-expect-error: composable typing does not preserve this node schema exactly
|
||||||
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
||||||
currentNode,
|
currentNode,
|
||||||
BpmNodeTypeEnum.USER_TASK_NODE,
|
BpmNodeTypeEnum.USER_TASK_NODE,
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ interface DictDataType {
|
||||||
|
|
||||||
// 用户任务的审批类型。 【参考飞书】
|
// 用户任务的审批类型。 【参考飞书】
|
||||||
export enum ApproveType {
|
export enum ApproveType {
|
||||||
|
/**
|
||||||
|
* 人工审批
|
||||||
|
*/
|
||||||
|
USER = 1,
|
||||||
/**
|
/**
|
||||||
* 自动通过
|
* 自动通过
|
||||||
*/
|
*/
|
||||||
|
|
@ -15,18 +19,14 @@ export enum ApproveType {
|
||||||
* 自动拒绝
|
* 自动拒绝
|
||||||
*/
|
*/
|
||||||
AUTO_REJECT = 3,
|
AUTO_REJECT = 3,
|
||||||
/**
|
|
||||||
* 人工审批
|
|
||||||
*/
|
|
||||||
USER = 1,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 多人审批方式类型枚举 ( 用于审批节点 )
|
// 多人审批方式类型枚举 ( 用于审批节点 )
|
||||||
export enum ApproveMethodType {
|
export enum ApproveMethodType {
|
||||||
/**
|
/**
|
||||||
* 多人或签(通过只需一人,拒绝只需一人)
|
* 随机挑选一人审批
|
||||||
*/
|
*/
|
||||||
ANY_APPROVE = 3,
|
RANDOM_SELECT_ONE_APPROVE = 1,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 多人会签(按通过比例)
|
* 多人会签(按通过比例)
|
||||||
|
|
@ -34,9 +34,9 @@ export enum ApproveMethodType {
|
||||||
APPROVE_BY_RATIO = 2,
|
APPROVE_BY_RATIO = 2,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 随机挑选一人审批
|
* 多人或签(通过只需一人,拒绝只需一人)
|
||||||
*/
|
*/
|
||||||
RANDOM_SELECT_ONE_APPROVE = 1,
|
ANY_APPROVE = 3,
|
||||||
/**
|
/**
|
||||||
* 多人依次审批
|
* 多人依次审批
|
||||||
*/
|
*/
|
||||||
|
|
@ -70,34 +70,34 @@ export enum ConditionType {
|
||||||
|
|
||||||
// 操作按钮类型枚举 (用于审批节点)
|
// 操作按钮类型枚举 (用于审批节点)
|
||||||
export enum OperationButtonType {
|
export enum OperationButtonType {
|
||||||
/**
|
|
||||||
* 加签
|
|
||||||
*/
|
|
||||||
ADD_SIGN = 5,
|
|
||||||
/**
|
/**
|
||||||
* 通过
|
* 通过
|
||||||
*/
|
*/
|
||||||
APPROVE = 1,
|
APPROVE = 1,
|
||||||
/**
|
|
||||||
* 抄送
|
|
||||||
*/
|
|
||||||
COPY = 7,
|
|
||||||
/**
|
|
||||||
* 委派
|
|
||||||
*/
|
|
||||||
DELEGATE = 4,
|
|
||||||
/**
|
/**
|
||||||
* 拒绝
|
* 拒绝
|
||||||
*/
|
*/
|
||||||
REJECT = 2,
|
REJECT = 2,
|
||||||
|
/**
|
||||||
|
* 转办
|
||||||
|
*/
|
||||||
|
TRANSFER = 3,
|
||||||
|
/**
|
||||||
|
* 委派
|
||||||
|
*/
|
||||||
|
DELEGATE = 4,
|
||||||
|
/**
|
||||||
|
* 加签
|
||||||
|
*/
|
||||||
|
ADD_SIGN = 5,
|
||||||
/**
|
/**
|
||||||
* 退回
|
* 退回
|
||||||
*/
|
*/
|
||||||
RETURN = 6,
|
RETURN = 6,
|
||||||
/**
|
/**
|
||||||
* 转办
|
* 抄送
|
||||||
*/
|
*/
|
||||||
TRANSFER = 3,
|
COPY = 7,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 审批拒绝类型枚举
|
// 审批拒绝类型枚举
|
||||||
|
|
@ -114,6 +114,10 @@ export enum RejectHandlerType {
|
||||||
|
|
||||||
// 用户任务超时处理类型枚举
|
// 用户任务超时处理类型枚举
|
||||||
export enum TimeoutHandlerType {
|
export enum TimeoutHandlerType {
|
||||||
|
/**
|
||||||
|
* 自动提醒
|
||||||
|
*/
|
||||||
|
REMINDER = 1,
|
||||||
/**
|
/**
|
||||||
* 自动同意
|
* 自动同意
|
||||||
*/
|
*/
|
||||||
|
|
@ -122,10 +126,6 @@ export enum TimeoutHandlerType {
|
||||||
* 自动拒绝
|
* 自动拒绝
|
||||||
*/
|
*/
|
||||||
REJECT = 3,
|
REJECT = 3,
|
||||||
/**
|
|
||||||
* 自动提醒
|
|
||||||
*/
|
|
||||||
REMINDER = 1,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户任务的审批人为空时,处理类型枚举
|
// 用户任务的审批人为空时,处理类型枚举
|
||||||
|
|
@ -135,49 +135,49 @@ export enum AssignEmptyHandlerType {
|
||||||
*/
|
*/
|
||||||
APPROVE = 1,
|
APPROVE = 1,
|
||||||
/**
|
/**
|
||||||
* 转交给流程管理员
|
* 自动拒绝
|
||||||
*/
|
*/
|
||||||
ASSIGN_ADMIN = 4,
|
REJECT = 2,
|
||||||
/**
|
/**
|
||||||
* 指定人员审批
|
* 指定人员审批
|
||||||
*/
|
*/
|
||||||
ASSIGN_USER = 3,
|
ASSIGN_USER = 3,
|
||||||
/**
|
/**
|
||||||
* 自动拒绝
|
* 转交给流程管理员
|
||||||
*/
|
*/
|
||||||
REJECT = 2,
|
ASSIGN_ADMIN = 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户任务的审批人与发起人相同时,处理类型枚举
|
// 用户任务的审批人与发起人相同时,处理类型枚举
|
||||||
export enum AssignStartUserHandlerType {
|
export enum AssignStartUserHandlerType {
|
||||||
/**
|
/**
|
||||||
* 转交给部门负责人审批
|
* 由发起人对自己审批
|
||||||
*/
|
*/
|
||||||
ASSIGN_DEPT_LEADER = 3,
|
START_USER_AUDIT = 1,
|
||||||
/**
|
/**
|
||||||
* 自动跳过【参考飞书】:1)如果当前节点还有其他审批人,则交由其他审批人进行审批;2)如果当前节点没有其他审批人,则该节点自动通过
|
* 自动跳过【参考飞书】:1)如果当前节点还有其他审批人,则交由其他审批人进行审批;2)如果当前节点没有其他审批人,则该节点自动通过
|
||||||
*/
|
*/
|
||||||
SKIP = 2,
|
SKIP = 2,
|
||||||
/**
|
/**
|
||||||
* 由发起人对自己审批
|
* 转交给部门负责人审批
|
||||||
*/
|
*/
|
||||||
START_USER_AUDIT = 1,
|
ASSIGN_DEPT_LEADER = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 时间单位枚举
|
// 时间单位枚举
|
||||||
export enum TimeUnitType {
|
export enum TimeUnitType {
|
||||||
/**
|
/**
|
||||||
* 天
|
* 分钟
|
||||||
*/
|
*/
|
||||||
DAY = 3,
|
MINUTE = 1,
|
||||||
/**
|
/**
|
||||||
* 小时
|
* 小时
|
||||||
*/
|
*/
|
||||||
HOUR = 2,
|
HOUR = 2,
|
||||||
/**
|
/**
|
||||||
* 分钟
|
* 天
|
||||||
*/
|
*/
|
||||||
MINUTE = 1,
|
DAY = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -202,14 +202,14 @@ export enum FieldPermissionType {
|
||||||
* 延迟类型
|
* 延迟类型
|
||||||
*/
|
*/
|
||||||
export enum DelayTypeEnum {
|
export enum DelayTypeEnum {
|
||||||
/**
|
|
||||||
* 固定日期时间
|
|
||||||
*/
|
|
||||||
FIXED_DATE_TIME = 2,
|
|
||||||
/**
|
/**
|
||||||
* 固定时长
|
* 固定时长
|
||||||
*/
|
*/
|
||||||
FIXED_TIME_DURATION = 1,
|
FIXED_TIME_DURATION = 1,
|
||||||
|
/**
|
||||||
|
* 固定日期时间
|
||||||
|
*/
|
||||||
|
FIXED_DATE_TIME = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -217,35 +217,39 @@ export enum DelayTypeEnum {
|
||||||
*/
|
*/
|
||||||
export enum TriggerTypeEnum {
|
export enum TriggerTypeEnum {
|
||||||
/**
|
/**
|
||||||
* 表单数据删除触发器
|
* 发送 HTTP 请求触发器
|
||||||
*/
|
*/
|
||||||
FORM_DELETE = 11,
|
HTTP_REQUEST = 1,
|
||||||
/**
|
|
||||||
* 表单数据更新触发器
|
|
||||||
*/
|
|
||||||
FORM_UPDATE = 10,
|
|
||||||
/**
|
/**
|
||||||
* 接收 HTTP 回调请求触发器
|
* 接收 HTTP 回调请求触发器
|
||||||
*/
|
*/
|
||||||
HTTP_CALLBACK = 2,
|
HTTP_CALLBACK = 2,
|
||||||
/**
|
/**
|
||||||
* 发送 HTTP 请求触发器
|
* 表单数据更新触发器
|
||||||
*/
|
*/
|
||||||
HTTP_REQUEST = 1,
|
FORM_UPDATE = 10,
|
||||||
|
/**
|
||||||
|
* 表单数据删除触发器
|
||||||
|
*/
|
||||||
|
FORM_DELETE = 11,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ChildProcessStartUserTypeEnum {
|
export enum ChildProcessStartUserTypeEnum {
|
||||||
|
/**
|
||||||
|
* 同主流程发起人
|
||||||
|
*/
|
||||||
|
MAIN_PROCESS_START_USER = 1,
|
||||||
/**
|
/**
|
||||||
* 表单
|
* 表单
|
||||||
*/
|
*/
|
||||||
FROM_FORM = 2,
|
FROM_FORM = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum ChildProcessStartUserEmptyTypeEnum {
|
||||||
/**
|
/**
|
||||||
* 同主流程发起人
|
* 同主流程发起人
|
||||||
*/
|
*/
|
||||||
MAIN_PROCESS_START_USER = 1,
|
MAIN_PROCESS_START_USER = 1,
|
||||||
}
|
|
||||||
|
|
||||||
export enum ChildProcessStartUserEmptyTypeEnum {
|
|
||||||
/**
|
/**
|
||||||
* 子流程管理员
|
* 子流程管理员
|
||||||
*/
|
*/
|
||||||
|
|
@ -254,10 +258,6 @@ export enum ChildProcessStartUserEmptyTypeEnum {
|
||||||
* 主流程管理员
|
* 主流程管理员
|
||||||
*/
|
*/
|
||||||
MAIN_PROCESS_ADMIN = 3,
|
MAIN_PROCESS_ADMIN = 3,
|
||||||
/**
|
|
||||||
* 同主流程发起人
|
|
||||||
*/
|
|
||||||
MAIN_PROCESS_START_USER = 1,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ChildProcessMultiInstanceSourceTypeEnum {
|
export enum ChildProcessMultiInstanceSourceTypeEnum {
|
||||||
|
|
@ -265,54 +265,50 @@ export enum ChildProcessMultiInstanceSourceTypeEnum {
|
||||||
* 固定数量
|
* 固定数量
|
||||||
*/
|
*/
|
||||||
FIXED_QUANTITY = 1,
|
FIXED_QUANTITY = 1,
|
||||||
/**
|
|
||||||
* 多选表单
|
|
||||||
*/
|
|
||||||
MULTIPLE_FORM = 3,
|
|
||||||
/**
|
/**
|
||||||
* 数字表单
|
* 数字表单
|
||||||
*/
|
*/
|
||||||
NUMBER_FORM = 2,
|
NUMBER_FORM = 2,
|
||||||
|
/**
|
||||||
|
* 多选表单
|
||||||
|
*/
|
||||||
|
MULTIPLE_FORM = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 候选人策略枚举 ( 用于审批节点。抄送节点 )
|
// 候选人策略枚举 ( 用于审批节点。抄送节点 )
|
||||||
export enum CandidateStrategy {
|
export enum CandidateStrategy {
|
||||||
/**
|
/**
|
||||||
* 审批人自选
|
* 指定角色
|
||||||
*/
|
*/
|
||||||
APPROVE_USER_SELECT = 34,
|
ROLE = 10,
|
||||||
/**
|
|
||||||
* 部门的负责人
|
|
||||||
*/
|
|
||||||
DEPT_LEADER = 21,
|
|
||||||
/**
|
/**
|
||||||
* 部门成员
|
* 部门成员
|
||||||
*/
|
*/
|
||||||
DEPT_MEMBER = 20,
|
DEPT_MEMBER = 20,
|
||||||
/**
|
/**
|
||||||
* 流程表达式
|
* 部门的负责人
|
||||||
*/
|
*/
|
||||||
EXPRESSION = 60,
|
DEPT_LEADER = 21,
|
||||||
/**
|
|
||||||
* 表单内部门负责人
|
|
||||||
*/
|
|
||||||
FORM_DEPT_LEADER = 51,
|
|
||||||
/**
|
|
||||||
* 表单内用户字段
|
|
||||||
*/
|
|
||||||
FORM_USER = 50,
|
|
||||||
/**
|
|
||||||
* 连续多级部门的负责人
|
|
||||||
*/
|
|
||||||
MULTI_LEVEL_DEPT_LEADER = 23,
|
|
||||||
/**
|
/**
|
||||||
* 指定岗位
|
* 指定岗位
|
||||||
*/
|
*/
|
||||||
POST = 22,
|
POST = 22,
|
||||||
/**
|
/**
|
||||||
* 指定角色
|
* 连续多级部门的负责人
|
||||||
*/
|
*/
|
||||||
ROLE = 10,
|
MULTI_LEVEL_DEPT_LEADER = 23,
|
||||||
|
/**
|
||||||
|
* 指定用户
|
||||||
|
*/
|
||||||
|
USER = 30,
|
||||||
|
/**
|
||||||
|
* 审批人自选
|
||||||
|
*/
|
||||||
|
APPROVE_USER_SELECT = 34,
|
||||||
|
/**
|
||||||
|
* 发起人自选
|
||||||
|
*/
|
||||||
|
START_USER_SELECT = 35,
|
||||||
/**
|
/**
|
||||||
* 发起人自己
|
* 发起人自己
|
||||||
*/
|
*/
|
||||||
|
|
@ -325,18 +321,22 @@ export enum CandidateStrategy {
|
||||||
* 发起人连续多级部门的负责人
|
* 发起人连续多级部门的负责人
|
||||||
*/
|
*/
|
||||||
START_USER_MULTI_LEVEL_DEPT_LEADER = 38,
|
START_USER_MULTI_LEVEL_DEPT_LEADER = 38,
|
||||||
/**
|
|
||||||
* 发起人自选
|
|
||||||
*/
|
|
||||||
START_USER_SELECT = 35,
|
|
||||||
/**
|
|
||||||
* 指定用户
|
|
||||||
*/
|
|
||||||
USER = 30,
|
|
||||||
/**
|
/**
|
||||||
* 指定用户组
|
* 指定用户组
|
||||||
*/
|
*/
|
||||||
USER_GROUP = 40,
|
USER_GROUP = 40,
|
||||||
|
/**
|
||||||
|
* 表单内用户字段
|
||||||
|
*/
|
||||||
|
FORM_USER = 50,
|
||||||
|
/**
|
||||||
|
* 表单内部门负责人
|
||||||
|
*/
|
||||||
|
FORM_DEPT_LEADER = 51,
|
||||||
|
/**
|
||||||
|
* 流程表达式
|
||||||
|
*/
|
||||||
|
EXPRESSION = 60,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum BpmHttpRequestParamTypeEnum {
|
export enum BpmHttpRequestParamTypeEnum {
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ type EnvType = 'h5' | 'miniapp'; // 环境类型
|
||||||
|
|
||||||
// UniApp WebView 类型声明
|
// UniApp WebView 类型声明
|
||||||
interface UniWebView {
|
interface UniWebView {
|
||||||
postMessage: (options: { data: any }) => void;
|
postMessage: (options: { data: any }, targetOrigin?: string) => void;
|
||||||
getEnv: (callback: (res: any) => void) => void;
|
getEnv: (callback: (res: any) => void) => void;
|
||||||
navigateTo: (options: {
|
navigateTo: (options: {
|
||||||
fail?: () => void;
|
fail?: () => void;
|
||||||
|
|
@ -182,7 +182,7 @@ function postMessageToParent(message: { data: any; type: string }) {
|
||||||
if (envType.value === 'miniapp') {
|
if (envType.value === 'miniapp') {
|
||||||
if (window.uni?.postMessage) {
|
if (window.uni?.postMessage) {
|
||||||
// 传递的消息信息,必须写在 data 对象中
|
// 传递的消息信息,必须写在 data 对象中
|
||||||
window.uni.postMessage({ data: message.data });
|
window.uni.postMessage({ data: message.data }, window.location.origin);
|
||||||
} else {
|
} else {
|
||||||
console.error('小程序环境下 uni 对象未定义');
|
console.error('小程序环境下 uni 对象未定义');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
* - @ 自动补全:插入 mention 占位元素
|
* - @ 自动补全:插入 mention 占位元素
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @ts-ignore TinyMCE 全局或通过打包器提供
|
// TinyMCE 全局或通过打包器提供
|
||||||
import type { Editor } from 'tinymce';
|
import type { Editor } from 'tinymce';
|
||||||
|
|
||||||
export interface MentionItem {
|
export interface MentionItem {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
bpmnXml?: string;
|
bpmnXml?: string;
|
||||||
loading?: boolean; // 是否加载中
|
loading?: boolean; // 是否加载中
|
||||||
modelView?: Object;
|
modelView?: object;
|
||||||
}>(),
|
}>(),
|
||||||
{
|
{
|
||||||
loading: false,
|
loading: false,
|
||||||
|
|
@ -29,7 +29,7 @@ watch(
|
||||||
async (newModelView) => {
|
async (newModelView) => {
|
||||||
// 加载最新
|
// 加载最新
|
||||||
if (newModelView) {
|
if (newModelView) {
|
||||||
// @ts-ignore
|
// @ts-expect-error: viewer instance type is broader than local ref typing
|
||||||
view.value = newModelView;
|
view.value = newModelView;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@ const nodeTypeName = ref('审批'); // 节点类型名称
|
||||||
|
|
||||||
const reasonRequire = ref();
|
const reasonRequire = ref();
|
||||||
const approveFormRef = ref<FormInstance>(); // 审批通过意见表单
|
const approveFormRef = ref<FormInstance>(); // 审批通过意见表单
|
||||||
|
// @ts-expect-error: template ref is retained for future provider expansion
|
||||||
const approveSignFormRef = ref();
|
const approveSignFormRef = ref();
|
||||||
const nextAssigneesActivityNode = ref<BpmProcessInstanceApi.ApprovalNodeInfo[]>(
|
const nextAssigneesActivityNode = ref<BpmProcessInstanceApi.ApprovalNodeInfo[]>(
|
||||||
[],
|
[],
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import { useUserStore } from '@vben/stores';
|
||||||
import { formatDate } from '@vben/utils';
|
import { formatDate } from '@vben/utils';
|
||||||
|
|
||||||
import { Button } from 'ant-design-vue';
|
import { Button } from 'ant-design-vue';
|
||||||
// @ts-ignore - 安装 vue3-print-nb 局部指令 v-print
|
// @ts-expect-error - 安装 vue3-print-nb 局部指令 v-print
|
||||||
import vPrint from 'vue3-print-nb';
|
import vPrint from 'vue3-print-nb';
|
||||||
|
|
||||||
import { getProcessInstancePrintData } from '#/api/bpm/processInstance';
|
import { getProcessInstancePrintData } from '#/api/bpm/processInstance';
|
||||||
|
|
|
||||||
|
|
@ -76,10 +76,10 @@ const chartTabs: TabOption[] = [
|
||||||
</AnalysisChartsTabs>
|
</AnalysisChartsTabs>
|
||||||
|
|
||||||
<div class="mt-5 w-full md:flex">
|
<div class="mt-5 w-full md:flex">
|
||||||
<AnalysisChartCard class="mt-5 md:mr-4 md:mt-0 md:w-1/3" title="访问数量">
|
<AnalysisChartCard class="mt-5 md:mt-0 md:mr-4 md:w-1/3" title="访问数量">
|
||||||
<AnalyticsVisitsData />
|
<AnalyticsVisitsData />
|
||||||
</AnalysisChartCard>
|
</AnalysisChartCard>
|
||||||
<AnalysisChartCard class="mt-5 md:mr-4 md:mt-0 md:w-1/3" title="访问来源">
|
<AnalysisChartCard class="mt-5 md:mt-0 md:mr-4 md:w-1/3" title="访问来源">
|
||||||
<AnalyticsVisitsSource />
|
<AnalyticsVisitsSource />
|
||||||
</AnalysisChartCard>
|
</AnalysisChartCard>
|
||||||
<AnalysisChartCard class="mt-5 md:mt-0 md:w-1/3" title="访问来源">
|
<AnalysisChartCard class="mt-5 md:mt-0 md:w-1/3" title="访问来源">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<!-- eslint-disable no-useless-escape -->
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
// oxlint-disable no-useless-escape
|
||||||
import { onMounted, ref, unref } from 'vue';
|
import { onMounted, ref, unref } from 'vue';
|
||||||
|
|
||||||
import { Page, useVbenModal } from '@vben/common-ui';
|
import { Page, useVbenModal } from '@vben/common-ui';
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
<!-- Modbus 配置 -->
|
<!-- Modbus 配置 -->
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { VbenFormSchema, VxeTableGridOptions } from '#/adapter/vxe-table';
|
import type { VbenFormSchema } from '#/adapter/form';
|
||||||
|
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||||
import type { IotDeviceApi } from '#/api/iot/device/device';
|
import type { IotDeviceApi } from '#/api/iot/device/device';
|
||||||
import type { IotDeviceModbusConfigApi } from '#/api/iot/device/modbus/config';
|
import type { IotDeviceModbusConfigApi } from '#/api/iot/device/modbus/config';
|
||||||
import type { IotDeviceModbusPointApi } from '#/api/iot/device/modbus/point';
|
import type { IotDeviceModbusPointApi } from '#/api/iot/device/modbus/point';
|
||||||
|
|
@ -227,7 +228,7 @@ function usePointColumns(): VxeTableGridOptions['columns'] {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
const [Grid, gridApi] = useVbenVxeGrid<IotDeviceModbusPointApi.ModbusPoint>({
|
const [Grid, gridApi] = useVbenVxeGrid({
|
||||||
formOptions: {
|
formOptions: {
|
||||||
schema: usePointFormSchema(),
|
schema: usePointFormSchema(),
|
||||||
submitOnChange: true,
|
submitOnChange: true,
|
||||||
|
|
@ -255,7 +256,7 @@ const [Grid, gridApi] = useVbenVxeGrid<IotDeviceModbusPointApi.ModbusPoint>({
|
||||||
refresh: true,
|
refresh: true,
|
||||||
search: true,
|
search: true,
|
||||||
},
|
},
|
||||||
},
|
} as VxeTableGridOptions<IotDeviceModbusPointApi.ModbusPoint>,
|
||||||
});
|
});
|
||||||
|
|
||||||
/** 新增点位 - 使用 useVbenModal */
|
/** 新增点位 - 使用 useVbenModal */
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ function useFormSchema(): VbenFormSchema[] {
|
||||||
rules: 'required',
|
rules: 'required',
|
||||||
suffix: () => {
|
suffix: () => {
|
||||||
const addr = formApi.form.values?.registerAddress;
|
const addr = formApi.form.values?.registerAddress;
|
||||||
if (addr == null) {
|
if (addr === null || addr === undefined) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return h(
|
return h(
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { VbenFormSchema, VxeTableGridOptions } from '#/adapter/vxe-table';
|
import type { VbenFormSchema } from '#/adapter/form';
|
||||||
|
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||||
import type { IotDeviceApi } from '#/api/iot/device/device';
|
import type { IotDeviceApi } from '#/api/iot/device/device';
|
||||||
|
|
||||||
import { ref, watch } from 'vue';
|
import { ref, watch } from 'vue';
|
||||||
|
|
@ -71,7 +72,7 @@ function useGridColumns(): VxeTableGridOptions['columns'] {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
const [Grid, gridApi] = useVbenVxeGrid<IotDeviceApi.Device>({
|
const [Grid, gridApi] = useVbenVxeGrid({
|
||||||
gridOptions: {
|
gridOptions: {
|
||||||
columns: useGridColumns(),
|
columns: useGridColumns(),
|
||||||
height: 'auto',
|
height: 'auto',
|
||||||
|
|
@ -96,7 +97,7 @@ const [Grid, gridApi] = useVbenVxeGrid<IotDeviceApi.Device>({
|
||||||
pagerConfig: {
|
pagerConfig: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
},
|
},
|
||||||
},
|
} as VxeTableGridOptions<IotDeviceApi.Device>,
|
||||||
gridEvents: {
|
gridEvents: {
|
||||||
checkboxAll: handleRowCheckboxChange,
|
checkboxAll: handleRowCheckboxChange,
|
||||||
checkboxChange: handleRowCheckboxChange,
|
checkboxChange: handleRowCheckboxChange,
|
||||||
|
|
@ -219,7 +220,7 @@ function useAddGridColumns(): VxeTableGridOptions['columns'] {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
const [AddGrid, addGridApi] = useVbenVxeGrid<IotDeviceApi.Device>({
|
const [AddGrid, addGridApi] = useVbenVxeGrid({
|
||||||
formOptions: {
|
formOptions: {
|
||||||
schema: useAddGridFormSchema(),
|
schema: useAddGridFormSchema(),
|
||||||
submitOnChange: true,
|
submitOnChange: true,
|
||||||
|
|
@ -247,7 +248,7 @@ const [AddGrid, addGridApi] = useVbenVxeGrid<IotDeviceApi.Device>({
|
||||||
refresh: true,
|
refresh: true,
|
||||||
search: true,
|
search: true,
|
||||||
},
|
},
|
||||||
},
|
} as VxeTableGridOptions<IotDeviceApi.Device>,
|
||||||
gridEvents: {
|
gridEvents: {
|
||||||
checkboxAll: handleAddSelectionChange,
|
checkboxAll: handleAddSelectionChange,
|
||||||
checkboxChange: handleAddSelectionChange,
|
checkboxChange: handleAddSelectionChange,
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ function handleRowCheckboxChange({
|
||||||
checkedIds.value = records.map((item) => item.id!);
|
checkedIds.value = records.map((item) => item.id!);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [Grid, gridApi] = useVbenVxeGrid<IotDeviceApi.Device>({
|
const [Grid, gridApi] = useVbenVxeGrid({
|
||||||
gridOptions: {
|
gridOptions: {
|
||||||
checkboxConfig: {
|
checkboxConfig: {
|
||||||
highlight: true,
|
highlight: true,
|
||||||
|
|
@ -242,7 +242,7 @@ const [Grid, gridApi] = useVbenVxeGrid<IotDeviceApi.Device>({
|
||||||
refresh: true,
|
refresh: true,
|
||||||
search: true,
|
search: true,
|
||||||
},
|
},
|
||||||
},
|
} as VxeTableGridOptions<IotDeviceApi.Device>,
|
||||||
gridEvents: {
|
gridEvents: {
|
||||||
checkboxAll: handleRowCheckboxChange,
|
checkboxAll: handleRowCheckboxChange,
|
||||||
checkboxChange: handleRowCheckboxChange,
|
checkboxChange: handleRowCheckboxChange,
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ export const IOT_PROVIDE_KEY = {
|
||||||
/** IoT 设备状态枚举 */
|
/** IoT 设备状态枚举 */
|
||||||
export enum DeviceStateEnum {
|
export enum DeviceStateEnum {
|
||||||
INACTIVE = 0, // 未激活
|
INACTIVE = 0, // 未激活
|
||||||
OFFLINE = 2, // 离线
|
|
||||||
ONLINE = 1, // 在线
|
ONLINE = 1, // 在线
|
||||||
|
OFFLINE = 2, // 离线
|
||||||
}
|
}
|
||||||
|
|
||||||
/** IoT 产品物模型类型枚举类 */
|
/** IoT 产品物模型类型枚举类 */
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ import dayjs from 'dayjs';
|
||||||
/** 时间范围类型枚举 */
|
/** 时间范围类型枚举 */
|
||||||
export enum TimeRangeTypeEnum {
|
export enum TimeRangeTypeEnum {
|
||||||
DAY30 = 1,
|
DAY30 = 1,
|
||||||
MONTH = 30,
|
|
||||||
WEEK = 7,
|
WEEK = 7,
|
||||||
|
MONTH = 30,
|
||||||
YEAR = 365,
|
YEAR = 365,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ import dayjs from 'dayjs';
|
||||||
/** 时间范围类型枚举 */
|
/** 时间范围类型枚举 */
|
||||||
export enum TimeRangeTypeEnum {
|
export enum TimeRangeTypeEnum {
|
||||||
DAY30 = 1,
|
DAY30 = 1,
|
||||||
MONTH = 30,
|
|
||||||
WEEK = 7,
|
WEEK = 7,
|
||||||
|
MONTH = 30,
|
||||||
YEAR = 365,
|
YEAR = 365,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ defineOptions({ name: 'ProductCategorySelect' });
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: [Number, Array<Number>],
|
type: [Number, Array<number>],
|
||||||
default: undefined,
|
default: undefined,
|
||||||
}, // 选中的 ID
|
}, // 选中的 ID
|
||||||
multiple: {
|
multiple: {
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ const selectedSku = ref<MallSpuApi.Sku>();
|
||||||
/** 处理商品的选择变化 */
|
/** 处理商品的选择变化 */
|
||||||
async function handleSpuChange(spu?: MallSpuApi.Spu | null) {
|
async function handleSpuChange(spu?: MallSpuApi.Spu | null) {
|
||||||
// 处理商品选择:如果 spu 为 null 或 id 为 0,表示清空选择
|
// 处理商品选择:如果 spu 为 null 或 id 为 0,表示清空选择
|
||||||
const spuId = spu?.id && spu.id ? spu.id : undefined;
|
const spuId = spu && spu.id ? spu.id : undefined;
|
||||||
formData.value.spuId = spuId;
|
formData.value.spuId = spuId;
|
||||||
await formApi.setFieldValue('spuId', spuId);
|
await formApi.setFieldValue('spuId', spuId);
|
||||||
// 清空已选规格
|
// 清空已选规格
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ function validateSku() {
|
||||||
let validate = true;
|
let validate = true;
|
||||||
|
|
||||||
for (const sku of formData.value!.skus!) {
|
for (const sku of formData.value!.skus!) {
|
||||||
for (const rule of props?.ruleConfig as RuleConfig[]) {
|
for (const rule of props.ruleConfig as RuleConfig[]) {
|
||||||
const value = getNestedValue(sku, rule.name);
|
const value = getNestedValue(sku, rule.name);
|
||||||
if (!rule.rule(value)) {
|
if (!rule.rule(value)) {
|
||||||
validate = false;
|
validate = false;
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,7 @@ async function showInput(index: number) {
|
||||||
attributeIndex.value = index;
|
attributeIndex.value = index;
|
||||||
inputRef.value?.[index]?.focus();
|
inputRef.value?.[index]?.focus();
|
||||||
// 获取属性下拉选项
|
// 获取属性下拉选项
|
||||||
|
// oxlint-disable-next-line typescript/no-non-null-asserted-optional-chain
|
||||||
await getAttributeOptions(attributeList.value?.[index]?.id!);
|
await getAttributeOptions(attributeList.value?.[index]?.id!);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ function handleSend(userId: number) {
|
||||||
messageBoxVisible.value = true;
|
messageBoxVisible.value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const [Grid, gridApi] = useVbenVxeGrid<MpMessageApi.Message>({
|
const [Grid, gridApi] = useVbenVxeGrid({
|
||||||
formOptions: {
|
formOptions: {
|
||||||
schema: useGridFormSchema(),
|
schema: useGridFormSchema(),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ const [Modal, modalApi] = useVbenModal({
|
||||||
modalApi.lock();
|
modalApi.lock();
|
||||||
try {
|
try {
|
||||||
formData.value = await getTenant(data.id);
|
formData.value = await getTenant(data.id);
|
||||||
// @ts-ignore 特殊:https://gitee.com/yudaocode/yudao-ui-admin-vben/issues/ID43CX
|
// @ts-expect-error: special-case workaround for yudao-ui-admin-vben issue ID43CX
|
||||||
formData.value.expireTime = String(formData.value.expireTime);
|
formData.value.expireTime = String(formData.value.expireTime);
|
||||||
// 设置到 values
|
// 设置到 values
|
||||||
await formApi.setValues(formData.value);
|
await formApi.setValues(formData.value);
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
export { default } from '@vben/tailwind-config';
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
"$schema": "https://json.schemastore.org/tsconfig",
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
"extends": "@vben/tsconfig/web-app.json",
|
"extends": "@vben/tsconfig/web-app.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"#/*": ["./src/*"]
|
"#/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -6,5 +6,5 @@
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
"noEmit": false
|
"noEmit": false
|
||||||
},
|
},
|
||||||
"include": ["vite.config.mts"]
|
"include": ["vite.config.ts"]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vben/web-antdv-next",
|
"name": "@vben/web-antdv-next",
|
||||||
"version": "5.6.0",
|
"version": "5.7.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
export { default } from '@vben/tailwind-config/postcss';
|
|
||||||
|
|
@ -98,8 +98,7 @@ export const useAuthStore = defineStore('auth', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchUserInfo() {
|
async function fetchUserInfo() {
|
||||||
let userInfo: null | UserInfo = null;
|
const userInfo = await getUserInfoApi();
|
||||||
userInfo = await getUserInfoApi();
|
|
||||||
userStore.setUserInfo(userInfo);
|
userStore.setUserInfo(userInfo);
|
||||||
return userInfo;
|
return userInfo;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,7 @@ const formSchema = computed((): VbenFormSchema[] => {
|
||||||
* @param values 登录表单数据
|
* @param values 登录表单数据
|
||||||
*/
|
*/
|
||||||
async function handleLogin(values: Recordable<any>) {
|
async function handleLogin(values: Recordable<any>) {
|
||||||
// eslint-disable-next-line no-console
|
void values;
|
||||||
console.log(values);
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,7 @@ const formSchema = computed((): VbenFormSchema[] => {
|
||||||
});
|
});
|
||||||
|
|
||||||
function handleSubmit(value: Recordable<any>) {
|
function handleSubmit(value: Recordable<any>) {
|
||||||
// eslint-disable-next-line no-console
|
void value;
|
||||||
console.log('reset email:', value);
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,8 +82,7 @@ const formSchema = computed((): VbenFormSchema[] => {
|
||||||
});
|
});
|
||||||
|
|
||||||
function handleSubmit(value: Recordable<any>) {
|
function handleSubmit(value: Recordable<any>) {
|
||||||
// eslint-disable-next-line no-console
|
void value;
|
||||||
console.log('register submit:', value);
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,10 +76,10 @@ const chartTabs: TabOption[] = [
|
||||||
</AnalysisChartsTabs>
|
</AnalysisChartsTabs>
|
||||||
|
|
||||||
<div class="mt-5 w-full md:flex">
|
<div class="mt-5 w-full md:flex">
|
||||||
<AnalysisChartCard class="mt-5 md:mr-4 md:mt-0 md:w-1/3" title="访问数量">
|
<AnalysisChartCard class="mt-5 md:mt-0 md:mr-4 md:w-1/3" title="访问数量">
|
||||||
<AnalyticsVisitsData />
|
<AnalyticsVisitsData />
|
||||||
</AnalysisChartCard>
|
</AnalysisChartCard>
|
||||||
<AnalysisChartCard class="mt-5 md:mr-4 md:mt-0 md:w-1/3" title="访问来源">
|
<AnalysisChartCard class="mt-5 md:mt-0 md:mr-4 md:w-1/3" title="访问来源">
|
||||||
<AnalyticsVisitsSource />
|
<AnalyticsVisitsSource />
|
||||||
</AnalysisChartCard>
|
</AnalysisChartCard>
|
||||||
<AnalysisChartCard class="mt-5 md:mt-0 md:w-1/3" title="访问来源">
|
<AnalysisChartCard class="mt-5 md:mt-0 md:w-1/3" title="访问来源">
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
export { default } from '@vben/tailwind-config';
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
"$schema": "https://json.schemastore.org/tsconfig",
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
"extends": "@vben/tsconfig/web-app.json",
|
"extends": "@vben/tsconfig/web-app.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"#/*": ["./src/*"]
|
"#/*": ["./src/*"]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,5 +6,5 @@
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
"noEmit": false
|
"noEmit": false
|
||||||
},
|
},
|
||||||
"include": ["vite.config.mts"]
|
"include": ["vite.config.ts"]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vben/web-ele",
|
"name": "@vben/web-ele",
|
||||||
"version": "5.6.0",
|
"version": "5.7.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue