liu
2026-10-23 5421b8af862890dcf187c2ad5ece55423959ba85
feat(bpm): 全部业务审批流改回 BPM,审批统一进入协同办公

- CRM:合同、开票、退费、销户提交时创建 BPM 实例,审批结果监听回写
- ERP:采购计划、采购申请、采购订单、付款单接入 BPM
- HRM:请假、转正、离职、调动、考勤异常、绩效考核接入 BPM
- MES:设计项目、技术确认、设备入库、采购入库、杂项出入库、供应商退货、盘点结果接入 BPM
- 售后:赔付审批接入 BPM(新增 yudao-module-bpm 依赖)
- 各业务新增 updateXxxAuditStatus 与 Mapper.updateAuditStatusByBpm,仅当单据仍处于审批中时回写
- 新增审批详情映射脚本与历史审批中单据重置脚本

Co-Authored-By: Claude <noreply@anthropic.com>
已添加25个文件
已修改71个文件
5046 ■■■■■ 文件已修改
docs/sql/bpm_legacy_definitions_backup_20261023.json 2257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/bpm_business_attach_approval_detail.sql 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/reset_stuck_approval_records.sql 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/mysql/compensation/AfterSaleCompensationMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/AfterSaleCompensationService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/AfterSaleCompensationServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/listener/AfterSaleCompensationStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/cancellation/CrmCancellationMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/invoice/CrmInvoiceMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/refund/CrmRefundMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/cancellation/CrmCancellationService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/cancellation/CrmCancellationServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/cancellation/listener/CrmCancellationStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/listener/CrmContractStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/listener/CrmInvoiceStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/refund/CrmRefundService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/refund/CrmRefundServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/refund/listener/CrmRefundStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchasePlanMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseRequestMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/listener/ErpFinancePaymentStatusListener.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchasePlanService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchasePlanServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchaseOrderStatusListener.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchasePlanStatusListener.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchaseRequestStatusListener.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmLeaveApplicationMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmRegularizeApplicationMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmResignationApplicationMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmTransferApplicationMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/performanceappraise/HrmPerformanceAppraiseMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmRegularizeApplicationService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmRegularizeApplicationServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmLeaveStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmRegularizeStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmResignationStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmTransferStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/listener/HrmAttendanceStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/listener/HrmPerformanceAppraiseStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/project/MesPdProjectMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/techconfirm/ProductTechConfirmMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/equipmentreceipt/MesWmEquipmentReceiptMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskMapper.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/listener/MesPdProjectStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/techconfirm/ProductTechConfirmService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/techconfirm/ProductTechConfirmServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/techconfirm/listener/ProductTechConfirmStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/equipmentreceipt/MesWmEquipmentReceiptService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/equipmentreceipt/MesWmEquipmentReceiptServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/equipmentreceipt/listener/MesWmEquipmentReceiptStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/listener/MesWmMiscIssueStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/listener/MesWmMiscReceiptStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/listener/MesWmReturnVendorStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/listener/MesWmStockTakingTaskStatusListener.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/bpm_legacy_definitions_backup_20261023.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2257 @@
[
 {
  "table": "ACT_RE_DEPLOYMENT",
  "columns": [
   "ID_",
   "NAME_",
   "CATEGORY_",
   "KEY_",
   "TENANT_ID_",
   "DEPLOY_TIME_",
   "DERIVED_FROM_",
   "DERIVED_FROM_ROOT_",
   "PARENT_DEPLOYMENT_ID_",
   "ENGINE_VERSION_"
  ],
  "rows": [
   {
    "ID_": "0b7c7557949111f192711ab6da3745b7",
    "NAME_": "来票审批流程",
    "CATEGORY_": "erp_purchase_invoice_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-10T07:56:54",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "0c9944e3-83e0-11f1-b998-00155dd68500",
    "NAME_": "销售报价审批",
    "CATEGORY_": "sale_quotation_approve",
    "KEY_": "QWEDD",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-20T10:09:33.248000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "0c9944e3-83e0-11f1-b998-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "10000000000000000000000000000001",
    "NAME_": "杂项入库审批流程",
    "CATEGORY_": "misc_receipt_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-09-08T09:32:21",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "10000000000000000000000000000002",
    "NAME_": "杂项出库审批流程",
    "CATEGORY_": "misc_issue_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-09-08T09:32:21",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "10000000000000000000000000000003",
    "NAME_": "供应商退货审批流程",
    "CATEGORY_": "return_vendor_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-09-08T09:32:21",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "10000000000000000000000000000004",
    "NAME_": "采购入库审批流程",
    "CATEGORY_": "item_receipt_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-09-08T09:32:21",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "10000000000000000000000000000005",
    "NAME_": "盘点结果审批流程",
    "CATEGORY_": "stock_taking_result_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-09-08T09:32:21",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "10000000000000000000000000000006",
    "NAME_": "设备入库审批流程",
    "CATEGORY_": "equipment_receipt_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-09-08T09:32:21",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "293f2c0f-8c89-11f1-8a27-00155dad6485",
    "NAME_": "回款审批流程",
    "CATEGORY_": "1111",
    "KEY_": "_..123abc",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-31T10:40:15.560000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "293f2c0f-8c89-11f1-8a27-00155dad6485",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "5e64a066-7a93-11f1-9ea7-00155dd68500",
    "NAME_": "请假流程",
    "CATEGORY_": "分类2",
    "KEY_": "b000_abc.",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-08T14:07:58.763000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "5e64a066-7a93-11f1-9ea7-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "6c885e28-6edd-11f1-af1d-00155dd68500",
    "NAME_": "121",
    "CATEGORY_": "分类1",
    "KEY_": "Ada",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-06-23T16:27:51.290000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "6c885e28-6edd-11f1-af1d-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "6dae8b2a-74f9-11f1-91b4-00155dd68500",
    "NAME_": "采购审核",
    "CATEGORY_": "purchase_request_approve",
    "KEY_": "purchase_request_approve",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-01T11:03:26.103000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "6dae8b2a-74f9-11f1-91b4-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "7215184e-948c-11f1-9271-1ab6da3745b7",
    "NAME_": "回款审批流程",
    "CATEGORY_": "1111",
    "KEY_": null,
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-10T07:24:24",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "777471ff-74f7-11f1-b46c-00155dd68500",
    "NAME_": "采购审核",
    "CATEGORY_": "purchase_approve",
    "KEY_": "purchase_approve",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-01T10:49:23.505000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "777471ff-74f7-11f1-b46c-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "78ebc2ac-cad4-11f1-979e-0242ac110005",
    "NAME_": "121",
    "CATEGORY_": "purchase_request_approve",
    "KEY_": "caigoushenpi",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-10-18T17:15:33.579000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "78ebc2ac-cad4-11f1-979e-0242ac110005",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "8fa8f1b5-75da-11f1-a595-00155dd68500",
    "NAME_": "合同审核",
    "CATEGORY_": "contract_approve",
    "KEY_": "contract_approve",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-02T13:54:59.872000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "8fa8f1b5-75da-11f1-a595-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "a0a3dcd4-74fc-11f1-9120-00155dd68500",
    "NAME_": "123123",
    "CATEGORY_": "分类1",
    "KEY_": "SSQ",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-01T11:26:20.087000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "a0a3dcd4-74fc-11f1-9120-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "a32d7935-6edd-11f1-af1d-00155dd68500",
    "NAME_": "121",
    "CATEGORY_": "分类1",
    "KEY_": "Ada",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-06-23T16:29:22.969000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "a32d7935-6edd-11f1-af1d-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "a43fbb94-7a92-11f1-9ea7-00155dd68500",
    "NAME_": "请假流程",
    "CATEGORY_": "分类2",
    "KEY_": "b000_abc.",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-08T14:02:46.465000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "a43fbb94-7a92-11f1-9ea7-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "c101d3e0-0001-11f2-8a27-00155dad6485",
    "NAME_": "开票审批流程",
    "CATEGORY_": "crm_invoice_approve",
    "KEY_": null,
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-10T06:35:22",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "c75fb050-7462-11f1-b91b-00155dd68500",
    "NAME_": "采购审核",
    "CATEGORY_": "采购审核",
    "KEY_": "pus",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-06-30T17:05:02.575000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "c75fb050-7462-11f1-b91b-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "cancellation-deploy-20260820",
    "NAME_": "cancellation_approve.bpmn",
    "CATEGORY_": "cancellation_approve",
    "KEY_": null,
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-20T16:24:08.120000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "ce99813cfeb29f270355dd39f8ef74f2",
    "NAME_": "产品项目审批流程",
    "CATEGORY_": "mes_pd_project_approve",
    "KEY_": "mes-pd-project-audit",
    "TENANT_ID_": null,
    "DEPLOY_TIME_": "2026-08-13T08:12:13",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "compensation-deploy-20260820",
    "NAME_": "compensation_approve.bpmn",
    "CATEGORY_": "compensation_approve",
    "KEY_": null,
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-20T16:24:08.120000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "d232b68a-74fe-11f1-9120-00155dd68500",
    "NAME_": "采购审核",
    "CATEGORY_": "purchase_request_approve",
    "KEY_": "purchase_request_approve",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-01T11:42:02.225000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "d232b68a-74fe-11f1-9120-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "d8c035b9-8af2-11f1-a171-b025aaa35411",
    "NAME_": "请假流程",
    "CATEGORY_": "分类2",
    "KEY_": "b000_abc.",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-29T10:11:44.839000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "d8c035b9-8af2-11f1-a171-b025aaa35411",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "df6abd26-7500-11f1-993f-00155dd68500",
    "NAME_": "121",
    "CATEGORY_": "purchase_request_approve",
    "KEY_": "caigoushenpi",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-01T11:56:43.395000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "df6abd26-7500-11f1-993f-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "f1a1b2c3d4e5465f8a9b0c1d2e3f4a5b",
    "NAME_": "付款审批流程",
    "CATEGORY_": "erp_finance_payment_approve",
    "KEY_": "erp-finance-payment-audit",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-10T09:35:43",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "fb13987e-74f9-11f1-91b4-00155dd68500",
    "NAME_": "采购审核",
    "CATEGORY_": "purchase_request_approve",
    "KEY_": "purchase_request_approve",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-07-01T11:07:23.324000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": "fb13987e-74f9-11f1-91b4-00155dd68500",
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "performance-deploy-20260820",
    "NAME_": "performance_appraise_approve.bpmn",
    "CATEGORY_": "performance_appraise_approve",
    "KEY_": null,
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-20T16:24:08.120000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "pp-deploy-20260818",
    "NAME_": "purchase_plan_approve.bpmn",
    "CATEGORY_": "purchase_plan_approve",
    "KEY_": "",
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-18T16:47:28.555000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   },
   {
    "ID_": "refund-deploy-20260820",
    "NAME_": "refund_approve.bpmn",
    "CATEGORY_": "refund_approve",
    "KEY_": null,
    "TENANT_ID_": "",
    "DEPLOY_TIME_": "2026-08-20T16:24:08.120000",
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "PARENT_DEPLOYMENT_ID_": null,
    "ENGINE_VERSION_": null
   }
  ]
 },
 {
  "table": "ACT_RE_PROCDEF",
  "columns": [
   "ID_",
   "REV_",
   "CATEGORY_",
   "NAME_",
   "KEY_",
   "VERSION_",
   "DEPLOYMENT_ID_",
   "RESOURCE_NAME_",
   "DGRM_RESOURCE_NAME_",
   "DESCRIPTION_",
   "HAS_START_FORM_KEY_",
   "HAS_GRAPHICAL_NOTATION_",
   "SUSPENSION_STATE_",
   "TENANT_ID_",
   "ENGINE_VERSION_",
   "DERIVED_FROM_",
   "DERIVED_FROM_ROOT_",
   "DERIVED_VERSION_"
  ],
  "rows": [
   {
    "ID_": "Ada:1:6cc05e1b-6edd-11f1-af1d-00155dd68500",
    "REV_": 3,
    "CATEGORY_": "分类1",
    "NAME_": "121",
    "KEY_": "Ada",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "6c885e28-6edd-11f1-af1d-00155dd68500",
    "RESOURCE_NAME_": "Ada.bpmn",
    "DGRM_RESOURCE_NAME_": "Ada.Ada.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 2,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "Ada:2:a332d068-6edd-11f1-af1d-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "分类1",
    "NAME_": "121",
    "KEY_": "Ada",
    "VERSION_": 2,
    "DEPLOYMENT_ID_": "a32d7935-6edd-11f1-af1d-00155dd68500",
    "RESOURCE_NAME_": "Ada.bpmn",
    "DGRM_RESOURCE_NAME_": "Ada.Ada.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "QWEDD:1:0d177596-83e0-11f1-b998-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "sale_quotation_approve",
    "NAME_": "销售报价审批",
    "KEY_": "QWEDD",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "0c9944e3-83e0-11f1-b998-00155dd68500",
    "RESOURCE_NAME_": "QWEDD.bpmn",
    "DGRM_RESOURCE_NAME_": "QWEDD.QWEDD.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "SSQ:1:a0be69b7-74fc-11f1-9120-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "分类1",
    "NAME_": "123123",
    "KEY_": "SSQ",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "a0a3dcd4-74fc-11f1-9120-00155dd68500",
    "RESOURCE_NAME_": "SSQ.bpmn",
    "DGRM_RESOURCE_NAME_": "SSQ.SSQ.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "_..123abc:1:297493f2-8c89-11f1-8a27-00155dad6485",
    "REV_": 2,
    "CATEGORY_": "1111",
    "NAME_": "回款审批流程",
    "KEY_": "_..123abc",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "293f2c0f-8c89-11f1-8a27-00155dad6485",
    "RESOURCE_NAME_": "_..123abc.bpmn",
    "DGRM_RESOURCE_NAME_": "_..123abc._..123abc.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "b000_abc.:1:a470b6a7-7a92-11f1-9ea7-00155dd68500",
    "REV_": 3,
    "CATEGORY_": "分类2",
    "NAME_": "请假流程",
    "KEY_": "b000_abc.",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "a43fbb94-7a92-11f1-9ea7-00155dd68500",
    "RESOURCE_NAME_": "b000_abc..bpmn",
    "DGRM_RESOURCE_NAME_": "b000_abc..b000_abc..png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 2,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "b000_abc.:2:5e6b7e39-7a93-11f1-9ea7-00155dd68500",
    "REV_": 3,
    "CATEGORY_": "分类2",
    "NAME_": "请假流程",
    "KEY_": "b000_abc.",
    "VERSION_": 2,
    "DEPLOYMENT_ID_": "5e64a066-7a93-11f1-9ea7-00155dd68500",
    "RESOURCE_NAME_": "b000_abc..bpmn",
    "DGRM_RESOURCE_NAME_": "b000_abc..b000_abc..png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 2,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "b000_abc.:3:d8fca27c-8af2-11f1-a171-b025aaa35411",
    "REV_": 2,
    "CATEGORY_": "分类2",
    "NAME_": "请假流程",
    "KEY_": "b000_abc.",
    "VERSION_": 3,
    "DEPLOYMENT_ID_": "d8c035b9-8af2-11f1-a171-b025aaa35411",
    "RESOURCE_NAME_": "b000_abc..bpmn",
    "DGRM_RESOURCE_NAME_": "b000_abc..b000_abc..png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "caigoushenpi:1:df929079-7500-11f1-993f-00155dd68500",
    "REV_": 3,
    "CATEGORY_": "purchase_request_approve",
    "NAME_": "121",
    "KEY_": "caigoushenpi",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "df6abd26-7500-11f1-993f-00155dd68500",
    "RESOURCE_NAME_": "caigoushenpi.bpmn",
    "DGRM_RESOURCE_NAME_": "caigoushenpi.caigoushenpi.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 2,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "caigoushenpi:2:78f4753f-cad4-11f1-979e-0242ac110005",
    "REV_": 2,
    "CATEGORY_": "purchase_request_approve",
    "NAME_": "121",
    "KEY_": "caigoushenpi",
    "VERSION_": 2,
    "DEPLOYMENT_ID_": "78ebc2ac-cad4-11f1-979e-0242ac110005",
    "RESOURCE_NAME_": "caigoushenpi.bpmn",
    "DGRM_RESOURCE_NAME_": "caigoushenpi.caigoushenpi.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "cancellation_approve:1:cancellation-proc-20260820",
    "REV_": 1,
    "CATEGORY_": "cancellation_approve",
    "NAME_": "销户审批",
    "KEY_": "cancellation_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "cancellation-deploy-20260820",
    "RESOURCE_NAME_": "cancellation_approve.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": null,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "compensation_approve:1:compensation-proc-20260820",
    "REV_": 1,
    "CATEGORY_": "compensation_approve",
    "NAME_": "赔付审批",
    "KEY_": "compensation_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "compensation-deploy-20260820",
    "RESOURCE_NAME_": "compensation_approve.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": null,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "contract_approve:1:8ffbf3b8-75da-11f1-a595-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "contract_approve",
    "NAME_": "合同审核",
    "KEY_": "contract_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "8fa8f1b5-75da-11f1-a595-00155dd68500",
    "RESOURCE_NAME_": "contract_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "contract_approve.contract_approve.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "crm-invoice-audit:1:c101d3e0-0001-11f2-8a27-00155dad6485",
    "REV_": 1,
    "CATEGORY_": "crm_invoice_approve",
    "NAME_": "开票审批流程",
    "KEY_": "crm-invoice-audit",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "c101d3e0-0001-11f2-8a27-00155dad6485",
    "RESOURCE_NAME_": "crm-invoice-audit.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "crm-receivable-audit:1:7215184e-948c-11f1-9271-1ab6da3745b7",
    "REV_": 1,
    "CATEGORY_": "1111",
    "NAME_": "回款审批流程",
    "KEY_": "crm-receivable-audit",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "7215184e-948c-11f1-9271-1ab6da3745b7",
    "RESOURCE_NAME_": "crm-receivable-audit.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "equipment_receipt_approve:1:10000000000000000000000000000006",
    "REV_": 1,
    "CATEGORY_": "equipment_receipt_approve",
    "NAME_": "设备入库审批流程",
    "KEY_": "equipment_receipt_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "10000000000000000000000000000006",
    "RESOURCE_NAME_": "equipment_receipt_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "erp-finance-payment-audit:1:f1a1b2c3d4e5465f8a9b0c1d2e3f4a5b",
    "REV_": 1,
    "CATEGORY_": "erp_finance_payment_approve",
    "NAME_": "付款审批流程",
    "KEY_": "erp-finance-payment-audit",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "f1a1b2c3d4e5465f8a9b0c1d2e3f4a5b",
    "RESOURCE_NAME_": "erp-finance-payment-audit.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "erp-purchase-invoice-audit:1:0b7c7557949111f192711ab6da3745b7",
    "REV_": 1,
    "CATEGORY_": "erp_purchase_invoice_approve",
    "NAME_": "来票审批流程",
    "KEY_": "erp-purchase-invoice-audit",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "0b7c7557949111f192711ab6da3745b7",
    "RESOURCE_NAME_": "erp-purchase-invoice-audit.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "item_receipt_approve:1:10000000000000000000000000000004",
    "REV_": 1,
    "CATEGORY_": "item_receipt_approve",
    "NAME_": "采购入库审批流程",
    "KEY_": "item_receipt_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "10000000000000000000000000000004",
    "RESOURCE_NAME_": "item_receipt_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "mes-pd-project-audit:1:ce99813cfeb29f270355dd39f8ef74f2",
    "REV_": 1,
    "CATEGORY_": "mes_pd_project_approve",
    "NAME_": "产品项目审批流程",
    "KEY_": "mes-pd-project-audit",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "ce99813cfeb29f270355dd39f8ef74f2",
    "RESOURCE_NAME_": "mes-pd-project-audit.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": null,
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "misc_issue_approve:1:10000000000000000000000000000002",
    "REV_": 1,
    "CATEGORY_": "misc_issue_approve",
    "NAME_": "杂项出库审批流程",
    "KEY_": "misc_issue_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "10000000000000000000000000000002",
    "RESOURCE_NAME_": "misc_issue_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "misc_receipt_approve:1:10000000000000000000000000000001",
    "REV_": 1,
    "CATEGORY_": "misc_receipt_approve",
    "NAME_": "杂项入库审批流程",
    "KEY_": "misc_receipt_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "10000000000000000000000000000001",
    "RESOURCE_NAME_": "misc_receipt_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "performance_appraise_approve:1:performance-proc-20260820",
    "REV_": 1,
    "CATEGORY_": "performance_appraise_approve",
    "NAME_": "绩效考核审批",
    "KEY_": "performance_appraise_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "performance-deploy-20260820",
    "RESOURCE_NAME_": "performance_appraise_approve.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": null,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "purchase_approve:1:77c35552-74f7-11f1-b46c-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "purchase_approve",
    "NAME_": "采购审核",
    "KEY_": "purchase_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "777471ff-74f7-11f1-b46c-00155dd68500",
    "RESOURCE_NAME_": "purchase_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "purchase_approve.purchase_approve.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "purchase_plan_approve:1:pp-proc-20260818",
    "REV_": 1,
    "CATEGORY_": "purchase_plan_approve",
    "NAME_": "采购计划审核",
    "KEY_": "purchase_plan_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "pp-deploy-20260818",
    "RESOURCE_NAME_": "purchase_plan_approve.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "purchase_request_approve:1:6dc60acd-74f9-11f1-91b4-00155dd68500",
    "REV_": 3,
    "CATEGORY_": "purchase_request_approve",
    "NAME_": "采购审核",
    "KEY_": "purchase_request_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "6dae8b2a-74f9-11f1-91b4-00155dd68500",
    "RESOURCE_NAME_": "purchase_request_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "purchase_request_approve.purchase_request_approve.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 2,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "purchase_request_approve:2:fb19b301-74f9-11f1-91b4-00155dd68500",
    "REV_": 5,
    "CATEGORY_": "purchase_request_approve",
    "NAME_": "采购审核",
    "KEY_": "purchase_request_approve",
    "VERSION_": 2,
    "DEPLOYMENT_ID_": "fb13987e-74f9-11f1-91b4-00155dd68500",
    "RESOURCE_NAME_": "purchase_request_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "purchase_request_approve.purchase_request_approve.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 2,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "purchase_request_approve:3:d239e27d-74fe-11f1-9120-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "purchase_request_approve",
    "NAME_": "采购审核",
    "KEY_": "purchase_request_approve",
    "VERSION_": 3,
    "DEPLOYMENT_ID_": "d232b68a-74fe-11f1-9120-00155dd68500",
    "RESOURCE_NAME_": "purchase_request_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "purchase_request_approve.purchase_request_approve.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "pus:1:c79629a3-7462-11f1-b91b-00155dd68500",
    "REV_": 2,
    "CATEGORY_": "采购审核",
    "NAME_": "采购审核",
    "KEY_": "pus",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "c75fb050-7462-11f1-b91b-00155dd68500",
    "RESOURCE_NAME_": "pus.bpmn",
    "DGRM_RESOURCE_NAME_": "pus.pus.png",
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 1,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "refund_approve:1:refund-proc-20260820",
    "REV_": 1,
    "CATEGORY_": "refund_approve",
    "NAME_": "退费审批",
    "KEY_": "refund_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "refund-deploy-20260820",
    "RESOURCE_NAME_": "refund_approve.bpmn",
    "DGRM_RESOURCE_NAME_": null,
    "DESCRIPTION_": null,
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": null,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": null,
    "DERIVED_FROM_ROOT_": null,
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "return_vendor_approve:1:10000000000000000000000000000003",
    "REV_": 1,
    "CATEGORY_": "return_vendor_approve",
    "NAME_": "供应商退货审批流程",
    "KEY_": "return_vendor_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "10000000000000000000000000000003",
    "RESOURCE_NAME_": "return_vendor_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   },
   {
    "ID_": "stock_taking_result_approve:1:10000000000000000000000000000005",
    "REV_": 1,
    "CATEGORY_": "stock_taking_result_approve",
    "NAME_": "盘点结果审批流程",
    "KEY_": "stock_taking_result_approve",
    "VERSION_": 1,
    "DEPLOYMENT_ID_": "10000000000000000000000000000005",
    "RESOURCE_NAME_": "stock_taking_result_approve.bpmn",
    "DGRM_RESOURCE_NAME_": "",
    "DESCRIPTION_": "",
    "HAS_START_FORM_KEY_": 0,
    "HAS_GRAPHICAL_NOTATION_": 0,
    "SUSPENSION_STATE_": 1,
    "TENANT_ID_": "",
    "ENGINE_VERSION_": null,
    "DERIVED_FROM_": "",
    "DERIVED_FROM_ROOT_": "",
    "DERIVED_VERSION_": 0
   }
  ]
 },
 {
  "table": "bpm_process_definition_info",
  "columns": [
   "id",
   "process_definition_id",
   "model_id",
   "model_type",
   "category",
   "icon",
   "description",
   "form_type",
   "form_id",
   "form_conf",
   "form_fields",
   "form_custom_create_path",
   "form_custom_view_path",
   "simple_model",
   "visible",
   "sort",
   "start_user_ids",
   "start_dept_ids",
   "manager_user_ids",
   "allow_cancel_running_process",
   "allow_withdraw_task",
   "process_id_rule",
   "auto_approval_type",
   "title_setting",
   "summary_setting",
   "process_before_trigger_setting",
   "process_after_trigger_setting",
   "task_before_trigger_setting",
   "task_after_trigger_setting",
   "print_template_setting",
   "creator",
   "create_time",
   "updater",
   "update_time",
   "deleted"
  ],
  "rows": [
   {
    "id": 1,
    "process_definition_id": "Ada:1:6cc05e1b-6edd-11f1-af1d-00155dd68500",
    "model_id": "da144d65-6edc-11f1-af1d-00155dd68500",
    "model_type": 20,
    "category": "分类1",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"输入框\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"input\\\"}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"输入框\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"input\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"输入框\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"输入框\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782203025576,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-20T14:00:00",
    "updater": "234",
    "update_time": "2026-09-20T14:13:00",
    "deleted": "\u0000"
   },
   {
    "id": 2,
    "process_definition_id": "Ada:2:a332d068-6edd-11f1-af1d-00155dd68500",
    "model_id": "da144d65-6edc-11f1-af1d-00155dd68500",
    "model_type": 20,
    "category": "分类1",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"输入框\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"输入框\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782203025576,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-22T19:00:00",
    "updater": "234",
    "update_time": "2026-09-22T19:26:00",
    "deleted": "\u0000"
   },
   {
    "id": 3,
    "process_definition_id": "pus:1:c79629a3-7462-11f1-b91b-00155dd68500",
    "model_id": "8c640c7d-7462-11f1-b91b-00155dd68500",
    "model_type": 20,
    "category": "采购审核",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782810203613,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "142",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-25T00:00:00",
    "updater": "234",
    "update_time": "2026-09-25T00:39:00",
    "deleted": "\u0000"
   },
   {
    "id": 4,
    "process_definition_id": "purchase_approve:1:77c35552-74f7-11f1-b46c-00155dd68500",
    "model_id": "654ec11c-74f7-11f1-b46c-00155dd68500",
    "model_type": 20,
    "category": "purchase_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782874133055,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "142",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-27T05:00:00",
    "updater": "234",
    "update_time": "2026-09-27T05:52:00",
    "deleted": "\u0000"
   },
   {
    "id": 5,
    "process_definition_id": "purchase_request_approve:1:6dc60acd-74f9-11f1-91b4-00155dd68500",
    "model_id": "5ddab987-74f9-11f1-91b4-00155dd68500",
    "model_type": 20,
    "category": "purchase_request_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782874979545,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "142",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-29T10:00:00",
    "updater": "234",
    "update_time": "2026-09-29T11:05:00",
    "deleted": "\u0000"
   },
   {
    "id": 6,
    "process_definition_id": "purchase_request_approve:2:fb19b301-74f9-11f1-91b4-00155dd68500",
    "model_id": "5ddab987-74f9-11f1-91b4-00155dd68500",
    "model_type": 20,
    "category": "purchase_request_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782874979545,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "142",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-01T15:00:00",
    "updater": "234",
    "update_time": "2026-10-01T16:18:00",
    "deleted": "\u0000"
   },
   {
    "id": 7,
    "process_definition_id": "SSQ:1:a0be69b7-74fc-11f1-9120-00155dd68500",
    "model_id": "2f78f7ad-7384-11f1-aa00-00155dd68500",
    "model_type": 20,
    "category": "分类1",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"1\",\"candidateStrategy\":30,\"childNode\":{\"candidateParam\":\"1,100\",\"candidateStrategy\":30,\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"1\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"1\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"1\"}],\"id\":\"Activity__26062290711782714719270\",\"name\":\"抄送人\",\"showText\":\"指定成员:芋道源码,芋道\",\"type\":12},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"1\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"1\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"1\"}],\"id\":\"Activity__79685282811782876364872\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:芋道源码\",\"signEnable\":false,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782714699450,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-03T20:00:00",
    "updater": "234",
    "update_time": "2026-10-03T21:31:00",
    "deleted": "\u0000"
   },
   {
    "id": 8,
    "process_definition_id": "purchase_request_approve:3:d239e27d-74fe-11f1-9120-00155dd68500",
    "model_id": "5ddab987-74f9-11f1-91b4-00155dd68500",
    "model_type": 20,
    "category": "purchase_request_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"142\",\"candidateStrategy\":30,\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"1\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"1\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"1\"}],\"id\":\"Activity__69663778421782877292716\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:test01\",\"signEnable\":false,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782874979545,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "142",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-06T01:00:00",
    "updater": "234",
    "update_time": "2026-10-06T02:44:00",
    "deleted": "\u0000"
   },
   {
    "id": 9,
    "process_definition_id": "caigoushenpi:1:df929079-7500-11f1-993f-00155dd68500",
    "model_id": "bc6f3048-74fc-11f1-9120-00155dd68500",
    "model_type": 20,
    "category": "purchase_request_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782876426717,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "144,142,113,1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-08T06:00:00",
    "updater": "234",
    "update_time": "2026-10-08T07:57:00",
    "deleted": "\u0000"
   },
   {
    "id": 10,
    "process_definition_id": "contract_approve:1:8ffbf3b8-75da-11f1-a595-00155dd68500",
    "model_id": "8d859c82-75da-11f1-a595-00155dd68500",
    "model_type": 20,
    "category": "contract_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"select\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782971696280,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "142",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-10T11:00:00",
    "updater": "234",
    "update_time": "2026-10-10T13:10:00",
    "deleted": "\u0000"
   },
   {
    "id": 11,
    "process_definition_id": "b000_abc.:1:a470b6a7-7a92-11f1-9ea7-00155dd68500",
    "model_id": "dd36f951-7a91-11f1-9ea7-00155dd68500",
    "model_type": 20,
    "category": "分类2",
    "icon": null,
    "description": "12312",
    "form_type": 10,
    "form_id": 2,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"DeptSelect\\\",\\\"field\\\":\\\"ce674cb3f7604c5da893b347bf1ff855\\\",\\\"title\\\":\\\"部门选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"returnType\\\":\\\"id\\\",\\\"defaultCurrentDept\\\":false},\\\"_fc_id\\\":\\\"id_Fgcgmrbnv9c4cbc\\\",\\\"name\\\":\\\"ref_F7c0mrbnv9c4ccc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"DeptSelect\\\"}\", \"{\\\"type\\\":\\\"UserSelect\\\",\\\"field\\\":\\\"6ada8f47c5ad483ca7e2a15da2d922d1\\\",\\\"title\\\":\\\"用户选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"defaultCurrentUser\\\":false},\\\"_fc_id\\\":\\\"id_F0pdmrbnvboxcdc\\\",\\\"name\\\":\\\"ref_F6pamrbnvboxcec\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"UserSelect\\\"}\", \"{\\\"type\\\":\\\"timePicker\\\",\\\"field\\\":\\\"Fn60mrbnvny3clc\\\",\\\"title\\\":\\\"时间区间\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"range\\\":true},\\\"_fc_id\\\":\\\"id_Fwsymrbnvny3cmc\\\",\\\"name\\\":\\\"ref_Fu44mrbnvny3cnc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"timeRange\\\"}\", \"{\\\"type\\\":\\\"fcEditor\\\",\\\"field\\\":\\\"F7a8mrbnxj65cuc\\\",\\\"title\\\":\\\"富文本框\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fsz6mrbnxj65cvc\\\",\\\"name\\\":\\\"ref_Fqqwmrbnxj65cwc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"fcEditor\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"104\",\"candidateStrategy\":30,\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fn60mrbnvny3clc\",\"title\":\"时间区间\",\"permission\":\"1\"},{\"field\":\"F7a8mrbnxj65cuc\",\"title\":\"富文本框\",\"permission\":\"1\"}],\"id\":\"Activity__34944553111783490267007\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:测试号\",\"signEnable\":true,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"2\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"2\"},{\"field\":\"Fn60mrbnvny3clc\",\"title\":\"时间区间\",\"permission\":\"2\"},{\"field\":\"F7a8mrbnxj65cuc\",\"title\":\"富文本框\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1783490232541,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"<p style=\\\"text-align: center;font-size: 1.25rem;\\\"><strong><span data-w-e-type=\\\"mention\\\" data-value=\\\"流程名称\\\" data-info=\\\"%7B%22id%22%3A%22processName%22%7D\\\">@流程名称</span></strong></p>\\n<p style=\\\"text-align: right;\\\">打印人员:<span data-w-e-type=\\\"mention\\\" data-info=\\\"%7B%22id%22%3A%22printUser%22%7D\\\">@打印人</span></p>\\n<p style=\\\"text-align: left;\\\">流程编号:<span data-w-e-type=\\\"mention\\\" data-value=\\\"流程编号\\\" data-info=\\\"%7B%22id%22%3A%22processNum%22%7D\\\">@流程编号</span></p>\\n<p>&nbsp;</p>\\n<table style=\\\"width: 100%; height: 72.2159px;\\\">\\n<tbody>\\n<tr style=\\\"height: 36.108px;\\\">\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">发起人</td>\\n<td style=\\\"width: 30.5551%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"发起人\\\" data-info=\\\"%7B%22id%22%3A%22startUser%22%7D\\\">@发起人</span></td>\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">发起时间</td>\\n<td style=\\\"width: 26.0284%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"发起时间\\\" data-info=\\\"%7B%22id%22%3A%22startTime%22%7D\\\">@发起时间</span></td>\\n</tr>\\n<tr style=\\\"height: 36.108px;\\\">\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">所属部门</td>\\n<td style=\\\"width: 30.5551%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-w-e-is-void=\\\"\\\" data-w-e-is-inline=\\\"\\\" data-value=\\\"发起人部门\\\" data-info=\\\"%7B%22id%22%3A%22startUserDept%22%7D\\\">@发起人部门</span></td>\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">流程状态</td>\\n<td style=\\\"width: 26.0284%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"流程状态\\\" data-info=\\\"%7B%22id%22%3A%22processStatus%22%7D\\\">@流程状态</span></td>\\n</tr>\\n</tbody>\\n</table>\\n<p>&nbsp;</p>\\n<div contenteditable=\\\"false\\\" data-w-e-type=\\\"process-record\\\" data-w-e-is-void=\\\"\\\">\\n<table class=\\\"process-record-table\\\" style=\\\"width: 100%; border-collapse: collapse; border: 1px solid;\\\">\\n<tr>\\n\\t<td style=\\\"width: 100%; border: 1px solid; text-align: center;\\\" colspan=\\\"2\\\">流程记录</td>\\n</tr>\\n<tr>\\n\\t<td style=\\\"width: 25%; border: 1px solid;\\\">节点</td>\\n\\t<td style=\\\"width: 75%; border: 1px solid;\\\">操作</td>\\n</tr>\\n</table>\\n</div>\\n<p>&nbsp;</p>\"}",
    "creator": "234",
    "create_time": "2026-09-18T12:00:00",
    "updater": "234",
    "update_time": "2026-09-18T14:23:00",
    "deleted": "\u0000"
   },
   {
    "id": 12,
    "process_definition_id": "b000_abc.:2:5e6b7e39-7a93-11f1-9ea7-00155dd68500",
    "model_id": "dd36f951-7a91-11f1-9ea7-00155dd68500",
    "model_type": 20,
    "category": "分类2",
    "icon": null,
    "description": "12312",
    "form_type": 10,
    "form_id": 2,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"DeptSelect\\\",\\\"field\\\":\\\"ce674cb3f7604c5da893b347bf1ff855\\\",\\\"title\\\":\\\"部门选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"returnType\\\":\\\"id\\\",\\\"defaultCurrentDept\\\":false},\\\"_fc_id\\\":\\\"id_Fgcgmrbnv9c4cbc\\\",\\\"name\\\":\\\"ref_F7c0mrbnv9c4ccc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"DeptSelect\\\"}\", \"{\\\"type\\\":\\\"UserSelect\\\",\\\"field\\\":\\\"6ada8f47c5ad483ca7e2a15da2d922d1\\\",\\\"title\\\":\\\"用户选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"defaultCurrentUser\\\":false},\\\"_fc_id\\\":\\\"id_F0pdmrbnvboxcdc\\\",\\\"name\\\":\\\"ref_F6pamrbnvboxcec\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"UserSelect\\\"}\", \"{\\\"type\\\":\\\"timePicker\\\",\\\"field\\\":\\\"Fn60mrbnvny3clc\\\",\\\"title\\\":\\\"时间区间\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"range\\\":true},\\\"_fc_id\\\":\\\"id_Fwsymrbnvny3cmc\\\",\\\"name\\\":\\\"ref_Fu44mrbnvny3cnc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"timeRange\\\"}\", \"{\\\"type\\\":\\\"fcEditor\\\",\\\"field\\\":\\\"F7a8mrbnxj65cuc\\\",\\\"title\\\":\\\"富文本框\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fsz6mrbnxj65cvc\\\",\\\"name\\\":\\\"ref_Fqqwmrbnxj65cwc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"fcEditor\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"1\",\"candidateStrategy\":30,\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fn60mrbnvny3clc\",\"title\":\"时间区间\",\"permission\":\"1\"},{\"field\":\"F7a8mrbnxj65cuc\",\"title\":\"富文本框\",\"permission\":\"1\"}],\"id\":\"Activity__34944553111783490267007\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:芋道源码\",\"signEnable\":true,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"2\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"2\"},{\"field\":\"Fn60mrbnvny3clc\",\"title\":\"时间区间\",\"permission\":\"2\"},{\"field\":\"F7a8mrbnxj65cuc\",\"title\":\"富文本框\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1783490232541,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"<p style=\\\"text-align: center;font-size: 1.25rem;\\\"><strong><span data-w-e-type=\\\"mention\\\" data-value=\\\"流程名称\\\" data-info=\\\"%7B%22id%22%3A%22processName%22%7D\\\">@流程名称</span></strong></p>\\n<p style=\\\"text-align: right;\\\">打印人员:<span data-w-e-type=\\\"mention\\\" data-info=\\\"%7B%22id%22%3A%22printUser%22%7D\\\">@打印人</span></p>\\n<p style=\\\"text-align: left;\\\">流程编号:<span data-w-e-type=\\\"mention\\\" data-value=\\\"流程编号\\\" data-info=\\\"%7B%22id%22%3A%22processNum%22%7D\\\">@流程编号</span></p>\\n<p>&nbsp;</p>\\n<table style=\\\"width: 100%; height: 72.2159px;\\\">\\n<tbody>\\n<tr style=\\\"height: 36.108px;\\\">\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">发起人</td>\\n<td style=\\\"width: 30.5551%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"发起人\\\" data-info=\\\"%7B%22id%22%3A%22startUser%22%7D\\\">@发起人</span></td>\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">发起时间</td>\\n<td style=\\\"width: 26.0284%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"发起时间\\\" data-info=\\\"%7B%22id%22%3A%22startTime%22%7D\\\">@发起时间</span></td>\\n</tr>\\n<tr style=\\\"height: 36.108px;\\\">\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">所属部门</td>\\n<td style=\\\"width: 30.5551%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-w-e-is-void=\\\"\\\" data-w-e-is-inline=\\\"\\\" data-value=\\\"发起人部门\\\" data-info=\\\"%7B%22id%22%3A%22startUserDept%22%7D\\\">@发起人部门</span></td>\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">流程状态</td>\\n<td style=\\\"width: 26.0284%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"流程状态\\\" data-info=\\\"%7B%22id%22%3A%22processStatus%22%7D\\\">@流程状态</span></td>\\n</tr>\\n</tbody>\\n</table>\\n<p>&nbsp;</p>\\n<div contenteditable=\\\"false\\\" data-w-e-type=\\\"process-record\\\" data-w-e-is-void=\\\"\\\">\\n<table class=\\\"process-record-table\\\" style=\\\"width: 100%; border-collapse: collapse; border: 1px solid;\\\">\\n<tr>\\n\\t<td style=\\\"width: 100%; border: 1px solid; text-align: center;\\\" colspan=\\\"2\\\">流程记录</td>\\n</tr>\\n<tr>\\n\\t<td style=\\\"width: 25%; border: 1px solid;\\\">节点</td>\\n\\t<td style=\\\"width: 75%; border: 1px solid;\\\">操作</td>\\n</tr>\\n</table>\\n</div>\\n<p>&nbsp;</p>\"}",
    "creator": "234",
    "create_time": "2026-09-20T17:00:00",
    "updater": "234",
    "update_time": "2026-09-20T19:36:00",
    "deleted": "\u0000"
   },
   {
    "id": 13,
    "process_definition_id": "QWEDD:1:0d177596-83e0-11f1-b998-00155dd68500",
    "model_id": "fe979b30-83df-11f1-b998-00155dd68500",
    "model_type": 20,
    "category": "sale_quotation_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"_fc_drag_tag\\\":\\\"select\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"ApiSelect\\\",\\\"field\\\":\\\"dc4b501620bb4c8184aaaeb66398324a\\\",\\\"title\\\":\\\"接口选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"method\\\":\\\"GET\\\"},\\\"_fc_id\\\":\\\"id_F6ewmrbn96xdc3c\\\",\\\"name\\\":\\\"ref_F1jomrbn96xdc4c\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"ApiSelect\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1784513349741,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-22T22:00:00",
    "updater": "234",
    "update_time": "2026-09-23T00:49:00",
    "deleted": "\u0000"
   },
   {
    "id": 14,
    "process_definition_id": "b000_abc.:3:d8fca27c-8af2-11f1-a171-b025aaa35411",
    "model_id": "dd36f951-7a91-11f1-9ea7-00155dd68500",
    "model_type": 20,
    "category": "分类2",
    "icon": null,
    "description": "12312",
    "form_type": 10,
    "form_id": 2,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"DeptSelect\\\",\\\"field\\\":\\\"ce674cb3f7604c5da893b347bf1ff855\\\",\\\"title\\\":\\\"部门选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"props\\\":{\\\"returnType\\\":\\\"id\\\",\\\"defaultCurrentDept\\\":false},\\\"_fc_id\\\":\\\"id_Fgcgmrbnv9c4cbc\\\",\\\"name\\\":\\\"ref_F7c0mrbnv9c4ccc\\\",\\\"_fc_drag_tag\\\":\\\"DeptSelect\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"UserSelect\\\",\\\"field\\\":\\\"6ada8f47c5ad483ca7e2a15da2d922d1\\\",\\\"title\\\":\\\"用户选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"props\\\":{\\\"defaultCurrentUser\\\":false},\\\"_fc_id\\\":\\\"id_F0pdmrbnvboxcdc\\\",\\\"name\\\":\\\"ref_F6pamrbnvboxcec\\\",\\\"_fc_drag_tag\\\":\\\"UserSelect\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"datePicker\\\",\\\"field\\\":\\\"Fio0ms5fmwwnabc\\\",\\\"title\\\":\\\"开始日期\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"props\\\":{\\\"showTime\\\":true},\\\"_fc_id\\\":\\\"id_F28vms5fmwwnacc\\\",\\\"name\\\":\\\"ref_Fhufms5fmwwnadc\\\",\\\"_fc_drag_tag\\\":\\\"datePicker\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"datePicker\\\",\\\"field\\\":\\\"Fpn0ms5fmyb4aec\\\",\\\"title\\\":\\\"结束日期\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"props\\\":{\\\"showTime\\\":true},\\\"_fc_id\\\":\\\"id_Fxrgms5fmyb4afc\\\",\\\"name\\\":\\\"ref_Fffoms5fmyb4agc\\\",\\\"_fc_drag_tag\\\":\\\"datePicker\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"inputNumber\\\",\\\"field\\\":\\\"F3n6ms5fwzqaaqc\\\",\\\"title\\\":\\\"请假天数\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"props\\\":{\\\"min\\\":1},\\\"_fc_id\\\":\\\"id_Fas0ms5fwzqbarc\\\",\\\"name\\\":\\\"ref_Fz1mms5fwzqbasc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"inputNumber\\\"}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"F1noms5fo0j5ahc\\\",\\\"title\\\":\\\"请假事由\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"_fc_id\\\":\\\"id_Fybxms5fo0j5aic\\\",\\\"name\\\":\\\"ref_Fcv7ms5fo0j5ajc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"childNode\":{\"candidateParam\":\"1\",\"candidateStrategy\":30,\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fio0ms5fmwwnabc\",\"title\":\"开始日期\",\"permission\":\"1\"},{\"field\":\"Fpn0ms5fmyb4aec\",\"title\":\"结束日期\",\"permission\":\"1\"},{\"field\":\"F3n6ms5fwzqaaqc\",\"title\":\"请假天数\",\"permission\":\"1\"},{\"field\":\"F1noms5fo0j5ahc\",\"title\":\"请假事由\",\"permission\":\"1\"}],\"id\":\"Activity__319174640311785291090220\",\"name\":\"抄送人\",\"showText\":\"指定成员:芋道源码\",\"type\":12},\"conditionNodes\":[{\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"1\",\"candidateStrategy\":30,\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fio0ms5fmwwnabc\",\"title\":\"开始日期\",\"permission\":\"1\"},{\"field\":\"Fpn0ms5fmyb4aec\",\"title\":\"结束日期\",\"permission\":\"1\"},{\"field\":\"F3n6ms5fwzqaaqc\",\"title\":\"请假天数\",\"permission\":\"1\"},{\"field\":\"F1noms5fo0j5ahc\",\"title\":\"请假事由\",\"permission\":\"1\"}],\"id\":\"Activity__955878144241785290843199\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:芋道源码\",\"signEnable\":false,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"conditionSetting\":{\"conditionExpression\":null,\"conditionGroups\":{\"and\":true,\"conditions\":[{\"and\":true,\"rules\":[{\"leftSide\":\"F3n6ms5fwzqaaqc\",\"opCode\":\"==\",\"rightSide\":\"1\"}]}]},\"conditionType\":2,\"defaultFlow\":false},\"id\":\"Flow__965754828211785290789379\",\"name\":\"条件1\",\"showText\":\"(请假天数 ç­‰äºŽ 1 ) \",\"type\":50},{\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"1\",\"candidateStrategy\":30,\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fio0ms5fmwwnabc\",\"title\":\"开始日期\",\"permission\":\"1\"},{\"field\":\"Fpn0ms5fmyb4aec\",\"title\":\"结束日期\",\"permission\":\"1\"},{\"field\":\"F3n6ms5fwzqaaqc\",\"title\":\"请假天数\",\"permission\":\"1\"},{\"field\":\"F1noms5fo0j5ahc\",\"title\":\"请假事由\",\"permission\":\"1\"}],\"id\":\"Activity__699432637251785290845398\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:芋道源码\",\"signEnable\":false,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"conditionNodes\":[],\"conditionSetting\":{\"conditionExpression\":null,\"conditionGroups\":{\"and\":true,\"conditions\":[{\"and\":true,\"rules\":[{\"leftSide\":\"F3n6ms5fwzqaaqc\",\"opCode\":\">\",\"rightSide\":\"1\"},{\"leftSide\":\"F3n6ms5fwzqaaqc\",\"opCode\":\"<=\",\"rightSide\":\"3\"}]}]},\"conditionType\":2,\"defaultFlow\":false},\"id\":\"Flow__967637497231785290793938\",\"name\":\"条件2\",\"showText\":\"(请假天数 å¤§äºŽ 1 ä¸” è¯·å‡å¤©æ•° å°äºŽç­‰äºŽ 3 ) \",\"type\":50},{\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"1\",\"candidateStrategy\":30,\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fio0ms5fmwwnabc\",\"title\":\"开始日期\",\"permission\":\"1\"},{\"field\":\"Fpn0ms5fmyb4aec\",\"title\":\"结束日期\",\"permission\":\"1\"},{\"field\":\"F3n6ms5fwzqaaqc\",\"title\":\"请假天数\",\"permission\":\"1\"},{\"field\":\"F1noms5fo0j5ahc\",\"title\":\"请假事由\",\"permission\":\"1\"}],\"id\":\"Activity__608645122271785291003461\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:芋道源码\",\"signEnable\":false,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"conditionNodes\":[],\"conditionSetting\":{\"conditionExpression\":null,\"conditionGroups\":{\"and\":true,\"conditions\":[{\"and\":true,\"rules\":[{\"leftSide\":\"F3n6ms5fwzqaaqc\",\"opCode\":\">\",\"rightSide\":\"3\"},{\"leftSide\":\"F3n6ms5fwzqaaqc\",\"opCode\":\"<=\",\"rightSide\":\"5\"}]}]},\"conditionType\":2,\"defaultFlow\":false},\"id\":\"Flow__850184584261785290886671\",\"name\":\"条件3\",\"showText\":\"(请假天数 å¤§äºŽ 3 ä¸” è¯·å‡å¤©æ•° å°äºŽç­‰äºŽ 5 ) \",\"type\":50},{\"childNode\":{\"approveMethod\":4,\"approveType\":1,\"assignEmptyHandler\":{\"type\":1,\"userIds\":null},\"assignStartUserHandlerType\":1,\"buttonsSetting\":[{\"displayName\":\"通过\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":true,\"id\":2},{\"displayName\":\"转办\",\"enable\":true,\"id\":3},{\"displayName\":\"委派\",\"enable\":true,\"id\":4},{\"displayName\":\"加签\",\"enable\":true,\"id\":5},{\"displayName\":\"退回\",\"enable\":true,\"id\":6}],\"candidateParam\":\"1\",\"candidateStrategy\":30,\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"1\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"1\"},{\"field\":\"Fio0ms5fmwwnabc\",\"title\":\"开始日期\",\"permission\":\"1\"},{\"field\":\"Fpn0ms5fmyb4aec\",\"title\":\"结束日期\",\"permission\":\"1\"},{\"field\":\"F3n6ms5fwzqaaqc\",\"title\":\"请假天数\",\"permission\":\"1\"},{\"field\":\"F1noms5fo0j5ahc\",\"title\":\"请假事由\",\"permission\":\"1\"}],\"id\":\"Activity__708894643281785291071437\",\"name\":\"审批人\",\"reasonRequire\":false,\"rejectHandler\":{\"returnNodeId\":null,\"type\":1},\"showText\":\"指定成员:芋道源码\",\"signEnable\":false,\"skipExpression\":\"\",\"taskAssignListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCompleteListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"taskCreateListener\":{\"body\":[],\"enable\":false,\"header\":[],\"path\":null},\"timeoutHandler\":{\"enable\":false,\"maxRemindCount\":null,\"timeDuration\":null,\"type\":null},\"type\":11},\"conditionSetting\":{\"conditionExpression\":null,\"conditionGroups\":null,\"conditionType\":null,\"defaultFlow\":true},\"id\":\"Flow__506655395221785290789379\",\"name\":\"其它情况\",\"showText\":\"未满足其它条件时,将进入此分支\",\"type\":50}],\"id\":\"GateWay__872184957201785290789379\",\"name\":\"条件分支\",\"type\":51},\"fieldsPermission\":[{\"field\":\"ce674cb3f7604c5da893b347bf1ff855\",\"title\":\"部门选择器\",\"permission\":\"2\"},{\"field\":\"6ada8f47c5ad483ca7e2a15da2d922d1\",\"title\":\"用户选择器\",\"permission\":\"2\"},{\"field\":\"Fn60mrbnvny3clc\",\"title\":\"时间区间\",\"permission\":\"2\"},{\"field\":\"F7a8mrbnxj65cuc\",\"title\":\"富文本框\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1783490232541,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"<p style=\\\"text-align: center;font-size: 1.25rem;\\\"><strong><span data-w-e-type=\\\"mention\\\" data-value=\\\"流程名称\\\" data-info=\\\"%7B%22id%22%3A%22processName%22%7D\\\">@流程名称</span></strong></p>\\n<p style=\\\"text-align: right;\\\">打印人员:<span data-w-e-type=\\\"mention\\\" data-info=\\\"%7B%22id%22%3A%22printUser%22%7D\\\">@打印人</span></p>\\n<p style=\\\"text-align: left;\\\">流程编号:<span data-w-e-type=\\\"mention\\\" data-value=\\\"流程编号\\\" data-info=\\\"%7B%22id%22%3A%22processNum%22%7D\\\">@流程编号</span></p>\\n<p>&nbsp;</p>\\n<table style=\\\"width: 100%; height: 72.2159px;\\\">\\n<tbody>\\n<tr style=\\\"height: 36.108px;\\\">\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">发起人</td>\\n<td style=\\\"width: 30.5551%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"发起人\\\" data-info=\\\"%7B%22id%22%3A%22startUser%22%7D\\\">@发起人</span></td>\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">发起时间</td>\\n<td style=\\\"width: 26.0284%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"发起时间\\\" data-info=\\\"%7B%22id%22%3A%22startTime%22%7D\\\">@发起时间</span></td>\\n</tr>\\n<tr style=\\\"height: 36.108px;\\\">\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">所属部门</td>\\n<td style=\\\"width: 30.5551%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-w-e-is-void=\\\"\\\" data-w-e-is-inline=\\\"\\\" data-value=\\\"发起人部门\\\" data-info=\\\"%7B%22id%22%3A%22startUserDept%22%7D\\\">@发起人部门</span></td>\\n<td style=\\\"width: 21.7532%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\">流程状态</td>\\n<td style=\\\"width: 26.0284%; border: 1px solid;\\\" colspan=\\\"1\\\" rowspan=\\\"1\\\" width=\\\"auto\\\"><span data-w-e-type=\\\"mention\\\" data-value=\\\"流程状态\\\" data-info=\\\"%7B%22id%22%3A%22processStatus%22%7D\\\">@流程状态</span></td>\\n</tr>\\n</tbody>\\n</table>\\n<p>&nbsp;</p>\\n<div contenteditable=\\\"false\\\" data-w-e-type=\\\"process-record\\\" data-w-e-is-void=\\\"\\\">\\n<table class=\\\"process-record-table\\\" style=\\\"width: 100%; border-collapse: collapse; border: 1px solid;\\\">\\n<tr>\\n\\t<td style=\\\"width: 100%; border: 1px solid; text-align: center;\\\" colspan=\\\"2\\\">流程记录</td>\\n</tr>\\n<tr>\\n\\t<td style=\\\"width: 25%; border: 1px solid;\\\">节点</td>\\n\\t<td style=\\\"width: 75%; border: 1px solid;\\\">操作</td>\\n</tr>\\n</table>\\n</div>\\n<p>&nbsp;</p>\"}",
    "creator": "234",
    "create_time": "2026-09-25T03:00:00",
    "updater": "234",
    "update_time": "2026-09-25T06:02:00",
    "deleted": "\u0000"
   },
   {
    "id": 15,
    "process_definition_id": "crm-receivable-audit:1:7215184e-948c-11f1-9271-1ab6da3745b7",
    "model_id": "23afd50c-8c89-11f1-8a27-00155dad6485",
    "model_type": 10,
    "category": "1111",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"_fc_drag_tag\\\":\\\"select\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"ApiSelect\\\",\\\"field\\\":\\\"dc4b501620bb4c8184aaaeb66398324a\\\",\\\"title\\\":\\\"接口选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"method\\\":\\\"GET\\\"},\\\"_fc_id\\\":\\\"id_F6ewmrbn96xdc3c\\\",\\\"name\\\":\\\"ref_F1jomrbn96xdc4c\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"ApiSelect\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606228,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-27T08:00:00",
    "updater": "234",
    "update_time": "2026-09-27T11:15:00",
    "deleted": "\u0000"
   },
   {
    "id": 16,
    "process_definition_id": "crm-invoice-audit:1:c101d3e0-0001-11f2-8a27-00155dad6485",
    "model_id": "c101d3e2-0001-11f2-8a27-00155dad6485",
    "model_type": 10,
    "category": "crm_invoice_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"_fc_drag_tag\\\":\\\"select\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"ApiSelect\\\",\\\"field\\\":\\\"dc4b501620bb4c8184aaaeb66398324a\\\",\\\"title\\\":\\\"接口选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"method\\\":\\\"GET\\\"},\\\"_fc_id\\\":\\\"id_F6ewmrbn96xdc3c\\\",\\\"name\\\":\\\"ref_F1jomrbn96xdc4c\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"ApiSelect\\\"}\"]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606228,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-09-29T13:00:00",
    "updater": "234",
    "update_time": "2026-09-29T16:28:00",
    "deleted": "\u0000"
   },
   {
    "id": 17,
    "process_definition_id": "erp-purchase-invoice-audit:1:0b7c7557949111f192711ab6da3745b7",
    "model_id": "0b7c7577949111f192711ab6da3745b7",
    "model_type": 10,
    "category": "erp_purchase_invoice_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"_fc_drag_tag\\\":\\\"select\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"ApiSelect\\\",\\\"field\\\":\\\"dc4b501620bb4c8184aaaeb66398324a\\\",\\\"title\\\":\\\"接口选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"method\\\":\\\"GET\\\"},\\\"_fc_id\\\":\\\"id_F6ewmrbn96xdc3c\\\",\\\"name\\\":\\\"ref_F1jomrbn96xdc4c\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"ApiSelect\\\"}\"]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606228,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-10-01T18:00:00",
    "updater": "234",
    "update_time": "2026-10-01T21:41:00",
    "deleted": "\u0000"
   },
   {
    "id": 18,
    "process_definition_id": "erp-finance-payment-audit:1:f1a1b2c3d4e5465f8a9b0c1d2e3f4a5b",
    "model_id": "f1a1b2c3d4e5465f8a9b0c1d2e3f4a5c",
    "model_type": 10,
    "category": "erp_finance_payment_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": null,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606228,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": null,
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-10-03T23:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 19,
    "process_definition_id": "mes-pd-project-audit:1:ce99813cfeb29f270355dd39f8ef74f2",
    "model_id": "44318b176050e94d2c4a86595763dde8",
    "model_type": 10,
    "category": "mes_pd_project_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": null,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1786608755902,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": null,
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-10-06T04:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 20,
    "process_definition_id": "purchase_plan_approve:1:pp-proc-20260818",
    "model_id": "pp-model-20260818",
    "model_type": 20,
    "category": "purchase_plan_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1780000000000,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-08T09:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 21,
    "process_definition_id": "refund_approve:1:refund-proc-20260820",
    "model_id": "refund-model-20260820",
    "model_type": 20,
    "category": "refund_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1781000000000,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-10-10T14:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 22,
    "process_definition_id": "cancellation_approve:1:cancellation-proc-20260820",
    "model_id": "cancellation-model-20260820",
    "model_type": 20,
    "category": "cancellation_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1782000000000,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-18T15:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 23,
    "process_definition_id": "performance_appraise_approve:1:performance-proc-20260820",
    "model_id": "performance-model-20260820",
    "model_type": 20,
    "category": "performance_appraise_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1783000000000,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-20T20:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 24,
    "process_definition_id": "compensation_approve:1:compensation-proc-20260820",
    "model_id": "compensation-model-20260820",
    "model_type": 20,
    "category": "compensation_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": null,
    "form_fields": "[]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1784000000000,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "234",
    "create_time": "2026-09-23T01:00:00",
    "updater": "234",
    "update_time": "2026-10-23T12:05:02",
    "deleted": "\u0000"
   },
   {
    "id": 25,
    "process_definition_id": "misc_receipt_approve:1:10000000000000000000000000000001",
    "model_id": "20000000000000000000000000000001",
    "model_type": 10,
    "category": "misc_receipt_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606001,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-09-25T06:00:00",
    "updater": "234",
    "update_time": "2026-09-25T11:25:00",
    "deleted": "\u0000"
   },
   {
    "id": 26,
    "process_definition_id": "misc_issue_approve:1:10000000000000000000000000000002",
    "model_id": "20000000000000000000000000000002",
    "model_type": 10,
    "category": "misc_issue_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606002,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-09-27T11:00:00",
    "updater": "234",
    "update_time": "2026-09-27T16:38:00",
    "deleted": "\u0000"
   },
   {
    "id": 27,
    "process_definition_id": "return_vendor_approve:1:10000000000000000000000000000003",
    "model_id": "20000000000000000000000000000003",
    "model_type": 10,
    "category": "return_vendor_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606003,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-09-29T16:00:00",
    "updater": "234",
    "update_time": "2026-09-29T21:51:00",
    "deleted": "\u0000"
   },
   {
    "id": 28,
    "process_definition_id": "item_receipt_approve:1:10000000000000000000000000000004",
    "model_id": "20000000000000000000000000000004",
    "model_type": 10,
    "category": "item_receipt_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606004,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-10-01T21:00:00",
    "updater": "234",
    "update_time": "2026-10-01T21:04:00",
    "deleted": "\u0000"
   },
   {
    "id": 29,
    "process_definition_id": "stock_taking_result_approve:1:10000000000000000000000000000005",
    "model_id": "20000000000000000000000000000005",
    "model_type": 10,
    "category": "stock_taking_result_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606005,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-10-04T02:00:00",
    "updater": "234",
    "update_time": "2026-10-04T02:17:00",
    "deleted": "\u0000"
   },
   {
    "id": 30,
    "process_definition_id": "equipment_receipt_approve:1:10000000000000000000000000000006",
    "model_id": "20000000000000000000000000000006",
    "model_type": 10,
    "category": "equipment_receipt_approve",
    "icon": null,
    "description": null,
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[]",
    "form_custom_create_path": null,
    "form_custom_view_path": null,
    "simple_model": null,
    "visible": "\u0001",
    "sort": 1785465606006,
    "start_user_ids": null,
    "start_dept_ids": null,
    "manager_user_ids": "1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0001",
    "process_id_rule": null,
    "auto_approval_type": null,
    "title_setting": null,
    "summary_setting": null,
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": null,
    "creator": "234",
    "create_time": "2026-10-06T07:00:00",
    "updater": "234",
    "update_time": "2026-10-06T07:30:00",
    "deleted": "\u0000"
   },
   {
    "id": 31,
    "process_definition_id": "caigoushenpi:2:78f4753f-cad4-11f1-979e-0242ac110005",
    "model_id": "bc6f3048-74fc-11f1-9120-00155dd68500",
    "model_type": 20,
    "category": "purchase_request_approve",
    "icon": null,
    "description": "",
    "form_type": 10,
    "form_id": 1,
    "form_conf": "{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}",
    "form_fields": "[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fyqymqqdoln2abc\\\",\\\"title\\\":\\\"姓名\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_Fuplmqqdoln2acc\\\",\\\"name\\\":\\\"ref_F18omqqdoln2adc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fh6gmqqdooy5aec\\\",\\\"title\\\":\\\"年龄\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"_fc_id\\\":\\\"id_F5whmqqdooy5afc\\\",\\\"name\\\":\\\"ref_Fltemqqdooy5agc\\\",\\\"_fc_drag_tag\\\":\\\"input\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"select\\\",\\\"field\\\":\\\"F5mrmqqdutnnabc\\\",\\\"title\\\":\\\"选择器\\\",\\\"info\\\":\\\"\\\",\\\"effect\\\":{\\\"fetch\\\":\\\"\\\"},\\\"$required\\\":false,\\\"options\\\":[{\\\"label\\\":\\\"选项01\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项02\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项03\\\",\\\"value\\\":\\\"3\\\"}],\\\"_fc_id\\\":\\\"id_Fhnumqqdutnoacc\\\",\\\"name\\\":\\\"ref_Fd1wmqqdutnoadc\\\",\\\"_fc_drag_tag\\\":\\\"select\\\",\\\"display\\\":true,\\\"hidden\\\":false}\", \"{\\\"type\\\":\\\"ApiSelect\\\",\\\"field\\\":\\\"dc4b501620bb4c8184aaaeb66398324a\\\",\\\"title\\\":\\\"接口选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"method\\\":\\\"GET\\\"},\\\"_fc_id\\\":\\\"id_F6ewmrbn96xdc3c\\\",\\\"name\\\":\\\"ref_F1jomrbn96xdc4c\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"ApiSelect\\\"}\"]",
    "form_custom_create_path": "",
    "form_custom_view_path": "",
    "simple_model": "{\"buttonsSetting\":[{\"displayName\":\"提交\",\"enable\":true,\"id\":1},{\"displayName\":\"拒绝\",\"enable\":false,\"id\":2},{\"displayName\":\"转办\",\"enable\":false,\"id\":3},{\"displayName\":\"委派\",\"enable\":false,\"id\":4},{\"displayName\":\"加签\",\"enable\":false,\"id\":5},{\"displayName\":\"退回\",\"enable\":false,\"id\":6}],\"childNode\":{\"id\":\"EndEvent\",\"name\":\"结束\",\"type\":1},\"fieldsPermission\":[{\"field\":\"Fyqymqqdoln2abc\",\"title\":\"姓名\",\"permission\":\"2\"},{\"field\":\"Fh6gmqqdooy5aec\",\"title\":\"年龄\",\"permission\":\"2\"},{\"field\":\"F5mrmqqdutnnabc\",\"title\":\"选择器\",\"permission\":\"2\"}],\"id\":\"StartUserNode\",\"name\":\"发起人\",\"showText\":\"已设置\",\"type\":10}",
    "visible": "\u0001",
    "sort": 1782876426717,
    "start_user_ids": "",
    "start_dept_ids": "",
    "manager_user_ids": "144,1",
    "allow_cancel_running_process": "\u0001",
    "allow_withdraw_task": "\u0000",
    "process_id_rule": "{\"infix\": \"\", \"enable\": false, \"length\": 5, \"prefix\": \"\", \"postfix\": \"\"}",
    "auto_approval_type": 0,
    "title_setting": "{\"title\": \"\", \"enable\": false}",
    "summary_setting": "{\"enable\": false, \"summary\": []}",
    "process_before_trigger_setting": null,
    "process_after_trigger_setting": null,
    "task_before_trigger_setting": null,
    "task_after_trigger_setting": null,
    "print_template_setting": "{\"enable\": false, \"template\": \"\"}",
    "creator": "1",
    "create_time": "2026-10-18T17:15:34",
    "updater": "1",
    "update_time": "2026-10-18T17:15:34",
    "deleted": "\u0000"
   }
  ]
 }
]
sql/mysql/bpm_business_attach_approval_detail.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
-- ============================================================
-- BPM å®¡æ‰¹è¯¦æƒ…「业务表单」映射配置
--
-- ä½œç”¨ï¼š
--   æµç¨‹è¯¦æƒ…页的「审批详情」区域,在流程为「流程表单(NORMAL)」时,
--   ä¼šæ ¹æ® bpm_business_attach ä¸­çš„ process_definition_key æ‰¾åˆ°å¯¹åº”çš„
--   ä¸šåŠ¡è¯¦æƒ…ç»„ä»¶å¹¶æ¸²æŸ“ï¼Œä»Žè€Œæ˜¾ç¤ºå®Œæ•´å•æ®ä¿¡æ¯ã€‚
--
-- è¯´æ˜Žï¼š
--   1. æœ¬è„šæœ¬ä¸ºå¹‚ç­‰è„šæœ¬ï¼Œé‡å¤æ‰§è¡Œä¸ä¼šäº§ç”Ÿé‡å¤æ•°æ®ã€‚
--   2. ä¸åŒ…含 tenant_id(项目不使用多租户)。
--   3. status = 0 è¡¨ç¤ºå¯ç”¨ï¼ˆCommonStatusEnum.ENABLE)。
-- ============================================================
-- è¡¨ä¸å­˜åœ¨æ—¶åˆ›å»ºï¼ˆå¹‚等,不破坏已有数据)
CREATE TABLE IF NOT EXISTS bpm_business_attach (
    id BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
    process_definition_key VARCHAR(64) NOT NULL COMMENT '流程定义的 Key',
    business_type VARCHAR(64) DEFAULT NULL COMMENT '业务类型',
    component_path VARCHAR(255) NOT NULL COMMENT '业务详情组件路径',
    status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0 å¼€å¯ 1 å…³é—­',
    remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
    creator VARCHAR(64) DEFAULT '' COMMENT '创建者',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updater VARCHAR(64) DEFAULT '' COMMENT '更新者',
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    deleted BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
    PRIMARY KEY (id),
    KEY idx_bpm_business_attach_key (process_definition_key)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'BPM ä¸šåŠ¡é™„ä»¶é…ç½®';
INSERT INTO bpm_business_attach (process_definition_key, business_type, component_path, status, remark, creator, updater)
SELECT t.k, t.biz, t.path, 0, t.remark, '1', '1'
FROM (
    -- å·²æœ‰ç»„ä»¶
    SELECT 'contract_approve' AS k, 'crm_contract' AS biz,
           '/crm/contract/detail/approve/index.vue' AS path, 'CRM åˆåŒå®¡æ‰¹è¯¦æƒ…' AS remark
    UNION ALL SELECT 'crm-invoice-audit', 'crm_invoice',
           '/crm/invoice/detail/approve/index.vue', 'CRM å¼€ç¥¨å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'crm-receivable-audit', 'crm_receivable',
           '/crm/receivable/detail/approve/index.vue', 'CRM å›žæ¬¾å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'erp-finance-payment-audit', 'erp_finance_payment',
           '/erp/finance/payment/detail/approve/index.vue', 'ERP ä»˜æ¬¾å•审批详情'
    UNION ALL SELECT 'hrm_leave_approve', 'hrm_leave_application',
           '/hrm/leave/detail/approve/index.vue', 'HRM è¯·å‡å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'hrm_resignation_approve', 'hrm_resignation_application',
           '/hrm/resignation/detail/approve/index.vue', 'HRM ç¦»èŒå®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'hrm_transfer_approve', 'hrm_transfer_application',
           '/hrm/transfer/detail/approve/index.vue', 'HRM è°ƒåŠ¨å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'hrm_attendance_approve', 'hrm_attendance_exception',
           '/hrm/attendance/exception/detail/approve/index.vue', 'HRM è€ƒå‹¤å¼‚常审批详情'
    -- æ–°å¢žç»„ä»¶
    UNION ALL SELECT 'refund_approve', 'crm_refund',
           '/crm/refund/detail/approve/index.vue', 'CRM é€€è´¹å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'cancellation_approve', 'crm_cancellation',
           '/crm/cancellation/detail/approve/index.vue', 'CRM é”€æˆ·å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'purchase_plan_approve', 'erp_purchase_plan',
           '/erp/purchase/plan/detail/approve/index.vue', 'ERP é‡‡è´­è®¡åˆ’审批详情'
    UNION ALL SELECT 'purchase_request_approve', 'erp_purchase_request',
           '/erp/purchase/request/detail/approve/index.vue', 'ERP é‡‡è´­ç”³è¯·å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'purchase_approve', 'erp_purchase_order',
           '/erp/purchase/order/detail/approve/index.vue', 'ERP é‡‡è´­è®¢å•审批详情'
    UNION ALL SELECT 'hrm_regularize_approve', 'hrm_regularize_application',
           '/hrm/regularize/detail/approve/index.vue', 'HRM è½¬æ­£å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'performance_appraise_approve', 'hrm_performance_appraise',
           '/hrm/performance-appraise/detail/approve/index.vue', 'HRM ç»©æ•ˆè€ƒæ ¸å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'mes-pd-project-audit', 'mes_pd_project',
           '/mes/pd/project/detail/approve/index.vue', 'MES è®¾è®¡é¡¹ç›®å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'pd_tech_confirm_approve', 'product_tech_confirm',
           '/mes/pd/tech-confirm/detail/approve/index.vue', 'MES æŠ€æœ¯ç¡®è®¤å‡½å®¡æ‰¹è¯¦æƒ…'
    UNION ALL SELECT 'equipment_receipt_approve', 'mes_wm_equipment_receipt',
           '/wls/equipmentreceipt/detail/approve/index.vue', 'MES è®¾å¤‡å…¥åº“审批详情'
    UNION ALL SELECT 'item_receipt_approve', 'mes_wm_item_receipt',
           '/wls/itemreceipt/detail/approve/index.vue', 'MES é‡‡è´­å…¥åº“审批详情'
    UNION ALL SELECT 'misc_issue_approve', 'mes_wm_misc_issue',
           '/wls/miscissue/detail/approve/index.vue', 'MES æ‚项出库审批详情'
    UNION ALL SELECT 'misc_receipt_approve', 'mes_wm_misc_receipt',
           '/wls/miscreceipt/detail/approve/index.vue', 'MES æ‚项入库审批详情'
    UNION ALL SELECT 'return_vendor_approve', 'mes_wm_return_vendor',
           '/wls/returnvendor/detail/approve/index.vue', 'MES ä¾›åº”商退货审批详情'
    UNION ALL SELECT 'stock_taking_result_approve', 'mes_wm_stock_taking_task',
           '/wls/stocktaking/task/detail/approve/index.vue', 'MES ç›˜ç‚¹ç»“果审批详情'
    UNION ALL SELECT 'compensation_approve', 'after_sale_compensation',
           '/aftersales/compensation/detail/approve/index.vue', '售后赔付审批详情'
) t
WHERE NOT EXISTS (
    SELECT 1 FROM bpm_business_attach a WHERE a.process_definition_key = t.k
);
-- å·²æœ‰é…ç½®è‹¥è¢«ç¦ç”¨æˆ–路径不对,统一修正为启用状态
UPDATE bpm_business_attach
SET status = 0
WHERE process_definition_key IN (
    'contract_approve', 'crm-invoice-audit', 'crm-receivable-audit',
    'erp-finance-payment-audit', 'hrm_leave_approve', 'hrm_resignation_approve',
    'hrm_transfer_approve', 'hrm_attendance_approve', 'refund_approve',
    'cancellation_approve', 'purchase_plan_approve', 'purchase_request_approve',
    'purchase_approve', 'hrm_regularize_approve', 'performance_appraise_approve',
    'mes-pd-project-audit', 'pd_tech_confirm_approve', 'equipment_receipt_approve',
    'item_receipt_approve', 'misc_issue_approve', 'misc_receipt_approve',
    'return_vendor_approve', 'stock_taking_result_approve', 'compensation_approve'
);
sql/mysql/reset_stuck_approval_records.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
-- ============================================================
-- åŽ†å²è½»é‡çº§å®¡æ‰¹ã€Œå®¡æ‰¹ä¸­ã€å•æ®è¿ç§»è„šæœ¬ï¼ˆå¯é€‰æ‰§è¡Œï¼‰
--
-- èƒŒæ™¯ï¼š
--   è¿™äº›å•据在旧的「审批配置」轻量级审批中处于审批中状态,
--   ä½†æ²¡æœ‰å¯¹åº”çš„ BPM æµç¨‹å®žä¾‹ï¼Œå› æ­¤ä¸ä¼šå‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ â†’ æˆ‘的流程」。
--   å°†çŠ¶æ€é‡ç½®ä¸ºè‰ç¨¿åŽï¼Œç”¨æˆ·å¯é‡æ–°ç‚¹å‡»ã€Œæäº¤å®¡æ‰¹ã€ï¼Œèµ°æ–°çš„ BPM æµç¨‹ã€‚
--
-- æ³¨æ„ï¼š
--   1. æ‰§è¡Œå‰è¯·å…ˆå¤‡ä»½ç›¸å…³è¡¨ã€‚
--   2. æœ¬è„šæœ¬åªé‡ç½®çŠ¶æ€ä¸ºè‰ç¨¿ï¼Œä¸åˆ é™¤ä»»ä½•ä¸šåŠ¡æ•°æ®ã€‚
--   3. å¦‚果单据已经人工处理完毕,请不要执行对应语句。
-- ============================================================
-- è¯·å‡ç”³è¯·ï¼šå®¡æ‰¹ä¸­(10) -> è‰ç¨¿(0)
UPDATE hrm_leave_application
SET status = 0
WHERE status = 10;
-- è€ƒå‹¤å¼‚常:审批中(10) -> è‰ç¨¿(0)
UPDATE hrm_attendance_exception
SET status = 0
WHERE status = 10;
-- è°ƒå²—申请:审批中(10) -> è‰ç¨¿(0)
UPDATE hrm_transfer_application
SET status = 0
WHERE status = 10;
-- CRM é”€æˆ·ç”³è¯·ï¼šå®¡æ‰¹ä¸­(10) -> æœªæäº¤(0)
UPDATE crm_cancellation
SET audit_status = 0
WHERE audit_status = 10;
-- å”®åŽèµ”付单:审批中(10) -> æœªæäº¤(0)
UPDATE after_sale_compensation
SET audit_status = 0
WHERE audit_status = 10;
yudao-module-aftersales/pom.xml
@@ -42,6 +42,11 @@
            <artifactId>yudao-module-infra</artifactId>
            <version>${revision}</version>
        </dependency>
        <dependency>
            <groupId>cn.iocoder.boot</groupId>
            <artifactId>yudao-module-bpm</artifactId>
            <version>${revision}</version>
        </dependency>
        <!-- MDM ä¸»æ•°æ®ç®¡ç† API -->
        <dependency>
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/mysql/compensation/AfterSaleCompensationMapper.java
@@ -69,6 +69,26 @@
                .set(AfterSaleCompensationDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写赔付单状态
     *
     * ä»…当赔付单仍处于「审批中」时更新,避免与原有轻量审批路径重复覆盖。
     *
     * @param id     èµ”付单编号
     * @param status ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<AfterSaleCompensationDO>()
                .eq(AfterSaleCompensationDO::getId, id)
                .eq(AfterSaleCompensationDO::getAuditStatus,
                        AfterSaleCompensationAuditStatusEnum.PROCESS.getStatus())
                .set(AfterSaleCompensationDO::getAuditStatus, status)
                .set(AfterSaleCompensationDO::getReviewTime, LocalDateTime.now())
                .set(AfterSaleCompensationDO::getReviewRemark, reviewRemark));
    }
    default PageResult<AfterSaleCompensationDO> selectPage(AfterSaleCompensationPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<AfterSaleCompensationDO>()
                .likeIfPresent(AfterSaleCompensationDO::getCompensationNo, reqVO.getCompensationNo())
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/AfterSaleCompensationService.java
@@ -47,4 +47,15 @@
     */
    void auditCompensation(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写赔付单审批状态
     *
     * ç”± BPM æµç¨‹ç»“束事件驱动,使赔付单审批统一在「协同办公 - æˆ‘的流程」中流转。
     *
     * @param id        èµ”付单编号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§
     */
    void updateCompensationAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/AfterSaleCompensationServiceImpl.java
@@ -11,6 +11,9 @@
import cn.iocoder.yudao.module.aftersales.dal.mysql.compensation.AfterSaleCompensationMapper;
import cn.iocoder.yudao.module.aftersales.enums.AfterSaleCompensationAuditStatusEnum;
import cn.iocoder.yudao.module.aftersales.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -42,12 +45,19 @@
     */
    private static final String COMPENSATION_APPROVE_BIZ_TYPE = "compensation_approve";
    /**
     * èµ”付单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String COMPENSATION_APPROVE_PROCESS_KEY = "compensation_approve";
    @Resource
    private AfterSaleCompensationMapper compensationMapper;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private AdminUserApi adminUserApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -120,6 +130,12 @@
                AfterSaleCompensationAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(ErrorCodeConstants.COMPENSATION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(COMPENSATION_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -159,6 +175,24 @@
        //    æ”¯ä»˜çŠ¶æ€ï¼ˆpayStatus)待后续接入财务模块时再联动。
    }
    @Override
    public void updateCompensationAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为赔付单审核状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer auditStatus;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            auditStatus = AfterSaleCompensationAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            auditStatus = AfterSaleCompensationAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            auditStatus = AfterSaleCompensationAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        if (compensationMapper.updateAuditStatusByBpm(id, auditStatus, reason) != 1) {
            log.warn("[updateCompensationAuditStatus] èµ”付单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    private AfterSaleCompensationDO validateCompensationExists(Long id) {
        AfterSaleCompensationDO compensation = compensationMapper.selectById(id);
        if (compensation == null) {
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/listener/AfterSaleCompensationStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.aftersales.service.compensation.listener;
import cn.iocoder.yudao.module.aftersales.service.compensation.AfterSaleCompensationService;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * å”®åŽèµ”付单审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写赔付单审核状态,使赔付审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class AfterSaleCompensationStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "compensation_approve";
    @Resource
    private AfterSaleCompensationService compensationService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long compensationId;
        try {
            compensationId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„赔付单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°èµ”付单审批事件,compensationId={}, status={}", compensationId, event.getStatus());
        try {
            compensationService.updateCompensationAuditStatus(compensationId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™èµ”付单审批状态失败,compensationId={}", compensationId, e);
        }
    }
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/cancellation/CrmCancellationMapper.java
@@ -65,6 +65,25 @@
                .set(CrmCancellationDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写销户申请状态
     *
     * ä»…当销户申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           é”€æˆ·ç”³è¯·ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<CrmCancellationDO>()
                .eq(CrmCancellationDO::getId, id)
                .eq(CrmCancellationDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus())
                .set(CrmCancellationDO::getAuditStatus, status)
                .set(CrmCancellationDO::getReviewTime, LocalDateTime.now())
                .set(CrmCancellationDO::getReviewRemark, reviewRemark));
    }
    default List<CrmCancellationDO> selectList(CrmCancellationPageReqVO reqVO) {
        return selectList(buildQuery(reqVO));
    }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
@@ -84,6 +84,20 @@
                .set(CrmContractDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写合同状态
     *
     * ä»…当合同仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<CrmContractDO>()
                .eq(CrmContractDO::getId, id)
                .eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus())
                .set(CrmContractDO::getAuditStatus, status)
                .set(CrmContractDO::getReviewTime, LocalDateTime.now())
                .set(CrmContractDO::getReviewRemark, reviewRemark));
    }
    default PageResult<CrmContractDO> selectPageByCustomerId(CrmContractPageReqVO pageReqVO) {
        return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmContractDO>()
                .eq(CrmContractDO::getCustomerId, pageReqVO.getCustomerId())
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/invoice/CrmInvoiceMapper.java
@@ -82,6 +82,25 @@
                .set(CrmInvoiceDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写开票状态
     *
     * ä»…当开票仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           å¼€ç¥¨ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<CrmInvoiceDO>()
                .eq(CrmInvoiceDO::getId, id)
                .eq(CrmInvoiceDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus())
                .set(CrmInvoiceDO::getAuditStatus, status)
                .set(CrmInvoiceDO::getReviewTime, LocalDateTime.now())
                .set(CrmInvoiceDO::getReviewRemark, reviewRemark));
    }
    default PageResult<CrmInvoiceDO> selectPageByCustomerId(CrmInvoicePageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<CrmInvoiceDO>()
                .eq(CrmInvoiceDO::getCustomerId, reqVO.getCustomerId()) // å¿…须传递
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/refund/CrmRefundMapper.java
@@ -65,6 +65,25 @@
                .set(CrmRefundDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写退费单状态
     *
     * ä»…当退费单仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           é€€è´¹å•编号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<CrmRefundDO>()
                .eq(CrmRefundDO::getId, id)
                .eq(CrmRefundDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus())
                .set(CrmRefundDO::getAuditStatus, status)
                .set(CrmRefundDO::getReviewTime, LocalDateTime.now())
                .set(CrmRefundDO::getReviewRemark, reviewRemark));
    }
    default List<CrmRefundDO> selectList(CrmRefundPageReqVO reqVO) {
        return selectList(buildQuery(reqVO));
    }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/cancellation/CrmCancellationService.java
@@ -53,4 +53,13 @@
     */
    void auditCancellation(Long id, Boolean pass, String reviewRemark);
    /**
     * BPM å®¡æ‰¹ç»“束后回写销户申请审核状态
     *
     * @param id        é”€æˆ·ç”³è¯·ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ{@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum})
     * @param reason    å®¡æ‰¹æ„è§ / ä¸é€šè¿‡åŽŸå› 
     */
    void updateCancellationAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/cancellation/CrmCancellationServiceImpl.java
@@ -14,6 +14,9 @@
import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
import cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -44,6 +47,11 @@
     */
    private static final String CANCELLATION_APPROVE_BIZ_TYPE = "cancellation_approve";
    /**
     * CRM é”€æˆ·ç”³è¯·å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String CANCELLATION_APPROVE_PROCESS_KEY = "cancellation_approve";
    @Resource
    private CrmCancellationMapper cancellationMapper;
    @Resource
@@ -52,6 +60,8 @@
    private AdminUserApi adminUserApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -146,6 +156,12 @@
        if (cancellationMapper.submitAndResetAuditInfo(id, CrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(ErrorCodeConstants.CRM_CANCELLATION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(CANCELLATION_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -183,6 +199,25 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateCancellationAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为销户申请审核状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer auditStatus;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        if (cancellationMapper.updateAuditStatusByBpm(id, auditStatus, reason) != 1) {
            log.warn("[updateCancellationAuditStatus] é”€æˆ·ç”³è¯·({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    private CrmCancellationDO validateCancellationExists(Long id) {
        CrmCancellationDO cancellation = cancellationMapper.selectById(id);
        if (cancellation == null) {
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/cancellation/listener/CrmCancellationStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.crm.service.cancellation.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.crm.service.cancellation.CrmCancellationService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * CRM é”€æˆ·ç”³è¯·å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写销户申请审核状态,使销户审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class CrmCancellationStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "cancellation_approve";
    @Resource
    private CrmCancellationService cancellationService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long cancellationId;
        try {
            cancellationId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„销户申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°é”€æˆ·ç”³è¯·å®¡æ‰¹äº‹ä»¶ï¼ŒcancellationId={}, status={}", cancellationId, event.getStatus());
        try {
            cancellationService.updateCancellationAuditStatus(cancellationId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™é”€æˆ·ç”³è¯·å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼ŒcancellationId={}", cancellationId, e);
        }
    }
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
@@ -99,6 +99,15 @@
    void auditContract(Long id, Boolean pass, String reviewRemark);
    /**
     * BPM å®¡æ‰¹ç»“束后回写合同审核状态
     *
     * @param id        åˆåŒç¼–号
     * @param bpmStatus BPM å®¡æ‰¹ç»“果(2=通过 / 3=不通过 / 4=取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateContractAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * èŽ·å¾—åˆåŒ
     *
     * @param id ç¼–号
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -40,6 +40,9 @@
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
import cn.iocoder.yudao.module.crm.service.quotation.CrmSaleQuotationService;
import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
@@ -92,6 +95,11 @@
     */
    private static final String CONTRACT_APPROVE_BIZ_TYPE = "contract_approve";
    /**
     * CRM åˆåŒå®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String CONTRACT_APPROVE_PROCESS_KEY = "contract_approve";
    @Resource
    private CrmContractMapper contractMapper;
    @Resource
@@ -121,6 +129,8 @@
    private AdminUserApi adminUserApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private ErpSaleOrderApi saleOrderApi;
    @Resource
@@ -373,7 +383,13 @@
            throw exception(CONTRACT_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. è®°å½•日志
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(CONTRACT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
        // 5. è®°å½•日志
        LogRecordContext.putVariable("contractName", contract.getName());
    }
@@ -412,6 +428,25 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateContractAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为合同审核状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer auditStatus;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        if (contractMapper.updateAuditStatusByBpm(id, auditStatus, reason) != 1) {
            log.warn("[updateContractAuditStatus] åˆåŒ({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    // ======================= æŸ¥è¯¢ç›¸å…³ =======================
    @Override
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/listener/CrmContractStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.crm.service.contract.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * CRM åˆåŒå®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写合同审核状态,使合同审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class CrmContractStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "contract_approve";
    @Resource
    private CrmContractService contractService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long contractId;
        try {
            contractId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„合同编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°åˆåŒå®¡æ‰¹äº‹ä»¶ï¼ŒcontractId={}, status={}", contractId, event.getStatus());
        try {
            contractService.updateContractAuditStatus(contractId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™åˆåŒå®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼ŒcontractId={}", contractId, e);
        }
    }
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceService.java
@@ -74,6 +74,15 @@
    void auditInvoice(Long id, Boolean pass, String reviewRemark);
    /**
     * BPM å®¡æ‰¹ç»“束后回写开票审核状态
     *
     * @param id        å¼€ç¥¨ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ{@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum})
     * @param reason    å®¡æ‰¹æ„è§ / ä¸é€šè¿‡åŽŸå› 
     */
    void updateInvoiceAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * èŽ·å¾—å¼€ç¥¨
     *
     * @param id ç¼–号
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java
@@ -23,6 +23,9 @@
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -65,6 +68,11 @@
    private static final String INVOICE_APPROVE_BIZ_TYPE = "crm_invoice_approve";
    /**
     * CRM å¼€ç¥¨å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String INVOICE_APPROVE_PROCESS_KEY = "crm-invoice-audit";
    /**
     * å‘票附件的业务记录类型,对应 {@link cn.iocoder.yudao.module.system.enums.storage.StorageRecordTypeEnum#CRM_INVOICE}
     */
    private static final String INVOICE_RECORD_TYPE = "crm_invoice";
@@ -86,6 +94,8 @@
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -234,7 +244,13 @@
            throw exception(INVOICE_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 5. è®°å½•日志
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(INVOICE_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
        // 6. è®°å½•日志
        LogRecordContext.putVariable("invoiceNo", invoice.getNo());
    }
@@ -274,14 +290,32 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateInvoiceAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为开票审核状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer auditStatus;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        if (invoiceMapper.updateAuditStatusByBpm(id, auditStatus, reason) != 1) {
            log.warn("[updateInvoiceAuditStatus] å¼€ç¥¨({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
     * @param userId ç”¨æˆ·ç¼–号
     * @return æ˜µç§°ï¼Œç”¨æˆ·ä¸å­˜åœ¨æ—¶è¿”回 null
     */
    private String getUserNickname(Long userId) {
        if (userId == null) {
    private String getUserNickname(Long userId) {        if (userId == null) {
            return null;
        }
        AdminUserRespDTO user = adminUserApi.getUser(userId);
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/listener/CrmInvoiceStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.crm.service.invoice.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.crm.service.invoice.CrmInvoiceService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * CRM å¼€ç¥¨å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写开票审核状态,使开票审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class CrmInvoiceStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "crm-invoice-audit";
    @Resource
    private CrmInvoiceService invoiceService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long invoiceId;
        try {
            invoiceId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„开票编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°å¼€ç¥¨å®¡æ‰¹äº‹ä»¶ï¼ŒinvoiceId={}, status={}", invoiceId, event.getStatus());
        try {
            invoiceService.updateInvoiceAuditStatus(invoiceId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™å¼€ç¥¨å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼ŒinvoiceId={}", invoiceId, e);
        }
    }
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/refund/CrmRefundService.java
@@ -53,4 +53,13 @@
     */
    void auditRefund(Long id, Boolean pass, String reviewRemark);
    /**
     * BPM å®¡æ‰¹ç»“束后回写退费单审核状态
     *
     * @param id        é€€è´¹å•编号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ{@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum})
     * @param reason    å®¡æ‰¹æ„è§ / ä¸é€šè¿‡åŽŸå› 
     */
    void updateRefundAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/refund/CrmRefundServiceImpl.java
@@ -14,6 +14,9 @@
import cn.iocoder.yudao.module.crm.dal.mysql.refund.CrmRefundMapper;
import cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -44,6 +47,11 @@
     */
    private static final String REFUND_APPROVE_BIZ_TYPE = "refund_approve";
    /**
     * CRM é€€è´¹å•审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String REFUND_APPROVE_PROCESS_KEY = "refund_approve";
    @Resource
    private CrmRefundMapper refundMapper;
    @Resource
@@ -52,6 +60,8 @@
    private AdminUserApi adminUserApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -146,6 +156,12 @@
        if (refundMapper.submitAndResetAuditInfo(id, CrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(ErrorCodeConstants.CRM_REFUND_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(REFUND_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -183,6 +199,25 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateRefundAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为退费单审核状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer auditStatus;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            auditStatus = CrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        if (refundMapper.updateAuditStatusByBpm(id, auditStatus, reason) != 1) {
            log.warn("[updateRefundAuditStatus] é€€è´¹å•({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    private CrmRefundDO validateRefundExists(Long id) {
        CrmRefundDO refund = refundMapper.selectById(id);
        if (refund == null) {
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/refund/listener/CrmRefundStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.crm.service.refund.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.crm.service.refund.CrmRefundService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * CRM é€€è´¹å•审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写退费单审核状态,使退费审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class CrmRefundStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "refund_approve";
    @Resource
    private CrmRefundService refundService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long refundId;
        try {
            refundId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„退费单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°é€€è´¹å•审批事件,refundId={}, status={}", refundId, event.getStatus());
        try {
            refundService.updateRefundAuditStatus(refundId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™é€€è´¹å•审批状态失败,refundId={}", refundId, e);
        }
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentMapper.java
@@ -117,4 +117,23 @@
                .set(ErpFinancePaymentDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写付款单状态
     *
     * ä»…当付款单仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå·²å®¡æ ¸ / æœªå®¡æ ¸ï¼‰
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ErpFinancePaymentDO>()
                .eq(ErpFinancePaymentDO::getId, id)
                .eq(ErpFinancePaymentDO::getStatus, ErpAuditStatus.APPROVING.getStatus())
                .set(ErpFinancePaymentDO::getStatus, status)
                .set(ErpFinancePaymentDO::getReviewTime, LocalDateTime.now())
                .set(ErpFinancePaymentDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
@@ -104,6 +104,25 @@
                .set(ErpPurchaseOrderDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写采购订单状态
     *
     * ä»…当采购订单仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getId, id)
                .eq(ErpPurchaseOrderDO::getStatus, ErpPurchaseOrderStatusEnum.PROCESS.getStatus())
                .set(ErpPurchaseOrderDO::getStatus, status)
                .set(ErpPurchaseOrderDO::getReviewTime, LocalDateTime.now())
                .set(ErpPurchaseOrderDO::getReviewRemark, reviewRemark));
    }
    default ErpPurchaseOrderDO selectByNo(String no) {
        return selectOne(ErpPurchaseOrderDO::getNo, no);
    }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchasePlanMapper.java
@@ -87,4 +87,23 @@
                .set(ErpPurchasePlanDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写采购计划状态
     *
     * ä»…当采购计划仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ErpPurchasePlanDO>()
                .eq(ErpPurchasePlanDO::getId, id)
                .eq(ErpPurchasePlanDO::getStatus, ErpPurchasePlanStatusEnum.PROCESS.getStatus())
                .set(ErpPurchasePlanDO::getStatus, status)
                .set(ErpPurchasePlanDO::getReviewTime, LocalDateTime.now())
                .set(ErpPurchasePlanDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseRequestMapper.java
@@ -78,4 +78,23 @@
                .set(ErpPurchaseRequestDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写采购申请状态
     *
     * ä»…当采购申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡ / å®¡æ ¸ä¸é€šè¿‡ / å·²å–消)
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ErpPurchaseRequestDO>()
                .eq(ErpPurchaseRequestDO::getId, id)
                .eq(ErpPurchaseRequestDO::getStatus, ErpPurchaseRequestStatusEnum.PROCESS.getStatus())
                .set(ErpPurchaseRequestDO::getStatus, status)
                .set(ErpPurchaseRequestDO::getReviewTime, LocalDateTime.now())
                .set(ErpPurchaseRequestDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentService.java
@@ -64,6 +64,18 @@
    void auditFinancePayment(Long id, Boolean pass, String reviewRemark);
    /**
     * BPM å®¡æ‰¹ç»“果回调更新付款单状态
     *
     * ç”± BPM æµç¨‹å®žä¾‹ç»“束事件触发,将审批结果回写为业务状态:
     * å®¡æ‰¹é€šè¿‡ â†’ å·²å®¡æ ¸ï¼›å®¡æ‰¹ä¸é€šè¿‡ / æµç¨‹å–消 â†’ æœªå®¡æ ¸ï¼ˆé€€å›žåŽå¯ä¿®æ”¹å¹¶é‡æ–°æäº¤ï¼‰ã€‚
     *
     * @param id        ä»˜æ¬¾å•编号
     * @param bpmStatus BPM å®¡æ‰¹ç»“果状态
     * @param reason    å®¡æ ¸æ„è§ï¼ˆBPM å®¡æ‰¹æ„è§ï¼‰
     */
    void updateFinancePaymentAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * åˆ é™¤ä»˜æ¬¾å•
     *
     * @param ids ç¼–号数组
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
@@ -5,6 +5,9 @@
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO;
@@ -50,6 +53,11 @@
     */
    private static final String FINANCE_PAYMENT_APPROVE_BIZ_TYPE = "erp_finance_payment_approve";
    /**
     * ä»˜æ¬¾å•审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String FINANCE_PAYMENT_PROCESS_KEY = "erp-finance-payment-audit";
    @Resource
    private ErpFinancePaymentMapper financePaymentMapper;
    @Resource
@@ -73,6 +81,9 @@
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -180,6 +191,11 @@
        if (financePaymentMapper.submitAndResetAuditInfo(id, ErpAuditStatus.APPROVING.getStatus()) != 1) {
            throw exception(FINANCE_PAYMENT_SUBMIT_FAIL_NOT_ALLOWED);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(FINANCE_PAYMENT_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -217,6 +233,39 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateFinancePaymentAuditStatus(Long id, Integer bpmStatus, String reason) {
        // 1. BPM å®¡æ‰¹ç»“果映射为付款单状态:通过=已审核;不通过/取消=未审核(退回后可修改并重新提交)
        Integer newStatus = convertBpmResultToStatus(bpmStatus);
        if (newStatus == null) {
            return;
        }
        // 2. ä»…当仍处于「审批中」时回写,避免重复覆盖
        if (financePaymentMapper.updateAuditStatusByBpm(id, newStatus, reason) != 1) {
            log.warn("[updateFinancePaymentAuditStatus] ä»˜æ¬¾å•({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    /**
     * è½¬æ¢ BPM å®¡æ‰¹ç»“果为付款单状态
     *
     * ä»˜æ¬¾å•仅有「未审核 / å®¡æ‰¹ä¸­ / å·²å®¡æ ¸ / å·²ä½œåºŸã€ï¼Œæ— ç‹¬ç«‹çš„「审核不通过」状态,
     * æ•…驳回或撤销时回退到「未审核」,便于修改后重新提交(与原有轻量审批一致)。
     */
    private Integer convertBpmResultToStatus(Integer bpmStatus) {
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            return ErpAuditStatus.APPROVE.getStatus();
        }
        if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            return ErpAuditStatus.PROCESS.getStatus();
        }
        if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            return ErpAuditStatus.PROCESS.getStatus();
        }
        return null;
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/listener/ErpFinancePaymentStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.erp.service.finance.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * ä»˜æ¬¾å•审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写付款单状态,使付款单审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class ErpFinancePaymentStatusListener extends BpmProcessInstanceStatusEventListener {
    /**
     * ä»˜æ¬¾å•审批流程定义 Key
     */
    private static final String PROCESS_DEFINITION_KEY = "erp-finance-payment-audit";
    @Resource
    private ErpFinancePaymentService financePaymentService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long paymentId;
        try {
            paymentId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„付款单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°BPM审批事件,paymentId={}, status={}", paymentId, event.getStatus());
        try {
            financePaymentService.updateFinancePaymentAuditStatus(paymentId, event.getStatus(), event.getReason());
            log.info("[onEvent] ä»˜æ¬¾å•({}) å®¡æ‰¹çŠ¶æ€æ›´æ–°å®Œæˆ", paymentId);
        } catch (Exception e) {
            log.error("[onEvent] æ›´æ–°ä»˜æ¬¾å•审批状态失败,paymentId={}", paymentId, e);
        }
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderService.java
@@ -82,6 +82,18 @@
    void updatePurchaseOrderAuditStatus(Long id, Integer bpmResult);
    /**
     * BPM å®¡æ‰¹ç»“果回调更新采购订单状态
     *
     * ç”± BPM æµç¨‹å®žä¾‹ç»“束事件触发,将审批结果回写为业务状态:
     * å®¡æ‰¹é€šè¿‡ â†’ å®¡æ ¸é€šè¿‡ï¼›å®¡æ‰¹ä¸é€šè¿‡ â†’ å®¡æ ¸ä¸é€šè¿‡ï¼›æµç¨‹å–消 â†’ å·²å–消。
     *
     * @param id        é‡‡è´­è®¢å•编号
     * @param bpmStatus BPM å®¡æ‰¹ç»“果状态
     * @param reason    å®¡æ ¸æ„è§ï¼ˆBPM å®¡æ‰¹æ„è§ï¼‰
     */
    void updatePurchaseOrderAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * æ›´æ–°é‡‡è´­è®¢å•的入库数量
     *
     * @param id ç¼–号
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -7,6 +7,8 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderImportExcelVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderImportReqVO;
@@ -74,6 +76,11 @@
     */
    private static final String PURCHASE_ORDER_APPROVE_BIZ_TYPE = "erp_purchase_order_approve";
    /**
     * é‡‡è´­è®¢å•审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String PURCHASE_ORDER_PROCESS_KEY = "purchase_approve";
    @Resource
    private ErpPurchaseOrderMapper purchaseOrderMapper;
    @Resource
@@ -97,6 +104,8 @@
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -245,6 +254,12 @@
        if (purchaseOrderMapper.submitAndResetAuditInfo(id, ErpPurchaseOrderStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(PURCHASE_ORDER_SUBMIT_FAIL_NOT_ALLOWED);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(PURCHASE_ORDER_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -312,12 +327,23 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updatePurchaseOrderAuditStatus(Long id, Integer bpmStatus, String reason) {
        // 1. BPM å®¡æ‰¹ç»“果映射为采购订单状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer newStatus = convertBpmResultToAuditStatus(bpmStatus);
        if (newStatus == null) {
            return;
        }
        // 2. ä»…当仍处于「审批中」时回写,避免重复覆盖
        if (purchaseOrderMapper.updateAuditStatusByBpm(id, newStatus, reason) != 1) {
            log.warn("[updatePurchaseOrderAuditStatus] é‡‡è´­è®¢å•({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    /**
     * è½¬æ¢ BPM å®¡æ‰¹ç»“果为审核状态
     *
     * å·²åºŸå¼ƒï¼šé‡‡è´­è®¢å•不再走 BPM æµç¨‹ï¼Œæœ¬æ–¹æ³•仅为历史代码保留,不再被调用。
     */
    @Deprecated
    private Integer convertBpmResultToAuditStatus(Integer bpmResult) {
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) {
            return ErpPurchaseOrderStatusEnum.APPROVE.getStatus();
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchasePlanService.java
@@ -117,6 +117,18 @@
    void updatePurchasePlanAuditStatus(Long id, Integer bpmResult);
    /**
     * BPM å®¡æ‰¹ç»“果回调更新采购计划状态(带审核意见)
     *
     * ç”± BPM æµç¨‹å®žä¾‹ç»“束事件触发,将审批结果回写为业务状态:
     * å®¡æ‰¹é€šè¿‡ â†’ å®¡æ ¸é€šè¿‡ï¼ˆå¹¶è‡ªåŠ¨ç”Ÿæˆé‡‡è´­ç”³è¯·ï¼‰ï¼›å®¡æ‰¹ä¸é€šè¿‡ â†’ å®¡æ ¸ä¸é€šè¿‡ï¼›æµç¨‹å–消 â†’ å·²å–消。
     *
     * @param id        é‡‡è´­è®¡åˆ’编号
     * @param bpmStatus BPM å®¡æ‰¹ç»“果状态
     * @param reason    å®¡æ ¸æ„è§ï¼ˆBPM å®¡æ‰¹æ„è§ï¼‰
     */
    void updatePurchasePlanAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * èŽ·å–åº“å­˜é¢„è­¦å»ºè®®é‡‡è´­æ˜Žç»†
     *
     * <p>遍历启用安全库存的物料,按默认仓库当前库存低于最低库存时,
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchasePlanServiceImpl.java
@@ -5,6 +5,8 @@
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.plan.ErpPurchasePlanImportExcelVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.plan.ErpPurchasePlanImportReqVO;
@@ -66,6 +68,11 @@
    private static final String PURCHASE_PLAN_APPROVE_BIZ_TYPE = "purchase_plan_approve";
    /**
     * é‡‡è´­è®¡åˆ’审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String PURCHASE_PLAN_PROCESS_KEY = "purchase_plan_approve";
    /**
     * éœ€æ±‚来源:库存预警
     */
    public static final Integer DEMAND_SOURCE_STOCK_ALERT = 1;
@@ -89,6 +96,9 @@
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -219,6 +229,11 @@
        if (purchasePlanMapper.submitAndResetAuditInfo(id, ErpPurchasePlanStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(PURCHASE_PLAN_SUBMIT_FAIL_NOT_ALLOWED);
        }
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(PURCHASE_PLAN_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -308,6 +323,34 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updatePurchasePlanAuditStatus(Long id, Integer bpmStatus, String reason) {
        // 1. BPM å®¡æ‰¹ç»“果映射为采购计划状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer newStatus = convertBpmResultToStatus(bpmStatus);
        if (newStatus == null) {
            return;
        }
        // 2. ä»…当仍处于「审批中」时回写,避免重复覆盖
        if (purchasePlanMapper.updateAuditStatusByBpm(id, newStatus, reason) != 1) {
            log.warn("[updatePurchasePlanAuditStatus] é‡‡è´­è®¡åˆ’({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // 3. å®¡æ‰¹é€šè¿‡ä¸”未生成申请,自动生成采购申请
        if (ErpPurchasePlanStatusEnum.APPROVE.getStatus().equals(newStatus)) {
            ErpPurchasePlanDO plan = purchasePlanMapper.selectById(id);
            if (plan != null && !Boolean.TRUE.equals(plan.getGeneratedFlag())) {
                try {
                    List<Long> requestIds = doGeneratePurchaseRequests(plan);
                    log.info("[updatePurchasePlanAuditStatus] é‡‡è´­è®¡åˆ’({}) è‡ªåŠ¨ç”Ÿæˆé‡‡è´­ç”³è¯·({})", id, requestIds);
                } catch (Exception e) {
                    log.error("[updatePurchasePlanAuditStatus] é‡‡è´­è®¡åˆ’({}) è‡ªåŠ¨ç”Ÿæˆé‡‡è´­ç”³è¯·å¤±è´¥", id, e);
                    // ä¸æŠ›å‡ºå¼‚常,避免影响状态更新
                }
            }
        }
    }
    @Override
    public List<ErpPurchasePlanRespVO.Item> getStockAlertSuggestItems() {
        // 1. èŽ·å–å¯ç”¨çš„ç‰©æ–™åŸºç¡€æ•°æ®ï¼ˆåŒ…å«é»˜è®¤ä»“åº“ã€å®‰å…¨/最低/最高库存)
        List<MdmItemRespDTO> items = mdmItemApi.getItemListByStatus(0).getCheckedData();
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestService.java
@@ -102,6 +102,18 @@
    void auditPurchaseRequest(Long id, Boolean pass, String reviewRemark);
    /**
     * BPM å®¡æ‰¹ç»“果回调更新采购申请状态
     *
     * ç”± BPM æµç¨‹å®žä¾‹ç»“束事件触发,将审批结果回写为业务状态:
     * å®¡æ‰¹é€šè¿‡ â†’ å®¡æ ¸é€šè¿‡ï¼ˆå¹¶è‡ªåŠ¨ç”Ÿæˆé‡‡è´­è®¢å•ï¼‰ï¼›å®¡æ‰¹ä¸é€šè¿‡ â†’ å®¡æ ¸ä¸é€šè¿‡ï¼›æµç¨‹å–消 â†’ å·²å–消。
     *
     * @param id        é‡‡è´­ç”³è¯·ç¼–号
     * @param bpmStatus BPM å®¡æ‰¹ç»“果状态
     * @param reason    å®¡æ ¸æ„è§ï¼ˆBPM å®¡æ‰¹æ„è§ï¼‰
     */
    void updatePurchaseRequestAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * ç”Ÿæˆé‡‡è´­è®¢å•
     *
     * @param id é‡‡è´­ç”³è¯·ç¼–号
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -6,6 +6,9 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestImportExcelVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestImportReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestImportRespVO;
@@ -60,6 +63,11 @@
     */
    private static final String PURCHASE_REQUEST_APPROVE_BIZ_TYPE = "purchase_request_approve";
    /**
     * é‡‡è´­ç”³è¯·å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String PURCHASE_REQUEST_PROCESS_KEY = "purchase_request_approve";
    @Resource
    private ErpPurchaseRequestMapper purchaseRequestMapper;
    @Resource
@@ -86,6 +94,9 @@
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -272,6 +283,11 @@
        if (purchaseRequestMapper.submitAndResetAuditInfo(id, ErpPurchaseRequestStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(PURCHASE_REQUEST_SUBMIT_FAIL_NOT_ALLOWED);
        }
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(PURCHASE_REQUEST_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -335,6 +351,53 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updatePurchaseRequestAuditStatus(Long id, Integer bpmStatus, String reason) {
        // 1. BPM å®¡æ‰¹ç»“果映射为采购申请状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer newStatus = convertBpmResultToStatus(bpmStatus);
        if (newStatus == null) {
            return;
        }
        // 2. ä»…当仍处于「审批中」时回写,避免重复覆盖
        if (purchaseRequestMapper.updateAuditStatusByBpm(id, newStatus, reason) != 1) {
            log.warn("[updatePurchaseRequestAuditStatus] é‡‡è´­ç”³è¯·({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // 3. å®¡æ‰¹é€šè¿‡ä¸”有供应商、未生成订单时,自动生成采购订单
        if (!ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(newStatus)) {
            return;
        }
        ErpPurchaseRequestDO purchaseRequest = purchaseRequestMapper.selectById(id);
        if (purchaseRequest == null || purchaseRequest.getSupplierId() == null
                || purchaseRequest.getOrderId() != null) {
            return;
        }
        try {
            Long orderId = doGeneratePurchaseOrder(purchaseRequest);
            log.info("[updatePurchaseRequestAuditStatus] é‡‡è´­ç”³è¯·({}) è‡ªåŠ¨ç”Ÿæˆé‡‡è´­è®¢å•({})", id, orderId);
        } catch (Exception e) {
            // ä¸æŠ›å‡ºå¼‚常,避免影响审批结果落库;生成失败可由用户手动触发
            log.error("[updatePurchaseRequestAuditStatus] é‡‡è´­ç”³è¯·({}) è‡ªåŠ¨ç”Ÿæˆé‡‡è´­è®¢å•å¤±è´¥", id, e);
        }
    }
    /**
     * è½¬æ¢ BPM å®¡æ‰¹ç»“果为采购申请状态
     */
    private Integer convertBpmResultToStatus(Integer bpmStatus) {
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            return ErpPurchaseRequestStatusEnum.APPROVE.getStatus();
        }
        if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            return ErpPurchaseRequestStatusEnum.REJECT.getStatus();
        }
        if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            return ErpPurchaseRequestStatusEnum.CANCEL.getStatus();
        }
        return null;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long generatePurchaseOrder(Long id, Long supplierId) {
        // 1. æ ¡éªŒå­˜åœ¨ + å®¡æ ¸é€šè¿‡çŠ¶æ€
        ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExists(id);
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchaseOrderStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.erp.service.purchase.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * é‡‡è´­è®¢å•审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写采购订单状态,使采购订单审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class ErpPurchaseOrderStatusListener extends BpmProcessInstanceStatusEventListener {
    /**
     * é‡‡è´­è®¢å•审批流程定义 Key
     */
    private static final String PROCESS_DEFINITION_KEY = "purchase_approve";
    @Resource
    private ErpPurchaseOrderService purchaseOrderService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long orderId;
        try {
            orderId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„采购订单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°BPM审批事件,orderId={}, status={}", orderId, event.getStatus());
        try {
            purchaseOrderService.updatePurchaseOrderAuditStatus(orderId, event.getStatus(), event.getReason());
            log.info("[onEvent] é‡‡è´­è®¢å•({}) å®¡æ‰¹çŠ¶æ€æ›´æ–°å®Œæˆ", orderId);
        } catch (Exception e) {
            log.error("[onEvent] æ›´æ–°é‡‡è´­è®¢å•审批状态失败,orderId={}", orderId, e);
        }
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchasePlanStatusListener.java
@@ -1,24 +1,22 @@
package cn.iocoder.yudao.module.erp.service.purchase.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchasePlanService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * é‡‡è´­è®¡åˆ’审批状态监听器(Legacy,已停用)
 * é‡‡è´­è®¡åˆ’审批状态监听器
 *
 * é‡‡è´­è®¡åˆ’审批已改为「审批配置」轻量级状态机,由
 * {@link ErpPurchasePlanService#submitPurchasePlan(Long)} / {@link ErpPurchasePlanService#auditPurchasePlan(Long, Boolean, String)}
 * ç›´æŽ¥é©±åŠ¨çŠ¶æ€ï¼Œä¸å†ä¾èµ– BPM。
 *
 * ä¿ç•™æœ¬ç±»ä»…作历史参考;不再注册为 Spring Bean,避免旧的 BPM æµç¨‹å®žä¾‹è§¦å‘æ—¶
 * ä¸Žæ–°å®¡æ‰¹è·¯å¾„重复更新/重复生成采购申请。
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写采购计划状态,使采购计划审批统一在「协同办公 - æˆ‘的流程」中流转。
 *
 * @author xiaoyi
 */
@Component
@Slf4j
public class ErpPurchasePlanStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener {
public class ErpPurchasePlanStatusListener extends BpmProcessInstanceStatusEventListener {
    /**
     * é‡‡è´­è®¡åˆ’审批流程定义 Key
@@ -46,7 +44,7 @@
        log.info("[onEvent] æ”¶åˆ°BPM审批事件,planId={}, status={}", planId, event.getStatus());
        try {
            purchasePlanService.updatePurchasePlanAuditStatus(planId, event.getStatus());
            purchasePlanService.updatePurchasePlanAuditStatus(planId, event.getStatus(), event.getReason());
            log.info("[onEvent] é‡‡è´­è®¡åˆ’({}) å®¡æ‰¹çŠ¶æ€æ›´æ–°å®Œæˆ", planId);
        } catch (Exception e) {
            log.error("[onEvent] æ›´æ–°é‡‡è´­è®¡åˆ’审批状态失败,planId={}", planId, e);
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchaseRequestStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.erp.service.purchase.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * é‡‡è´­ç”³è¯·å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写采购申请状态,使采购申请审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class ErpPurchaseRequestStatusListener extends BpmProcessInstanceStatusEventListener {
    /**
     * é‡‡è´­ç”³è¯·å®¡æ‰¹æµç¨‹å®šä¹‰ Key
     */
    private static final String PROCESS_DEFINITION_KEY = "purchase_request_approve";
    @Resource
    private ErpPurchaseRequestService purchaseRequestService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long requestId;
        try {
            requestId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„采购申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°BPM审批事件,requestId={}, status={}", requestId, event.getStatus());
        try {
            purchaseRequestService.updatePurchaseRequestAuditStatus(requestId, event.getStatus(), event.getReason());
            log.info("[onEvent] é‡‡è´­ç”³è¯·({}) å®¡æ‰¹çŠ¶æ€æ›´æ–°å®Œæˆ", requestId);
        } catch (Exception e) {
            log.error("[onEvent] æ›´æ–°é‡‡è´­ç”³è¯·å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼ŒrequestId={}", requestId, e);
        }
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmLeaveApplicationMapper.java
@@ -82,6 +82,20 @@
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写请假申请状态
     *
     * ä»…当申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<HrmLeaveApplicationDO>()
                .eq(HrmLeaveApplicationDO::getId, id)
                .eq(HrmLeaveApplicationDO::getStatus, HrmAuditStatusEnum.PROCESS.getStatus())
                .set(HrmLeaveApplicationDO::getStatus, status)
                .set(HrmLeaveApplicationDO::getReviewTime, LocalDateTime.now())
                .set(HrmLeaveApplicationDO::getReviewRemark, reviewRemark));
    }
    /**
     * æŸ¥è¯¢å‘˜å·¥åœ¨æŒ‡å®šæ—¶é—´èŒƒå›´å†…已审批通过的请假记录
     *
     * @param userId    å‘˜å·¥ID(系统用户ID)
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmRegularizeApplicationMapper.java
@@ -80,6 +80,20 @@
                .set(HrmRegularizeApplicationDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写转正申请状态
     *
     * ä»…当申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<HrmRegularizeApplicationDO>()
                .eq(HrmRegularizeApplicationDO::getId, id)
                .eq(HrmRegularizeApplicationDO::getStatus, HrmAuditStatusEnum.PROCESS.getStatus())
                .set(HrmRegularizeApplicationDO::getStatus, status)
                .set(HrmRegularizeApplicationDO::getReviewTime, LocalDateTime.now())
                .set(HrmRegularizeApplicationDO::getReviewRemark, reviewRemark));
    }
    default HrmRegularizeApplicationDO selectByUserIdAndStatusNot(Long userId, Integer status) {
        return selectOne(new LambdaQueryWrapperX<HrmRegularizeApplicationDO>()
                .eq(HrmRegularizeApplicationDO::getUserId, userId)
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmResignationApplicationMapper.java
@@ -80,6 +80,20 @@
                .set(HrmResignationApplicationDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写离职申请状态
     *
     * ä»…当申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<HrmResignationApplicationDO>()
                .eq(HrmResignationApplicationDO::getId, id)
                .eq(HrmResignationApplicationDO::getStatus, HrmAuditStatusEnum.PROCESS.getStatus())
                .set(HrmResignationApplicationDO::getStatus, status)
                .set(HrmResignationApplicationDO::getReviewTime, LocalDateTime.now())
                .set(HrmResignationApplicationDO::getReviewRemark, reviewRemark));
    }
    default HrmResignationApplicationDO selectByUserIdAndStatusNot(Long userId, Integer status) {
        return selectOne(new LambdaQueryWrapperX<HrmResignationApplicationDO>()
                .eq(HrmResignationApplicationDO::getUserId, userId)
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/approval/HrmTransferApplicationMapper.java
@@ -84,4 +84,21 @@
                        HrmTransferApplicationDO::getApproveTime, LocalDateTime.now()));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写调岗申请状态
     *
     * ä»…当申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<HrmTransferApplicationDO>()
                .eq(HrmTransferApplicationDO::getId, id)
                .eq(HrmTransferApplicationDO::getStatus, HrmAuditStatusEnum.PROCESS.getStatus())
                .set(HrmTransferApplicationDO::getStatus, status)
                .set(HrmTransferApplicationDO::getReviewTime, LocalDateTime.now())
                .set(HrmTransferApplicationDO::getReviewRemark, reviewRemark)
                // ä»…审批通过时写入通过时间,驳回/取消不写
                .set(HrmAuditStatusEnum.APPROVE.getStatus().equals(status),
                        HrmTransferApplicationDO::getApproveTime, LocalDateTime.now()));
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java
@@ -82,4 +82,21 @@
                        HrmAttendanceExceptionDO::getApproveTime, LocalDateTime.now()));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写考勤异常申请状态
     *
     * ä»…当申请仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<HrmAttendanceExceptionDO>()
                .eq(HrmAttendanceExceptionDO::getId, id)
                .eq(HrmAttendanceExceptionDO::getStatus, HrmAuditStatusEnum.PROCESS.getStatus())
                .set(HrmAttendanceExceptionDO::getStatus, status)
                .set(HrmAttendanceExceptionDO::getReviewTime, LocalDateTime.now())
                .set(HrmAttendanceExceptionDO::getReviewRemark, reviewRemark)
                // ä»…审批通过时写入通过时间,驳回/取消不写
                .set(HrmAuditStatusEnum.APPROVE.getStatus().equals(status),
                        HrmAttendanceExceptionDO::getApproveTime, LocalDateTime.now()));
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/performanceappraise/HrmPerformanceAppraiseMapper.java
@@ -73,6 +73,27 @@
                .set(HrmPerformanceAppraiseDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“束后回写绩效考核方案审批状态
     *
     * ä»…当方案仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id          æ–¹æ¡ˆç¼–号
     * @param auditStatus ç›®æ ‡å®¡æ‰¹çŠ¶æ€
     * @param status      æ–¹æ¡ˆçŠ¶æ€ï¼ˆå®¡æ ¸é€šè¿‡æ—¶ç½®ä¸ºå·²å‘å¸ƒï¼Œå¦åˆ™ä¿æŒåŽŸå€¼ï¼‰
     * @param reviewRemark å®¡æ ¸æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer auditStatus, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<HrmPerformanceAppraiseDO>()
                .eq(HrmPerformanceAppraiseDO::getId, id)
                .eq(HrmPerformanceAppraiseDO::getAuditStatus, HrmAuditStatusEnum.PROCESS.getStatus())
                .set(HrmPerformanceAppraiseDO::getAuditStatus, auditStatus)
                .set(HrmPerformanceAppraiseDO::getStatus, status)
                .set(HrmPerformanceAppraiseDO::getReviewTime, LocalDateTime.now())
                .set(HrmPerformanceAppraiseDO::getReviewRemark, reviewRemark));
    }
    default HrmPerformanceAppraiseDO selectMonthlyCompletedByPeriod(String period) {
        return selectOne(new LambdaQueryWrapperX<HrmPerformanceAppraiseDO>()
                .eq(HrmPerformanceAppraiseDO::getPeriodType, 1)
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationService.java
@@ -87,4 +87,13 @@
     */
    void auditLeaveApplication(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写请假申请审批状态
     *
     * @param id        ç”³è¯·ID
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ2-通过 3-不通过 4-取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateLeaveApplicationAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java
@@ -12,6 +12,9 @@
import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import cn.iocoder.yudao.module.hrm.enums.HrmLeaveTypeEnum;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
@@ -52,6 +55,11 @@
     */
    private static final String LEAVE_APPROVE_BIZ_TYPE = "hrm_leave_approve";
    /**
     * è¯·å‡ç”³è¯·å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String LEAVE_APPROVE_PROCESS_KEY = "hrm_leave_approve";
    @Resource
    private HrmLeaveApplicationMapper leaveApplicationMapper;
    @Resource
@@ -64,6 +72,8 @@
    private StorageAttachmentApi storageAttachmentApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -225,6 +235,12 @@
        if (leaveApplicationMapper.submitAndResetAuditInfo(id, HrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(LEAVE_APPLICATION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(LEAVE_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -262,6 +278,25 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateLeaveApplicationAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为请假审批状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        if (leaveApplicationMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateLeaveApplicationAuditStatus] è¯·å‡ç”³è¯·({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmRegularizeApplicationService.java
@@ -88,4 +88,15 @@
     */
    void auditRegularizeApplication(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写转正申请审批状态
     *
     * å®¡æ‰¹é€šè¿‡æ—¶å›žå†™å‘˜å·¥ä¸»æ¡£ï¼ˆçŠ¶æ€=在职,用工性质=正式,转正日期)。
     *
     * @param id        ç”³è¯·ID
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ2-通过 3-不通过 4-取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateRegularizeApplicationAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmRegularizeApplicationServiceImpl.java
@@ -14,6 +14,9 @@
import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import cn.iocoder.yudao.module.hrm.enums.HrmEmploymentTypeEnum;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.PostApi;
@@ -57,6 +60,11 @@
    private static final String REGULARIZE_APPROVE_BIZ_TYPE = "hrm_regularize_approve";
    /**
     * è½¬æ­£ç”³è¯·å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String REGULARIZE_APPROVE_PROCESS_KEY = "hrm_regularize_approve";
    /**
     * å‘˜å·¥çŠ¶æ€ï¼šåœ¨èŒ
     */
    private static final Integer EMPLOYEE_STATUS_ACTIVE = 1;
@@ -78,6 +86,8 @@
    private AdminUserApi adminUserApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private HrmEmployeeMapper employeeMapper;
@@ -246,6 +256,12 @@
        if (regularizeApplicationMapper.submitAndResetAuditInfo(id, HrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(REGULARIZE_APPLICATION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(REGULARIZE_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -306,6 +322,31 @@
                .build());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateRegularizeApplicationAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为转正审批状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        HrmRegularizeApplicationDO application = regularizeApplicationMapper.selectById(id);
        if (regularizeApplicationMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateRegularizeApplicationAuditStatus] è½¬æ­£ç”³è¯·({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // å®¡æ‰¹é€šè¿‡åŽç½®ä¸šåŠ¡é€»è¾‘ï¼šå›žå†™å‘˜å·¥ä¸»æ¡£
        if (status.equals(HrmAuditStatusEnum.APPROVE.getStatus()) && application != null) {
            writeBackEmployee(application);
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationService.java
@@ -91,6 +91,17 @@
    void auditResignationApplication(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写离职申请审批状态
     *
     * å®¡æ‰¹é€šè¿‡æ—¶å›žå†™å‘˜å·¥ä¸»æ¡£ï¼ˆçŠ¶æ€=离职,离职日期)。
     *
     * @param id        ç”³è¯·ID
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ2-通过 3-不通过 4-取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateResignationApplicationAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * æ›´æ–°ç¦»èŒç”³è¯·äº¤æŽ¥çŠ¶æ€
     *
     * @param reqVO äº¤æŽ¥çŠ¶æ€æ›´æ–°ä¿¡æ¯
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java
@@ -14,6 +14,9 @@
import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import cn.iocoder.yudao.module.hrm.enums.HrmResignationTypeEnum;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.hrm.service.handover.HrmUserHandoverService;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@@ -64,6 +67,11 @@
    private static final String RESIGNATION_APPROVE_BIZ_TYPE = "hrm_resignation_approve";
    /**
     * ç¦»èŒç”³è¯·å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String RESIGNATION_APPROVE_PROCESS_KEY = "hrm_resignation_approve";
    /**
     * å‘˜å·¥çŠ¶æ€ï¼šç¦»èŒ
     */
    private static final Integer EMPLOYEE_STATUS_RESIGNED = 3;
@@ -80,6 +88,8 @@
    private StorageAttachmentApi storageAttachmentApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private HrmEmployeeMapper employeeMapper;
    @Resource
@@ -265,6 +275,12 @@
        if (resignationApplicationMapper.submitAndResetAuditInfo(id, HrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(RESIGNATION_APPLICATION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(RESIGNATION_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -325,6 +341,31 @@
                .build());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateResignationApplicationAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为离职审批状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        HrmResignationApplicationDO application = resignationApplicationMapper.selectById(id);
        if (resignationApplicationMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateResignationApplicationAuditStatus] ç¦»èŒç”³è¯·({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // å®¡æ‰¹é€šè¿‡åŽç½®ä¸šåŠ¡é€»è¾‘ï¼šå›žå†™å‘˜å·¥ä¸»æ¡£
        if (status.equals(HrmAuditStatusEnum.APPROVE.getStatus()) && application != null) {
            writeBackEmployee(application);
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationService.java
@@ -89,4 +89,15 @@
     */
    void auditTransferApplication(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写调岗申请审批状态
     *
     * å®¡æ‰¹é€šè¿‡æ—¶å›žå†™å‘˜å·¥ä¸»æ¡£ï¼ˆéƒ¨é—¨ = ç›®æ ‡éƒ¨é—¨ï¼Œå²—位 = ç›®æ ‡å²—位)。
     *
     * @param id        ç”³è¯·ID
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ2-通过 3-不通过 4-取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateTransferApplicationAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
@@ -13,6 +13,9 @@
import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import cn.iocoder.yudao.module.hrm.enums.HrmTransferTypeEnum;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.PostApi;
@@ -58,6 +61,11 @@
     */
    private static final String TRANSFER_APPROVE_BIZ_TYPE = "hrm_transfer_approve";
    /**
     * è°ƒå²—申请审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String TRANSFER_APPROVE_PROCESS_KEY = "hrm_transfer_approve";
    @Resource
    private HrmTransferApplicationMapper transferApplicationMapper;
    @Resource
@@ -72,6 +80,8 @@
    private StorageAttachmentApi storageAttachmentApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private HrmEmployeeMapper employeeMapper;
@@ -268,6 +278,12 @@
        if (transferApplicationMapper.submitAndResetAuditInfo(id, HrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(TRANSFER_APPLICATION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(TRANSFER_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -326,6 +342,31 @@
                .build());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateTransferApplicationAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为调岗审批状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        HrmTransferApplicationDO application = transferApplicationMapper.selectById(id);
        if (transferApplicationMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateTransferApplicationAuditStatus] è°ƒå²—申请({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // å®¡æ‰¹é€šè¿‡åŽç½®ä¸šåŠ¡é€»è¾‘ï¼šå›žå†™å‘˜å·¥ä¸»æ¡£
        if (status.equals(HrmAuditStatusEnum.APPROVE.getStatus()) && application != null) {
            writeBackEmployee(application);
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmLeaveStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.service.approval.HrmLeaveApplicationService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * HRM è¯·å‡ç”³è¯·å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写请假申请审批状态,使请假审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class HrmLeaveStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "hrm_leave_approve";
    @Resource
    private HrmLeaveApplicationService leaveApplicationService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long id;
        try {
            id = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„请假申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°è¯·å‡å®¡æ‰¹äº‹ä»¶ï¼Œid={}, status={}", id, event.getStatus());
        try {
            leaveApplicationService.updateLeaveApplicationAuditStatus(id, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™è¯·å‡ç”³è¯·å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼Œid={}", id, e);
        }
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmRegularizeStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.service.approval.HrmRegularizeApplicationService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * HRM è½¬æ­£ç”³è¯·å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写转正申请审批状态,使转正审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class HrmRegularizeStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "hrm_regularize_approve";
    @Resource
    private HrmRegularizeApplicationService regularizeApplicationService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long id;
        try {
            id = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„转正申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°è½¬æ­£å®¡æ‰¹äº‹ä»¶ï¼Œid={}, status={}", id, event.getStatus());
        try {
            regularizeApplicationService.updateRegularizeApplicationAuditStatus(id, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™è½¬æ­£ç”³è¯·å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼Œid={}", id, e);
        }
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmResignationStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.service.approval.HrmResignationApplicationService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * HRM ç¦»èŒç”³è¯·å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写离职申请审批状态,使离职审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class HrmResignationStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "hrm_resignation_approve";
    @Resource
    private HrmResignationApplicationService resignationApplicationService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long id;
        try {
            id = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„离职申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°ç¦»èŒå®¡æ‰¹äº‹ä»¶ï¼Œid={}, status={}", id, event.getStatus());
        try {
            resignationApplicationService.updateResignationApplicationAuditStatus(id, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™ç¦»èŒç”³è¯·å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼Œid={}", id, e);
        }
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmTransferStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.service.approval.HrmTransferApplicationService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * HRM è°ƒå²—申请审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写调岗申请审批状态,使调岗审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class HrmTransferStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "hrm_transfer_approve";
    @Resource
    private HrmTransferApplicationService transferApplicationService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long id;
        try {
            id = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„调岗申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°è°ƒå²—审批事件,id={}, status={}", id, event.getStatus());
        try {
            transferApplicationService.updateTransferApplicationAuditStatus(id, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™è°ƒå²—申请审批状态失败,id={}", id, e);
        }
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionService.java
@@ -67,4 +67,15 @@
     */
    void auditAttendanceException(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写考勤异常申请审批状态
     *
     * å®¡æ‰¹é€šè¿‡æ—¶æ‰§è¡ŒåŽç½®ä¸šåŠ¡é€»è¾‘ï¼šè¡¥å¡å›žå¡«ä¸Šä¸‹ç­æ—¶é—´ / åŠ ç­å›žå†™åŠ ç­æ—¶é•¿ã€‚
     *
     * @param id        ç”³è¯·ID
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ2-通过 3-不通过 4-取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateAttendanceExceptionAuditStatus(Long id, Integer bpmStatus, String reason);
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
@@ -7,6 +7,9 @@
import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionSaveReqVO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceExceptionMapper;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -45,6 +48,11 @@
     */
    private static final String ATTENDANCE_APPROVE_BIZ_TYPE = "hrm_attendance_approve";
    /**
     * è€ƒå‹¤å¼‚常申请审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String ATTENDANCE_APPROVE_PROCESS_KEY = "hrm_attendance_approve";
    @Resource
    private HrmAttendanceExceptionMapper attendanceExceptionMapper;
    @Resource
@@ -53,6 +61,8 @@
    private StorageAttachmentApi storageAttachmentApi;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private AdminUserApi adminUserApi;
    @Resource
@@ -145,6 +155,12 @@
        if (attendanceExceptionMapper.submitAndResetAuditInfo(id, HrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(ATTENDANCE_EXCEPTION_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(ATTENDANCE_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -196,6 +212,37 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateAttendanceExceptionAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为考勤异常审批状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = HrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        HrmAttendanceExceptionDO exception = attendanceExceptionMapper.selectById(id);
        if (attendanceExceptionMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateAttendanceExceptionAuditStatus] è€ƒå‹¤å¼‚常申请({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // å®¡æ‰¹é€šè¿‡åŽç½®ä¸šåŠ¡é€»è¾‘ï¼šè¡¥å¡å›žå¡«ä¸Šä¸‹ç­æ—¶é—´ / åŠ ç­å›žå†™åŠ ç­æ—¶é•¿
        if (status.equals(HrmAuditStatusEnum.APPROVE.getStatus()) && exception != null) {
            if (HrmAttendanceExceptionTypeEnum.SUPPLEMENT.getType().equals(exception.getType())) {
                log.info("[updateAttendanceExceptionAuditStatus] è¡¥å¡ç”³è¯·({}) å®¡æ‰¹é€šè¿‡ï¼Œå¼€å§‹æ›´æ–°è€ƒå‹¤è®°å½•", id);
                attendanceRecordService.supplementClockIn(exception);
            } else if (HrmAttendanceExceptionTypeEnum.OVERTIME.getType().equals(exception.getType())) {
                log.info("[updateAttendanceExceptionAuditStatus] åŠ ç­ç”³è¯·({}) å®¡æ‰¹é€šè¿‡ï¼Œå¼€å§‹å›žå†™åŠ ç­æ—¶é•¿", id);
                attendanceRecordService.recordOvertime(exception);
            }
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/listener/HrmAttendanceStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.hrm.service.attendance.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceExceptionService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * HRM è€ƒå‹¤å¼‚常申请审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写考勤异常申请审批状态,使考勤异常审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class HrmAttendanceStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "hrm_attendance_approve";
    @Resource
    private HrmAttendanceExceptionService attendanceExceptionService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long id;
        try {
            id = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„考勤异常申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°è€ƒå‹¤å¼‚常审批事件,id={}, status={}", id, event.getStatus());
        try {
            attendanceExceptionService.updateAttendanceExceptionAuditStatus(id, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™è€ƒå‹¤å¼‚常申请审批状态失败,id={}", id, e);
        }
    }
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseService.java
@@ -64,6 +64,17 @@
    void auditAppraise(Long id, Boolean pass, String reviewRemark);
    /**
     * æ ¹æ® BPM å®¡æ‰¹ç»“果回写绩效考核方案审批状态
     *
     * å®¡æ‰¹é€šè¿‡æ—¶æ–¹æ¡ˆçŠ¶æ€æµè½¬ä¸ºã€Œå·²å‘å¸ƒã€ã€‚
     *
     * @param id        æ–¹æ¡ˆç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼ˆ2-通过 3-不通过 4-取消)
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateAppraiseAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * ä¿å­˜å‘˜å·¥è€ƒæ ¸ç»“果(按员工逐指标打分,自动计算综合得分与档级)
     */
    void saveAppraiseResult(HrmPerformanceAppraiseResultSaveReqVO saveReqVO);
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java
@@ -15,6 +15,9 @@
import cn.iocoder.yudao.module.hrm.dal.mysql.performanceappraise.*;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -85,6 +88,11 @@
     */
    private static final String APPRAISE_APPROVE_BIZ_TYPE = "performance_appraise_approve";
    /**
     * ç»©æ•ˆè€ƒæ ¸æ–¹æ¡ˆå®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String APPRAISE_APPROVE_PROCESS_KEY = "performance_appraise_approve";
    @Resource
    private HrmPerformanceAppraiseMapper appraiseMapper;
    @Resource
@@ -97,6 +105,8 @@
    private HrmEmployeeMapper employeeMapper;
    @Resource
    private ApprovalConfigApi approvalConfigApi;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -202,6 +212,12 @@
        if (appraiseMapper.submitAndResetAuditInfo(id, HrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(ErrorCodeConstants.PERFORMANCE_APPRAISE_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(APPRAISE_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
@@ -241,6 +257,30 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateAppraiseAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为方案审批状态:通过=20 / ä¸é€šè¿‡=30 / å–消=40
        Integer auditStatus;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            auditStatus = HrmAuditStatusEnum.APPROVE.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            auditStatus = HrmAuditStatusEnum.REJECT.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            auditStatus = HrmAuditStatusEnum.CANCEL.getStatus();
        } else {
            return;
        }
        // å®¡æ ¸é€šè¿‡åŽæ–¹æ¡ˆçŠ¶æ€æµè½¬ä¸ºã€Œå·²å‘å¸ƒã€ï¼Œå…¶ä½™æƒ…å†µä¿æŒåŽŸæ–¹æ¡ˆçŠ¶æ€
        HrmPerformanceAppraiseDO appraise = appraiseMapper.selectById(id);
        Integer status = HrmAuditStatusEnum.APPROVE.getStatus().equals(auditStatus)
                ? STATUS_PUBLISHED
                : (appraise != null ? appraise.getStatus() : null);
        if (appraiseMapper.updateAuditStatusByBpm(id, auditStatus, status, reason) != 1) {
            log.warn("[updateAppraiseAuditStatus] ç»©æ•ˆè€ƒæ ¸æ–¹æ¡ˆ({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    /**
     * èŽ·å–ç”¨æˆ·æ˜µç§°
     *
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/listener/HrmPerformanceAppraiseStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.hrm.service.performanceappraise.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.service.performanceappraise.HrmPerformanceAppraiseService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * HRM ç»©æ•ˆè€ƒæ ¸æ–¹æ¡ˆå®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写绩效考核方案审批状态,使方案审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class HrmPerformanceAppraiseStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "performance_appraise_approve";
    @Resource
    private HrmPerformanceAppraiseService performanceAppraiseService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long id;
        try {
            id = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„绩效考核方案编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°ç»©æ•ˆè€ƒæ ¸æ–¹æ¡ˆå®¡æ‰¹äº‹ä»¶ï¼Œid={}, status={}", id, event.getStatus());
        try {
            performanceAppraiseService.updateAppraiseAuditStatus(id, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™ç»©æ•ˆè€ƒæ ¸æ–¹æ¡ˆå®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼Œid={}", id, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/project/MesPdProjectMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.pd.project.vo.MesPdProjectPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pd.project.MesPdProjectDO;
import cn.iocoder.yudao.module.mes.enums.pd.MesPdProjectStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -71,4 +72,21 @@
                .set(MesPdProjectDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå¾…å½’æ¡£ / å¾…审核)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesPdProjectDO>()
                .eq(MesPdProjectDO::getId, id)
                .eq(MesPdProjectDO::getStatus, MesPdProjectStatusEnum.APPROVING.getStatus())
                .set(MesPdProjectDO::getStatus, status)
                .set(MesPdProjectDO::getReviewTime, LocalDateTime.now())
                .set(MesPdProjectDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/techconfirm/ProductTechConfirmMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.pd.techconfirm.vo.ProductTechConfirmPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pd.techconfirm.ProductTechConfirmDO;
import cn.iocoder.yudao.module.mes.enums.pd.MesPdTechConfirmStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -70,4 +71,21 @@
                .set(ProductTechConfirmDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于待审核时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå·²å®¡æ ¸ / å®¡æ ¸ä¸é€šè¿‡ï¼‰
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ProductTechConfirmDO>()
                .eq(ProductTechConfirmDO::getId, id)
                .eq(ProductTechConfirmDO::getStatus, MesPdTechConfirmStatusEnum.PENDING_AUDIT.getStatus())
                .set(ProductTechConfirmDO::getStatus, status)
                .set(ProductTechConfirmDO::getReviewTime, LocalDateTime.now())
                .set(ProductTechConfirmDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/equipmentreceipt/MesWmEquipmentReceiptMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.equipmentreceipt.vo.MesWmEquipmentReceiptPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.equipmentreceipt.MesWmEquipmentReceiptDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmEquipmentReceiptStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -71,4 +72,21 @@
                .set(MesWmEquipmentReceiptDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå·²å®¡æ‰¹ / è‰ç¨¿ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmEquipmentReceiptDO>()
                .eq(MesWmEquipmentReceiptDO::getId, id)
                .eq(MesWmEquipmentReceiptDO::getStatus, MesWmEquipmentReceiptStatusEnum.APPROVING.getStatus())
                .set(MesWmEquipmentReceiptDO::getStatus, status)
                .set(MesWmEquipmentReceiptDO::getReviewTime, LocalDateTime.now())
                .set(MesWmEquipmentReceiptDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -83,4 +84,21 @@
                .set(MesWmItemReceiptDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå¾…æ‰§è¡Œå…¥åº“ / è‰ç¨¿ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmItemReceiptDO>()
                .eq(MesWmItemReceiptDO::getId, id)
                .eq(MesWmItemReceiptDO::getStatus, MesWmItemReceiptStatusEnum.APPROVING.getStatus())
                .set(MesWmItemReceiptDO::getStatus, status)
                .set(MesWmItemReceiptDO::getReviewTime, LocalDateTime.now())
                .set(MesWmItemReceiptDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.MesWmMiscIssuePageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue.MesWmMiscIssueDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscIssueStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -78,4 +79,21 @@
                .set(MesWmMiscIssueDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå¾…æ‰§è¡Œå‡ºåº“ / è‰ç¨¿ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmMiscIssueDO>()
                .eq(MesWmMiscIssueDO::getId, id)
                .eq(MesWmMiscIssueDO::getStatus, MesWmMiscIssueStatusEnum.APPROVING.getStatus())
                .set(MesWmMiscIssueDO::getStatus, status)
                .set(MesWmMiscIssueDO::getReviewTime, LocalDateTime.now())
                .set(MesWmMiscIssueDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -75,4 +76,21 @@
                .set(MesWmMiscReceiptDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå·²å®¡æ‰¹ / è‰ç¨¿ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmMiscReceiptDO>()
                .eq(MesWmMiscReceiptDO::getId, id)
                .eq(MesWmMiscReceiptDO::getStatus, MesWmMiscReceiptStatusEnum.APPROVING.getStatus())
                .set(MesWmMiscReceiptDO::getStatus, status)
                .set(MesWmMiscReceiptDO::getReviewTime, LocalDateTime.now())
                .set(MesWmMiscReceiptDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -74,4 +75,21 @@
                .set(MesWmReturnVendorDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå¾…æ‰§è¡Œé€€è´§ / è‰ç¨¿ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmReturnVendorDO>()
                .eq(MesWmReturnVendorDO::getId, id)
                .eq(MesWmReturnVendorDO::getStatus, MesWmReturnVendorStatusEnum.APPROVING.getStatus())
                .set(MesWmReturnVendorDO::getStatus, status)
                .set(MesWmReturnVendorDO::getReviewTime, LocalDateTime.now())
                .set(MesWmReturnVendorDO::getReviewRemark, reviewRemark));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskMapper.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -83,6 +84,48 @@
    }
    /**
     * BPM å®¡æ‰¹é€šè¿‡å›žå†™ï¼šä»…当任务处于「盘点中 + ç»“果审批待审核」时更新为已完成
     *
     * å¾…审核的判断条件与服务层 isResultApprovalPending ä¸€è‡´ï¼šreviewTime éžç©ºä¸” reviewerId ä¸ºç©ºï¼Œ
     * é¿å…é‡å¤ / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果。
     *
     * @param id           ç›˜ç‚¹ä»»åŠ¡ç¼–å·
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå·²å®Œæˆï¼‰
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmStockTakingTaskDO>()
                .eq(MesWmStockTakingTaskDO::getId, id)
                .eq(MesWmStockTakingTaskDO::getStatus, MesWmStockTakingTaskStatusEnum.APPROVING.getStatus())
                .isNotNull(MesWmStockTakingTaskDO::getReviewTime)
                .isNull(MesWmStockTakingTaskDO::getReviewerId)
                .set(MesWmStockTakingTaskDO::getStatus, status)
                .set(MesWmStockTakingTaskDO::getReviewTime, LocalDateTime.now())
                .set(MesWmStockTakingTaskDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ä¸é€šè¿‡ / æ’¤é”€å›žå†™ï¼šä»»åŠ¡ä¿æŒç›˜ç‚¹ä¸­ï¼Œæ¸…ç©ºæäº¤æ ‡è®°ä»¥ä¾¿é‡æ–°æäº¤ç»“æžœå®¡æ‰¹
     *
     * æ¸…空 reviewTime(提交标记)后 isResultApprovalPending è¿”回 false,
     * å…è®¸ç”¨æˆ·ä¿®æ”¹å®žç›˜åŽé‡æ–°æäº¤ï¼›ä¿ç•™ reviewRemark ä¾›ç”¨æˆ·æŸ¥çœ‹ä¸é€šè¿‡åŽŸå› ã€‚
     *
     * @param id           ç›˜ç‚¹ä»»åŠ¡ç¼–å·
     * @param reviewRemark å®¡æ‰¹æ„è§ / å–消原因
     * @return å½±å“è¡Œæ•°
     */
    default int resetResultApprovalByBpm(Long id, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmStockTakingTaskDO>()
                .eq(MesWmStockTakingTaskDO::getId, id)
                .eq(MesWmStockTakingTaskDO::getStatus, MesWmStockTakingTaskStatusEnum.APPROVING.getStatus())
                .isNotNull(MesWmStockTakingTaskDO::getReviewTime)
                .isNull(MesWmStockTakingTaskDO::getReviewerId)
                .set(MesWmStockTakingTaskDO::getReviewTime, null)
                .set(MesWmStockTakingTaskDO::getReviewRemark, reviewRemark));
    }
    /**
     * æ¸…空审核标记
     *
     * ç”¨äºŽä»»åŠ¡å–æ¶ˆåŽæ¸…é™¤ç»“æžœå®¡æ‰¹ç—•è¿¹
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java
@@ -115,6 +115,18 @@
    void auditProject(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:审批通过置为待归档,审批不通过退回待审核。
     * è®¾è®¡é¡¹ç›®æ²¡æœ‰ã€Œå·²å–消」状态,其余 BPM ç»“果忽略。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateProjectAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * å½’档设计项目(待归档→已归档)
     * <p>
     * åŒæ—¶è‡ªåŠ¨åˆ›å»ºå½’æ¡£å°è´¦è®°å½•
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
@@ -4,6 +4,9 @@
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.pd.project.vo.MesPdProjectImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.pd.project.vo.MesPdProjectImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pd.project.vo.MesPdProjectPageReqVO;
@@ -61,8 +64,16 @@
     */
    private static final String PROJECT_APPROVE_BIZ_TYPE = "mes_pd_project_approve";
    /**
     * è®¾è®¡é¡¹ç›®å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String PROJECT_APPROVE_PROCESS_KEY = "mes-pd-project-audit";
    @Resource
    private MesPdProjectMapper projectMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    @Lazy
@@ -228,6 +239,30 @@
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(PROJECT_APPROVE_BIZ_TYPE);
        // 4. çŠ¶æ€ç½®ä¸ºå®¡æ‰¹ä¸­ï¼Œå¹¶æ¸…ç©ºä¸Šä¸€è½®å®¡æ ¸ç»“æžœ
        projectMapper.submitAndResetAuditInfo(id, MesPdProjectStatusEnum.APPROVING.getStatus());
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(PROJECT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateProjectAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为项目状态:通过=待归档 / ä¸é€šè¿‡=待审核(可修改后重新提交)
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesPdProjectStatusEnum.AUDIT.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesPdProjectStatusEnum.UPLOAD.getStatus();
        } else {
            // è®¾è®¡é¡¹ç›®æ²¡æœ‰ã€Œå·²å–消」状态,其余 BPM ç»“果(如撤消)忽略
            log.warn("[updateProjectAuditStatus] å¿½ç•¥ä¸æ”¯æŒçš„ BPM çŠ¶æ€({}),projectId={}", bpmStatus, id);
            return;
        }
        if (projectMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateProjectAuditStatus] è®¾è®¡é¡¹ç›®({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/listener/MesPdProjectStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.pd.project.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.pd.project.MesPdProjectService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES è®¾è®¡é¡¹ç›®å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写设计项目状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class MesPdProjectStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "mes-pd-project-audit";
    @Resource
    private MesPdProjectService projectService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long projectId;
        try {
            projectId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„设计项目编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°è®¾è®¡é¡¹ç›®å®¡æ‰¹äº‹ä»¶ï¼ŒprojectId={}, status={}", projectId, event.getStatus());
        try {
            projectService.updateProjectAuditStatus(projectId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™è®¾è®¡é¡¹ç›®å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼ŒprojectId={}", projectId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/techconfirm/ProductTechConfirmService.java
@@ -104,6 +104,18 @@
    void auditTechConfirm(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于待审核时生效:审批通过置为已审核,审批不通过置为审核不通过。
     * æŠ€æœ¯ç¡®è®¤å‡½æ²¡æœ‰ã€Œå·²å–消」状态,其余 BPM ç»“果忽略。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateTechConfirmAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * å®¢æˆ·ç¡®è®¤ï¼ˆå·²å®¡æ ¸ â†’ å®¢æˆ·å·²ç¡®è®¤ï¼‰
     *
     * ç”±ä¸šåŠ¡å‘˜ä»£å®¢æˆ·æ‰§è¡Œï¼Œè®°å½•å®¢æˆ·ç¡®è®¤äººä¸Žå®¢æˆ·ç¡®è®¤æ—¶é—´ã€‚
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/techconfirm/ProductTechConfirmServiceImpl.java
@@ -5,6 +5,9 @@
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
import cn.iocoder.yudao.module.mes.controller.admin.pd.techconfirm.vo.ProductTechConfirmImportExcelVO;
@@ -60,8 +63,16 @@
     */
    private static final String TECH_CONFIRM_APPROVE_BIZ_TYPE = "pd_tech_confirm_approve";
    /**
     * æŠ€æœ¯ç¡®è®¤å‡½å®¡æ‰¹çš„ BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String TECH_CONFIRM_APPROVE_PROCESS_KEY = "pd_tech_confirm_approve";
    @Resource
    private ProductTechConfirmMapper techConfirmMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -145,6 +156,30 @@
        //    ç”¨ UpdateWrapper è€Œéž updateById:MyBatis-Plus é»˜è®¤æ›´æ–°ç­–略会忽略 null,
        //    ç›´æŽ¥ updateById æ— æ³•把审核不通过后残留的审核人 / å®¡æ ¸æ—¶é—´ / å®¡æ ¸æ„è§çœŸæ­£æ¸…空。
        techConfirmMapper.submitAndResetAuditInfo(id, MesPdTechConfirmStatusEnum.PENDING_AUDIT.getStatus());
        // 4. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(TECH_CONFIRM_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateTechConfirmAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为确认函状态:通过=已审核 / ä¸é€šè¿‡=审核不通过(可修改后重新提交)
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesPdTechConfirmStatusEnum.AUDITED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesPdTechConfirmStatusEnum.REJECTED.getStatus();
        } else {
            // æŠ€æœ¯ç¡®è®¤å‡½æ²¡æœ‰ã€Œå·²å–消」状态,其余 BPM ç»“果(如撤消)忽略
            log.warn("[updateTechConfirmAuditStatus] å¿½ç•¥ä¸æ”¯æŒçš„ BPM çŠ¶æ€({}),techConfirmId={}", bpmStatus, id);
            return;
        }
        if (techConfirmMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateTechConfirmAuditStatus] æŠ€æœ¯ç¡®è®¤å‡½({}) ä¸å¤„于待审核状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/techconfirm/listener/ProductTechConfirmStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.pd.techconfirm.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.pd.techconfirm.ProductTechConfirmService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES äº§å“æŠ€æœ¯ç¡®è®¤å‡½å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写技术确认函状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class ProductTechConfirmStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "pd_tech_confirm_approve";
    @Resource
    private ProductTechConfirmService techConfirmService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long techConfirmId;
        try {
            techConfirmId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„æŠ€æœ¯ç¡®è®¤å‡½ç¼–号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°æŠ€æœ¯ç¡®è®¤å‡½å®¡æ‰¹äº‹ä»¶ï¼ŒtechConfirmId={}, status={}", techConfirmId, event.getStatus());
        try {
            techConfirmService.updateTechConfirmAuditStatus(techConfirmId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™æŠ€æœ¯ç¡®è®¤å‡½å®¡æ‰¹çŠ¶æ€å¤±è´¥ï¼ŒtechConfirmId={}", techConfirmId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/equipmentreceipt/MesWmEquipmentReceiptService.java
@@ -63,6 +63,17 @@
     */
    void auditEquipmentReceipt(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:通过=已审批 / ä¸é€šè¿‡=草稿 / å–消=已取消。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateEquipmentReceiptAuditStatus(Long id, Integer bpmStatus, String reason);
    void finishEquipmentReceipt(Long id);
    void cancelEquipmentReceipt(Long id);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/equipmentreceipt/MesWmEquipmentReceiptServiceImpl.java
@@ -5,6 +5,9 @@
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.equipmentreceipt.vo.MesWmEquipmentReceiptImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.equipmentreceipt.vo.MesWmEquipmentReceiptImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.equipmentreceipt.vo.MesWmEquipmentReceiptPageReqVO;
@@ -60,8 +63,16 @@
     */
    private static final String EQUIPMENT_RECEIPT_APPROVE_BIZ_TYPE = "equipment_receipt_approve";
    /**
     * è®¾å¤‡å…¥åº“单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String EQUIPMENT_RECEIPT_APPROVE_PROCESS_KEY = "equipment_receipt_approve";
    @Resource
    private MesWmEquipmentReceiptMapper equipmentReceiptMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    @Lazy
    private MesWmEquipmentReceiptLineService equipmentReceiptLineService;
@@ -136,6 +147,30 @@
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(EQUIPMENT_RECEIPT_APPROVE_BIZ_TYPE);
        // 4. çŠ¶æ€ç½®ä¸ºå®¡æ‰¹ä¸­ï¼Œå¹¶æ¸…ç©ºä¸Šä¸€è½®å®¡æ ¸ç»“æžœ
        equipmentReceiptMapper.submitAndResetAuditInfo(id, MesWmEquipmentReceiptStatusEnum.APPROVING.getStatus());
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(EQUIPMENT_RECEIPT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateEquipmentReceiptAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为单据状态:通过=已审批 / ä¸é€šè¿‡=草稿 / å–消=已取消
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesWmEquipmentReceiptStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesWmEquipmentReceiptStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = MesWmEquipmentReceiptStatusEnum.CANCELED.getStatus();
        } else {
            return;
        }
        if (equipmentReceiptMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateEquipmentReceiptAuditStatus] è®¾å¤‡å…¥åº“单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/equipmentreceipt/listener/MesWmEquipmentReceiptStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.wm.equipmentreceipt.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.wm.equipmentreceipt.MesWmEquipmentReceiptService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES è®¾å¤‡å…¥åº“单审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写设备入库单状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class MesWmEquipmentReceiptStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "equipment_receipt_approve";
    @Resource
    private MesWmEquipmentReceiptService equipmentReceiptService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long receiptId;
        try {
            receiptId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„设备入库单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°è®¾å¤‡å…¥åº“单审批事件,receiptId={}, status={}", receiptId, event.getStatus());
        try {
            equipmentReceiptService.updateEquipmentReceiptAuditStatus(receiptId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™è®¾å¤‡å…¥åº“单审批状态失败,receiptId={}", receiptId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java
@@ -163,6 +163,17 @@
    void auditItemReceipt(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:通过=待执行入库 / ä¸é€šè¿‡=草稿 / å–消=已取消。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateItemReceiptAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * å¯¼å…¥é‡‡è´­å…¥åº“单
     *
     * @param importList    å¯¼å…¥æ•°æ®
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
@@ -6,6 +6,9 @@
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
@@ -68,8 +71,16 @@
     */
    private static final String ITEM_RECEIPT_APPROVE_BIZ_TYPE = "item_receipt_approve";
    /**
     * é‡‡è´­å…¥åº“单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String ITEM_RECEIPT_APPROVE_PROCESS_KEY = "item_receipt_approve";
    @Resource
    private MesWmItemReceiptMapper itemReceiptMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private MesWmItemReceiptLineService itemReceiptLineService;
@@ -186,6 +197,30 @@
        // æäº¤ï¼ˆè‰ç¨¿ â†’ å¾…上架),并清空上一轮审核结果
        itemReceiptMapper.submitAndResetAuditInfo(id, MesWmItemReceiptStatusEnum.APPROVING.getStatus());
        // åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(ITEM_RECEIPT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateItemReceiptAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为单据状态:通过=待执行入库 / ä¸é€šè¿‡=草稿 / å–消=已取消
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesWmItemReceiptStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesWmItemReceiptStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = MesWmItemReceiptStatusEnum.CANCELED.getStatus();
        } else {
            return;
        }
        if (itemReceiptMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateItemReceiptAuditStatus] é‡‡è´­å…¥åº“单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.wm.itemreceipt.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES é‡‡è´­å…¥åº“单审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写采购入库单状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class MesWmItemReceiptStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "item_receipt_approve";
    @Resource
    private MesWmItemReceiptService itemReceiptService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long receiptId;
        try {
            receiptId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„采购入库单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°é‡‡è´­å…¥åº“单审批事件,receiptId={}, status={}", receiptId, event.getStatus());
        try {
            itemReceiptService.updateItemReceiptAuditStatus(receiptId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™é‡‡è´­å…¥åº“单审批状态失败,receiptId={}", receiptId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueService.java
@@ -86,6 +86,17 @@
    void auditMiscIssue(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:通过=待执行出库 / ä¸é€šè¿‡=草稿 / å–消=已取消。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateMiscIssueAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * æ‰§è¡Œå‡ºåº“(待执行出库 â†’ å·²å®Œæˆï¼‰ï¼Œæ‰£å‡åº“å­˜
     *
     * @param id ç¼–号
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java
@@ -6,6 +6,9 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.MesWmMiscIssueImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.MesWmMiscIssueImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.MesWmMiscIssuePageReqVO;
@@ -54,8 +57,16 @@
     */
    private static final String MISC_ISSUE_APPROVE_BIZ_TYPE = "misc_issue_approve";
    /**
     * æ‚项出库单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String MISC_ISSUE_APPROVE_PROCESS_KEY = "misc_issue_approve";
    @Resource
    private MesWmMiscIssueMapper miscIssueMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private MesWmMiscIssueLineService miscIssueLineService;
@@ -126,6 +137,30 @@
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(MISC_ISSUE_APPROVE_BIZ_TYPE);
        // 4. æäº¤å®¡æ‰¹ï¼ˆè‰ç¨¿ â†’ å®¡æ‰¹ä¸­ï¼‰ï¼Œå¹¶æ¸…空上一轮审核结果
        miscIssueMapper.submitAndResetAuditInfo(id, MesWmMiscIssueStatusEnum.APPROVING.getStatus());
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(MISC_ISSUE_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateMiscIssueAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为单据状态:通过=待执行出库 / ä¸é€šè¿‡=草稿 / å–消=已取消
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesWmMiscIssueStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesWmMiscIssueStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = MesWmMiscIssueStatusEnum.CANCELED.getStatus();
        } else {
            return;
        }
        if (miscIssueMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateMiscIssueAuditStatus] æ‚项出库单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/listener/MesWmMiscIssueStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.wm.miscissue.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.wm.miscissue.MesWmMiscIssueService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES æ‚项出库单审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写杂项出库单状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class MesWmMiscIssueStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "misc_issue_approve";
    @Resource
    private MesWmMiscIssueService miscIssueService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long issueId;
        try {
            issueId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„æ‚项出库单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°æ‚项出库单审批事件,issueId={}, status={}", issueId, event.getStatus());
        try {
            miscIssueService.updateMiscIssueAuditStatus(issueId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™æ‚项出库单审批状态失败,issueId={}", issueId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java
@@ -88,6 +88,17 @@
    void auditMiscReceipt(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:通过=已审批 / ä¸é€šè¿‡=草稿 / å–消=已取消。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateMiscReceiptAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * æ‰§è¡Œå…¥åº“(已审批 â†’ å·²å®Œæˆï¼‰ï¼Œæ›´æ–°åº“存台账
     *
     * @param id ç¼–号
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java
@@ -5,6 +5,9 @@
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptPageReqVO;
@@ -53,8 +56,16 @@
     */
    private static final String MISC_RECEIPT_APPROVE_BIZ_TYPE = "misc_receipt_approve";
    /**
     * æ‚项入库单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String MISC_RECEIPT_APPROVE_PROCESS_KEY = "misc_receipt_approve";
    @Resource
    private MesWmMiscReceiptMapper miscReceiptMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    @Lazy
@@ -126,6 +137,30 @@
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(MISC_RECEIPT_APPROVE_BIZ_TYPE);
        // 4. æäº¤å®¡æ‰¹ï¼ˆè‰ç¨¿ â†’ å®¡æ‰¹ä¸­ï¼‰ï¼Œå¹¶æ¸…空上一轮审核结果
        miscReceiptMapper.submitAndResetAuditInfo(id, MesWmMiscReceiptStatusEnum.APPROVING.getStatus());
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(MISC_RECEIPT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateMiscReceiptAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为单据状态:通过=已审批 / ä¸é€šè¿‡=草稿 / å–消=已取消
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesWmMiscReceiptStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesWmMiscReceiptStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = MesWmMiscReceiptStatusEnum.CANCELED.getStatus();
        } else {
            return;
        }
        if (miscReceiptMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateMiscReceiptAuditStatus] æ‚项入库单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/listener/MesWmMiscReceiptStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.wm.miscreceipt.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.wm.miscreceipt.MesWmMiscReceiptService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES æ‚项入库单审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写杂项入库单状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class MesWmMiscReceiptStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "misc_receipt_approve";
    @Resource
    private MesWmMiscReceiptService miscReceiptService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long receiptId;
        try {
            receiptId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„æ‚项入库单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°æ‚项入库单审批事件,receiptId={}, status={}", receiptId, event.getStatus());
        try {
            miscReceiptService.updateMiscReceiptAuditStatus(receiptId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™æ‚项入库单审批状态失败,receiptId={}", receiptId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java
@@ -95,6 +95,17 @@
    void auditReturnVendor(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:通过=待执行退货 / ä¸é€šè¿‡=草稿 / å–消=已取消。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateReturnVendorAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * æ‰§è¡Œæ‹£è´§æ ¡éªŒï¼ˆä»…校验已审批单据的明细数量一致性,不修改单据状态)
     *
     * å•据状态只能由审核(APPROVING â†’ APPROVED)与退货(APPROVED â†’ FINISHED)推进。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
@@ -7,6 +7,9 @@
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO;
@@ -57,8 +60,16 @@
     */
    private static final String RETURN_VENDOR_APPROVE_BIZ_TYPE = "return_vendor_approve";
    /**
     * ä¾›åº”商退货单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String RETURN_VENDOR_APPROVE_PROCESS_KEY = "return_vendor_approve";
    @Resource
    private MesWmReturnVendorMapper returnVendorMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private MesWmReturnVendorLineService returnVendorLineService;
@@ -135,6 +146,30 @@
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(RETURN_VENDOR_APPROVE_BIZ_TYPE);
        // 4. æäº¤å®¡æ‰¹ï¼ˆè‰ç¨¿ â†’ å¾…拣货),并清空上一轮审核结果
        returnVendorMapper.submitAndResetAuditInfo(id, MesWmReturnVendorStatusEnum.APPROVING.getStatus());
        // 5. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(RETURN_VENDOR_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateReturnVendorAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为单据状态:通过=待执行退货 / ä¸é€šè¿‡=草稿 / å–消=已取消
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesWmReturnVendorStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesWmReturnVendorStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = MesWmReturnVendorStatusEnum.CANCELED.getStatus();
        } else {
            return;
        }
        if (returnVendorMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateReturnVendorAuditStatus] ä¾›åº”商退货单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/listener/MesWmReturnVendorStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.mes.service.wm.returnvendor.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES ä¾›åº”商退货单审批状态监听器
 *
 * ç›‘听 BPM å®¡æ‰¹ç»“果,回写供应商退货单状态,使审批统一在「协同办公 - æˆ‘的流程」中流转。
 */
@Component
@Slf4j
public class MesWmReturnVendorStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "return_vendor_approve";
    @Resource
    private MesWmReturnVendorService returnVendorService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long returnVendorId;
        try {
            returnVendorId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„供应商退货单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°ä¾›åº”商退货单审批事件,returnVendorId={}, status={}", returnVendorId, event.getStatus());
        try {
            returnVendorService.updateReturnVendorAuditStatus(returnVendorId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™ä¾›åº”商退货单审批状态失败,returnVendorId={}", returnVendorId, e);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java
@@ -85,6 +85,19 @@
    void auditStockTakingResult(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM ç›˜ç‚¹ç»“果审批结果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在任务处于「盘点中 + ç»“果审批待审核」时生效:
     * é€šè¿‡ â†’ ä»»åŠ¡ç½®ä¸ºå·²å®Œæˆå¹¶è§£å†»åº“å­˜ã€æ ¸é”€ç›˜ç‚¹å·®å¼‚ï¼›
     * ä¸é€šè¿‡ / æµç¨‹æ’¤é”€ â†’ ä»»åŠ¡ä¿æŒç›˜ç‚¹ä¸­ï¼Œæ¸…ç©ºæäº¤æ ‡è®°ä»¥ä¾¿é‡æ–°æäº¤ã€‚
     *
     * @param id        ç›˜ç‚¹ä»»åŠ¡ç¼–å·ï¼ˆBPM businessKey å³ä¸ºè¯¥ç¼–号)
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateStockTakingResultAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * å–消盘点任务
     *
     * @param id ç›˜ç‚¹ä»»åŠ¡ç¼–å·
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
@@ -5,6 +5,9 @@
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
@@ -62,8 +65,16 @@
     */
    private static final String STOCK_TAKING_RESULT_APPROVE_BIZ_TYPE = "stock_taking_result_approve";
    /**
     * ç›˜ç‚¹ç»“果审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String STOCK_TAKING_RESULT_APPROVE_PROCESS_KEY = "stock_taking_result_approve";
    @Resource
    private MesWmStockTakingTaskMapper stockTakingTaskMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private MesWmMaterialStockService materialStockService;
@@ -219,6 +230,50 @@
        // 2. è®°å½•提交时间并清空上一轮审核结果(任务保持盘点中,等待审核)
        stockTakingTaskMapper.markResultApprovalSubmitted(id);
        // 3. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼ŒbusinessKey ä¸ºç›˜ç‚¹ä»»åŠ¡ç¼–å·ï¼ˆå®¡æ‰¹ç»“æžœå›žå†™çš„å°±æ˜¯è¯¥ä»»åŠ¡ï¼‰
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(STOCK_TAKING_RESULT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateStockTakingResultAuditStatus(Long id, Integer bpmStatus, String reason) {
        // 1. æ ¡éªŒä»»åŠ¡å­˜åœ¨
        MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id);
        if (task == null) {
            log.warn("[updateStockTakingResultAuditStatus] ç›˜ç‚¹ä»»åŠ¡({}) ä¸å­˜åœ¨ï¼Œå¿½ç•¥ BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        // 2. ä»…处理「盘点中 + ç»“果审批待审核」的任务,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
        if (!MesWmStockTakingTaskStatusEnum.APPROVING.getStatus().equals(task.getStatus())
                || !isResultApprovalPending(task)) {
            log.warn("[updateStockTakingResultAuditStatus] ç›˜ç‚¹ä»»åŠ¡({}) ä¸å¤„于结果审批中,忽略 BPM ç»“æžœ({})", id, bpmStatus);
            return;
        }
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            // 3.1 å®¡æ‰¹é€šè¿‡ï¼šç½®ä¸ºå·²å®Œæˆï¼Œå†è§£å†»åº“存并核销盘点差异(与 auditStockTakingResult ä¿æŒä¸€è‡´ï¼‰
            if (stockTakingTaskMapper.updateAuditStatusByBpm(id,
                    MesWmStockTakingTaskStatusEnum.FINISHED.getStatus(), reason) != 1) {
                log.warn("[updateStockTakingResultAuditStatus] ç›˜ç‚¹ä»»åŠ¡({}) çŠ¶æ€å›žå†™å¤±è´¥ï¼Œå¿½ç•¥ BPM ç»“æžœ({})", id, bpmStatus);
                return;
            }
            if (Boolean.TRUE.equals(task.getFrozen())) {
                updateMaterialStockFrozen(stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id), false);
            }
            doProcessStockTakingDifference(task);
            return;
        }
        if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)
                || BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            // 3.2 å®¡æ‰¹ä¸é€šè¿‡ / æµç¨‹æ’¤é”€ï¼šä»»åŠ¡ä¿æŒç›˜ç‚¹ä¸­ï¼Œæ¸…ç©ºæäº¤æ ‡è®°ä»¥ä¾¿é‡æ–°æäº¤ç»“æžœå®¡æ‰¹
            if (stockTakingTaskMapper.resetResultApprovalByBpm(id, reason) != 1) {
                log.warn("[updateStockTakingResultAuditStatus] ç›˜ç‚¹ä»»åŠ¡({}) çŠ¶æ€å›žå†™å¤±è´¥ï¼Œå¿½ç•¥ BPM ç»“æžœ({})", id, bpmStatus);
            }
            return;
        }
        log.warn("[updateStockTakingResultAuditStatus] å¿½ç•¥ä¸æ”¯æŒçš„ BPM çŠ¶æ€({}),taskId={}", bpmStatus, id);
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/listener/MesWmStockTakingTaskStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * MES ç›˜ç‚¹ç»“果审批状态监听器
 *
 * å®¡æ‰¹å¯¹è±¡æ˜¯ç›˜ç‚¹ä»»åŠ¡ä¸‹çš„ç›˜ç‚¹ç»“æžœï¼Œä¸šåŠ¡ä¸Šä»¥ç›˜ç‚¹ä»»åŠ¡è®°å½•å®¡æ‰¹çŠ¶æ€ï¼Œ
 * å› æ­¤ businessKey ä¸ºç›˜ç‚¹ä»»åŠ¡ç¼–å·ï¼Œå›žå†™çš„ä¹Ÿæ˜¯è¯¥ä»»åŠ¡ã€‚
 */
@Component
@Slf4j
public class MesWmStockTakingTaskStatusListener extends BpmProcessInstanceStatusEventListener {
    private static final String PROCESS_DEFINITION_KEY = "stock_taking_result_approve";
    @Resource
    private MesWmStockTakingTaskService stockTakingTaskService;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long taskId;
        try {
            taskId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„盘点任务编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ°ç›˜ç‚¹ç»“果审批事件,taskId={}, status={}", taskId, event.getStatus());
        try {
            stockTakingTaskService.updateStockTakingResultAuditStatus(taskId, event.getStatus(), event.getReason());
        } catch (Exception e) {
            log.error("[onEvent] å›žå†™ç›˜ç‚¹ç»“果审批状态失败,taskId={}", taskId, e);
        }
    }
}