diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 0e5589863..e5c1e01d6 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -44,6 +44,7 @@ "@vben/types": "workspace:*", "@vben/utils": "workspace:*", "@vueuse/core": "catalog:", + "@vueuse/integrations": "catalog:", "ant-design-vue": "catalog:", "cropperjs": "catalog:", "crypto-js": "catalog:", diff --git a/apps/web-antd/src/api/bpm/category/index.ts b/apps/web-antd/src/api/bpm/category/index.ts index 852b2a868..1519c758c 100644 --- a/apps/web-antd/src/api/bpm/category/index.ts +++ b/apps/web-antd/src/api/bpm/category/index.ts @@ -1,5 +1,7 @@ import type { PageParam, PageResult } from '@vben/request'; +import type { BpmModelApi } from '#/api/bpm/model'; + import { requestClient } from '#/api/request'; export namespace BpmCategoryApi { @@ -11,6 +13,13 @@ export namespace BpmCategoryApi { status: number; sort: number; // 分类排序 } + + /** 模型分类信息 */ + export interface ModelCategoryInfo { + id: number; + name: string; + modelList: BpmModelApi.ModelVO[]; + } } /** 查询流程分类分页 */ @@ -30,15 +39,30 @@ export async function getCategory(id: number) { /** 新增流程分类 */ export async function createCategory(data: BpmCategoryApi.CategoryVO) { - return requestClient.post('/bpm/category/create', data); + return requestClient.post('/bpm/category/create', data); } /** 修改流程分类 */ export async function updateCategory(data: BpmCategoryApi.CategoryVO) { - return requestClient.put('/bpm/category/update', data); + return requestClient.put('/bpm/category/update', data); } /** 删除流程分类 */ export async function deleteCategory(id: number) { - return requestClient.delete(`/bpm/category/delete?id=${id}`); + return requestClient.delete(`/bpm/category/delete?id=${id}`); +} + +/** 查询流程分类列表 */ +export async function getCategorySimpleList() { + return requestClient.get( + `/bpm/category/simple-list`, + ); +} + +/** 批量修改流程分类的排序 */ +export async function updateCategorySortBatch(ids: number[]) { + const params = ids.join(','); + return requestClient.put( + `/bpm/category/update-sort-batch?ids=${params}`, + ); } diff --git a/apps/web-antd/src/api/bpm/model/index.ts b/apps/web-antd/src/api/bpm/model/index.ts new file mode 100644 index 000000000..06c444e04 --- /dev/null +++ b/apps/web-antd/src/api/bpm/model/index.ts @@ -0,0 +1,107 @@ +import { requestClient } from '#/api/request'; + +export namespace BpmModelApi { + /** 用户信息 TODO 这个是不是可以抽取出来定义在公共模块 */ + export interface UserInfo { + id: number; + nickname: string; + avatar?: string; + deptId?: number; + deptName?: string; + } + /** 流程定义 VO */ + export interface ProcessDefinitionVO { + id: string; + version: number; + deploymentTime: number; + suspensionState: number; + formType?: number; + } + + /** 流程模型 VO */ + export interface ModelVO { + id: number; + key: string; + name: string; + icon?: string; + description: string; + category: string; + formName: string; + formType: number; + formId: number; + formCustomCreatePath: string; + formCustomViewPath: string; + processDefinition: ProcessDefinitionVO; + status: number; + remark: string; + createTime: string; + bpmnXml: string; + startUsers?: UserInfo[]; + } + + /** 模型分类信息 */ + export interface ModelCategoryInfo { + id: number; + name: string; + modelList: ModelVO[]; + } +} + +/** 获取流程模型列表 */ +export async function getModelList(name: string | undefined) { + return requestClient.get('/bpm/model/list', { + params: { name }, + }); +} + +/** 获取流程模型详情 */ +export async function getModel(id: string) { + return requestClient.get(`/bpm/model/get?id=${id}`); +} + +/** 更新流程模型 */ +export async function updateModel(data: BpmModelApi.ModelVO) { + return requestClient.put('/bpm/model/update', data); +} + +/** 批量修改流程模型排序 */ +export async function updateModelSortBatch(ids: number[]) { + const params = ids.join(','); + return requestClient.put( + `/bpm/model/update-sort-batch?ids=${params}`, + ); +} + +/** 更新流程模型的 BPMN XML */ +export async function updateModelBpmn(data: BpmModelApi.ModelVO) { + return requestClient.put('/bpm/model/update-bpmn', data); +} + +/** 更新流程模型状态 */ +export async function updateModelState(id: number, state: number) { + const data = { + id, + state, + }; + return requestClient.put('/bpm/model/update-state', data); +} + +/** 创建流程模型 */ +export async function createModel(data: BpmModelApi.ModelVO) { + return requestClient.post('/bpm/model/create', data); +} + +/** 删除流程模型 */ +export async function deleteModel(id: number) { + return requestClient.delete(`/bpm/model/delete?id=${id}`); +} + +/** 部署流程模型 */ +export async function deployModel(id: number) { + return requestClient.post(`/bpm/model/deploy?id=${id}`); +} + +/** 清理流程模型 */ +export async function cleanModel(id: number) { + return requestClient.delete(`/bpm/model/clean?id=${id}`); +} diff --git a/apps/web-antd/src/views/bpm/model/index.vue b/apps/web-antd/src/views/bpm/model/index.vue index c7d4938c1..c51782e24 100644 --- a/apps/web-antd/src/views/bpm/model/index.vue +++ b/apps/web-antd/src/views/bpm/model/index.vue @@ -1,28 +1,242 @@ diff --git a/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue b/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue new file mode 100644 index 000000000..5ebcee1f7 --- /dev/null +++ b/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/packages/@core/ui-kit/menu-ui/src/components/menu.vue b/packages/@core/ui-kit/menu-ui/src/components/menu.vue index db4bda312..7a7370088 100644 --- a/packages/@core/ui-kit/menu-ui/src/components/menu.vue +++ b/packages/@core/ui-kit/menu-ui/src/components/menu.vue @@ -374,10 +374,10 @@ $namespace: vben; var(--menu-item-margin-x); font-size: var(--menu-font-size); color: var(--menu-item-color); - white-space: nowrap; text-decoration: none; - cursor: pointer; + white-space: nowrap; list-style: none; + cursor: pointer; background: var(--menu-item-background-color); border: none; border-radius: var(--menu-item-radius); @@ -701,8 +701,8 @@ $namespace: vben; width: var(--menu-item-icon-size); height: var(--menu-item-icon-size); margin-right: 8px; - vertical-align: middle; text-align: center; + vertical-align: middle; } } diff --git a/packages/effects/common-ui/src/components/json-viewer/style.scss b/packages/effects/common-ui/src/components/json-viewer/style.scss index 47acb891f..bcc2bfdce 100644 --- a/packages/effects/common-ui/src/components/json-viewer/style.scss +++ b/packages/effects/common-ui/src/components/json-viewer/style.scss @@ -14,8 +14,8 @@ padding: 0 4px 2px; font-size: 0.9em; line-height: 0.9; - vertical-align: 2px; color: hsl(var(--secondary-foreground)); + vertical-align: 2px; cursor: pointer; user-select: none; background-color: hsl(var(--secondary)); diff --git a/packages/effects/common-ui/src/components/resize/resize.vue b/packages/effects/common-ui/src/components/resize/resize.vue index e89ea8b8d..aaf89eaf2 100644 --- a/packages/effects/common-ui/src/components/resize/resize.vue +++ b/packages/effects/common-ui/src/components/resize/resize.vue @@ -1072,8 +1072,8 @@ watch( box-sizing: border-box; width: 100%; height: 100%; - outline: 1px dashed #d6d6d6; content: ''; + outline: 1px dashed #d6d6d6; } .resize-stick { diff --git a/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue b/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue index 9ee4bceb5..77f330c58 100644 --- a/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue +++ b/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue @@ -132,8 +132,8 @@ function toggleTheme(event: MouseEvent) { &__sun { @apply fill-foreground/90 stroke-none; - transform-origin: center center; transition: transform 1.6s cubic-bezier(0.25, 0, 0.2, 1); + transform-origin: center center; &:hover > svg > & { @apply fill-foreground/90; @@ -143,10 +143,10 @@ function toggleTheme(event: MouseEvent) { &__sun-beams { @apply stroke-foreground/90 stroke-[2px]; - transform-origin: center center; transition: transform 1.6s cubic-bezier(0.5, 1.5, 0.75, 1.25), opacity 0.6s cubic-bezier(0.25, 0, 0.3, 1); + transform-origin: center center; &:hover > svg > & { @apply stroke-foreground; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f146fe61d..2ca8fa031 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -731,6 +731,9 @@ importers: '@vueuse/core': specifier: 'catalog:' version: 13.1.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/integrations': + specifier: 'catalog:' + version: 13.1.0(async-validator@4.2.5)(axios@1.9.0)(focus-trap@7.6.4)(jwt-decode@4.0.0)(nprogress@0.2.0)(qrcode@1.5.4)(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.3)) ant-design-vue: specifier: 'catalog:' version: 4.2.6(vue@3.5.13(typescript@5.8.3))