增加依赖:umoteam editor和xlsx

This commit is contained in:
xiaocp2009 2025-10-30 11:21:34 +08:00
parent bf91743f2f
commit 42756ceff3
2 changed files with 666 additions and 0 deletions

View File

@ -0,0 +1,595 @@
/**
* Namespace Api
*
* All backend api type
*/
declare namespace Api {
/**
* namespace Workflow
*
* backend api module: "Workflow"
*/
namespace Workflow {
/** 业务流程状态 */
type BusinessStatus = 'cancel' | 'draft' | 'waiting' | 'finish' | 'invalid' | 'back' | 'termination';
/** 流程类型 */
type FlowCodeType = 'leave1' | 'leave2' | 'leave3' | 'leave4' | 'leave5' | 'leave6';
/** 请假状态 */
type LeaveType = '1' | '2' | '3' | '4';
/** leave */
type Leave = Common.CommonRecord<{
/** id */
id: CommonType.IdType;
/** 申请编码 */
applyCode: string;
/** 请假类型 */
leaveType: LeaveType;
/** 开始时间 */
startDate: string;
/** 结束时间 */
endDate: string;
/** 请假天数 */
leaveDays: number;
/** 请假原因 */
remark: string;
/** 状态 */
status: BusinessStatus;
}>;
/** leave search params */
type LeaveSearchParams = CommonType.RecordNullable<
{ startLeaveDays: number; endLeaveDays: number } & Api.Common.CommonSearchParams
>;
/** leave operate params */
type LeaveOperateParams = CommonType.RecordNullable<
Pick<Api.Workflow.Leave, 'id' | 'leaveType' | 'startDate' | 'endDate' | 'leaveDays' | 'remark'>
>;
/** leave detail */
type LeaveDetail = CommonType.RecordNullable<
Pick<Api.Workflow.Leave, 'id' | 'leaveType' | 'startDate' | 'endDate' | 'leaveDays' | 'remark' | 'status'>
>;
/** leave list */
type LeaveList = Api.Common.PaginatingQueryRecord<Leave>;
/** 工作流分类 */
type WorkflowCategory = Common.CommonRecord<{
/** 主键 */
categoryId: CommonType.IdType;
/** 租户编号 */
tenantId: CommonType.IdType;
/** 分类名称 */
categoryName: string;
/** 父级ID */
parentId: CommonType.IdType;
/** 祖级列表 */
ancestors: string;
/** 排序号 */
orderNum: number;
/** 删除标志 */
delFlag: number;
}>;
/** 工作流分类搜索参数 */
type WorkflowCategorySearchParams = CommonType.RecordNullable<
Pick<WorkflowCategory, 'categoryName'> & Api.Common.CommonSearchParams
>;
/** 工作流分类操作参数 */
type WorkflowCategoryOperateParams = CommonType.RecordNullable<
Pick<WorkflowCategory, 'categoryId' | 'categoryName' | 'parentId' | 'orderNum'>
>;
/** 工作流分类列表 */
type WorkflowCategoryList = WorkflowCategory[];
/** spel */
type Spel = Common.CommonRecord<{
/** 主键id */
id: CommonType.IdType;
/** 组件名称 */
componentName: string;
/** 方法名 */
methodName: string;
/** 参数 */
methodParams: string;
/** spel表达式 */
viewSpel: string;
/** 备注 */
remark: string;
/** 状态 */
status: string;
/** 删除标志 */
delFlag: string;
}>;
/** spel search params */
type SpelSearchParams = CommonType.RecordNullable<
Pick<Api.Workflow.Spel, 'componentName' | 'methodName' | 'status'> & Api.Common.CommonSearchParams
>;
/** spel operate params */
type SpelOperateParams = CommonType.RecordNullable<
Pick<Api.Workflow.Spel, 'id' | 'componentName' | 'methodName' | 'methodParams' | 'viewSpel' | 'remark' | 'status'>
>;
/** spel list */
type SpelList = Api.Common.PaginatingQueryRecord<Spel>;
/** 工作流发布状态 */
type WorkflowPublishStatus = 0 | 1 | 9;
/** 设计器模式 */
type DefinitionDesignerMode = 'CLASSICS' | 'MIMIC';
/** definition */
type Definition = Common.CommonTenantRecord<{
/** 主键id */
id: CommonType.IdType;
/** 流程编码 */
flowCode: string;
/** 流程名称 */
flowName: string;
/** 流程类别 */
category: string;
/** 流程分类名称 */
categoryName: string;
/** 流程版本 */
version: string;
/** 是否发布0未发布 1已发布 9失效 */
isPublish: WorkflowPublishStatus;
/** 审批表单是否自定义Y是 N否 */
formCustom: Api.Common.YesOrNoStatus;
/** 审批表单路径 */
formPath: string;
/** 流程激活状态0挂起 1激活 */
activityStatus: WorkflowActivityStatus;
/** 监听器类型 */
listenerType: string;
/** 监听器路径 */
listenerPath: string;
/** 业务详情 存业务表对象json字符串 */
ext: string;
/** 设计器模式 */
modelValue: DefinitionDesignerMode;
/** 删除标志 */
delFlag: string;
}>;
/** definition search params */
type DefinitionSearchParams = CommonType.RecordNullable<
Pick<Api.Workflow.Definition, 'flowCode' | 'flowName' | 'category'> & Api.Common.CommonSearchParams
>;
/** definition operate params */
type DefinitionOperateParams = CommonType.RecordNullable<
Pick<
Api.Workflow.Definition,
'id' | 'flowCode' | 'flowName' | 'category' | 'formPath' | 'formCustom' | 'modelValue' | 'ext'
>
>;
/** definition list */
type DefinitionList = Api.Common.PaginatingQueryRecord<Definition>;
type InstanceVariable = CommonType.RecordNullable<{
key: string;
value: string;
}>;
type InstanceVariableOperateParams = CommonType.RecordNullable<{
instanceId: CommonType.IdType;
}> &
InstanceVariable;
type InstanceVariableInfo = CommonType.RecordNullable<{
/** 键 */
variable: string;
/** 值 */
variableList: InstanceVariable[];
}>;
/** 节点类型 */
type WorkflowNodeType = 0 | 1 | 2 | 3 | 4;
/** 流程激活状态 */
type WorkflowActivityStatus = 0 | 1;
/** 流程实例 */
type Instance = Common.CommonRecord<{
/** 主键 */
id: CommonType.IdType;
/** 租户编号 */
tenantId: CommonType.IdType;
/** 分类ID */
category: CommonType.IdType;
/** 分类名称 */
categoryName: string;
/** 流程定义ID */
definitionId: CommonType.IdType;
/** 流程定义名称 */
flowName: string;
/** 流程定义编码 */
flowCode: string;
/** 业务ID */
businessId: CommonType.IdType;
/** 业务编码 */
businessCode: string;
/** 业务名称 */
businessTitle: string;
/** 节点类型 */
nodeType: WorkflowNodeType;
/** 节点编码 */
nodeCode: string;
/** 节点名称 */
nodeName: string;
/** 变量 */
variable: string;
/** 流程状态 */
flowStatus: string;
/** 流程状态名称 */
flowStatusName: string;
/** 流程激活状态 */
activityStatus: WorkflowActivityStatus;
/** 审批表单是否自定义 */
formCustom: Api.Common.YesOrNoStatus;
/** 审批表单路径 */
formPath: string;
/** 扩展字段 */
ext: string;
/** 流程定义版本 */
version: string;
/** 创建者名称 */
createByName: string;
/** 删除标志 */
delFlag: number;
}>;
/** 流程实例搜索参数 */
type InstanceSearchParams = CommonType.RecordNullable<
Pick<Instance, 'flowName' | 'flowCode' | 'businessId' | 'category' | 'nodeName'> &
Api.Common.CommonSearchParams & {
startUserId: CommonType.IdType;
createByIds: CommonType.IdType[];
}
>;
/** 流程实例列表 */
type InstanceList = Common.PaginatingQueryRecord<Instance>;
/** 流程作废操作参数 */
type FlowInvalidOperateParams = CommonType.RecordNullable<{
/** 主键 */
id: CommonType.IdType;
/** 作废原因 */
comment: string;
}>;
/** 流程撤销操作参数 */
type CancelProcessApplyParams = CommonType.RecordNullable<{
/** 主键 */
businessId: CommonType.IdType;
/** 撤销原因 */
message: string;
}>;
type BusinessInfo = CommonType.RecordNullable<{
/** 业务编码 */
businessCode: string;
/** 业务名称 */
businessTitle: string;
}>;
/** 启动流程操作参数 */
type StartWorkflowOperateParams = CommonType.RecordNullable<{
/** 流程定义ID */
flowCode: string;
/** 业务ID */
businessId: CommonType.IdType;
/** 业务信息 */
flowInstanceBizExtBo: BusinessInfo;
/** 变量 */
variables: { [key: string]: any };
}>;
/** 启动流程结果 */
type StartWorkflowResult = CommonType.RecordNullable<{
/** 流程实例ID */
instanceId: CommonType.IdType;
/** 任务ID */
taskId: CommonType.IdType;
}>;
/** 抄送人 */
type FlowCopy = CommonType.RecordNullable<{
/** 用户ID */
userId: CommonType.IdType;
/** 用户名称 */
userName: string;
}>;
/** 按钮权限 */
type ButtonPermission = CommonType.RecordNullable<{
/** 唯一编码 */
code: CommonType.IdType;
/** 选项值 */
value: string;
/** 是否显示 */
show: boolean;
}>;
type TaskOrHisTask = Task | HisTask;
/** 任务详情 */
type Task = Common.CommonTenantRecord<{
/** 任务ID */
id: CommonType.IdType;
/** 删除标志 */
delFlag: number;
/** 流程定义ID */
definitionId: CommonType.IdType;
/** 流程实例ID */
instanceId: CommonType.IdType;
/** 业务ID */
businessId: CommonType.IdType;
/** 节点编码 */
nodeCode: string;
/** 节点类型 */
nodeType: WorkflowNodeType;
/** 权限列表 */
permissionList: string[];
/** 用户列表 */
userList: any[];
/** 审批表单是否自定义 */
formCustom: Api.Common.YesOrNoStatus;
/** 审批表单路径 */
formPath: string;
/** 流程状态 */
flowStatus: string;
/** 流程状态名称 */
flowStatusName: string;
/** 分类ID */
category: CommonType.IdType;
/** 分类名称 */
categoryName: string;
/** 办理人类型 */
type: string;
/** 审批人 */
assigneeIds: string;
/** 审批人名称 */
assigneeNames: string;
/** 审批人 */
processedBy: string;
/** 审批人名称 */
processedByName: string;
/** 流程签署比例值 大于0为票签会签 */
nodeRatio: string;
/** 创建人名称 */
createByName: string;
/** 是否为申请人节点 */
applyNode: string;
/** 按钮列表 */
buttonList: ButtonPermission[];
/** 节点名称 */
nodeName: string;
/** 流程定义名称 */
flowName: string;
/** 流程定义编码 */
flowCode: string;
/** 流程版本号 */
version: string;
/** 业务编码 */
businessCode: string;
/** 业务名称 */
businessTitle: string;
}>;
/** 任务列表 */
type TaskList = Common.PaginatingQueryRecord<Task>;
/** 任务催办操作参数 */
type TaskUrgeOperateParams = CommonType.RecordNullable<{
taskIdList: CommonType.IdType[];
messageType: MessageType[];
message: string;
}>;
/** 任务操作类型 */
type TaskOperateType = 'delegateTask' | 'transferTask' | 'addSignature' | 'reductionSignature' | 'stopTask';
/** 任务操作参数 */
type TaskOperateParams = CommonType.RecordNullable<{
taskId: CommonType.IdType;
userId?: CommonType.IdType;
userIds?: CommonType.IdType[];
message?: string;
}>;
/** 终止任务 */
type TerminateTaskOperateParams = CommonType.RecordNullable<{
taskId: CommonType.IdType;
comment?: string;
}>;
/** 协作方式 */
type CooperateType = 1 | 2 | 3 | 4 | 5 | 6 | 7;
/** 历史任务 */
type HisTask = Common.CommonTenantRecord<{
/** 任务ID */
id: CommonType.IdType;
/** 删除标志 */
delFlag: number;
/** 流程定义ID */
definitionId: CommonType.IdType;
/** 流程定义名称 */
flowName: string;
/** 流程实例ID */
instanceId: CommonType.IdType;
/** 任务表ID */
taskId: CommonType.IdType;
/** 协作方式1审批 2转办 3委派 4会签 5票签 6加签 7减签 */
cooperateType: CooperateType;
/** 协作方式名称 */
cooperateTypeName: string;
/** 业务ID */
businessId: string;
/** 节点编码 */
nodeCode: string;
/** 节点名称 */
nodeName: string;
/** 节点类型0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关 */
nodeType: WorkflowNodeType;
/** 目标节点编码 */
targetNodeCode: string;
/** 目标节点名称 */
targetNodeName: string;
/** 审批者 */
approver: string;
/** 审批者名称 */
approveName: string;
/** 协作人 */
collaborator: string;
/** 权限标识 */
permissionList: string[];
/** 跳转类型PASS通过 REJECT退回 NONE无动作 */
skipType: string;
/** 流程状态 */
flowStatus: string;
/** 任务状态 */
flowTaskStatus: string;
/** 流程状态名称 */
flowStatusName: string;
/** 审批意见 */
message: string;
/** 业务扩展信息JSON字符串 */
ext: string;
/** 创建者姓名(申请人名称) */
createByName: string;
/** 流程分类ID */
category: string;
/** 流程分类名称 */
categoryName: string;
/** 审批表单是否自定义Y是 N否 */
formCustom: Api.Common.YesOrNoStatus;
/** 表单路径 */
formPath: string;
/** 流程定义编码 */
flowCode: string;
/** 流程版本号 */
version: string;
/** 运行时长 */
runDuration: string;
/** 附件 */
attachmentList: Api.System.Oss[];
/** 业务编码 */
businessCode: string;
/** 业务名称 */
businessTitle: string;
}>;
/** 历史任务列表 */
type HisTaskList = Common.PaginatingQueryRecord<HisTask>;
/** 流程实例ID与历史任务 */
type InstanceIdWithHisTask = Common.CommonRecord<{
/** 流程实例ID */
instanceId: CommonType.IdType;
/** 历史任务 */
list: HisTask[];
}>;
/** 任务搜索参数 */
type TaskSearchParams = CommonType.RecordNullable<
Pick<Task, 'flowName' | 'flowCode' | 'businessId' | 'category' | 'nodeName' | 'instanceId' | 'permissionList'> &
Api.Common.CommonSearchParams & {
createByIds: CommonType.IdType[];
}
>;
type TaskNextNodeSearchParams = CommonType.RecordNullable<{
taskId: CommonType.IdType;
taskVariables: { [key: string]: any };
}>;
/** 消息类型 */
type MessageType = '1' | '2' | '3';
/** 完成任务操作参数 */
type CompleteTaskOperateParams = CommonType.RecordNullable<{
/** 任务ID */
taskId: CommonType.IdType;
/** 文件ID */
fileId: CommonType.IdType;
/** 抄送人 */
flowCopyList: FlowCopy[];
/** 消息类型 */
messageType: string[];
/** 消息 */
message: string;
/** 通知 */
notice: string;
/** 任务变量 */
taskVariables: { [key: string]: any };
/** 变量 */
variables: { [key: string]: any };
/** 审批人 */
assigneeMap: { [key: string]: string };
/** 扩展字段 */
ext: string;
}>;
/** 工作流节点 */
type FlowNode = Common.CommonTenantRecord<{
/** 节点ID */
id: CommonType.IdType;
/** 删除标志 */
delFlag: string;
/** 节点类型0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关 */
nodeType: WorkflowNodeType;
/** 流程定义ID */
definitionId: CommonType.IdType;
/** 节点编码 */
nodeCode: string;
/** 节点名称 */
nodeName: string;
/** 权限标识 */
permissionFlag: string;
/** 流程签署比例值 */
nodeRatio: string;
/** 节点坐标 */
coordinate: string;
/** 流程版本号 */
version: string;
/** 是否允许任意节点跳转 */
anyNodeSkip: string;
/** 监听器类型 */
listenerType: string;
/** 监听器路径 */
listenerPath: string;
/** 处理器类型 */
handlerType: string;
/** 处理器路径 */
handlerPath: string;
/** 审批表单是否自定义Y是 N否 */
formCustom: Api.Common.YesOrNoStatus;
/** 审批表单路径 */
formPath: string;
/** 扩展字段 */
ext: string;
}>;
/** 工作流节点列表 */
type FlowNodeList = FlowNode[];
/** 驳回操作参数 */
type BackOperateParams = CommonType.RecordNullable<{
taskId: CommonType.IdType;
fileId: CommonType.IdType;
messageType: string[];
nodeCode: string;
message: string;
notice: string;
variables: { [key: string]: any };
}>;
}
}

View File

@ -0,0 +1,71 @@
import { utils, writeFile } from 'xlsx';
import { isNotNull } from '@/utils/common';
import { $t } from '@/locales';
export interface ExportExcelProps<T> {
columns: NaiveUI.TableColumn<NaiveUI.TableDataWithIndex<T>>[];
data: NaiveUI.TableDataWithIndex<T>[];
filename: string;
ignoreKeys?: (keyof NaiveUI.TableDataWithIndex<T> | NaiveUI.CustomColumnKey)[];
dicts?: Record<keyof NaiveUI.TableDataWithIndex<T>, string>;
}
export function exportExcel<T>({
columns,
data,
filename,
dicts,
ignoreKeys = ['index', 'operate']
}: ExportExcelProps<T>) {
const exportColumns = columns.filter(col => isTableColumnHasKey(col) && !ignoreKeys?.includes(col.key));
const excelList = data.map(item => exportColumns.map(col => getTableValue(col, item, dicts)));
const titleList = exportColumns.map(col => (isTableColumnHasTitle(col) && col.title) || null);
excelList.unshift(titleList);
const workBook = utils.book_new();
const workSheet = utils.aoa_to_sheet(excelList);
workSheet['!cols'] = exportColumns.map(item => ({
width: Math.round(Number(item.width) / 10 || 20)
}));
utils.book_append_sheet(workBook, workSheet, filename);
writeFile(workBook, `${filename}.xlsx`);
}
function getTableValue<T>(
col: NaiveUI.TableColumn<NaiveUI.TableDataWithIndex<T>>,
item: NaiveUI.TableDataWithIndex<T>,
dicts?: Record<keyof NaiveUI.TableDataWithIndex<T>, string>
) {
if (!isTableColumnHasKey(col)) {
return null;
}
const { key } = col;
if (key === 'operate') {
return null;
}
if (isNotNull(dicts?.[key]) && isNotNull(item[key])) {
return $t(item[key] as App.I18n.I18nKey);
}
return item[key];
}
function isTableColumnHasKey<T>(column: NaiveUI.TableColumn<T>): column is NaiveUI.TableColumnWithKey<T> {
return Boolean((column as NaiveUI.TableColumnWithKey<T>).key);
}
function isTableColumnHasTitle<T>(column: NaiveUI.TableColumn<T>): column is NaiveUI.TableColumnWithKey<T> & {
title: string;
} {
return Boolean((column as NaiveUI.TableColumnWithKey<T>).title);
}