commit
c374f011ca
|
|
@ -11,13 +11,19 @@ import {
|
|||
useVbenVxeGrid,
|
||||
} from '@vben/plugins/vxe-table';
|
||||
import {
|
||||
floatToFixed2,
|
||||
erpNumberFormatter,
|
||||
formatToFractionDigit,
|
||||
isFunction,
|
||||
isString,
|
||||
} from '@vben/utils';
|
||||
|
||||
import { Button, Image, Popconfirm, Switch } from 'ant-design-vue';
|
||||
import {
|
||||
Button,
|
||||
Image,
|
||||
ImagePreviewGroup,
|
||||
Popconfirm,
|
||||
Switch,
|
||||
} from 'ant-design-vue';
|
||||
|
||||
import { DictTag } from '#/components/dict-tag';
|
||||
import { $t } from '#/locales';
|
||||
|
|
@ -84,7 +90,11 @@ setupVbenVxeTable({
|
|||
renderTableDefault(_renderOpts, params) {
|
||||
const { column, row } = params;
|
||||
if (column && column.field && row[column.field]) {
|
||||
return row[column.field].map((item: any) => h(Image, { src: item }));
|
||||
return h(ImagePreviewGroup, {}, () => {
|
||||
return row[column.field].map((item: any) =>
|
||||
h(Image, { src: item }),
|
||||
);
|
||||
});
|
||||
}
|
||||
return '';
|
||||
},
|
||||
|
|
@ -323,8 +333,8 @@ setupVbenVxeTable({
|
|||
});
|
||||
|
||||
vxeUI.formats.add('formatAmount2', {
|
||||
tableCellFormatMethod({ cellValue }) {
|
||||
return `${floatToFixed2(cellValue)}元`;
|
||||
tableCellFormatMethod({ cellValue }, digits = 2) {
|
||||
return `${erpNumberFormatter(cellValue, digits)}元`;
|
||||
},
|
||||
});
|
||||
},
|
||||
|
|
|
|||
|
|
@ -3,9 +3,8 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace BpmCategoryApi {
|
||||
/** 流程分类 VO */
|
||||
// TODO @jason:不用 VO 后缀哈
|
||||
export interface CategoryVO {
|
||||
/** 流程分类 */
|
||||
export interface Category {
|
||||
id: number;
|
||||
name: string;
|
||||
code: string;
|
||||
|
|
@ -17,7 +16,7 @@ export namespace BpmCategoryApi {
|
|||
|
||||
/** 查询流程分类分页 */
|
||||
export async function getCategoryPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmCategoryApi.CategoryVO>>(
|
||||
return requestClient.get<PageResult<BpmCategoryApi.Category>>(
|
||||
'/bpm/category/page',
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -25,18 +24,18 @@ export async function getCategoryPage(params: PageParam) {
|
|||
|
||||
/** 查询流程分类详情 */
|
||||
export async function getCategory(id: number) {
|
||||
return requestClient.get<BpmCategoryApi.CategoryVO>(
|
||||
return requestClient.get<BpmCategoryApi.Category>(
|
||||
`/bpm/category/get?id=${id}`,
|
||||
);
|
||||
}
|
||||
|
||||
/** 新增流程分类 */
|
||||
export async function createCategory(data: BpmCategoryApi.CategoryVO) {
|
||||
export async function createCategory(data: BpmCategoryApi.Category) {
|
||||
return requestClient.post<number>('/bpm/category/create', data);
|
||||
}
|
||||
|
||||
/** 修改流程分类 */
|
||||
export async function updateCategory(data: BpmCategoryApi.CategoryVO) {
|
||||
export async function updateCategory(data: BpmCategoryApi.Category) {
|
||||
return requestClient.put<boolean>('/bpm/category/update', data);
|
||||
}
|
||||
|
||||
|
|
@ -47,7 +46,7 @@ export async function deleteCategory(id: number) {
|
|||
|
||||
/** 查询流程分类列表 */
|
||||
export async function getCategorySimpleList() {
|
||||
return requestClient.get<BpmCategoryApi.CategoryVO[]>(
|
||||
return requestClient.get<BpmCategoryApi.Category[]>(
|
||||
`/bpm/category/simple-list`,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace BpmProcessDefinitionApi {
|
||||
/** 流程定义 */
|
||||
// TODO @ziye:不用 VO 后缀哈
|
||||
export interface ProcessDefinitionVO {
|
||||
export interface ProcessDefinition {
|
||||
id: string;
|
||||
version: number;
|
||||
deploymentTime: number;
|
||||
|
|
@ -15,12 +14,13 @@ export namespace BpmProcessDefinitionApi {
|
|||
formType?: number;
|
||||
bpmnXml?: string;
|
||||
simpleModel?: string;
|
||||
formFields?: string[];
|
||||
}
|
||||
}
|
||||
|
||||
/** 查询流程定义 */
|
||||
export async function getProcessDefinition(id?: string, key?: string) {
|
||||
return requestClient.get<BpmProcessDefinitionApi.ProcessDefinitionVO>(
|
||||
return requestClient.get<BpmProcessDefinitionApi.ProcessDefinition>(
|
||||
'/bpm/process-definition/get',
|
||||
{
|
||||
params: { id, key },
|
||||
|
|
@ -31,13 +31,13 @@ export async function getProcessDefinition(id?: string, key?: string) {
|
|||
/** 分页查询流程定义 */
|
||||
export async function getProcessDefinitionPage(params: PageParam) {
|
||||
return requestClient.get<
|
||||
PageResult<BpmProcessDefinitionApi.ProcessDefinitionVO>
|
||||
PageResult<BpmProcessDefinitionApi.ProcessDefinition>
|
||||
>('/bpm/process-definition/page', { params });
|
||||
}
|
||||
|
||||
/** 查询流程定义列表 */
|
||||
export async function getProcessDefinitionList(params: any) {
|
||||
return requestClient.get<BpmProcessDefinitionApi.ProcessDefinitionVO[]>(
|
||||
return requestClient.get<BpmProcessDefinitionApi.ProcessDefinition[]>(
|
||||
'/bpm/process-definition/list',
|
||||
{
|
||||
params,
|
||||
|
|
@ -48,6 +48,6 @@ export async function getProcessDefinitionList(params: any) {
|
|||
/** 查询流程定义列表(简单列表) */
|
||||
export async function getSimpleProcessDefinitionList() {
|
||||
return requestClient.get<
|
||||
PageResult<BpmProcessDefinitionApi.ProcessDefinitionVO>
|
||||
PageResult<BpmProcessDefinitionApi.ProcessDefinition>
|
||||
>('/bpm/process-definition/simple-list');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace BpmFormApi {
|
||||
/** 流程表单 */
|
||||
// TODO @jason:不用 VO 后缀哈
|
||||
export interface FormVO {
|
||||
export interface Form {
|
||||
id?: number | undefined;
|
||||
name: string;
|
||||
conf: string;
|
||||
|
|
@ -18,24 +17,23 @@ export namespace BpmFormApi {
|
|||
|
||||
/** 获取表单分页列表 */
|
||||
export async function getFormPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmFormApi.FormVO>>('/bpm/form/page', {
|
||||
return requestClient.get<PageResult<BpmFormApi.Form>>('/bpm/form/page', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/** 获取表单详情 */
|
||||
// TODO @ziye:应该不会 string 的情况呢。
|
||||
export async function getFormDetail(id: number | string) {
|
||||
return requestClient.get<BpmFormApi.FormVO>(`/bpm/form/get?id=${id}`);
|
||||
export async function getFormDetail(id: number) {
|
||||
return requestClient.get<BpmFormApi.Form>(`/bpm/form/get?id=${id}`);
|
||||
}
|
||||
|
||||
/** 创建表单 */
|
||||
export async function createForm(data: BpmFormApi.FormVO) {
|
||||
export async function createForm(data: BpmFormApi.Form) {
|
||||
return requestClient.post('/bpm/form/create', data);
|
||||
}
|
||||
|
||||
/** 更新表单 */
|
||||
export async function updateForm(data: BpmFormApi.FormVO) {
|
||||
export async function updateForm(data: BpmFormApi.Form) {
|
||||
return requestClient.put('/bpm/form/update', data);
|
||||
}
|
||||
|
||||
|
|
@ -46,5 +44,5 @@ export async function deleteForm(id: number) {
|
|||
|
||||
/** 获取表单简单列表 */
|
||||
export async function getFormSimpleList() {
|
||||
return requestClient.get<BpmFormApi.FormVO[]>('/bpm/form/simple-list');
|
||||
return requestClient.get<BpmFormApi.Form[]>('/bpm/form/simple-list');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,9 +11,8 @@ export namespace BpmModelApi {
|
|||
deptName?: string;
|
||||
}
|
||||
|
||||
/** 流程定义 VO */
|
||||
// TODO @jason:不用 VO 后缀哈
|
||||
export interface ProcessDefinitionVO {
|
||||
/** 流程定义 */
|
||||
export interface ProcessDefinition {
|
||||
id: string;
|
||||
key?: string;
|
||||
version: number;
|
||||
|
|
@ -23,8 +22,8 @@ export namespace BpmModelApi {
|
|||
formCustomViewPath?: string;
|
||||
}
|
||||
|
||||
/** 流程模型 VO */
|
||||
export interface ModelVO {
|
||||
/** 流程模型 */
|
||||
export interface Model {
|
||||
id: number;
|
||||
key: string;
|
||||
name: string;
|
||||
|
|
@ -36,7 +35,7 @@ export namespace BpmModelApi {
|
|||
formId: number;
|
||||
formCustomCreatePath: string;
|
||||
formCustomViewPath: string;
|
||||
processDefinition: ProcessDefinitionVO;
|
||||
processDefinition: ProcessDefinition;
|
||||
status: number;
|
||||
remark: string;
|
||||
createTime: string;
|
||||
|
|
@ -49,23 +48,23 @@ export namespace BpmModelApi {
|
|||
export interface ModelCategoryInfo {
|
||||
id: number;
|
||||
name: string;
|
||||
modelList: BpmModelApi.ModelVO[];
|
||||
modelList: BpmModelApi.Model[];
|
||||
}
|
||||
|
||||
/** 获取流程模型列表 */
|
||||
export async function getModelList(name: string | undefined) {
|
||||
return requestClient.get<BpmModelApi.ModelVO[]>('/bpm/model/list', {
|
||||
return requestClient.get<BpmModelApi.Model[]>('/bpm/model/list', {
|
||||
params: { name },
|
||||
});
|
||||
}
|
||||
|
||||
/** 获取流程模型详情 */
|
||||
export async function getModel(id: string) {
|
||||
return requestClient.get<BpmModelApi.ModelVO>(`/bpm/model/get?id=${id}`);
|
||||
return requestClient.get<BpmModelApi.Model>(`/bpm/model/get?id=${id}`);
|
||||
}
|
||||
|
||||
/** 更新流程模型 */
|
||||
export async function updateModel(data: BpmModelApi.ModelVO) {
|
||||
export async function updateModel(data: BpmModelApi.Model) {
|
||||
return requestClient.put('/bpm/model/update', data);
|
||||
}
|
||||
|
||||
|
|
@ -78,7 +77,7 @@ export async function updateModelSortBatch(ids: number[]) {
|
|||
}
|
||||
|
||||
/** 更新流程模型的 BPMN XML */
|
||||
export async function updateModelBpmn(data: BpmModelApi.ModelVO) {
|
||||
export async function updateModelBpmn(data: BpmModelApi.Model) {
|
||||
return requestClient.put('/bpm/model/update-bpmn', data);
|
||||
}
|
||||
|
||||
|
|
@ -92,7 +91,7 @@ export async function updateModelState(id: number, state: number) {
|
|||
}
|
||||
|
||||
/** 创建流程模型 */
|
||||
export async function createModel(data: BpmModelApi.ModelVO) {
|
||||
export async function createModel(data: BpmModelApi.Model) {
|
||||
return requestClient.post('/bpm/model/create', data);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace BpmOALeaveApi {
|
||||
// TODO @ziye:不用 VO 后缀
|
||||
export interface LeaveVO {
|
||||
export interface Leave {
|
||||
id: number;
|
||||
status: number;
|
||||
type: number;
|
||||
|
|
@ -18,23 +17,23 @@ export namespace BpmOALeaveApi {
|
|||
}
|
||||
|
||||
/** 创建请假申请 */
|
||||
export async function createLeave(data: BpmOALeaveApi.LeaveVO) {
|
||||
export async function createLeave(data: BpmOALeaveApi.Leave) {
|
||||
return requestClient.post('/bpm/oa/leave/create', data);
|
||||
}
|
||||
|
||||
/** 更新请假申请 */
|
||||
export async function updateLeave(data: BpmOALeaveApi.LeaveVO) {
|
||||
export async function updateLeave(data: BpmOALeaveApi.Leave) {
|
||||
return requestClient.post('/bpm/oa/leave/update', data);
|
||||
}
|
||||
|
||||
/** 获得请假申请 */
|
||||
export async function getLeave(id: number) {
|
||||
return requestClient.get<BpmOALeaveApi.LeaveVO>(`/bpm/oa/leave/get?id=${id}`);
|
||||
return requestClient.get<BpmOALeaveApi.Leave>(`/bpm/oa/leave/get?id=${id}`);
|
||||
}
|
||||
|
||||
/** 获得请假申请分页 */
|
||||
export async function getLeavePage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmOALeaveApi.LeaveVO>>(
|
||||
return requestClient.get<PageResult<BpmOALeaveApi.Leave>>(
|
||||
'/bpm/oa/leave/page',
|
||||
{ params },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -3,9 +3,8 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace BpmProcessExpressionApi {
|
||||
// TODO @ziye:不用 VO 后缀
|
||||
/** 流程表达式 VO */
|
||||
export interface ProcessExpressionVO {
|
||||
/** 流程表达式 */
|
||||
export interface ProcessExpression {
|
||||
id: number; // 编号
|
||||
name: string; // 表达式名字
|
||||
status: number; // 表达式状态
|
||||
|
|
@ -16,27 +15,27 @@ export namespace BpmProcessExpressionApi {
|
|||
/** 查询流程表达式分页 */
|
||||
export async function getProcessExpressionPage(params: PageParam) {
|
||||
return requestClient.get<
|
||||
PageResult<BpmProcessExpressionApi.ProcessExpressionVO>
|
||||
PageResult<BpmProcessExpressionApi.ProcessExpression>
|
||||
>('/bpm/process-expression/page', { params });
|
||||
}
|
||||
|
||||
/** 查询流程表达式详情 */
|
||||
export async function getProcessExpression(id: number) {
|
||||
return requestClient.get<BpmProcessExpressionApi.ProcessExpressionVO>(
|
||||
return requestClient.get<BpmProcessExpressionApi.ProcessExpression>(
|
||||
`/bpm/process-expression/get?id=${id}`,
|
||||
);
|
||||
}
|
||||
|
||||
/** 新增流程表达式 */
|
||||
export async function createProcessExpression(
|
||||
data: BpmProcessExpressionApi.ProcessExpressionVO,
|
||||
data: BpmProcessExpressionApi.ProcessExpression,
|
||||
) {
|
||||
return requestClient.post<number>('/bpm/process-expression/create', data);
|
||||
}
|
||||
|
||||
/** 修改流程表达式 */
|
||||
export async function updateProcessExpression(
|
||||
data: BpmProcessExpressionApi.ProcessExpressionVO,
|
||||
data: BpmProcessExpressionApi.ProcessExpression,
|
||||
) {
|
||||
return requestClient.put<boolean>('/bpm/process-expression/update', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,29 +9,29 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace BpmProcessInstanceApi {
|
||||
// TODO @芋艿:一些注释缺少或者不对;
|
||||
export type Task = {
|
||||
export interface Task {
|
||||
id: number;
|
||||
name: string;
|
||||
};
|
||||
}
|
||||
|
||||
export type User = {
|
||||
export interface User {
|
||||
avatar: string;
|
||||
id: number;
|
||||
nickname: string;
|
||||
};
|
||||
}
|
||||
|
||||
// 审批任务信息
|
||||
export type ApprovalTaskInfo = {
|
||||
export interface ApprovalTaskInfo {
|
||||
assigneeUser: User;
|
||||
id: number;
|
||||
ownerUser: User;
|
||||
reason: string;
|
||||
signPicUrl: string;
|
||||
status: number;
|
||||
};
|
||||
}
|
||||
|
||||
// 审批节点信息
|
||||
export type ApprovalNodeInfo = {
|
||||
export interface ApprovalNodeInfo {
|
||||
candidateStrategy?: BpmCandidateStrategyEnum;
|
||||
candidateUsers?: User[];
|
||||
endTime?: Date;
|
||||
|
|
@ -41,10 +41,10 @@ export namespace BpmProcessInstanceApi {
|
|||
startTime?: Date;
|
||||
status: number;
|
||||
tasks: ApprovalTaskInfo[];
|
||||
};
|
||||
}
|
||||
|
||||
/** 流程实例 */
|
||||
export type ProcessInstanceVO = {
|
||||
export interface ProcessInstance {
|
||||
businessKey: string;
|
||||
category: string;
|
||||
createTime: string;
|
||||
|
|
@ -53,7 +53,7 @@ export namespace BpmProcessInstanceApi {
|
|||
formVariables: Record<string, any>;
|
||||
id: number;
|
||||
name: string;
|
||||
processDefinition?: BpmModelApi.ProcessDefinitionVO;
|
||||
processDefinition?: BpmModelApi.ProcessDefinition;
|
||||
processDefinitionId: string;
|
||||
remark: string;
|
||||
result: number;
|
||||
|
|
@ -61,20 +61,20 @@ export namespace BpmProcessInstanceApi {
|
|||
startUser?: User;
|
||||
status: number;
|
||||
tasks?: BpmProcessInstanceApi.Task[];
|
||||
};
|
||||
}
|
||||
|
||||
// 审批详情
|
||||
export type ApprovalDetail = {
|
||||
export interface ApprovalDetail {
|
||||
activityNodes: BpmProcessInstanceApi.ApprovalNodeInfo[];
|
||||
formFieldsPermission: any;
|
||||
processDefinition: BpmModelApi.ProcessDefinitionVO;
|
||||
processInstance: BpmProcessInstanceApi.ProcessInstanceVO;
|
||||
processDefinition: BpmModelApi.ProcessDefinition;
|
||||
processInstance: BpmProcessInstanceApi.ProcessInstance;
|
||||
status: number;
|
||||
todoTask: BpmTaskApi.TaskVO;
|
||||
};
|
||||
todoTask: BpmTaskApi.Task;
|
||||
}
|
||||
|
||||
// 抄送流程实例 VO
|
||||
export type CopyVO = {
|
||||
// 抄送流程实例
|
||||
export interface Copy {
|
||||
activityId: string;
|
||||
activityName: string;
|
||||
createTime: number;
|
||||
|
|
@ -90,12 +90,12 @@ export namespace BpmProcessInstanceApi {
|
|||
value: string;
|
||||
}[];
|
||||
taskId: string;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/** 查询我的流程实例分页 */
|
||||
export async function getProcessInstanceMyPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmProcessInstanceApi.ProcessInstanceVO>>(
|
||||
return requestClient.get<PageResult<BpmProcessInstanceApi.ProcessInstance>>(
|
||||
'/bpm/process-instance/my-page',
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -103,7 +103,7 @@ export async function getProcessInstanceMyPage(params: PageParam) {
|
|||
|
||||
/** 查询管理员流程实例分页 */
|
||||
export async function getProcessInstanceManagerPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmProcessInstanceApi.ProcessInstanceVO>>(
|
||||
return requestClient.get<PageResult<BpmProcessInstanceApi.ProcessInstance>>(
|
||||
'/bpm/process-instance/manager-page',
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -111,7 +111,7 @@ export async function getProcessInstanceManagerPage(params: PageParam) {
|
|||
|
||||
/** 新增流程实例 */
|
||||
export async function createProcessInstance(data: any) {
|
||||
return requestClient.post<BpmProcessInstanceApi.ProcessInstanceVO>(
|
||||
return requestClient.post<BpmProcessInstanceApi.ProcessInstance>(
|
||||
'/bpm/process-instance/create',
|
||||
data,
|
||||
);
|
||||
|
|
@ -142,14 +142,14 @@ export async function cancelProcessInstanceByAdmin(id: number, reason: string) {
|
|||
|
||||
/** 查询流程实例详情 */
|
||||
export async function getProcessInstance(id: number) {
|
||||
return requestClient.get<BpmProcessInstanceApi.ProcessInstanceVO>(
|
||||
return requestClient.get<BpmProcessInstanceApi.ProcessInstance>(
|
||||
`/bpm/process-instance/get?id=${id}`,
|
||||
);
|
||||
}
|
||||
|
||||
/** 查询复制流程实例分页 */
|
||||
export async function getProcessInstanceCopyPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmProcessInstanceApi.ProcessInstanceVO>>(
|
||||
return requestClient.get<PageResult<BpmProcessInstanceApi.ProcessInstance>>(
|
||||
'/bpm/process-instance/copy/page',
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -157,9 +157,9 @@ export async function getProcessInstanceCopyPage(params: PageParam) {
|
|||
|
||||
/** 更新流程实例 */
|
||||
export async function updateProcessInstance(
|
||||
data: BpmProcessInstanceApi.ProcessInstanceVO,
|
||||
data: BpmProcessInstanceApi.ProcessInstance,
|
||||
) {
|
||||
return requestClient.put<BpmProcessInstanceApi.ProcessInstanceVO>(
|
||||
return requestClient.put<BpmProcessInstanceApi.ProcessInstance>(
|
||||
'/bpm/process-instance/update',
|
||||
data,
|
||||
);
|
||||
|
|
@ -183,7 +183,7 @@ export async function getNextApprovalNodes(params: any) {
|
|||
|
||||
/** 获取表单字段权限 */
|
||||
export async function getFormFieldsPermission(params: any) {
|
||||
return requestClient.get<BpmProcessInstanceApi.ProcessInstanceVO>(
|
||||
return requestClient.get<BpmProcessInstanceApi.ProcessInstance>(
|
||||
`/bpm/process-instance/get-form-fields-permission`,
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -191,7 +191,7 @@ export async function getFormFieldsPermission(params: any) {
|
|||
|
||||
/** 获取流程实例 BPMN 模型视图 */
|
||||
export async function getProcessInstanceBpmnModelView(id: string) {
|
||||
return requestClient.get<BpmProcessInstanceApi.ProcessInstanceVO>(
|
||||
return requestClient.get<BpmProcessInstanceApi.ProcessInstance>(
|
||||
`/bpm/process-instance/get-bpmn-model-view?id=${id}`,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,8 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace BpmProcessListenerApi {
|
||||
// TODO @ziye:不用 VO 后缀
|
||||
/** BPM 流程监听器 VO */
|
||||
export interface ProcessListenerVO {
|
||||
/** BPM 流程监听器 */
|
||||
export interface ProcessListener {
|
||||
id: number; // 编号
|
||||
name: string; // 监听器名字
|
||||
type: string; // 监听器类型
|
||||
|
|
@ -18,7 +17,7 @@ export namespace BpmProcessListenerApi {
|
|||
|
||||
/** 查询流程监听器分页 */
|
||||
export async function getProcessListenerPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmProcessListenerApi.ProcessListenerVO>>(
|
||||
return requestClient.get<PageResult<BpmProcessListenerApi.ProcessListener>>(
|
||||
'/bpm/process-listener/page',
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -26,21 +25,21 @@ export async function getProcessListenerPage(params: PageParam) {
|
|||
|
||||
/** 查询流程监听器详情 */
|
||||
export async function getProcessListener(id: number) {
|
||||
return requestClient.get<BpmProcessListenerApi.ProcessListenerVO>(
|
||||
return requestClient.get<BpmProcessListenerApi.ProcessListener>(
|
||||
`/bpm/process-listener/get?id=${id}`,
|
||||
);
|
||||
}
|
||||
|
||||
/** 新增流程监听器 */
|
||||
export async function createProcessListener(
|
||||
data: BpmProcessListenerApi.ProcessListenerVO,
|
||||
data: BpmProcessListenerApi.ProcessListener,
|
||||
) {
|
||||
return requestClient.post<number>('/bpm/process-listener/create', data);
|
||||
}
|
||||
|
||||
/** 修改流程监听器 */
|
||||
export async function updateProcessListener(
|
||||
data: BpmProcessListenerApi.ProcessListenerVO,
|
||||
data: BpmProcessListenerApi.ProcessListener,
|
||||
) {
|
||||
return requestClient.put<boolean>('/bpm/process-listener/update', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,9 +5,8 @@ import type { BpmProcessInstanceApi } from '../processInstance';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace BpmTaskApi {
|
||||
// TODO @ziye:不用 VO 后缀;注释使用 /** */ 风格;
|
||||
/** BPM 流程监听器 VO */
|
||||
export interface TaskVO {
|
||||
/** BPM 流程监听器 */
|
||||
export interface Task {
|
||||
id: number; // 编号
|
||||
name: string; // 监听器名字
|
||||
type: string; // 监听器类型
|
||||
|
|
@ -16,8 +15,8 @@ export namespace BpmTaskApi {
|
|||
valueType: string; // 监听器值类型
|
||||
}
|
||||
|
||||
// 流程任务 VO
|
||||
export interface TaskManagerVO {
|
||||
// 流程任务
|
||||
export interface TaskManager {
|
||||
id: string; // 编号
|
||||
name: string; // 任务名称
|
||||
createTime: number; // 创建时间
|
||||
|
|
@ -29,7 +28,7 @@ export namespace BpmTaskApi {
|
|||
assigneeUser: any; // 处理人
|
||||
taskDefinitionKey: string; // 任务定义key
|
||||
processInstanceId: string; // 流程实例id
|
||||
processInstance: BpmProcessInstanceApi.ProcessInstanceVO; // 流程实例
|
||||
processInstance: BpmProcessInstanceApi.ProcessInstance; // 流程实例
|
||||
parentTaskId: any; // 父任务id
|
||||
children: any; // 子任务
|
||||
formId: any; // 表单id
|
||||
|
|
@ -46,27 +45,21 @@ export namespace BpmTaskApi {
|
|||
|
||||
/** 查询待办任务分页 */
|
||||
export async function getTaskTodoPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmTaskApi.TaskVO>>(
|
||||
'/bpm/task/todo-page',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
return requestClient.get<PageResult<BpmTaskApi.Task>>('/bpm/task/todo-page', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/** 查询已办任务分页 */
|
||||
export async function getTaskDonePage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmTaskApi.TaskVO>>(
|
||||
'/bpm/task/done-page',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
return requestClient.get<PageResult<BpmTaskApi.Task>>('/bpm/task/done-page', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/** 查询任务管理分页 */
|
||||
export async function getTaskManagerPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmTaskApi.TaskVO>>(
|
||||
return requestClient.get<PageResult<BpmTaskApi.Task>>(
|
||||
'/bpm/task/manager-page',
|
||||
{ params },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -3,9 +3,8 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace BpmUserGroupApi {
|
||||
// TODO @ziye:不用 VO 后缀
|
||||
/** BPM 用户组 VO */
|
||||
export interface UserGroupVO {
|
||||
/** BPM 用户组 */
|
||||
export interface UserGroup {
|
||||
id: number;
|
||||
name: string;
|
||||
description: string;
|
||||
|
|
@ -18,7 +17,7 @@ export namespace BpmUserGroupApi {
|
|||
|
||||
/** 查询用户组分页 */
|
||||
export async function getUserGroupPage(params: PageParam) {
|
||||
return requestClient.get<PageResult<BpmUserGroupApi.UserGroupVO>>(
|
||||
return requestClient.get<PageResult<BpmUserGroupApi.UserGroup>>(
|
||||
'/bpm/user-group/page',
|
||||
{ params },
|
||||
);
|
||||
|
|
@ -26,18 +25,18 @@ export async function getUserGroupPage(params: PageParam) {
|
|||
|
||||
/** 查询用户组详情 */
|
||||
export async function getUserGroup(id: number) {
|
||||
return requestClient.get<BpmUserGroupApi.UserGroupVO>(
|
||||
return requestClient.get<BpmUserGroupApi.UserGroup>(
|
||||
`/bpm/user-group/get?id=${id}`,
|
||||
);
|
||||
}
|
||||
|
||||
/** 新增用户组 */
|
||||
export async function createUserGroup(data: BpmUserGroupApi.UserGroupVO) {
|
||||
export async function createUserGroup(data: BpmUserGroupApi.UserGroup) {
|
||||
return requestClient.post<number>('/bpm/user-group/create', data);
|
||||
}
|
||||
|
||||
/** 修改用户组 */
|
||||
export async function updateUserGroup(data: BpmUserGroupApi.UserGroupVO) {
|
||||
export async function updateUserGroup(data: BpmUserGroupApi.UserGroup) {
|
||||
return requestClient.put<boolean>('/bpm/user-group/update', data);
|
||||
}
|
||||
|
||||
|
|
@ -48,7 +47,7 @@ export async function deleteUserGroup(id: number) {
|
|||
|
||||
/** 查询用户组列表 */
|
||||
export async function getUserGroupSimpleList() {
|
||||
return requestClient.get<BpmUserGroupApi.UserGroupVO[]>(
|
||||
return requestClient.get<BpmUserGroupApi.UserGroup[]>(
|
||||
`/bpm/user-group/simple-list`,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,13 +65,13 @@ export namespace InfraCodegenApi {
|
|||
}
|
||||
|
||||
/** 更新代码生成请求 */
|
||||
export interface CodegenUpdateReqVO {
|
||||
export interface CodegenUpdateReq {
|
||||
table: any | CodegenTable;
|
||||
columns: CodegenColumn[];
|
||||
}
|
||||
|
||||
/** 创建代码生成请求 */
|
||||
export interface CodegenCreateListReqVO {
|
||||
export interface CodegenCreateListReq {
|
||||
dataSourceConfigId?: number;
|
||||
tableNames: string[];
|
||||
}
|
||||
|
|
@ -106,7 +106,7 @@ export function getCodegenTable(tableId: number) {
|
|||
}
|
||||
|
||||
/** 修改代码生成表定义 */
|
||||
export function updateCodegenTable(data: InfraCodegenApi.CodegenUpdateReqVO) {
|
||||
export function updateCodegenTable(data: InfraCodegenApi.CodegenUpdateReq) {
|
||||
return requestClient.put('/infra/codegen/update', data);
|
||||
}
|
||||
|
||||
|
|
@ -136,9 +136,7 @@ export function getSchemaTableList(params: any) {
|
|||
}
|
||||
|
||||
/** 基于数据库的表结构,创建代码生成器的表定义 */
|
||||
export function createCodegenList(
|
||||
data: InfraCodegenApi.CodegenCreateListReqVO,
|
||||
) {
|
||||
export function createCodegenList(data: InfraCodegenApi.CodegenCreateListReq) {
|
||||
return requestClient.post('/infra/codegen/create-list', data);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ export namespace InfraFileApi {
|
|||
}
|
||||
|
||||
/** 文件预签名地址 */
|
||||
export interface FilePresignedUrlRespVO {
|
||||
export interface FilePresignedUrlResp {
|
||||
configId: number; // 文件配置编号
|
||||
uploadUrl: string; // 文件上传 URL
|
||||
url: string; // 文件 URL
|
||||
|
|
@ -27,7 +27,7 @@ export namespace InfraFileApi {
|
|||
}
|
||||
|
||||
/** 上传文件 */
|
||||
export interface FileUploadReqVO {
|
||||
export interface FileUploadReq {
|
||||
file: globalThis.File;
|
||||
directory?: string;
|
||||
}
|
||||
|
|
@ -47,7 +47,7 @@ export function deleteFile(id: number) {
|
|||
|
||||
/** 获取文件预签名地址 */
|
||||
export function getFilePresignedUrl(name: string, directory?: string) {
|
||||
return requestClient.get<InfraFileApi.FilePresignedUrlRespVO>(
|
||||
return requestClient.get<InfraFileApi.FilePresignedUrlResp>(
|
||||
'/infra/file/presigned-url',
|
||||
{
|
||||
params: { name, directory },
|
||||
|
|
@ -62,7 +62,7 @@ export function createFile(data: InfraFileApi.File) {
|
|||
|
||||
/** 上传文件 */
|
||||
export function uploadFile(
|
||||
data: InfraFileApi.FileUploadReqVO,
|
||||
data: InfraFileApi.FileUploadReq,
|
||||
onUploadProgress?: AxiosProgressEvent,
|
||||
) {
|
||||
// 特殊:由于 upload 内部封装,即使 directory 为 undefined,也会传递给后端
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/** 数据对照 Response VO */
|
||||
export interface MallDataComparisonRespVO<T> {
|
||||
/** 数据对照 Response */
|
||||
export interface MallDataComparisonResp<T> {
|
||||
value: T;
|
||||
reference: T;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,32 +1,32 @@
|
|||
import type { MallDataComparisonRespVO } from './common';
|
||||
import type { MallDataComparisonResp } from './common';
|
||||
|
||||
import { formatDate } from '@vben/utils';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace MallMemberStatisticsApi {
|
||||
/** 会员分析 Request VO */
|
||||
/** 会员分析 Request */
|
||||
export interface AnalyseReq {
|
||||
times: Date[];
|
||||
}
|
||||
|
||||
/** 会员分析对照数据 Response VO */
|
||||
/** 会员分析对照数据 Response */
|
||||
export interface AnalyseComparison {
|
||||
registerUserCount: number;
|
||||
visitUserCount: number;
|
||||
rechargeUserCount: number;
|
||||
}
|
||||
|
||||
/** 会员分析 Response VO */
|
||||
/** 会员分析 Response */
|
||||
export interface Analyse {
|
||||
visitUserCount: number;
|
||||
orderUserCount: number;
|
||||
payUserCount: number;
|
||||
atv: number;
|
||||
comparison: MallDataComparisonRespVO<AnalyseComparison>;
|
||||
comparison: MallDataComparisonResp<AnalyseComparison>;
|
||||
}
|
||||
|
||||
/** 会员地区统计 Response VO */
|
||||
/** 会员地区统计 Response */
|
||||
export interface AreaStatistics {
|
||||
areaId: number;
|
||||
areaName: string;
|
||||
|
|
@ -36,13 +36,13 @@ export namespace MallMemberStatisticsApi {
|
|||
orderPayPrice: number;
|
||||
}
|
||||
|
||||
/** 会员性别统计 Response VO */
|
||||
/** 会员性别统计 Response */
|
||||
export interface SexStatistics {
|
||||
sex: number;
|
||||
userCount: number;
|
||||
}
|
||||
|
||||
/** 会员统计 Response VO */
|
||||
/** 会员统计 Response */
|
||||
export interface Summary {
|
||||
userCount: number;
|
||||
rechargeUserCount: number;
|
||||
|
|
@ -50,13 +50,13 @@ export namespace MallMemberStatisticsApi {
|
|||
expensePrice: number;
|
||||
}
|
||||
|
||||
/** 会员终端统计 Response VO */
|
||||
/** 会员终端统计 Response */
|
||||
export interface TerminalStatistics {
|
||||
terminal: number;
|
||||
userCount: number;
|
||||
}
|
||||
|
||||
/** 会员数量统计 Response VO */
|
||||
/** 会员数量统计 Response */
|
||||
export interface Count {
|
||||
/** 用户访问量 */
|
||||
visitUserCount: string;
|
||||
|
|
@ -64,7 +64,7 @@ export namespace MallMemberStatisticsApi {
|
|||
registerUserCount: number;
|
||||
}
|
||||
|
||||
/** 会员注册数量 Response VO */
|
||||
/** 会员注册数量 Response */
|
||||
export interface RegisterCount {
|
||||
date: string;
|
||||
count: number;
|
||||
|
|
@ -114,7 +114,7 @@ export function getMemberTerminalStatisticsList() {
|
|||
/** 获得用户数量量对照 */
|
||||
export function getUserCountComparison() {
|
||||
return requestClient.get<
|
||||
MallDataComparisonRespVO<MallMemberStatisticsApi.Count>
|
||||
MallDataComparisonResp<MallMemberStatisticsApi.Count>
|
||||
>('/statistics/member/user-count-comparison');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace MallPayStatisticsApi {
|
||||
/** 支付统计 */
|
||||
export interface PaySummaryRespVO {
|
||||
export interface PaySummaryResp {
|
||||
/** 充值金额,单位分 */
|
||||
rechargePrice: number;
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ export namespace MallPayStatisticsApi {
|
|||
|
||||
/** 获取钱包充值金额 */
|
||||
export function getWalletRechargePrice() {
|
||||
return requestClient.get<MallPayStatisticsApi.PaySummaryRespVO>(
|
||||
return requestClient.get<MallPayStatisticsApi.PaySummaryResp>(
|
||||
'/statistics/pay/summary',
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import type { PageParam, PageResult } from '@vben/request';
|
||||
|
||||
import type { MallDataComparisonRespVO } from './common';
|
||||
import type { MallDataComparisonResp } from './common';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
|
|
@ -43,7 +43,7 @@ export namespace MallProductStatisticsApi {
|
|||
/** 获得商品统计分析 */
|
||||
export function getProductStatisticsAnalyse(params: PageParam) {
|
||||
return requestClient.get<
|
||||
MallDataComparisonRespVO<MallProductStatisticsApi.ProductStatistics>
|
||||
MallDataComparisonResp<MallProductStatisticsApi.ProductStatistics>
|
||||
>('/statistics/product/analyse', { params });
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import type { MallDataComparisonRespVO } from './common';
|
||||
import type { MallDataComparisonResp } from './common';
|
||||
|
||||
import { formatDate } from '@vben/utils';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace MallTradeStatisticsApi {
|
||||
/** 交易统计 Response VO */
|
||||
/** 交易统计 Response */
|
||||
export interface TradeSummary {
|
||||
yesterdayOrderCount: number;
|
||||
monthOrderCount: number;
|
||||
|
|
@ -13,12 +13,12 @@ export namespace MallTradeStatisticsApi {
|
|||
monthPayPrice: number;
|
||||
}
|
||||
|
||||
/** 交易状况 Request VO */
|
||||
/** 交易状况 Request */
|
||||
export interface TradeTrendReq {
|
||||
times: [Date, Date];
|
||||
}
|
||||
|
||||
/** 交易状况统计 Response VO */
|
||||
/** 交易状况统计 Response */
|
||||
export interface TradeTrendSummary {
|
||||
time: string;
|
||||
turnoverPrice: number;
|
||||
|
|
@ -30,7 +30,7 @@ export namespace MallTradeStatisticsApi {
|
|||
afterSaleRefundPrice: number;
|
||||
}
|
||||
|
||||
/** 交易订单数量 Response VO */
|
||||
/** 交易订单数量 Response */
|
||||
export interface TradeOrderCount {
|
||||
/** 待发货 */
|
||||
undelivered?: number;
|
||||
|
|
@ -42,7 +42,7 @@ export namespace MallTradeStatisticsApi {
|
|||
auditingWithdraw?: number;
|
||||
}
|
||||
|
||||
/** 交易订单统计 Response VO */
|
||||
/** 交易订单统计 Response */
|
||||
export interface TradeOrderSummary {
|
||||
/** 支付订单商品数 */
|
||||
orderPayCount?: number;
|
||||
|
|
@ -50,7 +50,7 @@ export namespace MallTradeStatisticsApi {
|
|||
orderPayPrice?: number;
|
||||
}
|
||||
|
||||
/** 订单量趋势统计 Response VO */
|
||||
/** 订单量趋势统计 Response */
|
||||
export interface TradeOrderTrend {
|
||||
/** 日期 */
|
||||
date: string;
|
||||
|
|
@ -71,7 +71,7 @@ const formatDateParam = (params: MallTradeStatisticsApi.TradeTrendReq) => {
|
|||
/** 查询交易统计 */
|
||||
export function getTradeStatisticsSummary() {
|
||||
return requestClient.get<
|
||||
MallDataComparisonRespVO<MallTradeStatisticsApi.TradeSummary>
|
||||
MallDataComparisonResp<MallTradeStatisticsApi.TradeSummary>
|
||||
>('/statistics/trade/summary');
|
||||
}
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ export function getTradeStatisticsAnalyse(
|
|||
params: MallTradeStatisticsApi.TradeTrendReq,
|
||||
) {
|
||||
return requestClient.get<
|
||||
MallDataComparisonRespVO<MallTradeStatisticsApi.TradeTrendSummary>
|
||||
MallDataComparisonResp<MallTradeStatisticsApi.TradeTrendSummary>
|
||||
>('/statistics/trade/analyse', { params: formatDateParam(params) });
|
||||
}
|
||||
|
||||
|
|
@ -113,7 +113,7 @@ export function getOrderCount() {
|
|||
/** 获得交易订单数量对照 */
|
||||
export function getOrderComparison() {
|
||||
return requestClient.get<
|
||||
MallDataComparisonRespVO<MallTradeStatisticsApi.TradeOrderSummary>
|
||||
MallDataComparisonResp<MallTradeStatisticsApi.TradeOrderSummary>
|
||||
>('/statistics/trade/order-comparison');
|
||||
}
|
||||
|
||||
|
|
@ -124,7 +124,7 @@ export function getOrderCountTrendComparison(
|
|||
endTime: Date,
|
||||
) {
|
||||
return requestClient.get<
|
||||
MallDataComparisonRespVO<MallTradeStatisticsApi.TradeOrderTrend>[]
|
||||
MallDataComparisonResp<MallTradeStatisticsApi.TradeOrderTrend>[]
|
||||
>('/statistics/trade/order-count-trend', {
|
||||
params: {
|
||||
type,
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ export namespace PayAppApi {
|
|||
status: number;
|
||||
}
|
||||
|
||||
export interface AppPageReqVO extends PageParam {
|
||||
export interface AppPageReq extends PageParam {
|
||||
name?: string;
|
||||
status?: number;
|
||||
remark?: string;
|
||||
|
|
@ -37,7 +37,7 @@ export namespace PayAppApi {
|
|||
}
|
||||
|
||||
/** 查询支付应用列表 */
|
||||
export function getAppPage(params: PayAppApi.AppPageReqVO) {
|
||||
export function getAppPage(params: PayAppApi.AppPageReq) {
|
||||
return requestClient.get<PageResult<PayAppApi.App>>('/pay/app/page', {
|
||||
params,
|
||||
});
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ export namespace DemoOrderApi {
|
|||
createTime?: Date;
|
||||
}
|
||||
|
||||
export interface OrderPageReqVO extends PageParam {
|
||||
export interface OrderPageReq extends PageParam {
|
||||
spuId?: number;
|
||||
createTime?: Date[];
|
||||
}
|
||||
|
|
@ -32,7 +32,7 @@ export function createDemoOrder(data: DemoOrderApi.Order) {
|
|||
}
|
||||
|
||||
/** 获得示例订单分页 */
|
||||
export function getDemoOrderPage(params: DemoOrderApi.OrderPageReqVO) {
|
||||
export function getDemoOrderPage(params: DemoOrderApi.OrderPageReq) {
|
||||
return requestClient.get<PageResult<DemoOrderApi.Order>>(
|
||||
'/pay/demo-order/page',
|
||||
{
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ export namespace PayOrderApi {
|
|||
}
|
||||
|
||||
/** 支付订单分页请求 */
|
||||
export interface OrderPageReqVO extends PageParam {
|
||||
export interface OrderPageReq extends PageParam {
|
||||
merchantId?: number;
|
||||
appId?: number;
|
||||
channelId?: number;
|
||||
|
|
@ -66,7 +66,7 @@ export namespace PayOrderApi {
|
|||
}
|
||||
|
||||
/** 支付订单导出请求 */
|
||||
export interface OrderExportReqVO {
|
||||
export interface OrderExportReq {
|
||||
merchantId?: number;
|
||||
appId?: number;
|
||||
channelId?: number;
|
||||
|
|
@ -93,7 +93,7 @@ export namespace PayOrderApi {
|
|||
}
|
||||
|
||||
/** 查询支付订单列表 */
|
||||
export function getOrderPage(params: PayOrderApi.OrderPageReqVO) {
|
||||
export function getOrderPage(params: PayOrderApi.OrderPageReq) {
|
||||
return requestClient.get<PageResult<PayOrderApi.Order>>('/pay/order/page', {
|
||||
params,
|
||||
});
|
||||
|
|
@ -120,6 +120,6 @@ export function submitOrder(data: any) {
|
|||
}
|
||||
|
||||
/** 导出支付订单 */
|
||||
export function exportOrder(params: PayOrderApi.OrderExportReqVO) {
|
||||
export function exportOrder(params: PayOrderApi.OrderExportReq) {
|
||||
return requestClient.download('/pay/order/export-excel', { params });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ export namespace PayRefundApi {
|
|||
}
|
||||
|
||||
/** 退款订单分页请求 */
|
||||
export interface RefundPageReqVO extends PageParam {
|
||||
export interface RefundPageReq extends PageParam {
|
||||
merchantId?: number;
|
||||
appId?: number;
|
||||
channelId?: number;
|
||||
|
|
@ -64,7 +64,7 @@ export namespace PayRefundApi {
|
|||
}
|
||||
|
||||
/** 退款订单导出请求 */
|
||||
export interface RefundExportReqVO {
|
||||
export interface RefundExportReq {
|
||||
merchantId?: number;
|
||||
appId?: number;
|
||||
channelId?: number;
|
||||
|
|
@ -94,7 +94,7 @@ export namespace PayRefundApi {
|
|||
}
|
||||
|
||||
/** 查询退款订单列表 */
|
||||
export function getRefundPage(params: PayRefundApi.RefundPageReqVO) {
|
||||
export function getRefundPage(params: PayRefundApi.RefundPageReq) {
|
||||
return requestClient.get<PageResult<PayRefundApi.Refund>>(
|
||||
'/pay/refund/page',
|
||||
{
|
||||
|
|
@ -124,6 +124,6 @@ export function deleteRefund(id: number) {
|
|||
}
|
||||
|
||||
/** 导出退款订单 */
|
||||
export function exportRefund(params: PayRefundApi.RefundExportReqVO) {
|
||||
export function exportRefund(params: PayRefundApi.RefundExportReq) {
|
||||
return requestClient.download('/pay/refund/export-excel', { params });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export namespace PayTransferApi {
|
|||
}
|
||||
|
||||
/** 转账单分页请求 */
|
||||
export interface TransferPageReqVO extends PageParam {
|
||||
export interface TransferPageReq extends PageParam {
|
||||
appId?: number;
|
||||
channelId?: number;
|
||||
channelCode?: string;
|
||||
|
|
@ -36,7 +36,7 @@ export namespace PayTransferApi {
|
|||
}
|
||||
|
||||
/** 查询转账单列表 */
|
||||
export function getTransferPage(params: PayTransferApi.TransferPageReqVO) {
|
||||
export function getTransferPage(params: PayTransferApi.TransferPageReq) {
|
||||
return requestClient.get<PageResult<PayTransferApi.Transfer>>(
|
||||
'/pay/transfer/page',
|
||||
{
|
||||
|
|
|
|||
|
|
@ -4,12 +4,12 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace PayWalletApi {
|
||||
/** 用户钱包查询参数 */
|
||||
export interface PayWalletUserReqVO {
|
||||
export interface PayWalletUserReq {
|
||||
userId: number;
|
||||
}
|
||||
|
||||
/** 钱包信息 */
|
||||
export interface WalletVO {
|
||||
export interface Wallet {
|
||||
id: number;
|
||||
userId: number;
|
||||
userType: number;
|
||||
|
|
@ -20,7 +20,7 @@ export namespace PayWalletApi {
|
|||
}
|
||||
|
||||
/** 钱包分页请求 */
|
||||
export interface WalletPageReqVO extends PageParam {
|
||||
export interface WalletPageReq extends PageParam {
|
||||
userId?: number;
|
||||
userType?: number;
|
||||
balance?: number;
|
||||
|
|
@ -31,15 +31,15 @@ export namespace PayWalletApi {
|
|||
}
|
||||
|
||||
/** 查询用户钱包详情 */
|
||||
export function getWallet(params: PayWalletApi.PayWalletUserReqVO) {
|
||||
return requestClient.get<PayWalletApi.WalletVO>('/pay/wallet/get', {
|
||||
export function getWallet(params: PayWalletApi.PayWalletUserReq) {
|
||||
return requestClient.get<PayWalletApi.Wallet>('/pay/wallet/get', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/** 查询会员钱包列表 */
|
||||
export function getWalletPage(params: PayWalletApi.WalletPageReqVO) {
|
||||
return requestClient.get<PageResult<PayWalletApi.WalletVO>>(
|
||||
export function getWalletPage(params: PayWalletApi.WalletPageReq) {
|
||||
return requestClient.get<PageResult<PayWalletApi.Wallet>>(
|
||||
'/pay/wallet/page',
|
||||
{
|
||||
params,
|
||||
|
|
@ -48,6 +48,6 @@ export function getWalletPage(params: PayWalletApi.WalletPageReqVO) {
|
|||
}
|
||||
|
||||
/** 修改会员钱包余额 */
|
||||
export function updateWalletBalance(data: PayWalletApi.WalletVO) {
|
||||
export function updateWalletBalance(data: PayWalletApi.Wallet) {
|
||||
return requestClient.put('/pay/wallet/update-balance', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ export namespace SystemMailTemplateApi {
|
|||
}
|
||||
|
||||
/** 邮件发送信息 */
|
||||
export interface MailSendReqVO {
|
||||
export interface MailSendReq {
|
||||
mail: string;
|
||||
templateCode: string;
|
||||
templateParams: Record<string, any>;
|
||||
|
|
@ -57,6 +57,6 @@ export function deleteMailTemplate(id: number) {
|
|||
}
|
||||
|
||||
/** 发送邮件 */
|
||||
export function sendMail(data: SystemMailTemplateApi.MailSendReqVO) {
|
||||
export function sendMail(data: SystemMailTemplateApi.MailSendReq) {
|
||||
return requestClient.post('/system/mail-template/send-mail', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ export namespace SystemNotifyTemplateApi {
|
|||
}
|
||||
|
||||
/** 发送站内信请求 */
|
||||
export interface NotifySendReqVO {
|
||||
export interface NotifySendReq {
|
||||
userId: number;
|
||||
userType: number;
|
||||
templateCode: string;
|
||||
|
|
@ -67,6 +67,6 @@ export function exportNotifyTemplate(params: any) {
|
|||
}
|
||||
|
||||
/** 发送站内信 */
|
||||
export function sendNotify(data: SystemNotifyTemplateApi.NotifySendReqVO) {
|
||||
export function sendNotify(data: SystemNotifyTemplateApi.NotifySendReq) {
|
||||
return requestClient.post('/system/notify-template/send-notify', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { requestClient } from '#/api/request';
|
|||
/** OAuth2.0 授权信息响应 */
|
||||
export namespace SystemOAuth2ClientApi {
|
||||
/** 授权信息 */
|
||||
export interface AuthorizeInfoRespVO {
|
||||
export interface AuthorizeInfoResp {
|
||||
client: {
|
||||
logo: string;
|
||||
name: string;
|
||||
|
|
@ -17,7 +17,7 @@ export namespace SystemOAuth2ClientApi {
|
|||
|
||||
/** 获得授权信息 */
|
||||
export function getAuthorize(clientId: string) {
|
||||
return requestClient.get<SystemOAuth2ClientApi.AuthorizeInfoRespVO>(
|
||||
return requestClient.get<SystemOAuth2ClientApi.AuthorizeInfoResp>(
|
||||
`/system/oauth2/authorize?clientId=${clientId}`,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,19 +2,19 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace SystemPermissionApi {
|
||||
/** 分配用户角色请求 */
|
||||
export interface AssignUserRoleReqVO {
|
||||
export interface AssignUserRoleReq {
|
||||
userId: number;
|
||||
roleIds: number[];
|
||||
}
|
||||
|
||||
/** 分配角色菜单请求 */
|
||||
export interface AssignRoleMenuReqVO {
|
||||
export interface AssignRoleMenuReq {
|
||||
roleId: number;
|
||||
menuIds: number[];
|
||||
}
|
||||
|
||||
/** 分配角色数据权限请求 */
|
||||
export interface AssignRoleDataScopeReqVO {
|
||||
export interface AssignRoleDataScopeReq {
|
||||
roleId: number;
|
||||
dataScope: number;
|
||||
dataScopeDeptIds: number[];
|
||||
|
|
@ -30,14 +30,14 @@ export async function getRoleMenuList(roleId: number) {
|
|||
|
||||
/** 赋予角色菜单权限 */
|
||||
export async function assignRoleMenu(
|
||||
data: SystemPermissionApi.AssignRoleMenuReqVO,
|
||||
data: SystemPermissionApi.AssignRoleMenuReq,
|
||||
) {
|
||||
return requestClient.post('/system/permission/assign-role-menu', data);
|
||||
}
|
||||
|
||||
/** 赋予角色数据权限 */
|
||||
export async function assignRoleDataScope(
|
||||
data: SystemPermissionApi.AssignRoleDataScopeReqVO,
|
||||
data: SystemPermissionApi.AssignRoleDataScopeReq,
|
||||
) {
|
||||
return requestClient.post('/system/permission/assign-role-data-scope', data);
|
||||
}
|
||||
|
|
@ -51,7 +51,7 @@ export async function getUserRoleList(userId: number) {
|
|||
|
||||
/** 赋予用户角色 */
|
||||
export async function assignUserRole(
|
||||
data: SystemPermissionApi.AssignUserRoleReqVO,
|
||||
data: SystemPermissionApi.AssignUserRoleReq,
|
||||
) {
|
||||
return requestClient.post('/system/permission/assign-user-role', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ export namespace SystemSmsTemplateApi {
|
|||
}
|
||||
|
||||
/** 发送短信请求 */
|
||||
export interface SmsSendReqVO {
|
||||
export interface SmsSendReq {
|
||||
mobile: string;
|
||||
templateCode: string;
|
||||
templateParams: Record<string, any>;
|
||||
|
|
@ -65,6 +65,6 @@ export function exportSmsTemplate(params: any) {
|
|||
}
|
||||
|
||||
/** 发送短信 */
|
||||
export function sendSms(data: SystemSmsTemplateApi.SmsSendReqVO) {
|
||||
export function sendSms(data: SystemSmsTemplateApi.SmsSendReq) {
|
||||
return requestClient.post('/system/sms-template/send-sms', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,14 +20,14 @@ export namespace SystemSocialUserApi {
|
|||
}
|
||||
|
||||
/** 社交绑定请求 */
|
||||
export interface SocialUserBindReqVO {
|
||||
export interface SocialUserBindReq {
|
||||
type: number;
|
||||
code: string;
|
||||
state: string;
|
||||
}
|
||||
|
||||
/** 取消社交绑定请求 */
|
||||
export interface SocialUserUnbindReqVO {
|
||||
export interface SocialUserUnbindReq {
|
||||
type: number;
|
||||
openid: string;
|
||||
}
|
||||
|
|
@ -49,12 +49,12 @@ export function getSocialUser(id: number) {
|
|||
}
|
||||
|
||||
/** 社交绑定,使用 code 授权码 */
|
||||
export function socialBind(data: SystemSocialUserApi.SocialUserBindReqVO) {
|
||||
export function socialBind(data: SystemSocialUserApi.SocialUserBindReq) {
|
||||
return requestClient.post<boolean>('/system/social-user/bind', data);
|
||||
}
|
||||
|
||||
/** 取消社交绑定 */
|
||||
export function socialUnbind(data: SystemSocialUserApi.SocialUserUnbindReqVO) {
|
||||
export function socialUnbind(data: SystemSocialUserApi.SocialUserUnbindReq) {
|
||||
return requestClient.delete<boolean>('/system/social-user/unbind', { data });
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import { requestClient } from '#/api/request';
|
|||
|
||||
export namespace SystemUserProfileApi {
|
||||
/** 用户个人中心信息 */
|
||||
export interface UserProfileRespVO {
|
||||
export interface UserProfileResp {
|
||||
id: number;
|
||||
username: string;
|
||||
nickname: string;
|
||||
|
|
@ -19,13 +19,13 @@ export namespace SystemUserProfileApi {
|
|||
}
|
||||
|
||||
/** 更新密码请求 */
|
||||
export interface UpdatePasswordReqVO {
|
||||
export interface UpdatePasswordReq {
|
||||
oldPassword: string;
|
||||
newPassword: string;
|
||||
}
|
||||
|
||||
/** 更新个人信息请求 */
|
||||
export interface UpdateProfileReqVO {
|
||||
export interface UpdateProfileReq {
|
||||
nickname?: string;
|
||||
email?: string;
|
||||
mobile?: string;
|
||||
|
|
@ -36,21 +36,19 @@ export namespace SystemUserProfileApi {
|
|||
|
||||
/** 获取登录用户信息 */
|
||||
export function getUserProfile() {
|
||||
return requestClient.get<SystemUserProfileApi.UserProfileRespVO>(
|
||||
return requestClient.get<SystemUserProfileApi.UserProfileResp>(
|
||||
'/system/user/profile/get',
|
||||
);
|
||||
}
|
||||
|
||||
/** 修改用户个人信息 */
|
||||
export function updateUserProfile(
|
||||
data: SystemUserProfileApi.UpdateProfileReqVO,
|
||||
) {
|
||||
export function updateUserProfile(data: SystemUserProfileApi.UpdateProfileReq) {
|
||||
return requestClient.put('/system/user/profile/update', data);
|
||||
}
|
||||
|
||||
/** 修改用户个人密码 */
|
||||
export function updateUserPassword(
|
||||
data: SystemUserProfileApi.UpdatePasswordReqVO,
|
||||
data: SystemUserProfileApi.UpdatePasswordReq,
|
||||
) {
|
||||
return requestClient.put('/system/user/profile/update-password', data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ interface DeptTreeNode {
|
|||
|
||||
defineOptions({ name: 'UserSelectModal' });
|
||||
|
||||
const props = withDefaults(
|
||||
withDefaults(
|
||||
defineProps<{
|
||||
cancelText?: string;
|
||||
confirmText?: string;
|
||||
|
|
@ -216,7 +216,9 @@ async function loadUserData(pageNo: number, pageSize: number) {
|
|||
if (newUsers.length > 0) {
|
||||
userList.value.push(...newUsers);
|
||||
}
|
||||
} finally {}
|
||||
} finally {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
// 更新右侧列表数据
|
||||
|
|
|
|||
|
|
@ -177,7 +177,7 @@ defineExpose({ open }); // 提供 open 方法,用于打开弹窗
|
|||
@click="clickIcon()"
|
||||
>
|
||||
{{ currentNode.name }}
|
||||
<IconifyIcon class="ml-1" icon="ep:edit-pen" />
|
||||
<IconifyIcon class="ml-1" icon="lucide:edit-3" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ defineExpose({ showCopyTaskNodeConfig }); // 暴露方法给父组件
|
|||
/>
|
||||
<div v-else class="node-name">
|
||||
{{ nodeName }}
|
||||
<IconifyIcon class="ml-1" icon="ep:edit-pen" @click="clickIcon()" />
|
||||
<IconifyIcon class="ml-1" icon="lucide:edit-3" @click="clickIcon()" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
|
|||
@click="clickIcon()"
|
||||
>
|
||||
{{ nodeName }}
|
||||
<IconifyIcon class="ml-1" icon="ep:edit-pen" :size="16" />
|
||||
<IconifyIcon class="ml-1" icon="lucide:edit-3" :size="16" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -33,6 +33,18 @@ const [Modal, modalApi] = useVbenModal({
|
|||
title: '条件配置',
|
||||
destroyOnClose: true,
|
||||
draggable: true,
|
||||
onOpenChange(isOpen) {
|
||||
if (isOpen) {
|
||||
// 获取传递的数据
|
||||
const conditionObj = modalApi.getData();
|
||||
if (conditionObj) {
|
||||
conditionData.value.conditionType = conditionObj.conditionType;
|
||||
conditionData.value.conditionExpression =
|
||||
conditionObj.conditionExpression;
|
||||
conditionData.value.conditionGroups = conditionObj.conditionGroups;
|
||||
}
|
||||
}
|
||||
},
|
||||
async onConfirm() {
|
||||
// 校验表单
|
||||
if (!conditionRef.value) return;
|
||||
|
|
@ -50,17 +62,8 @@ const [Modal, modalApi] = useVbenModal({
|
|||
},
|
||||
});
|
||||
|
||||
// TODO: jason open 在 useVbenModal 中 onOpenChange 方法
|
||||
function open(conditionObj: any | undefined) {
|
||||
if (conditionObj) {
|
||||
conditionData.value.conditionType = conditionObj.conditionType;
|
||||
conditionData.value.conditionExpression = conditionObj.conditionExpression;
|
||||
conditionData.value.conditionGroups = conditionObj.conditionGroups;
|
||||
}
|
||||
modalApi.open();
|
||||
}
|
||||
// TODO: jason 不需要暴露expose,直接使用modalApi.setData(formSetting).open()
|
||||
defineExpose({ open });
|
||||
// TODO xingyu 暴露 modalApi 给父组件是否合适? trigger-node-config.vue 会有多个 conditionDialog 实例
|
||||
defineExpose({ modalApi });
|
||||
</script>
|
||||
<template>
|
||||
<Modal class="w-1/2">
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ defineExpose({ validate });
|
|||
>
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
class="size-4"
|
||||
@click="
|
||||
deleteConditionGroup(condition.conditionGroups.conditions, cIdx)
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
|
|||
@click="clickIcon()"
|
||||
>
|
||||
{{ nodeName }}
|
||||
<IconifyIcon class="ml-1" icon="ep:edit-pen" />
|
||||
<IconifyIcon class="ml-1" icon="lucide:edit-3" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -266,7 +266,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
|
|||
@click="deleteRouterGroup(index)"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:close" />
|
||||
<IconifyIcon icon="lucide:x" />
|
||||
</template>
|
||||
</Button>
|
||||
</div>
|
||||
|
|
@ -287,7 +287,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
|
|||
@click="addRouterGroup"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:setting" />
|
||||
<IconifyIcon icon="lucide:settings" />
|
||||
</template>
|
||||
新增路由分支
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ defineExpose({ showStartUserNodeConfig });
|
|||
{{ nodeName }}
|
||||
<IconifyIcon
|
||||
class="ml-1"
|
||||
icon="ep:edit-pen"
|
||||
icon="lucide:edit-3"
|
||||
:size="16"
|
||||
@click="clickIcon()"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -200,8 +200,8 @@ function addFormSettingCondition(
|
|||
formSetting: FormTriggerSetting,
|
||||
) {
|
||||
const conditionDialog = proxy.$refs[`condition-${index}`][0];
|
||||
// TODO: jason Modal 使用 useVbenModal 初始化,弹出使用modalApi.setData(formSetting).open()
|
||||
conditionDialog.open(formSetting);
|
||||
// 使用modalApi来打开模态框并传递数据
|
||||
conditionDialog.modalApi.setData(formSetting).open();
|
||||
}
|
||||
|
||||
/** 删除条件配置 */
|
||||
|
|
@ -215,7 +215,8 @@ function openFormSettingCondition(
|
|||
formSetting: FormTriggerSetting,
|
||||
) {
|
||||
const conditionDialog = proxy.$refs[`condition-${index}`][0];
|
||||
conditionDialog.open(formSetting);
|
||||
// 使用 modalApi 来打开模态框并传递数据
|
||||
conditionDialog.modalApi.setData(formSetting).open();
|
||||
}
|
||||
|
||||
/** 处理条件配置保存 */
|
||||
|
|
@ -398,7 +399,7 @@ onMounted(() => {
|
|||
/>
|
||||
<div v-else class="node-name">
|
||||
{{ nodeName }}
|
||||
<IconifyIcon class="ml-1" icon="ep:edit-pen" @click="clickIcon()" />
|
||||
<IconifyIcon class="ml-1" icon="lucide:edit-3" @click="clickIcon()" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -455,7 +456,7 @@ onMounted(() => {
|
|||
@click="deleteFormSetting(index)"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:close" />
|
||||
<IconifyIcon icon="lucide:x" />
|
||||
</template>
|
||||
</Button>
|
||||
</div>
|
||||
|
|
@ -485,7 +486,7 @@ onMounted(() => {
|
|||
@click="addFormSettingCondition(index, formSetting)"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:link" />
|
||||
<IconifyIcon icon="lucide:link" />
|
||||
</template>
|
||||
添加条件
|
||||
</Button>
|
||||
|
|
@ -560,7 +561,7 @@ onMounted(() => {
|
|||
@click="addFormFieldSetting(formSetting)"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:memo" />
|
||||
<IconifyIcon icon="lucide:file-cog" />
|
||||
</template>
|
||||
添加修改字段
|
||||
</Button>
|
||||
|
|
@ -578,7 +579,7 @@ onMounted(() => {
|
|||
@click="addFormSetting"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:setting" />
|
||||
<IconifyIcon icon="lucide:settings" />
|
||||
</template>
|
||||
添加设置
|
||||
</Button>
|
||||
|
|
@ -603,7 +604,7 @@ onMounted(() => {
|
|||
@click="deleteFormSetting(index)"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:close" />
|
||||
<IconifyIcon icon="lucide:x" />
|
||||
</template>
|
||||
</Button>
|
||||
</div>
|
||||
|
|
@ -634,7 +635,7 @@ onMounted(() => {
|
|||
@click="addFormSettingCondition(index, formSetting)"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:link" />
|
||||
<IconifyIcon icon="lucide:link" />
|
||||
</template>
|
||||
添加条件
|
||||
</Button>
|
||||
|
|
@ -672,7 +673,7 @@ onMounted(() => {
|
|||
@click="addFormSetting"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon icon="ep:setting" />
|
||||
<IconifyIcon icon="lucide:settings" />
|
||||
</template>
|
||||
添加设置
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -595,7 +595,7 @@ onMounted(() => {
|
|||
/>
|
||||
<div v-else class="node-name">
|
||||
{{ nodeName }}
|
||||
<IconifyIcon class="ml-1" icon="ep:edit-pen" @click="clickIcon()" />
|
||||
<IconifyIcon class="ml-1" icon="lucide:edit-3" @click="clickIcon()" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1135,7 +1135,7 @@ onMounted(() => {
|
|||
<Button v-else text @click="changeBtnDisplayName(index)">
|
||||
<div class="flex items-center">
|
||||
{{ item.displayName }}
|
||||
<IconifyIcon icon="ep:edit" class="ml-2" />
|
||||
<IconifyIcon icon="lucide:edit" class="ml-2" />
|
||||
</div>
|
||||
</Button>
|
||||
</Col>
|
||||
|
|
|
|||
|
|
@ -91,13 +91,13 @@ function deleteNode() {
|
|||
<div class="node-text" v-else>
|
||||
{{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.COPY_TASK_NODE) }}
|
||||
</div>
|
||||
<IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" />
|
||||
<IconifyIcon v-if="!readonly" icon="lucide:chevron-right" />
|
||||
</div>
|
||||
<div v-if="!readonly" class="node-toolbar">
|
||||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
:size="18"
|
||||
@click="deleteNode"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -88,13 +88,13 @@ function deleteNode() {
|
|||
<div class="node-text" v-else>
|
||||
{{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.DELAY_TIMER_NODE) }}
|
||||
</div>
|
||||
<IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" />
|
||||
<IconifyIcon v-if="!readonly" icon="lucide:chevron-right" />
|
||||
</div>
|
||||
<div v-if="!readonly" class="node-toolbar">
|
||||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
:size="18"
|
||||
@click="deleteNode"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ function recursiveFindParentNode(
|
|||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
:size="18"
|
||||
@click="deleteCondition(index)"
|
||||
/>
|
||||
|
|
@ -263,7 +263,7 @@ function recursiveFindParentNode(
|
|||
"
|
||||
@click="moveNode(index, -1)"
|
||||
>
|
||||
<IconifyIcon icon="ep:arrow-left" />
|
||||
<IconifyIcon icon="lucide:chevron-left" />
|
||||
</div>
|
||||
|
||||
<div
|
||||
|
|
@ -275,7 +275,7 @@ function recursiveFindParentNode(
|
|||
"
|
||||
@click="moveNode(index, 1)"
|
||||
>
|
||||
<IconifyIcon icon="ep:arrow-right" />
|
||||
<IconifyIcon icon="lucide:chevron-right" />
|
||||
</div>
|
||||
</div>
|
||||
<NodeHandler
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ function recursiveFindParentNode(
|
|||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
:size="18"
|
||||
@click="deleteCondition(index)"
|
||||
/>
|
||||
|
|
@ -265,7 +265,7 @@ function recursiveFindParentNode(
|
|||
"
|
||||
@click="moveNode(index, -1)"
|
||||
>
|
||||
<IconifyIcon icon="ep:arrow-left" />
|
||||
<IconifyIcon icon="lucide:chevron-left" />
|
||||
</div>
|
||||
|
||||
<div
|
||||
|
|
@ -277,7 +277,7 @@ function recursiveFindParentNode(
|
|||
"
|
||||
@click="moveNode(index, 1)"
|
||||
>
|
||||
<IconifyIcon icon="ep:arrow-right" />
|
||||
<IconifyIcon icon="lucide:chevron-right" />
|
||||
</div>
|
||||
</div>
|
||||
<NodeHandler
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@ function addNode(type: number) {
|
|||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="add-icon"><IconifyIcon icon="ep:plus" /></div>
|
||||
<div class="add-icon"><IconifyIcon icon="lucide:plus" /></div>
|
||||
</Popover>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ function recursiveFindParentNode(
|
|||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
@click="deleteCondition(index)"
|
||||
/>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -91,13 +91,13 @@ function deleteNode() {
|
|||
<div class="node-text" v-else>
|
||||
{{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.ROUTER_BRANCH_NODE) }}
|
||||
</div>
|
||||
<IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" />
|
||||
<IconifyIcon v-if="!readonly" icon="lucide:chevron-right" />
|
||||
</div>
|
||||
<div v-if="!readonly" class="node-toolbar">
|
||||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
@click="deleteNode"
|
||||
/>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ function nodeClick() {
|
|||
<div class="node-text" v-else>
|
||||
{{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.START_USER_NODE) }}
|
||||
</div>
|
||||
<IconifyIcon icon="ep:arrow-right-bold" v-if="!readonly" />
|
||||
<IconifyIcon icon="lucide:chevron-right" v-if="!readonly" />
|
||||
</div>
|
||||
</div>
|
||||
<!-- 传递子节点给添加节点组件。会在子节点前面添加节点 -->
|
||||
|
|
|
|||
|
|
@ -93,13 +93,13 @@ function deleteNode() {
|
|||
<div class="node-text" v-else>
|
||||
{{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.TRIGGER_NODE) }}
|
||||
</div>
|
||||
<IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" />
|
||||
<IconifyIcon v-if="!readonly" icon="lucide:chevron-right" />
|
||||
</div>
|
||||
<div v-if="!readonly" class="node-toolbar">
|
||||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
:size="18"
|
||||
@click="deleteNode"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -111,13 +111,13 @@ function findReturnTaskNodes(
|
|||
<div class="node-text" v-else>
|
||||
{{ NODE_DEFAULT_TEXT.get(currentNode.type) }}
|
||||
</div>
|
||||
<IconifyIcon icon="ep:arrow-right-bold" v-if="!readonly" />
|
||||
<IconifyIcon icon="lucide:chevron-right" v-if="!readonly" />
|
||||
</div>
|
||||
<div v-if="!readonly" class="node-toolbar">
|
||||
<div class="toolbar-icon">
|
||||
<IconifyIcon
|
||||
color="#0089ff"
|
||||
icon="ep:circle-close-filled"
|
||||
icon="lucide:circle-x"
|
||||
:size="18"
|
||||
@click="deleteNode"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ const postOptions = ref<SystemPostApi.Post[]>([]); // 岗位列表
|
|||
const userOptions = ref<SystemUserApi.User[]>([]); // 用户列表
|
||||
const deptOptions = ref<SystemDeptApi.Dept[]>([]); // 部门列表
|
||||
const deptTreeOptions = ref();
|
||||
const userGroupOptions = ref<BpmUserGroupApi.UserGroupVO[]>([]); // 用户组列表
|
||||
const userGroupOptions = ref<BpmUserGroupApi.UserGroup[]>([]); // 用户组列表
|
||||
|
||||
provide('formFields', formFields);
|
||||
provide('formType', formType);
|
||||
|
|
|
|||
|
|
@ -205,10 +205,10 @@ onMounted(() => {
|
|||
<Row type="flex" justify="end">
|
||||
<ButtonGroup key="scale-control">
|
||||
<Button v-if="!readonly" @click="exportJson">
|
||||
<IconifyIcon icon="ep:download" /> 导出
|
||||
<IconifyIcon icon="lucide:download" /> 导出
|
||||
</Button>
|
||||
<Button v-if="!readonly" @click="importJson">
|
||||
<IconifyIcon icon="ep:upload" />导入
|
||||
<IconifyIcon icon="lucide:upload" />导入
|
||||
</Button>
|
||||
<!-- 用于打开本地文件-->
|
||||
<input
|
||||
|
|
@ -221,14 +221,14 @@ onMounted(() => {
|
|||
@change="importLocalFile"
|
||||
/>
|
||||
<Button @click="processReZoom()">
|
||||
<IconifyIcon icon="tabler:relation-one-to-one" />
|
||||
<IconifyIcon icon="lucide:table-columns-split" />
|
||||
</Button>
|
||||
<Button :plain="true" @click="zoomOut()">
|
||||
<IconifyIcon icon="tabler:zoom-out" />
|
||||
<IconifyIcon icon="lucide:zoom-out" />
|
||||
</Button>
|
||||
<Button class="w-80px"> {{ scaleValue }}% </Button>
|
||||
<Button :plain="true" @click="zoomIn()">
|
||||
<IconifyIcon icon="tabler:zoom-in" />
|
||||
<IconifyIcon icon="lucide:zoom-in" />
|
||||
</Button>
|
||||
<Button @click="resetPosition">重置</Button>
|
||||
</ButtonGroup>
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ export function useNodeForm(nodeType: BpmNodeTypeEnum) {
|
|||
const postOptions = inject<Ref<SystemPostApi.Post[]>>('postList', ref([])); // 岗位列表
|
||||
const userOptions = inject<Ref<SystemUserApi.User[]>>('userList', ref([])); // 用户列表
|
||||
const deptOptions = inject<Ref<SystemDeptApi.Dept[]>>('deptList', ref([])); // 部门列表
|
||||
const userGroupOptions = inject<Ref<BpmUserGroupApi.UserGroupVO[]>>(
|
||||
const userGroupOptions = inject<Ref<BpmUserGroupApi.UserGroup[]>>(
|
||||
'userGroupList',
|
||||
ref([]),
|
||||
); // 用户组列表
|
||||
|
|
|
|||
|
|
@ -25,7 +25,10 @@ defineProps<SummaryCardProps>();
|
|||
<div class="flex items-center gap-1">
|
||||
<span class="text-3.5">{{ title }}</span>
|
||||
<Tooltip :content="tooltip" placement="topLeft" v-if="tooltip">
|
||||
<IconifyIcon icon="ep:warning" class="item-center !text-3 flex" />
|
||||
<IconifyIcon
|
||||
icon="lucide:circle-alert"
|
||||
class="item-center !text-3 flex"
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<div class="flex flex-row items-baseline gap-2">
|
||||
|
|
@ -42,7 +45,9 @@ defineProps<SummaryCardProps>();
|
|||
>
|
||||
<span class="text-sm">{{ Math.abs(Number(percent)) }}%</span>
|
||||
<IconifyIcon
|
||||
:icon="Number(percent) > 0 ? 'ep:caret-top' : 'ep:caret-bottom'"
|
||||
:icon="
|
||||
Number(percent) > 0 ? 'lucide:chevron-up' : 'lucide:chevron-down'
|
||||
"
|
||||
class="!text-3 ml-0.5"
|
||||
/>
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ export function getUploadUrl(): string {
|
|||
* @param file 文件
|
||||
*/
|
||||
function createFile0(
|
||||
vo: InfraFileApi.FilePresignedUrlRespVO,
|
||||
vo: InfraFileApi.FilePresignedUrlResp,
|
||||
file: File,
|
||||
): InfraFileApi.File {
|
||||
const fileVO = {
|
||||
|
|
|
|||
|
|
@ -98,6 +98,18 @@ const routes: RouteRecordRaw[] = [
|
|||
keepAlive: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'process-instance/report',
|
||||
component: () => import('#/views/bpm/processInstance/report/index.vue'),
|
||||
name: 'BpmProcessInstanceReport',
|
||||
meta: {
|
||||
title: '数据报表',
|
||||
activeMenu: '/bpm/manager/model',
|
||||
icon: 'carbon:data-2',
|
||||
hideInMenu: true,
|
||||
keepAlive: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ const authStore = useAuthStore();
|
|||
const activeName = ref('basicInfo');
|
||||
|
||||
/** 加载个人信息 */
|
||||
const profile = ref<SystemUserProfileApi.UserProfileRespVO>();
|
||||
const profile = ref<SystemUserProfileApi.UserProfileResp>();
|
||||
async function loadProfile() {
|
||||
profile.value = await getUserProfile();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import { updateUserProfile } from '#/api/system/user/profile';
|
|||
import { DICT_TYPE, getDictOptions } from '#/utils';
|
||||
|
||||
const props = defineProps<{
|
||||
profile?: SystemUserProfileApi.UserProfileRespVO;
|
||||
profile?: SystemUserProfileApi.UserProfileResp;
|
||||
}>();
|
||||
const emit = defineEmits<{
|
||||
(e: 'success'): void;
|
||||
|
|
@ -77,7 +77,7 @@ async function handleSubmit(values: Recordable<any>) {
|
|||
try {
|
||||
formApi.setLoading(true);
|
||||
// 提交表单
|
||||
await updateUserProfile(values as SystemUserProfileApi.UpdateProfileReqVO);
|
||||
await updateUserProfile(values as SystemUserProfileApi.UpdateProfileReq);
|
||||
// 关闭并提示
|
||||
emit('success');
|
||||
message.success($t('ui.actionMessage.operationSuccess'));
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import { CropperAvatar } from '#/components/cropper';
|
|||
import { useUpload } from '#/components/upload/use-upload';
|
||||
|
||||
const props = defineProps<{
|
||||
profile?: SystemUserProfileApi.UserProfileRespVO;
|
||||
profile?: SystemUserProfileApi.UserProfileResp;
|
||||
}>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ function handleCreate() {
|
|||
}
|
||||
|
||||
/** 编辑流程分类 */
|
||||
function handleEdit(row: BpmCategoryApi.CategoryVO) {
|
||||
function handleEdit(row: BpmCategoryApi.Category) {
|
||||
formModalApi.setData(row).open();
|
||||
}
|
||||
|
||||
/** 删除流程分类 */
|
||||
async function handleDelete(row: BpmCategoryApi.CategoryVO) {
|
||||
async function handleDelete(row: BpmCategoryApi.Category) {
|
||||
const hideLoading = message.loading({
|
||||
content: $t('ui.actionMessage.deleting', [row.code]),
|
||||
key: 'action_key_msg',
|
||||
|
|
@ -77,7 +77,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmCategoryApi.CategoryVO>,
|
||||
} as VxeTableGridOptions<BpmCategoryApi.Category>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import { $t } from '#/locales';
|
|||
import { useFormSchema } from '../data';
|
||||
|
||||
const emit = defineEmits(['success']);
|
||||
const formData = ref<BpmCategoryApi.CategoryVO>();
|
||||
const formData = ref<BpmCategoryApi.Category>();
|
||||
const getTitle = computed(() => {
|
||||
return formData.value?.id
|
||||
? $t('ui.actionTitle.edit', ['流程分类'])
|
||||
|
|
@ -39,7 +39,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
}
|
||||
modalApi.lock();
|
||||
// 提交表单
|
||||
const data = (await formApi.getValues()) as BpmCategoryApi.CategoryVO;
|
||||
const data = (await formApi.getValues()) as BpmCategoryApi.Category;
|
||||
try {
|
||||
await (formData.value?.id ? updateCategory(data) : createCategory(data));
|
||||
// 关闭并提示
|
||||
|
|
@ -56,7 +56,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
return;
|
||||
}
|
||||
// 加载数据
|
||||
const data = modalApi.getData<BpmCategoryApi.CategoryVO>();
|
||||
const data = modalApi.getData<BpmCategoryApi.Category>();
|
||||
if (!data || !data.id) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import { getCategory, updateCategory } from '#/api/bpm/category';
|
|||
import { $t } from '#/locales';
|
||||
|
||||
const emit = defineEmits(['success']);
|
||||
const formData = ref<BpmCategoryApi.CategoryVO>();
|
||||
const formData = ref<BpmCategoryApi.Category>();
|
||||
|
||||
// 定义表单结构
|
||||
const formSchema = [
|
||||
|
|
@ -53,7 +53,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
status: formData.value?.status,
|
||||
description: formData.value?.description,
|
||||
sort: formData.value?.sort,
|
||||
} as BpmCategoryApi.CategoryVO;
|
||||
} as BpmCategoryApi.Category;
|
||||
|
||||
try {
|
||||
await updateCategory(data);
|
||||
|
|
@ -74,7 +74,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
}
|
||||
|
||||
// 加载数据
|
||||
const data = modalApi.getData<BpmCategoryApi.CategoryVO>();
|
||||
const data = modalApi.getData<BpmCategoryApi.Category>();
|
||||
|
||||
if (!data || !data.id) {
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ function handleCreate() {
|
|||
}
|
||||
|
||||
/** 编辑 */
|
||||
function handleEdit(row: BpmFormApi.FormVO) {
|
||||
function handleEdit(row: BpmFormApi.Form) {
|
||||
router.push({
|
||||
name: 'BpmFormEditor',
|
||||
query: {
|
||||
|
|
@ -46,7 +46,7 @@ function handleEdit(row: BpmFormApi.FormVO) {
|
|||
}
|
||||
|
||||
/** 复制 */
|
||||
function handleCopy(row: BpmFormApi.FormVO) {
|
||||
function handleCopy(row: BpmFormApi.Form) {
|
||||
router.push({
|
||||
name: 'BpmFormEditor',
|
||||
query: {
|
||||
|
|
@ -57,7 +57,7 @@ function handleCopy(row: BpmFormApi.FormVO) {
|
|||
}
|
||||
|
||||
/** 删除 */
|
||||
async function handleDelete(row: BpmFormApi.FormVO) {
|
||||
async function handleDelete(row: BpmFormApi.Form) {
|
||||
const hideLoading = message.loading({
|
||||
content: $t('ui.actionMessage.deleting', [row.name]),
|
||||
key: 'action_key_msg',
|
||||
|
|
@ -73,7 +73,7 @@ async function handleDelete(row: BpmFormApi.FormVO) {
|
|||
hideLoading();
|
||||
}
|
||||
}
|
||||
async function handleDetail(row: BpmFormApi.FormVO) {
|
||||
async function handleDetail(row: BpmFormApi.Form) {
|
||||
detailModalApi.setData(row).open();
|
||||
}
|
||||
|
||||
|
|
@ -115,7 +115,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 64,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmFormApi.FormVO>,
|
||||
} as VxeTableGridOptions<BpmFormApi.Form>,
|
||||
});
|
||||
|
||||
watch(
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ import { useFormSchema } from '../data';
|
|||
const emit = defineEmits(['success']);
|
||||
|
||||
const designerComponent = ref<InstanceType<typeof FcDesigner>>();
|
||||
const formData = ref<BpmFormApi.FormVO>();
|
||||
const formData = ref<BpmFormApi.Form>();
|
||||
const editorAction = ref<string>();
|
||||
|
||||
const getTitle = computed(() => {
|
||||
|
|
@ -47,7 +47,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
modalApi.lock();
|
||||
try {
|
||||
// 获取表单数据
|
||||
const data = (await formApi.getValues()) as BpmFormApi.FormVO;
|
||||
const data = (await formApi.getValues()) as BpmFormApi.Form;
|
||||
|
||||
// 编码表单配置和表单字段
|
||||
data.conf = encodeConf(designerComponent);
|
||||
|
|
|
|||
|
|
@ -33,12 +33,12 @@ function handleCreate() {
|
|||
}
|
||||
|
||||
/** 编辑用户分组 */
|
||||
function handleEdit(row: BpmUserGroupApi.UserGroupVO) {
|
||||
function handleEdit(row: BpmUserGroupApi.UserGroup) {
|
||||
formModalApi.setData(row).open();
|
||||
}
|
||||
|
||||
/** 删除用户分组 */
|
||||
async function handleDelete(row: BpmUserGroupApi.UserGroupVO) {
|
||||
async function handleDelete(row: BpmUserGroupApi.UserGroup) {
|
||||
const hideLoading = message.loading({
|
||||
content: $t('ui.actionMessage.deleting', [row.name]),
|
||||
key: 'action_key_msg',
|
||||
|
|
@ -88,7 +88,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmUserGroupApi.UserGroupVO>,
|
||||
} as VxeTableGridOptions<BpmUserGroupApi.UserGroup>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import { $t } from '#/locales';
|
|||
import { useFormSchema } from '../data';
|
||||
|
||||
const emit = defineEmits(['success']);
|
||||
const formData = ref<BpmUserGroupApi.UserGroupVO>();
|
||||
const formData = ref<BpmUserGroupApi.UserGroup>();
|
||||
const getTitle = computed(() => {
|
||||
return formData.value?.id
|
||||
? $t('ui.actionTitle.edit', ['用户分组'])
|
||||
|
|
@ -46,7 +46,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
}
|
||||
modalApi.lock();
|
||||
// 提交表单
|
||||
const data = (await formApi.getValues()) as BpmUserGroupApi.UserGroupVO;
|
||||
const data = (await formApi.getValues()) as BpmUserGroupApi.UserGroup;
|
||||
try {
|
||||
await (formData.value?.id
|
||||
? updateUserGroup(data)
|
||||
|
|
@ -67,7 +67,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
return;
|
||||
}
|
||||
// 加载数据
|
||||
const data = modalApi.getData<BpmUserGroupApi.UserGroupVO>();
|
||||
const data = modalApi.getData<BpmUserGroupApi.UserGroup>();
|
||||
if (!data || !data.id) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import type { BpmProcessDefinitionApi } from '#/api/bpm/definition';
|
|||
import { DICT_TYPE } from '#/utils';
|
||||
|
||||
/** 列表的字段 */
|
||||
export function useGridColumns(): VxeTableGridOptions<BpmProcessDefinitionApi.ProcessDefinitionVO>['columns'] {
|
||||
export function useGridColumns(): VxeTableGridOptions<BpmProcessDefinitionApi.ProcessDefinition>['columns'] {
|
||||
return [
|
||||
{
|
||||
field: 'id',
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ defineOptions({ name: 'BpmModelCreate' });
|
|||
|
||||
// 流程定义类型
|
||||
type BpmProcessDefinitionType = Omit<
|
||||
BpmProcessDefinitionApi.ProcessDefinitionVO,
|
||||
BpmProcessDefinitionApi.ProcessDefinition,
|
||||
'modelId' | 'modelType'
|
||||
> & {
|
||||
id?: string;
|
||||
|
|
@ -132,8 +132,8 @@ provide('processData', processData);
|
|||
provide('modelData', formData);
|
||||
|
||||
// 数据列表
|
||||
const formList = ref<BpmFormApi.FormVO[]>([]);
|
||||
const categoryList = ref<BpmCategoryApi.CategoryVO[]>([]);
|
||||
const formList = ref<BpmFormApi.Form[]>([]);
|
||||
const categoryList = ref<BpmCategoryApi.Category[]>([]);
|
||||
const userList = ref<SystemUserApi.User[]>([]);
|
||||
const deptList = ref<SystemDeptApi.Dept[]>([]);
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ import { DICT_TYPE, getBoolDictOptions, getIntDictOptions } from '#/utils';
|
|||
|
||||
const props = defineProps({
|
||||
categoryList: {
|
||||
type: Array as PropType<BpmCategoryApi.CategoryVO[]>,
|
||||
type: Array as PropType<BpmCategoryApi.Category[]>,
|
||||
required: true,
|
||||
},
|
||||
userList: {
|
||||
|
|
@ -354,10 +354,7 @@ defineExpose({ validate });
|
|||
class="flex items-center"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon
|
||||
icon="mdi:account-plus-outline"
|
||||
class="size-[18px]"
|
||||
/>
|
||||
<IconifyIcon icon="lucide:user-plus" class="size-[18px]" />
|
||||
</template>
|
||||
选择人员
|
||||
</Button>
|
||||
|
|
@ -371,7 +368,7 @@ defineExpose({ validate });
|
|||
:key="dept.id"
|
||||
class="relative flex h-9 items-center rounded-full bg-gray-100 pr-2 shadow-sm hover:bg-gray-200"
|
||||
>
|
||||
<IconifyIcon icon="ep:office-building" class="size-6 px-1" />
|
||||
<IconifyIcon icon="lucide:building" class="size-6 px-1" />
|
||||
{{ dept.name }}
|
||||
<X
|
||||
class="ml-2 size-4 cursor-pointer text-gray-400 hover:text-red-500"
|
||||
|
|
@ -418,10 +415,7 @@ defineExpose({ validate });
|
|||
class="flex items-center"
|
||||
>
|
||||
<template #icon>
|
||||
<IconifyIcon
|
||||
icon="mdi:account-plus-outline"
|
||||
class="size-[18px]"
|
||||
/>
|
||||
<IconifyIcon icon="lucide:user-plus" class="size-[18px]" />
|
||||
</template>
|
||||
选择人员
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ import {
|
|||
|
||||
const props = defineProps({
|
||||
formList: {
|
||||
type: Array<BpmFormApi.FormVO>,
|
||||
type: Array<BpmFormApi.Form>,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { BpmModelApi, ModelCategoryInfo } from '#/api/bpm/model';
|
||||
|
||||
import { computed, ref, watchEffect } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
import { useAccess } from '@vben/access';
|
||||
import { confirm, EllipsisText, useVbenModal } from '@vben/common-ui';
|
||||
import { IconifyIcon } from '@vben/icons';
|
||||
import { useUserStore } from '@vben/stores';
|
||||
|
|
@ -18,11 +20,11 @@ import {
|
|||
Dropdown,
|
||||
Menu,
|
||||
message,
|
||||
Table,
|
||||
Tag,
|
||||
Tooltip,
|
||||
} from 'ant-design-vue';
|
||||
|
||||
import { useVbenVxeGrid } from '#/adapter/vxe-table';
|
||||
import { deleteCategory } from '#/api/bpm/category';
|
||||
import {
|
||||
cleanModel,
|
||||
|
|
@ -31,14 +33,14 @@ import {
|
|||
updateModelSortBatch,
|
||||
updateModelState,
|
||||
} from '#/api/bpm/model';
|
||||
import { DictTag } from '#/components/dict-tag';
|
||||
import { $t } from '#/locales';
|
||||
import { BpmModelFormType, DICT_TYPE } from '#/utils';
|
||||
import { BpmModelFormType } from '#/utils';
|
||||
|
||||
// 导入重命名表单
|
||||
import CategoryRenameForm from '../../category/modules/rename-form.vue';
|
||||
// 导入 FormCreate 表单详情
|
||||
import FormCreateDetail from '../../form/modules/detail.vue';
|
||||
import { useGridColumns } from './data';
|
||||
|
||||
const props = defineProps<{
|
||||
categoryInfo: ModelCategoryInfo;
|
||||
|
|
@ -64,69 +66,56 @@ const router = useRouter();
|
|||
const userStore = useUserStore();
|
||||
const userId = userStore.userInfo?.id;
|
||||
const isModelSorting = ref(false);
|
||||
const originalData = ref<BpmModelApi.ModelVO[]>([]);
|
||||
const modelList = ref<BpmModelApi.ModelVO[]>([]);
|
||||
const originalData = ref<BpmModelApi.Model[]>([]);
|
||||
const modelList = ref<BpmModelApi.Model[]>([]);
|
||||
const isExpand = ref(false);
|
||||
const tableRef = ref();
|
||||
|
||||
const [Grid, gridApi] = useVbenVxeGrid({
|
||||
gridOptions: {
|
||||
columns: useGridColumns(),
|
||||
pagerConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
data: modelList.value,
|
||||
rowConfig: {
|
||||
keyField: 'id',
|
||||
},
|
||||
toolbarConfig: {
|
||||
enabled: false, // 完全禁用工具栏
|
||||
},
|
||||
} as VxeTableGridOptions,
|
||||
});
|
||||
|
||||
// 排序引用,以便后续启用或禁用排序
|
||||
const sortableInstance = ref<any>(null);
|
||||
/** 解决 v-model 问题,使用计算属性 */
|
||||
const expandKeys = computed(() => (isExpand.value ? ['1'] : []));
|
||||
|
||||
// 表格列配置
|
||||
const columns = [
|
||||
{
|
||||
title: '流程名',
|
||||
dataIndex: 'name',
|
||||
key: 'name',
|
||||
align: 'left' as const,
|
||||
width: 250,
|
||||
},
|
||||
{
|
||||
title: '可见范围',
|
||||
dataIndex: 'startUserIds',
|
||||
key: 'startUserIds',
|
||||
align: 'center' as const,
|
||||
ellipsis: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '流程类型',
|
||||
dataIndex: 'type',
|
||||
key: 'type',
|
||||
align: 'center' as const,
|
||||
ellipsis: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '表单信息',
|
||||
dataIndex: 'formType',
|
||||
key: 'formType',
|
||||
align: 'center' as const,
|
||||
ellipsis: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '最后发布',
|
||||
dataIndex: 'deploymentTime',
|
||||
key: 'deploymentTime',
|
||||
align: 'center' as const,
|
||||
width: 250,
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
key: 'operation',
|
||||
align: 'center' as const,
|
||||
fixed: 'right' as const,
|
||||
width: 150,
|
||||
},
|
||||
];
|
||||
const { hasAccessByCodes } = useAccess();
|
||||
/** 权限校验:通过 computed 解决列表的卡顿问题 */
|
||||
const hasPermiUpdate = computed(() => {
|
||||
return hasAccessByCodes(['bpm:model:update']);
|
||||
});
|
||||
const hasPermiDelete = computed(() => {
|
||||
return hasAccessByCodes(['bpm:model:delete']);
|
||||
});
|
||||
const hasPermiDeploy = computed(() => {
|
||||
return hasAccessByCodes(['bpm:model:deploy']);
|
||||
});
|
||||
|
||||
/** 处理模型的排序 */
|
||||
function handleModelSort() {
|
||||
// 保存初始数据
|
||||
originalData.value = cloneDeep(props.categoryInfo.modelList);
|
||||
// 保存初始数据并确保数据完整
|
||||
if (props.categoryInfo.modelList && props.categoryInfo.modelList.length > 0) {
|
||||
originalData.value = cloneDeep(props.categoryInfo.modelList);
|
||||
modelList.value = cloneDeep(props.categoryInfo.modelList);
|
||||
}
|
||||
|
||||
// 更新表格数据
|
||||
gridApi.setGridOptions({
|
||||
data: modelList.value,
|
||||
});
|
||||
|
||||
// 展开数据
|
||||
isExpand.value = true;
|
||||
isModelSorting.value = true;
|
||||
|
|
@ -135,9 +124,28 @@ function handleModelSort() {
|
|||
// 已存在实例,则启用排序功能
|
||||
sortableInstance.value.option('disabled', false);
|
||||
} else {
|
||||
const sortableClass = `.category-${props.categoryInfo.id} .ant-table .ant-table-tbody`;
|
||||
sortableInstance.value = useSortable(sortableClass, modelList, {
|
||||
disabled: false, // 启用排序
|
||||
const sortableClass = `.category-${props.categoryInfo.id} .vxe-table .vxe-table--body-wrapper:not(.fixed-right--wrapper) .vxe-table--body tbody`;
|
||||
// 确保使用最新的数据
|
||||
modelList.value = cloneDeep(props.categoryInfo.modelList);
|
||||
// 更新表格数据
|
||||
gridApi.setGridOptions({
|
||||
data: modelList.value,
|
||||
});
|
||||
|
||||
sortableInstance.value = useSortable(sortableClass, modelList.value, {
|
||||
draggable: '.vxe-body--row',
|
||||
animation: 150,
|
||||
handle: '.drag-handle',
|
||||
disabled: false,
|
||||
onEnd: ({ newDraggableIndex, oldDraggableIndex }) => {
|
||||
if (oldDraggableIndex !== newDraggableIndex) {
|
||||
modelList.value.splice(
|
||||
newDraggableIndex ?? 0,
|
||||
0,
|
||||
modelList.value.splice(oldDraggableIndex ?? 0, 1)[0]!,
|
||||
);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -145,6 +153,11 @@ function handleModelSort() {
|
|||
/** 处理模型的排序提交 */
|
||||
async function handleModelSortSubmit() {
|
||||
try {
|
||||
// 确保数据已经正确同步
|
||||
if (!modelList.value || modelList.value.length === 0) {
|
||||
message.error('排序数据异常,请重试');
|
||||
return;
|
||||
}
|
||||
// 保存排序
|
||||
const ids = modelList.value.map((item) => item.id);
|
||||
await updateModelSortBatch(ids);
|
||||
|
|
@ -160,12 +173,18 @@ async function handleModelSortSubmit() {
|
|||
/** 处理模型的排序取消 */
|
||||
function handleModelSortCancel() {
|
||||
// 恢复初始数据
|
||||
modelList.value = cloneDeep(originalData.value);
|
||||
isModelSorting.value = false;
|
||||
if (originalData.value && originalData.value.length > 0) {
|
||||
modelList.value = cloneDeep(originalData.value);
|
||||
// 更新表格数据
|
||||
gridApi.setGridOptions({
|
||||
data: modelList.value,
|
||||
});
|
||||
}
|
||||
// 禁用排序功能
|
||||
if (sortableInstance.value) {
|
||||
sortableInstance.value.option('disabled', true);
|
||||
}
|
||||
isModelSorting.value = false;
|
||||
}
|
||||
|
||||
/** 处理下拉菜单命令 */
|
||||
|
|
@ -265,7 +284,7 @@ function handleModelCommand(command: string, row: any) {
|
|||
break;
|
||||
}
|
||||
case 'handleReport': {
|
||||
console.warn('报表待实现', row);
|
||||
handleReport(row);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
|
@ -341,6 +360,17 @@ function handleDefinitionList(row: any) {
|
|||
});
|
||||
}
|
||||
|
||||
/** 跳转到流程报表页面 */
|
||||
function handleReport(row: any) {
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceReport',
|
||||
query: {
|
||||
processDefinitionId: row.processDefinition.id,
|
||||
processDefinitionKey: row.key,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/** 更新 modelList 模型列表 */
|
||||
const updateModelList = useDebounceFn(() => {
|
||||
const newModelList = props.categoryInfo.modelList;
|
||||
|
|
@ -353,6 +383,10 @@ const updateModelList = useDebounceFn(() => {
|
|||
isModelSorting.value = false;
|
||||
// 重置排序实例
|
||||
sortableInstance.value = null;
|
||||
// 更新表格数据
|
||||
gridApi.setGridOptions({
|
||||
data: modelList.value,
|
||||
});
|
||||
}
|
||||
}, 100);
|
||||
|
||||
|
|
@ -367,13 +401,6 @@ watchEffect(() => {
|
|||
}
|
||||
});
|
||||
|
||||
/** 自定义表格行渲染 */
|
||||
function customRow(_record: any) {
|
||||
return {
|
||||
class: isModelSorting.value ? 'cursor-move' : '',
|
||||
};
|
||||
}
|
||||
|
||||
// 处理重命名成功
|
||||
const handleRenameSuccess = () => {
|
||||
emit('success');
|
||||
|
|
@ -476,208 +503,174 @@ const handleRenameSuccess = () => {
|
|||
class="border-0 bg-transparent p-0"
|
||||
v-show="isExpand"
|
||||
>
|
||||
<Table
|
||||
<Grid
|
||||
v-if="modelList && modelList.length > 0"
|
||||
:class="`category-${categoryInfo.id}`"
|
||||
ref="tableRef"
|
||||
:data-source="modelList"
|
||||
:columns="columns"
|
||||
:pagination="false"
|
||||
:custom-row="customRow"
|
||||
:scroll="{ x: '100%' }"
|
||||
row-key="id"
|
||||
>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<!-- 流程名 -->
|
||||
<template v-if="column.key === 'name'">
|
||||
<div class="flex items-center">
|
||||
<Tooltip v-if="isModelSorting" title="拖动排序">
|
||||
<span
|
||||
class="icon-[ic--round-drag-indicator] mr-2.5 cursor-move text-2xl text-gray-500"
|
||||
></span>
|
||||
</Tooltip>
|
||||
<div
|
||||
v-if="!record.icon"
|
||||
class="mr-2.5 flex h-9 w-9 items-center justify-center rounded bg-blue-500 text-white"
|
||||
>
|
||||
<span style="font-size: 12px">
|
||||
{{ record.name.substring(0, 2) }}
|
||||
</span>
|
||||
</div>
|
||||
<img
|
||||
v-else
|
||||
:src="record.icon"
|
||||
class="mr-2.5 h-9 w-9 rounded"
|
||||
alt="图标"
|
||||
/>
|
||||
<EllipsisText :max-width="160" :tooltip-when-ellipsis="true">
|
||||
{{ record.name }}
|
||||
</EllipsisText>
|
||||
<template #name="{ row }">
|
||||
<div class="flex items-center">
|
||||
<Tooltip
|
||||
v-if="isModelSorting"
|
||||
title="拖动排序"
|
||||
placement="left"
|
||||
>
|
||||
<span
|
||||
class="icon-[ic--round-drag-indicator] drag-handle mr-2.5 cursor-move text-2xl text-gray-500"
|
||||
></span>
|
||||
</Tooltip>
|
||||
<div
|
||||
v-if="!row.icon"
|
||||
class="mr-2.5 flex h-9 w-9 flex-shrink-0 items-center justify-center rounded bg-blue-500 text-white"
|
||||
>
|
||||
<span style="font-size: 12px">
|
||||
{{ row.name.substring(0, 2) }}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- 可见范围列-->
|
||||
<template v-else-if="column.key === 'startUserIds'">
|
||||
<span
|
||||
v-if="
|
||||
!record.startUsers?.length && !record.startDepts?.length
|
||||
<img
|
||||
v-else
|
||||
:src="row.icon"
|
||||
class="mr-2.5 h-9 w-9 flex-shrink-0 rounded"
|
||||
alt="图标"
|
||||
/>
|
||||
<EllipsisText :max-width="160" :tooltip-when-ellipsis="true">
|
||||
{{ row.name }}
|
||||
</EllipsisText>
|
||||
</div>
|
||||
</template>
|
||||
<template #startUserIds="{ row }">
|
||||
<span v-if="!row.startUsers?.length && !row.startDepts?.length">
|
||||
全部可见
|
||||
</span>
|
||||
<span v-else-if="row.startUsers?.length === 1">
|
||||
{{ row.startUsers[0].nickname }}
|
||||
</span>
|
||||
<span v-else-if="row.startDepts?.length === 1">
|
||||
{{ row.startDepts[0].name }}
|
||||
</span>
|
||||
<span v-else-if="row.startDepts?.length > 1">
|
||||
<Tooltip
|
||||
placement="top"
|
||||
:title="
|
||||
row.startDepts.map((dept: any) => dept.name).join('、')
|
||||
"
|
||||
>
|
||||
全部可见
|
||||
</span>
|
||||
<span v-else-if="record.startUsers?.length === 1">
|
||||
{{ record.startUsers[0].nickname }}
|
||||
</span>
|
||||
<span v-else-if="record.startDepts?.length === 1">
|
||||
{{ record.startDepts[0].name }}
|
||||
</span>
|
||||
<span v-else-if="record.startDepts?.length > 1">
|
||||
<Tooltip
|
||||
placement="top"
|
||||
:title="
|
||||
record.startDepts.map((dept: any) => dept.name).join('、')
|
||||
"
|
||||
>
|
||||
{{ record.startDepts[0].name }}等
|
||||
{{ record.startDepts.length }} 个部门可见
|
||||
</Tooltip>
|
||||
</span>
|
||||
<span v-else-if="record.startUsers?.length > 1">
|
||||
<Tooltip
|
||||
placement="top"
|
||||
:title="
|
||||
record.startUsers
|
||||
.map((user: any) => user.nickname)
|
||||
.join('、')
|
||||
"
|
||||
>
|
||||
{{ record.startUsers[0].nickname }}等
|
||||
{{ record.startUsers.length }} 人可见
|
||||
</Tooltip>
|
||||
</span>
|
||||
</template>
|
||||
<!-- 流程类型列 -->
|
||||
<template v-else-if="column.key === 'type'">
|
||||
<!-- <DictTag :value="record.type" :type="DICT_TYPE.BPM_MODEL_TYPE" /> -->
|
||||
<!-- <Tag>{{ record.type }}</Tag> -->
|
||||
<DictTag
|
||||
:type="DICT_TYPE.BPM_MODEL_TYPE"
|
||||
:value="record.type"
|
||||
/>
|
||||
</template>
|
||||
<!-- 表单信息列 -->
|
||||
<template v-else-if="column.key === 'formType'">
|
||||
<!-- TODO BpmModelFormType.NORMAL -->
|
||||
<Button
|
||||
v-if="record.formType === BpmModelFormType.NORMAL"
|
||||
type="link"
|
||||
@click="handleFormDetail(record)"
|
||||
{{ row.startDepts[0].name }}等
|
||||
{{ row.startDepts.length }} 个部门可见
|
||||
</Tooltip>
|
||||
</span>
|
||||
<span v-else-if="row.startUsers?.length > 1">
|
||||
<Tooltip
|
||||
placement="top"
|
||||
:title="
|
||||
row.startUsers.map((user: any) => user.nickname).join('、')
|
||||
"
|
||||
>
|
||||
{{ record.formName }}
|
||||
</Button>
|
||||
<!-- TODO BpmModelFormType.CUSTOM -->
|
||||
<Button
|
||||
v-else-if="record.formType === BpmModelFormType.CUSTOM"
|
||||
type="link"
|
||||
@click="handleFormDetail(record)"
|
||||
>
|
||||
{{ record.formCustomCreatePath }}
|
||||
</Button>
|
||||
<span v-else>暂无表单</span>
|
||||
</template>
|
||||
<!-- 最后发布列 -->
|
||||
<template v-else-if="column.key === 'deploymentTime'">
|
||||
<div class="flex items-center justify-center">
|
||||
<span v-if="record.processDefinition" class="w-[150px]">
|
||||
{{
|
||||
formatDateTime(record.processDefinition.deploymentTime)
|
||||
}}
|
||||
</span>
|
||||
<Tag v-if="record.processDefinition">
|
||||
v{{ record.processDefinition.version }}
|
||||
</Tag>
|
||||
<Tag v-else color="warning">未部署</Tag>
|
||||
<Tag
|
||||
v-if="record.processDefinition?.suspensionState === 2"
|
||||
color="warning"
|
||||
class="ml-[10px]"
|
||||
>
|
||||
已停用
|
||||
</Tag>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 操作列 -->
|
||||
<template v-else-if="column.key === 'operation'">
|
||||
<div class="flex items-center space-x-0">
|
||||
<!-- TODO 权限校验-->
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
class="px-1"
|
||||
@click="modelOperation('update', record.id)"
|
||||
:disabled="!isManagerUser(record)"
|
||||
>
|
||||
修改
|
||||
</Button>
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
class="px-1"
|
||||
@click="handleDeploy(record)"
|
||||
:disabled="!isManagerUser(record)"
|
||||
>
|
||||
发布
|
||||
</Button>
|
||||
<Dropdown placement="bottomRight" arrow>
|
||||
<Button type="link" size="small" class="px-1">更多</Button>
|
||||
<template #overlay>
|
||||
<Menu
|
||||
@click="
|
||||
(e) => handleModelCommand(e.key as string, record)
|
||||
"
|
||||
>
|
||||
<Menu.Item key="handleCopy"> 复制 </Menu.Item>
|
||||
<Menu.Item key="handleDefinitionList"> 历史 </Menu.Item>
|
||||
|
||||
<!-- TODO 待实现报表
|
||||
<Menu.Item
|
||||
key="handleReport"
|
||||
:disabled="!isManagerUser(record)"
|
||||
>
|
||||
报表
|
||||
</Menu.Item> -->
|
||||
<Menu.Item
|
||||
key="handleChangeState"
|
||||
v-if="record.processDefinition"
|
||||
:disabled="!isManagerUser(record)"
|
||||
>
|
||||
{{
|
||||
record.processDefinition.suspensionState === 1
|
||||
? '停用'
|
||||
: '启用'
|
||||
}}
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
danger
|
||||
key="handleClean"
|
||||
:disabled="!isManagerUser(record)"
|
||||
>
|
||||
清理
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
danger
|
||||
key="handleDelete"
|
||||
:disabled="!isManagerUser(record)"
|
||||
>
|
||||
删除
|
||||
</Menu.Item>
|
||||
</Menu>
|
||||
</template>
|
||||
</Dropdown>
|
||||
</div>
|
||||
</template>
|
||||
{{ row.startUsers[0].nickname }}等
|
||||
{{ row.startUsers.length }} 人可见
|
||||
</Tooltip>
|
||||
</span>
|
||||
</template>
|
||||
</Table>
|
||||
<template #formInfo="{ row }">
|
||||
<Button
|
||||
v-if="row.formType === BpmModelFormType.NORMAL"
|
||||
type="link"
|
||||
@click="handleFormDetail(row)"
|
||||
>
|
||||
{{ row.formName }}
|
||||
</Button>
|
||||
<Button
|
||||
v-else-if="row.formType === BpmModelFormType.CUSTOM"
|
||||
type="link"
|
||||
@click="handleFormDetail(row)"
|
||||
>
|
||||
{{ row.formCustomCreatePath }}
|
||||
</Button>
|
||||
<span v-else>暂无表单</span>
|
||||
</template>
|
||||
<template #deploymentTime="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
<span v-if="row.processDefinition" class="w-[150px]">
|
||||
{{ formatDateTime(row.processDefinition.deploymentTime) }}
|
||||
</span>
|
||||
<Tag v-if="row.processDefinition">
|
||||
v{{ row.processDefinition.version }}
|
||||
</Tag>
|
||||
<Tag v-else color="warning">未部署</Tag>
|
||||
<Tag
|
||||
v-if="row.processDefinition?.suspensionState === 2"
|
||||
color="warning"
|
||||
class="ml-[10px]"
|
||||
>
|
||||
已停用
|
||||
</Tag>
|
||||
</div>
|
||||
</template>
|
||||
<template #actions="{ row }">
|
||||
<div class="flex items-center space-x-0">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
class="px-1"
|
||||
@click="modelOperation('update', row.id)"
|
||||
:disabled="!isManagerUser(row) || !hasPermiUpdate"
|
||||
>
|
||||
修改
|
||||
</Button>
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
class="px-1"
|
||||
@click="handleDeploy(row)"
|
||||
:disabled="!isManagerUser(row) || !hasPermiDeploy"
|
||||
>
|
||||
发布
|
||||
</Button>
|
||||
<Dropdown placement="bottomRight" arrow>
|
||||
<Button type="link" size="small" class="px-1">更多</Button>
|
||||
<template #overlay>
|
||||
<Menu
|
||||
@click="(e) => handleModelCommand(e.key as string, row)"
|
||||
>
|
||||
<Menu.Item key="handleCopy"> 复制 </Menu.Item>
|
||||
<Menu.Item key="handleDefinitionList"> 历史 </Menu.Item>
|
||||
|
||||
<Menu.Item
|
||||
key="handleReport"
|
||||
:disabled="!isManagerUser(row)"
|
||||
>
|
||||
报表
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
key="handleChangeState"
|
||||
v-if="row.processDefinition"
|
||||
:disabled="!isManagerUser(row)"
|
||||
>
|
||||
{{
|
||||
row.processDefinition.suspensionState === 1
|
||||
? '停用'
|
||||
: '启用'
|
||||
}}
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
danger
|
||||
key="handleClean"
|
||||
:disabled="!isManagerUser(row)"
|
||||
>
|
||||
清理
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
danger
|
||||
key="handleDelete"
|
||||
:disabled="!isManagerUser(row) || !hasPermiDelete"
|
||||
>
|
||||
删除
|
||||
</Menu.Item>
|
||||
</Menu>
|
||||
</template>
|
||||
</Dropdown>
|
||||
</div>
|
||||
</template>
|
||||
</Grid>
|
||||
</Collapse.Panel>
|
||||
</Collapse>
|
||||
</Card>
|
||||
|
|
@ -691,22 +684,11 @@ const handleRenameSuccess = () => {
|
|||
|
||||
<style lang="scss" scoped>
|
||||
.category-draggable-model {
|
||||
// ant-table-tbody 自定义样式
|
||||
:deep(.ant-table-tbody > tr > td) {
|
||||
overflow: hidden;
|
||||
border-bottom: none;
|
||||
}
|
||||
// ant-collapse-header 自定义样式
|
||||
:deep(.ant-collapse-header) {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
// 优化表格渲染性能
|
||||
:deep(.ant-table-tbody) {
|
||||
transform: translateZ(0);
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
// 折叠面板样式
|
||||
:deep(.ant-collapse-content-box) {
|
||||
padding: 0;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { BpmModelApi } from '#/api/bpm/model';
|
||||
|
||||
import { DICT_TYPE } from '#/utils';
|
||||
|
||||
/** 列表的字段 */
|
||||
export function useGridColumns(): VxeTableGridOptions<BpmModelApi.Model>['columns'] {
|
||||
return [
|
||||
{
|
||||
field: 'name',
|
||||
title: '流程名称',
|
||||
minWidth: 200,
|
||||
slots: { default: 'name' },
|
||||
},
|
||||
{
|
||||
field: 'startUserIds',
|
||||
title: '可见范围',
|
||||
minWidth: 150,
|
||||
slots: { default: 'startUserIds' },
|
||||
},
|
||||
{
|
||||
field: 'type',
|
||||
title: '流程类型',
|
||||
minWidth: 120,
|
||||
cellRender: {
|
||||
name: 'CellDict',
|
||||
props: { type: DICT_TYPE.BPM_MODEL_TYPE },
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'formType',
|
||||
title: '表单信息',
|
||||
minWidth: 150,
|
||||
slots: { default: 'formInfo' },
|
||||
},
|
||||
{
|
||||
field: 'deploymentTime',
|
||||
title: '最后发布',
|
||||
minWidth: 280,
|
||||
slots: { default: 'deploymentTime' },
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
width: 150,
|
||||
fixed: 'right',
|
||||
slots: { default: 'actions' },
|
||||
},
|
||||
];
|
||||
}
|
||||
|
|
@ -30,7 +30,7 @@ const tempStartUserSelectAssignees = ref({}); // 历史发起人选择审批人
|
|||
const activityNodes = ref<BpmProcessInstanceApi.ApprovalNodeInfo[]>([]); // 审批节点信息
|
||||
const processDefinitionId = ref('');
|
||||
|
||||
const formData = ref<BpmOALeaveApi.LeaveVO>();
|
||||
const formData = ref<BpmOALeaveApi.Leave>();
|
||||
const getTitle = computed(() => {
|
||||
return formData.value?.id
|
||||
? $t('ui.actionTitle.edit', ['请假'])
|
||||
|
|
@ -70,7 +70,7 @@ async function onSubmit() {
|
|||
}
|
||||
|
||||
// 提交表单
|
||||
const data = (await formApi.getValues()) as BpmOALeaveApi.LeaveVO;
|
||||
const data = (await formApi.getValues()) as BpmOALeaveApi.Leave;
|
||||
|
||||
// 审批相关:设置指定审批人
|
||||
if (startUserSelectTasks.value?.length > 0) {
|
||||
|
|
@ -78,7 +78,7 @@ async function onSubmit() {
|
|||
}
|
||||
|
||||
// 格式化开始时间和结束时间的值
|
||||
const submitData: BpmOALeaveApi.LeaveVO = {
|
||||
const submitData: BpmOALeaveApi.Leave = {
|
||||
...data,
|
||||
startTime: Number(data.startTime),
|
||||
endTime: Number(data.endTime),
|
||||
|
|
@ -112,10 +112,10 @@ async function onDraft() {
|
|||
return;
|
||||
}
|
||||
|
||||
const data = (await formApi.getValues()) as BpmOALeaveApi.LeaveVO;
|
||||
const data = (await formApi.getValues()) as BpmOALeaveApi.Leave;
|
||||
|
||||
// 格式化开始时间和结束时间的值
|
||||
const submitData: BpmOALeaveApi.LeaveVO = {
|
||||
const submitData: BpmOALeaveApi.Leave = {
|
||||
...data,
|
||||
startTime: Number(data.startTime),
|
||||
endTime: Number(data.endTime),
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ const props = defineProps<{
|
|||
id: string;
|
||||
}>();
|
||||
const datailLoading = ref(false);
|
||||
const detailData = ref<BpmOALeaveApi.LeaveVO>();
|
||||
const detailData = ref<BpmOALeaveApi.Leave>();
|
||||
|
||||
const { query } = useRoute();
|
||||
const queryId = computed(() => query.id as string);
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmOALeaveApi.LeaveVO>,
|
||||
} as VxeTableGridOptions<BpmOALeaveApi.Leave>,
|
||||
});
|
||||
|
||||
/** 创建请假 */
|
||||
|
|
@ -55,7 +55,7 @@ function handleCreate() {
|
|||
}
|
||||
|
||||
/** 查看请假详情 */
|
||||
function handleDetail(row: BpmOALeaveApi.LeaveVO) {
|
||||
function handleDetail(row: BpmOALeaveApi.Leave) {
|
||||
router.push({
|
||||
name: 'OALeaveDetail',
|
||||
query: { id: row.id },
|
||||
|
|
@ -63,7 +63,7 @@ function handleDetail(row: BpmOALeaveApi.LeaveVO) {
|
|||
}
|
||||
|
||||
/** 取消请假 */
|
||||
function handleCancel(row: BpmOALeaveApi.LeaveVO) {
|
||||
function handleCancel(row: BpmOALeaveApi.Leave) {
|
||||
prompt({
|
||||
async beforeClose(scope) {
|
||||
if (scope.isConfirm) {
|
||||
|
|
@ -96,7 +96,7 @@ function handleCancel(row: BpmOALeaveApi.LeaveVO) {
|
|||
}
|
||||
|
||||
/** 审批进度 */
|
||||
function handleProgress(row: BpmOALeaveApi.LeaveVO) {
|
||||
function handleProgress(row: BpmOALeaveApi.Leave) {
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
query: { id: row.processInstanceId },
|
||||
|
|
|
|||
|
|
@ -32,12 +32,12 @@ function handleCreate() {
|
|||
}
|
||||
|
||||
/** 编辑流程表达式 */
|
||||
function handleEdit(row: BpmProcessExpressionApi.ProcessExpressionVO) {
|
||||
function handleEdit(row: BpmProcessExpressionApi.ProcessExpression) {
|
||||
formModalApi.setData(row).open();
|
||||
}
|
||||
|
||||
/** 删除流程表达式 */
|
||||
async function handleDelete(row: BpmProcessExpressionApi.ProcessExpressionVO) {
|
||||
async function handleDelete(row: BpmProcessExpressionApi.ProcessExpression) {
|
||||
const hideLoading = message.loading({
|
||||
content: $t('ui.actionMessage.deleting', [row.name]),
|
||||
key: 'action_key_msg',
|
||||
|
|
@ -80,7 +80,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmProcessExpressionApi.ProcessExpressionVO>,
|
||||
} as VxeTableGridOptions<BpmProcessExpressionApi.ProcessExpression>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import { $t } from '#/locales';
|
|||
import { useFormSchema } from '../data';
|
||||
|
||||
const emit = defineEmits(['success']);
|
||||
const formData = ref<BpmProcessExpressionApi.ProcessExpressionVO>();
|
||||
const formData = ref<BpmProcessExpressionApi.ProcessExpression>();
|
||||
const getTitle = computed(() => {
|
||||
return formData.value?.id
|
||||
? $t('ui.actionTitle.edit', ['流程表达式'])
|
||||
|
|
@ -40,7 +40,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
modalApi.lock();
|
||||
// 提交表单
|
||||
const data =
|
||||
(await formApi.getValues()) as BpmProcessExpressionApi.ProcessExpressionVO;
|
||||
(await formApi.getValues()) as BpmProcessExpressionApi.ProcessExpression;
|
||||
try {
|
||||
await (formData.value?.id
|
||||
? updateProcessExpression(data)
|
||||
|
|
@ -58,8 +58,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
return;
|
||||
}
|
||||
// 加载数据
|
||||
const data =
|
||||
modalApi.getData<BpmProcessExpressionApi.ProcessExpressionVO>();
|
||||
const data = modalApi.getData<BpmProcessExpressionApi.ProcessExpression>();
|
||||
if (!data || !data.id) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,17 +26,23 @@ import ProcessDefinitionDetail from './modules/form.vue';
|
|||
|
||||
defineOptions({ name: 'BpmProcessInstanceCreate' });
|
||||
|
||||
const route = useRoute(); // 路由
|
||||
const route = useRoute();
|
||||
|
||||
const searchName = ref(''); // 当前搜索关键字
|
||||
const isSearching = ref(false); // 是否处于搜索状态
|
||||
const processInstanceId: any = route.query.processInstanceId; // 流程实例编号。场景:重新发起时
|
||||
const loading = ref(true); // 加载中
|
||||
const categoryList: any = ref([]); // 分类的列表
|
||||
const activeCategory = ref(''); // 当前选中的分类
|
||||
const processDefinitionList = ref<
|
||||
BpmProcessDefinitionApi.ProcessDefinitionVO[]
|
||||
>([]); // 流程定义的列表
|
||||
// 当前搜索关键字
|
||||
const searchName = ref('');
|
||||
const isSearching = ref(false);
|
||||
// 流程实例编号。场景:重新发起时
|
||||
const processInstanceId: any = route.query.processInstanceId;
|
||||
// 加载中
|
||||
const loading = ref(true);
|
||||
// 分类的列表
|
||||
const categoryList: any = ref([]);
|
||||
// 当前选中的分类
|
||||
const activeCategory = ref('');
|
||||
// 流程定义的列表
|
||||
const processDefinitionList = ref<BpmProcessDefinitionApi.ProcessDefinition[]>(
|
||||
[],
|
||||
);
|
||||
|
||||
// 实现 groupBy 功能
|
||||
function groupBy(array: any[], key: string) {
|
||||
|
|
@ -112,7 +118,7 @@ async function handleGetProcessDefinitionList() {
|
|||
|
||||
/** 用于存储搜索过滤后的流程定义 */
|
||||
const filteredProcessDefinitionList = ref<
|
||||
BpmProcessDefinitionApi.ProcessDefinitionVO[]
|
||||
BpmProcessDefinitionApi.ProcessDefinition[]
|
||||
>([]);
|
||||
|
||||
/** 搜索流程 */
|
||||
|
|
@ -159,13 +165,13 @@ const processDefinitionGroup = computed(() => {
|
|||
// 按照 categoryList 的顺序重新组织数据
|
||||
const orderedGroup: Record<
|
||||
string,
|
||||
BpmProcessDefinitionApi.ProcessDefinitionVO[]
|
||||
BpmProcessDefinitionApi.ProcessDefinition[]
|
||||
> = {};
|
||||
categoryList.value.forEach((category: BpmCategoryApi.CategoryVO) => {
|
||||
categoryList.value.forEach((category: BpmCategoryApi.Category) => {
|
||||
if (grouped[category.code]) {
|
||||
orderedGroup[category.code] = grouped[
|
||||
category.code
|
||||
] as BpmProcessDefinitionApi.ProcessDefinitionVO[];
|
||||
] as BpmProcessDefinitionApi.ProcessDefinition[];
|
||||
}
|
||||
});
|
||||
return orderedGroup;
|
||||
|
|
@ -183,7 +189,7 @@ const processDefinitionDetailRef = ref();
|
|||
|
||||
/** 处理选择流程的按钮操作 */
|
||||
async function handleSelect(
|
||||
row: BpmProcessDefinitionApi.ProcessDefinitionVO,
|
||||
row: BpmProcessDefinitionApi.ProcessDefinition,
|
||||
formVariables?: any,
|
||||
) {
|
||||
// 设置选择的流程
|
||||
|
|
@ -203,7 +209,7 @@ const availableCategories = computed(() => {
|
|||
const availableCategoryCodes = Object.keys(processDefinitionGroup.value);
|
||||
|
||||
// 过滤出有流程的分类
|
||||
return categoryList.value.filter((category: BpmCategoryApi.CategoryVO) =>
|
||||
return categoryList.value.filter((category: BpmCategoryApi.Category) =>
|
||||
availableCategoryCodes.includes(category.code),
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ async function initProcessInfo(row: any, formVariables?: any) {
|
|||
});
|
||||
|
||||
// 加载流程图
|
||||
const processDefinitionDetail: BpmProcessDefinitionApi.ProcessDefinitionVO =
|
||||
const processDefinitionDetail: BpmProcessDefinitionApi.ProcessDefinition =
|
||||
await getProcessDefinition(row.id);
|
||||
if (processDefinitionDetail) {
|
||||
bpmnXML.value = processDefinitionDetail.bpmnXml;
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ enum FieldPermissionType {
|
|||
}
|
||||
|
||||
const processInstanceLoading = ref(false); // 流程实例的加载中
|
||||
const processInstance = ref<BpmProcessInstanceApi.ProcessInstanceVO>(); // 流程实例
|
||||
const processInstance = ref<BpmProcessInstanceApi.ProcessInstance>(); // 流程实例
|
||||
const processDefinition = ref<any>({}); // 流程定义
|
||||
const processModelView = ref<any>({}); // 流程模型视图
|
||||
const operationButtonRef = ref(); // 操作按钮组件 ref
|
||||
|
|
|
|||
|
|
@ -1254,7 +1254,7 @@ defineExpose({ loadTodoTask });
|
|||
"
|
||||
>
|
||||
<Button type="dashed" @click="openPopover('return')">
|
||||
<IconifyIcon :size="14" icon="ep:back" />
|
||||
<IconifyIcon :size="14" icon="lucide:arrow-left" />
|
||||
{{ getButtonDisplayName(BpmTaskOperationButtonTypeEnum.RETURN) }}
|
||||
</Button>
|
||||
<template #content>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ const columns = shallowRef([
|
|||
field: 'approver',
|
||||
title: '审批人',
|
||||
slots: {
|
||||
default: ({ row }: { row: BpmTaskApi.TaskManagerVO }) => {
|
||||
default: ({ row }: { row: BpmTaskApi.TaskManager }) => {
|
||||
return row.assigneeUser?.nickname || row.ownerUser?.nickname;
|
||||
},
|
||||
},
|
||||
|
|
@ -106,7 +106,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 60,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmTaskApi.TaskVO>,
|
||||
} as VxeTableGridOptions<BpmTaskApi.Task>,
|
||||
});
|
||||
|
||||
/**
|
||||
|
|
@ -137,7 +137,7 @@ const taskForm = ref<TaskForm>({
|
|||
* 显示表单详情
|
||||
* @param row 任务数据
|
||||
*/
|
||||
async function showFormDetail(row: BpmTaskApi.TaskManagerVO): Promise<void> {
|
||||
async function showFormDetail(row: BpmTaskApi.TaskManager): Promise<void> {
|
||||
// 设置表单配置和表单字段
|
||||
taskForm.value = {
|
||||
rule: [],
|
||||
|
|
@ -200,7 +200,7 @@ defineExpose({
|
|||
ghost
|
||||
class="ml-1"
|
||||
>
|
||||
<IconifyIcon icon="ep:document" />
|
||||
<IconifyIcon icon="lucide:file-text" />
|
||||
<span class="!ml-[2px] text-[12px]">查看表单</span>
|
||||
</Button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ function onRefresh() {
|
|||
}
|
||||
|
||||
/** 查看流程实例 */
|
||||
function handleDetail(row: BpmTaskApi.TaskVO) {
|
||||
function handleDetail(row: BpmTaskApi.Task) {
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
query: { id: row.id },
|
||||
|
|
@ -35,7 +35,7 @@ function handleDetail(row: BpmTaskApi.TaskVO) {
|
|||
}
|
||||
|
||||
/** 取消流程实例 */
|
||||
function handleCancel(row: BpmTaskApi.TaskVO) {
|
||||
function handleCancel(row: BpmTaskApi.Task) {
|
||||
prompt({
|
||||
async beforeClose(scope) {
|
||||
if (scope.isConfirm) {
|
||||
|
|
@ -96,7 +96,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 64,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmTaskApi.TaskVO>,
|
||||
} as VxeTableGridOptions<BpmTaskApi.Task>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ function onTaskClick(task: BpmProcessInstanceApi.Task) {
|
|||
}
|
||||
|
||||
/** 查看流程实例 */
|
||||
function handleDetail(row: BpmProcessInstanceApi.ProcessInstanceVO) {
|
||||
function handleDetail(row: BpmProcessInstanceApi.ProcessInstance) {
|
||||
console.warn(row);
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
|
|
@ -42,7 +42,7 @@ function handleDetail(row: BpmProcessInstanceApi.ProcessInstanceVO) {
|
|||
}
|
||||
|
||||
/** 取消流程实例 */
|
||||
function handleCancel(row: BpmProcessInstanceApi.ProcessInstanceVO) {
|
||||
function handleCancel(row: BpmProcessInstanceApi.ProcessInstance) {
|
||||
prompt({
|
||||
async beforeClose(scope) {
|
||||
if (scope.isConfirm) {
|
||||
|
|
@ -102,7 +102,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmProcessInstanceApi.ProcessInstanceVO>,
|
||||
} as VxeTableGridOptions<BpmProcessInstanceApi.ProcessInstance>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,153 @@
|
|||
import type { VbenFormSchema } from '#/adapter/form';
|
||||
import type {
|
||||
VxeGridPropTypes,
|
||||
VxeTableGridOptions,
|
||||
} from '#/adapter/vxe-table';
|
||||
import type { BpmProcessInstanceApi } from '#/api/bpm/processInstance';
|
||||
|
||||
import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils';
|
||||
|
||||
/** 搜索的表单 */
|
||||
export function useGridFormSchema(
|
||||
userList: any[] = [],
|
||||
formFields: any[] = [],
|
||||
): VbenFormSchema[] {
|
||||
// 基础搜索字段
|
||||
const baseFormSchema = [
|
||||
{
|
||||
fieldName: 'startUserId',
|
||||
label: '发起人',
|
||||
component: 'Select',
|
||||
componentProps: {
|
||||
placeholder: '请选择发起人',
|
||||
allowClear: true,
|
||||
options: userList.map((user) => ({
|
||||
label: user.nickname,
|
||||
value: user.id,
|
||||
})),
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'name',
|
||||
label: '流程名称',
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: '请输入流程名称',
|
||||
allowClear: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'status',
|
||||
label: '流程状态',
|
||||
component: 'Select',
|
||||
componentProps: {
|
||||
placeholder: '请选择流程状态',
|
||||
allowClear: true,
|
||||
options: getDictOptions(
|
||||
DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS,
|
||||
'number',
|
||||
),
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'createTime',
|
||||
label: '发起时间',
|
||||
component: 'RangePicker',
|
||||
componentProps: {
|
||||
...getRangePickerDefaultProps(),
|
||||
placeholder: ['开始日期', '结束日期'],
|
||||
allowClear: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'endTime',
|
||||
label: '结束时间',
|
||||
component: 'RangePicker',
|
||||
componentProps: {
|
||||
...getRangePickerDefaultProps(),
|
||||
placeholder: ['开始日期', '结束日期'],
|
||||
allowClear: true,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
// 动态表单字段 暂时只支持 input 和 textarea, TODO 其他类型的支持
|
||||
const dynamicFormSchema = formFields
|
||||
.filter((item) => item.type === 'input' || item.type === 'textarea')
|
||||
// 根据类型选择合适的表单组件
|
||||
.map((item) => {
|
||||
return {
|
||||
fieldName: `formFieldsParams.${item.field}`,
|
||||
label: item.title,
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: `请输入${item.title}`,
|
||||
allowClear: true,
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
return [...baseFormSchema, ...dynamicFormSchema];
|
||||
}
|
||||
|
||||
/** 列表的字段 */
|
||||
export function useGridColumns(
|
||||
formFields: any[] = [],
|
||||
): VxeTableGridOptions<BpmProcessInstanceApi.ProcessInstance>['columns'] {
|
||||
const baseColumns: VxeGridPropTypes.Columns<BpmProcessInstanceApi.ProcessInstance> =
|
||||
[
|
||||
{
|
||||
field: 'name',
|
||||
title: '流程名称',
|
||||
minWidth: 250,
|
||||
fixed: 'left',
|
||||
},
|
||||
{
|
||||
field: 'startUser.nickname',
|
||||
title: '流程发起人',
|
||||
minWidth: 200,
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
title: '流程状态',
|
||||
minWidth: 120,
|
||||
cellRender: {
|
||||
name: 'CellDict',
|
||||
props: { type: DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS },
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'startTime',
|
||||
title: '发起时间',
|
||||
minWidth: 180,
|
||||
formatter: 'formatDateTime',
|
||||
},
|
||||
{
|
||||
field: 'endTime',
|
||||
title: '结束时间',
|
||||
minWidth: 180,
|
||||
formatter: 'formatDateTime',
|
||||
},
|
||||
];
|
||||
|
||||
// 添加动态表单字段列,暂时全部以字符串,TODO 展示优化, 按 type 展示控制
|
||||
const formFieldColumns = (formFields || []).map((item) => ({
|
||||
field: `formVariables.${item.field}`,
|
||||
title: item.title,
|
||||
minWidth: 120,
|
||||
formatter: ({ row }: any) => {
|
||||
return row.formVariables?.[item.field] ?? '';
|
||||
},
|
||||
}));
|
||||
|
||||
return [
|
||||
...baseColumns,
|
||||
...formFieldColumns,
|
||||
{
|
||||
title: '操作',
|
||||
width: 180,
|
||||
fixed: 'right',
|
||||
slots: { default: 'actions' },
|
||||
},
|
||||
];
|
||||
}
|
||||
|
|
@ -0,0 +1,200 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { BpmProcessInstanceApi } from '#/api/bpm/processInstance';
|
||||
|
||||
import { h, nextTick, onMounted, ref } from 'vue';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import { confirm, Page } from '@vben/common-ui';
|
||||
|
||||
import { Input, message } from 'ant-design-vue';
|
||||
|
||||
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
|
||||
import { getProcessDefinition } from '#/api/bpm/definition';
|
||||
import {
|
||||
cancelProcessInstanceByAdmin,
|
||||
getProcessInstanceManagerPage,
|
||||
} from '#/api/bpm/processInstance';
|
||||
import { getSimpleUserList } from '#/api/system/user';
|
||||
import { parseFormFields } from '#/components/simple-process-design';
|
||||
|
||||
import { useGridColumns, useGridFormSchema } from './data';
|
||||
|
||||
defineOptions({ name: 'BpmProcessInstanceReport' });
|
||||
|
||||
const router = useRouter(); // 路由
|
||||
const { query } = useRoute();
|
||||
const processDefinitionId = query.processDefinitionId as string;
|
||||
|
||||
const formFields = ref<any[]>([]);
|
||||
const userList = ref<any[]>([]); // 用户列表
|
||||
const gridReady = ref(false); // 表格是否准备好
|
||||
const cancelReason = ref(''); // 取消原因
|
||||
|
||||
// 表格的列需要解析表单字段,这里定义成变量,解析表单字段后再渲染
|
||||
let Grid: any = null;
|
||||
let gridApi: any = null;
|
||||
|
||||
/** 获取流程定义 */
|
||||
const getProcessDefinitionData = async () => {
|
||||
try {
|
||||
const processDefinition = await getProcessDefinition(processDefinitionId);
|
||||
if (processDefinition && processDefinition.formFields) {
|
||||
formFields.value = parseFormCreateFields(processDefinition.formFields);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取流程定义失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
/** 解析表单字段 */
|
||||
const parseFormCreateFields = (formFields?: string[]) => {
|
||||
const result: Array<Record<string, any>> = [];
|
||||
if (formFields) {
|
||||
formFields.forEach((fieldStr: string) => {
|
||||
try {
|
||||
parseFormFields(JSON.parse(fieldStr), result);
|
||||
} catch (error) {
|
||||
console.error('解析表单字段失败', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
/** 刷新表格 */
|
||||
function onRefresh() {
|
||||
if (gridApi) {
|
||||
gridApi.query();
|
||||
}
|
||||
}
|
||||
|
||||
/** 查看详情 */
|
||||
const handleDetail = (row: BpmProcessInstanceApi.ProcessInstance) => {
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
query: {
|
||||
id: row.id,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
/** 取消按钮操作 */
|
||||
const handleCancel = async (row: BpmProcessInstanceApi.ProcessInstance) => {
|
||||
cancelReason.value = ''; // 重置取消原因
|
||||
confirm({
|
||||
title: '取消流程',
|
||||
content: h('div', [
|
||||
h('p', '请输入取消原因:'),
|
||||
h(Input, {
|
||||
value: cancelReason.value,
|
||||
'onUpdate:value': (val: string) => {
|
||||
cancelReason.value = val;
|
||||
},
|
||||
placeholder: '请输入取消原因',
|
||||
}),
|
||||
]),
|
||||
beforeClose: async ({ isConfirm }) => {
|
||||
if (!isConfirm) return;
|
||||
if (!cancelReason.value.trim()) {
|
||||
message.warning('请输入取消原因');
|
||||
return false;
|
||||
}
|
||||
await cancelProcessInstanceByAdmin(row.id, cancelReason.value);
|
||||
return true;
|
||||
},
|
||||
}).then(() => {
|
||||
message.success('取消成功');
|
||||
onRefresh();
|
||||
});
|
||||
};
|
||||
|
||||
/** 创建表格 */
|
||||
const createGrid = () => {
|
||||
const [GridCompnent, api] = useVbenVxeGrid({
|
||||
formOptions: {
|
||||
schema: useGridFormSchema(userList.value, formFields.value),
|
||||
},
|
||||
gridOptions: {
|
||||
columns: useGridColumns(formFields.value),
|
||||
height: 'auto',
|
||||
keepSource: true,
|
||||
rowConfig: {
|
||||
keyField: 'id',
|
||||
},
|
||||
toolbarConfig: {
|
||||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
proxyConfig: {
|
||||
ajax: {
|
||||
query: async ({ page }, formValues) => {
|
||||
// 处理表单值,将 formFieldsParams 对象提取出来
|
||||
const { formFieldsParams = {}, ...restValues } = formValues || {};
|
||||
|
||||
const params = {
|
||||
pageNo: page.currentPage,
|
||||
pageSize: page.pageSize,
|
||||
...restValues,
|
||||
processDefinitionKey: query.processDefinitionKey,
|
||||
formFieldsParams: JSON.stringify(formFieldsParams),
|
||||
};
|
||||
return await getProcessInstanceManagerPage(params);
|
||||
},
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions,
|
||||
});
|
||||
|
||||
Grid = GridCompnent;
|
||||
gridApi = api;
|
||||
gridReady.value = true;
|
||||
};
|
||||
|
||||
/** 初始化 */
|
||||
onMounted(async () => {
|
||||
// 获取用户列表
|
||||
userList.value = await getSimpleUserList();
|
||||
|
||||
// 获取流程定义,并获取表单字段。
|
||||
await getProcessDefinitionData();
|
||||
|
||||
// 解析表单字段后,再创建表格,表格的列依赖于表单字段
|
||||
createGrid();
|
||||
|
||||
// 确保 DOM 更新完成
|
||||
await nextTick();
|
||||
|
||||
// 加载表格数据
|
||||
gridApi.query();
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Page auto-content-height>
|
||||
<!-- 动态渲染表格 -->
|
||||
<component :is="Grid" v-if="gridReady" table-title="流程实例列表">
|
||||
<template #actions="{ row }">
|
||||
<TableAction
|
||||
:actions="[
|
||||
{
|
||||
label: '详情',
|
||||
type: 'link',
|
||||
icon: ACTION_ICON.VIEW,
|
||||
auth: ['bpm:process-instance:query'],
|
||||
onClick: handleDetail.bind(null, row),
|
||||
},
|
||||
{
|
||||
label: '取消',
|
||||
type: 'link',
|
||||
icon: ACTION_ICON.DELETE,
|
||||
auth: ['bpm:process-instance:cancel'],
|
||||
ifShow: row.status === 1,
|
||||
onClick: handleCancel.bind(null, row),
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</template>
|
||||
</component>
|
||||
</Page>
|
||||
</template>
|
||||
|
|
@ -32,12 +32,12 @@ function handleCreate() {
|
|||
}
|
||||
|
||||
/** 编辑流程监听器 */
|
||||
function handleEdit(row: BpmProcessListenerApi.ProcessListenerVO) {
|
||||
function handleEdit(row: BpmProcessListenerApi.ProcessListener) {
|
||||
formModalApi.setData(row).open();
|
||||
}
|
||||
|
||||
/** 删除流程监听器 */
|
||||
async function handleDelete(row: BpmProcessListenerApi.ProcessListenerVO) {
|
||||
async function handleDelete(row: BpmProcessListenerApi.ProcessListener) {
|
||||
const hideLoading = message.loading({
|
||||
content: $t('ui.actionMessage.deleting', [row.name]),
|
||||
key: 'action_key_msg',
|
||||
|
|
@ -80,7 +80,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmProcessListenerApi.ProcessListenerVO>,
|
||||
} as VxeTableGridOptions<BpmProcessListenerApi.ProcessListener>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import { $t } from '#/locales';
|
|||
import { useFormSchema } from '../data';
|
||||
|
||||
const emit = defineEmits(['success']);
|
||||
const formData = ref<BpmProcessListenerApi.ProcessListenerVO>();
|
||||
const formData = ref<BpmProcessListenerApi.ProcessListener>();
|
||||
const getTitle = computed(() => {
|
||||
return formData.value?.id
|
||||
? $t('ui.actionTitle.edit', ['流程监听器'])
|
||||
|
|
@ -47,7 +47,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
modalApi.lock();
|
||||
// 提交表单
|
||||
const data =
|
||||
(await formApi.getValues()) as BpmProcessListenerApi.ProcessListenerVO;
|
||||
(await formApi.getValues()) as BpmProcessListenerApi.ProcessListener;
|
||||
try {
|
||||
await (formData.value?.id
|
||||
? updateProcessListener(data)
|
||||
|
|
@ -68,7 +68,7 @@ const [Modal, modalApi] = useVbenModal({
|
|||
return;
|
||||
}
|
||||
// 加载数据
|
||||
const data = modalApi.getData<BpmProcessListenerApi.ProcessListenerVO>();
|
||||
const data = modalApi.getData<BpmProcessListenerApi.ProcessListener>();
|
||||
if (!data || !data.id) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import { useGridColumns, useGridFormSchema } from './data';
|
|||
defineOptions({ name: 'BpmCopyTask' });
|
||||
|
||||
/** 任务详情 */
|
||||
function handleDetail(row: BpmProcessInstanceApi.CopyVO) {
|
||||
function handleDetail(row: BpmProcessInstanceApi.Copy) {
|
||||
const query = {
|
||||
id: row.processInstanceId,
|
||||
...(row.activityId && { activityId: row.activityId }),
|
||||
|
|
@ -54,7 +54,7 @@ const [Grid] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 64,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmProcessInstanceApi.CopyVO>,
|
||||
} as VxeTableGridOptions<BpmProcessInstanceApi.Copy>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import { useGridColumns, useGridFormSchema } from './data';
|
|||
defineOptions({ name: 'BpmDoneTask' });
|
||||
|
||||
/** 查看历史 */
|
||||
function handleHistory(row: BpmTaskApi.TaskManagerVO) {
|
||||
function handleHistory(row: BpmTaskApi.TaskManager) {
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
query: {
|
||||
|
|
@ -52,7 +52,7 @@ const [Grid] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 64,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmTaskApi.TaskVO>,
|
||||
} as VxeTableGridOptions<BpmTaskApi.Task>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import { useGridColumns, useGridFormSchema } from './data';
|
|||
defineOptions({ name: 'BpmManagerTask' });
|
||||
|
||||
/** 查看历史 */
|
||||
function handleHistory(row: BpmTaskApi.TaskManagerVO) {
|
||||
function handleHistory(row: BpmTaskApi.TaskManager) {
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
query: {
|
||||
|
|
@ -51,7 +51,7 @@ const [Grid] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 64,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmTaskApi.TaskManagerVO>,
|
||||
} as VxeTableGridOptions<BpmTaskApi.TaskManager>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import { useGridColumns, useGridFormSchema } from './data';
|
|||
defineOptions({ name: 'BpmTodoTask' });
|
||||
|
||||
/** 办理任务 */
|
||||
function handleAudit(row: BpmTaskApi.TaskVO) {
|
||||
function handleAudit(row: BpmTaskApi.Task) {
|
||||
console.warn(row);
|
||||
router.push({
|
||||
name: 'BpmProcessInstanceDetail',
|
||||
|
|
@ -53,7 +53,7 @@ const [Grid] = useVbenVxeGrid({
|
|||
cellConfig: {
|
||||
height: 64,
|
||||
},
|
||||
} as VxeTableGridOptions<BpmTaskApi.TaskVO>,
|
||||
} as VxeTableGridOptions<BpmTaskApi.Task>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import { handleTree } from '@vben/utils';
|
|||
|
||||
import { z } from '#/adapter/form';
|
||||
import { getProductCategoryList } from '#/api/crm/product/category';
|
||||
import { getSimpleUserList } from '#/api/system/user';
|
||||
import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils';
|
||||
|
||||
/** 新增/修改的表单 */
|
||||
|
|
@ -24,6 +25,16 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
label: '产品名称',
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
component: 'ApiSelect',
|
||||
fieldName: 'ownerUserId',
|
||||
label: '负责人',
|
||||
rules: 'required',
|
||||
componentProps: {
|
||||
api: getSimpleUserList,
|
||||
fieldNames: { label: 'nickname', value: 'id' },
|
||||
},
|
||||
},
|
||||
{
|
||||
component: 'Input',
|
||||
fieldName: 'no',
|
||||
|
|
@ -32,7 +43,7 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
},
|
||||
{
|
||||
component: 'ApiTreeSelect',
|
||||
fieldName: 'categoryName',
|
||||
fieldName: 'categoryId',
|
||||
label: '产品类型',
|
||||
rules: 'required',
|
||||
componentProps: {
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ const quickNavItems: WorkbenchQuickNavItem[] = [
|
|||
},
|
||||
{
|
||||
color: '#ff6b6b',
|
||||
icon: 'ep:shop',
|
||||
icon: 'lucide:shopping-bag',
|
||||
title: '商城中心',
|
||||
url: '/mall',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ const emit = defineEmits<{
|
|||
(e: 'success'): void;
|
||||
}>();
|
||||
|
||||
const formData = reactive<InfraCodegenApi.CodegenCreateListReqVO>({
|
||||
const formData = reactive<InfraCodegenApi.CodegenCreateListReq>({
|
||||
dataSourceConfigId: 0,
|
||||
tableNames: [], // 已选择的表列表
|
||||
});
|
||||
|
|
|
|||
|
|
@ -0,0 +1,143 @@
|
|||
import type { VbenFormSchema } from '#/adapter/form';
|
||||
import type { VxeGridPropTypes } from '#/adapter/vxe-table';
|
||||
|
||||
import {
|
||||
DICT_TYPE,
|
||||
getDictOptions,
|
||||
getIntDictOptions,
|
||||
getRangePickerDefaultProps,
|
||||
} from '#/utils';
|
||||
|
||||
/** 新增/修改的表单 */
|
||||
export function useFormSchema(): VbenFormSchema[] {
|
||||
return [
|
||||
{
|
||||
component: 'Input',
|
||||
fieldName: 'id',
|
||||
dependencies: {
|
||||
triggerFields: [''],
|
||||
show: () => false,
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'name',
|
||||
label: '分类名称',
|
||||
component: 'Input',
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'picUrl',
|
||||
label: '图标地址',
|
||||
component: 'ImageUpload',
|
||||
componentProps: {
|
||||
maxSize: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'sort',
|
||||
label: '排序',
|
||||
component: 'InputNumber',
|
||||
componentProps: {
|
||||
min: 0,
|
||||
controlsPosition: 'right',
|
||||
placeholder: '请输入排序',
|
||||
},
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'status',
|
||||
label: '状态',
|
||||
component: 'RadioGroup',
|
||||
componentProps: {
|
||||
options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
|
||||
buttonStyle: 'solid',
|
||||
optionType: 'button',
|
||||
},
|
||||
rules: 'required',
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
/** 列表的搜索表单 */
|
||||
export function useGridFormSchema(): VbenFormSchema[] {
|
||||
return [
|
||||
{
|
||||
fieldName: 'name',
|
||||
label: '分类名称',
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: '请输入分类名称',
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'status',
|
||||
label: '状态',
|
||||
component: 'Select',
|
||||
componentProps: {
|
||||
placeholder: '请选择状态',
|
||||
options: getIntDictOptions(DICT_TYPE.COMMON_STATUS),
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'createTime',
|
||||
label: '创建时间',
|
||||
component: 'RangePicker',
|
||||
componentProps: {
|
||||
...getRangePickerDefaultProps(),
|
||||
allowClear: true,
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
/** 表格列配置 */
|
||||
export function useGridColumns(): VxeGridPropTypes.Columns {
|
||||
return [
|
||||
{
|
||||
title: '编号',
|
||||
field: 'id',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '分类名称',
|
||||
field: 'name',
|
||||
minWidth: 240,
|
||||
},
|
||||
{
|
||||
title: '分类图片',
|
||||
field: 'picUrl',
|
||||
width: 80,
|
||||
cellRender: {
|
||||
name: 'CellImage',
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
field: 'status',
|
||||
width: 150,
|
||||
cellRender: {
|
||||
name: 'CellDictTag',
|
||||
props: {
|
||||
dictType: DICT_TYPE.COMMON_STATUS,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '排序',
|
||||
field: 'sort',
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
field: 'createTime',
|
||||
width: 180,
|
||||
formatter: 'formatDateTime',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
width: 180,
|
||||
fixed: 'right',
|
||||
slots: { default: 'actions' },
|
||||
},
|
||||
];
|
||||
}
|
||||
|
|
@ -1,28 +1,130 @@
|
|||
<script lang="ts" setup>
|
||||
import { Page } from '@vben/common-ui';
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { MallArticleCategoryApi } from '#/api/mall/promotion/articleCategory';
|
||||
|
||||
import { Button } from 'ant-design-vue';
|
||||
import { Page, useVbenModal } from '@vben/common-ui';
|
||||
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
|
||||
import {
|
||||
deleteArticleCategory,
|
||||
getArticleCategoryPage,
|
||||
} from '#/api/mall/promotion/articleCategory';
|
||||
import { $t } from '#/locales';
|
||||
|
||||
import { useGridColumns, useGridFormSchema } from './data';
|
||||
import Form from './modules/form.vue';
|
||||
|
||||
const [FormModal, formModalApi] = useVbenModal({
|
||||
connectedComponent: Form,
|
||||
destroyOnClose: true,
|
||||
});
|
||||
|
||||
/** 刷新表格 */
|
||||
function onRefresh() {
|
||||
gridApi.query();
|
||||
}
|
||||
|
||||
/** 创建分类 */
|
||||
function handleCreate() {
|
||||
formModalApi.setData(null).open();
|
||||
}
|
||||
|
||||
/** 编辑分类 */
|
||||
function handleEdit(row: MallArticleCategoryApi.ArticleCategory) {
|
||||
formModalApi.setData(row).open();
|
||||
}
|
||||
|
||||
/** 删除分类 */
|
||||
async function handleDelete(row: MallArticleCategoryApi.ArticleCategory) {
|
||||
const hideLoading = message.loading({
|
||||
content: $t('ui.actionMessage.deleting', [row.name]),
|
||||
key: 'action_key_msg',
|
||||
});
|
||||
try {
|
||||
await deleteArticleCategory(row.id as number);
|
||||
message.success({
|
||||
content: $t('ui.actionMessage.deleteSuccess', [row.name]),
|
||||
key: 'action_key_msg',
|
||||
});
|
||||
onRefresh();
|
||||
} finally {
|
||||
hideLoading();
|
||||
}
|
||||
}
|
||||
|
||||
const [Grid, gridApi] = useVbenVxeGrid({
|
||||
formOptions: {
|
||||
schema: useGridFormSchema(),
|
||||
},
|
||||
gridOptions: {
|
||||
columns: useGridColumns(),
|
||||
height: 'auto',
|
||||
keepSource: true,
|
||||
proxyConfig: {
|
||||
ajax: {
|
||||
query: async ({ page }, formValues) => {
|
||||
return await getArticleCategoryPage({
|
||||
pageNo: page.currentPage,
|
||||
pageSize: page.pageSize,
|
||||
...formValues,
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
rowConfig: {
|
||||
keyField: 'id',
|
||||
},
|
||||
toolbarConfig: {
|
||||
refresh: { code: 'query' },
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<MallArticleCategoryApi.ArticleCategory>,
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Page>
|
||||
<Button
|
||||
danger
|
||||
type="link"
|
||||
target="_blank"
|
||||
href="https://github.com/yudaocode/yudao-ui-admin-vue3"
|
||||
>
|
||||
该功能支持 Vue3 + element-plus 版本!
|
||||
</Button>
|
||||
<br />
|
||||
<Button
|
||||
type="link"
|
||||
target="_blank"
|
||||
href="https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/mall/promotion/article/category/index"
|
||||
>
|
||||
可参考
|
||||
https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/mall/promotion/article/category/index
|
||||
代码,pull request 贡献给我们!
|
||||
</Button>
|
||||
<Page auto-content-height>
|
||||
<FormModal @success="onRefresh" />
|
||||
<Grid table-title="文章分类列表">
|
||||
<template #toolbar-tools>
|
||||
<TableAction
|
||||
:actions="[
|
||||
{
|
||||
label: $t('ui.actionTitle.create', ['文章分类']),
|
||||
type: 'primary',
|
||||
icon: ACTION_ICON.ADD,
|
||||
auth: ['promotion:article-category:create'],
|
||||
onClick: handleCreate,
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</template>
|
||||
<template #actions="{ row }">
|
||||
<TableAction
|
||||
:actions="[
|
||||
{
|
||||
label: $t('common.edit'),
|
||||
type: 'link',
|
||||
icon: ACTION_ICON.EDIT,
|
||||
auth: ['promotion:article-category:update'],
|
||||
onClick: handleEdit.bind(null, row),
|
||||
},
|
||||
{
|
||||
label: $t('common.delete'),
|
||||
type: 'link',
|
||||
danger: true,
|
||||
icon: ACTION_ICON.DELETE,
|
||||
auth: ['promotion:article-category:delete'],
|
||||
popConfirm: {
|
||||
title: $t('ui.actionMessage.deleteConfirm', [row.name]),
|
||||
confirm: handleDelete.bind(null, row),
|
||||
},
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</template>
|
||||
</Grid>
|
||||
</Page>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,90 @@
|
|||
<script lang="ts" setup>
|
||||
import type { MallArticleCategoryApi } from '#/api/mall/promotion/articleCategory';
|
||||
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
import { useVbenModal } from '@vben/common-ui';
|
||||
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
import { useVbenForm } from '#/adapter/form';
|
||||
import {
|
||||
createArticleCategory,
|
||||
getArticleCategory,
|
||||
updateArticleCategory,
|
||||
} from '#/api/mall/promotion/articleCategory';
|
||||
import { $t } from '#/locales';
|
||||
|
||||
import { useFormSchema } from '../data';
|
||||
|
||||
const emit = defineEmits(['success']);
|
||||
|
||||
const formData = ref<MallArticleCategoryApi.ArticleCategory>();
|
||||
const getTitle = computed(() => {
|
||||
return formData.value?.id
|
||||
? $t('ui.actionTitle.edit', ['文章分类'])
|
||||
: $t('ui.actionTitle.create', ['文章分类']);
|
||||
});
|
||||
|
||||
const [Form, formApi] = useVbenForm({
|
||||
commonConfig: {
|
||||
componentProps: {
|
||||
class: 'w-full',
|
||||
},
|
||||
formItemClass: 'col-span-2',
|
||||
labelWidth: 120,
|
||||
},
|
||||
layout: 'horizontal',
|
||||
schema: useFormSchema(),
|
||||
showDefaultActions: false,
|
||||
});
|
||||
|
||||
const [Modal, modalApi] = useVbenModal({
|
||||
async onConfirm() {
|
||||
const { valid } = await formApi.validate();
|
||||
if (!valid) {
|
||||
return;
|
||||
}
|
||||
modalApi.lock();
|
||||
// 提交表单
|
||||
const data =
|
||||
(await formApi.getValues()) as MallArticleCategoryApi.ArticleCategory;
|
||||
try {
|
||||
await (formData.value?.id
|
||||
? updateArticleCategory(data)
|
||||
: createArticleCategory(data));
|
||||
// 关闭并提示
|
||||
await modalApi.close();
|
||||
emit('success');
|
||||
message.success($t('ui.actionMessage.operationSuccess'));
|
||||
} finally {
|
||||
modalApi.unlock();
|
||||
}
|
||||
},
|
||||
async onOpenChange(isOpen: boolean) {
|
||||
if (!isOpen) {
|
||||
formData.value = undefined;
|
||||
return;
|
||||
}
|
||||
// 加载数据
|
||||
const data = modalApi.getData<MallArticleCategoryApi.ArticleCategory>();
|
||||
if (!data || !data.id) {
|
||||
return;
|
||||
}
|
||||
modalApi.lock();
|
||||
try {
|
||||
formData.value = await getArticleCategory(data.id as number);
|
||||
// 设置到 values
|
||||
await formApi.setValues(formData.value);
|
||||
} finally {
|
||||
modalApi.unlock();
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Modal class="w-[40%]" :title="getTitle">
|
||||
<Form class="mx-4" />
|
||||
</Modal>
|
||||
</template>
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
import type { VbenFormSchema } from '#/adapter/form';
|
||||
import type { VxeGridPropTypes } from '#/adapter/vxe-table';
|
||||
|
||||
import {
|
||||
DICT_TYPE,
|
||||
getDictOptions,
|
||||
getIntDictOptions,
|
||||
getRangePickerDefaultProps,
|
||||
} from '#/utils';
|
||||
|
||||
/** 新增/修改的表单 */
|
||||
export function useFormSchema(): VbenFormSchema[] {
|
||||
return [
|
||||
{
|
||||
component: 'Input',
|
||||
fieldName: 'id',
|
||||
dependencies: {
|
||||
triggerFields: [''],
|
||||
show: () => false,
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'title',
|
||||
label: 'Banner标题',
|
||||
component: 'Input',
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'picUrl',
|
||||
label: '图片地址',
|
||||
component: 'ImageUpload',
|
||||
componentProps: {
|
||||
maxSize: 1,
|
||||
},
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'position',
|
||||
label: '定位',
|
||||
component: 'RadioGroup',
|
||||
componentProps: {
|
||||
options: getDictOptions(DICT_TYPE.PROMOTION_BANNER_POSITION, 'number'),
|
||||
buttonStyle: 'solid',
|
||||
optionType: 'button',
|
||||
},
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'url',
|
||||
label: '跳转地址',
|
||||
component: 'Input',
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'sort',
|
||||
label: '排序',
|
||||
component: 'InputNumber',
|
||||
componentProps: {
|
||||
min: 0,
|
||||
controlsPosition: 'right',
|
||||
placeholder: '请输入排序',
|
||||
},
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'status',
|
||||
label: '状态',
|
||||
component: 'RadioGroup',
|
||||
componentProps: {
|
||||
options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
|
||||
buttonStyle: 'solid',
|
||||
optionType: 'button',
|
||||
},
|
||||
rules: 'required',
|
||||
},
|
||||
{
|
||||
fieldName: 'memo',
|
||||
label: '描述',
|
||||
component: 'Textarea',
|
||||
componentProps: {
|
||||
rows: 4,
|
||||
placeholder: '请输入描述',
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
/** 列表的搜索表单 */
|
||||
export function useGridFormSchema(): VbenFormSchema[] {
|
||||
return [
|
||||
{
|
||||
fieldName: 'title',
|
||||
label: 'Banner标题',
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: '请输入Banner标题',
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'status',
|
||||
label: '状态',
|
||||
component: 'Select',
|
||||
componentProps: {
|
||||
placeholder: '请选择状态',
|
||||
options: getIntDictOptions(DICT_TYPE.COMMON_STATUS),
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldName: 'createTime',
|
||||
label: '创建时间',
|
||||
component: 'RangePicker',
|
||||
componentProps: {
|
||||
...getRangePickerDefaultProps(),
|
||||
allowClear: true,
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
/** 表格列配置 */
|
||||
export function useGridColumns(): VxeGridPropTypes.Columns {
|
||||
return [
|
||||
{
|
||||
title: 'Banner标题',
|
||||
field: 'title',
|
||||
},
|
||||
{
|
||||
title: '图片',
|
||||
field: 'picUrl',
|
||||
width: 80,
|
||||
cellRender: {
|
||||
name: 'CellImage',
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
field: 'status',
|
||||
width: 150,
|
||||
cellRender: {
|
||||
name: 'CellDictTag',
|
||||
props: {
|
||||
dictType: DICT_TYPE.COMMON_STATUS,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '定位',
|
||||
field: 'position',
|
||||
width: 150,
|
||||
cellRender: {
|
||||
name: 'CellDictTag',
|
||||
props: {
|
||||
dictType: DICT_TYPE.PROMOTION_BANNER_POSITION,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '跳转地址',
|
||||
field: 'url',
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
field: 'createTime',
|
||||
width: 180,
|
||||
formatter: 'formatDateTime',
|
||||
},
|
||||
{
|
||||
title: '排序',
|
||||
field: 'sort',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '描述',
|
||||
field: 'memo',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
width: 180,
|
||||
fixed: 'right',
|
||||
slots: { default: 'actions' },
|
||||
},
|
||||
];
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue