feat: 完成好水川 MOM 需求1/2/4/5/8(装箱、BOM成本、销售合同、劳动合同、留样)
已添加30个文件
已修改63个文件
3745 ■■■■■ 文件已修改
docs/project-business/data/flows.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/data/modules.json 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/data/objects.json 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/index.html 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/mermaid/02-sales-flow.mmd 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/mermaid/04-production-flow.mmd 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/mermaid/05-quality-flow.mmd 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/mermaid/09-data-flow.mmd 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/mermaid/10-business-object.mmd 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/config_export_all_20261023.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_package_sale_order_id_20261105.sql 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_pro_hotpot_route_init_20261105.sql 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_qc_retention_sample_init_20261105.sql 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/contract/CrmContractApi.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/contract/dto/CrmContractCreateFromSaleOrderReqDTO.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/contract/dto/CrmContractRespDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/api/contract/CrmContractApiImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | 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 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApi.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApiImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderItemMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/HrmEmployeeContractController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeContractDocumentRespVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractDocumentService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractDocumentServiceImpl.java 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/resources/templates/hrm/employee-contract-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/alert/MesProOverConsumeAlertController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/alert/vo/MesProOverConsumeAlertPageReqVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/alert/vo/MesProOverConsumeAlertRespVO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/mps/MesProMpsController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/mps/vo/MesProMpsRespVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/MesQcRetentionSampleController.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/vo/MesQcRetentionSamplePageReqVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/vo/MesQcRetentionSampleRespVO.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/vo/MesQcRetentionSampleSaveReqVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesStatisticsPageReqVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesStatisticsRespVO.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/alert/MesProOverConsumeAlertDO.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/retentionsample/MesQcRetentionSampleDO.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/alert/MesProOverConsumeAlertMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/mps/MesProMpsMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/retentionsample/MesQcRetentionSampleMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemconsume/MesWmItemConsumeLineMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProMaterialPriceService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProMaterialPriceServiceImpl.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProWorkOrderCostService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProWorkOrderCostServiceImpl.java 430 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/dto/MesProMaterialPriceRespDTO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/retentionsample/MesQcRetentionSampleService.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/retentionsample/MesQcRetentionSampleServiceImpl.java 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/resources/mapper/pro/workorder/MesProWorkOrderMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/resources/mapper/wm/productsales/MesWmProductSalesMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/data/flows.json
@@ -1,12 +1,12 @@
{
  "flows": [
    {"id": "sales", "name": "销售流程", "mermaid": "mermaid/02-sales-flow.mmd", "color": "#4f9cff",
     "summary": "线索转化客户 â†’ å•†æœºæŽ¨è¿› â†’ æŠ¥ä»·(可AI识别) â†’ åˆåŒ BPM å®¡æ‰¹ â†’ ç”Ÿæˆ ERP é”€å”®è®¢å•并审批 â†’ éœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS â†’ å‘货通知 â†’ é”€å”®å‡ºåº“(OQC)回写 â†’ å¼€ç¥¨(BPM) â†’ å›žæ¬¾(先开票校验)。",
     "summary": "线索转化客户 â†’ å•†æœºæŽ¨è¿› â†’ æŠ¥ä»·(可AI识别) â†’ åˆåŒ BPM å®¡æ‰¹ â†’ ç”Ÿæˆ ERP é”€å”®è®¢å•并审批(无关联合同时自动反向生成草稿合同) â†’ éœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS â†’ å‘货通知 â†’ é”€å”®å‡ºåº“(OQC)回写 â†’ å¼€ç¥¨(BPM) â†’ å›žæ¬¾(先开票校验)。",
     "steps": [
       {"stage": "获客", "action": "线索转化客户、建联系人、立项商机", "roles": ["销售内勤"]},
       {"stage": "报价", "action": "商机赢单后建报价单(AI OCR é¢„å¡«),转合同", "roles": ["销售内勤"]},
       {"stage": "签约", "action": "合同来源:手工新建 / æŠ¥ä»·å•转入 / Excel å¯¼å…¥(一合同多产品明细行);提交 BPM å®¡æ‰¹(可选流程定义),通过=20", "roles": ["销售", "审批人"]},
       {"stage": "接单", "action": "合同一键生成销售订单(XSDD),销售订单再走 BPM;审批通过自动为 needProduction æ˜Žç»†åˆ›å»º MPS", "roles": ["销售", "计划员"]},
       {"stage": "接单", "action": "合同一键生成销售订单(XSDD),销售订单再走 BPM;审批通过自动为 needProduction æ˜Žç»†åˆ›å»º MPS;订单无关联合同时按客户名称-销售合同-订单号自动生成 CRM è‰ç¨¿åˆåŒ(草稿不发起审批,负责人取销售员,同单只生成一份,生成失败不阻塞订单审批)", "roles": ["销售", "计划员"]},
       {"stage": "交付", "action": "发货通知审核(占用)→ é”€å”®å‡ºåº“ OQC â†’ å‘运 â†’ å‡ºåº“回写部分/全部出库", "roles": ["仓管", "质检"]},
       {"stage": "回款", "action": "开票 BPM(累计≤合同额) â†’ å›žæ¬¾å¼ºåˆ¶å…ˆå¼€ç¥¨(累计≤合同剩余与开票剩余)", "roles": ["财务", "销售"]}]},
    {"id": "purchase", "name": "采购流程", "mermaid": "mermaid/03-purchase-flow.mmd", "color": "#5fc79e",
@@ -20,16 +20,17 @@
       {"stage": "退货", "action": "IQC ä¸åˆæ ¼é€€è´§â†’供应商退货出库(选料锁定到订单行);报废走 NCR", "roles": ["仓管"]},
       {"stage": "付款", "action": "采购来票(FPD, AI OCR, â‰¤è®¢å•总价) â†’ ä»˜æ¬¾å•(FKD å…³è”来票+附件, â‰¤æ¥ç¥¨é‡‘额) BPM å®¡æ‰¹", "roles": ["财务", "审批人"]}]},
    {"id": "production", "name": "生产流程", "mermaid": "mermaid/04-production-flow.mmd", "color": "#e0b34f",
     "summary": "销售订单驱动 MPS â†’ ä¸‹å‘工单 â†’ æŒ‰å·¥è‰ºè·¯çº¿æ‹†å·¥åºä»»åŠ¡ â†’ é¢†æ–™/线边备料 â†’ æŠ¥å·¥(工序顺序硬校验+BPM) â†’ å€’冲消耗/产出入库/IPQC â†’ æœ«é“工序回写进度 â†’ è‡ªåŠ¨å®Œå·¥ â†’ ProductionFinishedEvent å›žå†™é”€å”®è®¢å•。",
     "summary": "销售订单驱动 MPS â†’ ä¸‹å‘工单 â†’ æŒ‰å·¥è‰ºè·¯çº¿æ‹†å·¥åºä»»åŠ¡ â†’ ç®—æ–™(产品BOM×工单数量·带单价/金额) â†’ é¢†æ–™/线边备料 â†’ æŠ¥å·¥(工序顺序硬校验+BPM) â†’ å€’冲消耗/产出入库/IPQC â†’ å®¡æ‰¹åŽè‡ªåŠ¨é‡ç®—å·¥å•ç‰©æ–™æˆæœ¬å¹¶å¯¹è¶…è€—ç‰©æ–™ç«™å†…ä¿¡æŠ¥è­¦ â†’ æœ«é“工序回写进度 â†’ è‡ªåŠ¨å®Œå·¥ â†’ ProductionFinishedEvent å›žå†™é”€å”®è®¢å•ï¼›MPS æˆæœ¬æŒ‰è®¡åˆ’数量占工单数量分摊。",
     "steps": [
       {"stage": "计划", "action": "MPS åˆ›å»º(手工或销售订单自动)→下发或合并下发为工单", "roles": ["计划员"]},
       {"stage": "派工", "action": "工单确认按工艺路线逐工序生成任务,可指派/暂停/取消", "roles": ["车间主任"]},
       {"stage": "备料", "action": "生产领料单出库或线边虚拟库备料", "roles": ["仓管"]},
       {"stage": "报工", "action": "提交报工:上一道工序未报满直接拦截;启用 BPM èµ°å®¡æ‰¹", "roles": ["操作工"]},
       {"stage": "联动", "action": "审批通过按工序标记: å€’冲→自动物料消耗扣线边库(允许负库存);质检→产出待检行等 IPQC;关键非检→直接产出入库", "roles": ["系统自动"]},
       {"stage": "完工", "action": "仅末道工序回写工单已生产数量,达标自动完成;MPS ç´¯è®¡åˆ¤æ–­å®Œæˆå¹¶å‘事件给销售订单", "roles": ["系统自动"]}]},
       {"stage": "核算", "action": "算料:产品 BOM å•位用量×工单数量展开原材料(无产品BOM回退路线产出链/工单BOM),带需求数量/已消耗/单价/需求金额,价格取物料采购价否则取已审核采购订单加权均价,均无则金额为0并标记缺价;成本:报工审批后自动重算工单标准/实际/超耗物料成本与实际单位成本(实际消耗取倒冲消耗记录,已报工数量取工单产量与各工序审批报工累计的最大值);超耗阈值按 å·¥å•→产品→全局参数(默认5%) å–值,单料实际消耗>标准用量×(1+阈值%)即生成报警记录并按参数配置的接收人发站内信,同工单同物料仅报一次;MPS æˆæœ¬æŒ‰ MPS计划数量÷工单数量 åˆ†æ‘Š", "roles": ["系统自动", "计划员"]},
       {"stage": "完工", "action": "仅末道工序回写工单已生产数量,达标自动完成;人工完成要求已生产数量>0(为 0 æ‹¦æˆªï¼‰ï¼›å®Œå·¥å‰å¿…须已登记留样记录(手工完成与自动完工一致,未登记拦截);完工时同步关联 MPS ä¸ºå·²å®Œæˆå¹¶å›žå†™äº§é‡ä¸Žå®Œæˆæ—¥æœŸï¼ŒMPS ç´¯è®¡åˆ¤æ–­å®Œæˆå¹¶å‘事件给销售订单", "roles": ["系统自动"]}]},
    {"id": "quality", "name": "质量流程", "mermaid": "mermaid/05-quality-flow.mmd", "color": "#e06c6c",
     "summary": "四道检验闸口(IQC/IPQC/OQC/RQC,二态 0→4) + åˆ¤å®šå››æžœ(合格/特采/退货/报废) + NCR è¯„审处置关闭;AI æä¾›åˆ¤å®šå»ºè®®ï¼›NCR å½“前仅台账不触发返工单;检验单可由智能质检报告平台一键出件(generate-from-qc:数据从 MES å–,五道校验后渲染落库)。",
     "summary": "四道检验闸口(IQC/IPQC/OQC/RQC,二态 0→4) + åˆ¤å®šå››æžœ(合格/特采/退货/报废) + NCR è¯„审处置关闭 + å®Œå·¥ç•™æ ·ç™»è®°ï¼›AI æä¾›åˆ¤å®šå»ºè®®ï¼›NCR å½“前仅台账不触发返工单;检验单可由智能质检报告平台一键出件(generate-from-qc:数据从 MES å–,五道校验后渲染落库)。",
     "steps": [
       {"stage": "来料", "action": "到货通知/外协入库→IQC,结论回写推进待入库或触发退货", "roles": ["IQC è´¨æ£€å‘˜"]},
       {"stage": "过程", "action": "报工质检工序产出行→IPQC,合格拆行入库、不合格生成 NCR", "roles": ["IPQC è´¨æ£€å‘˜"]},
@@ -37,6 +38,7 @@
       {"stage": "退货", "action": "退料/销售退货/售后退货→RQC,结论回调单据与售后", "roles": ["RQC è´¨æ£€å‘˜"]},
       {"stage": "导入", "action": "IQC/IPQC/OQC ä¸‰åˆ—表各支持 Excel æ‰¹é‡å¯¼å…¥(按钮在「新增」与「导出」之间,纯新增不做更新覆盖):一行一张单,编号留空自动生成,质检方案留空按物料+检验类型自动匹配,检测人员留空取当前登录用户;物料/供应商/客户/工单/工位按编码或名称精确匹配(IPQC ç‰©æ–™ç”±å·¥å•推导,模板不填),合格+不合格=检测/接收数量、IPQC å·¥åºŸ+料废+其他废品≤不合格、OQC å®¢æˆ·é¡»åœ¨æœ¬äººæ•°æ®æƒé™å†…;逐行导入部分成功,失败行进 failureList å¸¦è¡Œå·ä¸Žå¯æ‰§è¡ŒåŠ¨ä½œï¼ŒæˆåŠŸå•ä¸€å¾‹å¾…æ£€éªŒ0;同一批数据不可重复导入:文件内重复行与库内已存在同业务键单据(IQC ç‰©æ–™+供应商+供应商批次+来料日期、IPQC ç”Ÿäº§å·¥å•+检验类型+工位+检测日期、OQC ç‰©æ–™+客户+批次号+出货日期)均拒该行,提示含维度、双方实际值与「先删除该单据再重试」动作", "roles": ["质检员", "IQC è´¨æ£€å‘˜", "IPQC è´¨æ£€å‘˜", "OQC è´¨æ£€å‘˜"]},
       {"stage": "不合格", "action": "NCR: å¾…评审→评审→处置(退货/报废/返工/让步接收/降级)→关闭", "roles": ["质量工程师"]},
       {"stage": "留样", "action": "生产工单完工前必须登记留样记录(一张工单一条,编号 LY+日期+4位流水,留样数量默认 2 ä»¶ï¼Œåˆ°æœŸ=留样日期+6个月);销售订单按 MPS è‡ªåŠ¨ç»‘å®šã€åˆå¹¶ä¸‹å‘å¤šå•éœ€æŒ‡å®šã€å®¢æˆ·è®¢å•æ¥æºæŒ‰æ¥æºå•å·æ ¡éªŒã€åº“å­˜å¤‡è´§å¯ä¸ç»‘å®šï¼ŒMPS è®°å½•的销售订单在系统中不存在时提示并阻断保存;手工完成与报工达标自动完工均校验,未登记拦截;工单已完成不允许删除留样", "roles": ["质检员", "留样管理员"]},
       {"stage": "出件", "action": "两条出件入口:①通用 generate/preview(调用方自带上下文) æ¸²æŸ“ HTML å¹¶å†»ç»“数据快照,编号 QR+日期+4位流水按天独立,preview åªæ¸²æŸ“不落库不消耗编号,regenerate ç”¨å†»ç»“快照重渲且数据与编号不变并作废已归档 PDF,导出 PDF ç”±åŽç«¯è°ƒ Chromium æ‰“印实例已存的 HTML åŽå½’档附件中心;②generate-from-qc ç”±è´¨æ£€å•直接出件(数据经 MesQcReportApi ä»Ž MES å–,前端不拼上下文),出件前五道校验按业务优先级只报第一处:类型非法/单据不存在/未完成检验/未填判定/模板类型不符/无可用检验项,报告头另带单据原判定 qcResult+qcResultText ä¸Žå¼•擎判定并存,响应回 undecidableCount å¾…判定项数与 warnings(分组标题跳过/指标已删/未录实测值/样品超3),同一张单据可反复出多份", "roles": ["质检员"]},
       {"stage": "建模板", "action": "AI å¯¼å…¥ï¼šä¸Šä¼ æ—¢æœ‰æ£€éªŒæŠ¥å‘Šæ–‡ä»¶(扫描件/照片、电子版 PDF、Word/Excel) â†’ è¯†åˆ«æˆæ¨¡æ¿è‰ç¨¿(不落库) â†’ äººå·¥åœ¨è®¾è®¡å™¨ç¡®è®¤è°ƒæ•´åŽä¿å­˜ä¸ºç‰ˆæœ¬ï¼›.doc/.xls æ—§æ ¼å¼ä¸æ”¯æŒ", "roles": ["质检员", "质量工程师"]}]},
    {"id": "warehouse", "name": "仓储流程", "mermaid": "mermaid/06-warehouse-flow.mmd", "color": "#7e6bd6",
docs/project-business/data/modules.json
@@ -35,8 +35,8 @@
    {"key": "pro", "name": "生产管理", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production",
     "positioning": "生产执行核心:计划-工单-任务-报工",
     "problem": "订单到车间执行的逐层拆解与过程可控",
     "features": ["MPS主生产计划(可由销售订单自动创建·合并下发)", "工单(按工艺路线自动生成工序任务)", "报工(按工序顺序控制·BPM审批)", "倒冲扣线边库/产出入库", "安灯", "工艺路线·工序·工单BOM", "研发设计项目(PD·审批归档)", "AI å››ç±»é¢„测"],
     "objects": ["MPS", "生产工单", "生产任务", "报工单", "工艺路线", "工单BOM", "设计项目"],
     "features": ["MPS主生产计划(可由销售订单自动创建·合并下发)", "工单(按工艺路线自动生成工序任务)", "报工(按工序顺序控制·BPM审批)", "倒冲扣线边库/产出入库", "安灯", "工艺路线·工序·工单BOM", "工单算料(产品BOM×数量·单价取采购价/已审核采购加权均价·缺价标记)", "工单物料成本(标准/实际/超耗/实际单位成本·报工审批后自动重算)", "超耗报警(工单→产品→全局阈值·站内信指定接收人·同工单同物料一次)", "MPS成本按计划数量占工单数量分摊", "研发设计项目(PD·审批归档)", "AI å››ç±»é¢„测"],
     "objects": ["MPS", "生产工单", "生产任务", "报工单", "工艺路线", "工单BOM", "超耗报警", "设计项目"],
     "roles": ["计划员", "车间主任", "操作工", "工艺员"],
     "upstream": ["进销存(销售订单)"], "downstream": ["仓储(领料/入库)", "质量(IPQC)"],
     "coreTables": ["mes_pro_mps", "mes_pro_work_order", "mes_pro_task", "mes_pro_feedback", "mes_pro_route", "mes_pro_process", "mes_pro_work_order_bom", "mes_pd_project"]},
@@ -51,11 +51,11 @@
    {"key": "qc", "name": "质量管理", "color": "#e06c6c", "tag": "MES-QC", "flow": "quality",
     "positioning": "四道检验闸口 + ä¸åˆæ ¼å“é—­çŽ¯å¤„ç½®",
     "problem": "来料/过程/出货/退货检验标准化,不合格可追溯处置",
     "features": ["IQC æ¥æ–™(到货/外协)", "IPQC è¿‡ç¨‹(联动报工)", "OQC å‡ºè´§(联动销售出库)", "RQC é€€è´§(联动退料/售后)", "质检方案·指标·缺陷库", "检测结果:合格/特采/退货/报废", "NCR:评审→处置(退货/报废/返工/让步/降级)→关闭", "AI åˆ¤å®šå»ºè®®"],
     "objects": ["IQC", "IPQC", "OQC", "RQC", "质检方案", "NCR", "缺陷记录"],
     "features": ["IQC æ¥æ–™(到货/外协)", "IPQC è¿‡ç¨‹(联动报工)", "OQC å‡ºè´§(联动销售出库)", "RQC é€€è´§(联动退料/售后)", "质检方案·指标·缺陷库", "检测结果:合格/特采/退货/报废", "NCR:评审→处置(退货/报废/返工/让步/降级)→关闭", "留样管理(工单完工前必登·一工单一条·绑定销售订单·到期=留样日期+6个月)", "AI åˆ¤å®šå»ºè®®"],
     "objects": ["IQC", "IPQC", "OQC", "RQC", "质检方案", "NCR", "缺陷记录", "留样记录"],
     "roles": ["质检员(IQC/IPQC/OQC)", "质量工程师"],
     "upstream": ["仓储(到货)", "生产(报工)", "销售(出库)", "售后(退货)"], "downstream": ["仓储(合格入库/报废出库)", "生产(NCR返工)"],
     "coreTables": ["mes_qc_iqc", "mes_qc_ipqc", "mes_qc_oqc", "mes_qc_rqc", "mes_qc_template", "mes_qc_indicator", "mes_qc_defect", "mes_qc_ncr"]},
     "coreTables": ["mes_qc_iqc", "mes_qc_ipqc", "mes_qc_oqc", "mes_qc_rqc", "mes_qc_template", "mes_qc_indicator", "mes_qc_defect", "mes_qc_ncr", "mes_qc_retention_sample"]},
    {"key": "qcreport", "name": "智能质检报告", "color": "#b06ce0", "tag": "QC-REPORT", "flow": "quality",
     "positioning": "可视化设计报告模板 â†’ ä¸€é”®å‡ºä»¶å¹¶å†»ç»“历史报告",
     "problem": "各行业质检报告格式各异,排版硬编码改一次发一次版;且历史报告必须可复现、不随业务数据变化",
@@ -83,11 +83,11 @@
    {"key": "hrm", "name": "人力资源", "color": "#9db85a", "tag": "HRM", "flow": null,
     "positioning": "员工入转调离与考勤薪酬",
     "problem": "人事流程审批化、离职数据不丢(交接)、算薪自动化",
     "features": ["员工档案(入职自动建系统账号)", "请假/加班/调岗/离职 BPM å®¡æ‰¹", "离职交接映射 expandUserIds", "考勤(移动端我的考勤状态·打卡·规则·排班·补卡审批·月度汇总)", "薪酬(应发-社保公积金-个税-请假扣款·1.5/2/3倍加班费·发放台账)", "培训证书(SQL先行待实现)"],
     "objects": ["员工", "请假单", "离职申请", "交接映射", "考勤记录", "薪酬核算"],
     "features": ["员工档案(入职自动建系统账号)", "请假/加班/调岗/离职 BPM å®¡æ‰¹", "离职交接映射 expandUserIds", "员工合同台账(续签链·到期提醒·Excel导入·到期状态动态计算)", "合同文档生成(Word模板占位符填充→系统文件库→合同附件归档)", "考勤(移动端我的考勤状态·打卡·规则·排班·补卡审批·月度汇总)", "薪酬(应发-社保公积金-个税-请假扣款·1.5/2/3倍加班费·发放台账)", "培训证书(SQL先行待实现)"],
     "objects": ["员工", "员工合同", "请假单", "离职申请", "交接映射", "考勤记录", "薪酬核算"],
     "roles": ["HR", "部门主管", "员工本人"],
     "upstream": [], "downstream": ["各模块(数据可见性扩展)", "system(账号)"],
     "coreTables": ["hrm_employee", "hrm_leave_application", "hrm_resignation_application", "hrm_user_handover", "hrm_attendance_record", "hrm_salary_calculation", "hrm_salary_payment"]},
     "coreTables": ["hrm_employee", "hrm_employee_contract", "hrm_leave_application", "hrm_resignation_application", "hrm_user_handover", "hrm_attendance_record", "hrm_salary_calculation", "hrm_salary_payment"]},
    {"key": "bpm", "name": "协同审批", "color": "#e6a23c", "tag": "BPM", "flow": null,
     "positioning": "全系统单据审批中枢(Flowable)",
     "problem": "多模块单据需要灵活可配的多级审批",
docs/project-business/data/objects.json
@@ -7,7 +7,7 @@
    {"name": "联系人", "module": "销售管理", "table": "crm_contact", "doc": "客户下联系人,与商机多对多", "upstream": ["客户"], "downstream": ["商机"], "keywords": "联系人 contact"},
    {"name": "商机", "module": "销售管理", "table": "crm_business", "doc": "销售机会,DB é…ç½®å¼é˜¶æ®µæŽ¨è¿›ï¼Œç»“束态: èµ¢/输/无效", "upstream": ["客户"], "downstream": ["报价单", "合同"], "keywords": "商机 business èµ¢å• è¾“单 é˜¶æ®µ"},
    {"name": "报价单", "module": "销售管理", "table": "crm_sale_quotation", "doc": "QT编号,选 MDM ç‰©æ–™æŠ¥ä»·ï¼ŒAI OCR å½•入,草稿→已转合同", "upstream": ["商机"], "downstream": ["合同"], "keywords": "报价 quotation QT"},
    {"name": "合同", "module": "销售管理", "table": "crm_contract", "doc": "HT编号,BPM å®¡æ‰¹(0草稿/10审批中/20通过/30驳回/40取消/50作废),通过后可生成销售订单;支持 Excel å¯¼å…¥ï¼ˆä¸€åˆåŒå¤šäº§å“æ˜Žç»†è¡Œã€åˆå¹¶å•元格自动拉平,客户与物料按名称/编码校验);产品明细带出物料名称/编码/条码/规格型号/计量单位;删除合同时连带删除产品明细,不留孤儿数据", "upstream": ["报价单"], "downstream": ["销售订单", "回款计划", "开票"], "keywords": "合同 contract å®¡æ‰¹ å¯¼å…¥"},
    {"name": "合同", "module": "销售管理", "table": "crm_contract", "doc": "HT编号,BPM å®¡æ‰¹(0草稿/10审批中/20通过/30驳回/40取消/50作废),通过后可生成销售订单;支持 Excel å¯¼å…¥ï¼ˆä¸€åˆåŒå¤šäº§å“æ˜Žç»†è¡Œã€åˆå¹¶å•元格自动拉平,客户与物料按名称/编码校验);产品明细带出物料名称/编码/条码/规格型号/计量单位;删除合同时连带删除产品明细,不留孤儿数据;销售订单审批通过且订单无关联合同时,系统按「客户名称-销售合同-订单号」自动反向生成草稿合同(不自动提交审批,同一订单仅一份,失败不影响订单审批)", "upstream": ["报价单", "销售订单(自动生成)"], "downstream": ["销售订单", "回款计划", "开票"], "keywords": "合同 contract å®¡æ‰¹ å¯¼å…¥ è‡ªåŠ¨ç”Ÿæˆ"},
    {"name": "发票", "module": "销售管理", "table": "crm_invoice", "doc": "KP编号(可留空自动生成、系统内唯一),BPM å®¡æ‰¹ï¼Œç´¯è®¡å¼€ç¥¨â‰¤åˆåŒé¢ï¼Œé™„件必传;支持 Excel å¯¼å…¥ï¼ˆä»…新增不更新,合同须审核通过且本次金额≤合同剩余可开票额;同一批数据不可重复导入——同合同下发票号码相同、或发票号码留空时开票金额+发票抬头+开票日期相同即判重复,文件内重复行与库内已有单都拒该行并回显维度与实际值)", "upstream": ["合同"], "downstream": ["回款"], "keywords": "开票 å‘票 invoice å¯¼å…¥ åŽ»é‡"},
    {"name": "回款", "module": "销售管理", "table": "crm_receivable", "doc": "HK编号,创建即审批中(手动审核),强制先开票,金额双校验", "upstream": ["合同", "发票"], "downstream": ["收款单(关联)"], "keywords": "回款 æ”¶æ¬¾è®¡åˆ’ receivable"},
    {"name": "销售目标", "module": "销售管理", "table": "crm_sales_target", "doc": "å¹´/å­£/月×个人/部门/产品维度的合同回款等目标", "upstream": [], "downstream": ["业绩统计"], "keywords": "目标 target ä¸šç»©"},
@@ -19,11 +19,12 @@
    {"name": "采购来票", "module": "进销存", "table": "erp_purchase_invoice", "doc": "FPD编号,AI OCR é¢„填,累计≤订单总价,付款单的前置", "upstream": ["采购订单"], "downstream": ["付款单"], "keywords": "来票 å‘票 é‡‡è´­å‘票"},
    {"name": "付款单", "module": "财务", "table": "erp_finance_payment", "doc": "FKD编号,必须关联来票+附件,累计≤来票金额,BPM å®¡æ‰¹", "upstream": ["采购来票"], "downstream": ["结算账户"], "keywords": "付款 åº”付 payment"},
    {"name": "收款单", "module": "财务", "table": "erp_finance_receipt", "doc": "SKD编号,关联 CRM å®¢æˆ·æ ¡éªŒï¼Œæ—  BPM(手动审核)", "upstream": ["销售(弱关联)"], "downstream": ["结算账户"], "keywords": "收款 åº”æ”¶ receipt"},
    {"name": "销售订单", "module": "进销存", "table": "erp_sale_order", "doc": "XSDD编号,BPM å®¡æ‰¹ï¼Œéœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS,出库状态:未0已预留1部分2全部3,生产完成事件回写", "upstream": ["合同"], "downstream": ["MPS", "发货通知", "销售出库", "售后工单"], "keywords": "销售订单 sale"},
    {"name": "主生产计划", "module": "生产", "table": "mes_pro_mps", "doc": "MPS计划,草稿0→已下发1→完成2/取消3,可合并下发", "upstream": ["销售订单"], "downstream": ["生产工单"], "keywords": "MPS ä¸»è®¡åˆ’ ç”Ÿäº§è®¡åˆ’"},
    {"name": "生产工单", "module": "生产", "table": "mes_pro_work_order", "doc": "草稿0→已确认1→完成2/取消3,确认时按工艺路线生成任务,最后一道工序报工回写已生产数量", "upstream": ["MPS"], "downstream": ["生产任务", "领料", "完工入库"], "keywords": "工单 ç”Ÿäº§å·¥å• work order"},
    {"name": "销售订单", "module": "进销存", "table": "erp_sale_order", "doc": "XSDD编号,BPM å®¡æ‰¹ï¼Œéœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS;审批通过且订单无关联合同时自动生成 CRM è‰ç¨¿åˆåŒå¹¶å›žå†™ contractId/contractNo(订单来自合同时跳过),合同生成失败不阻塞审批;出库状态:未0已预留1部分2全部3,生产完成事件回写", "upstream": ["合同", "手工新建"], "downstream": ["MPS", "合同(自动生成)", "发货通知", "销售出库", "售后工单"], "keywords": "销售订单 sale è‡ªåŠ¨åˆåŒ"},
    {"name": "主生产计划", "module": "生产", "table": "mes_pro_mps", "doc": "MPS计划,草稿0→已下发1→完成2/取消3,可合并下发,关联工单完成时自动回写完成状态、产量与完成日期", "upstream": ["销售订单"], "downstream": ["生产工单"], "keywords": "MPS ä¸»è®¡åˆ’ ç”Ÿäº§è®¡åˆ’"},
    {"name": "生产工单", "module": "生产", "table": "mes_pro_work_order", "doc": "草稿0→已确认1→完成2/取消3,确认时按工艺路线生成任务,最后一道工序报工回写已生产数量;人工完成要求已生产数量>0,完工时同步关联 MPS å·²å®Œæˆï¼›è®°å½•超耗报警比例(工单覆盖)与标准/实际/超耗物料成本、物料单位成本、成本更新时间,报工审批后自动重算", "upstream": ["MPS"], "downstream": ["生产任务", "领料", "完工入库", "超耗报警"], "keywords": "工单 ç”Ÿäº§å·¥å• work order æˆæœ¬ ç®—æ–™"},
    {"name": "生产任务", "module": "生产", "table": "mes_pro_task", "doc": "工序粒度,预备0→生产中1→部分2→完成4,可暂停9取消5", "upstream": ["生产工单"], "downstream": ["报工"], "keywords": "任务 task å·¥åº"},
    {"name": "报工单", "module": "生产", "table": "mes_pro_feedback", "doc": "草稿0→审批中2→待检3/完成4,按工序顺序校验(上道工序报满才可报),联动倒冲消耗/产出入库/IPQC", "upstream": ["生产任务"], "downstream": ["产品产出", "物料消耗", "IPQC"], "keywords": "报工 feedback"},
    {"name": "报工单", "module": "生产", "table": "mes_pro_feedback", "doc": "草稿0→审批中2→待检3/完成4,按工序顺序校验(上道工序报满才可报),联动倒冲消耗/产出入库/IPQC;审批通过后触发工单物料成本重算与超耗报警检查", "upstream": ["生产任务"], "downstream": ["产品产出", "物料消耗", "IPQC", "工单成本", "超耗报警"], "keywords": "报工 feedback"},
    {"name": "超耗报警", "module": "生产", "table": "mes_pro_over_consume_alert", "doc": "报工审批后按 å·¥å•→产品→全局参数 é˜ˆå€¼åˆ¤å®šï¼Œå®žé™…消耗>标准用量×(1+阈值%)时生成;记录标准/实际/超耗数量、超耗比例、单价与超耗金额,同一工单同物料仅一条,发送站内信给参数指定用户,状态 SENT/FAILED", "upstream": ["报工单", "物料消耗"], "downstream": ["站内信"], "keywords": "超耗 æŠ¥è­¦ æˆæœ¬ over consume alert"},
    {"name": "工艺路线", "module": "生产", "table": "mes_pro_route", "doc": "工序顺序+质检/关键/倒冲标记,驱动工单任务与报工规则", "upstream": [], "downstream": ["生产工单"], "keywords": "工艺 è·¯çº¿ route å·¥åº"},
    {"name": "到货通知单", "module": "仓储", "table": "mes_wm_arrival_notice", "doc": "采购订单确认收货生成,草稿0→待质检2→待入库3→完成4", "upstream": ["采购订单"], "downstream": ["IQC", "采购入库"], "keywords": "到货 æ”¶è´§ arrival"},
    {"name": "采购入库单", "module": "仓储", "table": "mes_wm_item_receipt", "doc": "草稿0→待上架2→待执行3→完成4,完成后库存+并回写 ERP inCount/inStatus", "upstream": ["到货通知"], "downstream": ["库存台账", "采购订单(回写)"], "keywords": "采购入库 æ”¶è´§å…¥åº“ receipt"},
@@ -40,10 +41,12 @@
    {"name": "OQC出货检验", "module": "质量", "table": "mes_qc_oqc", "doc": "销售出库提交触发,完成推进出库单待拣货;行操作「出报告」仅在已完成时可见;支持 Excel æ‰¹é‡å¯¼å…¥ï¼ˆå®¢æˆ·é¡»åœ¨å½“前登录用户的客户数据权限范围内);同一批数据不可重复导入(物料+客户+批次号+出货日期,文件内重复行与库内已有单都拒该行)", "upstream": ["销售出库单", "Excel æ‰¹é‡å¯¼å…¥"], "downstream": ["销售出库单(推进)", "报告实例(出报告)"], "keywords": "OQC å‡ºè´§æ£€éªŒ å‡ºåŽ‚æ£€éªŒ å‡ºæŠ¥å‘Š æ‰¹é‡å¯¼å…¥ å¯¼å…¥æ¨¡æ¿"},
    {"name": "RQC退货检验", "module": "质量", "table": "mes_qc_rqc", "doc": "生产退料/销售退货/售后退货触发,结论回调售后;行操作「出报告」仅在已完成时可见。措辞已统一为「退货检验」(原菜单父项与 mes_qc_type å­—典写「退料检验」,与后端枚举/表注释/菜单权限子项不一致;RQC ä¸‰è€…都覆盖,故取「退货检验」)", "upstream": ["退料", "退货"], "downstream": ["退货入库", "售后回调", "报告实例(出报告)"], "keywords": "RQC é€€è´§æ£€éªŒ é€€æ–™æ£€éªŒ å‡ºæŠ¥å‘Š"},
    {"name": "NCR不合格品", "module": "质量", "table": "mes_qc_ncr", "doc": "待评审0→已评审6→已处置7→已关闭8,处置:退货/报废/返工/让步接收/降级", "upstream": ["IQC/IPQC/OQC/RQC"], "downstream": ["退货/报废/返工(台账)"], "keywords": "NCR ä¸åˆæ ¼ å¤„ç½® ç‰¹é‡‡ æŠ¥åºŸ"},
    {"name": "留样记录", "module": "质量", "table": "mes_qc_retention_sample", "doc": "生产工单完工前必须登记,一张工单只能一条(work_order_id å”¯ä¸€ï¼‰ï¼›ç¼–号 LY+yyyyMMdd+4位流水按天生成;留样数量默认 2 ä»¶ï¼Œåˆ°æœŸæ—¥æœŸé»˜è®¤ç•™æ ·æ—¥æœŸ+6个月;销售订单按 MPS ä¸‹å‘记录自动绑定,合并下发多张订单时需指定本次留样对应订单,客户订单来源工单按来源单号校验,库存备货工单可不绑定,MPS è®°å½•的销售订单在系统中不存在时提示并阻断保存;手工完成与报工达标自动完工均校验留样,未登记拦截;工单已完成不允许删除留样", "upstream": ["生产工单", "MPS(销售订单)"], "downstream": ["工单完成校验", "销售订单(追溯)"], "keywords": "留样 ç•™æ ·è®°å½• retention sample å®Œå·¥ç•™æ · é”€å”®è®¢å•绑定"},
    {"name": "设备", "module": "设备", "table": "mes_dv_machinery", "doc": "台账状态:停机/生产中/保养中;点检·保养·维修工单;AI é£Žé™©é¢„测消费其数据", "upstream": [], "downstream": ["点检", "ç»´ä¿®", "生产风险预测"], "keywords": "设备 ç‚¹æ£€ ä¿å…» ç»´ä¿® machinery"},
    {"name": "售后工单", "module": "售后", "table": "after_sale_ticket", "doc": "草稿0→处理中10→待入库30→待退款40→完结50→关闭60/取消99,判定:一般/ç»´ä¿®/退货", "upstream": ["客户反馈(人工录入)"], "downstream": ["维修记录", "退货申请"], "keywords": "售后 å·¥å• ticket ç»´ä¿®"},
    {"name": "退货申请", "module": "售后", "table": "after_sale_return", "doc": "草稿0→已审核20(自动建MES退货单)→已质检40→已入库50→已退款60→关闭70;类型:退款退货/换货/仅退款", "upstream": ["售后工单"], "downstream": ["销售退货单", "退款"], "keywords": "售后退货 return"},
    {"name": "员工", "module": "人力", "table": "hrm_employee", "doc": "在职1/试用2/离职3,入职自动建系统账号", "upstream": [], "downstream": ["交接映射", "考勤", "薪酬"], "keywords": "员工 å…¥èŒ employee"},
    {"name": "员工", "module": "人力", "table": "hrm_employee", "doc": "在职1/试用2/离职3,入职自动建系统账号", "upstream": [], "downstream": ["交接映射", "员工合同", "考勤", "薪酬"], "keywords": "员工 å…¥èŒ employee"},
    {"name": "员工合同", "module": "人力", "table": "hrm_employee_contract", "doc": "一个员工多份合同(续签链 parentId、当前合同 isCurrent);合同类型/期限类型走字典,固定期限必须填结束日期、同员工时间不得重叠;支持模板导入;可按合同记录自动生成 Word åŠ³åŠ¨åˆåŒ(占位符填充员工/部门/岗位/合同信息)并存系统文件库绑定为合同附件,每次生成保留历史版本;解除/终止需填日期与原因", "upstream": ["员工"], "downstream": ["合同文档附件", "到期提醒"], "keywords": "员工合同 åŠ³åŠ¨åˆåŒ åˆåŒæ–‡æ¡£ ç”ŸæˆåˆåŒ é™„ä»¶ contract"},
    {"name": "离职交接", "module": "人力", "table": "hrm_user_handover", "doc": "from→to æ˜ å°„,已完成20 åŽ expandUserIds æ‰©å±•交接人可见数据(当前各业务模块尚未实际接入调用)", "upstream": ["离职申请"], "downstream": ["各模块我的数据查询"], "keywords": "交接 ç¦»èŒ handover expandUserIds"},
    {"name": "排班计划", "module": "设备", "table": "mes_cal_plan", "doc": "班组×班次×日期排班,供生产与考勤引用", "upstream": [], "downstream": ["生产任务", "考勤"], "keywords": "排班 ç­ç»„ ç­æ¬¡ æ—¥åކ"},
    {"name": "报告模板", "module": "质检报告", "table": "qc_report_template", "doc": "智能质检报告模板,启用0/停用1;画布内容存在 qc_report_template_version(草稿0/已发布1/已停用2,已发布不可覆盖),currentVersion æŒ‡å‘当前已发布版本;源文件经 AI å¯¼å…¥è¯†åˆ«æˆè‰ç¨¿åŽç”±äººå·¥ç¡®è®¤æ‰æˆä¸ºç‰ˆæœ¬ï¼›åŒä¸€æ¨¡æ¿é‡å¤å¯¼å…¥æŒ‰ã€æ›¿æ¢ã€‘处理——先删旧附件(连带 blob è¡Œä¸Žç£ç›˜æ–‡ä»¶ï¼‰å†ç»‘新的,不留孤儿文件;删除模板会连带清附件", "upstream": ["人工设计(GrapesJS è®¾è®¡å™¨)", "AI å¯¼å…¥è‰ç¨¿(qc-report/ai-import/draft)"], "downstream": ["模板版本", "报告实例"], "keywords": "报告模板 è´¨æ£€æŠ¥å‘Š template è®¾è®¡å™¨ ç‰ˆæœ¬ AI导入 è¯†åˆ« è‰ç¨¿ æºæ–‡ä»¶æ›¿æ¢"},
docs/project-business/index.html
@@ -375,8 +375,8 @@
    {"key": "pro", "name": "生产管理", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production",
     "positioning": "生产执行核心:计划-工单-任务-报工",
     "problem": "订单到车间执行的逐层拆解与过程可控",
     "features": ["MPS主生产计划(可由销售订单自动创建·合并下发)", "工单(按工艺路线自动生成工序任务)", "报工(按工序顺序控制·BPM审批)", "倒冲扣线边库/产出入库", "安灯", "工艺路线·工序·工单BOM", "研发设计项目(PD·审批归档)", "AI å››ç±»é¢„测"],
     "objects": ["MPS", "生产工单", "生产任务", "报工单", "工艺路线", "工单BOM", "设计项目"],
     "features": ["MPS主生产计划(可由销售订单自动创建·合并下发)", "工单(按工艺路线自动生成工序任务)", "报工(按工序顺序控制·BPM审批)", "倒冲扣线边库/产出入库", "安灯", "工艺路线·工序·工单BOM", "工单算料(产品BOM×数量·单价取采购价/已审核采购加权均价·缺价标记)", "工单物料成本(标准/实际/超耗/实际单位成本·报工审批后自动重算)", "超耗报警(工单→产品→全局阈值·站内信指定接收人·同工单同物料一次)", "MPS成本按计划数量占工单数量分摊", "研发设计项目(PD·审批归档)", "AI å››ç±»é¢„测"],
     "objects": ["MPS", "生产工单", "生产任务", "报工单", "工艺路线", "工单BOM", "超耗报警", "设计项目"],
     "roles": ["计划员", "车间主任", "操作工", "工艺员"],
     "upstream": ["进销存(销售订单)"], "downstream": ["仓储(领料/入库)", "质量(IPQC)"],
     "coreTables": ["mes_pro_mps", "mes_pro_work_order", "mes_pro_task", "mes_pro_feedback", "mes_pro_route", "mes_pro_process", "mes_pro_work_order_bom", "mes_pd_project"]},
@@ -391,11 +391,11 @@
    {"key": "qc", "name": "质量管理", "color": "#e06c6c", "tag": "MES-QC", "flow": "quality",
     "positioning": "四道检验闸口 + ä¸åˆæ ¼å“é—­çŽ¯å¤„ç½®",
     "problem": "来料/过程/出货/退货检验标准化,不合格可追溯处置",
     "features": ["IQC æ¥æ–™(到货/外协)", "IPQC è¿‡ç¨‹(联动报工)", "OQC å‡ºè´§(联动销售出库)", "RQC é€€è´§(联动退料/售后)", "质检方案·指标·缺陷库", "检测结果:合格/特采/退货/报废", "NCR:评审→处置(退货/报废/返工/让步/降级)→关闭", "AI åˆ¤å®šå»ºè®®"],
     "objects": ["IQC", "IPQC", "OQC", "RQC", "质检方案", "NCR", "缺陷记录"],
     "features": ["IQC æ¥æ–™(到货/外协)", "IPQC è¿‡ç¨‹(联动报工)", "OQC å‡ºè´§(联动销售出库)", "RQC é€€è´§(联动退料/售后)", "质检方案·指标·缺陷库", "检测结果:合格/特采/退货/报废", "NCR:评审→处置(退货/报废/返工/让步/降级)→关闭", "留样管理(工单完工前必登·一工单一条·绑定销售订单·到期=留样日期+6个月)", "AI åˆ¤å®šå»ºè®®"],
     "objects": ["IQC", "IPQC", "OQC", "RQC", "质检方案", "NCR", "缺陷记录", "留样记录"],
     "roles": ["质检员(IQC/IPQC/OQC)", "质量工程师"],
     "upstream": ["仓储(到货)", "生产(报工)", "销售(出库)", "售后(退货)"], "downstream": ["仓储(合格入库/报废出库)", "生产(NCR返工)"],
     "coreTables": ["mes_qc_iqc", "mes_qc_ipqc", "mes_qc_oqc", "mes_qc_rqc", "mes_qc_template", "mes_qc_indicator", "mes_qc_defect", "mes_qc_ncr"]},
     "coreTables": ["mes_qc_iqc", "mes_qc_ipqc", "mes_qc_oqc", "mes_qc_rqc", "mes_qc_template", "mes_qc_indicator", "mes_qc_defect", "mes_qc_ncr", "mes_qc_retention_sample"]},
    {"key": "qcreport", "name": "智能质检报告", "color": "#b06ce0", "tag": "QC-REPORT", "flow": "quality",
     "positioning": "可视化设计报告模板 â†’ ä¸€é”®å‡ºä»¶å¹¶å†»ç»“历史报告",
     "problem": "各行业质检报告格式各异,排版硬编码改一次发一次版;且历史报告必须可复现、不随业务数据变化",
@@ -423,11 +423,11 @@
    {"key": "hrm", "name": "人力资源", "color": "#9db85a", "tag": "HRM", "flow": null,
     "positioning": "员工入转调离与考勤薪酬",
     "problem": "人事流程审批化、离职数据不丢(交接)、算薪自动化",
     "features": ["员工档案(入职自动建系统账号)", "请假/加班/调岗/离职 BPM å®¡æ‰¹", "离职交接映射 expandUserIds", "考勤(移动端我的考勤状态·打卡·规则·排班·补卡审批·月度汇总)", "薪酬(应发-社保公积金-个税-请假扣款·1.5/2/3倍加班费·发放台账)", "培训证书(SQL先行待实现)"],
     "objects": ["员工", "请假单", "离职申请", "交接映射", "考勤记录", "薪酬核算"],
     "features": ["员工档案(入职自动建系统账号)", "请假/加班/调岗/离职 BPM å®¡æ‰¹", "离职交接映射 expandUserIds", "员工合同台账(续签链·到期提醒·Excel导入·到期状态动态计算)", "合同文档生成(Word模板占位符填充→系统文件库→合同附件归档)", "考勤(移动端我的考勤状态·打卡·规则·排班·补卡审批·月度汇总)", "薪酬(应发-社保公积金-个税-请假扣款·1.5/2/3倍加班费·发放台账)", "培训证书(SQL先行待实现)"],
     "objects": ["员工", "员工合同", "请假单", "离职申请", "交接映射", "考勤记录", "薪酬核算"],
     "roles": ["HR", "部门主管", "员工本人"],
     "upstream": [], "downstream": ["各模块(数据可见性扩展)", "system(账号)"],
     "coreTables": ["hrm_employee", "hrm_leave_application", "hrm_resignation_application", "hrm_user_handover", "hrm_attendance_record", "hrm_salary_calculation", "hrm_salary_payment"]},
     "coreTables": ["hrm_employee", "hrm_employee_contract", "hrm_leave_application", "hrm_resignation_application", "hrm_user_handover", "hrm_attendance_record", "hrm_salary_calculation", "hrm_salary_payment"]},
    {"key": "bpm", "name": "协同审批", "color": "#e6a23c", "tag": "BPM", "flow": null,
     "positioning": "全系统单据审批中枢(Flowable)",
     "problem": "多模块单据需要灵活可配的多级审批",
@@ -460,7 +460,7 @@
    {"name": "联系人", "module": "销售管理", "table": "crm_contact", "doc": "客户下联系人,与商机多对多", "upstream": ["客户"], "downstream": ["商机"], "keywords": "联系人 contact"},
    {"name": "商机", "module": "销售管理", "table": "crm_business", "doc": "销售机会,DB é…ç½®å¼é˜¶æ®µæŽ¨è¿›ï¼Œç»“束态: èµ¢/输/无效", "upstream": ["客户"], "downstream": ["报价单", "合同"], "keywords": "商机 business èµ¢å• è¾“单 é˜¶æ®µ"},
    {"name": "报价单", "module": "销售管理", "table": "crm_sale_quotation", "doc": "QT编号,选 MDM ç‰©æ–™æŠ¥ä»·ï¼ŒAI OCR å½•入,草稿→已转合同", "upstream": ["商机"], "downstream": ["合同"], "keywords": "报价 quotation QT"},
    {"name": "合同", "module": "销售管理", "table": "crm_contract", "doc": "HT编号,BPM å®¡æ‰¹(0草稿/10审批中/20通过/30驳回/40取消/50作废),通过后可生成销售订单;支持 Excel å¯¼å…¥ï¼ˆä¸€åˆåŒå¤šäº§å“æ˜Žç»†è¡Œã€åˆå¹¶å•元格自动拉平,客户与物料按名称/编码校验);产品明细带出物料名称/编码/条码/规格型号/计量单位;删除合同时连带删除产品明细,不留孤儿数据", "upstream": ["报价单"], "downstream": ["销售订单", "回款计划", "开票"], "keywords": "合同 contract å®¡æ‰¹ å¯¼å…¥"},
    {"name": "合同", "module": "销售管理", "table": "crm_contract", "doc": "HT编号,BPM å®¡æ‰¹(0草稿/10审批中/20通过/30驳回/40取消/50作废),通过后可生成销售订单;支持 Excel å¯¼å…¥ï¼ˆä¸€åˆåŒå¤šäº§å“æ˜Žç»†è¡Œã€åˆå¹¶å•元格自动拉平,客户与物料按名称/编码校验);产品明细带出物料名称/编码/条码/规格型号/计量单位;删除合同时连带删除产品明细,不留孤儿数据;销售订单审批通过且订单无关联合同时,系统按「客户名称-销售合同-订单号」自动反向生成草稿合同(不自动提交审批,同一订单仅一份,失败不影响订单审批)", "upstream": ["报价单", "销售订单(自动生成)"], "downstream": ["销售订单", "回款计划", "开票"], "keywords": "合同 contract å®¡æ‰¹ å¯¼å…¥ è‡ªåŠ¨ç”Ÿæˆ"},
    {"name": "发票", "module": "销售管理", "table": "crm_invoice", "doc": "KP编号(可留空自动生成、系统内唯一),BPM å®¡æ‰¹ï¼Œç´¯è®¡å¼€ç¥¨â‰¤åˆåŒé¢ï¼Œé™„件必传;支持 Excel å¯¼å…¥ï¼ˆä»…新增不更新,合同须审核通过且本次金额≤合同剩余可开票额;同一批数据不可重复导入——同合同下发票号码相同、或发票号码留空时开票金额+发票抬头+开票日期相同即判重复,文件内重复行与库内已有单都拒该行并回显维度与实际值)", "upstream": ["合同"], "downstream": ["回款"], "keywords": "开票 å‘票 invoice å¯¼å…¥ åŽ»é‡"},
    {"name": "回款", "module": "销售管理", "table": "crm_receivable", "doc": "HK编号,创建即审批中(手动审核),强制先开票,金额双校验", "upstream": ["合同", "发票"], "downstream": ["收款单(关联)"], "keywords": "回款 æ”¶æ¬¾è®¡åˆ’ receivable"},
    {"name": "销售目标", "module": "销售管理", "table": "crm_sales_target", "doc": "å¹´/å­£/月×个人/部门/产品维度的合同回款等目标", "upstream": [], "downstream": ["业绩统计"], "keywords": "目标 target ä¸šç»©"},
@@ -472,11 +472,12 @@
    {"name": "采购来票", "module": "进销存", "table": "erp_purchase_invoice", "doc": "FPD编号,AI OCR é¢„填,累计≤订单总价,付款单的前置", "upstream": ["采购订单"], "downstream": ["付款单"], "keywords": "来票 å‘票 é‡‡è´­å‘票"},
    {"name": "付款单", "module": "财务", "table": "erp_finance_payment", "doc": "FKD编号,必须关联来票+附件,累计≤来票金额,BPM å®¡æ‰¹", "upstream": ["采购来票"], "downstream": ["结算账户"], "keywords": "付款 åº”付 payment"},
    {"name": "收款单", "module": "财务", "table": "erp_finance_receipt", "doc": "SKD编号,关联 CRM å®¢æˆ·æ ¡éªŒï¼Œæ—  BPM(手动审核)", "upstream": ["销售(弱关联)"], "downstream": ["结算账户"], "keywords": "收款 åº”æ”¶ receipt"},
    {"name": "销售订单", "module": "进销存", "table": "erp_sale_order", "doc": "XSDD编号,BPM å®¡æ‰¹ï¼Œéœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS,出库状态:未0已预留1部分2全部3,生产完成事件回写", "upstream": ["合同"], "downstream": ["MPS", "发货通知", "销售出库", "售后工单"], "keywords": "销售订单 sale"},
    {"name": "主生产计划", "module": "生产", "table": "mes_pro_mps", "doc": "MPS计划,草稿0→已下发1→完成2/取消3,可合并下发", "upstream": ["销售订单"], "downstream": ["生产工单"], "keywords": "MPS ä¸»è®¡åˆ’ ç”Ÿäº§è®¡åˆ’"},
    {"name": "生产工单", "module": "生产", "table": "mes_pro_work_order", "doc": "草稿0→已确认1→完成2/取消3,确认时按工艺路线生成任务,最后一道工序报工回写已生产数量", "upstream": ["MPS"], "downstream": ["生产任务", "领料", "完工入库"], "keywords": "工单 ç”Ÿäº§å·¥å• work order"},
    {"name": "销售订单", "module": "进销存", "table": "erp_sale_order", "doc": "XSDD编号,BPM å®¡æ‰¹ï¼Œéœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS;审批通过且订单无关联合同时自动生成 CRM è‰ç¨¿åˆåŒå¹¶å›žå†™ contractId/contractNo(订单来自合同时跳过),合同生成失败不阻塞审批;出库状态:未0已预留1部分2全部3,生产完成事件回写", "upstream": ["合同", "手工新建"], "downstream": ["MPS", "合同(自动生成)", "发货通知", "销售出库", "售后工单"], "keywords": "销售订单 sale è‡ªåŠ¨åˆåŒ"},
    {"name": "主生产计划", "module": "生产", "table": "mes_pro_mps", "doc": "MPS计划,草稿0→已下发1→完成2/取消3,可合并下发,关联工单完成时自动回写完成状态、产量与完成日期", "upstream": ["销售订单"], "downstream": ["生产工单"], "keywords": "MPS ä¸»è®¡åˆ’ ç”Ÿäº§è®¡åˆ’"},
    {"name": "生产工单", "module": "生产", "table": "mes_pro_work_order", "doc": "草稿0→已确认1→完成2/取消3,确认时按工艺路线生成任务,最后一道工序报工回写已生产数量;人工完成要求已生产数量>0,完工时同步关联 MPS å·²å®Œæˆï¼›è®°å½•超耗报警比例(工单覆盖)与标准/实际/超耗物料成本、物料单位成本、成本更新时间,报工审批后自动重算", "upstream": ["MPS"], "downstream": ["生产任务", "领料", "完工入库", "超耗报警"], "keywords": "工单 ç”Ÿäº§å·¥å• work order æˆæœ¬ ç®—æ–™"},
    {"name": "生产任务", "module": "生产", "table": "mes_pro_task", "doc": "工序粒度,预备0→生产中1→部分2→完成4,可暂停9取消5", "upstream": ["生产工单"], "downstream": ["报工"], "keywords": "任务 task å·¥åº"},
    {"name": "报工单", "module": "生产", "table": "mes_pro_feedback", "doc": "草稿0→审批中2→待检3/完成4,按工序顺序校验(上道工序报满才可报),联动倒冲消耗/产出入库/IPQC", "upstream": ["生产任务"], "downstream": ["产品产出", "物料消耗", "IPQC"], "keywords": "报工 feedback"},
    {"name": "报工单", "module": "生产", "table": "mes_pro_feedback", "doc": "草稿0→审批中2→待检3/完成4,按工序顺序校验(上道工序报满才可报),联动倒冲消耗/产出入库/IPQC;审批通过后触发工单物料成本重算与超耗报警检查", "upstream": ["生产任务"], "downstream": ["产品产出", "物料消耗", "IPQC", "工单成本", "超耗报警"], "keywords": "报工 feedback"},
    {"name": "超耗报警", "module": "生产", "table": "mes_pro_over_consume_alert", "doc": "报工审批后按 å·¥å•→产品→全局参数 é˜ˆå€¼åˆ¤å®šï¼Œå®žé™…消耗>标准用量×(1+阈值%)时生成;记录标准/实际/超耗数量、超耗比例、单价与超耗金额,同一工单同物料仅一条,发送站内信给参数指定用户,状态 SENT/FAILED", "upstream": ["报工单", "物料消耗"], "downstream": ["站内信"], "keywords": "超耗 æŠ¥è­¦ æˆæœ¬ over consume alert"},
    {"name": "工艺路线", "module": "生产", "table": "mes_pro_route", "doc": "工序顺序+质检/关键/倒冲标记,驱动工单任务与报工规则", "upstream": [], "downstream": ["生产工单"], "keywords": "工艺 è·¯çº¿ route å·¥åº"},
    {"name": "到货通知单", "module": "仓储", "table": "mes_wm_arrival_notice", "doc": "采购订单确认收货生成,草稿0→待质检2→待入库3→完成4", "upstream": ["采购订单"], "downstream": ["IQC", "采购入库"], "keywords": "到货 æ”¶è´§ arrival"},
    {"name": "采购入库单", "module": "仓储", "table": "mes_wm_item_receipt", "doc": "草稿0→待上架2→待执行3→完成4,完成后库存+并回写 ERP inCount/inStatus", "upstream": ["到货通知"], "downstream": ["库存台账", "采购订单(回写)"], "keywords": "采购入库 æ”¶è´§å…¥åº“ receipt"},
@@ -493,10 +494,12 @@
    {"name": "OQC出货检验", "module": "质量", "table": "mes_qc_oqc", "doc": "销售出库提交触发,完成推进出库单待拣货;行操作「出报告」仅在已完成时可见;支持 Excel æ‰¹é‡å¯¼å…¥ï¼ˆå®¢æˆ·é¡»åœ¨å½“前登录用户的客户数据权限范围内);同一批数据不可重复导入(物料+客户+批次号+出货日期,文件内重复行与库内已有单都拒该行)", "upstream": ["销售出库单", "Excel æ‰¹é‡å¯¼å…¥"], "downstream": ["销售出库单(推进)", "报告实例(出报告)"], "keywords": "OQC å‡ºè´§æ£€éªŒ å‡ºåŽ‚æ£€éªŒ å‡ºæŠ¥å‘Š æ‰¹é‡å¯¼å…¥ å¯¼å…¥æ¨¡æ¿"},
    {"name": "RQC退货检验", "module": "质量", "table": "mes_qc_rqc", "doc": "生产退料/销售退货/售后退货触发,结论回调售后;行操作「出报告」仅在已完成时可见。措辞已统一为「退货检验」(原菜单父项与 mes_qc_type å­—典写「退料检验」,与后端枚举/表注释/菜单权限子项不一致;RQC ä¸‰è€…都覆盖,故取「退货检验」)", "upstream": ["退料", "退货"], "downstream": ["退货入库", "售后回调", "报告实例(出报告)"], "keywords": "RQC é€€è´§æ£€éªŒ é€€æ–™æ£€éªŒ å‡ºæŠ¥å‘Š"},
    {"name": "NCR不合格品", "module": "质量", "table": "mes_qc_ncr", "doc": "待评审0→已评审6→已处置7→已关闭8,处置:退货/报废/返工/让步接收/降级", "upstream": ["IQC/IPQC/OQC/RQC"], "downstream": ["退货/报废/返工(台账)"], "keywords": "NCR ä¸åˆæ ¼ å¤„ç½® ç‰¹é‡‡ æŠ¥åºŸ"},
    {"name": "留样记录", "module": "质量", "table": "mes_qc_retention_sample", "doc": "生产工单完工前必须登记,一张工单只能一条(work_order_id å”¯ä¸€ï¼‰ï¼›ç¼–号 LY+yyyyMMdd+4位流水按天生成;留样数量默认 2 ä»¶ï¼Œåˆ°æœŸæ—¥æœŸé»˜è®¤ç•™æ ·æ—¥æœŸ+6个月;销售订单按 MPS ä¸‹å‘记录自动绑定,合并下发多张订单时需指定本次留样对应订单,客户订单来源工单按来源单号校验,库存备货工单可不绑定,MPS è®°å½•的销售订单在系统中不存在时提示并阻断保存;手工完成与报工达标自动完工均校验留样,未登记拦截;工单已完成不允许删除留样", "upstream": ["生产工单", "MPS(销售订单)"], "downstream": ["工单完成校验", "销售订单(追溯)"], "keywords": "留样 ç•™æ ·è®°å½• retention sample å®Œå·¥ç•™æ · é”€å”®è®¢å•绑定"},
    {"name": "设备", "module": "设备", "table": "mes_dv_machinery", "doc": "台账状态:停机/生产中/保养中;点检·保养·维修工单;AI é£Žé™©é¢„测消费其数据", "upstream": [], "downstream": ["点检", "ç»´ä¿®", "生产风险预测"], "keywords": "设备 ç‚¹æ£€ ä¿å…» ç»´ä¿® machinery"},
    {"name": "售后工单", "module": "售后", "table": "after_sale_ticket", "doc": "草稿0→处理中10→待入库30→待退款40→完结50→关闭60/取消99,判定:一般/ç»´ä¿®/退货", "upstream": ["客户反馈(人工录入)"], "downstream": ["维修记录", "退货申请"], "keywords": "售后 å·¥å• ticket ç»´ä¿®"},
    {"name": "退货申请", "module": "售后", "table": "after_sale_return", "doc": "草稿0→已审核20(自动建MES退货单)→已质检40→已入库50→已退款60→关闭70;类型:退款退货/换货/仅退款", "upstream": ["售后工单"], "downstream": ["销售退货单", "退款"], "keywords": "售后退货 return"},
    {"name": "员工", "module": "人力", "table": "hrm_employee", "doc": "在职1/试用2/离职3,入职自动建系统账号", "upstream": [], "downstream": ["交接映射", "考勤", "薪酬"], "keywords": "员工 å…¥èŒ employee"},
    {"name": "员工", "module": "人力", "table": "hrm_employee", "doc": "在职1/试用2/离职3,入职自动建系统账号", "upstream": [], "downstream": ["交接映射", "员工合同", "考勤", "薪酬"], "keywords": "员工 å…¥èŒ employee"},
    {"name": "员工合同", "module": "人力", "table": "hrm_employee_contract", "doc": "一个员工多份合同(续签链 parentId、当前合同 isCurrent);合同类型/期限类型走字典,固定期限必须填结束日期、同员工时间不得重叠;支持模板导入;可按合同记录自动生成 Word åŠ³åŠ¨åˆåŒ(占位符填充员工/部门/岗位/合同信息)并存系统文件库绑定为合同附件,每次生成保留历史版本;解除/终止需填日期与原因", "upstream": ["员工"], "downstream": ["合同文档附件", "到期提醒"], "keywords": "员工合同 åŠ³åŠ¨åˆåŒ åˆåŒæ–‡æ¡£ ç”ŸæˆåˆåŒ é™„ä»¶ contract"},
    {"name": "离职交接", "module": "人力", "table": "hrm_user_handover", "doc": "from→to æ˜ å°„,已完成20 åŽ expandUserIds æ‰©å±•交接人可见数据(当前各业务模块尚未实际接入调用)", "upstream": ["离职申请"], "downstream": ["各模块我的数据查询"], "keywords": "交接 ç¦»èŒ handover expandUserIds"},
    {"name": "排班计划", "module": "设备", "table": "mes_cal_plan", "doc": "班组×班次×日期排班,供生产与考勤引用", "upstream": [], "downstream": ["生产任务", "考勤"], "keywords": "排班 ç­ç»„ ç­æ¬¡ æ—¥åކ"},
    {"name": "报告模板", "module": "质检报告", "table": "qc_report_template", "doc": "智能质检报告模板,启用0/停用1;画布内容存在 qc_report_template_version(草稿0/已发布1/已停用2,已发布不可覆盖),currentVersion æŒ‡å‘当前已发布版本;源文件经 AI å¯¼å…¥è¯†åˆ«æˆè‰ç¨¿åŽç”±äººå·¥ç¡®è®¤æ‰æˆä¸ºç‰ˆæœ¬ï¼›åŒä¸€æ¨¡æ¿é‡å¤å¯¼å…¥æŒ‰ã€æ›¿æ¢ã€‘处理——先删旧附件(连带 blob è¡Œä¸Žç£ç›˜æ–‡ä»¶ï¼‰å†ç»‘新的,不留孤儿文件;删除模板会连带清附件", "upstream": ["人工设计(GrapesJS è®¾è®¡å™¨)", "AI å¯¼å…¥è‰ç¨¿(qc-report/ai-import/draft)"], "downstream": ["模板版本", "报告实例"], "keywords": "报告模板 è´¨æ£€æŠ¥å‘Š template è®¾è®¡å™¨ ç‰ˆæœ¬ AI导入 è¯†åˆ« è‰ç¨¿ æºæ–‡ä»¶æ›¿æ¢"},
@@ -506,12 +509,12 @@
<script type="application/json" id="data-flows">{
  "flows": [
    {"id": "sales", "name": "销售流程", "mermaid": "mermaid/02-sales-flow.mmd", "color": "#4f9cff",
     "summary": "线索转化客户 â†’ å•†æœºæŽ¨è¿› â†’ æŠ¥ä»·(可AI识别) â†’ åˆåŒ BPM å®¡æ‰¹ â†’ ç”Ÿæˆ ERP é”€å”®è®¢å•并审批 â†’ éœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS â†’ å‘货通知 â†’ é”€å”®å‡ºåº“(OQC)回写 â†’ å¼€ç¥¨(BPM) â†’ å›žæ¬¾(先开票校验)。",
     "summary": "线索转化客户 â†’ å•†æœºæŽ¨è¿› â†’ æŠ¥ä»·(可AI识别) â†’ åˆåŒ BPM å®¡æ‰¹ â†’ ç”Ÿæˆ ERP é”€å”®è®¢å•并审批(无关联合同时自动反向生成草稿合同) â†’ éœ€ç”Ÿäº§è¡Œè‡ªåŠ¨å»º MPS â†’ å‘货通知 â†’ é”€å”®å‡ºåº“(OQC)回写 â†’ å¼€ç¥¨(BPM) â†’ å›žæ¬¾(先开票校验)。",
     "steps": [
       {"stage": "获客", "action": "线索转化客户、建联系人、立项商机", "roles": ["销售内勤"]},
       {"stage": "报价", "action": "商机赢单后建报价单(AI OCR é¢„å¡«),转合同", "roles": ["销售内勤"]},
       {"stage": "签约", "action": "合同来源:手工新建 / æŠ¥ä»·å•转入 / Excel å¯¼å…¥(一合同多产品明细行);提交 BPM å®¡æ‰¹(可选流程定义),通过=20", "roles": ["销售", "审批人"]},
       {"stage": "接单", "action": "合同一键生成销售订单(XSDD),销售订单再走 BPM;审批通过自动为 needProduction æ˜Žç»†åˆ›å»º MPS", "roles": ["销售", "计划员"]},
       {"stage": "接单", "action": "合同一键生成销售订单(XSDD),销售订单再走 BPM;审批通过自动为 needProduction æ˜Žç»†åˆ›å»º MPS;订单无关联合同时按客户名称-销售合同-订单号自动生成 CRM è‰ç¨¿åˆåŒ(草稿不发起审批,负责人取销售员,同单只生成一份,生成失败不阻塞订单审批)", "roles": ["销售", "计划员"]},
       {"stage": "交付", "action": "发货通知审核(占用)→ é”€å”®å‡ºåº“ OQC â†’ å‘运 â†’ å‡ºåº“回写部分/全部出库", "roles": ["仓管", "质检"]},
       {"stage": "回款", "action": "开票 BPM(累计≤合同额) â†’ å›žæ¬¾å¼ºåˆ¶å…ˆå¼€ç¥¨(累计≤合同剩余与开票剩余)", "roles": ["财务", "销售"]}]},
    {"id": "purchase", "name": "采购流程", "mermaid": "mermaid/03-purchase-flow.mmd", "color": "#5fc79e",
@@ -525,16 +528,17 @@
       {"stage": "退货", "action": "IQC ä¸åˆæ ¼é€€è´§â†’供应商退货出库(选料锁定到订单行);报废走 NCR", "roles": ["仓管"]},
       {"stage": "付款", "action": "采购来票(FPD, AI OCR, â‰¤è®¢å•总价) â†’ ä»˜æ¬¾å•(FKD å…³è”来票+附件, â‰¤æ¥ç¥¨é‡‘额) BPM å®¡æ‰¹", "roles": ["财务", "审批人"]}]},
    {"id": "production", "name": "生产流程", "mermaid": "mermaid/04-production-flow.mmd", "color": "#e0b34f",
     "summary": "销售订单驱动 MPS â†’ ä¸‹å‘工单 â†’ æŒ‰å·¥è‰ºè·¯çº¿æ‹†å·¥åºä»»åŠ¡ â†’ é¢†æ–™/线边备料 â†’ æŠ¥å·¥(工序顺序硬校验+BPM) â†’ å€’冲消耗/产出入库/IPQC â†’ æœ«é“工序回写进度 â†’ è‡ªåŠ¨å®Œå·¥ â†’ ProductionFinishedEvent å›žå†™é”€å”®è®¢å•。",
     "summary": "销售订单驱动 MPS â†’ ä¸‹å‘工单 â†’ æŒ‰å·¥è‰ºè·¯çº¿æ‹†å·¥åºä»»åŠ¡ â†’ ç®—æ–™(产品BOM×工单数量·带单价/金额) â†’ é¢†æ–™/线边备料 â†’ æŠ¥å·¥(工序顺序硬校验+BPM) â†’ å€’冲消耗/产出入库/IPQC â†’ å®¡æ‰¹åŽè‡ªåŠ¨é‡ç®—å·¥å•ç‰©æ–™æˆæœ¬å¹¶å¯¹è¶…è€—ç‰©æ–™ç«™å†…ä¿¡æŠ¥è­¦ â†’ æœ«é“工序回写进度 â†’ è‡ªåŠ¨å®Œå·¥ â†’ ProductionFinishedEvent å›žå†™é”€å”®è®¢å•ï¼›MPS æˆæœ¬æŒ‰è®¡åˆ’数量占工单数量分摊。",
     "steps": [
       {"stage": "计划", "action": "MPS åˆ›å»º(手工或销售订单自动)→下发或合并下发为工单", "roles": ["计划员"]},
       {"stage": "派工", "action": "工单确认按工艺路线逐工序生成任务,可指派/暂停/取消", "roles": ["车间主任"]},
       {"stage": "备料", "action": "生产领料单出库或线边虚拟库备料", "roles": ["仓管"]},
       {"stage": "报工", "action": "提交报工:上一道工序未报满直接拦截;启用 BPM èµ°å®¡æ‰¹", "roles": ["操作工"]},
       {"stage": "联动", "action": "审批通过按工序标记: å€’冲→自动物料消耗扣线边库(允许负库存);质检→产出待检行等 IPQC;关键非检→直接产出入库", "roles": ["系统自动"]},
       {"stage": "完工", "action": "仅末道工序回写工单已生产数量,达标自动完成;MPS ç´¯è®¡åˆ¤æ–­å®Œæˆå¹¶å‘事件给销售订单", "roles": ["系统自动"]}]},
       {"stage": "核算", "action": "算料:产品 BOM å•位用量×工单数量展开原材料(无产品BOM回退路线产出链/工单BOM),带需求数量/已消耗/单价/需求金额,价格取物料采购价否则取已审核采购订单加权均价,均无则金额为0并标记缺价;成本:报工审批后自动重算工单标准/实际/超耗物料成本与实际单位成本(实际消耗取倒冲消耗记录,已报工数量取工单产量与各工序审批报工累计的最大值);超耗阈值按 å·¥å•→产品→全局参数(默认5%) å–值,单料实际消耗>标准用量×(1+阈值%)即生成报警记录并按参数配置的接收人发站内信,同工单同物料仅报一次;MPS æˆæœ¬æŒ‰ MPS计划数量÷工单数量 åˆ†æ‘Š", "roles": ["系统自动", "计划员"]},
       {"stage": "完工", "action": "仅末道工序回写工单已生产数量,达标自动完成;人工完成要求已生产数量>0(为 0 æ‹¦æˆªï¼‰ï¼›å®Œå·¥å‰å¿…须已登记留样记录(手工完成与自动完工一致,未登记拦截);完工时同步关联 MPS ä¸ºå·²å®Œæˆå¹¶å›žå†™äº§é‡ä¸Žå®Œæˆæ—¥æœŸï¼ŒMPS ç´¯è®¡åˆ¤æ–­å®Œæˆå¹¶å‘事件给销售订单", "roles": ["系统自动"]}]},
    {"id": "quality", "name": "质量流程", "mermaid": "mermaid/05-quality-flow.mmd", "color": "#e06c6c",
     "summary": "四道检验闸口(IQC/IPQC/OQC/RQC,二态 0→4) + åˆ¤å®šå››æžœ(合格/特采/退货/报废) + NCR è¯„审处置关闭;AI æä¾›åˆ¤å®šå»ºè®®ï¼›NCR å½“前仅台账不触发返工单;检验单可由智能质检报告平台一键出件(generate-from-qc:数据从 MES å–,五道校验后渲染落库)。",
     "summary": "四道检验闸口(IQC/IPQC/OQC/RQC,二态 0→4) + åˆ¤å®šå››æžœ(合格/特采/退货/报废) + NCR è¯„审处置关闭 + å®Œå·¥ç•™æ ·ç™»è®°ï¼›AI æä¾›åˆ¤å®šå»ºè®®ï¼›NCR å½“前仅台账不触发返工单;检验单可由智能质检报告平台一键出件(generate-from-qc:数据从 MES å–,五道校验后渲染落库)。",
     "steps": [
       {"stage": "来料", "action": "到货通知/外协入库→IQC,结论回写推进待入库或触发退货", "roles": ["IQC è´¨æ£€å‘˜"]},
       {"stage": "过程", "action": "报工质检工序产出行→IPQC,合格拆行入库、不合格生成 NCR", "roles": ["IPQC è´¨æ£€å‘˜"]},
@@ -542,6 +546,7 @@
       {"stage": "退货", "action": "退料/销售退货/售后退货→RQC,结论回调单据与售后", "roles": ["RQC è´¨æ£€å‘˜"]},
       {"stage": "导入", "action": "IQC/IPQC/OQC ä¸‰åˆ—表各支持 Excel æ‰¹é‡å¯¼å…¥(按钮在「新增」与「导出」之间,纯新增不做更新覆盖):一行一张单,编号留空自动生成,质检方案留空按物料+检验类型自动匹配,检测人员留空取当前登录用户;物料/供应商/客户/工单/工位按编码或名称精确匹配(IPQC ç‰©æ–™ç”±å·¥å•推导,模板不填),合格+不合格=检测/接收数量、IPQC å·¥åºŸ+料废+其他废品≤不合格、OQC å®¢æˆ·é¡»åœ¨æœ¬äººæ•°æ®æƒé™å†…;逐行导入部分成功,失败行进 failureList å¸¦è¡Œå·ä¸Žå¯æ‰§è¡ŒåŠ¨ä½œï¼ŒæˆåŠŸå•ä¸€å¾‹å¾…æ£€éªŒ0;同一批数据不可重复导入:文件内重复行与库内已存在同业务键单据(IQC ç‰©æ–™+供应商+供应商批次+来料日期、IPQC ç”Ÿäº§å·¥å•+检验类型+工位+检测日期、OQC ç‰©æ–™+客户+批次号+出货日期)均拒该行,提示含维度、双方实际值与「先删除该单据再重试」动作", "roles": ["质检员", "IQC è´¨æ£€å‘˜", "IPQC è´¨æ£€å‘˜", "OQC è´¨æ£€å‘˜"]},
       {"stage": "不合格", "action": "NCR: å¾…评审→评审→处置(退货/报废/返工/让步接收/降级)→关闭", "roles": ["质量工程师"]},
       {"stage": "留样", "action": "生产工单完工前必须登记留样记录(一张工单一条,编号 LY+日期+4位流水,留样数量默认 2 ä»¶ï¼Œåˆ°æœŸ=留样日期+6个月);销售订单按 MPS è‡ªåŠ¨ç»‘å®šã€åˆå¹¶ä¸‹å‘å¤šå•éœ€æŒ‡å®šã€å®¢æˆ·è®¢å•æ¥æºæŒ‰æ¥æºå•å·æ ¡éªŒã€åº“å­˜å¤‡è´§å¯ä¸ç»‘å®šï¼ŒMPS è®°å½•的销售订单在系统中不存在时提示并阻断保存;手工完成与报工达标自动完工均校验,未登记拦截;工单已完成不允许删除留样", "roles": ["质检员", "留样管理员"]},
       {"stage": "出件", "action": "两条出件入口:①通用 generate/preview(调用方自带上下文) æ¸²æŸ“ HTML å¹¶å†»ç»“数据快照,编号 QR+日期+4位流水按天独立,preview åªæ¸²æŸ“不落库不消耗编号,regenerate ç”¨å†»ç»“快照重渲且数据与编号不变并作废已归档 PDF,导出 PDF ç”±åŽç«¯è°ƒ Chromium æ‰“印实例已存的 HTML åŽå½’档附件中心;②generate-from-qc ç”±è´¨æ£€å•直接出件(数据经 MesQcReportApi ä»Ž MES å–,前端不拼上下文),出件前五道校验按业务优先级只报第一处:类型非法/单据不存在/未完成检验/未填判定/模板类型不符/无可用检验项,报告头另带单据原判定 qcResult+qcResultText ä¸Žå¼•擎判定并存,响应回 undecidableCount å¾…判定项数与 warnings(分组标题跳过/指标已删/未录实测值/样品超3),同一张单据可反复出多份", "roles": ["质检员"]},
       {"stage": "建模板", "action": "AI å¯¼å…¥ï¼šä¸Šä¼ æ—¢æœ‰æ£€éªŒæŠ¥å‘Šæ–‡ä»¶(扫描件/照片、电子版 PDF、Word/Excel) â†’ è¯†åˆ«æˆæ¨¡æ¿è‰ç¨¿(不落库) â†’ äººå·¥åœ¨è®¾è®¡å™¨ç¡®è®¤è°ƒæ•´åŽä¿å­˜ä¸ºç‰ˆæœ¬ï¼›.doc/.xls æ—§æ ¼å¼ä¸æ”¯æŒ", "roles": ["质检员", "质量工程师"]}]},
    {"id": "warehouse", "name": "仓储流程", "mermaid": "mermaid/06-warehouse-flow.mmd", "color": "#7e6bd6",
@@ -711,6 +716,8 @@
  G -->|BPM审批通过20| H[生成 ERP é”€å”®è®¢å• XSDD]
  H -->|提交BPM| I[销售订单审批·审批中15→已审核20]
  I -->|明细需生产·自动创建| J[MES ä¸»ç”Ÿäº§è®¡åˆ’ MPS]
  I -->|审批通过且订单无关联合同·自动生成草稿合同并回写关联| G2[合同 HT·草稿0·关联订单]
  I -.->|订单已关联合同·跳过自动生成| G2
  I --> K[发货通知单]
  K -->|审核通过| L[销售出库单·OQC→拣货→发运→出库完成]
  L -->|回写出库数量与状态| M[销售订单 éƒ¨åˆ†å‡ºåº“2/全部出库3]
@@ -745,11 +752,16 @@
  P0[销售订单明细 needProduction=1] -->|审批通过自动创建| P1[MPS ä¸»ç”Ÿäº§è®¡åˆ’·草稿0→已下发1]
  P1 -->|下发或合并下发| P2[生产工单·草稿0→已确认1]
  P2 -->|按工艺路线工序自动生成| P3[生产任务×N·预备0→生产中1→部分完成2→完成4·可暂停9]
  P2 -->|算料:产品BOM×工单数量(回退路线产出链/工单BOM)| C0[工单物料需求列表·需求/已消耗/单价/金额·价格缺失标记]
  P3 --> P4[生产领料 æˆ– çº¿è¾¹è™šæ‹Ÿåº“备料]
  P4 --> P5[报工提交·草稿0]
  P5 -->|校验:上一道工序未报满则拦截| P5
  P5 -->|启用BPM则提交审批| P6{报工审批}
  P6 -->|驳回| P5
  P6 -->|通过·旁路不影响审批结果| C1[重算工单物料成本:标准/实际/超耗/实际单位成本]
  C1 --> C2{单料实际消耗>标准用量×(1+阈值%)?}
  C2 -->|是| C3[生成超耗报警记录+站内信通知指定用户·同工单同物料仅一次]
  C2 -->|否| C4[仅更新成本字段]
  P6 -->|通过且倒冲工序| P7[按工单BOM自动生成物料消耗·扣线边虚拟库FIFO允许负库存]
  P6 -->|通过且质检工序| P8[产出行待检→IPQC è¿‡ç¨‹æ£€éªŒ]
  P6 -->|通过且非质检关键工序| P9[产品产出直接完工入库]
@@ -757,9 +769,12 @@
  P8 -->|不合格| P11[NCR ä¸åˆæ ¼å“]
  P9 --> P12[进度回写·仅最后一道工序报工才更新工单已生产数量]
  P10 --> P12
  P12 -->|已生产数量≥计划数量·自动| P13[工单完成2]
  P12 -->|已生产数量≥计划数量·自动 æˆ– äººå·¥å®Œæˆ(人工完成须已生产数量>0·为0拦截)| P16{该工单已登记留样?}
  P16 -->|否| P17[拦截完成·先去留样管理登记]
  P16 -->|是| P13[工单完成2·同步关联MPS为已完成并回写产量与完成日期]
  P12 -->|累计| P14[MPS å›žå†™å·²ç”Ÿäº§æ•°é‡å¹¶åˆ¤æ–­å®Œæˆ2]
  P14 -->|全部完成| P15[发布 ProductionFinishedEvent→回写销售订单生产状态]
  P2 -.->|MPS åˆ—表| C5[MPS æˆæœ¬æŒ‰ è®¡åˆ’数量÷工单数量 åˆ†æ‘Šå·¥å•成本·单位成本不分摊]
</pre>
<pre style="display:none" class="mmd-src" data-mmd="05-quality-flow">
flowchart TD
@@ -790,6 +805,13 @@
  A2 -->|合格数量| Q5[报工转完成·产出拆行入库]
  A3 -->|完成| Q6[销售出库单推进待拣货]
  A4 -->|完成| Q7[退货单推进上架或入库·售后回调结论]
  S0[留样管理·新增留样记录] --> S1[mes_qc_retention_sample·一张工单一条·编号 LY+yyyyMMdd+4位流水]
  S1 --> S2["销售订单绑定:MPS ä¸‹å‘以 MPS ä¸ºå‡†ï¼›åˆå¹¶ä¸‹å‘多单必须指定;客户订单来源按来源单号校验;库存备货可不绑;MPS è®°å½•的销售订单在系统中不存在时提示并阻断保存"]
  S1 --> S3[留样数量默认 2 ä»¶Â·åˆ°æœŸæ—¥æœŸé»˜è®¤ç•™æ ·æ—¥æœŸ+6个月]
  S1 -.->|完工前必须已存在| SG{工单完工校验·手工完成与报工达标自动完工一致}
  SG -->|未登记| SE[拦截完工·提示先去质量管理→留样管理登记]
  SG -->|已登记| SC[允许完工·级联完成任务]
  S1 --> S4[工单已完成不允许删除留样·可修改]
  N1[NCR å¾…评审0] -->|评审| N2[已评审6]
  N2 -->|处置方式:退货1报废2返工3让步接收4降级使用5| N3[已处置7]
  N3 -->|关闭| N4[已关闭8]
@@ -970,6 +992,7 @@
    PI[采购来票] --> PA[付款单]
  end
  CT -->|generateSaleOrder å¸¦å…¥å®¢æˆ·äº§å“æŠ˜æ‰£å®šé‡‘·回写orderId| SO
  SO -->|审批通过且无关联合同·自动生成草稿合同·回写contractId contractNo| CT
  SO -->|审批通过带入 saleOrderId è¡ŒID æ•°é‡ å®¢æˆ· äº¤æœŸ| MP
  PO -->|确认收货带入订单行物料供应商数量| AN
  AN -->|IQC完成后生成·带入合格行| IR
@@ -1030,6 +1053,8 @@
  mes_pro_work_order ||--o{ mes_pro_task : "按工序拆任务"
  mes_pro_task ||--o{ mes_pro_feedback : "报工"
  mes_pro_work_order ||--o{ mes_pro_work_order_bom : "工序投料BOM"
  mes_pro_work_order ||--o| mes_qc_retention_sample : "完工必登留样"
  erp_sale_order ||--o{ mes_qc_retention_sample : "留样对应销售订单"
  erp_purchase_request ||--o{ erp_purchase_order : "生成采购订单"
  erp_purchase_order ||--o| mes_wm_arrival_notice : "确认收货"
  mes_wm_arrival_notice ||--o| mes_qc_iqc : "触发IQC"
@@ -1053,6 +1078,7 @@
  erp_purchase_order ||--o{ erp_purchase_invoice : "来票"
  erp_purchase_invoice ||--o{ erp_finance_payment : "付款"
  hrm_employee ||--o| hrm_user_handover : "离职交接映射"
  hrm_employee ||--o{ hrm_employee_contract : "签订合同(自动生成合同文档)"
  qc_report_template ||--o{ qc_report_template_version : "多版本"
  qc_report_template_version ||--o{ qc_report_instance : "冻结出件版本"
</pre>
@@ -1098,6 +1124,11 @@
  KB4 -.-> KB5[暂未接入业务问答流程·待确认]
  MODE[模型层:通义千问为主·预留DeepSeek/OpenAI/Ollama未实现] --- O2
  NOTE[全项目无Function Calling·AI只输出结构化JSON由业务侧解析] --- J2
  MODEL[模型管理:每类型每能力只允许一个启用·启用即自动关闭同组其他模型·列表按类型分组展示] --> MODEL2[对话取 text èƒ½åŠ›å¯ç”¨æ¨¡åž‹Â·å›¾ç‰‡è¯†åˆ«å– vision èƒ½åŠ›å¯ç”¨æ¨¡åž‹Â·å‘é‡åº“å–å¯ç”¨æ¨¡åž‹]
  MODEL2 -.-> O2
  MODEL2 -.-> W3
  MODEL2 -.-> KB3
  MODEL3[未启用对应能力模型时直接报错并提示去模型管理启用·不再静默回退] --- MODEL2
  A1[物料管理员上传物料CSV/XLSX→创建补录会话并绑定附件] --> A2[Java桥接授权:用户token+服务令牌+mdm:item:import]
  A2 --> A3[Python解析候选·识别公式/数字编码/缺失分类或单位]
  A3 --> A4[Java只读预检·分类单位编码存在性→CREATE/SKIP/BLOCKED+确定性摘要]
@@ -1106,6 +1137,13 @@
  A6 --> A7[逐行回执·SUCCESS/SKIPPED/FAILED+目标物料ID]
  A6 --> A8[超时或中断→查询命令回执对账·不盲目重试]
  A9[只新建不更新·syncMes=false·不触发MES同步] --- A6
  AIENV[AI æ€»å¼€å…³ VITE_APP_AI_ENABLE=false] --> AHIDE[隐藏 /ai æ¨¡å—路由与全部业务 AI å…¥å£ï¼šå‘票/报价识别录入·四类预测·质检判定·质检助手·智能体导入]
  AHIDE -.-> O6
  AHIDE -.-> Q4
  AHIDE -.-> J5
  AHIDE -.-> W11
  AHIDE -.-> A1
  AHIDE -.-> R2
</pre>
<script type="module">
docs/project-business/mermaid/02-sales-flow.mmd
@@ -11,6 +11,8 @@
  G -->|BPM审批通过20| H[生成 ERP é”€å”®è®¢å• XSDD]
  H -->|提交BPM| I[销售订单审批·审批中15→已审核20]
  I -->|明细需生产·自动创建| J[MES ä¸»ç”Ÿäº§è®¡åˆ’ MPS]
  I -->|审批通过且订单无关联合同·自动生成草稿合同并回写关联| G2[合同 HT·草稿0·关联订单]
  I -.->|订单已关联合同·跳过自动生成| G2
  I --> K[发货通知单]
  K -->|审核通过| L[销售出库单·OQC→拣货→发运→出库完成]
  L -->|回写出库数量与状态| M[销售订单 éƒ¨åˆ†å‡ºåº“2/全部出库3]
docs/project-business/mermaid/04-production-flow.mmd
@@ -2,11 +2,16 @@
  P0[销售订单明细 needProduction=1] -->|审批通过自动创建| P1[MPS ä¸»ç”Ÿäº§è®¡åˆ’·草稿0→已下发1]
  P1 -->|下发或合并下发| P2[生产工单·草稿0→已确认1]
  P2 -->|按工艺路线工序自动生成| P3[生产任务×N·预备0→生产中1→部分完成2→完成4·可暂停9]
  P2 -->|算料:产品BOM×工单数量(回退路线产出链/工单BOM)| C0[工单物料需求列表·需求/已消耗/单价/金额·价格缺失标记]
  P3 --> P4[生产领料 æˆ– çº¿è¾¹è™šæ‹Ÿåº“备料]
  P4 --> P5[报工提交·草稿0]
  P5 -->|校验:上一道工序未报满则拦截| P5
  P5 -->|启用BPM则提交审批| P6{报工审批}
  P6 -->|驳回| P5
  P6 -->|通过·旁路不影响审批结果| C1[重算工单物料成本:标准/实际/超耗/实际单位成本]
  C1 --> C2{单料实际消耗>标准用量×(1+阈值%)?}
  C2 -->|是| C3[生成超耗报警记录+站内信通知指定用户·同工单同物料仅一次]
  C2 -->|否| C4[仅更新成本字段]
  P6 -->|通过且倒冲工序| P7[按工单BOM自动生成物料消耗·扣线边虚拟库FIFO允许负库存]
  P6 -->|通过且质检工序| P8[产出行待检→IPQC è¿‡ç¨‹æ£€éªŒ]
  P6 -->|通过且非质检关键工序| P9[产品产出直接完工入库]
@@ -14,6 +19,9 @@
  P8 -->|不合格| P11[NCR ä¸åˆæ ¼å“]
  P9 --> P12[进度回写·仅最后一道工序报工才更新工单已生产数量]
  P10 --> P12
  P12 -->|已生产数量≥计划数量·自动| P13[工单完成2]
  P12 -->|已生产数量≥计划数量·自动 æˆ– äººå·¥å®Œæˆ(人工完成须已生产数量>0·为0拦截)| P16{该工单已登记留样?}
  P16 -->|否| P17[拦截完成·先去留样管理登记]
  P16 -->|是| P13[工单完成2·同步关联MPS为已完成并回写产量与完成日期]
  P12 -->|累计| P14[MPS å›žå†™å·²ç”Ÿäº§æ•°é‡å¹¶åˆ¤æ–­å®Œæˆ2]
  P14 -->|全部完成| P15[发布 ProductionFinishedEvent→回写销售订单生产状态]
  P2 -.->|MPS åˆ—表| C5[MPS æˆæœ¬æŒ‰ è®¡åˆ’数量÷工单数量 åˆ†æ‘Šå·¥å•成本·单位成本不分摊]
docs/project-business/mermaid/05-quality-flow.mmd
@@ -26,6 +26,13 @@
  A2 -->|合格数量| Q5[报工转完成·产出拆行入库]
  A3 -->|完成| Q6[销售出库单推进待拣货]
  A4 -->|完成| Q7[退货单推进上架或入库·售后回调结论]
  S0[留样管理·新增留样记录] --> S1[mes_qc_retention_sample·一张工单一条·编号 LY+yyyyMMdd+4位流水]
  S1 --> S2["销售订单绑定:MPS ä¸‹å‘以 MPS ä¸ºå‡†ï¼›åˆå¹¶ä¸‹å‘多单必须指定;客户订单来源按来源单号校验;库存备货可不绑;MPS è®°å½•的销售订单在系统中不存在时提示并阻断保存"]
  S1 --> S3[留样数量默认 2 ä»¶Â·åˆ°æœŸæ—¥æœŸé»˜è®¤ç•™æ ·æ—¥æœŸ+6个月]
  S1 -.->|完工前必须已存在| SG{工单完工校验·手工完成与报工达标自动完工一致}
  SG -->|未登记| SE[拦截完工·提示先去质量管理→留样管理登记]
  SG -->|已登记| SC[允许完工·级联完成任务]
  S1 --> S4[工单已完成不允许删除留样·可修改]
  N1[NCR å¾…评审0] -->|评审| N2[已评审6]
  N2 -->|处置方式:退货1报废2返工3让步接收4降级使用5| N3[已处置7]
  N3 -->|关闭| N4[已关闭8]
docs/project-business/mermaid/09-data-flow.mmd
@@ -25,6 +25,7 @@
    PI[采购来票] --> PA[付款单]
  end
  CT -->|generateSaleOrder å¸¦å…¥å®¢æˆ·äº§å“æŠ˜æ‰£å®šé‡‘·回写orderId| SO
  SO -->|审批通过且无关联合同·自动生成草稿合同·回写contractId contractNo| CT
  SO -->|审批通过带入 saleOrderId è¡ŒID æ•°é‡ å®¢æˆ· äº¤æœŸ| MP
  PO -->|确认收货带入订单行物料供应商数量| AN
  AN -->|IQC完成后生成·带入合格行| IR
docs/project-business/mermaid/10-business-object.mmd
@@ -11,6 +11,8 @@
  mes_pro_work_order ||--o{ mes_pro_task : "按工序拆任务"
  mes_pro_task ||--o{ mes_pro_feedback : "报工"
  mes_pro_work_order ||--o{ mes_pro_work_order_bom : "工序投料BOM"
  mes_pro_work_order ||--o| mes_qc_retention_sample : "完工必登留样"
  erp_sale_order ||--o{ mes_qc_retention_sample : "留样对应销售订单"
  erp_purchase_request ||--o{ erp_purchase_order : "生成采购订单"
  erp_purchase_order ||--o| mes_wm_arrival_notice : "确认收货"
  mes_wm_arrival_notice ||--o| mes_qc_iqc : "触发IQC"
@@ -34,5 +36,6 @@
  erp_purchase_order ||--o{ erp_purchase_invoice : "来票"
  erp_purchase_invoice ||--o{ erp_finance_payment : "付款"
  hrm_employee ||--o| hrm_user_handover : "离职交接映射"
  hrm_employee ||--o{ hrm_employee_contract : "签订合同(自动生成合同文档)"
  qc_report_template ||--o{ qc_report_template_version : "多版本"
  qc_report_template_version ||--o{ qc_report_instance : "冻结出件版本"
docs/sql/config_export_all_20261023.sql
@@ -509,7 +509,7 @@
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1065503 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='字典数据表';
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1,1,'男','1','system_user_sex',0,'primary','A','性别男','admin','2021-01-05 17:03:48','1','2025-12-10 13:19:26',0x00),(2,2,'女','2','system_user_sex',0,'success','','性别女','admin','2021-01-05 17:03:48','1','2023-11-15 23:30:37',0x00),(8,1,'正常','1','infra_job_status',0,'success','','正常状态','admin','2021-01-05 17:03:48','1','2022-02-16 19:33:38',0x00),(9,2,'暂停','2','infra_job_status',0,'danger','','停用状态','admin','2021-01-05 17:03:48','1','2022-02-16 19:33:45',0x00),(12,1,'系统内置','1','infra_config_type',0,'danger','','参数类型 - ç³»ç»Ÿå†…ç½®','admin','2021-01-05 17:03:48','1','2022-02-16 19:06:02',0x00),(13,2,'自定义','2','infra_config_type',0,'primary','','参数类型 - è‡ªå®šä¹‰','admin','2021-01-05 17:03:48','1','2022-02-16 19:06:07',0x00),(14,1,'通知','1','system_notice_type',0,'success','','通知','admin','2021-01-05 17:03:48','1','2022-02-16 13:05:57',0x00),(15,2,'公告','2','system_notice_type',0,'info','','公告','admin','2021-01-05 17:03:48','1','2022-02-16 13:06:01',0x00),(16,0,'其它','0','infra_operate_type',0,'default','','其它操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:19',0x00),(17,1,'查询','1','infra_operate_type',0,'info','','查询操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:20',0x00),(18,2,'新增','2','infra_operate_type',0,'primary','','新增操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:21',0x00),(19,3,'修改','3','infra_operate_type',0,'warning','','修改操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:22',0x00),(20,4,'删除','4','infra_operate_type',0,'danger','','删除操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:23',0x00),(22,5,'导出','5','infra_operate_type',0,'default','','导出操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:24',0x00),(23,6,'导入','6','infra_operate_type',0,'default','','导入操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:25',0x00),(27,1,'开启','0','common_status',0,'primary','','开启状态','admin','2021-01-05 17:03:48','1','2022-02-16 08:00:39',0x00),(28,2,'关闭','1','common_status',0,'info','','关闭状态','admin','2021-01-05 17:03:48','1','2022-02-16 08:00:44',0x00),(29,1,'目录','1','system_menu_type',0,'','','目录','admin','2021-01-05 17:03:48','','2022-02-01 16:43:45',0x00),(30,2,'菜单','2','system_menu_type',0,'','','菜单','admin','2021-01-05 17:03:48','','2022-02-01 16:43:41',0x00),(31,3,'按钮','3','system_menu_type',0,'','','按钮','admin','2021-01-05 17:03:48','','2022-02-01 16:43:39',0x00),(32,1,'内置','1','system_role_type',0,'danger','','内置角色','admin','2021-01-05 17:03:48','1','2022-02-16 13:02:08',0x00),(33,2,'自定义','2','system_role_type',0,'primary','','自定义角色','admin','2021-01-05 17:03:48','1','2022-02-16 13:02:12',0x00),(34,1,'全部数据权限','1','system_data_scope',0,'','','全部数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:17',0x00),(35,2,'指定部门数据权限','2','system_data_scope',0,'','','指定部门数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:18',0x00),(36,3,'本部门数据权限','3','system_data_scope',0,'','','本部门数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:16',0x00),(37,4,'本部门及以下数据权限','4','system_data_scope',0,'','','本部门及以下数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:21',0x00),(38,5,'仅本人数据权限','5','system_data_scope',0,'','','仅本人数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:23',0x00),(39,0,'成功','0','system_login_result',0,'success','','登陆结果 - æˆåŠŸ','','2021-01-18 06:17:36','1','2022-02-16 13:23:49',0x00),(40,10,'账号或密码不正确','10','system_login_result',0,'primary','','登陆结果 - è´¦å·æˆ–密码不正确','','2021-01-18 06:17:54','1','2022-02-16 13:24:27',0x00),(41,20,'用户被禁用','20','system_login_result',0,'warning','','登陆结果 - ç”¨æˆ·è¢«ç¦ç”¨','','2021-01-18 06:17:54','1','2022-02-16 13:23:57',0x00),(42,30,'验证码不存在','30','system_login_result',0,'info','','登陆结果 - éªŒè¯ç ä¸å­˜åœ¨','','2021-01-18 06:17:54','1','2022-02-16 13:24:07',0x00),(43,31,'验证码不正确','31','system_login_result',0,'info','','登陆结果 - éªŒè¯ç ä¸æ­£ç¡®','','2021-01-18 06:17:54','1','2022-02-16 13:24:11',0x00),(44,100,'未知异常','100','system_login_result',0,'danger','','登陆结果 - æœªçŸ¥å¼‚常','','2021-01-18 06:17:54','1','2022-02-16 13:24:23',0x00),(45,1,'是','true','infra_boolean_string',0,'danger','','Boolean æ˜¯å¦ç±»åž‹ - æ˜¯','','2021-01-19 03:20:55','1','2022-03-15 23:01:45',0x00),(46,1,'否','false','infra_boolean_string',0,'info','','Boolean æ˜¯å¦ç±»åž‹ - å¦','','2021-01-19 03:20:55','1','2022-03-15 23:09:45',0x00),(50,1,'单表(增删改查)','1','infra_codegen_template_type',0,'','',NULL,'','2021-02-05 07:09:06','','2022-03-10 16:33:15',0x00),(51,2,'树表(增删改查)','2','infra_codegen_template_type',0,'','',NULL,'','2021-02-05 07:14:46','','2022-03-10 16:33:19',0x00),(53,0,'初始化中','0','infra_job_status',0,'primary','',NULL,'','2021-02-07 07:46:49','1','2022-02-16 19:33:29',0x00),(57,0,'运行中','0','infra_job_log_status',0,'primary','','RUNNING','','2021-02-08 10:04:24','1','2022-02-16 19:07:48',0x00),(58,1,'成功','1','infra_job_log_status',0,'success','',NULL,'','2021-02-08 10:06:57','1','2022-02-16 19:07:52',0x00),(59,2,'失败','2','infra_job_log_status',0,'warning','','失败','','2021-02-08 10:07:38','1','2022-02-16 19:07:56',0x00),(60,1,'会员','1','user_type',0,'primary','',NULL,'','2021-02-26 00:16:27','1','2022-02-16 10:22:19',0x00),(61,2,'管理员','2','user_type',0,'success','',NULL,'','2021-02-26 00:16:34','1','2025-04-06 18:37:43',0x00),(62,0,'未处理','0','infra_api_error_log_process_status',0,'primary','',NULL,'','2021-02-26 07:07:19','1','2022-02-16 20:14:17',0x00),(63,1,'已处理','1','infra_api_error_log_process_status',0,'success','',NULL,'','2021-02-26 07:07:26','1','2022-02-16 20:14:08',0x00),(64,2,'已忽略','2','infra_api_error_log_process_status',0,'danger','',NULL,'','2021-02-26 07:07:34','1','2022-02-16 20:14:14',0x00),(66,1,'阿里云','ALIYUN','system_sms_channel_code',0,'primary','',NULL,'1','2021-04-05 01:05:26','1','2024-07-22 22:23:25',0x00),(67,1,'验证码','1','system_sms_template_type',0,'warning','',NULL,'1','2021-04-05 21:50:57','1','2022-02-16 12:48:30',0x00),(68,2,'通知','2','system_sms_template_type',0,'primary','',NULL,'1','2021-04-05 21:51:08','1','2022-02-16 12:48:27',0x00),(69,0,'营销','3','system_sms_template_type',0,'danger','',NULL,'1','2021-04-05 21:51:15','1','2022-02-16 12:48:22',0x00),(70,0,'初始化','0','system_sms_send_status',0,'primary','',NULL,'1','2021-04-11 20:18:33','1','2022-02-16 10:26:07',0x00),(71,1,'发送成功','10','system_sms_send_status',0,'success','',NULL,'1','2021-04-11 20:18:43','1','2022-02-16 10:25:56',0x00),(72,2,'发送失败','20','system_sms_send_status',0,'danger','',NULL,'1','2021-04-11 20:18:49','1','2022-02-16 10:26:03',0x00),(73,3,'不发送','30','system_sms_send_status',0,'info','',NULL,'1','2021-04-11 20:19:44','1','2022-02-16 10:26:10',0x00),(74,0,'等待结果','0','system_sms_receive_status',0,'primary','',NULL,'1','2021-04-11 20:27:43','1','2022-02-16 10:28:24',0x00),(75,1,'接收成功','10','system_sms_receive_status',0,'success','',NULL,'1','2021-04-11 20:29:25','1','2022-02-16 10:28:28',0x00),(76,2,'接收失败','20','system_sms_receive_status',0,'danger','',NULL,'1','2021-04-11 20:29:31','1','2022-02-16 10:28:32',0x00),(77,0,'调试(钉钉)','DEBUG_DING_TALK','system_sms_channel_code',0,'info','',NULL,'1','2021-04-13 00:20:37','1','2022-02-16 10:10:00',0x00),(80,100,'账号登录','100','system_login_type',0,'primary','','账号登录','1','2021-10-06 00:52:02','1','2022-02-16 13:11:34',0x00),(81,101,'社交登录','101','system_login_type',0,'info','','社交登录','1','2021-10-06 00:52:17','1','2022-02-16 13:11:40',0x00),(83,200,'主动登出','200','system_login_type',0,'primary','','主动登出','1','2021-10-06 00:52:58','1','2022-02-16 13:11:49',0x00),(85,202,'强制登出','202','system_login_type',0,'danger','','强制退出','1','2021-10-06 00:53:41','1','2022-02-16 13:11:57',0x00),(86,0,'病假','1','bpm_oa_leave_type',0,'primary','',NULL,'1','2021-09-21 22:35:28','1','2022-02-16 10:00:41',0x00),(87,1,'事假','2','bpm_oa_leave_type',0,'info','',NULL,'1','2021-09-21 22:36:11','1','2022-02-16 10:00:49',0x00),(88,2,'婚假','3','bpm_oa_leave_type',0,'warning','',NULL,'1','2021-09-21 22:36:38','1','2022-02-16 10:00:53',0x00),(112,0,'微信 Wap ç½‘站支付','wx_wap','pay_channel_code',0,'success','','微信 Wap ç½‘站支付','1','2023-07-19 20:08:06','1','2023-07-19 20:09:08',0x00),(113,1,'微信公众号支付','wx_pub','pay_channel_code',0,'success','','微信公众号支付','1','2021-12-03 10:40:24','1','2023-07-19 20:08:47',0x00),(114,2,'微信小程序支付','wx_lite','pay_channel_code',0,'success','','微信小程序支付','1','2021-12-03 10:41:06','1','2023-07-19 20:08:50',0x00),(115,3,'微信 App æ”¯ä»˜','wx_app','pay_channel_code',0,'success','','微信 App æ”¯ä»˜','1','2021-12-03 10:41:20','1','2023-07-19 20:08:56',0x00),(116,10,'支付宝 PC ç½‘站支付','alipay_pc','pay_channel_code',0,'primary','','支付宝 PC ç½‘站支付','1','2021-12-03 10:42:09','1','2023-07-19 20:09:12',0x00),(117,11,'支付宝 Wap ç½‘站支付','alipay_wap','pay_channel_code',0,'primary','','支付宝 Wap ç½‘站支付','1','2021-12-03 10:42:26','1','2023-07-19 20:09:16',0x00),(118,12,'支付宝 App æ”¯ä»˜','alipay_app','pay_channel_code',0,'primary','','支付宝 App æ”¯ä»˜','1','2021-12-03 10:42:55','1','2023-07-19 20:09:20',0x00),(119,14,'支付宝扫码支付','alipay_qr','pay_channel_code',0,'primary','','支付宝扫码支付','1','2021-12-03 10:43:10','1','2023-07-19 20:09:28',0x00),(120,10,'通知成功','10','pay_notify_status',0,'success','','通知成功','1','2021-12-03 11:02:41','1','2023-07-19 10:08:19',0x00),(121,20,'通知失败','20','pay_notify_status',0,'danger','','通知失败','1','2021-12-03 11:02:59','1','2023-07-19 10:08:21',0x00),(122,0,'等待通知','0','pay_notify_status',0,'info','','未通知','1','2021-12-03 11:03:10','1','2023-07-19 10:08:24',0x00),(123,10,'支付成功','10','pay_order_status',0,'success','','支付成功','1','2021-12-03 11:18:29','1','2023-07-19 18:04:28',0x00),(124,30,'支付关闭','30','pay_order_status',0,'info','','支付关闭','1','2021-12-03 11:18:42','1','2023-07-19 18:05:07',0x00),(125,0,'等待支付','0','pay_order_status',0,'info','','未支付','1','2021-12-03 11:18:18','1','2023-07-19 18:04:15',0x00),(600,5,'首页','1','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(601,4,'秒杀活动页','2','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(602,3,'砍价活动页','3','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(603,2,'限时折扣页','4','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(604,1,'满减送页','5','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(1118,0,'等待退款','0','pay_refund_status',0,'info','','等待退款','1','2021-12-10 16:44:59','1','2023-07-19 10:14:39',0x00),(1119,20,'退款失败','20','pay_refund_status',0,'danger','','退款失败','1','2021-12-10 16:45:10','1','2023-07-19 10:15:10',0x00),(1124,10,'退款成功','10','pay_refund_status',0,'success','','退款成功','1','2021-12-10 16:46:26','1','2023-07-19 10:15:00',0x00),(1127,1,'审批中','1','bpm_process_instance_status',0,'default','','流程实例的状态 - è¿›è¡Œä¸­','1','2022-01-07 23:47:22','1','2024-03-16 16:11:45',0x00),(1128,2,'审批通过','2','bpm_process_instance_status',0,'success','','流程实例的状态 - å·²å®Œæˆ','1','2022-01-07 23:47:49','1','2024-03-16 16:11:54',0x00),(1129,1,'审批中','1','bpm_task_status',0,'primary','','流程实例的结果 - å¤„理中','1','2022-01-07 23:48:32','1','2024-03-08 22:41:37',0x00),(1130,2,'审批通过','2','bpm_task_status',0,'success','','流程实例的结果 - é€šè¿‡','1','2022-01-07 23:48:45','1','2024-03-08 22:41:38',0x00),(1131,3,'审批不通过','3','bpm_task_status',0,'danger','','流程实例的结果 - ä¸é€šè¿‡','1','2022-01-07 23:48:55','1','2024-03-08 22:41:38',0x00),(1132,4,'已取消','4','bpm_task_status',0,'info','','流程实例的结果 - æ’¤é”€','1','2022-01-07 23:49:06','1','2024-03-08 22:41:39',0x00),(1133,10,'流程表单','10','bpm_model_form_type',0,'','','流程的表单类型 - æµç¨‹è¡¨å•','103','2022-01-11 23:51:30','103','2022-01-11 23:51:30',0x00),(1134,20,'业务表单','20','bpm_model_form_type',0,'','','流程的表单类型 - ä¸šåŠ¡è¡¨å•','103','2022-01-11 23:51:47','103','2022-01-11 23:51:47',0x00),(1135,10,'角色','10','bpm_task_candidate_strategy',0,'info','','任务分配规则的类型 - è§’色','103','2022-01-12 23:21:22','1','2024-03-06 02:53:16',0x00),(1136,20,'部门的成员','20','bpm_task_candidate_strategy',0,'primary','','任务分配规则的类型 - éƒ¨é—¨çš„æˆå‘˜','103','2022-01-12 23:21:47','1','2024-03-06 02:53:17',0x00),(1137,21,'部门的负责人','21','bpm_task_candidate_strategy',0,'primary','','任务分配规则的类型 - éƒ¨é—¨çš„负责人','103','2022-01-12 23:33:36','1','2024-03-06 02:53:18',0x00),(1138,30,'用户','30','bpm_task_candidate_strategy',0,'info','','任务分配规则的类型 - ç”¨æˆ·','103','2022-01-12 23:34:02','1','2024-03-06 02:53:19',0x00),(1139,40,'用户组','40','bpm_task_candidate_strategy',0,'warning','','任务分配规则的类型 - ç”¨æˆ·ç»„','103','2022-01-12 23:34:21','1','2024-03-06 02:53:20',0x00),(1140,60,'流程表达式','60','bpm_task_candidate_strategy',0,'danger','','任务分配规则的类型 - æµç¨‹è¡¨è¾¾å¼','103','2022-01-12 23:34:43','1','2024-03-06 02:53:20',0x00),(1141,22,'岗位','22','bpm_task_candidate_strategy',0,'success','','任务分配规则的类型 - å²—位','103','2022-01-14 18:41:55','1','2024-03-06 02:53:21',0x00),(1145,1,'管理后台','1','infra_codegen_scene',0,'','','代码生成的场景枚举 - ç®¡ç†åŽå°','1','2022-02-02 13:15:06','1','2022-03-10 16:32:59',0x00),(1146,2,'用户 APP','2','infra_codegen_scene',0,'','','代码生成的场景枚举 - ç”¨æˆ· APP','1','2022-02-02 13:15:19','1','2022-03-10 16:33:03',0x00),(1150,1,'数据库','1','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:25:28','1','2022-03-15 00:25:28',0x00),(1151,10,'本地磁盘','10','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:25:41','1','2022-03-15 00:25:56',0x00),(1152,11,'FTP æœåС噍','11','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:26:06','1','2022-03-15 00:26:10',0x00),(1153,12,'SFTP æœåС噍','12','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:26:22','1','2022-03-15 00:26:22',0x00),(1154,20,'S3 å¯¹è±¡å­˜å‚¨','20','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:26:31','1','2022-03-15 00:26:45',0x00),(1155,103,'短信登录','103','system_login_type',0,'default','',NULL,'1','2022-05-09 23:57:58','1','2022-05-09 23:58:09',0x00),(1156,1,'password','password','system_oauth2_grant_type',0,'default','','密码模式','1','2022-05-12 00:22:05','1','2022-05-11 16:26:01',0x00),(1157,2,'authorization_code','authorization_code','system_oauth2_grant_type',0,'primary','','授权码模式','1','2022-05-12 00:22:59','1','2022-05-11 16:26:02',0x00),(1158,3,'implicit','implicit','system_oauth2_grant_type',0,'success','','简化模式','1','2022-05-12 00:23:40','1','2022-05-11 16:26:05',0x00),(1159,4,'client_credentials','client_credentials','system_oauth2_grant_type',0,'default','','客户端模式','1','2022-05-12 00:23:51','1','2022-05-11 16:26:08',0x00),(1160,5,'refresh_token','refresh_token','system_oauth2_grant_type',0,'info','','刷新模式','1','2022-05-12 00:24:02','1','2022-05-11 16:26:11',0x00),(1162,1,'销售中','1','product_spu_status',0,'success','','商品 SPU çŠ¶æ€ - é”€å”®ä¸­','1','2022-10-24 21:19:47','1','2022-10-24 21:20:38',0x00),(1163,0,'仓库中','0','product_spu_status',0,'info','','商品 SPU çŠ¶æ€ - ä»“库中','1','2022-10-24 21:20:54','1','2022-10-24 21:21:22',0x00),(1164,0,'回收站','-1','product_spu_status',0,'default','','商品 SPU çŠ¶æ€ - å›žæ”¶ç«™','1','2022-10-24 21:21:11','1','2022-10-24 21:21:11',0x00),(1165,1,'满减','1','promotion_discount_type',0,'success','','优惠类型 - æ»¡å‡','1','2022-11-01 12:46:41','1','2022-11-01 12:50:11',0x00),(1166,2,'折扣','2','promotion_discount_type',0,'primary','','优惠类型 - æŠ˜æ‰£','1','2022-11-01 12:46:51','1','2022-11-01 12:50:08',0x00),(1167,1,'固定日期','1','promotion_coupon_template_validity_type',0,'default','','优惠劵模板的有限期类型 - å›ºå®šæ—¥æœŸ','1','2022-11-02 00:07:34','1','2022-11-04 00:07:49',0x00),(1168,2,'领取之后','2','promotion_coupon_template_validity_type',0,'default','','优惠劵模板的有限期类型 - é¢†å–之后','1','2022-11-02 00:07:54','1','2022-11-04 00:07:52',0x00),(1169,1,'通用劵','1','promotion_product_scope',0,'default','','营销的商品范围 - å…¨éƒ¨å•†å“å‚与','1','2022-11-02 00:28:22','1','2023-09-28 00:27:42',0x00),(1170,2,'商品劵','2','promotion_product_scope',0,'default','','营销的商品范围 - æŒ‡å®šå•†å“å‚与','1','2022-11-02 00:28:34','1','2023-09-28 00:27:44',0x00),(1171,1,'未使用','1','promotion_coupon_status',0,'primary','','优惠劵的状态 - å·²é¢†å–','1','2022-11-04 00:15:08','1','2023-10-03 12:54:38',0x00),(1172,2,'已使用','2','promotion_coupon_status',0,'success','','优惠劵的状态 - å·²ä½¿ç”¨','1','2022-11-04 00:15:21','1','2022-11-04 19:16:08',0x00),(1173,3,'已过期','3','promotion_coupon_status',0,'info','','优惠劵的状态 - å·²è¿‡æœŸ','1','2022-11-04 00:15:43','1','2022-11-04 19:16:12',0x00),(1174,1,'直接领取','1','promotion_coupon_take_type',0,'primary','','优惠劵的领取方式 - ç›´æŽ¥é¢†å–','1','2022-11-04 19:13:00','1','2022-11-04 19:13:25',0x00),(1175,2,'指定发放','2','promotion_coupon_take_type',0,'success','','优惠劵的领取方式 - æŒ‡å®šå‘放','1','2022-11-04 19:13:13','1','2022-11-04 19:14:48',0x00),(1176,10,'未开始','10','promotion_activity_status',0,'primary','','促销活动的状态枚举 - æœªå¼€å§‹','1','2022-11-04 22:54:49','1','2022-11-04 22:55:53',0x00),(1177,20,'进行中','20','promotion_activity_status',0,'success','','促销活动的状态枚举 - è¿›è¡Œä¸­','1','2022-11-04 22:55:06','1','2022-11-04 22:55:20',0x00),(1178,30,'已结束','30','promotion_activity_status',0,'info','','促销活动的状态枚举 - å·²ç»“束','1','2022-11-04 22:55:41','1','2022-11-04 22:55:41',0x00),(1179,40,'已关闭','40','promotion_activity_status',0,'warning','','促销活动的状态枚举 - å·²å…³é—­','1','2022-11-04 22:56:10','1','2022-11-04 22:56:18',0x00),(1180,10,'满 N å…ƒ','10','promotion_condition_type',0,'primary','','营销的条件类型 - æ»¡ N å…ƒ','1','2022-11-04 22:59:45','1','2022-11-04 22:59:45',0x00),(1181,20,'满 N ä»¶','20','promotion_condition_type',0,'success','','营销的条件类型 - æ»¡ N ä»¶','1','2022-11-04 23:00:02','1','2022-11-04 23:00:02',0x00),(1182,10,'申请售后','10','trade_after_sale_status',0,'primary','','交易售后状态 - ç”³è¯·å”®åŽ','1','2022-11-19 20:53:33','1','2022-11-19 20:54:42',0x00),(1183,20,'商品待退货','20','trade_after_sale_status',0,'primary','','交易售后状态 - å•†å“å¾…退货','1','2022-11-19 20:54:36','1','2022-11-19 20:58:58',0x00),(1184,30,'商家待收货','30','trade_after_sale_status',0,'primary','','交易售后状态 - å•†å®¶å¾…æ”¶è´§','1','2022-11-19 20:56:56','1','2022-11-19 20:59:20',0x00),(1185,40,'等待退款','40','trade_after_sale_status',0,'primary','','交易售后状态 - ç­‰å¾…退款','1','2022-11-19 20:59:54','1','2022-11-19 21:00:01',0x00),(1186,50,'退款成功','50','trade_after_sale_status',0,'default','','交易售后状态 - é€€æ¬¾æˆåŠŸ','1','2022-11-19 21:00:33','1','2022-11-19 21:00:33',0x00),(1187,61,'买家取消','61','trade_after_sale_status',0,'info','','交易售后状态 - ä¹°å®¶å–消','1','2022-11-19 21:01:29','1','2022-11-19 21:01:29',0x00),(1188,62,'商家拒绝','62','trade_after_sale_status',0,'info','','交易售后状态 - å•†å®¶æ‹’绝','1','2022-11-19 21:02:17','1','2022-11-19 21:02:17',0x00),(1189,63,'商家拒收货','63','trade_after_sale_status',0,'info','','交易售后状态 - å•†å®¶æ‹’æ”¶è´§','1','2022-11-19 21:02:37','1','2022-11-19 21:03:07',0x00),(1190,10,'售中退款','10','trade_after_sale_type',0,'success','','交易售后的类型 - å”®ä¸­é€€æ¬¾','1','2022-11-19 21:05:05','1','2022-11-19 21:38:23',0x00),(1191,20,'售后退款','20','trade_after_sale_type',0,'primary','','交易售后的类型 - å”®åŽé€€æ¬¾','1','2022-11-19 21:05:32','1','2022-11-19 21:38:32',0x00),(1192,10,'仅退款','10','trade_after_sale_way',0,'primary','','交易售后的方式 - ä»…退款','1','2022-11-19 21:39:19','1','2022-11-19 21:39:19',0x00),(1193,20,'退货退款','20','trade_after_sale_way',0,'success','','交易售后的方式 - é€€è´§é€€æ¬¾','1','2022-11-19 21:39:38','1','2022-11-19 21:39:49',0x00),(1194,10,'微信小程序','10','terminal',0,'default','','终端 - å¾®ä¿¡å°ç¨‹åº','1','2022-12-10 10:51:11','1','2022-12-10 10:51:57',0x00),(1195,20,'H5 ç½‘页','20','terminal',0,'default','','终端 - H5 ç½‘页','1','2022-12-10 10:51:30','1','2022-12-10 10:51:59',0x00),(1196,11,'微信公众号','11','terminal',0,'default','','终端 - å¾®ä¿¡å…¬ä¼—号','1','2022-12-10 10:54:16','1','2022-12-10 10:52:01',0x00),(1197,31,'苹果 App','31','terminal',0,'default','','终端 - è‹¹æžœ App','1','2022-12-10 10:54:42','1','2022-12-10 10:52:18',0x00),(1198,32,'安卓 App','32','terminal',0,'default','','终端 - å®‰å“ App','1','2022-12-10 10:55:02','1','2022-12-10 10:59:17',0x00),(1199,0,'普通订单','0','trade_order_type',0,'default','','交易订单的类型 - æ™®é€šè®¢å•','1','2022-12-10 16:34:14','1','2022-12-10 16:34:14',0x00),(1200,1,'秒杀订单','1','trade_order_type',0,'default','','交易订单的类型 - ç§’杀订单','1','2022-12-10 16:34:26','1','2022-12-10 16:34:26',0x00),(1201,2,'砍价订单','2','trade_order_type',0,'default','','交易订单的类型 - æ‹¼å›¢è®¢å•','1','2022-12-10 16:34:36','1','2024-09-07 14:18:39',0x00),(1202,3,'拼团订单','3','trade_order_type',0,'default','','交易订单的类型 - ç ä»·è®¢å•','1','2022-12-10 16:34:48','1','2024-09-07 14:18:32',0x00),(1203,0,'待支付','0','trade_order_status',0,'default','','交易订单状态 - å¾…支付','1','2022-12-10 16:49:29','1','2022-12-10 16:49:29',0x00),(1204,10,'待发货','10','trade_order_status',0,'primary','','交易订单状态 - å¾…发货','1','2022-12-10 16:49:53','1','2022-12-10 16:51:17',0x00),(1205,20,'已发货','20','trade_order_status',0,'primary','','交易订单状态 - å·²å‘è´§','1','2022-12-10 16:50:13','1','2022-12-10 16:51:31',0x00),(1206,30,'已完成','30','trade_order_status',0,'success','','交易订单状态 - å·²å®Œæˆ','1','2022-12-10 16:50:30','1','2022-12-10 16:51:06',0x00),(1207,40,'已取消','40','trade_order_status',0,'danger','','交易订单状态 - å·²å–消','1','2022-12-10 16:50:50','1','2022-12-10 16:51:00',0x00),(1208,0,'未售后','0','trade_order_item_after_sale_status',0,'info','','交易订单项的售后状态 - æœªå”®åŽ','1','2022-12-10 20:58:42','1','2022-12-10 20:59:29',0x00),(1209,10,'售后中','10','trade_order_item_after_sale_status',0,'primary','','交易订单项的售后状态 - å”®åŽä¸­','1','2022-12-10 20:59:21','1','2024-07-21 17:01:24',0x00),(1210,20,'已退款','20','trade_order_item_after_sale_status',0,'success','','交易订单项的售后状态 - å·²é€€æ¬¾','1','2022-12-10 20:59:46','1','2024-07-21 17:01:35',0x00),(1211,1,'完全匹配','1','mp_auto_reply_request_match',0,'primary','','公众号自动回复的请求关键字匹配模式 - å®Œå…¨åŒ¹é…','1','2023-01-16 23:30:39','1','2023-01-16 23:31:00',0x00),(1212,2,'半匹配','2','mp_auto_reply_request_match',0,'success','','公众号自动回复的请求关键字匹配模式 - åŠåŒ¹é…','1','2023-01-16 23:30:55','1','2023-01-16 23:31:10',0x00),(1213,1,'文本','text','mp_message_type',0,'default','','公众号的消息类型 - æ–‡æœ¬','1','2023-01-17 22:17:32','1','2023-01-17 22:17:39',0x00),(1214,2,'图片','image','mp_message_type',0,'default','','公众号的消息类型 - å›¾ç‰‡','1','2023-01-17 22:17:32','1','2023-01-17 14:19:47',0x00),(1215,3,'语音','voice','mp_message_type',0,'default','','公众号的消息类型 - è¯­éŸ³','1','2023-01-17 22:17:32','1','2023-01-17 14:20:08',0x00),(1216,4,'视频','video','mp_message_type',0,'default','','公众号的消息类型 - è§†é¢‘','1','2023-01-17 22:17:32','1','2023-01-17 14:21:08',0x00),(1217,5,'小视频','shortvideo','mp_message_type',0,'default','','公众号的消息类型 - å°è§†é¢‘','1','2023-01-17 22:17:32','1','2023-01-17 14:19:59',0x00),(1218,6,'图文','news','mp_message_type',0,'default','','公众号的消息类型 - å›¾æ–‡','1','2023-01-17 22:17:32','1','2023-01-17 14:22:54',0x00),(1219,7,'音乐','music','mp_message_type',0,'default','','公众号的消息类型 - éŸ³ä¹','1','2023-01-17 22:17:32','1','2023-01-17 14:22:54',0x00),(1220,8,'地理位置','location','mp_message_type',0,'default','','公众号的消息类型 - åœ°ç†ä½ç½®','1','2023-01-17 22:17:32','1','2023-01-17 14:23:51',0x00),(1221,9,'链接','link','mp_message_type',0,'default','','公众号的消息类型 - é“¾æŽ¥','1','2023-01-17 22:17:32','1','2023-01-17 14:24:49',0x00),(1222,10,'事件','event','mp_message_type',0,'default','','公众号的消息类型 - äº‹ä»¶','1','2023-01-17 22:17:32','1','2023-01-17 14:24:49',0x00),(1223,0,'初始化','0','system_mail_send_status',0,'primary','','邮件发送状态 - åˆå§‹åŒ–\n','1','2023-01-26 09:53:49','1','2023-01-26 16:36:14',0x00),(1224,10,'发送成功','10','system_mail_send_status',0,'success','','邮件发送状态 - å‘送成功','1','2023-01-26 09:54:28','1','2023-01-26 16:36:22',0x00),(1225,20,'发送失败','20','system_mail_send_status',0,'danger','','邮件发送状态 - å‘送失败','1','2023-01-26 09:54:50','1','2023-01-26 16:36:26',0x00),(1226,30,'不发送','30','system_mail_send_status',0,'info','','邮件发送状态 -  ä¸å‘送','1','2023-01-26 09:55:06','1','2023-01-26 16:36:36',0x00),(1227,1,'通知公告','1','system_notify_template_type',0,'primary','','站内信模版的类型 - é€šçŸ¥å…¬å‘Š','1','2023-01-28 10:35:59','1','2023-01-28 10:35:59',0x00),(1228,2,'系统消息','2','system_notify_template_type',0,'success','','站内信模版的类型 - ç³»ç»Ÿæ¶ˆæ¯','1','2023-01-28 10:36:20','1','2023-01-28 10:36:25',0x00),(1230,13,'支付宝条码支付','alipay_bar','pay_channel_code',0,'primary','','支付宝条码支付','1','2023-02-18 23:32:24','1','2023-07-19 20:09:23',0x00),(1231,10,'Vue2 Element UI æ ‡å‡†æ¨¡ç‰ˆ','10','infra_codegen_front_type',0,'','','','1','2023-04-13 00:03:55','1','2023-04-13 00:03:55',0x00),(1232,20,'Vue3 Element Plus æ ‡å‡†æ¨¡ç‰ˆ','20','infra_codegen_front_type',0,'','','','1','2023-04-13 00:04:08','1','2023-04-13 00:04:08',0x00),(1234,30,'Vben2.0 Ant Design Schema æ¨¡ç‰ˆ','30','infra_codegen_front_type',1,'','','','1','2023-04-13 00:04:26','1','2025-07-27 10:55:14',0x00),(1244,0,'按件','1','trade_delivery_express_charge_mode',0,'','','','1','2023-05-21 22:46:40','1','2023-05-21 22:46:40',0x00),(1245,1,'按重量','2','trade_delivery_express_charge_mode',0,'','','','1','2023-05-21 22:46:58','1','2023-05-21 22:46:58',0x00),(1246,2,'按体积','3','trade_delivery_express_charge_mode',0,'','','','1','2023-05-21 22:47:18','1','2023-05-21 22:47:18',0x00),(1335,11,'订单积分抵扣','11','member_point_biz_type',0,'','','','1','2023-06-10 12:15:27','1','2023-10-11 07:41:43',0x00),(1336,1,'签到','1','member_point_biz_type',0,'','','','1','2023-06-10 12:15:48','1','2023-08-20 11:59:53',0x00),(1341,20,'已退款','20','pay_order_status',0,'danger','','已退款','1','2023-07-19 18:05:37','1','2023-07-19 18:05:37',0x00),(1342,21,'请求成功,但是结果失败','21','pay_notify_status',0,'warning','','请求成功,但是结果失败','1','2023-07-19 18:10:47','1','2023-07-19 18:11:38',0x00),(1343,22,'请求失败','22','pay_notify_status',0,'warning','',NULL,'1','2023-07-19 18:11:05','1','2023-07-19 18:11:27',0x00),(1344,4,'微信扫码支付','wx_native','pay_channel_code',0,'success','','微信扫码支付','1','2023-07-19 20:07:47','1','2023-07-19 20:09:03',0x00),(1345,5,'微信条码支付','wx_bar','pay_channel_code',0,'success','','微信条码支付\n','1','2023-07-19 20:08:06','1','2023-07-19 20:09:08',0x00),(1346,1,'支付单','1','pay_notify_type',0,'primary','','支付单','1','2023-07-20 12:23:17','1','2023-07-20 12:23:17',0x00),(1347,2,'退款单','2','pay_notify_type',0,'danger','',NULL,'1','2023-07-20 12:23:26','1','2023-07-20 12:23:26',0x00),(1348,20,'模拟支付','mock','pay_channel_code',0,'default','','模拟支付','1','2023-07-29 11:10:51','1','2023-07-29 03:14:10',0x00),(1349,12,'订单积分抵扣(整单取消)','12','member_point_biz_type',0,'','','','1','2023-08-20 12:00:03','1','2023-10-11 07:42:01',0x00),(1350,0,'管理员调整','0','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1351,1,'邀新奖励','1','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1352,11,'下单奖励','11','member_experience_biz_type',0,'success','',NULL,'','2023-08-22 12:41:01','1','2023-10-11 07:45:09',0x00),(1353,12,'下单奖励(整单取消)','12','member_experience_biz_type',0,'warning','',NULL,'','2023-08-22 12:41:01','1','2023-10-11 07:45:01',0x00),(1354,4,'签到奖励','4','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1355,5,'抽奖奖励','5','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1356,1,'快递发货','1','trade_delivery_type',0,'','','','1','2023-08-23 00:04:55','1','2023-08-23 00:04:55',0x00),(1357,2,'用户自提','2','trade_delivery_type',0,'','','','1','2023-08-23 00:05:05','1','2023-08-23 00:05:05',0x00),(1358,3,'品类劵','3','promotion_product_scope',0,'default','','','1','2023-09-01 23:43:07','1','2023-09-28 00:27:47',0x00),(1359,1,'人人分销','1','brokerage_enabled_condition',0,'','','所有用户都可以分销','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1360,2,'指定分销','2','brokerage_enabled_condition',0,'','','仅可后台手动设置推广员','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1361,1,'首次绑定','1','brokerage_bind_mode',0,'','','只要用户没有推广人,随时都可以绑定推广关系','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1362,2,'注册绑定','2','brokerage_bind_mode',0,'','','仅新用户注册时才能绑定推广关系','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1363,3,'覆盖绑定','3','brokerage_bind_mode',0,'','','如果用户已经有推广人,推广人会被变更','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1364,1,'钱包','1','brokerage_withdraw_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1365,2,'银行卡','2','brokerage_withdraw_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1366,3,'微信收款码','3','brokerage_withdraw_type',0,'','','手动打款','','2023-09-28 02:46:05','1','2025-05-10 08:24:25',0x00),(1367,4,'支付宝收款码','4','brokerage_withdraw_type',0,'','','手动打款','','2023-09-28 02:46:05','1','2025-05-10 08:24:37',0x00),(1368,1,'订单返佣','1','brokerage_record_biz_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1369,2,'申请提现','2','brokerage_record_biz_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1370,3,'申请提现驳回','3','brokerage_record_biz_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1371,0,'待结算','0','brokerage_record_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1372,1,'已结算','1','brokerage_record_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1373,2,'已取消','2','brokerage_record_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1374,0,'审核中','0','brokerage_withdraw_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1375,10,'审核通过','10','brokerage_withdraw_status',0,'success','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1376,11,'提现成功','11','brokerage_withdraw_status',0,'success','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1377,20,'审核不通过','20','brokerage_withdraw_status',0,'danger','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1378,21,'提现失败','21','brokerage_withdraw_status',0,'danger','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1379,0,'工商银行','0','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1380,1,'建设银行','1','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1381,2,'农业银行','2','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1382,3,'中国银行','3','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1383,4,'交通银行','4','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1384,5,'招商银行','5','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1385,21,'钱包','wallet','pay_channel_code',0,'primary','','','1','2023-10-01 21:46:19','1','2023-10-01 21:48:01',0x00),(1386,1,'砍价中','1','promotion_bargain_record_status',0,'default','','','1','2023-10-05 10:41:26','1','2023-10-05 10:41:26',0x00),(1387,2,'砍价成功','2','promotion_bargain_record_status',0,'success','','','1','2023-10-05 10:41:39','1','2023-10-05 10:41:39',0x00),(1388,3,'砍价失败','3','promotion_bargain_record_status',0,'warning','','','1','2023-10-05 10:41:57','1','2023-10-05 10:41:57',0x00),(1389,0,'拼团中','0','promotion_combination_record_status',0,'','','','1','2023-10-08 07:24:44','1','2024-10-13 10:08:17',0x00),(1390,1,'拼团成功','1','promotion_combination_record_status',0,'success','','','1','2023-10-08 07:24:56','1','2024-10-13 10:08:20',0x00),(1391,2,'拼团失败','2','promotion_combination_record_status',0,'warning','','','1','2023-10-08 07:25:11','1','2024-10-13 10:08:24',0x00),(1392,2,'管理员修改','2','member_point_biz_type',0,'default','','','1','2023-10-11 07:41:34','1','2023-10-11 07:41:34',0x00),(1393,13,'订单积分抵扣(单个退款)','13','member_point_biz_type',0,'','','','1','2023-10-11 07:42:29','1','2023-10-11 07:42:29',0x00),(1394,21,'订单积分奖励','21','member_point_biz_type',0,'default','','','1','2023-10-11 07:42:44','1','2023-10-11 07:42:44',0x00),(1395,22,'订单积分奖励(整单取消)','22','member_point_biz_type',0,'default','','','1','2023-10-11 07:42:55','1','2023-10-11 07:43:01',0x00),(1396,23,'订单积分奖励(单个退款)','23','member_point_biz_type',0,'default','','','1','2023-10-11 07:43:16','1','2023-10-11 07:43:16',0x00),(1397,13,'下单奖励(单个退款)','13','member_experience_biz_type',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(1398,5,'网上转账','5','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:24','1','2023-10-18 21:55:24',0x00),(1399,6,'支付宝','6','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:38','1','2023-10-18 21:55:38',0x00),(1400,7,'微信支付','7','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:53','1','2023-10-18 21:55:53',0x00),(1401,8,'其他','8','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:56:06','1','2023-10-18 21:56:06',0x00),(1402,1,'IT','1','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:15','1','2024-02-18 23:30:38',0x00),(1403,2,'金融业','2','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:29','1','2024-02-18 23:30:43',0x00),(1404,3,'房地产','3','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:41','1','2024-02-18 23:30:48',0x00),(1405,4,'商业服务','4','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:54','1','2024-02-18 23:30:54',0x00),(1406,5,'运输/物流','5','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:03','1','2024-02-18 23:31:00',0x00),(1407,6,'生产','6','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:13','1','2024-02-18 23:31:08',0x00),(1408,7,'政府','7','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:27','1','2024-02-18 23:31:13',0x00),(1409,8,'文化传媒','8','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:37','1','2024-02-18 23:31:20',0x00),(1422,1,'A ï¼ˆé‡ç‚¹å®¢æˆ·ï¼‰','1','crm_customer_level',0,'primary','','','1','2023-10-28 23:07:13','1','2023-10-28 23:07:13',0x00),(1423,2,'B ï¼ˆæ™®é€šå®¢æˆ·ï¼‰','2','crm_customer_level',0,'info','','','1','2023-10-28 23:07:35','1','2023-10-28 23:07:35',0x00),(1424,3,'C ï¼ˆéžä¼˜å…ˆå®¢æˆ·ï¼‰','3','crm_customer_level',0,'default','','','1','2023-10-28 23:07:53','1','2023-10-28 23:07:53',0x00),(1425,1,'促销','1','crm_customer_source',0,'default','','','1','2023-10-28 23:08:29','1','2023-10-28 23:08:29',0x00),(1426,2,'搜索引擎','2','crm_customer_source',0,'default','','','1','2023-10-28 23:08:39','1','2023-10-28 23:08:39',0x00),(1427,3,'广告','3','crm_customer_source',0,'default','','','1','2023-10-28 23:08:47','1','2023-10-28 23:08:47',0x00),(1428,4,'转介绍','4','crm_customer_source',0,'default','','','1','2023-10-28 23:08:58','1','2023-10-28 23:08:58',0x00),(1429,5,'线上注册','5','crm_customer_source',0,'default','','','1','2023-10-28 23:09:12','1','2023-10-28 23:09:12',0x00),(1430,6,'线上咨询','6','crm_customer_source',0,'default','','','1','2023-10-28 23:09:22','1','2023-10-28 23:09:22',0x00),(1431,7,'预约上门','7','crm_customer_source',0,'default','','','1','2023-10-28 23:09:39','1','2023-10-28 23:09:39',0x00),(1432,8,'陌拜','8','crm_customer_source',0,'default','','','1','2023-10-28 23:10:04','1','2023-10-28 23:10:04',0x00),(1433,9,'电话咨询','9','crm_customer_source',0,'default','','','1','2023-10-28 23:10:18','1','2023-10-28 23:10:18',0x00),(1434,10,'邮件咨询','10','crm_customer_source',0,'default','','','1','2023-10-28 23:10:33','1','2023-10-28 23:10:33',0x00),(1435,10,'Gitee','10','system_social_type',0,'','','','1','2023-11-04 13:04:42','1','2023-11-04 13:04:42',0x00),(1436,20,'钉钉','20','system_social_type',0,'','','','1','2023-11-04 13:04:54','1','2023-11-04 13:04:54',0x00),(1437,30,'企业微信','30','system_social_type',0,'','','','1','2023-11-04 13:05:09','1','2023-11-04 13:05:09',0x00),(1438,31,'微信公众平台','31','system_social_type',0,'','','','1','2023-11-04 13:05:18','1','2023-11-04 13:05:18',0x00),(1439,32,'微信开放平台','32','system_social_type',0,'','','','1','2023-11-04 13:05:30','1','2023-11-04 13:05:30',0x00),(1440,34,'微信小程序','34','system_social_type',0,'','','','1','2023-11-04 13:05:38','1','2023-11-04 13:07:16',0x00),(1441,1,'上架','1','crm_product_status',0,'success','','','1','2023-10-30 21:49:34','1','2023-10-30 21:49:34',0x00),(1442,0,'下架','0','crm_product_status',0,'success','','','1','2023-10-30 21:49:13','1','2023-10-30 21:49:13',0x00),(1443,15,'子表','15','infra_codegen_template_type',0,'default','','','1','2023-11-13 23:06:16','1','2023-11-13 23:06:16',0x00),(1444,10,'主表(标准模式)','10','infra_codegen_template_type',0,'default','','','1','2023-11-14 12:32:49','1','2023-11-14 12:32:49',0x00),(1445,11,'主表(ERP æ¨¡å¼ï¼‰','11','infra_codegen_template_type',0,'default','','','1','2023-11-14 12:33:05','1','2023-11-14 12:33:05',0x00),(1446,12,'主表(内嵌模式)','12','infra_codegen_template_type',0,'','','','1','2023-11-14 12:33:31','1','2023-11-14 12:33:31',0x00),(1447,1,'负责人','1','crm_permission_level',0,'default','','','1','2023-11-30 09:53:12','1','2023-11-30 09:53:12',0x00),(1448,2,'只读','2','crm_permission_level',0,'','','','1','2023-11-30 09:53:29','1','2023-11-30 09:53:29',0x00),(1449,3,'读写','3','crm_permission_level',0,'','','','1','2023-11-30 09:53:36','1','2023-11-30 09:53:36',0x00),(1450,0,'未提交','0','crm_audit_status',0,'','','','1','2023-11-30 18:56:59','1','2023-11-30 18:56:59',0x00),(1451,10,'审批中','10','crm_audit_status',0,'','','','1','2023-11-30 18:57:10','1','2023-11-30 18:57:10',0x00),(1452,20,'审核通过','20','crm_audit_status',0,'','','','1','2023-11-30 18:57:24','1','2023-11-30 18:57:24',0x00),(1453,30,'审核不通过','30','crm_audit_status',0,'','','','1','2023-11-30 18:57:32','1','2023-11-30 18:57:32',0x00),(1454,40,'已取消','40','crm_audit_status',0,'','','','1','2023-11-30 18:57:42','1','2023-11-30 18:57:42',0x00),(1456,1,'支票','1','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:54:29','1','2023-10-18 21:54:29',0x00),(1457,2,'现金','2','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:54:41','1','2023-10-18 21:54:41',0x00),(1458,3,'邮政汇款','3','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:54:53','1','2023-10-18 21:54:53',0x00),(1459,4,'电汇','4','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:07','1','2023-10-18 21:55:07',0x00),(1461,1,'个','1','crm_product_unit',0,'','','','1','2023-12-05 23:02:26','1','2023-12-05 23:02:26',0x00),(1462,2,'块','2','crm_product_unit',0,'','','','1','2023-12-05 23:02:34','1','2023-12-05 23:02:34',0x00),(1463,3,'只','3','crm_product_unit',0,'','','','1','2023-12-05 23:02:57','1','2023-12-05 23:02:57',0x00),(1464,4,'把','4','crm_product_unit',0,'','','','1','2023-12-05 23:03:05','1','2023-12-05 23:03:05',0x00),(1465,5,'枚','5','crm_product_unit',0,'','','','1','2023-12-05 23:03:14','1','2023-12-05 23:03:14',0x00),(1466,6,'瓶','6','crm_product_unit',0,'','','','1','2023-12-05 23:03:20','1','2023-12-05 23:03:20',0x00),(1467,7,'盒','7','crm_product_unit',0,'','','','1','2023-12-05 23:03:30','1','2023-12-05 23:03:30',0x00),(1468,8,'台','8','crm_product_unit',0,'','','','1','2023-12-05 23:03:41','1','2023-12-05 23:03:41',0x00),(1469,9,'吨','9','crm_product_unit',0,'','','','1','2023-12-05 23:03:48','1','2023-12-05 23:03:48',0x00),(1470,10,'千克','10','crm_product_unit',0,'','','','1','2023-12-05 23:04:03','1','2023-12-05 23:04:03',0x00),(1471,11,'ç±³','11','crm_product_unit',0,'','','','1','2023-12-05 23:04:12','1','2023-12-05 23:04:12',0x00),(1472,12,'ç®±','12','crm_product_unit',0,'','','','1','2023-12-05 23:04:25','1','2023-12-05 23:04:25',0x00),(1473,13,'套','13','crm_product_unit',0,'','','','1','2023-12-05 23:04:34','1','2023-12-05 23:04:34',0x00),(1474,1,'打电话','1','crm_follow_up_type',0,'','','','1','2024-01-15 20:48:20','1','2024-01-15 20:48:20',0x00),(1475,2,'发短信','2','crm_follow_up_type',0,'','','','1','2024-01-15 20:48:31','1','2024-01-15 20:48:31',0x00),(1476,3,'上门拜访','3','crm_follow_up_type',0,'','','','1','2024-01-15 20:49:07','1','2024-01-15 20:49:07',0x00),(1477,4,'微信沟通','4','crm_follow_up_type',0,'','','','1','2024-01-15 20:49:15','1','2024-01-15 20:49:15',0x00),(1482,4,'转账失败','20','pay_transfer_status',0,'warning','','','1','2023-10-28 16:24:16','1','2025-05-08 12:59:01',0x00),(1483,3,'转账成功','10','pay_transfer_status',0,'success','','','1','2023-10-28 16:23:50','1','2025-05-08 12:58:58',0x00),(1484,2,'转账进行中','5','pay_transfer_status',0,'info','','','1','2023-10-28 16:23:12','1','2025-05-08 12:58:54',0x00),(1485,1,'等待转账','0','pay_transfer_status',0,'default','','','1','2023-10-28 16:21:43','1','2023-10-28 16:23:22',0x00),(1486,10,'其它入库','10','erp_stock_record_biz_type',0,'','','','1','2024-02-05 18:07:25','1','2024-02-05 18:07:43',0x00),(1487,11,'其它入库(作废)','11','erp_stock_record_biz_type',0,'danger','','','1','2024-02-05 18:08:07','1','2024-02-05 19:20:16',0x00),(1488,20,'其它出库','20','erp_stock_record_biz_type',0,'','','','1','2024-02-05 18:08:51','1','2024-02-05 18:08:51',0x00),(1489,21,'其它出库(作废)','21','erp_stock_record_biz_type',0,'danger','','','1','2024-02-05 18:09:00','1','2024-02-05 19:20:10',0x00),(1490,10,'审批中','10','erp_audit_status',0,'default','','','1','2024-02-06 00:00:21','1','2026-06-26 08:46:48',0x00),(1491,20,'审批通过','20','erp_audit_status',0,'success','','','1','2024-02-06 00:00:35','1','2026-06-26 08:46:48',0x00),(1492,30,'调拨入库','30','erp_stock_record_biz_type',0,'','','','1','2024-02-07 20:34:19','1','2024-02-07 12:36:31',0x00),(1493,31,'调拨入库(作废)','31','erp_stock_record_biz_type',0,'danger','','','1','2024-02-07 20:34:29','1','2024-02-07 20:37:11',0x00),(1494,32,'调拨出库','32','erp_stock_record_biz_type',0,'','','','1','2024-02-07 20:34:38','1','2024-02-07 12:36:33',0x00),(1495,33,'调拨出库(作废)','33','erp_stock_record_biz_type',0,'danger','','','1','2024-02-07 20:34:49','1','2024-02-07 20:37:06',0x00),(1496,40,'盘盈入库','40','erp_stock_record_biz_type',0,'','','','1','2024-02-08 08:53:00','1','2024-02-08 08:53:09',0x00),(1497,41,'盘盈入库(作废)','41','erp_stock_record_biz_type',0,'danger','','','1','2024-02-08 08:53:39','1','2024-02-16 19:40:54',0x00),(1498,42,'盘亏出库','42','erp_stock_record_biz_type',0,'','','','1','2024-02-08 08:54:16','1','2024-02-08 08:54:16',0x00),(1499,43,'盘亏出库(作废)','43','erp_stock_record_biz_type',0,'danger','','','1','2024-02-08 08:54:31','1','2024-02-16 19:40:46',0x00),(1500,50,'销售出库','50','erp_stock_record_biz_type',0,'','','','1','2024-02-11 21:47:25','1','2024-02-11 21:50:40',0x00),(1501,51,'销售出库(作废)','51','erp_stock_record_biz_type',0,'danger','','','1','2024-02-11 21:47:37','1','2024-02-11 21:51:12',0x00),(1502,60,'销售退货入库','60','erp_stock_record_biz_type',0,'','','','1','2024-02-12 06:51:05','1','2024-02-12 06:51:05',0x00),(1503,61,'销售退货入库(作废)','61','erp_stock_record_biz_type',0,'danger','','','1','2024-02-12 06:51:18','1','2024-02-12 06:51:18',0x00),(1504,70,'采购入库','70','erp_stock_record_biz_type',0,'','','','1','2024-02-16 13:10:02','1','2024-02-16 13:10:02',0x00),(1505,71,'采购入库(作废)','71','erp_stock_record_biz_type',0,'danger','','','1','2024-02-16 13:10:10','1','2024-02-16 19:40:40',0x00),(1506,80,'采购退货出库','80','erp_stock_record_biz_type',0,'','','','1','2024-02-16 13:10:17','1','2024-02-16 13:10:17',0x00),(1507,81,'采购退货出库(作废)','81','erp_stock_record_biz_type',0,'danger','','','1','2024-02-16 13:10:26','1','2024-02-16 19:40:33',0x00),(1509,3,'审批不通过','3','bpm_process_instance_status',0,'danger','','','1','2024-03-16 16:12:06','1','2024-03-16 16:12:06',0x00),(1510,4,'已取消','4','bpm_process_instance_status',0,'warning','','','1','2024-03-16 16:12:22','1','2024-03-16 16:12:22',0x00),(1511,5,'已退回','5','bpm_task_status',0,'warning','','','1','2024-03-16 19:10:46','1','2024-03-08 22:41:40',0x00),(1512,6,'委派中','6','bpm_task_status',0,'primary','','','1','2024-03-17 10:06:22','1','2024-03-08 22:41:40',0x00),(1513,7,'审批通过中','7','bpm_task_status',0,'success','','','1','2024-03-17 10:06:47','1','2024-03-08 22:41:41',0x00),(1514,0,'待审批','0','bpm_task_status',0,'info','','','1','2024-03-17 10:07:11','1','2024-03-08 22:41:42',0x00),(1515,35,'发起人自选','35','bpm_task_candidate_strategy',0,'','','','1','2024-03-22 19:45:16','1','2024-03-22 19:45:16',0x00),(1516,1,'执行监听器','execution','bpm_process_listener_type',0,'primary','','','1','2024-03-23 12:54:03','1','2024-03-23 19:14:19',0x00),(1517,1,'任务监听器','task','bpm_process_listener_type',0,'success','','','1','2024-03-23 12:54:13','1','2024-03-23 19:14:24',0x00),(1526,1,'Java ç±»','class','bpm_process_listener_value_type',0,'primary','','','1','2024-03-23 15:08:45','1','2024-03-23 19:14:32',0x00),(1527,2,'表达式','expression','bpm_process_listener_value_type',0,'success','','','1','2024-03-23 15:09:06','1','2024-03-23 19:14:38',0x00),(1528,3,'代理表达式','delegateExpression','bpm_process_listener_value_type',0,'info','','','1','2024-03-23 15:11:23','1','2024-03-23 19:14:41',0x00),(1529,1,'天','1','date_interval',0,'','','','1','2024-03-29 22:50:26','1','2024-03-29 22:50:26',0x00),(1530,2,'周','2','date_interval',0,'','','','1','2024-03-29 22:50:36','1','2024-03-29 22:50:36',0x00),(1531,3,'月','3','date_interval',0,'','','','1','2024-03-29 22:50:46','1','2024-03-29 22:50:54',0x00),(1532,4,'季度','4','date_interval',0,'','','','1','2024-03-29 22:51:01','1','2024-03-29 22:51:01',0x00),(1533,5,'å¹´','5','date_interval',0,'','','','1','2024-03-29 22:51:07','1','2024-03-29 22:51:07',0x00),(1537,1,'OpenAI','OpenAI','ai_platform',0,'','','','1','2024-05-09 22:33:47','1','2024-05-09 22:58:46',0x00),(1538,2,'Ollama','Ollama','ai_platform',0,'','','','1','2024-05-17 23:02:55','1','2024-05-17 23:02:55',0x00),(1539,3,'文心一言','YiYan','ai_platform',0,'','','','1','2024-05-18 09:24:20','1','2024-05-18 09:29:01',0x00),(1540,4,'讯飞星火','XingHuo','ai_platform',0,'','','','1','2024-05-18 10:08:56','1','2024-05-18 10:08:56',0x00),(1541,5,'通义千问','TongYi','ai_platform',0,'','','','1','2024-05-18 10:32:29','1','2024-07-06 15:42:29',0x00),(1542,6,'StableDiffusion','StableDiffusion','ai_platform',0,'','','','1','2024-06-01 15:09:31','1','2024-06-01 15:10:25',0x00),(1543,10,'进行中','10','ai_image_status',0,'primary','','','1','2024-06-26 20:51:41','1','2024-06-26 20:52:48',0x00),(1544,20,'已完成','20','ai_image_status',0,'success','','','1','2024-06-26 20:52:07','1','2024-06-26 20:52:41',0x00),(1545,30,'已失败','30','ai_image_status',0,'warning','','','1','2024-06-26 20:52:25','1','2024-06-26 20:52:35',0x00),(1546,7,'Midjourney','Midjourney','ai_platform',0,'','','','1','2024-06-26 22:14:46','1','2024-06-26 22:14:46',0x00),(1547,10,'进行中','10','ai_music_status',0,'primary','','','1','2024-06-27 22:45:22','1','2024-06-28 00:56:17',0x00),(1548,20,'已完成','20','ai_music_status',0,'success','','','1','2024-06-27 22:45:33','1','2024-06-28 00:56:18',0x00),(1549,30,'已失败','30','ai_music_status',0,'danger','','','1','2024-06-27 22:45:44','1','2024-06-28 00:56:19',0x00),(1550,1,'歌词模式','1','ai_generate_mode',0,'','','','1','2024-06-27 22:46:31','1','2024-06-28 01:22:25',0x00),(1551,2,'描述模式','2','ai_generate_mode',0,'','','','1','2024-06-27 22:46:37','1','2024-06-28 01:22:24',0x00),(1552,8,'Suno','Suno','ai_platform',0,'','','','1','2024-06-29 09:13:36','1','2024-06-29 09:13:41',0x00),(1553,9,'DeepSeek','DeepSeek','ai_platform',0,'','','','1','2024-07-06 12:04:30','1','2024-07-06 12:05:20',0x00),(1554,13,'智谱','ZhiPu','ai_platform',0,'','','','1','2024-07-06 18:00:35','1','2025-02-24 20:18:41',0x00),(1555,4,'长','4','ai_write_length',0,'','','','1','2024-07-07 15:49:03','1','2024-07-07 15:49:03',0x00),(1556,5,'段落','5','ai_write_format',0,'','','','1','2024-07-07 15:49:54','1','2024-07-07 15:49:54',0x00),(1557,6,'文章','6','ai_write_format',0,'','','','1','2024-07-07 15:50:05','1','2024-07-07 15:50:05',0x00),(1558,7,'博客文章','7','ai_write_format',0,'','','','1','2024-07-07 15:50:23','1','2024-07-07 15:50:23',0x00),(1559,8,'想法','8','ai_write_format',0,'','','','1','2024-07-07 15:50:31','1','2024-07-07 15:50:31',0x00),(1560,9,'大纲','9','ai_write_format',0,'','','','1','2024-07-07 15:50:37','1','2024-07-07 15:50:37',0x00),(1561,1,'自动','1','ai_write_tone',0,'','','','1','2024-07-07 15:51:06','1','2024-07-07 15:51:06',0x00),(1562,2,'友善','2','ai_write_tone',0,'','','','1','2024-07-07 15:51:19','1','2024-07-07 15:51:19',0x00),(1563,3,'随意','3','ai_write_tone',0,'','','','1','2024-07-07 15:51:27','1','2024-07-07 15:51:27',0x00),(1564,4,'友好','4','ai_write_tone',0,'','','','1','2024-07-07 15:51:37','1','2024-07-07 15:51:37',0x00),(1565,5,'专业','5','ai_write_tone',0,'','','','1','2024-07-07 15:51:49','1','2024-07-07 15:52:02',0x00),(1566,6,'诙谐','6','ai_write_tone',0,'','','','1','2024-07-07 15:52:15','1','2024-07-07 15:52:15',0x00),(1567,7,'有趣','7','ai_write_tone',0,'','','','1','2024-07-07 15:52:24','1','2024-07-07 15:52:24',0x00),(1568,8,'正式','8','ai_write_tone',0,'','','','1','2024-07-07 15:54:33','1','2024-07-07 15:54:33',0x00),(1570,1,'自动','1','ai_write_format',0,'','','','1','2024-07-07 15:19:34','1','2024-07-07 15:19:34',0x00),(1571,2,'电子邮件','2','ai_write_format',0,'','','','1','2024-07-07 15:19:50','1','2024-07-07 15:49:30',0x00),(1572,3,'消息','3','ai_write_format',0,'','','','1','2024-07-07 15:20:01','1','2024-07-07 15:49:38',0x00),(1573,4,'评论','4','ai_write_format',0,'','','','1','2024-07-07 15:20:13','1','2024-07-07 15:49:45',0x00),(1574,1,'自动','1','ai_write_language',0,'','','','1','2024-07-07 15:44:18','1','2024-07-07 15:44:18',0x00),(1575,2,'中文','2','ai_write_language',0,'','','','1','2024-07-07 15:44:28','1','2024-07-07 15:44:28',0x00),(1576,3,'英文','3','ai_write_language',0,'','','','1','2024-07-07 15:44:37','1','2024-07-07 15:44:37',0x00),(1577,4,'韩语','4','ai_write_language',0,'','','','1','2024-07-07 15:46:28','1','2024-07-07 15:46:28',0x00),(1578,5,'日语','5','ai_write_language',0,'','','','1','2024-07-07 15:46:44','1','2024-07-07 15:46:44',0x00),(1579,1,'自动','1','ai_write_length',0,'','','','1','2024-07-07 15:48:34','1','2024-07-07 15:48:34',0x00),(1580,2,'短','2','ai_write_length',0,'','','','1','2024-07-07 15:48:44','1','2024-07-07 15:48:44',0x00),(1581,3,'中等','3','ai_write_length',0,'','','','1','2024-07-07 15:48:52','1','2024-07-07 15:48:52',0x00),(1584,1,'撰写','1','ai_write_type',0,'','','','1','2024-07-10 21:26:00','1','2024-07-10 21:26:00',0x00),(1585,2,'回复','2','ai_write_type',0,'','','','1','2024-07-10 21:26:06','1','2024-07-10 21:26:06',0x00),(1586,2,'腾讯云','TENCENT','system_sms_channel_code',0,'','','','1','2024-07-22 22:23:16','1','2024-07-22 22:23:16',0x00),(1587,3,'华为云','HUAWEI','system_sms_channel_code',0,'','','','1','2024-07-22 22:23:46','1','2024-07-22 22:23:53',0x00),(1588,1,'OpenAI å¾®è½¯','AzureOpenAI','ai_platform',0,'','','','1','2024-08-10 14:07:41','1','2024-08-10 14:07:41',0x00),(1589,10,'BPMN è®¾è®¡å™¨','10','bpm_model_type',0,'primary','','','1','2024-08-26 15:22:17','1','2024-08-26 16:46:02',0x00),(1590,20,'SIMPLE è®¾è®¡å™¨','20','bpm_model_type',0,'success','','','1','2024-08-26 15:22:27','1','2024-08-26 16:45:58',0x00),(1591,4,'七牛云','QINIU','system_sms_channel_code',0,'','','','1','2024-08-31 08:45:03','1','2024-08-31 08:45:24',0x00),(1592,3,'新人券','3','promotion_coupon_take_type',0,'info','','新人注册后,自动发放','1','2024-09-03 11:57:16','1','2024-09-03 11:57:28',0x00),(1593,5,'微信零钱','5','brokerage_withdraw_type',0,'','','API æ‰“款','1','2024-10-13 11:06:48','1','2025-05-10 08:24:55',0x00),(1683,10,'字节豆包','DouBao','ai_platform',0,'','','','1','2025-02-23 19:51:40','1','2025-02-23 19:52:02',0x00),(1684,11,'腾讯混元','HunYuan','ai_platform',0,'','','','1','2025-02-23 20:58:04','1','2025-02-23 20:58:04',0x00),(1685,12,'硅基流动','SiliconFlow','ai_platform',0,'','','','1','2025-02-24 20:19:09','1','2025-02-24 20:19:09',0x00),(1686,1,'聊天','1','ai_model_type',0,'','','','1','2025-03-03 12:26:34','1','2025-03-03 12:26:34',0x00),(1687,2,'图像','2','ai_model_type',0,'','','','1','2025-03-03 12:27:23','1','2025-03-03 12:27:23',0x00),(1688,3,'音频','3','ai_model_type',0,'','','','1','2025-03-03 12:27:51','1','2025-03-03 12:27:51',0x00),(1689,4,'视频','4','ai_model_type',0,'','','','1','2025-03-03 12:28:03','1','2025-03-03 12:28:03',0x00),(1690,5,'向量','5','ai_model_type',0,'','','','1','2025-03-03 12:28:15','1','2025-03-03 12:28:15',0x00),(1691,6,'重排','6','ai_model_type',0,'','','','1','2025-03-03 12:28:26','1','2025-03-03 12:28:26',0x00),(1692,14,'MiniMax','MiniMax','ai_platform',0,'','','','1','2025-03-11 20:04:51','1','2025-03-11 20:04:51',0x00),(1693,15,'月之暗面','Moonshot','ai_platform',0,'','','','1','2025-03-11 20:05:08','1','2025-11-24 07:17:39',0x00),(2002,0,'直连设备','0','iot_product_device_type',0,'default','','','1','2024-08-10 11:54:58','1','2025-03-17 09:28:22',0x00),(2003,2,'网关设备','2','iot_product_device_type',0,'default','','','1','2024-08-10 11:55:08','1','2025-03-17 09:28:28',0x00),(2004,1,'网关子设备','1','iot_product_device_type',0,'default','','','1','2024-08-10 11:55:20','1','2025-03-17 09:28:31',0x00),(2005,1,'已发布','1','iot_product_status',0,'success','','','1','2024-08-10 12:10:33','1','2025-03-17 09:28:34',0x00),(2006,0,'开发中','0','iot_product_status',0,'default','','','1','2024-08-10 14:19:18','1','2025-03-17 09:28:39',0x00),(2009,0,'Wi-Fi','0','iot_net_type',0,'','','','1','2024-09-06 22:04:47','1','2025-03-17 09:28:47',0x00),(2010,1,'移动网络','1','iot_net_type',0,'','','','1','2024-09-06 22:05:14','1','2025-06-12 23:27:19',0x00),(2011,2,'以太网','2','iot_net_type',0,'','','','1','2024-09-06 22:05:35','1','2025-03-17 09:28:51',0x00),(2012,3,'其他','3','iot_net_type',0,'','','','1','2024-09-06 22:05:52','1','2025-03-17 09:28:54',0x00),(2018,0,'未激活','0','iot_device_state',0,'','','','1','2024-09-21 08:13:34','1','2025-03-17 09:29:09',0x00),(2019,1,'在线','1','iot_device_state',0,'','','','1','2024-09-21 08:13:48','1','2025-03-17 09:29:12',0x00),(2020,2,'离线','2','iot_device_state',0,'','','','1','2024-09-21 08:13:59','1','2025-03-17 09:29:14',0x00),(2021,1,'属性','1','iot_thing_model_type',0,'','','','1','2024-09-29 20:03:01','1','2025-03-17 09:29:24',0x00),(2022,2,'服务','2','iot_thing_model_type',0,'','','','1','2024-09-29 20:03:11','1','2025-03-17 09:29:27',0x00),(2023,3,'事件','3','iot_thing_model_type',0,'','','','1','2024-09-29 20:03:20','1','2025-03-17 09:29:29',0x00),(2030,1,'升每分钟','L/min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:24',0x00),(2031,2,'毫克每千克','mg/kg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:27',0x00),(2032,3,'浊度','NTU','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:31',0x00),(2033,4,'PH值','pH','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:36',0x00),(2034,5,'土壤EC值','dS/m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:43',0x00),(2035,6,'太阳总辐射','W/㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:20',0x00),(2036,7,'降雨量','mm/hour','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:24',0x00),(2037,8,'乏','var','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:27',0x00),(2038,9,'厘泊','cP','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:33',0x00),(2039,10,'饱和度','aw','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:11',0x00),(2040,11,'个','pcs','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:19',0x00),(2041,12,'厘斯','cst','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:22',0x00),(2042,13,'å·´','bar','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:24',0x00),(2043,14,'纳克每升','ppt','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:27',0x00),(2044,15,'十亿分之一','ppb','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2045,16,'微西每厘米','uS/cm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:34',0x00),(2046,17,'牛顿每库仑','N/C','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:38',0x00),(2047,18,'伏特每米','V/m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:43',0x00),(2048,19,'滴速','ml/min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:46',0x00),(2049,20,'毫米汞柱','mmHg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:48',0x00),(2050,21,'血糖','mmol/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:54',0x00),(2051,22,'毫米每秒','mm/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:02',0x00),(2052,23,'转每米','turn/m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2053,24,'次','count','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:09',0x00),(2054,25,'æ¡£','gear','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:11',0x00),(2055,26,'æ­¥','stepCount','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:13',0x00),(2056,27,'标准立方米每小时','Nm3/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:15',0x00),(2057,28,'千伏','kV','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:20',0x00),(2058,29,'千伏安','kVA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:24',0x00),(2060,30,'千乏','kVar','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2061,31,'微瓦每平方厘米','uw/cm2','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2062,32,'只','只','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2063,33,'相对湿度','%RH','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2064,34,'立方米每秒','m³/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2065,35,'公斤每秒','kg/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2066,36,'转每分钟','r/min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2067,37,'吨每小时','t/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2068,38,'千卡每小时','KCL/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2069,39,'升每秒','L/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2070,40,'兆帕','MPa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2071,41,'立方米每小时','m³/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2072,42,'千乏时','kvarh','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2073,43,'微克每升','μg/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2074,44,'千卡路里','kcal','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2075,45,'吉字节','GB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2076,46,'兆字节','MB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2077,47,'千字节','KB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2078,48,'字节','B','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2079,49,'微克每平方分米每天','μg/(d㎡·d)','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2080,50,'无','','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2081,51,'百万分率','ppm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2082,52,'像素','pixel','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2083,53,'照度','Lux','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2084,54,'重力加速度','grav','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2085,55,'分贝','dB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2086,56,'百分比','%','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2087,57,'流明','lm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2088,58,'比特','bit','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2089,59,'克每毫升','g/mL','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2090,60,'克每升','g/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2091,61,'毫克每升','mg/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2092,62,'微克每立方米','μg/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2093,63,'毫克每立方米','mg/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2094,64,'克每立方米','g/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2095,65,'千克每立方米','kg/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2096,66,'纳法','nF','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2097,67,'皮法','pF','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2098,68,'微法','μF','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2099,69,'法拉','F','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2100,70,'欧姆','Ω','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2101,71,'微安','μA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2102,72,'毫安','mA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2103,73,'千安','kA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2104,74,'安培','A','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2105,75,'毫伏','mV','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2106,76,'伏特','V','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2107,77,'毫秒','ms','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2108,78,'秒','s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2109,79,'分钟','min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2110,80,'小时','h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2111,81,'日','day','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2112,82,'周','week','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2113,83,'月','month','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2114,84,'å¹´','year','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2115,85,'节','kn','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2116,86,'千米每小时','km/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2117,87,'米每秒','m/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2118,88,'角秒','″','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2119,89,'分','′','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2120,90,'度','°','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2121,91,'弧度','rad','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2122,92,'赫兹','Hz','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2123,93,'微瓦','μW','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2124,94,'毫瓦','mW','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2125,95,'千瓦特','kW','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2126,96,'瓦特','W','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2127,97,'卡路里','cal','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2128,98,'千瓦时','kW·h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2129,99,'瓦时','Wh','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2130,100,'电子伏','eV','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2131,101,'千焦','kJ','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2132,102,'焦耳','J','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2133,103,'华氏度','℉','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2134,104,'开尔文','K','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2135,105,'吨','t','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2136,106,'摄氏度','°C','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2137,107,'毫帕','1e-3Pa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2138,108,'百帕','hPa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2139,109,'千帕','kPa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2140,110,'帕斯卡','Pa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2141,111,'毫克','mg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2142,112,'克','g','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2143,113,'千克','kg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2144,114,'牛','N','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2145,115,'毫升','mL','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2146,116,'升','L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2147,117,'立方毫米','mm³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2148,118,'立方厘米','cm³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2149,119,'立方千米','km³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2150,120,'立方米','m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2151,121,'公顷','h㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2152,122,'平方厘米','c㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2153,123,'平方毫米','m㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2154,124,'平方千米','k㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2155,125,'平方米','㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2156,126,'纳米','nm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2157,127,'微米','μm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2158,128,'毫米','mm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2159,129,'厘米','cm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2160,130,'分米','dm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2161,131,'千米','km','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2162,132,'ç±³','m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2165,1,'HTTP','1','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:39:54','1','2025-06-24 12:44:47',0x00),(2166,2,'TCP','2','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:40:06','1','2025-06-24 12:44:46',0x00),(2167,3,'WebSocket','3','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:40:24','1','2025-06-24 12:44:45',0x00),(2168,10,'MQTT','10','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:40:37','1','2025-06-24 12:44:44',0x00),(2169,20,'Database','20','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:05','1','2025-06-24 12:44:44',0x00),(2170,21,'Redis Stream','21','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:18','1','2025-06-24 12:44:43',0x00),(2171,30,'RocketMQ','30','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:30','1','2025-06-24 12:44:42',0x00),(2172,31,'RabbitMQ','31','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:47','1','2025-06-24 12:44:41',0x00),(2173,32,'Kafka','32','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:59','1','2025-06-24 12:44:39',0x00),(2174,1,'设备上下线变更','1','iot_rule_scene_trigger_type_enum',0,'primary','','','1','2025-03-20 15:00:01','\"1\"','2025-07-06 10:28:16',0x00),(2175,2,'物模型属性上报','2','iot_rule_scene_trigger_type_enum',0,'primary','','','1','2025-03-20 15:00:09','\"1\"','2025-07-06 10:28:22',0x00),(2176,1,'设备状态','state','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:24:58','1','2025-03-20 15:24:58',0x00),(2177,2,'设备属性','property','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:09','1','2025-03-20 15:25:09',0x00),(2178,3,'设备事件','event','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:23','1','2025-03-20 15:25:23',0x00),(2179,4,'设备服务','service','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:39','1','2025-03-20 15:25:39',0x00),(2180,5,'设备配置','config','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:51','1','2025-03-20 15:25:57',0x00),(2181,6,'设备 OTA','ota','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:26:17','1','2025-03-20 15:26:17',0x00),(2182,7,'设备注册','register','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:26:35','1','2025-03-20 15:26:35',0x00),(2183,8,'设备拓扑','topology','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:26:46','1','2025-03-20 15:26:46',0x00),(2184,1,'设备属性设置','1','iot_rule_scene_action_type_enum',0,'primary','','','1','2025-03-28 15:27:12','\"1\"','2025-07-06 10:37:33',0x00),(2185,2,'设备服务调用','2','iot_rule_scene_action_type_enum',0,'primary','','','1','2025-03-28 15:27:25','\"1\"','2025-07-06 10:37:41',0x00),(2186,100,'告警触发','100','iot_rule_scene_action_type_enum',0,'primary','','','1','2025-03-28 15:27:35','\"1\"','2025-07-06 10:37:50',0x00),(3000,16,'百川智能','BaiChuan','ai_platform',0,'','','','1','2025-03-23 12:15:46','1','2025-03-23 12:15:46',0x00),(3001,40,'Vben5.0 Ant Design Schema æ¨¡ç‰ˆ','40','infra_codegen_front_type',0,'','',NULL,'1','2025-04-23 21:47:47','1','2025-09-04 23:25:12',0x00),(3002,6,'支付宝余额','6','brokerage_withdraw_type',0,'','','API æ‰“款','1','2025-05-10 08:24:49','1','2025-05-10 08:24:49',0x00),(3004,3,'WARN','3','iot_alert_level',0,'warning','','','1','2025-06-27 20:32:22','1','2025-06-27 20:34:31',0x00),(3005,1,'INFO','1','iot_alert_level',0,'primary','','','1','2025-06-27 20:33:28','1','2025-06-27 20:34:35',0x00),(3006,5,'ERROR','5','iot_alert_level',0,'danger','','','1','2025-06-27 20:33:50','1','2025-06-27 20:33:50',0x00),(3007,1,'短信','1','iot_alert_receive_type',0,'','','','1','2025-06-27 22:49:30','1','2025-06-27 22:49:30',0x00),(3008,2,'邮箱','2','iot_alert_receive_type',0,'','','','1','2025-06-27 22:49:39','1','2025-06-27 22:50:07',0x00),(3009,3,'站内信','3','iot_alert_receive_type',0,'','','','1','2025-06-27 22:50:20','1','2025-06-27 22:50:20',0x00),(3010,1,'全部设备','1','iot_ota_task_device_scope',0,'','','','1','2025-07-02 09:43:09','1','2025-07-02 09:43:09',0x00),(3011,2,'指定设备','2','iot_ota_task_device_scope',0,'','','','1','2025-07-02 09:43:15','1','2025-07-02 09:43:15',0x00),(3012,10,'进行中','10','iot_ota_task_status',0,'primary','','','1','2025-07-02 09:44:01','\"1\"','2025-07-02 09:44:21',0x00),(3013,20,'已结束','20','iot_ota_task_status',0,'success','','','1','2025-07-02 09:44:14','\"1\"','2025-07-02 23:56:12',0x00),(3014,30,'已取消','30','iot_ota_task_status',0,'danger','','','1','2025-07-02 09:44:36','1','2025-07-02 09:44:36',0x00),(3015,0,'待推送','0','iot_ota_task_record_status',0,'','','','1','2025-07-02 09:45:16','1','2025-07-02 09:45:16',0x00),(3016,10,'已推送','10','iot_ota_task_record_status',0,'','','','1','2025-07-02 09:45:25','1','2025-07-02 09:45:25',0x00),(3017,20,'升级中','20','iot_ota_task_record_status',0,'primary','','','1','2025-07-02 09:45:37','1','2025-07-02 09:45:37',0x00),(3018,30,'升级成功','30','iot_ota_task_record_status',0,'success','','','1','2025-07-02 09:45:47','1','2025-07-02 09:45:47',0x00),(3019,40,'升级失败','40','iot_ota_task_record_status',0,'danger','','','1','2025-07-02 09:46:02','1','2025-07-02 09:46:02',0x00),(3020,50,'升级取消','50','iot_ota_task_record_status',0,'warning','','','1','2025-07-02 09:46:09','\"1\"','2025-07-02 09:46:27',0x00),(3024,3,'设备事件上报','3','iot_rule_scene_trigger_type_enum',0,'','','','1','2025-07-06 10:28:29','1','2025-07-06 10:28:29',0x00),(3025,4,'设备服务调用','4','iot_rule_scene_trigger_type_enum',0,'','','','1','2025-07-06 10:28:35','1','2025-07-06 10:28:35',0x00),(3026,100,'定时触发','100','iot_rule_scene_trigger_type_enum',0,'','','','1','2025-07-06 10:28:48','1','2025-07-06 10:28:48',0x00),(3027,101,'告警恢复','101','iot_rule_scene_action_type_enum',0,'','','','1','2025-07-06 10:37:57','1','2025-07-06 10:37:57',0x00),(3028,2,'Anthropic','Anthropic','ai_platform',0,'','','','1','2025-08-21 22:54:24','1','2025-08-21 22:57:58',0x00),(3029,2,'谷歌 Gemini','Gemini','ai_platform',0,'','','','1','2025-08-22 22:39:35','1','2025-08-22 22:44:49',0x00),(3030,1,'文件系统','filesystem','ai_mcp_client_name',0,'','','','1','2025-08-28 13:58:43','1','2025-08-28 21:19:42',0x00),(3031,41,'Vben5.0 Ant Design æ ‡å‡†æ¨¡ç‰ˆ','41','infra_codegen_front_type',0,'','','','1','2025-09-04 23:26:07','1','2025-09-04 23:26:07',0x00),(3032,50,'Vben5.0 Element Plus Schema æ¨¡ç‰ˆ','50','infra_codegen_front_type',0,'','','','1','2025-09-04 23:26:38','1','2025-09-04 23:26:38',0x00),(3033,51,'Vben5.0 Element Plus æ ‡å‡†æ¨¡ç‰ˆ','51','infra_codegen_front_type',0,'','','','1','2025-09-04 23:26:49','1','2025-09-04 23:26:49',0x00),(3034,1,'ttt','tt','iot_ota_task_record_status',0,'success','',NULL,'1','2025-09-06 00:02:21','1','2025-09-06 00:02:31',0x00),(3035,40,'支付宝小程序','40','system_social_type',0,'','','','1','2023-11-04 13:05:38','1','2023-11-04 13:07:16',0x00),(3036,60,'Admin Uniapp ç§»åŠ¨ç«¯','60','infra_codegen_front_type',0,'','',NULL,'1','2025-12-16 19:25:51','1','2025-12-17 09:46:15',0x00),(3037,42,'Vben5.0 Antdv Next Schema æ¨¡ç‰ˆ','42','infra_codegen_front_type',0,'','','','1','2026-05-23 13:52:25','1','2026-05-23 13:52:25',0x00),(3038,43,'Vben5.0 Antdv Next æ ‡å‡†æ¨¡ç‰ˆ','43','infra_codegen_front_type',0,'','','','1','2026-05-23 13:52:25','1','2026-05-23 13:52:25',0x00),(3040,1,'UDP','udp','iot_protocol_type',0,'','','UDP åè®®','1','2026-02-04 00:32:47','1','2026-02-04 00:32:47',0x00),(3041,2,'WebSocket','websocket','iot_protocol_type',0,'','','WebSocket åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3042,3,'HTTP','http','iot_protocol_type',0,'','','HTTP åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3043,4,'MQTT','mqtt','iot_protocol_type',0,'success','','MQTT åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3044,5,'EMQX','emqx','iot_protocol_type',0,'success','','EMQX åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3045,6,'CoAP','coap','iot_protocol_type',0,'','','CoAP åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3046,7,'Modbus TCP Server','modbus_tcp_server','iot_protocol_type',0,'','','Modbus TCP Server åè®®','1','2026-02-04 00:32:55','1','2026-02-12 15:16:45',0x00),(3047,0,'JSON','json','iot_serialize_type',0,'success','','JSON æ ¼å¼','1','2026-02-04 00:33:19','1','2026-02-04 00:33:19',0x00),(3048,1,'二进制','binary','iot_serialize_type',0,'warning','','二进制格式','1','2026-02-04 00:33:19','1','2026-02-04 00:33:19',0x00),(3049,8,'Modbus TCP Client','modbus_tcp_client','iot_protocol_type',0,'','','Modbus TCP Client åè®®','1','2026-02-08 18:29:46','1','2026-02-12 15:16:32',0x00),(3050,2,'边缘采集','2','iot_modbus_mode',0,'success','','设备主动上报数据,无需轮询','1','2025-06-12 22:56:06','1','2026-02-09 13:03:23',0x00),(3051,1,'Modbus TCP','1','iot_modbus_frame_format',0,'default','','MBAP å¤´éƒ¨æ ¼å¼','1','2025-06-12 22:56:06','1','2025-06-12 22:56:06',0x00),(3052,2,'Modbus RTU','2','iot_modbus_frame_format',0,'warning','','CRC16 æ ¡éªŒæ ¼å¼','1','2025-06-12 22:56:06','1','2025-06-12 22:56:06',0x00),(3053,1,'云端轮询','1','iot_modbus_mode',0,'primary','','网关主动轮询读取设备寄存器','1','2025-06-12 22:56:06','1','2025-06-12 22:56:06',0x00),(3054,1,'企业客户','1','mes_client_type',0,'primary','','','1','2026-02-15 14:38:25','1','2026-02-15 14:38:25',0x00),(3055,2,'个人','2','mes_client_type',0,'success','','','1','2026-02-15 14:38:25','1','2026-02-15 14:38:25',0x00),(3056,1,'优质供应商','A','mes_vendor_level',0,'success','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3057,2,'正常','B','mes_vendor_level',0,'primary','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3058,3,'重点关注','C','mes_vendor_level',0,'warning','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3059,4,'劣质供应商','D','mes_vendor_level',0,'danger','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3060,5,'黑名单','E','mes_vendor_level',0,'info','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3061,1,'假期','2','mes_cal_holiday_type',0,'success','','','1','2026-02-16 07:35:58','1','2026-02-16 11:20:42',0x00),(3062,2,'工作日','1','mes_cal_holiday_type',0,'primary','','','1','2026-02-16 07:35:58','1','2026-02-16 11:20:40',0x00),(3063,1,'在库','1','mes_tm_tool_status',0,'success','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3064,2,'领用中','2','mes_tm_tool_status',0,'primary','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3065,3,'维修中','3','mes_tm_tool_status',0,'warning','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3066,4,'报废','4','mes_tm_tool_status',0,'danger','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3067,1,'定期维护','1','mes_tm_mainten_type',0,'primary','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3068,2,'按使用次数维护','2','mes_tm_mainten_type',0,'success','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3069,1,'停机','1','mes_dv_machinery_status',0,'success','','','1','2026-02-17 01:00:06','1','2026-02-17 03:28:27',0x00),(3070,2,'生产中','2','mes_dv_machinery_status',0,'info','','','1','2026-02-17 01:00:06','1','2026-02-17 03:28:33',0x00),(3071,3,'维护中','3','mes_dv_machinery_status',0,'danger','','','1','2026-02-17 01:00:06','1','2026-02-17 03:28:41',0x00),(3072,1,'尺寸','1','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3073,2,'外观','2','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3074,3,'重量','3','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3075,4,'性能','4','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3076,5,'成分','5','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3077,1,'致命缺陷','1','mes_defect_level',0,'danger','','','1','2026-02-17 02:18:18','1','2026-02-21 12:21:12',0x00),(3078,2,'严重缺陷','2','mes_defect_level',0,'warning','','','1','2026-02-17 02:18:18','1','2026-02-21 12:21:15',0x00),(3079,3,'轻微缺陷','3','mes_defect_level',0,'info','','','1','2026-02-17 02:18:18','1','2026-02-21 12:21:19',0x00),(3080,1,'单白班','1','mes_cal_shift_type',0,'primary','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3081,2,'两班倒','2','mes_cal_shift_type',0,'success','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3082,3,'三班倒','3','mes_cal_shift_type',0,'warning','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3083,1,'按季度','1','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3084,2,'按月','2','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3085,3,'按周','3','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3086,4,'按天','4','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3089,0,'草稿','0','mes_cal_plan_status',0,'info','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3090,1,'已确认','1','mes_cal_plan_status',0,'success','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3100,0,'草稿','0','mes_pro_work_order_status',0,'info','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3101,1,'已确认','1','mes_pro_work_order_status',0,'primary','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3102,2,'已完成','2','mes_pro_work_order_status',0,'success','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3103,3,'已取消','3','mes_pro_work_order_status',0,'warning','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3104,1,'客户订单','1','mes_pro_work_order_source_type',0,'primary','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3105,2,'库存备货','2','mes_pro_work_order_source_type',0,'success','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3106,1,'自行生产','1','mes_pro_work_order_type',0,'primary','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3107,2,'代工','2','mes_pro_work_order_type',0,'warning','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3108,3,'采购','3','mes_pro_work_order_type',0,'info','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3121,1,'IQC(来料检验)','1','mes_qc_type',0,'primary','','来料质量检验','1','2026-02-18 14:12:05','1','2026-02-18 14:12:05',0x00),(3122,2,'IPQC(过程检验)','2','mes_qc_type',0,'warning','','生产制程质量检验','1','2026-02-18 14:12:05','1','2026-03-24 15:21:34',0x00),(3123,3,'OQC(出货检验)','3','mes_qc_type',0,'success','','出货质量检验','1','2026-02-18 14:12:05','1','2026-02-18 14:12:05',0x00),(3124,4,'RQC(退货检验)','4','mes_qc_type',0,'danger','','退货质量检验','1','2026-02-18 14:12:05','1','2026-09-18 18:10:21',0x00),(3125,0,'开始-开始(SS)','0','mes_pro_link_type',0,'default','','前序开始后,后序可以开始','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3126,1,'结束-结束(FF)','1','mes_pro_link_type',0,'default','','前序结束后,后序才能结束','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3127,2,'开始-结束(SF)','2','mes_pro_link_type',0,'default','','前序开始后,后序才能结束','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3128,3,'结束-开始(FS)','3','mes_pro_link_type',0,'default','','前序结束后,后序才能开始','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3129,1,'分钟','MINUTE','mes_time_unit_type',0,'default','','','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3130,2,'小时','HOUR','mes_time_unit_type',0,'default','','','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3131,3,'天','DAY','mes_time_unit_type',0,'default','','','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3137,1,'设备点检','1','mes_dv_subject_type',0,'info','','','1','2026-02-20 01:42:58','1','2026-02-20 01:42:58',0x00),(3138,2,'设备保养','2','mes_dv_subject_type',0,'success','','','1','2026-02-20 01:42:58','1','2026-02-20 01:42:58',0x00),(3139,1,'待保养','0','mes_mainten_record_status',0,'info','',NULL,'admin','2026-02-20 02:59:55','1','2026-04-16 05:32:37',0x00),(3140,2,'已完成','4','mes_mainten_record_status',0,'success','',NULL,'admin','2026-02-20 02:59:55','1','2026-04-16 05:32:37',0x00),(3141,1,'正常','1','mes_mainten_status',0,'success','',NULL,'admin','2026-02-20 02:59:55','admin','2026-02-20 02:59:55',0x00),(3142,2,'异常','0','mes_mainten_status',0,'danger','',NULL,'admin','2026-02-20 02:59:55','admin','2026-02-20 02:59:55',0x00),(3143,1,'天','1','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3144,2,'周','2','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3145,3,'月','3','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3146,4,'å¹´','4','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3147,0,'草稿','0','mes_dv_check_plan_status',0,'info','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3148,1,'已启用','1','mes_dv_check_plan_status',0,'success','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3149,1,'待点检','10','mes_dv_check_record_status',0,'info','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3150,2,'已完成','20','mes_dv_check_record_status',0,'success','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3151,1,'正常','1','mes_dv_check_result',0,'success','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3152,2,'异常','2','mes_dv_check_result',0,'danger','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3157,1,'修复成功','1','mes_dv_repair_result',0,'success','','','1','2026-02-20 10:56:24','1','2026-02-20 10:56:24',0x00),(3158,2,'报废','2','mes_dv_repair_result',0,'danger','','','1','2026-02-20 10:56:24','1','2026-02-20 10:56:24',0x00),(3161,1,'校验通过','1','mes_qc_check_result',0,'success','','','1','2026-02-20 11:23:35','1','2026-02-20 16:15:54',0x00),(3162,2,'校验不通过','2','mes_qc_check_result',0,'danger','','','1','2026-02-20 11:23:35','1','2026-02-20 16:15:52',0x00),(3166,0,'未处置','0','mes_pro_andon_status',0,'danger','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3167,1,'已处置','1','mes_pro_andon_status',0,'success','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3168,1,'一级','1','mes_pro_andon_level',0,'danger','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3169,2,'二级','2','mes_pro_andon_level',0,'warning','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3170,3,'三级','3','mes_pro_andon_level',0,'info','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3171,0,'草稿','0','mes_pro_feedback_status',0,'info','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3172,2,'审批中','2','mes_pro_feedback_status',0,'primary','','','1','2026-02-21 00:50:32','1','2026-03-19 00:51:54',0x00),(3173,3,'待检验','3','mes_pro_feedback_status',0,'warning','','','1','2026-02-21 00:50:32','1','2026-03-19 00:51:54',0x00),(3174,4,'已完成','4','mes_pro_feedback_status',0,'success','','','1','2026-02-21 00:50:32','1','2026-03-19 00:51:54',0x00),(3176,1,'自行报工','1','mes_pro_feedback_type',0,'primary','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3177,2,'统一报工','2','mes_pro_feedback_type',0,'success','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3178,1,'PC','PC','mes_pro_feedback_channel',0,'primary','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3179,2,'APP','APP','mes_pro_feedback_channel',0,'success','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3180,3,'PDA','PDA','mes_pro_feedback_channel',0,'info','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3181,1,'浮点','1','mes_qc_result_type',0,'primary','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3182,2,'整数','2','mes_qc_result_type',0,'success','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3183,3,'文本','3','mes_qc_result_type',0,'info','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3184,4,'字典','4','mes_qc_result_type',0,'warning','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3185,5,'文件','5','mes_qc_result_type',0,'danger','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3186,1,'生产退料','1','mes_rqc_type',0,'default','','生产退料检验','1','2026-02-22 06:44:09','1','2026-02-22 06:44:09',0x00),(3187,2,'销售退货','2','mes_rqc_type',0,'default','','销售退货检验','1','2026-02-22 06:44:09','1','2026-02-22 06:44:09',0x00),(3188,1,'自制工序检验','1','mes_ipqc_type',0,'primary','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3189,2,'首检','2','mes_ipqc_type',0,'success','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3190,3,'巡检','3','mes_ipqc_type',0,'warning','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3191,4,'自检','4','mes_ipqc_type',0,'info','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3192,5,'成品检验','5','mes_ipqc_type',0,'danger','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3205,0,'草稿','0','mes_wm_arrival_notice_status',0,'info','','','1','2026-02-22 14:53:18','1','2026-02-22 14:53:18',0x00),(3206,2,'待质检','2','mes_wm_arrival_notice_status',0,'warning','','','1','2026-02-22 14:53:18','1','2026-02-26 05:24:40',0x00),(3207,3,'待入库','3','mes_wm_arrival_notice_status',0,'success','','','1','2026-02-22 14:53:18','1','2026-02-26 05:24:47',0x00),(3208,4,'已完成','4','mes_wm_arrival_notice_status',0,'primary','','','1','2026-02-22 14:53:18','1','2026-02-26 05:24:52',0x00),(3209,0,'草稿','0','mes_wm_item_receipt_status',0,'info','','','1','2026-02-22 14:54:05','1','2026-02-22 14:54:05',0x00),(3210,1,'待上架','2','mes_wm_item_receipt_status',0,'warning','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:35',0x00),(3211,2,'待执行入库','3','mes_wm_item_receipt_status',0,'success','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:31',0x00),(3212,3,'已完成','4','mes_wm_item_receipt_status',0,'primary','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:20',0x00),(3213,4,'已取消','5','mes_wm_item_receipt_status',0,'danger','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:24',0x00),(3214,1,'草稿','0','mes_order_status',0,'info','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3215,2,'已确认','1','mes_order_status',0,'primary','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3216,3,'审批中','2','mes_order_status',0,'warning','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3217,4,'已审批','3','mes_order_status',0,'success','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3218,5,'已完成','4','mes_order_status',0,'success','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3219,6,'已取消','5','mes_order_status',0,'danger','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3220,1,'草稿','0','mes_wm_issue_status',0,'info','','草稿状态,未完成','1','2026-02-26 15:54:25','1','2026-02-26 15:54:25',0x00),(3221,2,'已完成','4','mes_wm_issue_status',0,'success','','已完成出库','1','2026-02-26 15:54:25','1','2026-02-26 15:54:25',0x00),(3222,1,'草稿','0','mes_wm_product_issue_status',0,'info','','草稿状态,可编辑','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3223,2,'待拣货','2','mes_wm_product_issue_status',0,'warning','','审批中,可执行拣货','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3224,3,'待执行领出','3','mes_wm_product_issue_status',0,'primary','','已审批,拣货完成','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3225,4,'已完成','4','mes_wm_product_issue_status',0,'success','','已完成出库','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3226,5,'已取消','5','mes_wm_product_issue_status',0,'success','','已完成出库','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3232,1,'草稿','0','mes_wm_return_issue_status',0,'info','','草稿状态,可编辑','1','2026-02-28 14:11:12','1','2026-02-28 14:28:24',0x00),(3233,2,'待检验','1','mes_wm_return_issue_status',0,'default','','已确认,等待质检','1','2026-02-28 14:11:12','1','2026-02-28 14:28:28',0x00),(3234,3,'待上架','2','mes_wm_return_issue_status',0,'warning','','检验完成,等待仓库上架','1','2026-02-28 14:11:12','1','2026-02-28 14:28:31',0x00),(3235,4,'待执行退料','3','mes_wm_return_issue_status',0,'primary','','上架完成,等待执行退料操作','1','2026-02-28 14:11:12','1','2026-02-28 14:28:34',0x00),(3236,5,'已完成','4','mes_wm_return_issue_status',0,'success','','退料执行完成,库存已更新','1','2026-02-28 14:11:12','1','2026-02-28 14:28:37',0x00),(3237,6,'已取消','5','mes_wm_return_issue_status',0,'danger','','已取消','1','2026-02-28 14:11:12','1','2026-02-28 14:28:40',0x00),(3238,1,'余料退料','1','mes_wm_return_issue_type',0,'success','','余料退回,直接合格','1','2026-02-28 14:11:12','1','2026-02-28 14:27:47',0x00),(3239,2,'不良退料','2','mes_wm_return_issue_type',0,'danger','','不良品退回','1','2026-02-28 14:11:12','1','2026-02-28 14:27:49',0x00),(3240,3,'其他退料','3','mes_wm_return_issue_type',0,'info','','其他原因退料','1','2026-02-28 14:11:12','1','2026-02-28 14:27:55',0x00),(3241,1,'待检','0','mes_wm_quality_status',0,'warning','','待检状态','1','2026-02-28 15:00:53','1','2026-02-28 15:00:53',0x00),(3242,2,'合格','1','mes_wm_quality_status',0,'success','','合格状态','1','2026-02-28 15:00:53','1','2026-02-28 15:00:53',0x00),(3243,3,'不合格','2','mes_wm_quality_status',0,'danger','','不合格状态','1','2026-02-28 15:00:53','1','2026-02-28 15:00:53',0x00),(3244,1,'草稿','0','mes_wm_product_receipt_status',0,'info','','草稿状态','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3245,2,'待上架','2','mes_wm_product_receipt_status',0,'primary','','待上架','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3246,3,'待执行入库','3','mes_wm_product_receipt_status',0,'warning','','待执行入库','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3247,4,'已完成','4','mes_wm_product_receipt_status',0,'success','','已完成','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3248,5,'已取消','5','mes_wm_product_receipt_status',0,'danger','','已取消','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3252,1,'草稿','0','mes_wm_product_sales_status',0,'info','','草稿状态','1','2026-03-02 08:55:11','1','2026-03-02 08:55:11',0x00),(3253,3,'待拣货','2','mes_wm_product_sales_status',0,'warning','','待拣货状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3254,4,'待出库','3','mes_wm_product_sales_status',0,'primary','','待出库状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3255,5,'已完成','4','mes_wm_product_sales_status',0,'success','','已完成状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3256,6,'已取消','5','mes_wm_product_sales_status',0,'danger','','已取消状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3272,1,'草稿','0','mes_wm_misc_receipt_status',0,'info','','草稿状态','1','2026-03-03 07:33:41','1','2026-03-03 07:33:41',0x00),(3273,2,'待执行入库','3','mes_wm_misc_receipt_status',0,'primary','','待执行入库状态','1','2026-03-03 07:33:41','1','2026-03-03 07:37:34',0x00),(3274,3,'已完成','4','mes_wm_misc_receipt_status',0,'success','','已完成状态','1','2026-03-03 07:33:41','1','2026-03-03 07:33:41',0x00),(3275,4,'已取消','5','mes_wm_misc_receipt_status',0,'danger','','已取消状态','1','2026-03-03 07:33:41','1','2026-03-03 07:33:41',0x00),(3277,1,'库存调整','1','mes_wm_misc_receipt_type',0,'primary','','库存调整入库','1','2026-03-03 07:34:33','1','2026-03-03 07:34:33',0x00),(3278,1,'库存调整','1','mes_wm_misc_issue_type',0,'primary','','库存调整出库','1','2026-03-03 07:34:33','1','2026-03-03 07:34:33',0x00),(3279,2,'报废出库','2','mes_wm_misc_issue_type',0,'danger','','报废出库','1','2026-03-03 07:36:13','1','2026-03-03 07:36:13',0x00),(3280,1,'草稿','0','mes_wm_outsource_receipt_status',0,'info','','草稿状态','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3281,2,'待检验','1','mes_wm_outsource_receipt_status',0,'warning','','已确认,等待质检','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3282,3,'待上架','2','mes_wm_outsource_receipt_status',0,'primary','','检验完成,等待仓库上架','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3283,4,'待执行入库','3','mes_wm_outsource_receipt_status',0,'warning','','上架完成,等待执行入库操作','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3284,5,'已完成','4','mes_wm_outsource_receipt_status',0,'success','','入库执行完成,库存已更新','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3285,6,'已取消','5','mes_wm_outsource_receipt_status',0,'danger','','已取消','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3286,1,'草稿','0','mes_wm_outsource_issue_status',0,'info','','草稿状态,可编辑、删除、执行出库','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3287,2,'待拣货','2','mes_wm_outsource_issue_status',0,'warning','','待拣货状态','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3288,3,'待执行出库','3','mes_wm_outsource_issue_status',0,'primary','','待执行出库状态','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3289,4,'已完成','4','mes_wm_outsource_issue_status',0,'success','','已完成,库存已扣减','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3290,5,'已取消','5','mes_wm_outsource_issue_status',0,'danger','','已取消状态','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3301,1,'输入字符','1','mes_md_auto_code_part_type',0,'default','','输入字符','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3302,2,'当前日期','2','mes_md_auto_code_part_type',0,'primary','','当前日期时间','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3303,3,'固定字符','3','mes_md_auto_code_part_type',0,'success','','固定字符','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3304,4,'流水号','4','mes_md_auto_code_part_type',0,'warning','','流水号','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3305,1,'左补齐','1','mes_md_auto_code_padded_method',0,'primary','','左补齐','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3306,2,'右补齐','2','mes_md_auto_code_padded_method',0,'success','','右补齐','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3307,1,'按年','1','mes_md_auto_code_cycle_method',0,'default','','按年循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3308,2,'按月','2','mes_md_auto_code_cycle_method',0,'primary','','按月循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3309,3,'按天','3','mes_md_auto_code_cycle_method',0,'success','','按天循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3310,4,'按小时','4','mes_md_auto_code_cycle_method',0,'warning','','按小时循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3311,5,'按分钟','5','mes_md_auto_code_cycle_method',0,'danger','','按分钟循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3312,10,'按传入字符','10','mes_md_auto_code_cycle_method',0,'info','','按传入字符循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3313,1,'二维码','1','mes_wm_barcode_format',0,'primary','','QR_CODE','1','2026-03-05 14:37:20','1','2026-03-06 13:18:21',0x00),(3314,2,'EAN13 å•†å“æ¡ç ','2','mes_wm_barcode_format',0,'success','','EAN13','1','2026-03-05 14:37:20','1','2026-03-06 13:18:23',0x00),(3315,3,'CODE39 å·¥ä¸šæ¡ç ','3','mes_wm_barcode_format',0,'info','','CODE39','1','2026-03-05 14:37:20','1','2026-03-06 13:18:25',0x00),(3316,4,'UPC-A ç¾Žå›½å•†å“ç ','4','mes_wm_barcode_format',0,'warning','','UPC_A','1','2026-03-05 14:37:20','1','2026-03-06 13:18:28',0x00),(3318,3,'库位','104','mes_wm_barcode_biz_type',0,'default','','AREA','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3319,4,'装箱单','105','mes_wm_barcode_biz_type',0,'default','','PACKAGE','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3320,5,'库存','106','mes_wm_barcode_biz_type',0,'default','','STOCK','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3321,6,'批次','107','mes_wm_barcode_biz_type',0,'default','','BATCH','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3322,7,'流转卡','300','mes_wm_barcode_biz_type',0,'primary','','PROCARD','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3323,8,'工单','301','mes_wm_barcode_biz_type',0,'primary','','WORKORDER','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3324,9,'流转单','302','mes_wm_barcode_biz_type',0,'primary','','TRANSORDER','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3325,10,'设备','400','mes_wm_barcode_biz_type',0,'success','','MACHINERY','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3327,12,'产品物料','600','mes_wm_barcode_biz_type',0,'info','','ITEM','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3328,13,'供应商','601','mes_wm_barcode_biz_type',0,'info','','VENDOR','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3329,14,'工作站','602','mes_wm_barcode_biz_type',0,'info','','WORKSTATION','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3330,15,'车间','603','mes_wm_barcode_biz_type',0,'info','','WORKSHOP','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3331,16,'人员','604','mes_wm_barcode_biz_type',0,'info','','USER','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3351,1,'仓库','102','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:25:19',0x00),(3352,2,'库区','103','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:25:19',0x00),(3353,11,'工具','500','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:22:27',0x00),(3354,17,'客户','605','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:25:19',0x00),(3355,1,'草稿','0','mes_wm_package_status',0,'info','','草稿状态,可编辑','1','2026-03-08 02:05:46','1','2026-03-08 02:05:46',0x00),(3356,2,'已完成','4','mes_wm_package_status',0,'success','','装箱已完成','1','2026-03-08 02:05:46','1','2026-03-08 02:05:46',0x00),(3357,1,'草稿','0','mes_wm_transfer_status',0,'info','','草稿状态,可编辑','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3358,2,'待确认','1','mes_wm_transfer_status',0,'warning','','外部调拨待确认到货','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3359,3,'待上架','2','mes_wm_transfer_status',0,'primary','','待维护目标库位明细','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3360,4,'待执行','3','mes_wm_transfer_status',0,'success','','目标库位已分配,待执行调拨','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3361,5,'已完成','4','mes_wm_transfer_status',0,'success','','调拨已完成','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3362,6,'已取消','5','mes_wm_transfer_status',0,'danger','','调拨已取消','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3363,1,'内部调拨','1','mes_wm_transfer_type',0,'success','','内部仓储调拨','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3364,2,'外部调拨','2','mes_wm_transfer_type',0,'warning','','外部配送/外部收货调拨','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3365,1,'静态盘点','1','mes_wm_stock_taking_type',0,'primary','','静态盘点','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3366,2,'动态盘点','2','mes_wm_stock_taking_type',0,'success','','动态盘点','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3367,1,'仓库','102','mes_wm_stock_taking_plan_param_type',0,'primary','','按仓库盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3368,2,'库区','103','mes_wm_stock_taking_plan_param_type',0,'success','','按库区盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3369,3,'库位','104','mes_wm_stock_taking_plan_param_type',0,'info','','按库位盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3370,4,'物料','600','mes_wm_stock_taking_plan_param_type',0,'warning','','按物料盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3371,5,'批次','107','mes_wm_stock_taking_plan_param_type',0,'danger','','按批次盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3372,1,'草稿','0','mes_wm_stock_taking_task_status',0,'info','','草稿','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3373,2,'审批中','2','mes_wm_stock_taking_task_status',0,'primary','','盘点任务审批中','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3374,3,'已完成','4','mes_wm_stock_taking_task_status',0,'success','','已完成','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3375,4,'已取消','5','mes_wm_stock_taking_task_status',0,'danger','','已取消','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3377,1,'正常','1','mes_wm_stock_taking_task_line_status',0,'success','','正常','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3378,2,'盘盈','2','mes_wm_stock_taking_task_line_status',0,'primary','','盘盈','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3379,3,'盘亏','3','mes_wm_stock_taking_task_line_status',0,'danger','','盘亏','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3380,6,'质量状态','900','mes_wm_stock_taking_plan_param_type',0,'default','','按质量状态盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3381,1,'物料','ITEM','mes_md_item_or_product',0,'info','','','1','2026-03-15 01:55:06','1','2026-03-15 01:55:06',0x00),(3382,2,'产品','PRODUCT','mes_md_item_or_product',0,'success','','','1','2026-03-15 01:55:06','1','2026-03-15 01:55:06',0x00),(3383,1,'草稿','0','mes_wm_item_consume_status',0,'info','','草稿状态','1','2026-03-19 15:06:23','1','2026-03-19 15:06:23',0x00),(3384,2,'已完成','4','mes_wm_item_consume_status',0,'success','','已完成','1','2026-03-19 15:06:23','1','2026-03-19 15:06:23',0x00),(3385,1,'到货通知单','100','mes_qc_source_doc_type',0,'primary','','IQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3386,2,'外协入库单','121','mes_qc_source_doc_type',0,'warning','','IQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3387,3,'生产报工','304','mes_qc_source_doc_type',0,'success','','IPQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3388,4,'销售出库单','118','mes_qc_source_doc_type',0,'info','','OQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3389,5,'生产退料单','116','mes_qc_source_doc_type',0,'danger','','RQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3390,6,'销售退货单','119','mes_qc_source_doc_type',0,'default','','RQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3397,2,'待检测','1','mes_wm_product_sales_status',0,'warning','','OQC æ£€éªŒä¸­','1','2026-03-27 11:44:48','1','2026-03-27 11:44:48',0x00),(3398,0,'草稿','0','mes_wm_return_vendor_status',0,'info','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3399,1,'待拣货','2','mes_wm_return_vendor_status',0,'primary','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3400,2,'待执行退货','3','mes_wm_return_vendor_status',0,'warning','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3401,3,'已完成','4','mes_wm_return_vendor_status',0,'success','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3402,4,'已取消','5','mes_wm_return_vendor_status',0,'danger','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3403,1,'草稿','0','mes_wm_sales_notice_status',0,'info','','草稿状态,可以修改和删除','1','2026-03-30 08:54:30','1','2026-04-05 15:53:46',0x00),(3404,2,'待出库','3','mes_wm_sales_notice_status',0,'success','','已提交状态,不可修改和删除','1','2026-03-30 08:54:30','1','2026-04-05 15:53:46',0x00),(3405,3,'已完成','4','mes_wm_sales_notice_status',0,'','',NULL,'1','2026-03-30 10:02:10','1','2026-04-05 15:53:46',0x00),(3406,1,'草稿','0','mes_wm_misc_issue_status',0,'info','','草稿状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3407,2,'待出库','3','mes_wm_misc_issue_status',0,'warning','','待出库状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3408,3,'已完成','4','mes_wm_misc_issue_status',0,'success','','执行出库后的状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3409,4,'已取消','5','mes_wm_misc_issue_status',0,'danger','','已取消状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3415,1,'注塑','1','mes_cal_calendar_type',0,'primary','','','1','2026-04-01 15:23:14','1','2026-04-01 16:08:31',0x00),(3416,2,'投料工','2','mes_cal_calendar_type',0,'success','','','1','2026-04-01 15:23:14','1','2026-08-25 16:35:23',0x00),(3417,3,'组装','3','mes_cal_calendar_type',0,'warning','','','1','2026-04-01 15:23:14','1','2026-04-01 16:08:33',0x00),(3418,4,'仓库','4','mes_cal_calendar_type',0,'danger','','','1','2026-04-01 15:23:14','1','2026-04-01 16:08:34',0x00),(3419,0,'草稿','0','mes_dv_repair_status',0,'info','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3420,1,'维修中','1','mes_dv_repair_status',0,'primary','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3421,2,'待验收','2','mes_dv_repair_status',0,'warning','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3422,3,'已确认','4','mes_dv_repair_status',0,'success','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3423,0,'草稿','0','mes_wm_return_sales_status',0,'info','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3424,1,'待检验','1','mes_wm_return_sales_status',0,'warning','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3425,2,'待执行','2','mes_wm_return_sales_status',0,'warning','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3426,3,'待上架','3','mes_wm_return_sales_status',0,'primary','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3427,4,'已完成','4','mes_wm_return_sales_status',0,'success','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3428,5,'已取消','5','mes_wm_return_sales_status',0,'danger','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3436,1,'上工','1','mes_pro_work_record_type',0,'success','','','1','2026-04-05 14:07:27','1','2026-04-05 14:07:27',0x00),(3437,2,'下工','2','mes_pro_work_record_type',0,'danger','','','1','2026-04-05 14:07:27','1','2026-04-05 14:07:27',0x00),(3443,1,'草稿','0','mes_wm_product_produce_status',0,'info','','草稿状态','1','2026-04-05 15:53:46','1','2026-04-05 15:53:46',0x00),(3444,2,'已完成','4','mes_wm_product_produce_status',0,'success','','已完成状态','1','2026-04-05 15:53:46','1','2026-04-05 15:53:46',0x00),(3445,3,'已取消','5','mes_wm_product_produce_status',0,'danger','','已取消状态','1','2026-04-05 15:53:46','1','2026-04-05 15:53:46',0x00),(3446,0,'草稿','0','mes_pro_task_status',0,'default','','PREPARE','1','2026-04-16 09:47:00','1','2026-06-13 10:32:58',0x00),(3447,4,'已完成','4','mes_pro_task_status',0,'success','','FINISHED','1','2026-04-16 09:47:00','1','2026-07-22 08:00:26',0x00),(3448,2,'已取消','5','mes_pro_task_status',0,'danger','','CANCELED','1','2026-04-16 09:47:00','1','2026-06-13 10:32:58',0x00),(3525,1,'正常','0','im_message_status',0,'success','','正常(初始状态)','admin','2026-04-30 15:14:36','admin','2026-06-16 03:41:55',0x00),(3526,2,'已撤回','2','im_message_status',0,'danger','','已撤回','admin','2026-04-30 15:14:36','admin','2026-06-16 03:41:55',0x00),(3530,1,'不需要回执','0','im_message_receipt_status',0,'info','','NO_RECEIPT','admin','2026-04-30 11:35:07','admin','2026-06-14 00:32:47',0x00),(3531,2,'待完成','1','im_message_receipt_status',0,'warning','','PENDING','admin','2026-04-30 11:35:07','admin','2026-06-14 00:32:47',0x00),(3532,3,'已完成','2','im_message_receipt_status',0,'success','','DONE','admin','2026-04-30 11:35:07','admin','2026-06-14 00:32:47',0x00),(3540,1,'正常','0','im_friend_status',0,'success','','正常好友关系','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3541,2,'已删除','1','im_friend_status',0,'danger','','已删除好友关系','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3550,1,'正常','0','im_group_status',0,'success','','群正常','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3551,2,'已解散','1','im_group_status',0,'info','','群已解散','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3552,1,'群主','1','im_group_member_role',0,'primary','',NULL,'1','2026-05-02 02:14:12','1','2026-05-02 02:14:12',0x00),(3553,2,'管理员','2','im_group_member_role',0,'warning','',NULL,'1','2026-05-02 02:14:12','1','2026-05-02 02:14:12',0x00),(3554,3,'普通成员','3','im_group_member_role',0,'info','',NULL,'1','2026-05-02 02:14:12','1','2026-05-02 02:14:12',0x00),(3555,1,'搜索','1','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:57',0x00),(3556,2,'群聊','2','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:53',0x00),(3557,3,'扫码','3','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:50',0x00),(3558,4,'名片','4','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:48',0x00),(3559,1,'等待验证','0','im_friend_request_handle_result',0,'warning','',NULL,'1','2026-05-04 02:43:41','1','2026-05-04 02:43:41',0x00),(3560,2,'已添加','1','im_friend_request_handle_result',0,'success','',NULL,'1','2026-05-04 02:43:41','1','2026-05-04 02:43:41',0x00),(3561,3,'已拒绝','2','im_friend_request_handle_result',0,'info','',NULL,'1','2026-05-04 02:43:41','1','2026-05-04 02:43:41',0x00),(3562,101,'文本','101','im_content_type',0,'','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3563,102,'图片','102','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3564,103,'语音','103','im_content_type',0,'warning','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3565,104,'视频','104','im_content_type',0,'warning','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3566,105,'文件','105','im_content_type',0,'info','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3568,2101,'撤回','2101','im_content_type',0,'danger','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3569,2200,'回执','2200','im_content_type',0,'warning','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3570,2201,'已读','2201','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3571,1501,'群创建','1501','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3572,1502,'群信息变更','1502','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3573,1503,'收到新的入群申请','1503','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:47:00',0x00),(3574,1504,'成员退群','1504','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3575,1505,'入群申请被同意','1505','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:47:00',0x00),(3576,1506,'入群申请被拒绝','1506','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:47:00',0x00),(3577,1507,'群主转让','1507','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3578,1508,'成员被移出','1508','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3579,1509,'成员加入','1509','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3580,1510,'自由进群','1510','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3581,1511,'群解散','1511','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3582,1512,'成员禁言','1512','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3583,1513,'成员取消禁言','1513','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3584,1514,'全群禁言','1514','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3585,1515,'全群取消禁言','1515','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3586,1516,'成员昵称变更','1516','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3587,1517,'添加管理员','1517','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3588,1518,'撤销管理员','1518','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3589,1519,'群公告变更','1519','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3590,1520,'群名变更','1520','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3591,1531,'群消息置顶','1531','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3592,1532,'群消息取消置顶','1532','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3593,1533,'群封禁变更','1533','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3594,1204,'新增好友','1204','im_content_type',0,'success','',NULL,'admin','2026-05-05 13:26:53','admin','2026-06-16 03:41:55',0x00),(3595,1205,'好友被删除','1205','im_content_type',0,'warning','',NULL,'admin','2026-05-05 13:26:53','admin','2026-06-16 03:41:55',0x00),(3596,1,'搜索','1','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3597,2,'邀请','2','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3598,3,'扫码','3','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3599,4,'分享链接','4','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3600,1,'未处理','0','im_group_request_handle_result',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3601,2,'同意','1','im_group_request_handle_result',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3602,3,'拒绝','2','im_group_request_handle_result',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(1061051,1,'客户','1','merchant_type',0,'primary','','客户','1','2026-05-10 15:26:09','1','2026-05-10 15:26:09',0x00),(1061052,2,'供应商','2','merchant_type',0,'success','','供应商','1','2026-05-10 15:26:09','1','2026-05-10 15:26:09',0x00),(1061053,3,'客户/供应商','3','merchant_type',0,'warning','','客户/供应商','1','2026-05-10 15:26:09','1','2026-05-10 15:26:09',0x00),(1061061,1,'入库单','1','wms_order_type',0,'success','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061062,2,'出库单','2','wms_order_type',0,'danger','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061063,3,'移库单','3','wms_order_type',0,'primary','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061064,4,'盘库单','4','wms_order_type',0,'warning','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061071,1,'草稿','0','wms_order_status',0,'info','','草稿','1','2026-05-12 13:40:29','1','2026-05-12 13:40:29',0x00),(1061072,2,'已完成','4','wms_order_status',0,'success','','已完成','1','2026-05-12 13:40:29','1','2026-05-12 13:40:29',0x00),(1061073,3,'已作废','5','wms_order_status',0,'danger','','已作废','1','2026-05-12 13:40:29','1','2026-05-12 13:40:29',0x00),(1061081,1,'生产入库','100','wms_receipt_order_type',0,'success','','','1','2026-05-11 11:21:49','1','2026-05-14 02:21:20',0x00),(1061082,2,'采购入库','101','wms_receipt_order_type',0,'primary','','','1','2026-05-11 11:21:49','1','2026-05-14 02:21:20',0x00),(1061083,3,'退货入库','102','wms_receipt_order_type',0,'warning','','','1','2026-05-11 11:21:49','1','2026-05-14 02:21:20',0x00),(1061084,4,'归还入库','103','wms_receipt_order_type',0,'info','','','1','2026-05-13 16:02:33','1','2026-05-14 02:21:20',0x00),(1061091,1,'退货出库','200','wms_shipment_order_type',0,'warning','','退货出库','1','2026-05-12 17:48:35','1','2026-05-12 17:48:35',0x00),(1061092,2,'销售出库','201','wms_shipment_order_type',0,'primary','','销售出库','1','2026-05-12 17:48:35','1','2026-05-12 17:48:35',0x00),(1061093,3,'生产出库','202','wms_shipment_order_type',0,'success','','生产出库','1','2026-05-12 17:48:35','1','2026-05-12 17:48:35',0x00),(1061096,1,'语音','1','im_rtc_call_media_type',0,'','','语音通话','admin','2026-05-16 11:34:50','admin','2026-05-16 11:34:50',0x00),(1061097,2,'视频','2','im_rtc_call_media_type',0,'','','视频通话','admin','2026-05-16 11:34:50','admin','2026-05-16 11:34:50',0x00),(1061098,1,'私聊','1','im_rtc_call_conversation_type',0,'primary','','一对一私聊通话','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061099,2,'群聊','2','im_rtc_call_conversation_type',0,'success','','群内多人通话','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061100,1,'创建','10','im_rtc_call_status',0,'info','','通话已创建,等待接通','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061101,2,'进行中','20','im_rtc_call_status',0,'primary','','已有人接通,通话中','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061102,3,'已结束','30','im_rtc_call_status',0,'success','','通话结束','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061103,1,'通话结束','1','im_rtc_call_end_reason',0,'success','','接通后任一方主动挂断','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061104,2,'已拒绝','2','im_rtc_call_end_reason',0,'warning','','被叫接通前点拒接','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061105,3,'已取消','3','im_rtc_call_end_reason',0,'info','','主叫接通前主动取消','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061106,4,'无人接听','4','im_rtc_call_end_reason',0,'info','','振铃超时未接通','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061107,5,'对方正忙','5','im_rtc_call_end_reason',0,'warning','','对方在另一通话中','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061108,6,'通话异常','9','im_rtc_call_end_reason',0,'danger','','网络中断、设备失败等','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061109,1,'发起人','1','im_rtc_participant_role',0,'primary','','通话发起者','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061110,2,'被邀请者','2','im_rtc_participant_role',0,'info','','被邀请加入','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061111,3,'主动加入者','3','im_rtc_participant_role',0,'success','','群通话场景,旁观者主动加入','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061112,1,'邀请中','10','im_rtc_participant_status',0,'info','','已发出 invite,等待响应','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061113,2,'已加入','20','im_rtc_participant_status',0,'primary','','已接通并进入房间','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061114,3,'已拒绝','30','im_rtc_participant_status',0,'warning','','接通前点拒接','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061115,4,'未应答','40','im_rtc_participant_status',0,'info','','通话已结束仍未应答','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061116,5,'已离开','50','im_rtc_participant_status',0,'success','','接通后挂断 / ç¦»å¼€','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061117,1610,'通话开始','1610','im_content_type',0,'info','','入消息流;私聊定向通知,群聊全员广播','admin','2026-05-18 03:36:12','admin','2026-06-16 03:41:55',0x00),(1061118,1611,'通话结束','1611','im_content_type',0,'info','','入消息流;私聊准气泡,群聊系统 tip','admin','2026-05-18 03:36:12','admin','2026-06-16 03:41:55',0x00),(1061119,125,'素材','125','im_content_type',0,'success','','频道运营推送的图文卡片消息','1','2026-05-18 13:14:34','admin','2026-06-16 03:41:55',0x00),(1061120,1,'富文本','1','im_channel_material_type',0,'primary','','','1','2026-05-19 14:09:25','1','2026-05-19 14:09:25',0x00),(1061121,2,'外链','2','im_channel_material_type',0,'info','','','1','2026-05-19 14:09:25','1','2026-05-19 14:09:25',0x00),(1061122,7,'SN ç ','109','mes_wm_barcode_biz_type',0,'default','','SN','1','2026-06-13 10:30:30','1','2026-06-13 10:30:30',0x00),(1061123,107,'合并转发','107','im_content_type',0,'','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061124,108,'名片','108','im_content_type',0,'','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061125,115,'表情','115','im_content_type',0,'','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061126,1201,'好友申请被同意','1201','im_content_type',0,'success','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061127,1202,'好友申请被拒绝','1202','im_content_type',0,'warning','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061128,1203,'收到新的好友申请','1203','im_content_type',0,'success','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061129,1207,'加入黑名单','1207','im_content_type',0,'danger','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061130,1208,'移出黑名单','1208','im_content_type',0,'success','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061131,1209,'好友资料变更','1209','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061132,1210,'好友信息批量更新','1210','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061133,1530,'群成员个人设置变更','1530','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061134,1601,'通话信令','1601','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061135,1602,'通话参与者加入','1602','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061136,1603,'通话参与者离开','1603','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061137,10,'销售预留','10','wms_reserve_biz_type',0,'primary','','销售订单预留库存','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061138,20,'生产预留','20','wms_reserve_biz_type',0,'success','','生产工单预留库存','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061139,10,'入库','10','wms_transaction_type',0,'success','','库存入库','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061140,20,'出库','20','wms_transaction_type',0,'warning','','库存出库','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061141,30,'预留','30','wms_transaction_type',0,'primary','','库存预留','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061142,40,'释放','40','wms_transaction_type',0,'info','','预留释放','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061143,50,'盘点','50','wms_transaction_type',0,'default','','库存盘点','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061144,60,'调拨','60','wms_transaction_type',0,'default','','库存调拨','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061145,0,'预留中','0','wms_reserve_status',0,'primary','','库存预留中','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061146,1,'部分使用','1','wms_reserve_status',0,'warning','','部分已使用','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061147,2,'已使用','2','wms_reserve_status',0,'success','','已全部使用','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061148,3,'已释放','3','wms_reserve_status',0,'info','','预留已释放','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061149,0,'草稿','0','erp_audit_status',0,'info','','订单草稿状态','1','2026-06-26 08:46:48','1','2026-06-26 08:46:48',0x00),(1061150,30,'审批不通过','30','erp_audit_status',0,'danger','','审批不通过','1','2026-06-26 08:46:48','1','2026-06-26 08:46:48',0x00),(1061151,1,'审批中','1','mes_pro_work_order_status',0,'warning','','MES生产工单状态-审批中','1','2026-06-26 09:46:00','1','2026-06-26 09:46:00',0x00),(1061152,5,'审批不通过','5','mes_pro_work_order_status',0,'danger','','MES生产工单状态-审批不通过','1','2026-06-26 09:46:00','1','2026-06-26 09:46:00',0x00),(1061153,1,'数值格式','1','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:00:17','1','2026-07-02 14:01:19',0x00),(1061154,2,'文本格式','2','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:00:31','1','2026-07-02 14:01:15',0x00),(1061155,3,'下拉选项','3','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:01:00','1','2026-07-02 14:01:10',0x00),(1061156,4,'时间格式','4','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:01:37','1','2026-07-02 14:01:37',0x00),(1061157,5,'日期格式','5','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:01:48','1','2026-07-02 14:01:48',0x00),(1061158,1,'生产要求','1','mes_pd_template_type',0,'','',NULL,'1','2026-07-02 14:02:31','1','2026-07-02 14:02:31',0x00),(1061159,2,'自检要求','2','mes_pd_template_type',0,'','',NULL,'1','2026-07-02 14:02:42','1','2026-07-02 14:02:42',0x00),(1061160,3,'巡检要求','3','mes_pd_template_type',0,'','',NULL,'1','2026-07-02 14:02:54','1','2026-07-02 14:02:54',0x00),(1061161,0,'待发布','0','mes_pd_project_status',0,'info','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061162,1,'待上传','1','mes_pd_project_status',0,'primary','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061163,2,'待审核','2','mes_pd_project_status',0,'warning','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061164,4,'待归档','3','mes_pd_project_status',0,'success','','','1','2026-07-03 02:17:25','1','2026-08-13 07:48:14',0x00),(1061165,5,'已归档','4','mes_pd_project_status',0,'danger','','','1','2026-07-03 02:17:25','1','2026-08-13 07:48:14',0x00),(1061166,0,'待审核','0','mes_pd_document_audit_status',0,'info','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061167,1,'审核通过','1','mes_pd_document_audit_status',0,'success','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061168,2,'审核不通过','2','mes_pd_document_audit_status',0,'danger','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061169,0,'待归档','0','mes_pd_archive_status',0,'info','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061170,1,'已归档','1','mes_pd_archive_status',0,'success','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061171,1,'男','1','hrm_gender',0,'','',NULL,'1','2026-07-06 11:00:38','1','2026-07-06 11:00:38',0x00),(1061172,2,'女','2','hrm_gender',0,'','',NULL,'1','2026-07-06 11:00:47','1','2026-07-06 11:00:47',0x00),(1061173,1,'在职','1','hrm_employee_status',0,'','',NULL,'1','2026-07-06 11:01:37','1','2026-07-06 11:01:37',0x00),(1061174,2,'试用','2','hrm_employee_status',0,'','',NULL,'1','2026-07-06 11:01:44','1','2026-07-06 11:01:44',0x00),(1061175,3,'离职','3','hrm_employee_status',0,'','',NULL,'1','2026-07-06 11:01:49','1','2026-07-06 11:01:49',0x00),(1061176,1,'高中','1','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:01','1','2026-07-06 11:14:01',0x00),(1061177,2,'大专','2','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:15','1','2026-07-06 11:14:15',0x00),(1061178,3,'本科','3','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:26','1','2026-07-06 11:14:26',0x00),(1061179,4,'硕士','4','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:32','1','2026-07-06 11:14:32',0x00),(1061180,5,'博士','5','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:40','1','2026-07-06 11:14:40',0x00),(1061181,1,'事假','1','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:16:00','1','2026-07-06 11:16:00',0x00),(1061182,2,'病假','2','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:02','1','2026-07-06 11:17:02',0x00),(1061183,3,'年假','3','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:19','1','2026-07-06 11:17:19',0x00),(1061184,4,'婚假','4','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:27','1','2026-07-06 11:17:27',0x00),(1061185,5,'产假','5','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:37','1','2026-07-06 11:17:37',0x00),(1061186,6,'丧假','6','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:44','1','2026-07-06 11:17:44',0x00),(1061187,1,'平调','1','hrm_transfer_type',0,'','',NULL,'1','2026-07-06 11:18:09','1','2026-07-06 11:18:09',0x00),(1061188,2,'升职','2','hrm_transfer_type',0,'','',NULL,'1','2026-07-06 11:18:16','1','2026-07-06 11:18:16',0x00),(1061189,3,'降职','3','hrm_transfer_type',0,'','',NULL,'1','2026-07-06 11:18:22','1','2026-07-06 11:18:22',0x00),(1061190,1,'主动离职','1','hrm_resignation_type',0,'','',NULL,'1','2026-07-06 11:20:26','1','2026-07-06 11:20:26',0x00),(1061191,2,'被动离职','2','hrm_resignation_type',0,'','',NULL,'1','2026-07-06 11:20:35','1','2026-07-06 11:20:35',0x00),(1061192,3,'合同到期','3','hrm_resignation_type',0,'','',NULL,'1','2026-07-06 11:20:44','1','2026-07-06 11:20:44',0x00),(1061193,1,'正常','1','hrm_clock_type',0,'','',NULL,'1','2026-07-06 11:21:04','1','2026-07-06 11:21:04',0x00),(1061194,2,'迟到/早退','2','hrm_clock_type',0,'','',NULL,'1','2026-07-06 11:21:19','1','2026-07-06 11:21:19',0x00),(1061195,3,'缺卡','3','hrm_clock_type',0,'','',NULL,'1','2026-07-06 11:21:26','1','2026-07-06 11:21:26',0x00),(1061196,0,'待确认','0','hrm_salary_status',0,'','',NULL,'1','2026-07-06 11:22:05','1','2026-07-06 11:22:05',0x00),(1061197,1,'已确认','10','hrm_salary_status',0,'','',NULL,'1','2026-07-06 11:22:16','1','2026-07-06 11:22:16',0x00),(1061198,2,'已发放','20','hrm_salary_status',0,'','',NULL,'1','2026-07-06 11:22:25','1','2026-07-06 11:22:25',0x00),(1061199,1,'未开始','0','hrm_handover_status',0,'','',NULL,'1','2026-07-06 11:23:08','1','2026-07-06 11:23:08',0x00),(1061200,2,'进行中','10','hrm_handover_status',0,'','',NULL,'1','2026-07-06 11:23:18','1','2026-07-06 11:23:18',0x00),(1061201,3,'已完成','20','hrm_handover_status',0,'','',NULL,'1','2026-07-06 11:23:28','1','2026-07-06 11:23:28',0x00),(1061202,1,'银行转账','1','hrm_payment_method',0,'','',NULL,'1','2026-07-06 11:23:45','1','2026-07-06 11:23:45',0x00),(1061203,2,'现金','2','hrm_payment_method',0,'','',NULL,'1','2026-07-06 11:23:52','1','2026-07-06 11:23:52',0x00),(1061204,3,'支票','3','hrm_payment_method',0,'','',NULL,'1','2026-07-06 11:23:59','1','2026-07-06 11:23:59',0x00),(1061205,1,'原料','1','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:04:36','1','2026-07-14 12:04:36',0x00),(1061206,2,'半成品','2','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:04:47','1','2026-07-14 12:04:47',0x00),(1061207,3,'成品','3','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:04:54','1','2026-07-14 12:04:54',0x00),(1061208,4,'辅料','4','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:05:02','1','2026-07-14 12:05:02',0x00),(1061209,0,'草稿','0','mes_pro_mps_status',0,'info','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061210,1,'已下发','1','mes_pro_mps_status',0,'success','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061211,2,'已完成','2','mes_pro_mps_status',0,'primary','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061212,3,'已取消','3','mes_pro_mps_status',0,'danger','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061213,1,'拜访','1','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:15','1','2026-07-20 11:00:15',0x00),(1061214,2,'拟签约','2','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:25','1','2026-07-20 11:00:25',0x00),(1061215,3,'签约','3','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:31','1','2026-07-20 11:00:31',0x00),(1061216,4,'失效','4','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:38','1','2026-07-20 11:00:38',0x00),(1061217,1,'生产中','1','mes_pro_task_status',0,'processing','','任务正在生产中','admin','2026-07-22 07:59:56','admin','2026-07-22 07:59:56',0x00),(1061218,2,'部分完成','2','mes_pro_task_status',0,'warning','','任务部分完成','admin','2026-07-22 08:00:15','admin','2026-07-22 08:00:15',0x00),(1061219,1,'待评审','0','mes_ncr_status',0,'','','待评审','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061220,2,'已评审','1','mes_ncr_status',0,'','','已评审','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061221,3,'已处置','2','mes_ncr_status',0,'','','已处置','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061222,4,'已关闭','3','mes_ncr_status',0,'','','已关闭','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061223,1,'退货','1','mes_ncr_disposition',0,'','','退货','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061224,2,'报废','2','mes_ncr_disposition',0,'','','报废','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061225,3,'返工','3','mes_ncr_disposition',0,'','','返工','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061226,4,'让步接收','4','mes_ncr_disposition',0,'','','让步接收','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061227,5,'降级使用','5','mes_ncr_disposition',0,'','','降级使用','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061228,1,'增值税专用发票','1','crm_invoice_type',0,'','',NULL,'1','2026-08-10 14:04:20','1','2026-08-10 14:04:20',0x00),(1061229,2,'增值税普通发票','2','crm_invoice_type',0,'','',NULL,'1','2026-08-10 14:04:25','1','2026-08-10 14:04:25',0x00),(1061230,3,'电子发票','3','crm_invoice_type',0,'','',NULL,'1','2026-08-10 14:04:31','1','2026-08-10 14:04:31',0x00),(1061231,1,'劳动合同','1','hrm_contract_type',0,'primary','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061232,2,'劳务合同','2','hrm_contract_type',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061233,3,'实习协议','3','hrm_contract_type',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061234,4,'劳务派遣','4','hrm_contract_type',0,'info','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061235,5,'其他','5','hrm_contract_type',0,'default','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061236,1,'固定期限','1','hrm_contract_term_type',0,'primary','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061237,2,'无固定期限','2','hrm_contract_term_type',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061238,3,'以完成一定工作任务为期限','3','hrm_contract_term_type',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061239,1,'待生效','1','hrm_contract_status',0,'info','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061240,2,'生效中','2','hrm_contract_status',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061241,3,'即将到期','3','hrm_contract_status',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061242,4,'已到期','4','hrm_contract_status',0,'default','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061243,5,'已解除','5','hrm_contract_status',0,'danger','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061244,6,'已终止','6','hrm_contract_status',0,'danger','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061245,1,'正常','0','hrm_contract_terminate_status',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061246,2,'已解除','1','hrm_contract_terminate_status',0,'danger','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061247,3,'已终止','2','hrm_contract_terminate_status',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1065310,1,'年度','1','crm_sales_target_period_type',0,'primary','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065311,2,'季度','2','crm_sales_target_period_type',0,'success','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065312,3,'月度','3','crm_sales_target_period_type',0,'warning','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065320,1,'个人','1','crm_sales_target_dimension',0,'primary','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065321,2,'部门','2','crm_sales_target_dimension',0,'success','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065322,3,'产品','3','crm_sales_target_dimension',0,'warning','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065330,0,'未生效','0','crm_sales_target_status',0,'info','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065331,1,'已生效','1','crm_sales_target_status',0,'success','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065332,2,'已结束','2','crm_sales_target_status',0,'warning','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065333,3,'已作废','3','crm_sales_target_status',0,'danger','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065334,1,'卡尺','1','mes_dv_metering_category',0,'','','卡尺','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065335,2,'千分尺','2','mes_dv_metering_category',0,'','','千分尺','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065336,3,'压力表','3','mes_dv_metering_category',0,'','','压力表','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065337,4,'温度计','4','mes_dv_metering_category',0,'','','温度计','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065338,5,'万用表','5','mes_dv_metering_category',0,'','','万用表','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065339,6,'天平砝码','6','mes_dv_metering_category',0,'','','天平砝码','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065340,7,'其他','7','mes_dv_metering_category',0,'','','其他','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065341,1,'在用','1','mes_dv_metering_status',0,'success','','在用','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065342,2,'停用','2','mes_dv_metering_status',0,'info','','停用','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065343,3,'报废','3','mes_dv_metering_status',0,'danger','','报废','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065344,1,'合格','1','mes_dv_metering_check_result',0,'success','','合格','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065345,2,'不合格','2','mes_dv_metering_check_result',0,'danger','','不合格','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065346,3,'审批中','5','mes_pd_project_status',0,'processing','','BPM å®¡æ‰¹ä¸­çŠ¶æ€','1','2026-08-13 07:48:27','1','2026-08-13 07:48:27',0x00),(1065410,1,'启用','0','qc_report_template_status',0,'success','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065411,2,'停用','1','qc_report_template_status',0,'info','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065420,1,'草稿','0','qc_report_version_status',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065421,2,'已发布','1','qc_report_version_status',0,'success','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065422,3,'已停用','2','qc_report_version_status',0,'info','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065430,1,'生成中','0','qc_report_instance_status',0,'processing','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065431,2,'生成成功','1','qc_report_instance_status',0,'success','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065432,3,'生成失败','2','qc_report_instance_status',0,'error','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065440,1,'A3','A3','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065441,2,'A4','A4','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065442,3,'A5','A5','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065443,4,'Letter','Letter','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065450,1,'纵向','portrait','qc_report_orientation',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065451,2,'横向','landscape','qc_report_orientation',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065460,1,'通用','general','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065461,2,'电子电器','electronics','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065462,3,'五金机械','hardware','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065463,4,'汽车零部件','auto','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065464,5,'塑胶制品','plastic','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065465,6,'食品饮料','food','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065466,7,'医药医疗','pharma','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065501,1,'休息日','1','hrm_holiday_type',0,'success','',NULL,'1','2026-09-24 17:47:16','1','2026-09-24 17:47:16',0x00),(1065502,2,'工作日','2','hrm_holiday_type',0,'primary','',NULL,'1','2026-09-24 17:47:16','1','2026-09-24 17:47:16',0x00),(1065467,1,'文本','text','ai_model_capability',0,'','','','1','2026-10-23 00:00:00','1','2026-10-23 00:00:00',0x00),(1065468,2,'视觉','vision','ai_model_capability',0,'','','','1','2026-10-23 00:00:00','1','2026-10-23 00:00:00',0x00);
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1,1,'男','1','system_user_sex',0,'primary','A','性别男','admin','2021-01-05 17:03:48','1','2025-12-10 13:19:26',0x00),(2,2,'女','2','system_user_sex',0,'success','','性别女','admin','2021-01-05 17:03:48','1','2023-11-15 23:30:37',0x00),(8,1,'正常','1','infra_job_status',0,'success','','正常状态','admin','2021-01-05 17:03:48','1','2022-02-16 19:33:38',0x00),(9,2,'暂停','2','infra_job_status',0,'danger','','停用状态','admin','2021-01-05 17:03:48','1','2022-02-16 19:33:45',0x00),(12,1,'系统内置','1','infra_config_type',0,'danger','','参数类型 - ç³»ç»Ÿå†…ç½®','admin','2021-01-05 17:03:48','1','2022-02-16 19:06:02',0x00),(13,2,'自定义','2','infra_config_type',0,'primary','','参数类型 - è‡ªå®šä¹‰','admin','2021-01-05 17:03:48','1','2022-02-16 19:06:07',0x00),(14,1,'通知','1','system_notice_type',0,'success','','通知','admin','2021-01-05 17:03:48','1','2022-02-16 13:05:57',0x00),(15,2,'公告','2','system_notice_type',0,'info','','公告','admin','2021-01-05 17:03:48','1','2022-02-16 13:06:01',0x00),(16,0,'其它','0','infra_operate_type',0,'default','','其它操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:19',0x00),(17,1,'查询','1','infra_operate_type',0,'info','','查询操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:20',0x00),(18,2,'新增','2','infra_operate_type',0,'primary','','新增操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:21',0x00),(19,3,'修改','3','infra_operate_type',0,'warning','','修改操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:22',0x00),(20,4,'删除','4','infra_operate_type',0,'danger','','删除操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:23',0x00),(22,5,'导出','5','infra_operate_type',0,'default','','导出操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:24',0x00),(23,6,'导入','6','infra_operate_type',0,'default','','导入操作','admin','2021-01-05 17:03:48','1','2024-03-14 12:44:25',0x00),(27,1,'开启','0','common_status',0,'primary','','开启状态','admin','2021-01-05 17:03:48','1','2022-02-16 08:00:39',0x00),(28,2,'关闭','1','common_status',0,'info','','关闭状态','admin','2021-01-05 17:03:48','1','2022-02-16 08:00:44',0x00),(29,1,'目录','1','system_menu_type',0,'','','目录','admin','2021-01-05 17:03:48','','2022-02-01 16:43:45',0x00),(30,2,'菜单','2','system_menu_type',0,'','','菜单','admin','2021-01-05 17:03:48','','2022-02-01 16:43:41',0x00),(31,3,'按钮','3','system_menu_type',0,'','','按钮','admin','2021-01-05 17:03:48','','2022-02-01 16:43:39',0x00),(32,1,'内置','1','system_role_type',0,'danger','','内置角色','admin','2021-01-05 17:03:48','1','2022-02-16 13:02:08',0x00),(33,2,'自定义','2','system_role_type',0,'primary','','自定义角色','admin','2021-01-05 17:03:48','1','2022-02-16 13:02:12',0x00),(34,1,'全部数据权限','1','system_data_scope',0,'','','全部数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:17',0x00),(35,2,'指定部门数据权限','2','system_data_scope',0,'','','指定部门数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:18',0x00),(36,3,'本部门数据权限','3','system_data_scope',0,'','','本部门数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:16',0x00),(37,4,'本部门及以下数据权限','4','system_data_scope',0,'','','本部门及以下数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:21',0x00),(38,5,'仅本人数据权限','5','system_data_scope',0,'','','仅本人数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:23',0x00),(39,0,'成功','0','system_login_result',0,'success','','登陆结果 - æˆåŠŸ','','2021-01-18 06:17:36','1','2022-02-16 13:23:49',0x00),(40,10,'账号或密码不正确','10','system_login_result',0,'primary','','登陆结果 - è´¦å·æˆ–密码不正确','','2021-01-18 06:17:54','1','2022-02-16 13:24:27',0x00),(41,20,'用户被禁用','20','system_login_result',0,'warning','','登陆结果 - ç”¨æˆ·è¢«ç¦ç”¨','','2021-01-18 06:17:54','1','2022-02-16 13:23:57',0x00),(42,30,'验证码不存在','30','system_login_result',0,'info','','登陆结果 - éªŒè¯ç ä¸å­˜åœ¨','','2021-01-18 06:17:54','1','2022-02-16 13:24:07',0x00),(43,31,'验证码不正确','31','system_login_result',0,'info','','登陆结果 - éªŒè¯ç ä¸æ­£ç¡®','','2021-01-18 06:17:54','1','2022-02-16 13:24:11',0x00),(44,100,'未知异常','100','system_login_result',0,'danger','','登陆结果 - æœªçŸ¥å¼‚常','','2021-01-18 06:17:54','1','2022-02-16 13:24:23',0x00),(45,1,'是','true','infra_boolean_string',0,'danger','','Boolean æ˜¯å¦ç±»åž‹ - æ˜¯','','2021-01-19 03:20:55','1','2022-03-15 23:01:45',0x00),(46,1,'否','false','infra_boolean_string',0,'info','','Boolean æ˜¯å¦ç±»åž‹ - å¦','','2021-01-19 03:20:55','1','2022-03-15 23:09:45',0x00),(50,1,'单表(增删改查)','1','infra_codegen_template_type',0,'','',NULL,'','2021-02-05 07:09:06','','2022-03-10 16:33:15',0x00),(51,2,'树表(增删改查)','2','infra_codegen_template_type',0,'','',NULL,'','2021-02-05 07:14:46','','2022-03-10 16:33:19',0x00),(53,0,'初始化中','0','infra_job_status',0,'primary','',NULL,'','2021-02-07 07:46:49','1','2022-02-16 19:33:29',0x00),(57,0,'运行中','0','infra_job_log_status',0,'primary','','RUNNING','','2021-02-08 10:04:24','1','2022-02-16 19:07:48',0x00),(58,1,'成功','1','infra_job_log_status',0,'success','',NULL,'','2021-02-08 10:06:57','1','2022-02-16 19:07:52',0x00),(59,2,'失败','2','infra_job_log_status',0,'warning','','失败','','2021-02-08 10:07:38','1','2022-02-16 19:07:56',0x00),(60,1,'会员','1','user_type',0,'primary','',NULL,'','2021-02-26 00:16:27','1','2022-02-16 10:22:19',0x00),(61,2,'管理员','2','user_type',0,'success','',NULL,'','2021-02-26 00:16:34','1','2025-04-06 18:37:43',0x00),(62,0,'未处理','0','infra_api_error_log_process_status',0,'primary','',NULL,'','2021-02-26 07:07:19','1','2022-02-16 20:14:17',0x00),(63,1,'已处理','1','infra_api_error_log_process_status',0,'success','',NULL,'','2021-02-26 07:07:26','1','2022-02-16 20:14:08',0x00),(64,2,'已忽略','2','infra_api_error_log_process_status',0,'danger','',NULL,'','2021-02-26 07:07:34','1','2022-02-16 20:14:14',0x00),(66,1,'阿里云','ALIYUN','system_sms_channel_code',0,'primary','',NULL,'1','2021-04-05 01:05:26','1','2024-07-22 22:23:25',0x00),(67,1,'验证码','1','system_sms_template_type',0,'warning','',NULL,'1','2021-04-05 21:50:57','1','2022-02-16 12:48:30',0x00),(68,2,'通知','2','system_sms_template_type',0,'primary','',NULL,'1','2021-04-05 21:51:08','1','2022-02-16 12:48:27',0x00),(69,0,'营销','3','system_sms_template_type',0,'danger','',NULL,'1','2021-04-05 21:51:15','1','2022-02-16 12:48:22',0x00),(70,0,'初始化','0','system_sms_send_status',0,'primary','',NULL,'1','2021-04-11 20:18:33','1','2022-02-16 10:26:07',0x00),(71,1,'发送成功','10','system_sms_send_status',0,'success','',NULL,'1','2021-04-11 20:18:43','1','2022-02-16 10:25:56',0x00),(72,2,'发送失败','20','system_sms_send_status',0,'danger','',NULL,'1','2021-04-11 20:18:49','1','2022-02-16 10:26:03',0x00),(73,3,'不发送','30','system_sms_send_status',0,'info','',NULL,'1','2021-04-11 20:19:44','1','2022-02-16 10:26:10',0x00),(74,0,'等待结果','0','system_sms_receive_status',0,'primary','',NULL,'1','2021-04-11 20:27:43','1','2022-02-16 10:28:24',0x00),(75,1,'接收成功','10','system_sms_receive_status',0,'success','',NULL,'1','2021-04-11 20:29:25','1','2022-02-16 10:28:28',0x00),(76,2,'接收失败','20','system_sms_receive_status',0,'danger','',NULL,'1','2021-04-11 20:29:31','1','2022-02-16 10:28:32',0x00),(77,0,'调试(钉钉)','DEBUG_DING_TALK','system_sms_channel_code',0,'info','',NULL,'1','2021-04-13 00:20:37','1','2022-02-16 10:10:00',0x00),(80,100,'账号登录','100','system_login_type',0,'primary','','账号登录','1','2021-10-06 00:52:02','1','2022-02-16 13:11:34',0x00),(81,101,'社交登录','101','system_login_type',0,'info','','社交登录','1','2021-10-06 00:52:17','1','2022-02-16 13:11:40',0x00),(83,200,'主动登出','200','system_login_type',0,'primary','','主动登出','1','2021-10-06 00:52:58','1','2022-02-16 13:11:49',0x00),(85,202,'强制登出','202','system_login_type',0,'danger','','强制退出','1','2021-10-06 00:53:41','1','2022-02-16 13:11:57',0x00),(86,0,'病假','1','bpm_oa_leave_type',0,'primary','',NULL,'1','2021-09-21 22:35:28','1','2022-02-16 10:00:41',0x00),(87,1,'事假','2','bpm_oa_leave_type',0,'info','',NULL,'1','2021-09-21 22:36:11','1','2022-02-16 10:00:49',0x00),(88,2,'婚假','3','bpm_oa_leave_type',0,'warning','',NULL,'1','2021-09-21 22:36:38','1','2022-02-16 10:00:53',0x00),(112,0,'微信 Wap ç½‘站支付','wx_wap','pay_channel_code',0,'success','','微信 Wap ç½‘站支付','1','2023-07-19 20:08:06','1','2023-07-19 20:09:08',0x00),(113,1,'微信公众号支付','wx_pub','pay_channel_code',0,'success','','微信公众号支付','1','2021-12-03 10:40:24','1','2023-07-19 20:08:47',0x00),(114,2,'微信小程序支付','wx_lite','pay_channel_code',0,'success','','微信小程序支付','1','2021-12-03 10:41:06','1','2023-07-19 20:08:50',0x00),(115,3,'微信 App æ”¯ä»˜','wx_app','pay_channel_code',0,'success','','微信 App æ”¯ä»˜','1','2021-12-03 10:41:20','1','2023-07-19 20:08:56',0x00),(116,10,'支付宝 PC ç½‘站支付','alipay_pc','pay_channel_code',0,'primary','','支付宝 PC ç½‘站支付','1','2021-12-03 10:42:09','1','2023-07-19 20:09:12',0x00),(117,11,'支付宝 Wap ç½‘站支付','alipay_wap','pay_channel_code',0,'primary','','支付宝 Wap ç½‘站支付','1','2021-12-03 10:42:26','1','2023-07-19 20:09:16',0x00),(118,12,'支付宝 App æ”¯ä»˜','alipay_app','pay_channel_code',0,'primary','','支付宝 App æ”¯ä»˜','1','2021-12-03 10:42:55','1','2023-07-19 20:09:20',0x00),(119,14,'支付宝扫码支付','alipay_qr','pay_channel_code',0,'primary','','支付宝扫码支付','1','2021-12-03 10:43:10','1','2023-07-19 20:09:28',0x00),(120,10,'通知成功','10','pay_notify_status',0,'success','','通知成功','1','2021-12-03 11:02:41','1','2023-07-19 10:08:19',0x00),(121,20,'通知失败','20','pay_notify_status',0,'danger','','通知失败','1','2021-12-03 11:02:59','1','2023-07-19 10:08:21',0x00),(122,0,'等待通知','0','pay_notify_status',0,'info','','未通知','1','2021-12-03 11:03:10','1','2023-07-19 10:08:24',0x00),(123,10,'支付成功','10','pay_order_status',0,'success','','支付成功','1','2021-12-03 11:18:29','1','2023-07-19 18:04:28',0x00),(124,30,'支付关闭','30','pay_order_status',0,'info','','支付关闭','1','2021-12-03 11:18:42','1','2023-07-19 18:05:07',0x00),(125,0,'等待支付','0','pay_order_status',0,'info','','未支付','1','2021-12-03 11:18:18','1','2023-07-19 18:04:15',0x00),(600,5,'首页','1','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(601,4,'秒杀活动页','2','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(602,3,'砍价活动页','3','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(603,2,'限时折扣页','4','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(604,1,'满减送页','5','promotion_banner_position',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(1118,0,'等待退款','0','pay_refund_status',0,'info','','等待退款','1','2021-12-10 16:44:59','1','2023-07-19 10:14:39',0x00),(1119,20,'退款失败','20','pay_refund_status',0,'danger','','退款失败','1','2021-12-10 16:45:10','1','2023-07-19 10:15:10',0x00),(1124,10,'退款成功','10','pay_refund_status',0,'success','','退款成功','1','2021-12-10 16:46:26','1','2023-07-19 10:15:00',0x00),(1127,1,'审批中','1','bpm_process_instance_status',0,'default','','流程实例的状态 - è¿›è¡Œä¸­','1','2022-01-07 23:47:22','1','2024-03-16 16:11:45',0x00),(1128,2,'审批通过','2','bpm_process_instance_status',0,'success','','流程实例的状态 - å·²å®Œæˆ','1','2022-01-07 23:47:49','1','2024-03-16 16:11:54',0x00),(1129,1,'审批中','1','bpm_task_status',0,'primary','','流程实例的结果 - å¤„理中','1','2022-01-07 23:48:32','1','2024-03-08 22:41:37',0x00),(1130,2,'审批通过','2','bpm_task_status',0,'success','','流程实例的结果 - é€šè¿‡','1','2022-01-07 23:48:45','1','2024-03-08 22:41:38',0x00),(1131,3,'审批不通过','3','bpm_task_status',0,'danger','','流程实例的结果 - ä¸é€šè¿‡','1','2022-01-07 23:48:55','1','2024-03-08 22:41:38',0x00),(1132,4,'已取消','4','bpm_task_status',0,'info','','流程实例的结果 - æ’¤é”€','1','2022-01-07 23:49:06','1','2024-03-08 22:41:39',0x00),(1133,10,'流程表单','10','bpm_model_form_type',0,'','','流程的表单类型 - æµç¨‹è¡¨å•','103','2022-01-11 23:51:30','103','2022-01-11 23:51:30',0x00),(1134,20,'业务表单','20','bpm_model_form_type',0,'','','流程的表单类型 - ä¸šåŠ¡è¡¨å•','103','2022-01-11 23:51:47','103','2022-01-11 23:51:47',0x00),(1135,10,'角色','10','bpm_task_candidate_strategy',0,'info','','任务分配规则的类型 - è§’色','103','2022-01-12 23:21:22','1','2024-03-06 02:53:16',0x00),(1136,20,'部门的成员','20','bpm_task_candidate_strategy',0,'primary','','任务分配规则的类型 - éƒ¨é—¨çš„æˆå‘˜','103','2022-01-12 23:21:47','1','2024-03-06 02:53:17',0x00),(1137,21,'部门的负责人','21','bpm_task_candidate_strategy',0,'primary','','任务分配规则的类型 - éƒ¨é—¨çš„负责人','103','2022-01-12 23:33:36','1','2024-03-06 02:53:18',0x00),(1138,30,'用户','30','bpm_task_candidate_strategy',0,'info','','任务分配规则的类型 - ç”¨æˆ·','103','2022-01-12 23:34:02','1','2024-03-06 02:53:19',0x00),(1139,40,'用户组','40','bpm_task_candidate_strategy',0,'warning','','任务分配规则的类型 - ç”¨æˆ·ç»„','103','2022-01-12 23:34:21','1','2024-03-06 02:53:20',0x00),(1140,60,'流程表达式','60','bpm_task_candidate_strategy',0,'danger','','任务分配规则的类型 - æµç¨‹è¡¨è¾¾å¼','103','2022-01-12 23:34:43','1','2024-03-06 02:53:20',0x00),(1141,22,'岗位','22','bpm_task_candidate_strategy',0,'success','','任务分配规则的类型 - å²—位','103','2022-01-14 18:41:55','1','2024-03-06 02:53:21',0x00),(1145,1,'管理后台','1','infra_codegen_scene',0,'','','代码生成的场景枚举 - ç®¡ç†åŽå°','1','2022-02-02 13:15:06','1','2022-03-10 16:32:59',0x00),(1146,2,'用户 APP','2','infra_codegen_scene',0,'','','代码生成的场景枚举 - ç”¨æˆ· APP','1','2022-02-02 13:15:19','1','2022-03-10 16:33:03',0x00),(1150,1,'数据库','1','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:25:28','1','2022-03-15 00:25:28',0x00),(1151,10,'本地磁盘','10','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:25:41','1','2022-03-15 00:25:56',0x00),(1152,11,'FTP æœåС噍','11','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:26:06','1','2022-03-15 00:26:10',0x00),(1153,12,'SFTP æœåС噍','12','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:26:22','1','2022-03-15 00:26:22',0x00),(1154,20,'S3 å¯¹è±¡å­˜å‚¨','20','infra_file_storage',0,'default','',NULL,'1','2022-03-15 00:26:31','1','2022-03-15 00:26:45',0x00),(1155,103,'短信登录','103','system_login_type',0,'default','',NULL,'1','2022-05-09 23:57:58','1','2022-05-09 23:58:09',0x00),(1156,1,'password','password','system_oauth2_grant_type',0,'default','','密码模式','1','2022-05-12 00:22:05','1','2022-05-11 16:26:01',0x00),(1157,2,'authorization_code','authorization_code','system_oauth2_grant_type',0,'primary','','授权码模式','1','2022-05-12 00:22:59','1','2022-05-11 16:26:02',0x00),(1158,3,'implicit','implicit','system_oauth2_grant_type',0,'success','','简化模式','1','2022-05-12 00:23:40','1','2022-05-11 16:26:05',0x00),(1159,4,'client_credentials','client_credentials','system_oauth2_grant_type',0,'default','','客户端模式','1','2022-05-12 00:23:51','1','2022-05-11 16:26:08',0x00),(1160,5,'refresh_token','refresh_token','system_oauth2_grant_type',0,'info','','刷新模式','1','2022-05-12 00:24:02','1','2022-05-11 16:26:11',0x00),(1162,1,'销售中','1','product_spu_status',0,'success','','商品 SPU çŠ¶æ€ - é”€å”®ä¸­','1','2022-10-24 21:19:47','1','2022-10-24 21:20:38',0x00),(1163,0,'仓库中','0','product_spu_status',0,'info','','商品 SPU çŠ¶æ€ - ä»“库中','1','2022-10-24 21:20:54','1','2022-10-24 21:21:22',0x00),(1164,0,'回收站','-1','product_spu_status',0,'default','','商品 SPU çŠ¶æ€ - å›žæ”¶ç«™','1','2022-10-24 21:21:11','1','2022-10-24 21:21:11',0x00),(1165,1,'满减','1','promotion_discount_type',0,'success','','优惠类型 - æ»¡å‡','1','2022-11-01 12:46:41','1','2022-11-01 12:50:11',0x00),(1166,2,'折扣','2','promotion_discount_type',0,'primary','','优惠类型 - æŠ˜æ‰£','1','2022-11-01 12:46:51','1','2022-11-01 12:50:08',0x00),(1167,1,'固定日期','1','promotion_coupon_template_validity_type',0,'default','','优惠劵模板的有限期类型 - å›ºå®šæ—¥æœŸ','1','2022-11-02 00:07:34','1','2022-11-04 00:07:49',0x00),(1168,2,'领取之后','2','promotion_coupon_template_validity_type',0,'default','','优惠劵模板的有限期类型 - é¢†å–之后','1','2022-11-02 00:07:54','1','2022-11-04 00:07:52',0x00),(1169,1,'通用劵','1','promotion_product_scope',0,'default','','营销的商品范围 - å…¨éƒ¨å•†å“å‚与','1','2022-11-02 00:28:22','1','2023-09-28 00:27:42',0x00),(1170,2,'商品劵','2','promotion_product_scope',0,'default','','营销的商品范围 - æŒ‡å®šå•†å“å‚与','1','2022-11-02 00:28:34','1','2023-09-28 00:27:44',0x00),(1171,1,'未使用','1','promotion_coupon_status',0,'primary','','优惠劵的状态 - å·²é¢†å–','1','2022-11-04 00:15:08','1','2023-10-03 12:54:38',0x00),(1172,2,'已使用','2','promotion_coupon_status',0,'success','','优惠劵的状态 - å·²ä½¿ç”¨','1','2022-11-04 00:15:21','1','2022-11-04 19:16:08',0x00),(1173,3,'已过期','3','promotion_coupon_status',0,'info','','优惠劵的状态 - å·²è¿‡æœŸ','1','2022-11-04 00:15:43','1','2022-11-04 19:16:12',0x00),(1174,1,'直接领取','1','promotion_coupon_take_type',0,'primary','','优惠劵的领取方式 - ç›´æŽ¥é¢†å–','1','2022-11-04 19:13:00','1','2022-11-04 19:13:25',0x00),(1175,2,'指定发放','2','promotion_coupon_take_type',0,'success','','优惠劵的领取方式 - æŒ‡å®šå‘放','1','2022-11-04 19:13:13','1','2022-11-04 19:14:48',0x00),(1176,10,'未开始','10','promotion_activity_status',0,'primary','','促销活动的状态枚举 - æœªå¼€å§‹','1','2022-11-04 22:54:49','1','2022-11-04 22:55:53',0x00),(1177,20,'进行中','20','promotion_activity_status',0,'success','','促销活动的状态枚举 - è¿›è¡Œä¸­','1','2022-11-04 22:55:06','1','2022-11-04 22:55:20',0x00),(1178,30,'已结束','30','promotion_activity_status',0,'info','','促销活动的状态枚举 - å·²ç»“束','1','2022-11-04 22:55:41','1','2022-11-04 22:55:41',0x00),(1179,40,'已关闭','40','promotion_activity_status',0,'warning','','促销活动的状态枚举 - å·²å…³é—­','1','2022-11-04 22:56:10','1','2022-11-04 22:56:18',0x00),(1180,10,'满 N å…ƒ','10','promotion_condition_type',0,'primary','','营销的条件类型 - æ»¡ N å…ƒ','1','2022-11-04 22:59:45','1','2022-11-04 22:59:45',0x00),(1181,20,'满 N ä»¶','20','promotion_condition_type',0,'success','','营销的条件类型 - æ»¡ N ä»¶','1','2022-11-04 23:00:02','1','2022-11-04 23:00:02',0x00),(1182,10,'申请售后','10','trade_after_sale_status',0,'primary','','交易售后状态 - ç”³è¯·å”®åŽ','1','2022-11-19 20:53:33','1','2022-11-19 20:54:42',0x00),(1183,20,'商品待退货','20','trade_after_sale_status',0,'primary','','交易售后状态 - å•†å“å¾…退货','1','2022-11-19 20:54:36','1','2022-11-19 20:58:58',0x00),(1184,30,'商家待收货','30','trade_after_sale_status',0,'primary','','交易售后状态 - å•†å®¶å¾…æ”¶è´§','1','2022-11-19 20:56:56','1','2022-11-19 20:59:20',0x00),(1185,40,'等待退款','40','trade_after_sale_status',0,'primary','','交易售后状态 - ç­‰å¾…退款','1','2022-11-19 20:59:54','1','2022-11-19 21:00:01',0x00),(1186,50,'退款成功','50','trade_after_sale_status',0,'default','','交易售后状态 - é€€æ¬¾æˆåŠŸ','1','2022-11-19 21:00:33','1','2022-11-19 21:00:33',0x00),(1187,61,'买家取消','61','trade_after_sale_status',0,'info','','交易售后状态 - ä¹°å®¶å–消','1','2022-11-19 21:01:29','1','2022-11-19 21:01:29',0x00),(1188,62,'商家拒绝','62','trade_after_sale_status',0,'info','','交易售后状态 - å•†å®¶æ‹’绝','1','2022-11-19 21:02:17','1','2022-11-19 21:02:17',0x00),(1189,63,'商家拒收货','63','trade_after_sale_status',0,'info','','交易售后状态 - å•†å®¶æ‹’æ”¶è´§','1','2022-11-19 21:02:37','1','2022-11-19 21:03:07',0x00),(1190,10,'售中退款','10','trade_after_sale_type',0,'success','','交易售后的类型 - å”®ä¸­é€€æ¬¾','1','2022-11-19 21:05:05','1','2022-11-19 21:38:23',0x00),(1191,20,'售后退款','20','trade_after_sale_type',0,'primary','','交易售后的类型 - å”®åŽé€€æ¬¾','1','2022-11-19 21:05:32','1','2022-11-19 21:38:32',0x00),(1192,10,'仅退款','10','trade_after_sale_way',0,'primary','','交易售后的方式 - ä»…退款','1','2022-11-19 21:39:19','1','2022-11-19 21:39:19',0x00),(1193,20,'退货退款','20','trade_after_sale_way',0,'success','','交易售后的方式 - é€€è´§é€€æ¬¾','1','2022-11-19 21:39:38','1','2022-11-19 21:39:49',0x00),(1194,10,'微信小程序','10','terminal',0,'default','','终端 - å¾®ä¿¡å°ç¨‹åº','1','2022-12-10 10:51:11','1','2022-12-10 10:51:57',0x00),(1195,20,'H5 ç½‘页','20','terminal',0,'default','','终端 - H5 ç½‘页','1','2022-12-10 10:51:30','1','2022-12-10 10:51:59',0x00),(1196,11,'微信公众号','11','terminal',0,'default','','终端 - å¾®ä¿¡å…¬ä¼—号','1','2022-12-10 10:54:16','1','2022-12-10 10:52:01',0x00),(1197,31,'苹果 App','31','terminal',0,'default','','终端 - è‹¹æžœ App','1','2022-12-10 10:54:42','1','2022-12-10 10:52:18',0x00),(1198,32,'安卓 App','32','terminal',0,'default','','终端 - å®‰å“ App','1','2022-12-10 10:55:02','1','2022-12-10 10:59:17',0x00),(1199,0,'普通订单','0','trade_order_type',0,'default','','交易订单的类型 - æ™®é€šè®¢å•','1','2022-12-10 16:34:14','1','2022-12-10 16:34:14',0x00),(1200,1,'秒杀订单','1','trade_order_type',0,'default','','交易订单的类型 - ç§’杀订单','1','2022-12-10 16:34:26','1','2022-12-10 16:34:26',0x00),(1201,2,'砍价订单','2','trade_order_type',0,'default','','交易订单的类型 - æ‹¼å›¢è®¢å•','1','2022-12-10 16:34:36','1','2024-09-07 14:18:39',0x00),(1202,3,'拼团订单','3','trade_order_type',0,'default','','交易订单的类型 - ç ä»·è®¢å•','1','2022-12-10 16:34:48','1','2024-09-07 14:18:32',0x00),(1203,0,'待支付','0','trade_order_status',0,'default','','交易订单状态 - å¾…支付','1','2022-12-10 16:49:29','1','2022-12-10 16:49:29',0x00),(1204,10,'待发货','10','trade_order_status',0,'primary','','交易订单状态 - å¾…发货','1','2022-12-10 16:49:53','1','2022-12-10 16:51:17',0x00),(1205,20,'已发货','20','trade_order_status',0,'primary','','交易订单状态 - å·²å‘è´§','1','2022-12-10 16:50:13','1','2022-12-10 16:51:31',0x00),(1206,30,'已完成','30','trade_order_status',0,'success','','交易订单状态 - å·²å®Œæˆ','1','2022-12-10 16:50:30','1','2022-12-10 16:51:06',0x00),(1207,40,'已取消','40','trade_order_status',0,'danger','','交易订单状态 - å·²å–消','1','2022-12-10 16:50:50','1','2022-12-10 16:51:00',0x00),(1208,0,'未售后','0','trade_order_item_after_sale_status',0,'info','','交易订单项的售后状态 - æœªå”®åŽ','1','2022-12-10 20:58:42','1','2022-12-10 20:59:29',0x00),(1209,10,'售后中','10','trade_order_item_after_sale_status',0,'primary','','交易订单项的售后状态 - å”®åŽä¸­','1','2022-12-10 20:59:21','1','2024-07-21 17:01:24',0x00),(1210,20,'已退款','20','trade_order_item_after_sale_status',0,'success','','交易订单项的售后状态 - å·²é€€æ¬¾','1','2022-12-10 20:59:46','1','2024-07-21 17:01:35',0x00),(1211,1,'完全匹配','1','mp_auto_reply_request_match',0,'primary','','公众号自动回复的请求关键字匹配模式 - å®Œå…¨åŒ¹é…','1','2023-01-16 23:30:39','1','2023-01-16 23:31:00',0x00),(1212,2,'半匹配','2','mp_auto_reply_request_match',0,'success','','公众号自动回复的请求关键字匹配模式 - åŠåŒ¹é…','1','2023-01-16 23:30:55','1','2023-01-16 23:31:10',0x00),(1213,1,'文本','text','mp_message_type',0,'default','','公众号的消息类型 - æ–‡æœ¬','1','2023-01-17 22:17:32','1','2023-01-17 22:17:39',0x00),(1214,2,'图片','image','mp_message_type',0,'default','','公众号的消息类型 - å›¾ç‰‡','1','2023-01-17 22:17:32','1','2023-01-17 14:19:47',0x00),(1215,3,'语音','voice','mp_message_type',0,'default','','公众号的消息类型 - è¯­éŸ³','1','2023-01-17 22:17:32','1','2023-01-17 14:20:08',0x00),(1216,4,'视频','video','mp_message_type',0,'default','','公众号的消息类型 - è§†é¢‘','1','2023-01-17 22:17:32','1','2023-01-17 14:21:08',0x00),(1217,5,'小视频','shortvideo','mp_message_type',0,'default','','公众号的消息类型 - å°è§†é¢‘','1','2023-01-17 22:17:32','1','2023-01-17 14:19:59',0x00),(1218,6,'图文','news','mp_message_type',0,'default','','公众号的消息类型 - å›¾æ–‡','1','2023-01-17 22:17:32','1','2023-01-17 14:22:54',0x00),(1219,7,'音乐','music','mp_message_type',0,'default','','公众号的消息类型 - éŸ³ä¹','1','2023-01-17 22:17:32','1','2023-01-17 14:22:54',0x00),(1220,8,'地理位置','location','mp_message_type',0,'default','','公众号的消息类型 - åœ°ç†ä½ç½®','1','2023-01-17 22:17:32','1','2023-01-17 14:23:51',0x00),(1221,9,'链接','link','mp_message_type',0,'default','','公众号的消息类型 - é“¾æŽ¥','1','2023-01-17 22:17:32','1','2023-01-17 14:24:49',0x00),(1222,10,'事件','event','mp_message_type',0,'default','','公众号的消息类型 - äº‹ä»¶','1','2023-01-17 22:17:32','1','2023-01-17 14:24:49',0x00),(1223,0,'初始化','0','system_mail_send_status',0,'primary','','邮件发送状态 - åˆå§‹åŒ–\n','1','2023-01-26 09:53:49','1','2023-01-26 16:36:14',0x00),(1224,10,'发送成功','10','system_mail_send_status',0,'success','','邮件发送状态 - å‘送成功','1','2023-01-26 09:54:28','1','2023-01-26 16:36:22',0x00),(1225,20,'发送失败','20','system_mail_send_status',0,'danger','','邮件发送状态 - å‘送失败','1','2023-01-26 09:54:50','1','2023-01-26 16:36:26',0x00),(1226,30,'不发送','30','system_mail_send_status',0,'info','','邮件发送状态 -  ä¸å‘送','1','2023-01-26 09:55:06','1','2023-01-26 16:36:36',0x00),(1227,1,'通知公告','1','system_notify_template_type',0,'primary','','站内信模版的类型 - é€šçŸ¥å…¬å‘Š','1','2023-01-28 10:35:59','1','2023-01-28 10:35:59',0x00),(1228,2,'系统消息','2','system_notify_template_type',0,'success','','站内信模版的类型 - ç³»ç»Ÿæ¶ˆæ¯','1','2023-01-28 10:36:20','1','2023-01-28 10:36:25',0x00),(1230,13,'支付宝条码支付','alipay_bar','pay_channel_code',0,'primary','','支付宝条码支付','1','2023-02-18 23:32:24','1','2023-07-19 20:09:23',0x00),(1231,10,'Vue2 Element UI æ ‡å‡†æ¨¡ç‰ˆ','10','infra_codegen_front_type',0,'','','','1','2023-04-13 00:03:55','1','2023-04-13 00:03:55',0x00),(1232,20,'Vue3 Element Plus æ ‡å‡†æ¨¡ç‰ˆ','20','infra_codegen_front_type',0,'','','','1','2023-04-13 00:04:08','1','2023-04-13 00:04:08',0x00),(1234,30,'Vben2.0 Ant Design Schema æ¨¡ç‰ˆ','30','infra_codegen_front_type',1,'','','','1','2023-04-13 00:04:26','1','2025-07-27 10:55:14',0x00),(1244,0,'按件','1','trade_delivery_express_charge_mode',0,'','','','1','2023-05-21 22:46:40','1','2023-05-21 22:46:40',0x00),(1245,1,'按重量','2','trade_delivery_express_charge_mode',0,'','','','1','2023-05-21 22:46:58','1','2023-05-21 22:46:58',0x00),(1246,2,'按体积','3','trade_delivery_express_charge_mode',0,'','','','1','2023-05-21 22:47:18','1','2023-05-21 22:47:18',0x00),(1335,11,'订单积分抵扣','11','member_point_biz_type',0,'','','','1','2023-06-10 12:15:27','1','2023-10-11 07:41:43',0x00),(1336,1,'签到','1','member_point_biz_type',0,'','','','1','2023-06-10 12:15:48','1','2023-08-20 11:59:53',0x00),(1341,20,'已退款','20','pay_order_status',0,'danger','','已退款','1','2023-07-19 18:05:37','1','2023-07-19 18:05:37',0x00),(1342,21,'请求成功,但是结果失败','21','pay_notify_status',0,'warning','','请求成功,但是结果失败','1','2023-07-19 18:10:47','1','2023-07-19 18:11:38',0x00),(1343,22,'请求失败','22','pay_notify_status',0,'warning','',NULL,'1','2023-07-19 18:11:05','1','2023-07-19 18:11:27',0x00),(1344,4,'微信扫码支付','wx_native','pay_channel_code',0,'success','','微信扫码支付','1','2023-07-19 20:07:47','1','2023-07-19 20:09:03',0x00),(1345,5,'微信条码支付','wx_bar','pay_channel_code',0,'success','','微信条码支付\n','1','2023-07-19 20:08:06','1','2023-07-19 20:09:08',0x00),(1346,1,'支付单','1','pay_notify_type',0,'primary','','支付单','1','2023-07-20 12:23:17','1','2023-07-20 12:23:17',0x00),(1347,2,'退款单','2','pay_notify_type',0,'danger','',NULL,'1','2023-07-20 12:23:26','1','2023-07-20 12:23:26',0x00),(1348,20,'模拟支付','mock','pay_channel_code',0,'default','','模拟支付','1','2023-07-29 11:10:51','1','2023-07-29 03:14:10',0x00),(1349,12,'订单积分抵扣(整单取消)','12','member_point_biz_type',0,'','','','1','2023-08-20 12:00:03','1','2023-10-11 07:42:01',0x00),(1350,0,'管理员调整','0','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1351,1,'邀新奖励','1','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1352,11,'下单奖励','11','member_experience_biz_type',0,'success','',NULL,'','2023-08-22 12:41:01','1','2023-10-11 07:45:09',0x00),(1353,12,'下单奖励(整单取消)','12','member_experience_biz_type',0,'warning','',NULL,'','2023-08-22 12:41:01','1','2023-10-11 07:45:01',0x00),(1354,4,'签到奖励','4','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1355,5,'抽奖奖励','5','member_experience_biz_type',0,'','',NULL,'','2023-08-22 12:41:01','','2023-08-22 12:41:01',0x00),(1356,1,'快递发货','1','trade_delivery_type',0,'','','','1','2023-08-23 00:04:55','1','2023-08-23 00:04:55',0x00),(1357,2,'用户自提','2','trade_delivery_type',0,'','','','1','2023-08-23 00:05:05','1','2023-08-23 00:05:05',0x00),(1358,3,'品类劵','3','promotion_product_scope',0,'default','','','1','2023-09-01 23:43:07','1','2023-09-28 00:27:47',0x00),(1359,1,'人人分销','1','brokerage_enabled_condition',0,'','','所有用户都可以分销','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1360,2,'指定分销','2','brokerage_enabled_condition',0,'','','仅可后台手动设置推广员','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1361,1,'首次绑定','1','brokerage_bind_mode',0,'','','只要用户没有推广人,随时都可以绑定推广关系','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1362,2,'注册绑定','2','brokerage_bind_mode',0,'','','仅新用户注册时才能绑定推广关系','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1363,3,'覆盖绑定','3','brokerage_bind_mode',0,'','','如果用户已经有推广人,推广人会被变更','','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1364,1,'钱包','1','brokerage_withdraw_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1365,2,'银行卡','2','brokerage_withdraw_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1366,3,'微信收款码','3','brokerage_withdraw_type',0,'','','手动打款','','2023-09-28 02:46:05','1','2025-05-10 08:24:25',0x00),(1367,4,'支付宝收款码','4','brokerage_withdraw_type',0,'','','手动打款','','2023-09-28 02:46:05','1','2025-05-10 08:24:37',0x00),(1368,1,'订单返佣','1','brokerage_record_biz_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1369,2,'申请提现','2','brokerage_record_biz_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1370,3,'申请提现驳回','3','brokerage_record_biz_type',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1371,0,'待结算','0','brokerage_record_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1372,1,'已结算','1','brokerage_record_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1373,2,'已取消','2','brokerage_record_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1374,0,'审核中','0','brokerage_withdraw_status',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1375,10,'审核通过','10','brokerage_withdraw_status',0,'success','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1376,11,'提现成功','11','brokerage_withdraw_status',0,'success','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1377,20,'审核不通过','20','brokerage_withdraw_status',0,'danger','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1378,21,'提现失败','21','brokerage_withdraw_status',0,'danger','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1379,0,'工商银行','0','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1380,1,'建设银行','1','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1381,2,'农业银行','2','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1382,3,'中国银行','3','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1383,4,'交通银行','4','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1384,5,'招商银行','5','brokerage_bank_name',0,'','',NULL,'','2023-09-28 02:46:05','','2023-09-28 02:46:05',0x00),(1385,21,'钱包','wallet','pay_channel_code',0,'primary','','','1','2023-10-01 21:46:19','1','2023-10-01 21:48:01',0x00),(1386,1,'砍价中','1','promotion_bargain_record_status',0,'default','','','1','2023-10-05 10:41:26','1','2023-10-05 10:41:26',0x00),(1387,2,'砍价成功','2','promotion_bargain_record_status',0,'success','','','1','2023-10-05 10:41:39','1','2023-10-05 10:41:39',0x00),(1388,3,'砍价失败','3','promotion_bargain_record_status',0,'warning','','','1','2023-10-05 10:41:57','1','2023-10-05 10:41:57',0x00),(1389,0,'拼团中','0','promotion_combination_record_status',0,'','','','1','2023-10-08 07:24:44','1','2024-10-13 10:08:17',0x00),(1390,1,'拼团成功','1','promotion_combination_record_status',0,'success','','','1','2023-10-08 07:24:56','1','2024-10-13 10:08:20',0x00),(1391,2,'拼团失败','2','promotion_combination_record_status',0,'warning','','','1','2023-10-08 07:25:11','1','2024-10-13 10:08:24',0x00),(1392,2,'管理员修改','2','member_point_biz_type',0,'default','','','1','2023-10-11 07:41:34','1','2023-10-11 07:41:34',0x00),(1393,13,'订单积分抵扣(单个退款)','13','member_point_biz_type',0,'','','','1','2023-10-11 07:42:29','1','2023-10-11 07:42:29',0x00),(1394,21,'订单积分奖励','21','member_point_biz_type',0,'default','','','1','2023-10-11 07:42:44','1','2023-10-11 07:42:44',0x00),(1395,22,'订单积分奖励(整单取消)','22','member_point_biz_type',0,'default','','','1','2023-10-11 07:42:55','1','2023-10-11 07:43:01',0x00),(1396,23,'订单积分奖励(单个退款)','23','member_point_biz_type',0,'default','','','1','2023-10-11 07:43:16','1','2023-10-11 07:43:16',0x00),(1397,13,'下单奖励(单个退款)','13','member_experience_biz_type',0,'warning','','','1','2023-10-11 07:45:24','1','2023-10-11 07:45:38',0x00),(1398,5,'网上转账','5','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:24','1','2023-10-18 21:55:24',0x00),(1399,6,'支付宝','6','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:38','1','2023-10-18 21:55:38',0x00),(1400,7,'微信支付','7','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:53','1','2023-10-18 21:55:53',0x00),(1401,8,'其他','8','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:56:06','1','2023-10-18 21:56:06',0x00),(1402,1,'IT','1','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:15','1','2024-02-18 23:30:38',0x00),(1403,2,'金融业','2','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:29','1','2024-02-18 23:30:43',0x00),(1404,3,'房地产','3','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:41','1','2024-02-18 23:30:48',0x00),(1405,4,'商业服务','4','crm_customer_industry',0,'default','','','1','2023-10-28 23:02:54','1','2024-02-18 23:30:54',0x00),(1406,5,'运输/物流','5','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:03','1','2024-02-18 23:31:00',0x00),(1407,6,'生产','6','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:13','1','2024-02-18 23:31:08',0x00),(1408,7,'政府','7','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:27','1','2024-02-18 23:31:13',0x00),(1409,8,'文化传媒','8','crm_customer_industry',0,'default','','','1','2023-10-28 23:03:37','1','2024-02-18 23:31:20',0x00),(1422,1,'A ï¼ˆé‡ç‚¹å®¢æˆ·ï¼‰','1','crm_customer_level',0,'primary','','','1','2023-10-28 23:07:13','1','2023-10-28 23:07:13',0x00),(1423,2,'B ï¼ˆæ™®é€šå®¢æˆ·ï¼‰','2','crm_customer_level',0,'info','','','1','2023-10-28 23:07:35','1','2023-10-28 23:07:35',0x00),(1424,3,'C ï¼ˆéžä¼˜å…ˆå®¢æˆ·ï¼‰','3','crm_customer_level',0,'default','','','1','2023-10-28 23:07:53','1','2023-10-28 23:07:53',0x00),(1425,1,'促销','1','crm_customer_source',0,'default','','','1','2023-10-28 23:08:29','1','2023-10-28 23:08:29',0x00),(1426,2,'搜索引擎','2','crm_customer_source',0,'default','','','1','2023-10-28 23:08:39','1','2023-10-28 23:08:39',0x00),(1427,3,'广告','3','crm_customer_source',0,'default','','','1','2023-10-28 23:08:47','1','2023-10-28 23:08:47',0x00),(1428,4,'转介绍','4','crm_customer_source',0,'default','','','1','2023-10-28 23:08:58','1','2023-10-28 23:08:58',0x00),(1429,5,'线上注册','5','crm_customer_source',0,'default','','','1','2023-10-28 23:09:12','1','2023-10-28 23:09:12',0x00),(1430,6,'线上咨询','6','crm_customer_source',0,'default','','','1','2023-10-28 23:09:22','1','2023-10-28 23:09:22',0x00),(1431,7,'预约上门','7','crm_customer_source',0,'default','','','1','2023-10-28 23:09:39','1','2023-10-28 23:09:39',0x00),(1432,8,'陌拜','8','crm_customer_source',0,'default','','','1','2023-10-28 23:10:04','1','2023-10-28 23:10:04',0x00),(1433,9,'电话咨询','9','crm_customer_source',0,'default','','','1','2023-10-28 23:10:18','1','2023-10-28 23:10:18',0x00),(1434,10,'邮件咨询','10','crm_customer_source',0,'default','','','1','2023-10-28 23:10:33','1','2023-10-28 23:10:33',0x00),(1435,10,'Gitee','10','system_social_type',0,'','','','1','2023-11-04 13:04:42','1','2023-11-04 13:04:42',0x00),(1436,20,'钉钉','20','system_social_type',0,'','','','1','2023-11-04 13:04:54','1','2023-11-04 13:04:54',0x00),(1437,30,'企业微信','30','system_social_type',0,'','','','1','2023-11-04 13:05:09','1','2023-11-04 13:05:09',0x00),(1438,31,'微信公众平台','31','system_social_type',0,'','','','1','2023-11-04 13:05:18','1','2023-11-04 13:05:18',0x00),(1439,32,'微信开放平台','32','system_social_type',0,'','','','1','2023-11-04 13:05:30','1','2023-11-04 13:05:30',0x00),(1440,34,'微信小程序','34','system_social_type',0,'','','','1','2023-11-04 13:05:38','1','2023-11-04 13:07:16',0x00),(1441,1,'上架','1','crm_product_status',0,'success','','','1','2023-10-30 21:49:34','1','2023-10-30 21:49:34',0x00),(1442,0,'下架','0','crm_product_status',0,'success','','','1','2023-10-30 21:49:13','1','2023-10-30 21:49:13',0x00),(1443,15,'子表','15','infra_codegen_template_type',0,'default','','','1','2023-11-13 23:06:16','1','2023-11-13 23:06:16',0x00),(1444,10,'主表(标准模式)','10','infra_codegen_template_type',0,'default','','','1','2023-11-14 12:32:49','1','2023-11-14 12:32:49',0x00),(1445,11,'主表(ERP æ¨¡å¼ï¼‰','11','infra_codegen_template_type',0,'default','','','1','2023-11-14 12:33:05','1','2023-11-14 12:33:05',0x00),(1446,12,'主表(内嵌模式)','12','infra_codegen_template_type',0,'','','','1','2023-11-14 12:33:31','1','2023-11-14 12:33:31',0x00),(1447,1,'负责人','1','crm_permission_level',0,'default','','','1','2023-11-30 09:53:12','1','2023-11-30 09:53:12',0x00),(1448,2,'只读','2','crm_permission_level',0,'','','','1','2023-11-30 09:53:29','1','2023-11-30 09:53:29',0x00),(1449,3,'读写','3','crm_permission_level',0,'','','','1','2023-11-30 09:53:36','1','2023-11-30 09:53:36',0x00),(1450,0,'未提交','0','crm_audit_status',0,'','','','1','2023-11-30 18:56:59','1','2023-11-30 18:56:59',0x00),(1451,10,'审批中','10','crm_audit_status',0,'','','','1','2023-11-30 18:57:10','1','2023-11-30 18:57:10',0x00),(1452,20,'审核通过','20','crm_audit_status',0,'','','','1','2023-11-30 18:57:24','1','2023-11-30 18:57:24',0x00),(1453,30,'审核不通过','30','crm_audit_status',0,'','','','1','2023-11-30 18:57:32','1','2023-11-30 18:57:32',0x00),(1454,40,'已取消','40','crm_audit_status',0,'','','','1','2023-11-30 18:57:42','1','2023-11-30 18:57:42',0x00),(1456,1,'支票','1','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:54:29','1','2023-10-18 21:54:29',0x00),(1457,2,'现金','2','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:54:41','1','2023-10-18 21:54:41',0x00),(1458,3,'邮政汇款','3','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:54:53','1','2023-10-18 21:54:53',0x00),(1459,4,'电汇','4','crm_receivable_return_type',0,'default','','','1','2023-10-18 21:55:07','1','2023-10-18 21:55:07',0x00),(1461,1,'个','1','crm_product_unit',0,'','','','1','2023-12-05 23:02:26','1','2023-12-05 23:02:26',0x00),(1462,2,'块','2','crm_product_unit',0,'','','','1','2023-12-05 23:02:34','1','2023-12-05 23:02:34',0x00),(1463,3,'只','3','crm_product_unit',0,'','','','1','2023-12-05 23:02:57','1','2023-12-05 23:02:57',0x00),(1464,4,'把','4','crm_product_unit',0,'','','','1','2023-12-05 23:03:05','1','2023-12-05 23:03:05',0x00),(1465,5,'枚','5','crm_product_unit',0,'','','','1','2023-12-05 23:03:14','1','2023-12-05 23:03:14',0x00),(1466,6,'瓶','6','crm_product_unit',0,'','','','1','2023-12-05 23:03:20','1','2023-12-05 23:03:20',0x00),(1467,7,'盒','7','crm_product_unit',0,'','','','1','2023-12-05 23:03:30','1','2023-12-05 23:03:30',0x00),(1468,8,'台','8','crm_product_unit',0,'','','','1','2023-12-05 23:03:41','1','2023-12-05 23:03:41',0x00),(1469,9,'吨','9','crm_product_unit',0,'','','','1','2023-12-05 23:03:48','1','2023-12-05 23:03:48',0x00),(1470,10,'千克','10','crm_product_unit',0,'','','','1','2023-12-05 23:04:03','1','2023-12-05 23:04:03',0x00),(1471,11,'ç±³','11','crm_product_unit',0,'','','','1','2023-12-05 23:04:12','1','2023-12-05 23:04:12',0x00),(1472,12,'ç®±','12','crm_product_unit',0,'','','','1','2023-12-05 23:04:25','1','2023-12-05 23:04:25',0x00),(1473,13,'套','13','crm_product_unit',0,'','','','1','2023-12-05 23:04:34','1','2023-12-05 23:04:34',0x00),(1474,1,'打电话','1','crm_follow_up_type',0,'','','','1','2024-01-15 20:48:20','1','2024-01-15 20:48:20',0x00),(1475,2,'发短信','2','crm_follow_up_type',0,'','','','1','2024-01-15 20:48:31','1','2024-01-15 20:48:31',0x00),(1476,3,'上门拜访','3','crm_follow_up_type',0,'','','','1','2024-01-15 20:49:07','1','2024-01-15 20:49:07',0x00),(1477,4,'微信沟通','4','crm_follow_up_type',0,'','','','1','2024-01-15 20:49:15','1','2024-01-15 20:49:15',0x00),(1482,4,'转账失败','20','pay_transfer_status',0,'warning','','','1','2023-10-28 16:24:16','1','2025-05-08 12:59:01',0x00),(1483,3,'转账成功','10','pay_transfer_status',0,'success','','','1','2023-10-28 16:23:50','1','2025-05-08 12:58:58',0x00),(1484,2,'转账进行中','5','pay_transfer_status',0,'info','','','1','2023-10-28 16:23:12','1','2025-05-08 12:58:54',0x00),(1485,1,'等待转账','0','pay_transfer_status',0,'default','','','1','2023-10-28 16:21:43','1','2023-10-28 16:23:22',0x00),(1486,10,'其它入库','10','erp_stock_record_biz_type',0,'','','','1','2024-02-05 18:07:25','1','2024-02-05 18:07:43',0x00),(1487,11,'其它入库(作废)','11','erp_stock_record_biz_type',0,'danger','','','1','2024-02-05 18:08:07','1','2024-02-05 19:20:16',0x00),(1488,20,'其它出库','20','erp_stock_record_biz_type',0,'','','','1','2024-02-05 18:08:51','1','2024-02-05 18:08:51',0x00),(1489,21,'其它出库(作废)','21','erp_stock_record_biz_type',0,'danger','','','1','2024-02-05 18:09:00','1','2024-02-05 19:20:10',0x00),(1490,10,'审批中','10','erp_audit_status',0,'default','','','1','2024-02-06 00:00:21','1','2026-06-26 08:46:48',0x00),(1491,20,'审批通过','20','erp_audit_status',0,'success','','','1','2024-02-06 00:00:35','1','2026-06-26 08:46:48',0x00),(1492,30,'调拨入库','30','erp_stock_record_biz_type',0,'','','','1','2024-02-07 20:34:19','1','2024-02-07 12:36:31',0x00),(1493,31,'调拨入库(作废)','31','erp_stock_record_biz_type',0,'danger','','','1','2024-02-07 20:34:29','1','2024-02-07 20:37:11',0x00),(1494,32,'调拨出库','32','erp_stock_record_biz_type',0,'','','','1','2024-02-07 20:34:38','1','2024-02-07 12:36:33',0x00),(1495,33,'调拨出库(作废)','33','erp_stock_record_biz_type',0,'danger','','','1','2024-02-07 20:34:49','1','2024-02-07 20:37:06',0x00),(1496,40,'盘盈入库','40','erp_stock_record_biz_type',0,'','','','1','2024-02-08 08:53:00','1','2024-02-08 08:53:09',0x00),(1497,41,'盘盈入库(作废)','41','erp_stock_record_biz_type',0,'danger','','','1','2024-02-08 08:53:39','1','2024-02-16 19:40:54',0x00),(1498,42,'盘亏出库','42','erp_stock_record_biz_type',0,'','','','1','2024-02-08 08:54:16','1','2024-02-08 08:54:16',0x00),(1499,43,'盘亏出库(作废)','43','erp_stock_record_biz_type',0,'danger','','','1','2024-02-08 08:54:31','1','2024-02-16 19:40:46',0x00),(1500,50,'销售出库','50','erp_stock_record_biz_type',0,'','','','1','2024-02-11 21:47:25','1','2024-02-11 21:50:40',0x00),(1501,51,'销售出库(作废)','51','erp_stock_record_biz_type',0,'danger','','','1','2024-02-11 21:47:37','1','2024-02-11 21:51:12',0x00),(1502,60,'销售退货入库','60','erp_stock_record_biz_type',0,'','','','1','2024-02-12 06:51:05','1','2024-02-12 06:51:05',0x00),(1503,61,'销售退货入库(作废)','61','erp_stock_record_biz_type',0,'danger','','','1','2024-02-12 06:51:18','1','2024-02-12 06:51:18',0x00),(1504,70,'采购入库','70','erp_stock_record_biz_type',0,'','','','1','2024-02-16 13:10:02','1','2024-02-16 13:10:02',0x00),(1505,71,'采购入库(作废)','71','erp_stock_record_biz_type',0,'danger','','','1','2024-02-16 13:10:10','1','2024-02-16 19:40:40',0x00),(1506,80,'采购退货出库','80','erp_stock_record_biz_type',0,'','','','1','2024-02-16 13:10:17','1','2024-02-16 13:10:17',0x00),(1507,81,'采购退货出库(作废)','81','erp_stock_record_biz_type',0,'danger','','','1','2024-02-16 13:10:26','1','2024-02-16 19:40:33',0x00),(1509,3,'审批不通过','3','bpm_process_instance_status',0,'danger','','','1','2024-03-16 16:12:06','1','2024-03-16 16:12:06',0x00),(1510,4,'已取消','4','bpm_process_instance_status',0,'warning','','','1','2024-03-16 16:12:22','1','2024-03-16 16:12:22',0x00),(1511,5,'已退回','5','bpm_task_status',0,'warning','','','1','2024-03-16 19:10:46','1','2024-03-08 22:41:40',0x00),(1512,6,'委派中','6','bpm_task_status',0,'primary','','','1','2024-03-17 10:06:22','1','2024-03-08 22:41:40',0x00),(1513,7,'审批通过中','7','bpm_task_status',0,'success','','','1','2024-03-17 10:06:47','1','2024-03-08 22:41:41',0x00),(1514,0,'待审批','0','bpm_task_status',0,'info','','','1','2024-03-17 10:07:11','1','2024-03-08 22:41:42',0x00),(1515,35,'发起人自选','35','bpm_task_candidate_strategy',0,'','','','1','2024-03-22 19:45:16','1','2024-03-22 19:45:16',0x00),(1516,1,'执行监听器','execution','bpm_process_listener_type',0,'primary','','','1','2024-03-23 12:54:03','1','2024-03-23 19:14:19',0x00),(1517,1,'任务监听器','task','bpm_process_listener_type',0,'success','','','1','2024-03-23 12:54:13','1','2024-03-23 19:14:24',0x00),(1526,1,'Java ç±»','class','bpm_process_listener_value_type',0,'primary','','','1','2024-03-23 15:08:45','1','2024-03-23 19:14:32',0x00),(1527,2,'表达式','expression','bpm_process_listener_value_type',0,'success','','','1','2024-03-23 15:09:06','1','2024-03-23 19:14:38',0x00),(1528,3,'代理表达式','delegateExpression','bpm_process_listener_value_type',0,'info','','','1','2024-03-23 15:11:23','1','2024-03-23 19:14:41',0x00),(1529,1,'天','1','date_interval',0,'','','','1','2024-03-29 22:50:26','1','2024-03-29 22:50:26',0x00),(1530,2,'周','2','date_interval',0,'','','','1','2024-03-29 22:50:36','1','2024-03-29 22:50:36',0x00),(1531,3,'月','3','date_interval',0,'','','','1','2024-03-29 22:50:46','1','2024-03-29 22:50:54',0x00),(1532,4,'季度','4','date_interval',0,'','','','1','2024-03-29 22:51:01','1','2024-03-29 22:51:01',0x00),(1533,5,'å¹´','5','date_interval',0,'','','','1','2024-03-29 22:51:07','1','2024-03-29 22:51:07',0x00),(1537,1,'OpenAI','OpenAI','ai_platform',0,'','','','1','2024-05-09 22:33:47','1','2024-05-09 22:58:46',0x00),(1538,2,'Ollama','Ollama','ai_platform',0,'','','','1','2024-05-17 23:02:55','1','2024-05-17 23:02:55',0x00),(1539,3,'文心一言','YiYan','ai_platform',0,'','','','1','2024-05-18 09:24:20','1','2024-05-18 09:29:01',0x00),(1540,4,'讯飞星火','XingHuo','ai_platform',0,'','','','1','2024-05-18 10:08:56','1','2024-05-18 10:08:56',0x00),(1541,5,'通义千问','TongYi','ai_platform',0,'','','','1','2024-05-18 10:32:29','1','2024-07-06 15:42:29',0x00),(1542,6,'StableDiffusion','StableDiffusion','ai_platform',0,'','','','1','2024-06-01 15:09:31','1','2024-06-01 15:10:25',0x00),(1543,10,'进行中','10','ai_image_status',0,'primary','','','1','2024-06-26 20:51:41','1','2024-06-26 20:52:48',0x00),(1544,20,'已完成','20','ai_image_status',0,'success','','','1','2024-06-26 20:52:07','1','2024-06-26 20:52:41',0x00),(1545,30,'已失败','30','ai_image_status',0,'warning','','','1','2024-06-26 20:52:25','1','2024-06-26 20:52:35',0x00),(1546,7,'Midjourney','Midjourney','ai_platform',0,'','','','1','2024-06-26 22:14:46','1','2024-06-26 22:14:46',0x00),(1547,10,'进行中','10','ai_music_status',0,'primary','','','1','2024-06-27 22:45:22','1','2024-06-28 00:56:17',0x00),(1548,20,'已完成','20','ai_music_status',0,'success','','','1','2024-06-27 22:45:33','1','2024-06-28 00:56:18',0x00),(1549,30,'已失败','30','ai_music_status',0,'danger','','','1','2024-06-27 22:45:44','1','2024-06-28 00:56:19',0x00),(1550,1,'歌词模式','1','ai_generate_mode',0,'','','','1','2024-06-27 22:46:31','1','2024-06-28 01:22:25',0x00),(1551,2,'描述模式','2','ai_generate_mode',0,'','','','1','2024-06-27 22:46:37','1','2024-06-28 01:22:24',0x00),(1552,8,'Suno','Suno','ai_platform',0,'','','','1','2024-06-29 09:13:36','1','2024-06-29 09:13:41',0x00),(1553,9,'DeepSeek','DeepSeek','ai_platform',0,'','','','1','2024-07-06 12:04:30','1','2024-07-06 12:05:20',0x00),(1554,13,'智谱','ZhiPu','ai_platform',0,'','','','1','2024-07-06 18:00:35','1','2025-02-24 20:18:41',0x00),(1555,4,'长','4','ai_write_length',0,'','','','1','2024-07-07 15:49:03','1','2024-07-07 15:49:03',0x00),(1556,5,'段落','5','ai_write_format',0,'','','','1','2024-07-07 15:49:54','1','2024-07-07 15:49:54',0x00),(1557,6,'文章','6','ai_write_format',0,'','','','1','2024-07-07 15:50:05','1','2024-07-07 15:50:05',0x00),(1558,7,'博客文章','7','ai_write_format',0,'','','','1','2024-07-07 15:50:23','1','2024-07-07 15:50:23',0x00),(1559,8,'想法','8','ai_write_format',0,'','','','1','2024-07-07 15:50:31','1','2024-07-07 15:50:31',0x00),(1560,9,'大纲','9','ai_write_format',0,'','','','1','2024-07-07 15:50:37','1','2024-07-07 15:50:37',0x00),(1561,1,'自动','1','ai_write_tone',0,'','','','1','2024-07-07 15:51:06','1','2024-07-07 15:51:06',0x00),(1562,2,'友善','2','ai_write_tone',0,'','','','1','2024-07-07 15:51:19','1','2024-07-07 15:51:19',0x00),(1563,3,'随意','3','ai_write_tone',0,'','','','1','2024-07-07 15:51:27','1','2024-07-07 15:51:27',0x00),(1564,4,'友好','4','ai_write_tone',0,'','','','1','2024-07-07 15:51:37','1','2024-07-07 15:51:37',0x00),(1565,5,'专业','5','ai_write_tone',0,'','','','1','2024-07-07 15:51:49','1','2024-07-07 15:52:02',0x00),(1566,6,'诙谐','6','ai_write_tone',0,'','','','1','2024-07-07 15:52:15','1','2024-07-07 15:52:15',0x00),(1567,7,'有趣','7','ai_write_tone',0,'','','','1','2024-07-07 15:52:24','1','2024-07-07 15:52:24',0x00),(1568,8,'正式','8','ai_write_tone',0,'','','','1','2024-07-07 15:54:33','1','2024-07-07 15:54:33',0x00),(1570,1,'自动','1','ai_write_format',0,'','','','1','2024-07-07 15:19:34','1','2024-07-07 15:19:34',0x00),(1571,2,'电子邮件','2','ai_write_format',0,'','','','1','2024-07-07 15:19:50','1','2024-07-07 15:49:30',0x00),(1572,3,'消息','3','ai_write_format',0,'','','','1','2024-07-07 15:20:01','1','2024-07-07 15:49:38',0x00),(1573,4,'评论','4','ai_write_format',0,'','','','1','2024-07-07 15:20:13','1','2024-07-07 15:49:45',0x00),(1574,1,'自动','1','ai_write_language',0,'','','','1','2024-07-07 15:44:18','1','2024-07-07 15:44:18',0x00),(1575,2,'中文','2','ai_write_language',0,'','','','1','2024-07-07 15:44:28','1','2024-07-07 15:44:28',0x00),(1576,3,'英文','3','ai_write_language',0,'','','','1','2024-07-07 15:44:37','1','2024-07-07 15:44:37',0x00),(1577,4,'韩语','4','ai_write_language',0,'','','','1','2024-07-07 15:46:28','1','2024-07-07 15:46:28',0x00),(1578,5,'日语','5','ai_write_language',0,'','','','1','2024-07-07 15:46:44','1','2024-07-07 15:46:44',0x00),(1579,1,'自动','1','ai_write_length',0,'','','','1','2024-07-07 15:48:34','1','2024-07-07 15:48:34',0x00),(1580,2,'短','2','ai_write_length',0,'','','','1','2024-07-07 15:48:44','1','2024-07-07 15:48:44',0x00),(1581,3,'中等','3','ai_write_length',0,'','','','1','2024-07-07 15:48:52','1','2024-07-07 15:48:52',0x00),(1584,1,'撰写','1','ai_write_type',0,'','','','1','2024-07-10 21:26:00','1','2024-07-10 21:26:00',0x00),(1585,2,'回复','2','ai_write_type',0,'','','','1','2024-07-10 21:26:06','1','2024-07-10 21:26:06',0x00),(1586,2,'腾讯云','TENCENT','system_sms_channel_code',0,'','','','1','2024-07-22 22:23:16','1','2024-07-22 22:23:16',0x00),(1587,3,'华为云','HUAWEI','system_sms_channel_code',0,'','','','1','2024-07-22 22:23:46','1','2024-07-22 22:23:53',0x00),(1588,1,'OpenAI å¾®è½¯','AzureOpenAI','ai_platform',0,'','','','1','2024-08-10 14:07:41','1','2024-08-10 14:07:41',0x00),(1589,10,'BPMN è®¾è®¡å™¨','10','bpm_model_type',0,'primary','','','1','2024-08-26 15:22:17','1','2024-08-26 16:46:02',0x00),(1590,20,'SIMPLE è®¾è®¡å™¨','20','bpm_model_type',0,'success','','','1','2024-08-26 15:22:27','1','2024-08-26 16:45:58',0x00),(1591,4,'七牛云','QINIU','system_sms_channel_code',0,'','','','1','2024-08-31 08:45:03','1','2024-08-31 08:45:24',0x00),(1592,3,'新人券','3','promotion_coupon_take_type',0,'info','','新人注册后,自动发放','1','2024-09-03 11:57:16','1','2024-09-03 11:57:28',0x00),(1593,5,'微信零钱','5','brokerage_withdraw_type',0,'','','API æ‰“款','1','2024-10-13 11:06:48','1','2025-05-10 08:24:55',0x00),(1683,10,'字节豆包','DouBao','ai_platform',0,'','','','1','2025-02-23 19:51:40','1','2025-02-23 19:52:02',0x00),(1684,11,'腾讯混元','HunYuan','ai_platform',0,'','','','1','2025-02-23 20:58:04','1','2025-02-23 20:58:04',0x00),(1685,12,'硅基流动','SiliconFlow','ai_platform',0,'','','','1','2025-02-24 20:19:09','1','2025-02-24 20:19:09',0x00),(1686,1,'聊天','1','ai_model_type',0,'','','','1','2025-03-03 12:26:34','1','2025-03-03 12:26:34',0x00),(1687,2,'图像','2','ai_model_type',0,'','','','1','2025-03-03 12:27:23','1','2025-03-03 12:27:23',0x00),(1688,3,'音频','3','ai_model_type',0,'','','','1','2025-03-03 12:27:51','1','2025-03-03 12:27:51',0x00),(1689,4,'视频','4','ai_model_type',0,'','','','1','2025-03-03 12:28:03','1','2025-03-03 12:28:03',0x00),(1690,5,'向量','5','ai_model_type',0,'','','','1','2025-03-03 12:28:15','1','2025-03-03 12:28:15',0x00),(1691,6,'重排','6','ai_model_type',0,'','','','1','2025-03-03 12:28:26','1','2025-03-03 12:28:26',0x00),(1692,14,'MiniMax','MiniMax','ai_platform',0,'','','','1','2025-03-11 20:04:51','1','2025-03-11 20:04:51',0x00),(1693,15,'月之暗面','Moonshot','ai_platform',0,'','','','1','2025-03-11 20:05:08','1','2025-11-24 07:17:39',0x00),(2002,0,'直连设备','0','iot_product_device_type',0,'default','','','1','2024-08-10 11:54:58','1','2025-03-17 09:28:22',0x00),(2003,2,'网关设备','2','iot_product_device_type',0,'default','','','1','2024-08-10 11:55:08','1','2025-03-17 09:28:28',0x00),(2004,1,'网关子设备','1','iot_product_device_type',0,'default','','','1','2024-08-10 11:55:20','1','2025-03-17 09:28:31',0x00),(2005,1,'已发布','1','iot_product_status',0,'success','','','1','2024-08-10 12:10:33','1','2025-03-17 09:28:34',0x00),(2006,0,'开发中','0','iot_product_status',0,'default','','','1','2024-08-10 14:19:18','1','2025-03-17 09:28:39',0x00),(2009,0,'Wi-Fi','0','iot_net_type',0,'','','','1','2024-09-06 22:04:47','1','2025-03-17 09:28:47',0x00),(2010,1,'移动网络','1','iot_net_type',0,'','','','1','2024-09-06 22:05:14','1','2025-06-12 23:27:19',0x00),(2011,2,'以太网','2','iot_net_type',0,'','','','1','2024-09-06 22:05:35','1','2025-03-17 09:28:51',0x00),(2012,3,'其他','3','iot_net_type',0,'','','','1','2024-09-06 22:05:52','1','2025-03-17 09:28:54',0x00),(2018,0,'未激活','0','iot_device_state',0,'','','','1','2024-09-21 08:13:34','1','2025-03-17 09:29:09',0x00),(2019,1,'在线','1','iot_device_state',0,'','','','1','2024-09-21 08:13:48','1','2025-03-17 09:29:12',0x00),(2020,2,'离线','2','iot_device_state',0,'','','','1','2024-09-21 08:13:59','1','2025-03-17 09:29:14',0x00),(2021,1,'属性','1','iot_thing_model_type',0,'','','','1','2024-09-29 20:03:01','1','2025-03-17 09:29:24',0x00),(2022,2,'服务','2','iot_thing_model_type',0,'','','','1','2024-09-29 20:03:11','1','2025-03-17 09:29:27',0x00),(2023,3,'事件','3','iot_thing_model_type',0,'','','','1','2024-09-29 20:03:20','1','2025-03-17 09:29:29',0x00),(2030,1,'升每分钟','L/min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:24',0x00),(2031,2,'毫克每千克','mg/kg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:27',0x00),(2032,3,'浊度','NTU','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:31',0x00),(2033,4,'PH值','pH','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:36',0x00),(2034,5,'土壤EC值','dS/m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:34:43',0x00),(2035,6,'太阳总辐射','W/㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:20',0x00),(2036,7,'降雨量','mm/hour','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:24',0x00),(2037,8,'乏','var','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:27',0x00),(2038,9,'厘泊','cP','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:36:33',0x00),(2039,10,'饱和度','aw','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:11',0x00),(2040,11,'个','pcs','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:19',0x00),(2041,12,'厘斯','cst','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:22',0x00),(2042,13,'å·´','bar','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:24',0x00),(2043,14,'纳克每升','ppt','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:27',0x00),(2044,15,'十亿分之一','ppb','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2045,16,'微西每厘米','uS/cm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:34',0x00),(2046,17,'牛顿每库仑','N/C','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:38',0x00),(2047,18,'伏特每米','V/m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:43',0x00),(2048,19,'滴速','ml/min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:46',0x00),(2049,20,'毫米汞柱','mmHg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:48',0x00),(2050,21,'血糖','mmol/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:37:54',0x00),(2051,22,'毫米每秒','mm/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:02',0x00),(2052,23,'转每米','turn/m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2053,24,'次','count','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:09',0x00),(2054,25,'æ¡£','gear','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:11',0x00),(2055,26,'æ­¥','stepCount','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:13',0x00),(2056,27,'标准立方米每小时','Nm3/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:15',0x00),(2057,28,'千伏','kV','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:20',0x00),(2058,29,'千伏安','kVA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:38:24',0x00),(2060,30,'千乏','kVar','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2061,31,'微瓦每平方厘米','uw/cm2','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2062,32,'只','只','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2063,33,'相对湿度','%RH','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2064,34,'立方米每秒','m³/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2065,35,'公斤每秒','kg/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2066,36,'转每分钟','r/min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2067,37,'吨每小时','t/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2068,38,'千卡每小时','KCL/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2069,39,'升每秒','L/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2070,40,'兆帕','MPa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2071,41,'立方米每小时','m³/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2072,42,'千乏时','kvarh','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2073,43,'微克每升','μg/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2074,44,'千卡路里','kcal','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2075,45,'吉字节','GB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2076,46,'兆字节','MB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2077,47,'千字节','KB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2078,48,'字节','B','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2079,49,'微克每平方分米每天','μg/(d㎡·d)','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2080,50,'无','','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2081,51,'百万分率','ppm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2082,52,'像素','pixel','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2083,53,'照度','Lux','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2084,54,'重力加速度','grav','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2085,55,'分贝','dB','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2086,56,'百分比','%','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2087,57,'流明','lm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2088,58,'比特','bit','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2089,59,'克每毫升','g/mL','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2090,60,'克每升','g/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2091,61,'毫克每升','mg/L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2092,62,'微克每立方米','μg/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2093,63,'毫克每立方米','mg/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2094,64,'克每立方米','g/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2095,65,'千克每立方米','kg/m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2096,66,'纳法','nF','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2097,67,'皮法','pF','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2098,68,'微法','μF','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2099,69,'法拉','F','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2100,70,'欧姆','Ω','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2101,71,'微安','μA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2102,72,'毫安','mA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2103,73,'千安','kA','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2104,74,'安培','A','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2105,75,'毫伏','mV','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2106,76,'伏特','V','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2107,77,'毫秒','ms','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2108,78,'秒','s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2109,79,'分钟','min','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2110,80,'小时','h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2111,81,'日','day','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2112,82,'周','week','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2113,83,'月','month','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2114,84,'å¹´','year','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2115,85,'节','kn','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2116,86,'千米每小时','km/h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2117,87,'米每秒','m/s','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2118,88,'角秒','″','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2119,89,'分','′','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2120,90,'度','°','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2121,91,'弧度','rad','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2122,92,'赫兹','Hz','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2123,93,'微瓦','μW','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2124,94,'毫瓦','mW','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2125,95,'千瓦特','kW','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2126,96,'瓦特','W','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2127,97,'卡路里','cal','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2128,98,'千瓦时','kW·h','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2129,99,'瓦时','Wh','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2130,100,'电子伏','eV','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2131,101,'千焦','kJ','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2132,102,'焦耳','J','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2133,103,'华氏度','℉','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2134,104,'开尔文','K','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2135,105,'吨','t','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2136,106,'摄氏度','°C','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2137,107,'毫帕','1e-3Pa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2026-04-05 15:53:29',0x00),(2138,108,'百帕','hPa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2139,109,'千帕','kPa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2140,110,'帕斯卡','Pa','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2141,111,'毫克','mg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2142,112,'克','g','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2143,113,'千克','kg','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2144,114,'牛','N','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2145,115,'毫升','mL','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2146,116,'升','L','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2147,117,'立方毫米','mm³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2148,118,'立方厘米','cm³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2149,119,'立方千米','km³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2150,120,'立方米','m³','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2151,121,'公顷','h㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2152,122,'平方厘米','c㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2153,123,'平方毫米','m㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2154,124,'平方千米','k㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2155,125,'平方米','㎡','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2156,126,'纳米','nm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2157,127,'微米','μm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2158,128,'毫米','mm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2159,129,'厘米','cm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2160,130,'分米','dm','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2161,131,'千米','km','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2162,132,'ç±³','m','iot_thing_model_unit',0,'','','','1','2024-12-13 11:08:41','1','2025-03-17 09:40:46',0x00),(2165,1,'HTTP','1','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:39:54','1','2025-06-24 12:44:47',0x00),(2166,2,'TCP','2','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:40:06','1','2025-06-24 12:44:46',0x00),(2167,3,'WebSocket','3','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:40:24','1','2025-06-24 12:44:45',0x00),(2168,10,'MQTT','10','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:40:37','1','2025-06-24 12:44:44',0x00),(2169,20,'Database','20','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:05','1','2025-06-24 12:44:44',0x00),(2170,21,'Redis Stream','21','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:18','1','2025-06-24 12:44:43',0x00),(2171,30,'RocketMQ','30','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:30','1','2025-06-24 12:44:42',0x00),(2172,31,'RabbitMQ','31','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:47','1','2025-06-24 12:44:41',0x00),(2173,32,'Kafka','32','iot_data_sink_type_enum',0,'default','','','1','2025-03-09 12:41:59','1','2025-06-24 12:44:39',0x00),(2174,1,'设备上下线变更','1','iot_rule_scene_trigger_type_enum',0,'primary','','','1','2025-03-20 15:00:01','\"1\"','2025-07-06 10:28:16',0x00),(2175,2,'物模型属性上报','2','iot_rule_scene_trigger_type_enum',0,'primary','','','1','2025-03-20 15:00:09','\"1\"','2025-07-06 10:28:22',0x00),(2176,1,'设备状态','state','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:24:58','1','2025-03-20 15:24:58',0x00),(2177,2,'设备属性','property','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:09','1','2025-03-20 15:25:09',0x00),(2178,3,'设备事件','event','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:23','1','2025-03-20 15:25:23',0x00),(2179,4,'设备服务','service','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:39','1','2025-03-20 15:25:39',0x00),(2180,5,'设备配置','config','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:25:51','1','2025-03-20 15:25:57',0x00),(2181,6,'设备 OTA','ota','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:26:17','1','2025-03-20 15:26:17',0x00),(2182,7,'设备注册','register','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:26:35','1','2025-03-20 15:26:35',0x00),(2183,8,'设备拓扑','topology','iot_device_message_type_enum',0,'primary','','','1','2025-03-20 15:26:46','1','2025-03-20 15:26:46',0x00),(2184,1,'设备属性设置','1','iot_rule_scene_action_type_enum',0,'primary','','','1','2025-03-28 15:27:12','\"1\"','2025-07-06 10:37:33',0x00),(2185,2,'设备服务调用','2','iot_rule_scene_action_type_enum',0,'primary','','','1','2025-03-28 15:27:25','\"1\"','2025-07-06 10:37:41',0x00),(2186,100,'告警触发','100','iot_rule_scene_action_type_enum',0,'primary','','','1','2025-03-28 15:27:35','\"1\"','2025-07-06 10:37:50',0x00),(3000,16,'百川智能','BaiChuan','ai_platform',0,'','','','1','2025-03-23 12:15:46','1','2025-03-23 12:15:46',0x00),(3001,40,'Vben5.0 Ant Design Schema æ¨¡ç‰ˆ','40','infra_codegen_front_type',0,'','',NULL,'1','2025-04-23 21:47:47','1','2025-09-04 23:25:12',0x00),(3002,6,'支付宝余额','6','brokerage_withdraw_type',0,'','','API æ‰“款','1','2025-05-10 08:24:49','1','2025-05-10 08:24:49',0x00),(3004,3,'WARN','3','iot_alert_level',0,'warning','','','1','2025-06-27 20:32:22','1','2025-06-27 20:34:31',0x00),(3005,1,'INFO','1','iot_alert_level',0,'primary','','','1','2025-06-27 20:33:28','1','2025-06-27 20:34:35',0x00),(3006,5,'ERROR','5','iot_alert_level',0,'danger','','','1','2025-06-27 20:33:50','1','2025-06-27 20:33:50',0x00),(3007,1,'短信','1','iot_alert_receive_type',0,'','','','1','2025-06-27 22:49:30','1','2025-06-27 22:49:30',0x00),(3008,2,'邮箱','2','iot_alert_receive_type',0,'','','','1','2025-06-27 22:49:39','1','2025-06-27 22:50:07',0x00),(3009,3,'站内信','3','iot_alert_receive_type',0,'','','','1','2025-06-27 22:50:20','1','2025-06-27 22:50:20',0x00),(3010,1,'全部设备','1','iot_ota_task_device_scope',0,'','','','1','2025-07-02 09:43:09','1','2025-07-02 09:43:09',0x00),(3011,2,'指定设备','2','iot_ota_task_device_scope',0,'','','','1','2025-07-02 09:43:15','1','2025-07-02 09:43:15',0x00),(3012,10,'进行中','10','iot_ota_task_status',0,'primary','','','1','2025-07-02 09:44:01','\"1\"','2025-07-02 09:44:21',0x00),(3013,20,'已结束','20','iot_ota_task_status',0,'success','','','1','2025-07-02 09:44:14','\"1\"','2025-07-02 23:56:12',0x00),(3014,30,'已取消','30','iot_ota_task_status',0,'danger','','','1','2025-07-02 09:44:36','1','2025-07-02 09:44:36',0x00),(3015,0,'待推送','0','iot_ota_task_record_status',0,'','','','1','2025-07-02 09:45:16','1','2025-07-02 09:45:16',0x00),(3016,10,'已推送','10','iot_ota_task_record_status',0,'','','','1','2025-07-02 09:45:25','1','2025-07-02 09:45:25',0x00),(3017,20,'升级中','20','iot_ota_task_record_status',0,'primary','','','1','2025-07-02 09:45:37','1','2025-07-02 09:45:37',0x00),(3018,30,'升级成功','30','iot_ota_task_record_status',0,'success','','','1','2025-07-02 09:45:47','1','2025-07-02 09:45:47',0x00),(3019,40,'升级失败','40','iot_ota_task_record_status',0,'danger','','','1','2025-07-02 09:46:02','1','2025-07-02 09:46:02',0x00),(3020,50,'升级取消','50','iot_ota_task_record_status',0,'warning','','','1','2025-07-02 09:46:09','\"1\"','2025-07-02 09:46:27',0x00),(3024,3,'设备事件上报','3','iot_rule_scene_trigger_type_enum',0,'','','','1','2025-07-06 10:28:29','1','2025-07-06 10:28:29',0x00),(3025,4,'设备服务调用','4','iot_rule_scene_trigger_type_enum',0,'','','','1','2025-07-06 10:28:35','1','2025-07-06 10:28:35',0x00),(3026,100,'定时触发','100','iot_rule_scene_trigger_type_enum',0,'','','','1','2025-07-06 10:28:48','1','2025-07-06 10:28:48',0x00),(3027,101,'告警恢复','101','iot_rule_scene_action_type_enum',0,'','','','1','2025-07-06 10:37:57','1','2025-07-06 10:37:57',0x00),(3028,2,'Anthropic','Anthropic','ai_platform',0,'','','','1','2025-08-21 22:54:24','1','2025-08-21 22:57:58',0x00),(3029,2,'谷歌 Gemini','Gemini','ai_platform',0,'','','','1','2025-08-22 22:39:35','1','2025-08-22 22:44:49',0x00),(3030,1,'文件系统','filesystem','ai_mcp_client_name',0,'','','','1','2025-08-28 13:58:43','1','2025-08-28 21:19:42',0x00),(3031,41,'Vben5.0 Ant Design æ ‡å‡†æ¨¡ç‰ˆ','41','infra_codegen_front_type',0,'','','','1','2025-09-04 23:26:07','1','2025-09-04 23:26:07',0x00),(3032,50,'Vben5.0 Element Plus Schema æ¨¡ç‰ˆ','50','infra_codegen_front_type',0,'','','','1','2025-09-04 23:26:38','1','2025-09-04 23:26:38',0x00),(3033,51,'Vben5.0 Element Plus æ ‡å‡†æ¨¡ç‰ˆ','51','infra_codegen_front_type',0,'','','','1','2025-09-04 23:26:49','1','2025-09-04 23:26:49',0x00),(3034,1,'ttt','tt','iot_ota_task_record_status',0,'success','',NULL,'1','2025-09-06 00:02:21','1','2025-09-06 00:02:31',0x00),(3035,40,'支付宝小程序','40','system_social_type',0,'','','','1','2023-11-04 13:05:38','1','2023-11-04 13:07:16',0x00),(3036,60,'Admin Uniapp ç§»åŠ¨ç«¯','60','infra_codegen_front_type',0,'','',NULL,'1','2025-12-16 19:25:51','1','2025-12-17 09:46:15',0x00),(3037,42,'Vben5.0 Antdv Next Schema æ¨¡ç‰ˆ','42','infra_codegen_front_type',0,'','','','1','2026-05-23 13:52:25','1','2026-05-23 13:52:25',0x00),(3038,43,'Vben5.0 Antdv Next æ ‡å‡†æ¨¡ç‰ˆ','43','infra_codegen_front_type',0,'','','','1','2026-05-23 13:52:25','1','2026-05-23 13:52:25',0x00),(3040,1,'UDP','udp','iot_protocol_type',0,'','','UDP åè®®','1','2026-02-04 00:32:47','1','2026-02-04 00:32:47',0x00),(3041,2,'WebSocket','websocket','iot_protocol_type',0,'','','WebSocket åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3042,3,'HTTP','http','iot_protocol_type',0,'','','HTTP åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3043,4,'MQTT','mqtt','iot_protocol_type',0,'success','','MQTT åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3044,5,'EMQX','emqx','iot_protocol_type',0,'success','','EMQX åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3045,6,'CoAP','coap','iot_protocol_type',0,'','','CoAP åè®®','1','2026-02-04 00:32:55','1','2026-02-04 00:32:55',0x00),(3046,7,'Modbus TCP Server','modbus_tcp_server','iot_protocol_type',0,'','','Modbus TCP Server åè®®','1','2026-02-04 00:32:55','1','2026-02-12 15:16:45',0x00),(3047,0,'JSON','json','iot_serialize_type',0,'success','','JSON æ ¼å¼','1','2026-02-04 00:33:19','1','2026-02-04 00:33:19',0x00),(3048,1,'二进制','binary','iot_serialize_type',0,'warning','','二进制格式','1','2026-02-04 00:33:19','1','2026-02-04 00:33:19',0x00),(3049,8,'Modbus TCP Client','modbus_tcp_client','iot_protocol_type',0,'','','Modbus TCP Client åè®®','1','2026-02-08 18:29:46','1','2026-02-12 15:16:32',0x00),(3050,2,'边缘采集','2','iot_modbus_mode',0,'success','','设备主动上报数据,无需轮询','1','2025-06-12 22:56:06','1','2026-02-09 13:03:23',0x00),(3051,1,'Modbus TCP','1','iot_modbus_frame_format',0,'default','','MBAP å¤´éƒ¨æ ¼å¼','1','2025-06-12 22:56:06','1','2025-06-12 22:56:06',0x00),(3052,2,'Modbus RTU','2','iot_modbus_frame_format',0,'warning','','CRC16 æ ¡éªŒæ ¼å¼','1','2025-06-12 22:56:06','1','2025-06-12 22:56:06',0x00),(3053,1,'云端轮询','1','iot_modbus_mode',0,'primary','','网关主动轮询读取设备寄存器','1','2025-06-12 22:56:06','1','2025-06-12 22:56:06',0x00),(3054,1,'企业客户','1','mes_client_type',0,'primary','','','1','2026-02-15 14:38:25','1','2026-02-15 14:38:25',0x00),(3055,2,'个人','2','mes_client_type',0,'success','','','1','2026-02-15 14:38:25','1','2026-02-15 14:38:25',0x00),(3056,1,'优质供应商','A','mes_vendor_level',0,'success','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3057,2,'正常','B','mes_vendor_level',0,'primary','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3058,3,'重点关注','C','mes_vendor_level',0,'warning','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3059,4,'劣质供应商','D','mes_vendor_level',0,'danger','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3060,5,'黑名单','E','mes_vendor_level',0,'info','','','1','2026-02-15 15:59:15','1','2026-02-15 15:59:15',0x00),(3061,1,'假期','2','mes_cal_holiday_type',0,'success','','','1','2026-02-16 07:35:58','1','2026-02-16 11:20:42',0x00),(3062,2,'工作日','1','mes_cal_holiday_type',0,'primary','','','1','2026-02-16 07:35:58','1','2026-02-16 11:20:40',0x00),(3063,1,'在库','1','mes_tm_tool_status',0,'success','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3064,2,'领用中','2','mes_tm_tool_status',0,'primary','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3065,3,'维修中','3','mes_tm_tool_status',0,'warning','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3066,4,'报废','4','mes_tm_tool_status',0,'danger','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3067,1,'定期维护','1','mes_tm_mainten_type',0,'primary','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3068,2,'按使用次数维护','2','mes_tm_mainten_type',0,'success','','','1','2026-02-16 11:10:55','1','2026-02-16 11:10:55',0x00),(3069,1,'停机','1','mes_dv_machinery_status',0,'success','','','1','2026-02-17 01:00:06','1','2026-02-17 03:28:27',0x00),(3070,2,'生产中','2','mes_dv_machinery_status',0,'info','','','1','2026-02-17 01:00:06','1','2026-02-17 03:28:33',0x00),(3071,3,'维护中','3','mes_dv_machinery_status',0,'danger','','','1','2026-02-17 01:00:06','1','2026-02-17 03:28:41',0x00),(3072,1,'尺寸','1','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3073,2,'外观','2','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3074,3,'重量','3','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3075,4,'性能','4','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3076,5,'成分','5','mes_indicator_type',0,'','','','1','2026-02-17 02:18:18','1','2026-04-09 14:38:53',0x00),(3077,1,'致命缺陷','1','mes_defect_level',0,'danger','','','1','2026-02-17 02:18:18','1','2026-02-21 12:21:12',0x00),(3078,2,'严重缺陷','2','mes_defect_level',0,'warning','','','1','2026-02-17 02:18:18','1','2026-02-21 12:21:15',0x00),(3079,3,'轻微缺陷','3','mes_defect_level',0,'info','','','1','2026-02-17 02:18:18','1','2026-02-21 12:21:19',0x00),(3080,1,'单白班','1','mes_cal_shift_type',0,'primary','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3081,2,'两班倒','2','mes_cal_shift_type',0,'success','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3082,3,'三班倒','3','mes_cal_shift_type',0,'warning','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3083,1,'按季度','1','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3084,2,'按月','2','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3085,3,'按周','3','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3086,4,'按天','4','mes_cal_shift_method',0,'','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3089,0,'草稿','0','mes_cal_plan_status',0,'info','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3090,1,'已确认','1','mes_cal_plan_status',0,'success','','','1','2026-02-17 03:40:09','1','2026-02-17 03:40:09',0x00),(3100,0,'草稿','0','mes_pro_work_order_status',0,'info','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3101,1,'已确认','1','mes_pro_work_order_status',0,'primary','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3102,2,'已完成','2','mes_pro_work_order_status',0,'success','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3103,3,'已取消','3','mes_pro_work_order_status',0,'warning','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3104,1,'客户订单','1','mes_pro_work_order_source_type',0,'primary','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3105,2,'库存备货','2','mes_pro_work_order_source_type',0,'success','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3106,1,'自行生产','1','mes_pro_work_order_type',0,'primary','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3107,2,'代工','2','mes_pro_work_order_type',0,'warning','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3108,3,'采购','3','mes_pro_work_order_type',0,'info','','','1','2026-02-17 11:43:47','1','2026-02-17 11:43:47',0x00),(3121,1,'IQC(来料检验)','1','mes_qc_type',0,'primary','','来料质量检验','1','2026-02-18 14:12:05','1','2026-02-18 14:12:05',0x00),(3122,2,'IPQC(过程检验)','2','mes_qc_type',0,'warning','','生产制程质量检验','1','2026-02-18 14:12:05','1','2026-03-24 15:21:34',0x00),(3123,3,'OQC(出货检验)','3','mes_qc_type',0,'success','','出货质量检验','1','2026-02-18 14:12:05','1','2026-02-18 14:12:05',0x00),(3124,4,'RQC(退货检验)','4','mes_qc_type',0,'danger','','退货质量检验','1','2026-02-18 14:12:05','1','2026-09-18 18:10:21',0x00),(3125,0,'开始-开始(SS)','0','mes_pro_link_type',0,'default','','前序开始后,后序可以开始','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3126,1,'结束-结束(FF)','1','mes_pro_link_type',0,'default','','前序结束后,后序才能结束','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3127,2,'开始-结束(SF)','2','mes_pro_link_type',0,'default','','前序开始后,后序才能结束','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3128,3,'结束-开始(FS)','3','mes_pro_link_type',0,'default','','前序结束后,后序才能开始','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3129,1,'分钟','MINUTE','mes_time_unit_type',0,'default','','','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3130,2,'小时','HOUR','mes_time_unit_type',0,'default','','','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3131,3,'天','DAY','mes_time_unit_type',0,'default','','','1','2026-02-19 04:24:53','1','2026-02-19 04:24:53',0x00),(3137,1,'设备点检','1','mes_dv_subject_type',0,'info','','','1','2026-02-20 01:42:58','1','2026-02-20 01:42:58',0x00),(3138,2,'设备保养','2','mes_dv_subject_type',0,'success','','','1','2026-02-20 01:42:58','1','2026-02-20 01:42:58',0x00),(3139,1,'待保养','0','mes_mainten_record_status',0,'info','',NULL,'admin','2026-02-20 02:59:55','1','2026-04-16 05:32:37',0x00),(3140,2,'已完成','4','mes_mainten_record_status',0,'success','',NULL,'admin','2026-02-20 02:59:55','1','2026-04-16 05:32:37',0x00),(3141,1,'正常','1','mes_mainten_status',0,'success','',NULL,'admin','2026-02-20 02:59:55','admin','2026-02-20 02:59:55',0x00),(3142,2,'异常','0','mes_mainten_status',0,'danger','',NULL,'admin','2026-02-20 02:59:55','admin','2026-02-20 02:59:55',0x00),(3143,1,'天','1','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3144,2,'周','2','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3145,3,'月','3','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3146,4,'å¹´','4','mes_dv_cycle_type',0,'default','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3147,0,'草稿','0','mes_dv_check_plan_status',0,'info','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3148,1,'已启用','1','mes_dv_check_plan_status',0,'success','','','1','2026-02-20 07:11:43','1','2026-02-20 07:11:43',0x00),(3149,1,'待点检','10','mes_dv_check_record_status',0,'info','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3150,2,'已完成','20','mes_dv_check_record_status',0,'success','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3151,1,'正常','1','mes_dv_check_result',0,'success','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3152,2,'异常','2','mes_dv_check_result',0,'danger','',NULL,'admin','2026-02-20 09:46:19','admin','2026-02-20 09:46:19',0x00),(3157,1,'修复成功','1','mes_dv_repair_result',0,'success','','','1','2026-02-20 10:56:24','1','2026-02-20 10:56:24',0x00),(3158,2,'报废','2','mes_dv_repair_result',0,'danger','','','1','2026-02-20 10:56:24','1','2026-02-20 10:56:24',0x00),(3161,1,'校验通过','1','mes_qc_check_result',0,'success','','','1','2026-02-20 11:23:35','1','2026-02-20 16:15:54',0x00),(3162,2,'校验不通过','2','mes_qc_check_result',0,'danger','','','1','2026-02-20 11:23:35','1','2026-02-20 16:15:52',0x00),(3166,0,'未处置','0','mes_pro_andon_status',0,'danger','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3167,1,'已处置','1','mes_pro_andon_status',0,'success','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3168,1,'一级','1','mes_pro_andon_level',0,'danger','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3169,2,'二级','2','mes_pro_andon_level',0,'warning','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3170,3,'三级','3','mes_pro_andon_level',0,'info','','','1','2026-02-21 00:08:38','1','2026-02-21 00:08:38',0x00),(3171,0,'草稿','0','mes_pro_feedback_status',0,'info','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3172,2,'审批中','2','mes_pro_feedback_status',0,'primary','','','1','2026-02-21 00:50:32','1','2026-03-19 00:51:54',0x00),(3173,3,'待检验','3','mes_pro_feedback_status',0,'warning','','','1','2026-02-21 00:50:32','1','2026-03-19 00:51:54',0x00),(3174,4,'已完成','4','mes_pro_feedback_status',0,'success','','','1','2026-02-21 00:50:32','1','2026-03-19 00:51:54',0x00),(3176,1,'自行报工','1','mes_pro_feedback_type',0,'primary','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3177,2,'统一报工','2','mes_pro_feedback_type',0,'success','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3178,1,'PC','PC','mes_pro_feedback_channel',0,'primary','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3179,2,'APP','APP','mes_pro_feedback_channel',0,'success','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3180,3,'PDA','PDA','mes_pro_feedback_channel',0,'info','','','1','2026-02-21 00:50:32','1','2026-02-21 00:50:32',0x00),(3181,1,'浮点','1','mes_qc_result_type',0,'primary','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3182,2,'整数','2','mes_qc_result_type',0,'success','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3183,3,'文本','3','mes_qc_result_type',0,'info','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3184,4,'字典','4','mes_qc_result_type',0,'warning','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3185,5,'文件','5','mes_qc_result_type',0,'danger','','','1','2026-02-21 13:37:17','1','2026-02-21 13:37:17',0x00),(3186,1,'生产退料','1','mes_rqc_type',0,'default','','生产退料检验','1','2026-02-22 06:44:09','1','2026-02-22 06:44:09',0x00),(3187,2,'销售退货','2','mes_rqc_type',0,'default','','销售退货检验','1','2026-02-22 06:44:09','1','2026-02-22 06:44:09',0x00),(3188,1,'自制工序检验','1','mes_ipqc_type',0,'primary','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3189,2,'首检','2','mes_ipqc_type',0,'success','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3190,3,'巡检','3','mes_ipqc_type',0,'warning','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3191,4,'自检','4','mes_ipqc_type',0,'info','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3192,5,'成品检验','5','mes_ipqc_type',0,'danger','','','1','2026-02-22 07:01:04','1','2026-02-22 07:01:04',0x00),(3205,0,'草稿','0','mes_wm_arrival_notice_status',0,'info','','','1','2026-02-22 14:53:18','1','2026-02-22 14:53:18',0x00),(3206,2,'待质检','2','mes_wm_arrival_notice_status',0,'warning','','','1','2026-02-22 14:53:18','1','2026-02-26 05:24:40',0x00),(3207,3,'待入库','3','mes_wm_arrival_notice_status',0,'success','','','1','2026-02-22 14:53:18','1','2026-02-26 05:24:47',0x00),(3208,4,'已完成','4','mes_wm_arrival_notice_status',0,'primary','','','1','2026-02-22 14:53:18','1','2026-02-26 05:24:52',0x00),(3209,0,'草稿','0','mes_wm_item_receipt_status',0,'info','','','1','2026-02-22 14:54:05','1','2026-02-22 14:54:05',0x00),(3210,1,'待上架','2','mes_wm_item_receipt_status',0,'warning','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:35',0x00),(3211,2,'待执行入库','3','mes_wm_item_receipt_status',0,'success','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:31',0x00),(3212,3,'已完成','4','mes_wm_item_receipt_status',0,'primary','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:20',0x00),(3213,4,'已取消','5','mes_wm_item_receipt_status',0,'danger','','','1','2026-02-22 14:54:05','1','2026-02-26 08:03:24',0x00),(3214,1,'草稿','0','mes_order_status',0,'info','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3215,2,'已确认','1','mes_order_status',0,'primary','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3216,3,'审批中','2','mes_order_status',0,'warning','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3217,4,'已审批','3','mes_order_status',0,'success','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3218,5,'已完成','4','mes_order_status',0,'success','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3219,6,'已取消','5','mes_order_status',0,'danger','','','1','2026-02-23 21:16:03','1','2026-02-23 21:16:03',0x00),(3220,1,'草稿','0','mes_wm_issue_status',0,'info','','草稿状态,未完成','1','2026-02-26 15:54:25','1','2026-02-26 15:54:25',0x00),(3221,2,'已完成','4','mes_wm_issue_status',0,'success','','已完成出库','1','2026-02-26 15:54:25','1','2026-02-26 15:54:25',0x00),(3222,1,'草稿','0','mes_wm_product_issue_status',0,'info','','草稿状态,可编辑','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3223,2,'待拣货','2','mes_wm_product_issue_status',0,'warning','','审批中,可执行拣货','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3224,3,'待执行领出','3','mes_wm_product_issue_status',0,'primary','','已审批,拣货完成','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3225,4,'已完成','4','mes_wm_product_issue_status',0,'success','','已完成出库','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3226,5,'已取消','5','mes_wm_product_issue_status',0,'success','','已完成出库','1','2026-02-26 16:39:12','1','2026-03-23 13:18:02',0x00),(3232,1,'草稿','0','mes_wm_return_issue_status',0,'info','','草稿状态,可编辑','1','2026-02-28 14:11:12','1','2026-02-28 14:28:24',0x00),(3233,2,'待检验','1','mes_wm_return_issue_status',0,'default','','已确认,等待质检','1','2026-02-28 14:11:12','1','2026-02-28 14:28:28',0x00),(3234,3,'待上架','2','mes_wm_return_issue_status',0,'warning','','检验完成,等待仓库上架','1','2026-02-28 14:11:12','1','2026-02-28 14:28:31',0x00),(3235,4,'待执行退料','3','mes_wm_return_issue_status',0,'primary','','上架完成,等待执行退料操作','1','2026-02-28 14:11:12','1','2026-02-28 14:28:34',0x00),(3236,5,'已完成','4','mes_wm_return_issue_status',0,'success','','退料执行完成,库存已更新','1','2026-02-28 14:11:12','1','2026-02-28 14:28:37',0x00),(3237,6,'已取消','5','mes_wm_return_issue_status',0,'danger','','已取消','1','2026-02-28 14:11:12','1','2026-02-28 14:28:40',0x00),(3238,1,'余料退料','1','mes_wm_return_issue_type',0,'success','','余料退回,直接合格','1','2026-02-28 14:11:12','1','2026-02-28 14:27:47',0x00),(3239,2,'不良退料','2','mes_wm_return_issue_type',0,'danger','','不良品退回','1','2026-02-28 14:11:12','1','2026-02-28 14:27:49',0x00),(3240,3,'其他退料','3','mes_wm_return_issue_type',0,'info','','其他原因退料','1','2026-02-28 14:11:12','1','2026-02-28 14:27:55',0x00),(3241,1,'待检','0','mes_wm_quality_status',0,'warning','','待检状态','1','2026-02-28 15:00:53','1','2026-02-28 15:00:53',0x00),(3242,2,'合格','1','mes_wm_quality_status',0,'success','','合格状态','1','2026-02-28 15:00:53','1','2026-02-28 15:00:53',0x00),(3243,3,'不合格','2','mes_wm_quality_status',0,'danger','','不合格状态','1','2026-02-28 15:00:53','1','2026-02-28 15:00:53',0x00),(3244,1,'草稿','0','mes_wm_product_receipt_status',0,'info','','草稿状态','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3245,2,'待上架','2','mes_wm_product_receipt_status',0,'primary','','待上架','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3246,3,'待执行入库','3','mes_wm_product_receipt_status',0,'warning','','待执行入库','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3247,4,'已完成','4','mes_wm_product_receipt_status',0,'success','','已完成','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3248,5,'已取消','5','mes_wm_product_receipt_status',0,'danger','','已取消','1','2026-03-01 06:03:07','1','2026-03-01 06:03:07',0x00),(3252,1,'草稿','0','mes_wm_product_sales_status',0,'info','','草稿状态','1','2026-03-02 08:55:11','1','2026-03-02 08:55:11',0x00),(3253,3,'待拣货','2','mes_wm_product_sales_status',0,'warning','','待拣货状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3254,4,'待出库','3','mes_wm_product_sales_status',0,'primary','','待出库状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3255,5,'已完成','4','mes_wm_product_sales_status',0,'success','','已完成状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3256,6,'已取消','5','mes_wm_product_sales_status',0,'danger','','已取消状态','1','2026-03-02 08:55:11','1','2026-03-27 11:44:48',0x00),(3272,1,'草稿','0','mes_wm_misc_receipt_status',0,'info','','草稿状态','1','2026-03-03 07:33:41','1','2026-03-03 07:33:41',0x00),(3273,2,'待执行入库','3','mes_wm_misc_receipt_status',0,'primary','','待执行入库状态','1','2026-03-03 07:33:41','1','2026-03-03 07:37:34',0x00),(3274,3,'已完成','4','mes_wm_misc_receipt_status',0,'success','','已完成状态','1','2026-03-03 07:33:41','1','2026-03-03 07:33:41',0x00),(3275,4,'已取消','5','mes_wm_misc_receipt_status',0,'danger','','已取消状态','1','2026-03-03 07:33:41','1','2026-03-03 07:33:41',0x00),(3277,1,'库存调整','1','mes_wm_misc_receipt_type',0,'primary','','库存调整入库','1','2026-03-03 07:34:33','1','2026-03-03 07:34:33',0x00),(3278,1,'库存调整','1','mes_wm_misc_issue_type',0,'primary','','库存调整出库','1','2026-03-03 07:34:33','1','2026-03-03 07:34:33',0x00),(3279,2,'报废出库','2','mes_wm_misc_issue_type',0,'danger','','报废出库','1','2026-03-03 07:36:13','1','2026-03-03 07:36:13',0x00),(3280,1,'草稿','0','mes_wm_outsource_receipt_status',0,'info','','草稿状态','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3281,2,'待检验','1','mes_wm_outsource_receipt_status',0,'warning','','已确认,等待质检','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3282,3,'待上架','2','mes_wm_outsource_receipt_status',0,'primary','','检验完成,等待仓库上架','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3283,4,'待执行入库','3','mes_wm_outsource_receipt_status',0,'warning','','上架完成,等待执行入库操作','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3284,5,'已完成','4','mes_wm_outsource_receipt_status',0,'success','','入库执行完成,库存已更新','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3285,6,'已取消','5','mes_wm_outsource_receipt_status',0,'danger','','已取消','1','2026-03-03 14:03:57','1','2026-03-03 14:03:57',0x00),(3286,1,'草稿','0','mes_wm_outsource_issue_status',0,'info','','草稿状态,可编辑、删除、执行出库','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3287,2,'待拣货','2','mes_wm_outsource_issue_status',0,'warning','','待拣货状态','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3288,3,'待执行出库','3','mes_wm_outsource_issue_status',0,'primary','','待执行出库状态','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3289,4,'已完成','4','mes_wm_outsource_issue_status',0,'success','','已完成,库存已扣减','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3290,5,'已取消','5','mes_wm_outsource_issue_status',0,'danger','','已取消状态','1','2026-03-03 16:31:00','1','2026-03-03 16:31:00',0x00),(3301,1,'输入字符','1','mes_md_auto_code_part_type',0,'default','','输入字符','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3302,2,'当前日期','2','mes_md_auto_code_part_type',0,'primary','','当前日期时间','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3303,3,'固定字符','3','mes_md_auto_code_part_type',0,'success','','固定字符','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3304,4,'流水号','4','mes_md_auto_code_part_type',0,'warning','','流水号','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3305,1,'左补齐','1','mes_md_auto_code_padded_method',0,'primary','','左补齐','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3306,2,'右补齐','2','mes_md_auto_code_padded_method',0,'success','','右补齐','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3307,1,'按年','1','mes_md_auto_code_cycle_method',0,'default','','按年循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3308,2,'按月','2','mes_md_auto_code_cycle_method',0,'primary','','按月循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3309,3,'按天','3','mes_md_auto_code_cycle_method',0,'success','','按天循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3310,4,'按小时','4','mes_md_auto_code_cycle_method',0,'warning','','按小时循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3311,5,'按分钟','5','mes_md_auto_code_cycle_method',0,'danger','','按分钟循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3312,10,'按传入字符','10','mes_md_auto_code_cycle_method',0,'info','','按传入字符循环','1','2026-03-04 14:46:22','1','2026-03-04 15:24:40',0x00),(3313,1,'二维码','1','mes_wm_barcode_format',0,'primary','','QR_CODE','1','2026-03-05 14:37:20','1','2026-03-06 13:18:21',0x00),(3314,2,'EAN13 å•†å“æ¡ç ','2','mes_wm_barcode_format',0,'success','','EAN13','1','2026-03-05 14:37:20','1','2026-03-06 13:18:23',0x00),(3315,3,'CODE39 å·¥ä¸šæ¡ç ','3','mes_wm_barcode_format',0,'info','','CODE39','1','2026-03-05 14:37:20','1','2026-03-06 13:18:25',0x00),(3316,4,'UPC-A ç¾Žå›½å•†å“ç ','4','mes_wm_barcode_format',0,'warning','','UPC_A','1','2026-03-05 14:37:20','1','2026-03-06 13:18:28',0x00),(3318,3,'库位','104','mes_wm_barcode_biz_type',0,'default','','AREA','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3319,4,'装箱单','105','mes_wm_barcode_biz_type',0,'default','','PACKAGE','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3320,5,'库存','106','mes_wm_barcode_biz_type',0,'default','','STOCK','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3321,6,'批次','107','mes_wm_barcode_biz_type',0,'default','','BATCH','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3322,7,'流转卡','300','mes_wm_barcode_biz_type',0,'primary','','PROCARD','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3323,8,'工单','301','mes_wm_barcode_biz_type',0,'primary','','WORKORDER','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3324,9,'流转单','302','mes_wm_barcode_biz_type',0,'primary','','TRANSORDER','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3325,10,'设备','400','mes_wm_barcode_biz_type',0,'success','','MACHINERY','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3327,12,'产品物料','600','mes_wm_barcode_biz_type',0,'info','','ITEM','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3328,13,'供应商','601','mes_wm_barcode_biz_type',0,'info','','VENDOR','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3329,14,'工作站','602','mes_wm_barcode_biz_type',0,'info','','WORKSTATION','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3330,15,'车间','603','mes_wm_barcode_biz_type',0,'info','','WORKSHOP','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3331,16,'人员','604','mes_wm_barcode_biz_type',0,'info','','USER','1','2026-03-05 14:37:20','1','2026-03-07 06:25:19',0x00),(3351,1,'仓库','102','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:25:19',0x00),(3352,2,'库区','103','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:25:19',0x00),(3353,11,'工具','500','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:22:27',0x00),(3354,17,'客户','605','mes_wm_barcode_biz_type',0,'','',NULL,'','2026-03-07 06:22:27','','2026-03-07 06:25:19',0x00),(3355,1,'草稿','0','mes_wm_package_status',0,'info','','草稿状态,可编辑','1','2026-03-08 02:05:46','1','2026-03-08 02:05:46',0x00),(3356,2,'已完成','4','mes_wm_package_status',0,'success','','装箱已完成','1','2026-03-08 02:05:46','1','2026-03-08 02:05:46',0x00),(3357,1,'草稿','0','mes_wm_transfer_status',0,'info','','草稿状态,可编辑','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3358,2,'待确认','1','mes_wm_transfer_status',0,'warning','','外部调拨待确认到货','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3359,3,'待上架','2','mes_wm_transfer_status',0,'primary','','待维护目标库位明细','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3360,4,'待执行','3','mes_wm_transfer_status',0,'success','','目标库位已分配,待执行调拨','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3361,5,'已完成','4','mes_wm_transfer_status',0,'success','','调拨已完成','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3362,6,'已取消','5','mes_wm_transfer_status',0,'danger','','调拨已取消','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3363,1,'内部调拨','1','mes_wm_transfer_type',0,'success','','内部仓储调拨','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3364,2,'外部调拨','2','mes_wm_transfer_type',0,'warning','','外部配送/外部收货调拨','1','2026-03-08 11:55:25','1','2026-03-08 11:55:25',0x00),(3365,1,'静态盘点','1','mes_wm_stock_taking_type',0,'primary','','静态盘点','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3366,2,'动态盘点','2','mes_wm_stock_taking_type',0,'success','','动态盘点','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3367,1,'仓库','102','mes_wm_stock_taking_plan_param_type',0,'primary','','按仓库盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3368,2,'库区','103','mes_wm_stock_taking_plan_param_type',0,'success','','按库区盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3369,3,'库位','104','mes_wm_stock_taking_plan_param_type',0,'info','','按库位盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3370,4,'物料','600','mes_wm_stock_taking_plan_param_type',0,'warning','','按物料盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3371,5,'批次','107','mes_wm_stock_taking_plan_param_type',0,'danger','','按批次盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3372,1,'草稿','0','mes_wm_stock_taking_task_status',0,'info','','草稿','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3373,2,'审批中','2','mes_wm_stock_taking_task_status',0,'primary','','盘点任务审批中','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3374,3,'已完成','4','mes_wm_stock_taking_task_status',0,'success','','已完成','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3375,4,'已取消','5','mes_wm_stock_taking_task_status',0,'danger','','已取消','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3377,1,'正常','1','mes_wm_stock_taking_task_line_status',0,'success','','正常','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3378,2,'盘盈','2','mes_wm_stock_taking_task_line_status',0,'primary','','盘盈','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3379,3,'盘亏','3','mes_wm_stock_taking_task_line_status',0,'danger','','盘亏','1','2026-03-09 00:00:00','1','2026-04-05 15:02:18',0x00),(3380,6,'质量状态','900','mes_wm_stock_taking_plan_param_type',0,'default','','按质量状态盘点','1','2026-03-09 00:00:00','1','2026-03-09 00:00:00',0x00),(3381,1,'物料','ITEM','mes_md_item_or_product',0,'info','','','1','2026-03-15 01:55:06','1','2026-03-15 01:55:06',0x00),(3382,2,'产品','PRODUCT','mes_md_item_or_product',0,'success','','','1','2026-03-15 01:55:06','1','2026-03-15 01:55:06',0x00),(3383,1,'草稿','0','mes_wm_item_consume_status',0,'info','','草稿状态','1','2026-03-19 15:06:23','1','2026-03-19 15:06:23',0x00),(3384,2,'已完成','4','mes_wm_item_consume_status',0,'success','','已完成','1','2026-03-19 15:06:23','1','2026-03-19 15:06:23',0x00),(3385,1,'到货通知单','100','mes_qc_source_doc_type',0,'primary','','IQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3386,2,'外协入库单','121','mes_qc_source_doc_type',0,'warning','','IQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3387,3,'生产报工','304','mes_qc_source_doc_type',0,'success','','IPQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3388,4,'销售出库单','118','mes_qc_source_doc_type',0,'info','','OQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3389,5,'生产退料单','116','mes_qc_source_doc_type',0,'danger','','RQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3390,6,'销售退货单','119','mes_qc_source_doc_type',0,'default','','RQC','1','2026-03-26 13:01:09','1','2026-03-26 13:01:09',0x00),(3397,2,'待检测','1','mes_wm_product_sales_status',0,'warning','','OQC æ£€éªŒä¸­','1','2026-03-27 11:44:48','1','2026-03-27 11:44:48',0x00),(3398,0,'草稿','0','mes_wm_return_vendor_status',0,'info','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3399,1,'待拣货','2','mes_wm_return_vendor_status',0,'primary','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3400,2,'待执行退货','3','mes_wm_return_vendor_status',0,'warning','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3401,3,'已完成','4','mes_wm_return_vendor_status',0,'success','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3402,4,'已取消','5','mes_wm_return_vendor_status',0,'danger','',NULL,'','2026-03-29 13:49:57','','2026-04-05 15:53:46',0x00),(3403,1,'草稿','0','mes_wm_sales_notice_status',0,'info','','草稿状态,可以修改和删除','1','2026-03-30 08:54:30','1','2026-04-05 15:53:46',0x00),(3404,2,'待出库','3','mes_wm_sales_notice_status',0,'success','','已提交状态,不可修改和删除','1','2026-03-30 08:54:30','1','2026-04-05 15:53:46',0x00),(3405,3,'已完成','4','mes_wm_sales_notice_status',0,'','',NULL,'1','2026-03-30 10:02:10','1','2026-04-05 15:53:46',0x00),(3406,1,'草稿','0','mes_wm_misc_issue_status',0,'info','','草稿状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3407,2,'待出库','3','mes_wm_misc_issue_status',0,'warning','','待出库状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3408,3,'已完成','4','mes_wm_misc_issue_status',0,'success','','执行出库后的状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3409,4,'已取消','5','mes_wm_misc_issue_status',0,'danger','','已取消状态','1','2026-03-30 15:00:18','1','2026-03-30 15:00:18',0x00),(3415,1,'注塑','1','mes_cal_calendar_type',0,'primary','','','1','2026-04-01 15:23:14','1','2026-04-01 16:08:31',0x00),(3416,2,'投料工','2','mes_cal_calendar_type',0,'success','','','1','2026-04-01 15:23:14','1','2026-08-25 16:35:23',0x00),(3417,3,'组装','3','mes_cal_calendar_type',0,'warning','','','1','2026-04-01 15:23:14','1','2026-04-01 16:08:33',0x00),(3418,4,'仓库','4','mes_cal_calendar_type',0,'danger','','','1','2026-04-01 15:23:14','1','2026-04-01 16:08:34',0x00),(3419,0,'草稿','0','mes_dv_repair_status',0,'info','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3420,1,'维修中','1','mes_dv_repair_status',0,'primary','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3421,2,'待验收','2','mes_dv_repair_status',0,'warning','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3422,3,'已确认','4','mes_dv_repair_status',0,'success','','','1','2026-04-03 17:20:23','1','2026-04-03 17:20:23',0x00),(3423,0,'草稿','0','mes_wm_return_sales_status',0,'info','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3424,1,'待检验','1','mes_wm_return_sales_status',0,'warning','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3425,2,'待执行','2','mes_wm_return_sales_status',0,'warning','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3426,3,'待上架','3','mes_wm_return_sales_status',0,'primary','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3427,4,'已完成','4','mes_wm_return_sales_status',0,'success','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3428,5,'已取消','5','mes_wm_return_sales_status',0,'danger','','','1','2026-04-03 17:20:25','1','2026-04-03 17:20:25',0x00),(3436,1,'上工','1','mes_pro_work_record_type',0,'success','','','1','2026-04-05 14:07:27','1','2026-04-05 14:07:27',0x00),(3437,2,'下工','2','mes_pro_work_record_type',0,'danger','','','1','2026-04-05 14:07:27','1','2026-04-05 14:07:27',0x00),(3443,1,'草稿','0','mes_wm_product_produce_status',0,'info','','草稿状态','1','2026-04-05 15:53:46','1','2026-04-05 15:53:46',0x00),(3444,2,'已完成','4','mes_wm_product_produce_status',0,'success','','已完成状态','1','2026-04-05 15:53:46','1','2026-04-05 15:53:46',0x00),(3445,3,'已取消','5','mes_wm_product_produce_status',0,'danger','','已取消状态','1','2026-04-05 15:53:46','1','2026-04-05 15:53:46',0x00),(3446,0,'草稿','0','mes_pro_task_status',0,'default','','PREPARE','1','2026-04-16 09:47:00','1','2026-06-13 10:32:58',0x00),(3447,4,'已完成','4','mes_pro_task_status',0,'success','','FINISHED','1','2026-04-16 09:47:00','1','2026-07-22 08:00:26',0x00),(3448,2,'已取消','5','mes_pro_task_status',0,'danger','','CANCELED','1','2026-04-16 09:47:00','1','2026-06-13 10:32:58',0x00),(3525,1,'正常','0','im_message_status',0,'success','','正常(初始状态)','admin','2026-04-30 15:14:36','admin','2026-06-16 03:41:55',0x00),(3526,2,'已撤回','2','im_message_status',0,'danger','','已撤回','admin','2026-04-30 15:14:36','admin','2026-06-16 03:41:55',0x00),(3530,1,'不需要回执','0','im_message_receipt_status',0,'info','','NO_RECEIPT','admin','2026-04-30 11:35:07','admin','2026-06-14 00:32:47',0x00),(3531,2,'待完成','1','im_message_receipt_status',0,'warning','','PENDING','admin','2026-04-30 11:35:07','admin','2026-06-14 00:32:47',0x00),(3532,3,'已完成','2','im_message_receipt_status',0,'success','','DONE','admin','2026-04-30 11:35:07','admin','2026-06-14 00:32:47',0x00),(3540,1,'正常','0','im_friend_status',0,'success','','正常好友关系','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3541,2,'已删除','1','im_friend_status',0,'danger','','已删除好友关系','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3550,1,'正常','0','im_group_status',0,'success','','群正常','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3551,2,'已解散','1','im_group_status',0,'info','','群已解散','admin','2026-04-30 11:35:07','admin','2026-04-30 11:35:07',0x00),(3552,1,'群主','1','im_group_member_role',0,'primary','',NULL,'1','2026-05-02 02:14:12','1','2026-05-02 02:14:12',0x00),(3553,2,'管理员','2','im_group_member_role',0,'warning','',NULL,'1','2026-05-02 02:14:12','1','2026-05-02 02:14:12',0x00),(3554,3,'普通成员','3','im_group_member_role',0,'info','',NULL,'1','2026-05-02 02:14:12','1','2026-05-02 02:14:12',0x00),(3555,1,'搜索','1','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:57',0x00),(3556,2,'群聊','2','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:53',0x00),(3557,3,'扫码','3','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:50',0x00),(3558,4,'名片','4','im_friend_add_source',0,'default','',NULL,'1','2026-05-04 02:43:41','1','2026-05-05 11:46:48',0x00),(3559,1,'等待验证','0','im_friend_request_handle_result',0,'warning','',NULL,'1','2026-05-04 02:43:41','1','2026-05-04 02:43:41',0x00),(3560,2,'已添加','1','im_friend_request_handle_result',0,'success','',NULL,'1','2026-05-04 02:43:41','1','2026-05-04 02:43:41',0x00),(3561,3,'已拒绝','2','im_friend_request_handle_result',0,'info','',NULL,'1','2026-05-04 02:43:41','1','2026-05-04 02:43:41',0x00),(3562,101,'文本','101','im_content_type',0,'','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3563,102,'图片','102','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3564,103,'语音','103','im_content_type',0,'warning','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3565,104,'视频','104','im_content_type',0,'warning','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3566,105,'文件','105','im_content_type',0,'info','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3568,2101,'撤回','2101','im_content_type',0,'danger','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3569,2200,'回执','2200','im_content_type',0,'warning','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3570,2201,'已读','2201','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3571,1501,'群创建','1501','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3572,1502,'群信息变更','1502','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3573,1503,'收到新的入群申请','1503','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:47:00',0x00),(3574,1504,'成员退群','1504','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3575,1505,'入群申请被同意','1505','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:47:00',0x00),(3576,1506,'入群申请被拒绝','1506','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:47:00',0x00),(3577,1507,'群主转让','1507','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3578,1508,'成员被移出','1508','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3579,1509,'成员加入','1509','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3580,1510,'自由进群','1510','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3581,1511,'群解散','1511','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3582,1512,'成员禁言','1512','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3583,1513,'成员取消禁言','1513','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3584,1514,'全群禁言','1514','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3585,1515,'全群取消禁言','1515','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3586,1516,'成员昵称变更','1516','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3587,1517,'添加管理员','1517','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3588,1518,'撤销管理员','1518','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3589,1519,'群公告变更','1519','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3590,1520,'群名变更','1520','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3591,1531,'群消息置顶','1531','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3592,1532,'群消息取消置顶','1532','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3593,1533,'群封禁变更','1533','im_content_type',0,'success','',NULL,'admin','2026-05-05 11:52:30','admin','2026-06-16 03:41:55',0x00),(3594,1204,'新增好友','1204','im_content_type',0,'success','',NULL,'admin','2026-05-05 13:26:53','admin','2026-06-16 03:41:55',0x00),(3595,1205,'好友被删除','1205','im_content_type',0,'warning','',NULL,'admin','2026-05-05 13:26:53','admin','2026-06-16 03:41:55',0x00),(3596,1,'搜索','1','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3597,2,'邀请','2','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3598,3,'扫码','3','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3599,4,'分享链接','4','im_group_add_source',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3600,1,'未处理','0','im_group_request_handle_result',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3601,2,'同意','1','im_group_request_handle_result',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(3602,3,'拒绝','2','im_group_request_handle_result',0,'','',NULL,'','2026-05-06 09:26:36','','2026-05-06 09:26:36',0x00),(1061051,1,'客户','1','merchant_type',0,'primary','','客户','1','2026-05-10 15:26:09','1','2026-05-10 15:26:09',0x00),(1061052,2,'供应商','2','merchant_type',0,'success','','供应商','1','2026-05-10 15:26:09','1','2026-05-10 15:26:09',0x00),(1061053,3,'客户/供应商','3','merchant_type',0,'warning','','客户/供应商','1','2026-05-10 15:26:09','1','2026-05-10 15:26:09',0x00),(1061061,1,'入库单','1','wms_order_type',0,'success','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061062,2,'出库单','2','wms_order_type',0,'danger','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061063,3,'移库单','3','wms_order_type',0,'primary','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061064,4,'盘库单','4','wms_order_type',0,'warning','','','1','2026-05-10 17:51:46','1','2026-05-14 08:14:09',0x00),(1061071,1,'草稿','0','wms_order_status',0,'info','','草稿','1','2026-05-12 13:40:29','1','2026-05-12 13:40:29',0x00),(1061072,2,'已完成','4','wms_order_status',0,'success','','已完成','1','2026-05-12 13:40:29','1','2026-05-12 13:40:29',0x00),(1061073,3,'已作废','5','wms_order_status',0,'danger','','已作废','1','2026-05-12 13:40:29','1','2026-05-12 13:40:29',0x00),(1061081,1,'生产入库','100','wms_receipt_order_type',0,'success','','','1','2026-05-11 11:21:49','1','2026-05-14 02:21:20',0x00),(1061082,2,'采购入库','101','wms_receipt_order_type',0,'primary','','','1','2026-05-11 11:21:49','1','2026-05-14 02:21:20',0x00),(1061083,3,'退货入库','102','wms_receipt_order_type',0,'warning','','','1','2026-05-11 11:21:49','1','2026-05-14 02:21:20',0x00),(1061084,4,'归还入库','103','wms_receipt_order_type',0,'info','','','1','2026-05-13 16:02:33','1','2026-05-14 02:21:20',0x00),(1061091,1,'退货出库','200','wms_shipment_order_type',0,'warning','','退货出库','1','2026-05-12 17:48:35','1','2026-05-12 17:48:35',0x00),(1061092,2,'销售出库','201','wms_shipment_order_type',0,'primary','','销售出库','1','2026-05-12 17:48:35','1','2026-05-12 17:48:35',0x00),(1061093,3,'生产出库','202','wms_shipment_order_type',0,'success','','生产出库','1','2026-05-12 17:48:35','1','2026-05-12 17:48:35',0x00),(1061096,1,'语音','1','im_rtc_call_media_type',0,'','','语音通话','admin','2026-05-16 11:34:50','admin','2026-05-16 11:34:50',0x00),(1061097,2,'视频','2','im_rtc_call_media_type',0,'','','视频通话','admin','2026-05-16 11:34:50','admin','2026-05-16 11:34:50',0x00),(1061098,1,'私聊','1','im_rtc_call_conversation_type',0,'primary','','一对一私聊通话','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061099,2,'群聊','2','im_rtc_call_conversation_type',0,'success','','群内多人通话','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061100,1,'创建','10','im_rtc_call_status',0,'info','','通话已创建,等待接通','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061101,2,'进行中','20','im_rtc_call_status',0,'primary','','已有人接通,通话中','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061102,3,'已结束','30','im_rtc_call_status',0,'success','','通话结束','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061103,1,'通话结束','1','im_rtc_call_end_reason',0,'success','','接通后任一方主动挂断','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061104,2,'已拒绝','2','im_rtc_call_end_reason',0,'warning','','被叫接通前点拒接','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061105,3,'已取消','3','im_rtc_call_end_reason',0,'info','','主叫接通前主动取消','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061106,4,'无人接听','4','im_rtc_call_end_reason',0,'info','','振铃超时未接通','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061107,5,'对方正忙','5','im_rtc_call_end_reason',0,'warning','','对方在另一通话中','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061108,6,'通话异常','9','im_rtc_call_end_reason',0,'danger','','网络中断、设备失败等','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061109,1,'发起人','1','im_rtc_participant_role',0,'primary','','通话发起者','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061110,2,'被邀请者','2','im_rtc_participant_role',0,'info','','被邀请加入','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061111,3,'主动加入者','3','im_rtc_participant_role',0,'success','','群通话场景,旁观者主动加入','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061112,1,'邀请中','10','im_rtc_participant_status',0,'info','','已发出 invite,等待响应','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061113,2,'已加入','20','im_rtc_participant_status',0,'primary','','已接通并进入房间','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061114,3,'已拒绝','30','im_rtc_participant_status',0,'warning','','接通前点拒接','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061115,4,'未应答','40','im_rtc_participant_status',0,'info','','通话已结束仍未应答','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061116,5,'已离开','50','im_rtc_participant_status',0,'success','','接通后挂断 / ç¦»å¼€','admin','2026-05-18 03:36:12','admin','2026-05-18 03:36:12',0x00),(1061117,1610,'通话开始','1610','im_content_type',0,'info','','入消息流;私聊定向通知,群聊全员广播','admin','2026-05-18 03:36:12','admin','2026-06-16 03:41:55',0x00),(1061118,1611,'通话结束','1611','im_content_type',0,'info','','入消息流;私聊准气泡,群聊系统 tip','admin','2026-05-18 03:36:12','admin','2026-06-16 03:41:55',0x00),(1061119,125,'素材','125','im_content_type',0,'success','','频道运营推送的图文卡片消息','1','2026-05-18 13:14:34','admin','2026-06-16 03:41:55',0x00),(1061120,1,'富文本','1','im_channel_material_type',0,'primary','','','1','2026-05-19 14:09:25','1','2026-05-19 14:09:25',0x00),(1061121,2,'外链','2','im_channel_material_type',0,'info','','','1','2026-05-19 14:09:25','1','2026-05-19 14:09:25',0x00),(1061122,7,'SN ç ','109','mes_wm_barcode_biz_type',0,'default','','SN','1','2026-06-13 10:30:30','1','2026-06-13 10:30:30',0x00),(1061123,107,'合并转发','107','im_content_type',0,'','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061124,108,'名片','108','im_content_type',0,'','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061125,115,'表情','115','im_content_type',0,'','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061126,1201,'好友申请被同意','1201','im_content_type',0,'success','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061127,1202,'好友申请被拒绝','1202','im_content_type',0,'warning','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061128,1203,'收到新的好友申请','1203','im_content_type',0,'success','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061129,1207,'加入黑名单','1207','im_content_type',0,'danger','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061130,1208,'移出黑名单','1208','im_content_type',0,'success','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061131,1209,'好友资料变更','1209','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061132,1210,'好友信息批量更新','1210','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061133,1530,'群成员个人设置变更','1530','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061134,1601,'通话信令','1601','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061135,1602,'通话参与者加入','1602','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061136,1603,'通话参与者离开','1603','im_content_type',0,'info','',NULL,'admin','2026-06-16 03:47:00','admin','2026-06-16 03:47:00',0x00),(1061137,10,'销售预留','10','wms_reserve_biz_type',0,'primary','','销售订单预留库存','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061138,20,'生产预留','20','wms_reserve_biz_type',0,'success','','生产工单预留库存','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061139,10,'入库','10','wms_transaction_type',0,'success','','库存入库','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061140,20,'出库','20','wms_transaction_type',0,'warning','','库存出库','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061141,30,'预留','30','wms_transaction_type',0,'primary','','库存预留','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061142,40,'释放','40','wms_transaction_type',0,'info','','预留释放','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061143,50,'盘点','50','wms_transaction_type',0,'default','','库存盘点','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061144,60,'调拨','60','wms_transaction_type',0,'default','','库存调拨','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061145,0,'预留中','0','wms_reserve_status',0,'primary','','库存预留中','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061146,1,'部分使用','1','wms_reserve_status',0,'warning','','部分已使用','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061147,2,'已使用','2','wms_reserve_status',0,'success','','已全部使用','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061148,3,'已释放','3','wms_reserve_status',0,'info','','预留已释放','1','2026-06-26 08:15:54','1','2026-06-26 08:15:54',0x00),(1061149,0,'草稿','0','erp_audit_status',0,'info','','订单草稿状态','1','2026-06-26 08:46:48','1','2026-06-26 08:46:48',0x00),(1061150,30,'审批不通过','30','erp_audit_status',0,'danger','','审批不通过','1','2026-06-26 08:46:48','1','2026-06-26 08:46:48',0x00),(1061153,1,'数值格式','1','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:00:17','1','2026-07-02 14:01:19',0x00),(1061154,2,'文本格式','2','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:00:31','1','2026-07-02 14:01:15',0x00),(1061155,3,'下拉选项','3','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:01:00','1','2026-07-02 14:01:10',0x00),(1061156,4,'时间格式','4','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:01:37','1','2026-07-02 14:01:37',0x00),(1061157,5,'日期格式','5','mes_pd_param_type',0,'','',NULL,'1','2026-07-02 14:01:48','1','2026-07-02 14:01:48',0x00),(1061158,1,'生产要求','1','mes_pd_template_type',0,'','',NULL,'1','2026-07-02 14:02:31','1','2026-07-02 14:02:31',0x00),(1061159,2,'自检要求','2','mes_pd_template_type',0,'','',NULL,'1','2026-07-02 14:02:42','1','2026-07-02 14:02:42',0x00),(1061160,3,'巡检要求','3','mes_pd_template_type',0,'','',NULL,'1','2026-07-02 14:02:54','1','2026-07-02 14:02:54',0x00),(1061161,0,'待发布','0','mes_pd_project_status',0,'info','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061162,1,'待上传','1','mes_pd_project_status',0,'primary','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061163,2,'待审核','2','mes_pd_project_status',0,'warning','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061164,4,'待归档','3','mes_pd_project_status',0,'success','','','1','2026-07-03 02:17:25','1','2026-08-13 07:48:14',0x00),(1061165,5,'已归档','4','mes_pd_project_status',0,'danger','','','1','2026-07-03 02:17:25','1','2026-08-13 07:48:14',0x00),(1061166,0,'待审核','0','mes_pd_document_audit_status',0,'info','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061167,1,'审核通过','1','mes_pd_document_audit_status',0,'success','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061168,2,'审核不通过','2','mes_pd_document_audit_status',0,'danger','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061169,0,'待归档','0','mes_pd_archive_status',0,'info','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061170,1,'已归档','1','mes_pd_archive_status',0,'success','','','1','2026-07-03 02:17:25','1','2026-07-03 02:17:25',0x00),(1061171,1,'男','1','hrm_gender',0,'','',NULL,'1','2026-07-06 11:00:38','1','2026-07-06 11:00:38',0x00),(1061172,2,'女','2','hrm_gender',0,'','',NULL,'1','2026-07-06 11:00:47','1','2026-07-06 11:00:47',0x00),(1061173,1,'在职','1','hrm_employee_status',0,'','',NULL,'1','2026-07-06 11:01:37','1','2026-07-06 11:01:37',0x00),(1061174,2,'试用','2','hrm_employee_status',0,'','',NULL,'1','2026-07-06 11:01:44','1','2026-07-06 11:01:44',0x00),(1061175,3,'离职','3','hrm_employee_status',0,'','',NULL,'1','2026-07-06 11:01:49','1','2026-07-06 11:01:49',0x00),(1061176,1,'高中','1','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:01','1','2026-07-06 11:14:01',0x00),(1061177,2,'大专','2','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:15','1','2026-07-06 11:14:15',0x00),(1061178,3,'本科','3','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:26','1','2026-07-06 11:14:26',0x00),(1061179,4,'硕士','4','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:32','1','2026-07-06 11:14:32',0x00),(1061180,5,'博士','5','hrm_degree',0,'','',NULL,'1','2026-07-06 11:14:40','1','2026-07-06 11:14:40',0x00),(1061181,1,'事假','1','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:16:00','1','2026-07-06 11:16:00',0x00),(1061182,2,'病假','2','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:02','1','2026-07-06 11:17:02',0x00),(1061183,3,'年假','3','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:19','1','2026-07-06 11:17:19',0x00),(1061184,4,'婚假','4','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:27','1','2026-07-06 11:17:27',0x00),(1061185,5,'产假','5','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:37','1','2026-07-06 11:17:37',0x00),(1061186,6,'丧假','6','hrm_leave_type',0,'','',NULL,'1','2026-07-06 11:17:44','1','2026-07-06 11:17:44',0x00),(1061187,1,'平调','1','hrm_transfer_type',0,'','',NULL,'1','2026-07-06 11:18:09','1','2026-07-06 11:18:09',0x00),(1061188,2,'升职','2','hrm_transfer_type',0,'','',NULL,'1','2026-07-06 11:18:16','1','2026-07-06 11:18:16',0x00),(1061189,3,'降职','3','hrm_transfer_type',0,'','',NULL,'1','2026-07-06 11:18:22','1','2026-07-06 11:18:22',0x00),(1061190,1,'主动离职','1','hrm_resignation_type',0,'','',NULL,'1','2026-07-06 11:20:26','1','2026-07-06 11:20:26',0x00),(1061191,2,'被动离职','2','hrm_resignation_type',0,'','',NULL,'1','2026-07-06 11:20:35','1','2026-07-06 11:20:35',0x00),(1061192,3,'合同到期','3','hrm_resignation_type',0,'','',NULL,'1','2026-07-06 11:20:44','1','2026-07-06 11:20:44',0x00),(1061193,1,'正常','1','hrm_clock_type',0,'','',NULL,'1','2026-07-06 11:21:04','1','2026-07-06 11:21:04',0x00),(1061194,2,'迟到/早退','2','hrm_clock_type',0,'','',NULL,'1','2026-07-06 11:21:19','1','2026-07-06 11:21:19',0x00),(1061195,3,'缺卡','3','hrm_clock_type',0,'','',NULL,'1','2026-07-06 11:21:26','1','2026-07-06 11:21:26',0x00),(1061196,0,'待确认','0','hrm_salary_status',0,'','',NULL,'1','2026-07-06 11:22:05','1','2026-07-06 11:22:05',0x00),(1061197,1,'已确认','10','hrm_salary_status',0,'','',NULL,'1','2026-07-06 11:22:16','1','2026-07-06 11:22:16',0x00),(1061198,2,'已发放','20','hrm_salary_status',0,'','',NULL,'1','2026-07-06 11:22:25','1','2026-07-06 11:22:25',0x00),(1061199,1,'未开始','0','hrm_handover_status',0,'','',NULL,'1','2026-07-06 11:23:08','1','2026-07-06 11:23:08',0x00),(1061200,2,'进行中','10','hrm_handover_status',0,'','',NULL,'1','2026-07-06 11:23:18','1','2026-07-06 11:23:18',0x00),(1061201,3,'已完成','20','hrm_handover_status',0,'','',NULL,'1','2026-07-06 11:23:28','1','2026-07-06 11:23:28',0x00),(1061202,1,'银行转账','1','hrm_payment_method',0,'','',NULL,'1','2026-07-06 11:23:45','1','2026-07-06 11:23:45',0x00),(1061203,2,'现金','2','hrm_payment_method',0,'','',NULL,'1','2026-07-06 11:23:52','1','2026-07-06 11:23:52',0x00),(1061204,3,'支票','3','hrm_payment_method',0,'','',NULL,'1','2026-07-06 11:23:59','1','2026-07-06 11:23:59',0x00),(1061205,1,'原料','1','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:04:36','1','2026-07-14 12:04:36',0x00),(1061206,2,'半成品','2','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:04:47','1','2026-07-14 12:04:47',0x00),(1061207,3,'成品','3','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:04:54','1','2026-07-14 12:04:54',0x00),(1061208,4,'辅料','4','MDM_ITEM_TYPE',0,'','',NULL,'1','2026-07-14 12:05:02','1','2026-07-14 12:05:02',0x00),(1061209,0,'草稿','0','mes_pro_mps_status',0,'info','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061210,1,'已下发','1','mes_pro_mps_status',0,'success','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061211,2,'已完成','2','mes_pro_mps_status',0,'primary','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061212,3,'已取消','3','mes_pro_mps_status',0,'danger','','','1','2026-07-17 02:04:33','1','2026-07-17 02:04:33',0x00),(1061213,1,'拜访','1','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:15','1','2026-07-20 11:00:15',0x00),(1061214,2,'拟签约','2','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:25','1','2026-07-20 11:00:25',0x00),(1061215,3,'签约','3','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:31','1','2026-07-20 11:00:31',0x00),(1061216,4,'失效','4','crm_business_end_status_type',0,'','',NULL,'1','2026-07-20 11:00:38','1','2026-07-20 11:00:38',0x00),(1061217,1,'生产中','1','mes_pro_task_status',0,'processing','','任务正在生产中','admin','2026-07-22 07:59:56','admin','2026-07-22 07:59:56',0x00),(1061218,2,'部分完成','2','mes_pro_task_status',0,'warning','','任务部分完成','admin','2026-07-22 08:00:15','admin','2026-07-22 08:00:15',0x00),(1061219,1,'待评审','0','mes_ncr_status',0,'','','待评审','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061220,2,'已评审','1','mes_ncr_status',0,'','','已评审','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061221,3,'已处置','2','mes_ncr_status',0,'','','已处置','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061222,4,'已关闭','3','mes_ncr_status',0,'','','已关闭','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061223,1,'退货','1','mes_ncr_disposition',0,'','','退货','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061224,2,'报废','2','mes_ncr_disposition',0,'','','报废','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061225,3,'返工','3','mes_ncr_disposition',0,'','','返工','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061226,4,'让步接收','4','mes_ncr_disposition',0,'','','让步接收','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061227,5,'降级使用','5','mes_ncr_disposition',0,'','','降级使用','1','2026-08-06 09:25:25','1','2026-08-06 09:25:25',0x00),(1061228,1,'增值税专用发票','1','crm_invoice_type',0,'','',NULL,'1','2026-08-10 14:04:20','1','2026-08-10 14:04:20',0x00),(1061229,2,'增值税普通发票','2','crm_invoice_type',0,'','',NULL,'1','2026-08-10 14:04:25','1','2026-08-10 14:04:25',0x00),(1061230,3,'电子发票','3','crm_invoice_type',0,'','',NULL,'1','2026-08-10 14:04:31','1','2026-08-10 14:04:31',0x00),(1061231,1,'劳动合同','1','hrm_contract_type',0,'primary','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061232,2,'劳务合同','2','hrm_contract_type',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061233,3,'实习协议','3','hrm_contract_type',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061234,4,'劳务派遣','4','hrm_contract_type',0,'info','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061235,5,'其他','5','hrm_contract_type',0,'default','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061236,1,'固定期限','1','hrm_contract_term_type',0,'primary','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061237,2,'无固定期限','2','hrm_contract_term_type',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061238,3,'以完成一定工作任务为期限','3','hrm_contract_term_type',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061239,1,'待生效','1','hrm_contract_status',0,'info','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061240,2,'生效中','2','hrm_contract_status',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061241,3,'即将到期','3','hrm_contract_status',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061242,4,'已到期','4','hrm_contract_status',0,'default','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061243,5,'已解除','5','hrm_contract_status',0,'danger','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061244,6,'已终止','6','hrm_contract_status',0,'danger','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061245,1,'正常','0','hrm_contract_terminate_status',0,'success','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061246,2,'已解除','1','hrm_contract_terminate_status',0,'danger','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1061247,3,'已终止','2','hrm_contract_terminate_status',0,'warning','',NULL,'','2026-08-10 07:52:13','','2026-08-10 07:52:13',0x00),(1065310,1,'年度','1','crm_sales_target_period_type',0,'primary','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065311,2,'季度','2','crm_sales_target_period_type',0,'success','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065312,3,'月度','3','crm_sales_target_period_type',0,'warning','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065320,1,'个人','1','crm_sales_target_dimension',0,'primary','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065321,2,'部门','2','crm_sales_target_dimension',0,'success','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065322,3,'产品','3','crm_sales_target_dimension',0,'warning','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065330,0,'未生效','0','crm_sales_target_status',0,'info','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065331,1,'已生效','1','crm_sales_target_status',0,'success','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065332,2,'已结束','2','crm_sales_target_status',0,'warning','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065333,3,'已作废','3','crm_sales_target_status',0,'danger','','','1','2026-08-12 07:21:28','1','2026-08-12 07:21:28',0x00),(1065334,1,'卡尺','1','mes_dv_metering_category',0,'','','卡尺','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065335,2,'千分尺','2','mes_dv_metering_category',0,'','','千分尺','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065336,3,'压力表','3','mes_dv_metering_category',0,'','','压力表','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065337,4,'温度计','4','mes_dv_metering_category',0,'','','温度计','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065338,5,'万用表','5','mes_dv_metering_category',0,'','','万用表','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065339,6,'天平砝码','6','mes_dv_metering_category',0,'','','天平砝码','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065340,7,'其他','7','mes_dv_metering_category',0,'','','其他','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065341,1,'在用','1','mes_dv_metering_status',0,'success','','在用','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065342,2,'停用','2','mes_dv_metering_status',0,'info','','停用','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065343,3,'报废','3','mes_dv_metering_status',0,'danger','','报废','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065344,1,'合格','1','mes_dv_metering_check_result',0,'success','','合格','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065345,2,'不合格','2','mes_dv_metering_check_result',0,'danger','','不合格','1','2026-08-13 01:36:15','1','2026-08-13 01:36:15',0x00),(1065346,3,'审批中','5','mes_pd_project_status',0,'processing','','BPM å®¡æ‰¹ä¸­çŠ¶æ€','1','2026-08-13 07:48:27','1','2026-08-13 07:48:27',0x00),(1065410,1,'启用','0','qc_report_template_status',0,'success','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065411,2,'停用','1','qc_report_template_status',0,'info','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065420,1,'草稿','0','qc_report_version_status',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065421,2,'已发布','1','qc_report_version_status',0,'success','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065422,3,'已停用','2','qc_report_version_status',0,'info','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065430,1,'生成中','0','qc_report_instance_status',0,'processing','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065431,2,'生成成功','1','qc_report_instance_status',0,'success','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065432,3,'生成失败','2','qc_report_instance_status',0,'error','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065440,1,'A3','A3','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065441,2,'A4','A4','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065442,3,'A5','A5','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065443,4,'Letter','Letter','qc_report_page_size',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065450,1,'纵向','portrait','qc_report_orientation',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065451,2,'横向','landscape','qc_report_orientation',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065460,1,'通用','general','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065461,2,'电子电器','electronics','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065462,3,'五金机械','hardware','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065463,4,'汽车零部件','auto','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065464,5,'塑胶制品','plastic','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065465,6,'食品饮料','food','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065466,7,'医药医疗','pharma','qc_report_industry',0,'default','',NULL,'1','2026-09-18 02:09:52','1','2026-09-18 02:09:52',0x00),(1065501,1,'休息日','1','hrm_holiday_type',0,'success','',NULL,'1','2026-09-24 17:47:16','1','2026-09-24 17:47:16',0x00),(1065502,2,'工作日','2','hrm_holiday_type',0,'primary','',NULL,'1','2026-09-24 17:47:16','1','2026-09-24 17:47:16',0x00),(1065467,1,'文本','text','ai_model_capability',0,'','','','1','2026-10-23 00:00:00','1','2026-10-23 00:00:00',0x00),(1065468,2,'视觉','vision','ai_model_capability',0,'','','','1','2026-10-23 00:00:00','1','2026-10-23 00:00:00',0x00);
-- ============ è¡¨ï¼šsystem_tenant(导出 3 è¡Œï¼‰ ============
DROP TABLE IF EXISTS `system_tenant`;
sql/mysql/mes_package_sale_order_id_20261105.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
-- è£…箱单关联销售订单 ID。先执行结构升级,再部署后端;老数据按销售订单编号回填,匹配不到保持为空。
SET @package_sale_order_sql = IF(
  EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
          AND table_name='mes_wm_package' AND column_name='sale_order_id'),
  'SELECT 1',
  'ALTER TABLE mes_wm_package ADD COLUMN sale_order_id BIGINT NULL COMMENT ''销售订单ID,关联 erp_sale_order.id'' AFTER sales_order_code');
PREPARE package_sale_order_stmt FROM @package_sale_order_sql;
EXECUTE package_sale_order_stmt;
DEALLOCATE PREPARE package_sale_order_stmt;
UPDATE mes_wm_package p
JOIN erp_sale_order o ON o.no = p.sales_order_code COLLATE utf8mb4_unicode_ci AND o.deleted = 0
SET p.sale_order_id = o.id
WHERE p.sale_order_id IS NULL AND p.sales_order_code IS NOT NULL;
sql/mysql/mes_pro_hotpot_route_init_20261105.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
-- é˜¿æ•ï¼ˆæ•å°ä¸«ï¼‰è‡ªçƒ­ç«é”…工艺路线初始化 2026-11-05
-- 1. æ¸…理与自热火锅无关的演示工序与工艺路线(软删除,保留历史可追溯)
UPDATE mes_pro_route_process SET deleted = b'1', update_time = NOW()
WHERE deleted = b'0' AND route_id IN (1, 2, 3, 4, 5, 6, 7);
UPDATE mes_pro_route_product SET deleted = b'1', update_time = NOW()
WHERE deleted = b'0' AND route_id IN (1, 2, 3, 4, 5, 6, 7);
UPDATE mes_pro_route SET deleted = b'1', update_time = NOW()
WHERE deleted = b'0' AND id IN (1, 2, 3, 4, 5, 6, 7);
UPDATE mes_pro_process_content SET deleted = b'1', update_time = NOW()
WHERE deleted = b'0' AND process_id BETWEEN 1 AND 15;
UPDATE mes_pro_process_param SET deleted = b'1', update_time = NOW()
WHERE deleted = b'0' AND process_id BETWEEN 1 AND 15;
UPDATE mes_pro_process SET deleted = b'1', update_time = NOW()
WHERE deleted = b'0' AND id BETWEEN 1 AND 15;
-- 2. è¡¥å……自热火锅生产所需工序
INSERT INTO mes_pro_process (code, name, attention, status, remark)
SELECT 'PRO-BRAISE', '卤制', NULL, 0, '肉类、卤味原料卤制'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM mes_pro_process WHERE code = 'PRO-BRAISE');
INSERT INTO mes_pro_process (code, name, attention, status, remark)
SELECT 'PRO-STIR', '底料炒制', NULL, 0, '火锅底料、红油炒制'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM mes_pro_process WHERE code = 'PRO-STIR');
INSERT INTO mes_pro_process (code, name, attention, status, remark)
SELECT 'PRO-STERILIZE', '灭菌', NULL, 0, '料包封装后灭菌'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM mes_pro_process WHERE code = 'PRO-STERILIZE');
-- 3. å»ºç«‹ç‰›è‚‰è‡ªçƒ­ç«é”…工艺路线(对应成品 FG-001)
INSERT INTO mes_pro_route (code, name, description, status, remark)
SELECT 'RT_20261105001', '牛肉自热火锅工艺路线',
       '依据 BOM:食材处理→配料称量→卤制→底料炒制→封口包装→灭菌→组装→装箱',
       0, '成品 FG-001 ç‰›è‚‰è‡ªçƒ­ç«é”…'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM mes_pro_route
                  WHERE code = 'RT_20261105001' AND deleted = b'0');
SET @route_id := (SELECT id FROM mes_pro_route
                  WHERE code = 'RT_20261105001' AND deleted = b'0' LIMIT 1);
UPDATE mes_pro_route_process SET deleted = b'1', update_time = NOW()
WHERE route_id = @route_id AND deleted = b'0';
INSERT INTO mes_pro_route_process
    (route_id, process_id, sort, link_type, prepare_time, wait_time,
     key_flag, check_flag, backflush_flag)
SELECT @route_id, p.id, x.sort, 3, x.prepare_time, x.wait_time, b'0', b'0', b'0'
FROM (
    SELECT 'PRO-FOOD' AS process_code, 1 AS sort, 1 AS prepare_time, 1 AS wait_time
    UNION ALL SELECT 'PRO-SEASON', 2, 1, 1
    UNION ALL SELECT 'PRO-BRAISE', 3, 30, 10
    UNION ALL SELECT 'PRO-STIR', 4, 30, 10
    UNION ALL SELECT 'PRO-SEAL', 5, 5, 5
    UNION ALL SELECT 'PRO-STERILIZE', 6, 10, 10
    UNION ALL SELECT 'PRO-ASSEMBLY', 7, 5, 5
    UNION ALL SELECT 'PRO-PACK', 8, 5, 5
) x
JOIN mes_pro_process p ON p.code = x.process_code AND p.deleted = b'0';
UPDATE mes_pro_route_process rp
JOIN mes_pro_route_process np
  ON np.route_id = rp.route_id AND np.sort = rp.sort + 1 AND np.deleted = b'0'
SET rp.next_process_id = np.process_id
WHERE rp.route_id = @route_id AND rp.deleted = b'0';
UPDATE mes_pro_route_product SET deleted = b'1', update_time = NOW()
WHERE route_id = @route_id AND deleted = b'0';
INSERT INTO mes_pro_route_product (route_id, item_id, quantity)
VALUES (@route_id, 1001, 1);
sql/mysql/mes_qc_retention_sample_init_20261105.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
-- ============================================
-- MES ç•™æ ·ç®¡ç†ï¼ˆéœ€æ±‚8)初始化脚本
-- å¯é‡å¤æ‰§è¡Œ
-- ============================================
-- 1. å»ºè¡¨
CREATE TABLE IF NOT EXISTS `mes_qc_retention_sample` (
    `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '留样编号',
    `work_order_id` bigint NOT NULL COMMENT '生产工单ID',
    `work_order_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生产工单编号(冗余)',
    `sale_order_id` bigint NULL DEFAULT NULL COMMENT '销售订单ID',
    `sale_order_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '销售订单号(冗余)',
    `product_id` bigint NOT NULL COMMENT '产品ID',
    `batch_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生产批次号',
    `sample_quantity` int NOT NULL DEFAULT 2 COMMENT '留样数量',
    `sample_date` datetime NOT NULL COMMENT '留样日期',
    `expiry_date` datetime NOT NULL COMMENT '留样到期日期',
    `keeper_user_id` bigint NULL DEFAULT NULL COMMENT '留样人用户ID',
    `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',
    `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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`) USING BTREE,
    UNIQUE INDEX `uk_code` (`code`) USING BTREE,
    UNIQUE INDEX `uk_work_order_id` (`work_order_id`) USING BTREE,
    INDEX `idx_sale_order_id` (`sale_order_id`) USING BTREE,
    INDEX `idx_expiry_date` (`expiry_date`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'MES ç•™æ ·è®°å½•' ROW_FORMAT = Dynamic;
-- 2. è‡ªåŠ¨ç¼–ç è§„åˆ™ï¼ˆLY_ + yyyyMMdd + 4位流水号,按天循环)
INSERT INTO `mes_md_auto_code_rule` (`id`, `code`, `name`, `description`, `max_length`, `padded`, `padded_char`, `padded_method`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT 71, 'QC_RETENTION_SAMPLE_CODE', '留样记录编码', '留样记录自动编码', 15, b'0', '0', 1, 0, '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `mes_md_auto_code_rule` WHERE `code` = 'QC_RETENTION_SAMPLE_CODE');
-- 2.1 å›ºå®šå­—符:LY_
INSERT INTO `mes_md_auto_code_part` (`rule_id`, `sort`, `type`, `length`, `date_format`, `fix_character`, `serial_start_no`, `serial_step`, `cycle_flag`, `cycle_method`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT r.id, 1, 3, 3, NULL, 'LY_', NULL, NULL, b'0', NULL, '1', NOW(), '1', NOW(), b'0'
FROM `mes_md_auto_code_rule` r
WHERE r.`code` = 'QC_RETENTION_SAMPLE_CODE'
  AND NOT EXISTS (SELECT 1 FROM `mes_md_auto_code_part` p WHERE p.`rule_id` = r.id AND p.`sort` = 1 AND p.`deleted` = b'0');
-- 2.2 å½“前日期:yyyyMMdd
INSERT INTO `mes_md_auto_code_part` (`rule_id`, `sort`, `type`, `length`, `date_format`, `fix_character`, `serial_start_no`, `serial_step`, `cycle_flag`, `cycle_method`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', NULL, NULL, NULL, b'0', NULL, '1', NOW(), '1', NOW(), b'0'
FROM `mes_md_auto_code_rule` r
WHERE r.`code` = 'QC_RETENTION_SAMPLE_CODE'
  AND NOT EXISTS (SELECT 1 FROM `mes_md_auto_code_part` p WHERE p.`rule_id` = r.id AND p.`sort` = 2 AND p.`deleted` = b'0');
-- 2.3 æµæ°´å·ï¼š4位,按天循环
INSERT INTO `mes_md_auto_code_part` (`rule_id`, `sort`, `type`, `length`, `date_format`, `fix_character`, `serial_start_no`, `serial_step`, `cycle_flag`, `cycle_method`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT r.id, 3, 4, 4, NULL, NULL, 1, 1, b'1', 3, '1', NOW(), '1', NOW(), b'0'
FROM `mes_md_auto_code_rule` r
WHERE r.`code` = 'QC_RETENTION_SAMPLE_CODE'
  AND NOT EXISTS (SELECT 1 FROM `mes_md_auto_code_part` p WHERE p.`rule_id` = r.id AND p.`sort` = 3 AND p.`deleted` = b'0');
-- 3. èœå•:质量管理 â†’ ç•™æ ·ç®¡ç†
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT 1080080, '留样管理', '', 2, 15, 5500, 'retention-sample', 'ep:box', 'mes/qc/retentionsample/index', 'MesQcRetentionSample', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id` = 1080080);
-- 3.1 æŒ‰é’®æƒé™
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT 1080081, '留样查询', 'mes:qc-retention-sample:query', 3, 1, 1080080, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id` = 1080081);
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT 1080082, '留样创建', 'mes:qc-retention-sample:create', 3, 2, 1080080, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id` = 1080082);
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT 1080083, '留样更新', 'mes:qc-retention-sample:update', 3, 3, 1080080, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id` = 1080083);
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT 1080084, '留样删除', 'mes:qc-retention-sample:delete', 3, 4, 1080080, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id` = 1080084);
-- 4. è§’色授权(与现有质检菜单保持一致:普通角色 + 155/160/162/163)
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT r.id, m.id, '1', NOW(), '1', NOW(), b'0'
FROM `system_role` r
JOIN `system_menu` m ON m.id IN (1080080, 1080081, 1080082, 1080083, 1080084) AND m.deleted = b'0'
WHERE r.id IN (2, 155, 160, 162, 163) AND r.deleted = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` rm WHERE rm.role_id = r.id AND rm.menu_id = m.id);
yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/contract/CrmContractApi.java
@@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.crm.api.contract;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractCreateFromSaleOrderReqDTO;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractRespDTO;
/**
 * CRM åˆåŒ API æŽ¥å£
@@ -12,6 +14,14 @@
    String PREFIX = "/rpc-api/crm/contract";
    /**
     * æ ¹æ®é”€å”®è®¢å•创建合同草稿(不提交审批)
     *
     * @param reqDTO é”€å”®è®¢å•信息
     * @return åˆåŒ
     */
    CommonResult<CrmContractRespDTO> createContractDraftFromSaleOrder(CrmContractCreateFromSaleOrderReqDTO reqDTO);
    /**
     * æ›´æ–°åˆåŒçŠ¶æ€
     *
     * @param id     åˆåŒç¼–号
yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/contract/dto/CrmContractCreateFromSaleOrderReqDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.crm.api.contract.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "RPC æœåŠ¡ - CRM æ ¹æ®é”€å”®è®¢å•创建合同草稿 Request DTO")
@Data
public class CrmContractCreateFromSaleOrderReqDTO {
    @Schema(description = "销售订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long orderId;
    @Schema(description = "销售订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SO001")
    private String orderNo;
    @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long customerId;
    @Schema(description = "负责人编号(销售员)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long ownerUserId;
    @Schema(description = "下单时间")
    private LocalDateTime orderTime;
    @Schema(description = "优惠率,百分比", example = "10")
    private BigDecimal discountPercent;
    @Schema(description = "定金金额,单位:元", example = "100")
    private BigDecimal depositPrice;
    @Schema(description = "合同明细列表", requiredMode = Schema.RequiredMode.REQUIRED)
    private List<Item> items;
    @Schema(description = "合同明细")
    @Data
    public static class Item {
        @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
        private Long itemId;
        @Schema(description = "计量单位编号", example = "1")
        private Long itemUnitId;
        @Schema(description = "成交单价,单位:元", example = "100")
        private BigDecimal price;
        @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
        private BigDecimal count;
    }
}
yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/contract/dto/CrmContractRespDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.crm.api.contract.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "RPC æœåŠ¡ - CRM åˆåŒ Response DTO")
@Data
public class CrmContractRespDTO {
    @Schema(description = "合同编号", example = "1")
    private Long id;
    @Schema(description = "合同单号", example = "HT001")
    private String no;
    @Schema(description = "合同名称", example = "好水川-销售合同-SO001")
    private String name;
}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/api/contract/CrmContractApiImpl.java
@@ -1,6 +1,10 @@
package cn.iocoder.yudao.module.crm.api.contract;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractCreateFromSaleOrderReqDTO;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractRespDTO;
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
@@ -25,6 +29,12 @@
    private CrmContractService contractService;
    @Override
    public CommonResult<CrmContractRespDTO> createContractDraftFromSaleOrder(CrmContractCreateFromSaleOrderReqDTO reqDTO) {
        CrmContractDO contract = contractService.createContractDraftFromSaleOrder(reqDTO);
        return success(BeanUtils.toBean(contract, CrmContractRespDTO.class));
    }
    @Override
    public CommonResult<Boolean> updateContractStatus(Long id, Integer status) {
        contractService.updateContractStatus(id, status);
        return success(true);
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.crm.service.contract;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractCreateFromSaleOrderReqDTO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractImportExcelVO;
@@ -259,6 +260,14 @@
    Long generateSaleOrder(Long id, Long userId);
    /**
     * æ ¹æ®é”€å”®è®¢å•创建合同草稿(不提交审批)
     *
     * @param reqDTO é”€å”®è®¢å•信息
     * @return åˆåŒ
     */
    CrmContractDO createContractDraftFromSaleOrder(CrmContractCreateFromSaleOrderReqDTO reqDTO);
    /**
     * æ›´æ–°åˆåŒçŠ¶æ€
     *
     * @param id     åˆåŒç¼–号
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -16,6 +16,7 @@
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractCreateFromSaleOrderReqDTO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractImportExcelVO;
@@ -57,6 +58,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@@ -834,6 +836,73 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public CrmContractDO createContractDraftFromSaleOrder(CrmContractCreateFromSaleOrderReqDTO reqDTO) {
        // 1. å¹‚等:同一销售订单只生成一张合同
        CrmContractDO existed = contractMapper.selectByOrderId(reqDTO.getOrderId());
        if (existed != null) {
            log.info("[createContractDraftFromSaleOrder] é”€å”®è®¢å•({}) å·²ç”ŸæˆåˆåŒ({}),跳过创建",
                    reqDTO.getOrderNo(), existed.getNo());
            return existed;
        }
        // 2. æ ¡éªŒå®¢æˆ·ä¸Žè´Ÿè´£äºº
        CrmCustomerDO customer = customerService.getCustomer(reqDTO.getCustomerId());
        if (customer == null) {
            throw new IllegalArgumentException("销售订单[" + reqDTO.getOrderNo()
                    + "]关联的客户不存在或已被删除,无法自动生成销售合同");
        }
        if (reqDTO.getOwnerUserId() == null) {
            throw new IllegalArgumentException("销售订单[" + reqDTO.getOrderNo()
                    + "]未填写销售员,无法确定自动生成销售合同的负责人");
        }
        if (CollUtil.isEmpty(reqDTO.getItems())) {
            throw new IllegalArgumentException("销售订单[" + reqDTO.getOrderNo()
                    + "]没有明细,无法自动生成销售合同");
        }
        // 3. ç»„装合同明细
        List<CrmContractProductDO> products = new ArrayList<>(reqDTO.getItems().size());
        for (CrmContractCreateFromSaleOrderReqDTO.Item item : reqDTO.getItems()) {
            CrmContractProductDO product = new CrmContractProductDO();
            product.setItemId(item.getItemId());
            product.setItemUnitId(item.getItemUnitId());
            product.setItemPrice(item.getPrice());
            product.setContractPrice(item.getPrice());
            product.setCount(item.getCount());
            product.setTotalPrice(MoneyUtils.priceMultiply(item.getPrice(), item.getCount()));
            products.add(product);
        }
        // 4. ç»„装合同(未提交草稿,不发起审批)
        CrmContractDO contract = new CrmContractDO();
        contract.setNo(noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX));
        contract.setName(customer.getName() + "-销售合同-" + reqDTO.getOrderNo());
        contract.setCustomerId(reqDTO.getCustomerId());
        contract.setOwnerUserId(reqDTO.getOwnerUserId());
        contract.setOrderDate(reqDTO.getOrderTime());
        contract.setDiscountPercent(reqDTO.getDiscountPercent() != null ? reqDTO.getDiscountPercent() : BigDecimal.ZERO);
        contract.setDepositPrice(reqDTO.getDepositPrice() != null ? reqDTO.getDepositPrice() : BigDecimal.ZERO);
        contract.setOrderId(reqDTO.getOrderId());
        contract.setOrderNo(reqDTO.getOrderNo());
        contract.setRemark("由销售订单【" + reqDTO.getOrderNo() + "】审批通过后自动生成");
        contract.setAuditStatus(CrmAuditStatusEnum.DRAFT.getStatus());
        calculateTotalPrice(contract, products);
        // 5. è½åº“
        contractMapper.insert(contract);
        products.forEach(product -> product.setContractId(contract.getId()));
        contractProductMapper.insertBatch(products);
        // 6. åˆ›å»ºæ•°æ®æƒé™ï¼Œä¿è¯è´Ÿè´£äººèƒ½çœ‹åˆ°è¯¥åˆåŒ
        crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(contract.getOwnerUserId())
                .setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId())
                .setLevel(CrmPermissionLevelEnum.OWNER.getLevel()));
        log.info("[createContractDraftFromSaleOrder] é”€å”®è®¢å•({}) è‡ªåŠ¨ç”ŸæˆåˆåŒ({}) æˆåŠŸ",
                reqDTO.getOrderNo(), contract.getNo());
        return contract;
    }
    @Override
    public void updateContractStatus(Long id, Integer status) {
        contractMapper.updateById(new CrmContractDO()
                .setId(id)
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApi.java
@@ -6,7 +6,9 @@
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
 * ERP é‡‡è´­è®¢å• API æŽ¥å£
@@ -93,4 +95,14 @@
     */
    CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemListBySource(Integer sourceType, Long sourceId);
    /**
     * æ‰¹é‡èŽ·å–ç‰©æ–™çš„é‡‡è´­åŠ æƒå¹³å‡å•ä»·ï¼ˆä»…ç»Ÿè®¡å·²å®¡æ ¸é‡‡è´­è®¢å•ï¼‰
     *
     * è®¡ç®—方式:SUM(明细总价) / SUM(明细数量);无有效采购记录时返回空 Map
     *
     * @param productIds ç‰©æ–™ç¼–号集合(mdm_item.id)
     * @return ç‰©æ–™ç¼–号 â†’ åŠ æƒå¹³å‡å•ä»·
     */
    CommonResult<Map<Long, BigDecimal>> getItemAveragePurchasePriceMap(Collection<Long> productIds);
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApiImpl.java
@@ -17,8 +17,12 @@
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -134,4 +138,43 @@
        return success(BeanUtils.toBean(items, ErpPurchaseOrderItemRespDTO.class));
    }
    @Override
    public CommonResult<Map<Long, BigDecimal>> getItemAveragePurchasePriceMap(Collection<Long> productIds) {
        if (productIds == null || productIds.isEmpty()) {
            return success(Collections.emptyMap());
        }
        // 1. æŸ¥è¯¢å·²å®¡æ ¸é‡‡è´­è®¢å•中这些物料的明细
        List<ErpPurchaseOrderItemDO> items = purchaseOrderItemMapper
                .selectListByApprovedOrderAndProductIds(productIds);
        if (items.isEmpty()) {
            return success(Collections.emptyMap());
        }
        // 2. æŒ‰ç‰©æ–™æ±‡æ€»æ•°é‡å’Œé‡‘额,计算加权平均价:SUM(总价) / SUM(数量)
        Map<Long, BigDecimal> totalPriceMap = new HashMap<>();
        Map<Long, BigDecimal> totalCountMap = new HashMap<>();
        for (ErpPurchaseOrderItemDO item : items) {
            if (item.getProductId() == null || item.getCount() == null
                    || item.getCount().compareTo(BigDecimal.ZERO) <= 0) {
                continue;
            }
            BigDecimal totalPrice = item.getTotalPrice();
            if (totalPrice == null && item.getProductPrice() != null) {
                totalPrice = item.getProductPrice().multiply(item.getCount());
            }
            if (totalPrice == null) {
                continue;
            }
            totalPriceMap.merge(item.getProductId(), totalPrice, BigDecimal::add);
            totalCountMap.merge(item.getProductId(), item.getCount(), BigDecimal::add);
        }
        Map<Long, BigDecimal> result = new HashMap<>(totalCountMap.size());
        totalCountMap.forEach((productId, totalCount) -> {
            BigDecimal totalPrice = totalPriceMap.get(productId);
            if (totalPrice != null && totalCount.compareTo(BigDecimal.ZERO) > 0) {
                result.put(productId, totalPrice.divide(totalCount, 6, RoundingMode.HALF_UP));
            }
        });
        return success(result);
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderItemMapper.java
@@ -1,7 +1,10 @@
package cn.iocoder.yudao.module.erp.dal.mysql.purchase;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
@@ -27,4 +30,16 @@
        return delete(ErpPurchaseOrderItemDO::getOrderId, orderId);
    }
    /**
     * æŸ¥è¯¢æŒ‡å®šç‰©æ–™çš„已审核采购订单明细
     */
    default List<ErpPurchaseOrderItemDO> selectListByApprovedOrderAndProductIds(Collection<Long> productIds) {
        MPJLambdaWrapperX<ErpPurchaseOrderItemDO> query = new MPJLambdaWrapperX<>();
        query.selectAll(ErpPurchaseOrderItemDO.class);
        query.innerJoin(ErpPurchaseOrderDO.class, ErpPurchaseOrderDO::getId, ErpPurchaseOrderItemDO::getOrderId);
        query.eq(ErpPurchaseOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus());
        query.in(ErpPurchaseOrderItemDO::getProductId, productIds);
        return selectJoinList(ErpPurchaseOrderItemDO.class, query);
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -18,6 +18,8 @@
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
import cn.iocoder.yudao.module.crm.api.contract.CrmContractApi;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractCreateFromSaleOrderReqDTO;
import cn.iocoder.yudao.module.crm.api.contract.dto.CrmContractRespDTO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderImportExcelVO;
@@ -440,9 +442,10 @@
                    .setId(id).setStatus(newStatus));
        }
        // 3. å®¡æ ¸é€šè¿‡æ—¶ï¼Œä¸ºéœ€è¦ç”Ÿäº§çš„æ˜Žç»†åˆ›å»º MPS
        // 3. å®¡æ ¸é€šè¿‡æ—¶ï¼Œä¸ºéœ€è¦ç”Ÿäº§çš„æ˜Žç»†åˆ›å»º MPS,并自动生成销售合同草稿
        if (ErpAuditStatus.APPROVE.getStatus().equals(newStatus)) {
            createMpsForSaleOrder(id, saleOrder);
            createContractForSaleOrder(saleOrder);
        }
    }
@@ -550,6 +553,58 @@
    }
    /**
     * é”€å”®è®¢å•审批通过后,自动生成销售合同草稿(不提交审批)
     */
    private void createContractForSaleOrder(ErpSaleOrderDO saleOrder) {
        // è®¢å•本身由合同生成,避免反向生成
        if (saleOrder.getContractId() != null) {
            log.info("[createContractForSaleOrder] é”€å”®è®¢å•({}) å·²å…³è”合同({}),跳过自动生成",
                    saleOrder.getNo(), saleOrder.getContractNo());
            return;
        }
        try {
            List<ErpSaleOrderItemDO> items = saleOrderItemMapper.selectListByOrderId(saleOrder.getId());
            if (CollUtil.isEmpty(items)) {
                log.warn("[createContractForSaleOrder] é”€å”®è®¢å•({}) æ²¡æœ‰æ˜Žç»†ï¼Œè·³è¿‡è‡ªåŠ¨ç”ŸæˆåˆåŒ", saleOrder.getNo());
                return;
            }
            // è´Ÿè´£äººä¼˜å…ˆå–销售员,未填写时回退到订单创建人
            Long ownerUserId = saleOrder.getSaleUserId();
            if (ownerUserId == null && StrUtil.isNumeric(saleOrder.getCreator())) {
                ownerUserId = Long.valueOf(saleOrder.getCreator());
            }
            CrmContractCreateFromSaleOrderReqDTO createReqDTO = new CrmContractCreateFromSaleOrderReqDTO();
            createReqDTO.setOrderId(saleOrder.getId());
            createReqDTO.setOrderNo(saleOrder.getNo());
            createReqDTO.setCustomerId(saleOrder.getCustomerId());
            createReqDTO.setOwnerUserId(ownerUserId);
            createReqDTO.setOrderTime(saleOrder.getOrderTime());
            createReqDTO.setDiscountPercent(saleOrder.getDiscountPercent());
            createReqDTO.setDepositPrice(saleOrder.getDepositPrice());
            createReqDTO.setItems(items.stream().map(item -> {
                CrmContractCreateFromSaleOrderReqDTO.Item contractItem = new CrmContractCreateFromSaleOrderReqDTO.Item();
                contractItem.setItemId(item.getProductId());
                contractItem.setItemUnitId(item.getProductUnitId());
                contractItem.setPrice(item.getProductPrice());
                contractItem.setCount(item.getCount());
                return contractItem;
            }).toList());
            CrmContractRespDTO contract = contractApi.createContractDraftFromSaleOrder(createReqDTO).getCheckedData();
            if (contract != null) {
                saleOrderMapper.updateById(new ErpSaleOrderDO().setId(saleOrder.getId())
                        .setContractId(contract.getId()).setContractNo(contract.getNo()));
                log.info("[createContractForSaleOrder] é”€å”®è®¢å•({}) è‡ªåŠ¨ç”ŸæˆåˆåŒ({}) æˆåŠŸ",
                        saleOrder.getNo(), contract.getNo());
            }
        } catch (Exception e) {
            // åˆåŒç”Ÿæˆå¤±è´¥ä¸é˜»å¡žè®¢å•审批,记录日志便于排查
            log.error("[createContractForSaleOrder] é”€å”®è®¢å•({}) è‡ªåŠ¨ç”Ÿæˆé”€å”®åˆåŒå¤±è´¥", saleOrder.getNo(), e);
        }
    }
    /**
     * ä¸ºé”€å”®è®¢å•明细创建 MPS
     */
    private Long createMpsForSaleOrderItem(ErpSaleOrderDO saleOrder, ErpSaleOrderItemDO item) {
yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
@@ -31,6 +31,10 @@
    ErrorCode EMPLOYEE_CONTRACT_IMPORT_EMPLOYEE_NAME_NOT_EXISTS = new ErrorCode(1_030_000_018, "员工姓名【{}】不存在,请先维护员工档案");
    ErrorCode EMPLOYEE_CONTRACT_IMPORT_EMPLOYEE_NAME_MULTIPLE = new ErrorCode(1_030_000_019, "员工姓名【{}】对应多个员工档案,无法自动匹配,请先在页面手工为该员工新增合同");
    ErrorCode EMPLOYEE_CONTRACT_IMPORT_CONTRACT_EXISTS = new ErrorCode(1_030_000_020, "该员工【{}】已存在相同类型、相同开始日期的合同,如需覆盖请勾选“已存在时更新”");
    ErrorCode EMPLOYEE_CONTRACT_DOCUMENT_EMPLOYEE_NOT_EXISTS = new ErrorCode(1_030_000_021, "合同【{}】关联的员工档案(员工ID={})不存在,无法生成合同文档,请先为该合同选择有效员工");
    ErrorCode EMPLOYEE_CONTRACT_TEMPLATE_NOT_FOUND = new ErrorCode(1_030_000_022, "合同模板文件【{}】不存在,无法生成合同文档,请联系管理员恢复模板文件");
    ErrorCode EMPLOYEE_CONTRACT_TEMPLATE_PLACEHOLDER_UNRESOLVED = new ErrorCode(1_030_000_023, "合同模板存在未识别的占位符【{}】,请检查模板文件是否与当前系统版本匹配");
    ErrorCode EMPLOYEE_CONTRACT_DOCUMENT_GENERATE_FAIL = new ErrorCode(1_030_000_024, "生成合同文档失败:{}。请重试;若仍失败请联系管理员");
    // ========== è¯·å‡ç”³è¯· 1-030-001-000 ==========
    ErrorCode LEAVE_APPLICATION_NOT_EXISTS = new ErrorCode(1_030_001_000, "请假申请不存在");
yudao-module-hrm/pom.xml
@@ -70,6 +70,13 @@
            <artifactId>yudao-spring-boot-starter-excel</artifactId>
        </dependency>
        <!-- åˆåŒæ–‡æ¡£ç”Ÿæˆï¼šWord(.docx) æ¨¡æ¿å¡«å…… -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.4.0</version>
        </dependency>
        <!-- Test æµ‹è¯•相关 -->
        <dependency>
            <groupId>cn.iocoder.boot</groupId>
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/HrmEmployeeContractController.java
@@ -3,6 +3,7 @@
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractDocumentRespVO;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractImportExcelVO;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractImportReqVO;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractImportRespVO;
@@ -10,6 +11,7 @@
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractRespVO;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractSaveReqVO;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractTerminateReqVO;
import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeContractDocumentService;
import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeContractService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -37,6 +39,8 @@
    @Resource
    private HrmEmployeeContractService contractService;
    @Resource
    private HrmEmployeeContractDocumentService contractDocumentService;
    @PostMapping("/create")
    @Operation(summary = "创建员工合同")
@@ -89,6 +93,14 @@
        return success(contractService.getExpiringCount());
    }
    @PostMapping("/generate-document")
    @Operation(summary = "生成员工合同文档", description = "按合同明细填充 Word æ¨¡æ¿ï¼Œç”Ÿæˆç»“果存入系统文件库并绑定到该合同的附件")
    @Parameter(name = "id", description = "合同ID", required = true)
    @PreAuthorize("@ss.hasPermission('hrm:employee-contract:update')")
    public CommonResult<HrmEmployeeContractDocumentRespVO> generateContractDocument(@RequestParam("id") Long id) {
        return success(contractDocumentService.generateContractDocument(id));
    }
    @GetMapping("/import-template")
    @Operation(summary = "下载员工合同导入模板")
    @PreAuthorize("@ss.hasPermission('hrm:employee-contract:import')")
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeContractDocumentRespVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - å‘˜å·¥åˆåŒæ–‡æ¡£ç”Ÿæˆç»“æžœ Response VO")
@Data
public class HrmEmployeeContractDocumentRespVO {
    @Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
    private Long blobId;
    @Schema(description = "文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "劳动合同-张三-HT202608100001.docx")
    private String fileName;
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractDocumentService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.hrm.service.employee;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractDocumentRespVO;
/**
 * å‘˜å·¥åˆåŒæ–‡æ¡£ Service æŽ¥å£
 */
public interface HrmEmployeeContractDocumentService {
    /**
     * æŒ‰åˆåŒæ˜Žç»†ç”ŸæˆåŠ³åŠ¨åˆåŒ Word æ–‡æ¡£ï¼Œå¹¶ç»‘定到该合同的附件中
     *
     * @param contractId åˆåŒ ID
     * @return ç”Ÿæˆç»“果(文件编号、文件名)
     */
    HrmEmployeeContractDocumentRespVO generateContractDocument(Long contractId);
}
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractDocumentServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,392 @@
package cn.iocoder.yudao.module.hrm.service.employee;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.biz.system.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractDocumentRespVO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeContractDO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeContractMapper;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.PostApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.storage.StorageBlobApi;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
/**
 * å‘˜å·¥åˆåŒæ–‡æ¡£ Service å®žçŽ°ç±»
 * <p>
 * åŸºäºŽ Word æ¨¡æ¿å ä½ç¬¦å¡«å……生成劳动合同,生成结果存入系统文件库并绑定到合同附件。
 * å®¢æˆ·æä¾›æ­£å¼æ¨¡æ¿åŽï¼Œåªéœ€æ›¿æ¢æ¨¡æ¿æ–‡ä»¶ä¸­çš„占位符内容,无需修改代码。
 */
@Service
@Validated
@Slf4j
public class HrmEmployeeContractDocumentServiceImpl implements HrmEmployeeContractDocumentService {
    private static final String TEMPLATE_PATH = "templates/hrm/employee-contract-template.docx";
    private static final String APPLICATION = "file";
    private static final String RECORD_TYPE = "hrm_employee_contract";
    private static final String CONTENT_TYPE =
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyå¹´M月d日");
    private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\{\\{\\s*([^{}]+?)\\s*}}");
    private static final String UNSET_TEXT = "未填写";
    @Resource
    private HrmEmployeeContractMapper contractMapper;
    @Resource
    private HrmEmployeeService employeeService;
    @Resource
    private DeptApi deptApi;
    @Resource
    private PostApi postApi;
    @Resource
    private DictDataApi dictDataApi;
    @Resource
    private StorageBlobApi storageBlobApi;
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    @Override
    public HrmEmployeeContractDocumentRespVO generateContractDocument(Long contractId) {
        // 1. æ ¡éªŒåˆåŒä¸Žå‘˜å·¥
        HrmEmployeeContractDO contract = contractMapper.selectById(contractId);
        if (contract == null) {
            throw exception(EMPLOYEE_CONTRACT_NOT_EXISTS);
        }
        HrmEmployeeDO employee = employeeService.getEmployee(contract.getEmployeeId());
        if (employee == null) {
            throw exception(EMPLOYEE_CONTRACT_DOCUMENT_EMPLOYEE_NOT_EXISTS,
                    contract.getContractNo(), contract.getEmployeeId());
        }
        // 2. æ¨¡æ¿å¿…须存在,避免生成空文档
        ClassPathResource template = new ClassPathResource(TEMPLATE_PATH);
        if (!template.exists()) {
            throw exception(EMPLOYEE_CONTRACT_TEMPLATE_NOT_FOUND, TEMPLATE_PATH);
        }
        // 3. å¡«å……模板
        String fileName = buildFileName(contract, employee);
        byte[] content = fillTemplate(template, contract, employee);
        if (content.length == 0) {
            throw exception(EMPLOYEE_CONTRACT_DOCUMENT_GENERATE_FAIL, "生成的文件内容为空");
        }
        // 4. å­˜å…¥ç³»ç»Ÿæ–‡ä»¶åº“,并绑定为合同附件(每次生成保留一份历史版本)
        Long blobId = storageBlobApi.saveBlob(content, fileName, CONTENT_TYPE);
        if (blobId == null) {
            throw exception(EMPLOYEE_CONTRACT_DOCUMENT_GENERATE_FAIL, "文件保存失败");
        }
        storageAttachmentApi.bindAttachments(APPLICATION, RECORD_TYPE, contractId,
                Collections.singletonList(blobId));
        HrmEmployeeContractDocumentRespVO respVO = new HrmEmployeeContractDocumentRespVO();
        respVO.setBlobId(blobId);
        respVO.setFileName(fileName);
        return respVO;
    }
    private byte[] fillTemplate(ClassPathResource template, HrmEmployeeContractDO contract,
                                HrmEmployeeDO employee) {
        Map<String, String> values = buildPlaceholderValues(contract, employee);
        try (InputStream in = template.getInputStream();
             XWPFDocument document = new XWPFDocument(in)) {
            replacePlaceholders(document, values);
            Set<String> unresolved = findUnresolvedPlaceholders(document);
            if (CollUtil.isNotEmpty(unresolved)) {
                throw exception(EMPLOYEE_CONTRACT_TEMPLATE_PLACEHOLDER_UNRESOLVED,
                        String.join("、", unresolved));
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            document.write(out);
            return out.toByteArray();
        } catch (ServiceException e) {
            throw e;
        } catch (Exception e) {
            log.error("[fillTemplate][合同({}) ç”Ÿæˆæ–‡æ¡£å¤±è´¥]", contract.getId(), e);
            throw exception(EMPLOYEE_CONTRACT_DOCUMENT_GENERATE_FAIL, "读取模板或生成 Word æ–‡ä»¶å¼‚常");
        }
    }
    private Map<String, String> buildPlaceholderValues(HrmEmployeeContractDO contract,
                                                       HrmEmployeeDO employee) {
        Map<String, String> values = new HashMap<>();
        // åˆåŒä¿¡æ¯
        values.put("documentTitle", buildDocumentTitle(contract.getContractType()));
        values.put("contractNo", defaultText(contract.getContractNo()));
        values.put("contractType", getDictLabel("hrm_contract_type", contract.getContractType()));
        values.put("contractTermType", getDictLabel("hrm_contract_term_type", contract.getContractTermType()));
        values.put("signCompany", defaultText(contract.getSignCompany()));
        values.put("signDate", formatDate(contract.getSignDate()));
        values.put("contractPeriod", buildContractPeriod(contract));
        values.put("probationPeriod", buildProbationPeriod(contract));
        values.put("probationSalary", formatSalary(contract.getProbationSalary()));
        values.put("regularSalary", formatSalary(contract.getRegularSalary()));
        values.put("generateDate", formatDate(LocalDate.now()));
        // å‘˜å·¥ä¿¡æ¯
        values.put("employeeName", defaultText(employee.getName()));
        values.put("gender", formatGender(employee.getGender()));
        values.put("idCard", defaultText(employee.getIdCard()));
        values.put("employeeNo", defaultText(employee.getEmployeeNo()));
        values.put("phone", defaultText(employee.getPhone()));
        values.put("address", defaultText(employee.getAddress()));
        values.put("hireDate", formatDate(employee.getHireDate()));
        values.put("deptName", getDeptName(employee.getDeptId()));
        values.put("postNames", getPostNames(employee.getPostIds()));
        return values;
    }
    private String buildContractPeriod(HrmEmployeeContractDO contract) {
        if (contract.getStartDate() == null) {
            return "未填写(合同开始日期为空,请补全合同信息后重新生成)";
        }
        if (contract.getEndDate() == null) {
            return "自 " + formatDate(contract.getStartDate()) + " èµ·ï¼Œæ— å›ºå®šæœŸé™";
        }
        return "自 " + formatDate(contract.getStartDate()) + " èµ·è‡³ " + formatDate(contract.getEndDate()) + " æ­¢";
    }
    private String buildProbationPeriod(HrmEmployeeContractDO contract) {
        LocalDate startDate = contract.getProbationStartDate();
        LocalDate endDate = contract.getProbationEndDate();
        if (startDate == null && endDate == null) {
            return "无试用期";
        }
        if (startDate == null || endDate == null) {
            return "试用期信息不完整(开始日期:" + formatDate(startDate) + ",结束日期:" + formatDate(endDate)
                    + "),请补全后重新生成";
        }
        return "自 " + formatDate(startDate) + " èµ·è‡³ " + formatDate(endDate) + " æ­¢";
    }
    private String buildDocumentTitle(Integer contractType) {
        if (contractType == null) {
            return "合同书";
        }
        switch (contractType) {
            case 1:
                return "劳动合同书";
            case 2:
                return "劳务合同书";
            case 3:
                return "实习协议书";
            case 4:
                return "劳务派遣合同书";
            default:
                return "合同书";
        }
    }
    private String buildFileName(HrmEmployeeContractDO contract, HrmEmployeeDO employee) {
        String contractType = getDictLabel("hrm_contract_type", contract.getContractType());
        String name = defaultText(employee.getName());
        String contractNo = defaultText(contract.getContractNo());
        return sanitizeFileName(contractType + "-" + name + "-" + contractNo + ".docx");
    }
    private String sanitizeFileName(String fileName) {
        return fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
    }
    private String getDictLabel(String dictType, Integer value) {
        if (value == null) {
            return UNSET_TEXT;
        }
        try {
            return dictDataApi.getDictDataList(dictType).stream()
                    .filter(data -> Objects.equals(data.getValue(), String.valueOf(value)))
                    .map(DictDataRespDTO::getLabel)
                    .findFirst()
                    .orElse("未知(" + value + ")");
        } catch (Exception e) {
            log.warn("[getDictLabel][字典({}) èŽ·å–å¤±è´¥ï¼Œä½¿ç”¨åŽŸå§‹å€¼({})]", dictType, value, e);
            return "未知(" + value + ")";
        }
    }
    private String getDeptName(Long deptId) {
        if (deptId == null) {
            return UNSET_TEXT;
        }
        try {
            Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(Collections.singleton(deptId));
            DeptRespDTO dept = deptMap.get(deptId);
            return dept == null ? "未知(ID=" + deptId + ")" : dept.getName();
        } catch (Exception e) {
            log.warn("[getDeptName][部门({}) èŽ·å–å¤±è´¥]", deptId, e);
            return "未知(ID=" + deptId + ")";
        }
    }
    private String getPostNames(String postIds) {
        if (StrUtil.isBlank(postIds)) {
            return UNSET_TEXT;
        }
        try {
            List<Long> ids = JsonUtils.parseArray(postIds, Long.class);
            if (CollUtil.isEmpty(ids)) {
                return UNSET_TEXT;
            }
            Map<Long, PostRespDTO> postMap = postApi.getPostMap(ids);
            String names = ids.stream()
                    .map(postMap::get)
                    .filter(Objects::nonNull)
                    .map(PostRespDTO::getName)
                    .collect(Collectors.joining("、"));
            return StrUtil.isBlank(names) ? UNSET_TEXT : names;
        } catch (Exception e) {
            log.warn("[getPostNames][岗位({}) è§£æžå¤±è´¥]", postIds, e);
            return UNSET_TEXT;
        }
    }
    private String formatGender(Integer gender) {
        if (gender == null) {
            return UNSET_TEXT;
        }
        if (gender == 1) {
            return "男";
        }
        if (gender == 2) {
            return "女";
        }
        return UNSET_TEXT;
    }
    private String formatSalary(BigDecimal salary) {
        if (salary == null) {
            return UNSET_TEXT;
        }
        return "ï¿¥" + new DecimalFormat("#,##0.00").format(salary) + " å…ƒ/月";
    }
    private String formatDate(LocalDate date) {
        return date == null ? UNSET_TEXT : DATE_FORMATTER.format(date);
    }
    private String defaultText(String text) {
        return StrUtil.isBlank(text) ? UNSET_TEXT : text;
    }
    // ========== æ¨¡æ¿å ä½ç¬¦æ›¿æ¢ ==========
    private void replacePlaceholders(XWPFDocument document, Map<String, String> values) {
        document.getParagraphs().forEach(paragraph -> replaceInParagraph(paragraph, values));
        document.getTables().forEach(table -> replaceInTable(table, values));
        for (XWPFHeader header : document.getHeaderList()) {
            header.getParagraphs().forEach(paragraph -> replaceInParagraph(paragraph, values));
            header.getTables().forEach(table -> replaceInTable(table, values));
        }
        for (XWPFFooter footer : document.getFooterList()) {
            footer.getParagraphs().forEach(paragraph -> replaceInParagraph(paragraph, values));
            footer.getTables().forEach(table -> replaceInTable(table, values));
        }
    }
    private void replaceInTable(XWPFTable table, Map<String, String> values) {
        for (XWPFTableRow row : table.getRows()) {
            for (XWPFTableCell cell : row.getTableCells()) {
                cell.getParagraphs().forEach(paragraph -> replaceInParagraph(paragraph, values));
                cell.getTables().forEach(nested -> replaceInTable(nested, values));
            }
        }
    }
    private void replaceInParagraph(XWPFParagraph paragraph, Map<String, String> values) {
        String text = paragraph.getText();
        if (StrUtil.isBlank(text) || !text.contains("{{")) {
            return;
        }
        String replaced = text;
        for (Map.Entry<String, String> entry : values.entrySet()) {
            replaced = replaced.replace("{{" + entry.getKey() + "}}", entry.getValue());
        }
        if (Objects.equals(replaced, text)) {
            return;
        }
        List<XWPFRun> runs = paragraph.getRuns();
        if (CollUtil.isEmpty(runs)) {
            return;
        }
        // Word å¯èƒ½æŠŠå ä½ç¬¦æ‹†åˆ†åˆ°å¤šä¸ª run,统一合并到首个 run åŽå†æ›¿æ¢ï¼Œä¿ç•™é¦–个 run çš„æ ¼å¼
        XWPFRun firstRun = runs.get(0);
        for (int i = firstRun.getCTR().sizeOfTArray() - 1; i >= 1; i--) {
            firstRun.getCTR().removeT(i);
        }
        firstRun.setText(replaced, 0);
        for (int i = runs.size() - 1; i >= 1; i--) {
            paragraph.removeRun(i);
        }
    }
    private Set<String> findUnresolvedPlaceholders(XWPFDocument document) {
        Set<String> placeholders = new LinkedHashSet<>();
        document.getParagraphs().forEach(paragraph -> collectPlaceholders(paragraph, placeholders));
        document.getTables().forEach(table -> collectPlaceholders(table, placeholders));
        for (XWPFHeader header : document.getHeaderList()) {
            header.getParagraphs().forEach(paragraph -> collectPlaceholders(paragraph, placeholders));
            header.getTables().forEach(table -> collectPlaceholders(table, placeholders));
        }
        for (XWPFFooter footer : document.getFooterList()) {
            footer.getParagraphs().forEach(paragraph -> collectPlaceholders(paragraph, placeholders));
            footer.getTables().forEach(table -> collectPlaceholders(table, placeholders));
        }
        return placeholders;
    }
    private void collectPlaceholders(XWPFTable table, Set<String> placeholders) {
        for (XWPFTableRow row : table.getRows()) {
            for (XWPFTableCell cell : row.getTableCells()) {
                cell.getParagraphs().forEach(paragraph -> collectPlaceholders(paragraph, placeholders));
                cell.getTables().forEach(nested -> collectPlaceholders(nested, placeholders));
            }
        }
    }
    private void collectPlaceholders(XWPFParagraph paragraph, Set<String> placeholders) {
        Matcher matcher = PLACEHOLDER_PATTERN.matcher(paragraph.getText());
        while (matcher.find()) {
            placeholders.add("{{" + matcher.group(1).trim() + "}}");
        }
    }
}
yudao-module-hrm/src/main/resources/templates/hrm/employee-contract-template.docx
Binary files differ
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java
@@ -48,6 +48,10 @@
    @ExcelProperty("物料/产品标识")
    private String itemOrProduct;
    @Schema(description = "每箱数量", example = "12")
    @ExcelProperty("每箱数量")
    private BigDecimal boxQuantity;
    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
    @ExcelProperty(value = "状态", converter = DictConvert.class)
    @DictFormat(DictTypeConstants.COMMON_STATUS)
@@ -65,6 +69,10 @@
    @ExcelProperty("最高库存量")
    private BigDecimal maxStock;
    @Schema(description = "默认超耗报警比例(%),为空取全局配置", example = "5")
    @ExcelProperty("默认超耗报警比例(%)")
    private BigDecimal overConsumeRatio;
    @Schema(description = "是否高值物料", example = "false")
    @ExcelProperty("是否高值物料")
    private Boolean highValue;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@@ -33,6 +34,10 @@
    @NotNull(message = "物料分类编号不能为空")
    private Long itemTypeId;
    @Schema(description = "每箱数量", example = "12")
    @DecimalMin(value = "0.000001", message = "每箱数量必须大于 0")
    private BigDecimal boxQuantity;
    @Schema(description = "是否启用安全库存", example = "false")
    private Boolean safeStockFlag;
@@ -42,6 +47,10 @@
    @Schema(description = "最高库存量", example = "10000.0000")
    private BigDecimal maxStock;
    @Schema(description = "默认超耗报警比例(%),为空取全局配置", example = "5")
    @DecimalMin(value = "0", message = "超耗报警比例不能为负数")
    private BigDecimal overConsumeRatio;
    @Schema(description = "是否高值物料", example = "false")
    private Boolean highValue;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java
@@ -35,6 +35,10 @@
    @ExcelProperty("物料/产品标识")
    private String itemOrProduct;
    @Schema(description = "是否成品分类", example = "false")
    @ExcelProperty("是否成品分类")
    private Boolean finishedFlag;
    @Schema(description = "显示排序", example = "0")
    @ExcelProperty("显示排序")
    private Integer sort;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java
@@ -28,6 +28,9 @@
    @NotEmpty(message = "物料/产品标识不能为空")
    private String itemOrProduct;
    @Schema(description = "是否成品分类", example = "false")
    private Boolean finishedFlag;
    @Schema(description = "显示排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
    @NotNull(message = "显示排序不能为空")
    private Integer sort;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/alert/MesProOverConsumeAlertController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.mes.controller.admin.pro.alert;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.alert.vo.MesProOverConsumeAlertPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.alert.vo.MesProOverConsumeAlertRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.alert.MesProOverConsumeAlertDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.alert.MesProOverConsumeAlertMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - MES å·¥å•物料超耗报警")
@RestController
@RequestMapping("/mes/pro/over-consume-alert")
@Validated
public class MesProOverConsumeAlertController {
    @Resource
    private MesProOverConsumeAlertMapper alertMapper;
    @GetMapping("/page")
    @Operation(summary = "获得超耗报警分页")
    public CommonResult<PageResult<MesProOverConsumeAlertRespVO>> getAlertPage(
            @Valid MesProOverConsumeAlertPageReqVO pageReqVO) {
        PageResult<MesProOverConsumeAlertDO> pageResult = alertMapper.selectPage(pageReqVO);
        return success(new PageResult<>(BeanUtils.toBean(pageResult.getList(), MesProOverConsumeAlertRespVO.class),
                pageResult.getTotal()));
    }
    @GetMapping("/list-by-work-order")
    @Operation(summary = "获得指定工单的超耗报警列表")
    @Parameter(name = "workOrderId", description = "生产工单编号", required = true)
    public CommonResult<List<MesProOverConsumeAlertRespVO>> getAlertListByWorkOrderId(
            @RequestParam("workOrderId") Long workOrderId) {
        List<MesProOverConsumeAlertDO> list = alertMapper.selectListByWorkOrderId(workOrderId);
        return success(BeanUtils.toBean(list, MesProOverConsumeAlertRespVO.class));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/alert/vo/MesProOverConsumeAlertPageReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.mes.controller.admin.pro.alert.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - MES å·¥å•物料超耗报警分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MesProOverConsumeAlertPageReqVO extends PageParam {
    @Schema(description = "生产工单编号", example = "1024")
    private Long workOrderId;
    @Schema(description = "物料编号", example = "2048")
    private Long itemId;
    @Schema(description = "发送状态:SENT/FAILED", example = "SENT")
    private String status;
    @Schema(description = "创建时间")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] createTime;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/alert/vo/MesProOverConsumeAlertRespVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.mes.controller.admin.pro.alert.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES å·¥å•物料超耗报警 Response VO")
@Data
public class MesProOverConsumeAlertRespVO {
    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
    private Long id;
    @Schema(description = "生产工单编号", example = "1024")
    private Long workOrderId;
    @Schema(description = "生产工单编码", example = "WO-001")
    private String workOrderCode;
    @Schema(description = "产品编号", example = "100")
    private Long productId;
    @Schema(description = "产品名称", example = "麻辣自热火锅")
    private String productName;
    @Schema(description = "物料编号", example = "200")
    private Long itemId;
    @Schema(description = "物料编码", example = "RM-001")
    private String itemCode;
    @Schema(description = "物料名称", example = "发热包")
    private String itemName;
    @Schema(description = "标准用量", example = "100.000000")
    private BigDecimal standardQuantity;
    @Schema(description = "实际用量", example = "110.000000")
    private BigDecimal actualQuantity;
    @Schema(description = "超耗数量", example = "10.000000")
    private BigDecimal overQuantity;
    @Schema(description = "超耗比例(%)", example = "10.0000")
    private BigDecimal overRatio;
    @Schema(description = "报警阈值(%)", example = "5.0000")
    private BigDecimal thresholdRatio;
    @Schema(description = "物料单价", example = "1.500000")
    private BigDecimal unitPrice;
    @Schema(description = "超耗金额", example = "15.000000")
    private BigDecimal overAmount;
    @Schema(description = "接收人用户编号(逗号分隔)", example = "1,102")
    private String notifyUserIds;
    @Schema(description = "站内信消息编号", example = "3001")
    private Long messageId;
    @Schema(description = "发送状态:SENT/FAILED", example = "SENT")
    private String status;
    @Schema(description = "失败原因")
    private String errorMessage;
    @Schema(description = "创建时间")
    private LocalDateTime createTime;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/mps/MesProMpsController.java
@@ -17,9 +17,11 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.pro.mps.MesProMpsService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -51,6 +53,8 @@
    private MesMdItemService itemService;
    @Resource
    private MesMdUnitMeasureService unitMeasureService;
    @Resource
    private MesProWorkOrderService workOrderService;
    @Resource
    private CrmCustomerApi customerApi;
@@ -145,6 +149,8 @@
                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
        Map<Long, CrmCustomerRespDTO> clientMap = customerApi.getCustomerMap(
                convertSet(list, MesProMpsDO::getClientId));
        Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
                convertSet(list, MesProMpsDO::getWorkOrderId));
        // 2. æ‹¼æŽ¥ VO
        return BeanUtils.toBean(list, MesProMpsRespVO.class, vo -> {
            MapUtils.findAndThen(itemMap, vo.getProductId(), item -> {
@@ -156,7 +162,23 @@
            });
            MapUtils.findAndThen(clientMap, vo.getClientId(),
                    client -> vo.setClientName(client.getName()));
            // æˆæœ¬æŒ‰ MPS è®¡åˆ’数量占工单数量比例分摊(合并下发时多条 MPS å…±äº«åŒä¸€å·¥å•)
            MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder -> {
                if (workOrder.getQuantity() == null || workOrder.getQuantity().compareTo(java.math.BigDecimal.ZERO) <= 0) {
                    return;
                }
                java.math.BigDecimal ratio = vo.getQuantity().divide(workOrder.getQuantity(), 8,
                        java.math.RoundingMode.HALF_UP);
                vo.setStandardMaterialCost(apportion(workOrder.getStandardMaterialCost(), ratio));
                vo.setActualMaterialCost(apportion(workOrder.getActualMaterialCost(), ratio));
                vo.setOverConsumeCost(apportion(workOrder.getOverConsumeCost(), ratio));
                vo.setMaterialUnitCost(workOrder.getMaterialUnitCost());
            });
        });
    }
    private static java.math.BigDecimal apportion(java.math.BigDecimal amount, java.math.BigDecimal ratio) {
        return amount != null ? amount.multiply(ratio).setScale(6, java.math.RoundingMode.HALF_UP) : null;
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/mps/vo/MesProMpsRespVO.java
@@ -70,6 +70,24 @@
    @ExcelProperty("已生产数量")
    private BigDecimal quantityProduced;
    // ========== ç‰©æ–™æˆæœ¬ï¼ˆæŒ‰ MPS æ•°é‡å å·¥å•数量比例分摊) ==========
    @Schema(description = "标准物料成本", example = "1000.00")
    @ExcelProperty("标准物料成本")
    private BigDecimal standardMaterialCost;
    @Schema(description = "实际物料成本", example = "1050.00")
    @ExcelProperty("实际物料成本")
    private BigDecimal actualMaterialCost;
    @Schema(description = "超耗物料成本", example = "50.00")
    @ExcelProperty("超耗物料成本")
    private BigDecimal overConsumeCost;
    @Schema(description = "物料单位成本(实际物料成本/已报工数量)", example = "10.50")
    @ExcelProperty("物料单位成本")
    private BigDecimal materialUnitCost;
    // ========== å®¢æˆ·ä¿¡æ¯ ==========
    @Schema(description = "客户编号", example = "300")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java
@@ -12,19 +12,25 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.bom.MesProWorkOrderBomSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemconsume.MesWmItemConsumeLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdProductBomService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.pro.cost.MesProMaterialPriceService;
import cn.iocoder.yudao.module.mes.service.pro.cost.dto.MesProMaterialPriceRespDTO;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductBomService;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
@@ -70,6 +76,12 @@
    private MesProRouteProductBomService routeProductBomService;
    @Resource
    private MesWmMaterialStockMapper materialStockMapper;
    @Resource
    private MesWmItemConsumeLineMapper consumeLineMapper;
    @Resource
    private MesMdProductBomService productBomService;
    @Resource
    private MesProMaterialPriceService materialPriceService;
    @Resource
    private ErpPurchaseOrderApi purchaseOrderApi;
@@ -126,43 +138,18 @@
            return success(Collections.emptyList());
        }
        // 2. èŽ·å–å·¥å•å·¥åºåˆ—è¡¨ï¼ˆå«å„å·¥åºçš„æŠ•æ–™æ˜Žç»†ä¸Žäº§å‡ºå“ï¼‰
        // 2. èŽ·å–å·¥å•å·¥åºåˆ—è¡¨ä¸Žå·¥å• BOM
        List<MesProWorkOrderProcessDO> processList = workOrderProcessService
                .getWorkOrderProcessListByWorkOrderId(workOrderId);
        if (CollUtil.isEmpty(processList)) {
            return success(Collections.emptyList());
        }
        // 3. èŽ·å–å·¥å• BOM è¡Œï¼ˆå„工序的投料记录,按 processId åˆ†ç»„使用)
        List<MesProWorkOrderBomDO> bomList = workOrderBomService.getWorkOrderBomListByWorkOrderId(workOrderId);
        if (CollUtil.isEmpty(bomList)) {
        // 3. è®¡ç®—本次生产的总物料需求
        Map<Long, BigDecimal> totalRequirements = buildTotalRequirements(workOrder, processList, bomList);
        if (CollUtil.isEmpty(totalRequirements)) {
            return success(Collections.emptyList());
        }
        // 4. é€šè¿‡äº§å“ID反查工艺路线(工单 routeId å¯èƒ½ä¸ºç©ºï¼‰
        Long routeId = null;
        if (workOrder.getProductId() != null) {
            MesProRouteProductDO routeProduct = routeProductService.getRouteProductByItemId(workOrder.getProductId());
            if (routeProduct != null) {
                routeId = routeProduct.getRouteId();
            }
        }
        // 5. æŒ‰å·¥åºäº§å‡ºé“¾é€å±‚展开 BOM,得到叶子物料(每单位成品的用量)
        Map<Long, BigDecimal> leafItems = buildWorkOrderItems(processList, bomList, routeId);
        if (CollUtil.isEmpty(leafItems)) {
            return success(Collections.emptyList());
        }
        // 6. ä¹˜ä»¥å·¥å•生产数量,得到总需求
        BigDecimal orderQty = workOrder.getQuantity() != null ? workOrder.getQuantity() : BigDecimal.ONE;
        Map<Long, BigDecimal> totalRequirements = new LinkedHashMap<>();
        for (Map.Entry<Long, BigDecimal> entry : leafItems.entrySet()) {
            totalRequirements.put(entry.getKey(), entry.getValue().multiply(orderQty));
        }
        // 7. æŸ¥è¯¢æ¥æºä¸ºæœ¬å·¥å•的采购订单明细,按产品汇总在途采购数
        // 4. æŸ¥è¯¢æ¥æºä¸ºæœ¬å·¥å•的采购订单明细,按产品汇总在途采购数
        //    sourceType=1 è¡¨ç¤ºæ¥æºç±»åž‹ä¸º"生产工单"
        Map<Long, BigDecimal> purchaseOrderQtyMap = new HashMap<>();
        List<ErpPurchaseOrderItemRespDTO> poItems = purchaseOrderApi
@@ -179,8 +166,83 @@
            }
        }
        // 8. æŸ¥è¯¢åº“存,拼接 VO
        return success(buildItemRespVOList(totalRequirements, purchaseOrderQtyMap));
        // 5. æŸ¥è¯¢æœ¬å·¥å•累计消耗,拼接 VO
        Map<Long, BigDecimal> actualQuantityMap = buildActualQuantityMap(workOrderId);
        return success(buildItemRespVOList(totalRequirements, purchaseOrderQtyMap, actualQuantityMap));
    }
    /**
     * è®¡ç®—工单总物料需求。
     *
     * ä¼˜å…ˆçº§ï¼š
     * 1. å·¥åºäº§å‡ºé“¾å±•开(有工序、有工单 BOM æ—¶ï¼‰
     * 2. äº§å“ BOM Ã— å·¥å•数量(未配置工序/工单 BOM æ—¶çš„兜底,保证能按单量算料)
     * 3. å·¥å• BOM å…œåº•(无工序行已按工单数量放大;有工序行为单位用量,需乘工单数量)
     */
    private Map<Long, BigDecimal> buildTotalRequirements(MesProWorkOrderDO workOrder,
                                                         List<MesProWorkOrderProcessDO> processList,
                                                         List<MesProWorkOrderBomDO> bomList) {
        BigDecimal orderQty = workOrder.getQuantity() != null ? workOrder.getQuantity() : BigDecimal.ONE;
        // 1. å·¥åºäº§å‡ºé“¾å±•å¼€
        if (CollUtil.isNotEmpty(processList) && CollUtil.isNotEmpty(bomList)) {
            Long routeId = null;
            if (workOrder.getProductId() != null) {
                MesProRouteProductDO routeProduct = routeProductService
                        .getRouteProductByItemId(workOrder.getProductId());
                if (routeProduct != null) {
                    routeId = routeProduct.getRouteId();
                }
            }
            Map<Long, BigDecimal> leafItems = buildWorkOrderItems(processList, bomList, routeId);
            if (CollUtil.isNotEmpty(leafItems)) {
                return multiplyQuantity(leafItems, orderQty);
            }
        }
        // 2. äº§å“ BOM Ã— å·¥å•数量
        List<MesMdProductBomDO> productBomList = productBomService
                .getProductBomListByItemId(workOrder.getProductId());
        if (CollUtil.isNotEmpty(productBomList)) {
            Map<Long, BigDecimal> requirements = new LinkedHashMap<>();
            for (MesMdProductBomDO bom : productBomList) {
                if (bom.getBomItemId() != null && bom.getQuantity() != null) {
                    requirements.merge(bom.getBomItemId(),
                            bom.getQuantity().multiply(orderQty), BigDecimal::add);
                }
            }
            return requirements;
        }
        // 3. å·¥å• BOM å…œåº•
        if (CollUtil.isNotEmpty(bomList)) {
            Map<Long, BigDecimal> requirements = new LinkedHashMap<>();
            for (MesProWorkOrderBomDO bom : bomList) {
                if (bom.getItemId() == null || bom.getQuantity() == null) {
                    continue;
                }
                BigDecimal quantity = bom.getProcessId() == null
                        ? bom.getQuantity() : bom.getQuantity().multiply(orderQty);
                requirements.merge(bom.getItemId(), quantity, BigDecimal::add);
            }
            return requirements;
        }
        return Collections.emptyMap();
    }
    private static Map<Long, BigDecimal> multiplyQuantity(Map<Long, BigDecimal> source, BigDecimal factor) {
        Map<Long, BigDecimal> result = new LinkedHashMap<>();
        for (Map.Entry<Long, BigDecimal> entry : source.entrySet()) {
            result.put(entry.getKey(), entry.getValue().multiply(factor));
        }
        return result;
    }
    private Map<Long, BigDecimal> buildActualQuantityMap(Long workOrderId) {
        Map<Long, BigDecimal> result = new HashMap<>();
        for (MesWmItemConsumeLineDO line : consumeLineMapper.selectListByWorkOrderId(workOrderId)) {
            if (line.getItemId() != null && line.getQuantity() != null) {
                result.merge(line.getItemId(), line.getQuantity(), BigDecimal::add);
            }
        }
        return result;
    }
    // ==================== æ‹¼æŽ¥ VO ====================
@@ -318,13 +380,16 @@
    // ==================== æ‹¼æŽ¥ç‰©æ–™éœ€æ±‚ VO(含库存校验) ====================
    private List<MesProWorkOrderItemRespVO> buildItemRespVOList(Map<Long, BigDecimal> requirements,
                                                                  Map<Long, BigDecimal> purchaseOrderQtyMap) {
        // 1. æ‰¹é‡èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯
                                                                  Map<Long, BigDecimal> purchaseOrderQtyMap,
                                                                  Map<Long, BigDecimal> actualQuantityMap) {
        // 1. æ‰¹é‡èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯ + ç‰©æ–™ä»·æ ¼
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(requirements.keySet());
        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
        Map<Long, MesMdItemTypeDO> itemTypeMap = itemTypeService.getItemTypeMap(
                convertSet(itemMap.values(), MesMdItemDO::getItemTypeId));
        Map<Long, MesProMaterialPriceRespDTO> priceMap = materialPriceService
                .getMaterialPriceMap(requirements.keySet());
        // 2. æ‰¹é‡æŸ¥è¯¢åº“存,按 itemId æ±‡æ€»å¯ç”¨é‡ï¼ˆåœ¨åº“ - å†»ç»“ - å ç”¨ï¼‰
        Map<Long, BigDecimal> stockMap = new HashMap<>();
@@ -352,9 +417,18 @@
            // å……足判断 = å¯ç”¨åº“å­˜ + åœ¨é€”采购数 >= éœ€æ±‚数量
            BigDecimal totalSupply = stockQty.add(purchaseQty);
            MesProMaterialPriceRespDTO price = priceMap.get(item.getId());
            BigDecimal unitPrice = price != null && price.getUnitPrice() != null
                    ? price.getUnitPrice() : BigDecimal.ZERO;
            BigDecimal amount = requiredQty.multiply(unitPrice);
            MesProWorkOrderItemRespVO vo = new MesProWorkOrderItemRespVO()
                    .setItemId(item.getId()).setQuantity(requiredQty)
                    .setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification())
                    .setActualQuantity(actualQuantityMap.getOrDefault(item.getId(), BigDecimal.ZERO))
                    .setUnitPrice(unitPrice)
                    .setAmount(amount)
                    .setPriceMissing(price == null || Boolean.TRUE.equals(price.getPriceMissing()))
                    .setStockQuantity(stockQty)
                    .setPurchaseOrderQuantity(purchaseQty)
                    .setStockSufficient(totalSupply.compareTo(requiredQty) >= 0);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java
@@ -27,6 +27,18 @@
    @Schema(description = "需求数量", example = "1000.00")
    private BigDecimal quantity;
    @Schema(description = "已消耗数量(该工单累计投料)", example = "120.00")
    private BigDecimal actualQuantity;
    @Schema(description = "物料单价", example = "12.50")
    private BigDecimal unitPrice;
    @Schema(description = "需求金额(需求数量×物料单价)", example = "12500.00")
    private BigDecimal amount;
    @Schema(description = "是否缺少价格(物料主数据与已审核采购订单均无价格)", example = "false")
    private Boolean priceMissing;
    @Schema(description = "可用库存", example = "500.00")
    private BigDecimal stockQuantity;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java
@@ -8,6 +8,7 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -38,6 +39,12 @@
    @Schema(description = "工单状态", example = "1")
    private Integer status;
    @Schema(description = "排除的工单状态列表", example = "2,3")
    private List<Integer> excludeStatuses;
    @Schema(description = "装箱状态:0未装箱 1部分已装箱 2已装箱完成", example = "1")
    private Integer packingStatus;
    @Schema(description = "需求日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] requestDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java
@@ -69,6 +69,19 @@
    @ExcelProperty("已生产数量")
    private BigDecimal quantityProduced;
    @Schema(description = "已装箱数量", example = "30.00")
    @ExcelProperty("已装箱数量")
    private BigDecimal packedQuantity;
    @Schema(description = "已装箱箱数", example = "3")
    @ExcelProperty("已装箱箱数")
    private Integer packedBoxCount;
    @Schema(description = "装箱状态", example = "1")
    @ExcelProperty(value = "装箱状态", converter = DictConvert.class)
    @DictFormat(DictTypeConstants.MES_PRO_WORK_ORDER_PACKING_STATUS)
    private Integer packingStatus;
    @Schema(description = "完工进度", example = "50.00")
    @ExcelProperty("完工进度")
    private BigDecimal completionProgress;
@@ -81,6 +94,30 @@
    @ExcelProperty("已排产数量")
    private BigDecimal quantityScheduled;
    @Schema(description = "超耗报警比例(%)", example = "5")
    @ExcelProperty("超耗报警比例(%)")
    private BigDecimal overConsumeRatio;
    @Schema(description = "标准物料成本", example = "1000.00")
    @ExcelProperty("标准物料成本")
    private BigDecimal standardMaterialCost;
    @Schema(description = "实际物料成本", example = "1050.00")
    @ExcelProperty("实际物料成本")
    private BigDecimal actualMaterialCost;
    @Schema(description = "超耗物料成本", example = "50.00")
    @ExcelProperty("超耗物料成本")
    private BigDecimal overConsumeCost;
    @Schema(description = "物料单位成本(实际物料成本/已报工数量)", example = "10.50")
    @ExcelProperty("物料单位成本")
    private BigDecimal materialUnitCost;
    @Schema(description = "成本计算时间")
    @ExcelProperty("成本计算时间")
    private LocalDateTime costUpdateTime;
    @Schema(description = "客户编号", example = "300")
    private Long clientId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java
@@ -51,6 +51,10 @@
    @Schema(description = "已排产数量", example = "0")
    private BigDecimal quantityScheduled;
    @Schema(description = "超耗报警比例(%),为空取产品默认或全局配置", example = "5")
    @jakarta.validation.constraints.DecimalMin(value = "0", message = "超耗报警比例不能为负数")
    private BigDecimal overConsumeRatio;
    @Schema(description = "客户编号", example = "300")
    private Long clientId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/MesQcRetentionSampleController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSamplePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSampleRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSampleSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.retentionsample.MesQcRetentionSampleDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.qc.retentionsample.MesQcRetentionSampleService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
@Tag(name = "管理后台 - MES ç•™æ ·ç®¡ç†")
@RestController
@RequestMapping("/mes/qc/retention-sample")
@Validated
public class MesQcRetentionSampleController {
    @Resource
    private MesQcRetentionSampleService retentionSampleService;
    @Resource
    private MesMdItemService itemService;
    @Resource
    private AdminUserApi adminUserApi;
    @PostMapping("/create")
    @Operation(summary = "创建留样记录")
    @PreAuthorize("@ss.hasPermission('mes:qc-retention-sample:create')")
    public CommonResult<Long> createRetentionSample(
            @Valid @RequestBody MesQcRetentionSampleSaveReqVO createReqVO) {
        return success(retentionSampleService.createRetentionSample(createReqVO));
    }
    @PutMapping("/update")
    @Operation(summary = "更新留样记录")
    @PreAuthorize("@ss.hasPermission('mes:qc-retention-sample:update')")
    public CommonResult<Boolean> updateRetentionSample(
            @Valid @RequestBody MesQcRetentionSampleSaveReqVO updateReqVO) {
        retentionSampleService.updateRetentionSample(updateReqVO);
        return success(true);
    }
    @DeleteMapping("/delete")
    @Operation(summary = "删除留样记录")
    @Parameter(name = "id", description = "编号", required = true)
    @PreAuthorize("@ss.hasPermission('mes:qc-retention-sample:delete')")
    public CommonResult<Boolean> deleteRetentionSample(@RequestParam("id") Long id) {
        retentionSampleService.deleteRetentionSample(id);
        return success(true);
    }
    @GetMapping("/get")
    @Operation(summary = "获得留样记录详情")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:qc-retention-sample:query')")
    public CommonResult<MesQcRetentionSampleRespVO> getRetentionSample(@RequestParam("id") Long id) {
        MesQcRetentionSampleDO sample = retentionSampleService.getRetentionSample(id);
        return success(buildRetentionSampleRespVOList(Collections.singletonList(sample)).get(0));
    }
    @GetMapping("/page")
    @Operation(summary = "获得留样记录分页")
    @PreAuthorize("@ss.hasPermission('mes:qc-retention-sample:query')")
    public CommonResult<PageResult<MesQcRetentionSampleRespVO>> getRetentionSamplePage(
            @Valid MesQcRetentionSamplePageReqVO pageReqVO) {
        PageResult<MesQcRetentionSampleDO> pageResult =
                retentionSampleService.getRetentionSamplePage(pageReqVO);
        return success(new PageResult<>(buildRetentionSampleRespVOList(pageResult.getList()),
                pageResult.getTotal()));
    }
    // ==================== æ‹¼æŽ¥ VO ====================
    private List<MesQcRetentionSampleRespVO> buildRetentionSampleRespVOList(
            List<MesQcRetentionSampleDO> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
                convertSet(list, MesQcRetentionSampleDO::getProductId));
        Set<Long> keeperUserIds = convertSet(list, MesQcRetentionSampleDO::getKeeperUserId);
        Map<Long, AdminUserRespDTO> keeperMap = CollUtil.isNotEmpty(keeperUserIds)
                ? adminUserApi.getUserMap(keeperUserIds) : Collections.emptyMap();
        return BeanUtils.toBean(list, MesQcRetentionSampleRespVO.class, vo -> {
            findAndThen(itemMap, vo.getProductId(), item -> {
                vo.setProductCode(item.getCode());
                vo.setProductName(item.getName());
                vo.setProductSpecification(item.getSpecification());
            });
            findAndThen(keeperMap, vo.getKeeperUserId(),
                    user -> vo.setKeeperNickname(user.getNickname()));
        });
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/vo/MesQcRetentionSamplePageReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - MES ç•™æ ·è®°å½•分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MesQcRetentionSamplePageReqVO extends PageParam {
    @Schema(description = "留样编号", example = "LY202611050001")
    private String code;
    @Schema(description = "生产工单编号", example = "WO202611050001")
    private String workOrderCode;
    @Schema(description = "生产工单ID", example = "1024")
    private Long workOrderId;
    @Schema(description = "销售订单ID", example = "2048")
    private Long saleOrderId;
    @Schema(description = "销售订单号", example = "SO202611050001")
    private String saleOrderNo;
    @Schema(description = "产品ID", example = "88")
    private Long productId;
    @Schema(description = "生产批次号", example = "B20261105001")
    private String batchCode;
    @Schema(description = "留样人用户ID", example = "1")
    private Long keeperUserId;
    @Schema(description = "留样日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] sampleDate;
    @Schema(description = "留样到期日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] expiryDate;
    @Schema(description = "创建时间")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] createTime;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/vo/MesQcRetentionSampleRespVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES ç•™æ ·è®°å½• Response VO")
@Data
@ExcelIgnoreUnannotated
public class MesQcRetentionSampleRespVO {
    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
    @ExcelProperty("编号")
    private Long id;
    @Schema(description = "留样编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "LY202611050001")
    @ExcelProperty("留样编号")
    private String code;
    @Schema(description = "生产工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
    private Long workOrderId;
    @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "WO202611050001")
    @ExcelProperty("生产工单编号")
    private String workOrderCode;
    @Schema(description = "销售订单ID", example = "2048")
    private Long saleOrderId;
    @Schema(description = "销售订单号", example = "SO202611050001")
    @ExcelProperty("销售订单号")
    private String saleOrderNo;
    @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "88")
    private Long productId;
    @Schema(description = "产品编码", example = "P001")
    @ExcelProperty("产品编码")
    private String productCode;
    @Schema(description = "产品名称", example = "自热火锅")
    @ExcelProperty("产品名称")
    private String productName;
    @Schema(description = "规格型号", example = "400g/盒")
    private String productSpecification;
    @Schema(description = "生产批次号", example = "B20261105001")
    @ExcelProperty("生产批次号")
    private String batchCode;
    @Schema(description = "留样数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
    @ExcelProperty("留样数量")
    private Integer sampleQuantity;
    @Schema(description = "留样日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("留样日期")
    private LocalDateTime sampleDate;
    @Schema(description = "留样到期日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("留样到期日期")
    private LocalDateTime expiryDate;
    @Schema(description = "留样人用户ID", example = "1")
    private Long keeperUserId;
    @Schema(description = "留样人", example = "张三")
    @ExcelProperty("留样人")
    private String keeperNickname;
    @Schema(description = "备注", example = "留样 2 ä»¶ï¼Œå¸¸æ¸©ä¿å­˜")
    @ExcelProperty("备注")
    private String remark;
    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("创建时间")
    private LocalDateTime createTime;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/retentionsample/vo/MesQcRetentionSampleSaveReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES ç•™æ ·è®°å½•新增/修改 Request VO")
@Data
public class MesQcRetentionSampleSaveReqVO {
    @Schema(description = "编号", example = "1024")
    private Long id;
    @Schema(description = "生产工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
    @NotNull(message = "生产工单不能为空")
    private Long workOrderId;
    @Schema(description = "销售订单ID", example = "2048")
    private Long saleOrderId;
    @Schema(description = "留样数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
    @NotNull(message = "留样数量不能为空")
    @Min(value = 1, message = "留样数量必须大于 0")
    private Integer sampleQuantity;
    @Schema(description = "留样日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "留样日期不能为空")
    private LocalDateTime sampleDate;
    @Schema(description = "留样到期日期(为空时按留样日期 + 6 ä¸ªæœˆè‡ªåŠ¨è®¡ç®—ï¼‰")
    private LocalDateTime expiryDate;
    @Schema(description = "留样人用户ID", example = "1")
    private Long keeperUserId;
    @Schema(description = "备注", example = "留样 2 ä»¶ï¼Œå¸¸æ¸©ä¿å­˜")
    private String remark;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java
@@ -11,8 +11,10 @@
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
@@ -27,6 +29,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -49,6 +52,8 @@
        private MdmUnitMeasureApi mdmUnitMeasureApi;
        @Resource
        private MesProWorkOrderService workOrderService;
        @Resource
        private MesMdItemService mdItemService;
        @PostMapping("/create")
        @Operation(summary = "创建装箱明细")
@@ -109,6 +114,9 @@
                // æ‰¹é‡æŸ¥è¯¢å·¥å•
                Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
                                convertSet(list, MesWmPackageLineDO::getWorkOrderId));
                // æ‰¹é‡æŸ¥è¯¢ MES ç‰©æ–™ï¼ˆå–每箱数量,计算尾箱数量)
                Map<Long, MesMdItemDO> mdItemMap = mdItemService.getItemMap(
                                convertSet(list, MesWmPackageLineDO::getItemId));
                // æ‹¼æŽ¥æ•°æ®
                return BeanUtils.toBean(list, MesWmPackageLineRespVO.class, vo -> {
                        MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
@@ -120,6 +128,21 @@
                        MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(),
                                        workOrder -> vo.setWorkOrderCode(workOrder.getCode())
                                                        .setBatchCode(workOrder.getBatchCode()));
                        // å°¾ç®±æ•°é‡ï¼šæœ€åŽä¸€ç®±å®žé™…装的数量;刚好整箱时取每箱数量,并标记满装
                        MapUtils.findAndThen(mdItemMap, vo.getItemId(), item -> {
                                BigDecimal boxQuantity = item.getBoxQuantity();
                                if (boxQuantity == null || boxQuantity.compareTo(BigDecimal.ZERO) <= 0
                                                || vo.getQuantity() == null) {
                                        return;
                                }
                                BigDecimal remainder = vo.getQuantity().remainder(boxQuantity);
                                boolean full = remainder.compareTo(BigDecimal.ZERO) == 0;
                                BigDecimal tailBoxQuantity = (full ? boxQuantity : remainder).stripTrailingZeros();
                                if (tailBoxQuantity.scale() < 0) {
                                        tailBoxQuantity = tailBoxQuantity.setScale(0);
                                }
                                vo.setTailBoxQuantity(tailBoxQuantity).setTailBoxFull(full);
                        });
                });
        }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageRespVO.java
@@ -35,6 +35,9 @@
    @ExcelProperty("装箱日期")
    private LocalDateTime packageDate;
    @Schema(description = "销售订单 ID", example = "102")
    private Long saleOrderId;
    @Schema(description = "销售订单编号", example = "SO20260301")
    @ExcelProperty("销售订单编号")
    private String salesOrderCode;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java
@@ -28,6 +28,9 @@
    @NotNull(message = "装箱日期不能为空")
    private LocalDateTime packageDate;
    @Schema(description = "销售订单 ID", example = "102")
    private Long saleOrderId;
    @Schema(description = "销售订单编号", example = "SO20260301")
    private String salesOrderCode;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java
@@ -44,6 +44,15 @@
    @Schema(description = "装箱数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
    private BigDecimal quantity;
    @Schema(description = "箱数", example = "10")
    private Integer boxCount;
    @Schema(description = "尾箱数量(最后一箱实际装的数量)", example = "10")
    private BigDecimal tailBoxQuantity;
    @Schema(description = "尾箱是否满装", example = "false")
    private Boolean tailBoxFull;
    @Schema(description = "生产工单 ID", example = "1")
    private Long workOrderId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesController.java
@@ -14,10 +14,16 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesShippingReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService;
import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -30,6 +36,7 @@
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -47,6 +54,10 @@
    private CrmCustomerApi crmCustomerApi;
    @Resource
    private MesWmSalesNoticeService salesNoticeService;
    @Resource
    private MdmItemApi mdmItemApi;
    @Resource
    private MdmUnitMeasureApi mdmUnitMeasureApi;
    @PostMapping("/create")
    @Operation(summary = "创建销售出库单")
@@ -89,6 +100,15 @@
            @Valid MesWmProductSalesPageReqVO pageReqVO) {
        PageResult<MesWmProductSalesDO> pageResult = productSalesService.getProductSalesPage(pageReqVO);
        return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
    }
    @GetMapping("/statistics-page")
    @Operation(summary = "获得发货统计分页")
    public CommonResult<PageResult<MesWmProductSalesStatisticsRespVO>> getProductSalesStatisticsPage(
            @Valid MesWmProductSalesStatisticsPageReqVO pageReqVO) {
        PageResult<MesWmProductSalesStatisticsRespVO> pageResult =
                productSalesService.getProductSalesStatisticsPage(pageReqVO);
        return success(new PageResult<>(buildStatisticsRespVOList(pageResult.getList()), pageResult.getTotal()));
    }
    @GetMapping("/export-excel")
@@ -156,6 +176,33 @@
    // ==================== æ‹¼æŽ¥ VO ====================
    private List<MesWmProductSalesStatisticsRespVO> buildStatisticsRespVOList(
            List<MesWmProductSalesStatisticsRespVO> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        // æ‰¹é‡æŸ¥è¯¢å®¢æˆ·
        Map<Long, CrmCustomerRespDTO> customerMap = crmCustomerApi.getCustomerMap(
                convertSet(list, MesWmProductSalesStatisticsRespVO::getClientId));
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ä¸Žè®¡é‡å•位
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(list, MesWmProductSalesStatisticsRespVO::getItemId));
        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
                        convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
        // æ‹¼æŽ¥åç§°
        list.forEach(vo -> {
            MapUtils.findAndThen(customerMap, vo.getClientId(), customer -> vo.setClientName(customer.getName()));
            MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
                vo.setItemCode(item.getCode()).setItemName(item.getName())
                        .setSpecification(item.getSpecification());
                MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
                        unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
            });
        });
        return list;
    }
    private List<MesWmProductSalesRespVO> buildRespVOList(List<MesWmProductSalesDO> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesStatisticsPageReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - MES å‘货统计分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MesWmProductSalesStatisticsPageReqVO extends PageParam {
    @Schema(description = "客户编号", example = "1")
    private Long clientId;
    @Schema(description = "销售订单号", example = "SO-001")
    private String salesOrderCode;
    @Schema(description = "物料编号", example = "1")
    private Long itemId;
    @Schema(description = "发货日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] shipmentDate;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesStatisticsRespVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES å‘货统计 Response VO")
@Data
@Accessors(chain = true)
public class MesWmProductSalesStatisticsRespVO {
    @Schema(description = "客户编号", example = "1")
    private Long clientId;
    @Schema(description = "客户名称", example = "客户 A")
    private String clientName;
    @Schema(description = "销售订单号", example = "SO-001")
    private String salesOrderCode;
    @Schema(description = "物料编号", example = "1")
    private Long itemId;
    @Schema(description = "物料编码", example = "M001")
    private String itemCode;
    @Schema(description = "物料名称", example = "产品A")
    private String itemName;
    @Schema(description = "规格型号", example = "100g")
    private String specification;
    @Schema(description = "单位名称", example = "个")
    private String unitMeasureName;
    @Schema(description = "发货数量合计", example = "100")
    private BigDecimal totalQuantity;
    @Schema(description = "发货箱数合计", example = "10")
    private Integer totalBoxCount;
    @Schema(description = "发货单数", example = "2")
    private Long shipmentCount;
    @Schema(description = "最近发货日期")
    private LocalDateTime lastShipmentDate;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineRespVO.java
@@ -37,6 +37,9 @@
    @Schema(description = "出库数量", example = "100")
    private BigDecimal quantity;
    @Schema(description = "箱数", example = "10")
    private Integer boxCount;
    @Schema(description = "批次ID", example = "1")
    private Long batchId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java
@@ -60,6 +60,12 @@
     */
    private Long itemTypeId;
    /**
     * æ¯ç®±æ•°é‡
     *
     * è£…箱时按 æ•°é‡ / æ¯ç®±æ•°é‡ å‘上取整自动计算箱数
     */
    private BigDecimal boxQuantity;
    /**
     * çŠ¶æ€
     *
     * æžšä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
@@ -78,6 +84,12 @@
     */
    private BigDecimal maxStock;
    /**
     * é»˜è®¤è¶…耗报警比例(%)
     *
     * ä¸ºç©ºæ—¶å–全局配置 mes.pro-over-consume.default-ratio
     */
    private BigDecimal overConsumeRatio;
    /**
     * æ˜¯å¦é«˜å€¼ç‰©æ–™
     */
    private Boolean highValue;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java
@@ -49,6 +49,12 @@
     */
    private String itemOrProduct;
    /**
     * æ˜¯å¦æˆå“åˆ†ç±»
     *
     * åªæœ‰æˆå“åˆ†ç±»ä¸‹çš„物料允许装箱
     */
    private Boolean finishedFlag;
    /**
     * æ˜¾ç¤ºæŽ’序
     */
    private Integer sort;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/alert/MesProOverConsumeAlertDO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.pro.alert;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
 * MES å·¥å•物料超耗报警记录 DO
 *
 * @author è¶…级管理员
 */
@TableName("mes_pro_over_consume_alert")
@KeySequence("mes_pro_over_consume_alert_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MesProOverConsumeAlertDO extends BaseDO {
    /**
     * ç¼–号
     */
    @TableId
    private Long id;
    /**
     * ç”Ÿäº§å·¥å•编号
     */
    private Long workOrderId;
    /**
     * ç”Ÿäº§å·¥å•编码
     */
    private String workOrderCode;
    /**
     * äº§å“ç¼–号
     */
    private Long productId;
    /**
     * äº§å“åç§°
     */
    private String productName;
    /**
     * ç‰©æ–™ç¼–号
     */
    private Long itemId;
    /**
     * ç‰©æ–™ç¼–码
     */
    private String itemCode;
    /**
     * ç‰©æ–™åç§°
     */
    private String itemName;
    /**
     * æ ‡å‡†ç”¨é‡ï¼ˆæŒ‰å·²æŠ¥å·¥æ•°é‡ï¼‰
     */
    private BigDecimal standardQuantity;
    /**
     * å®žé™…用量
     */
    private BigDecimal actualQuantity;
    /**
     * è¶…耗数量
     */
    private BigDecimal overQuantity;
    /**
     * è¶…耗比例(%)
     */
    private BigDecimal overRatio;
    /**
     * æŠ¥è­¦é˜ˆå€¼ï¼ˆ%)
     */
    private BigDecimal thresholdRatio;
    /**
     * ç‰©æ–™å•ä»·
     */
    private BigDecimal unitPrice;
    /**
     * è¶…耗金额
     */
    private BigDecimal overAmount;
    /**
     * æŽ¥æ”¶äººç”¨æˆ·ç¼–号(逗号分隔)
     */
    private String notifyUserIds;
    /**
     * ç«™å†…信消息编号
     */
    private Long messageId;
    /**
     * å‘送状态:SENT / FAILED
     */
    private String status;
    /**
     * å¤±è´¥åŽŸå› 
     */
    private String errorMessage;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java
@@ -89,6 +89,47 @@
     */
    private BigDecimal quantityScheduled;
    /**
     * è¶…耗报警比例(%)
     *
     * ä¸ºç©ºæ—¶å–产品默认比例,再为空取全局配置 mes.pro-over-consume.default-ratio
     */
    private BigDecimal overConsumeRatio;
    /**
     * æ ‡å‡†ç‰©æ–™æˆæœ¬ï¼ˆæŒ‰è®¡åˆ’数量)
     */
    private BigDecimal standardMaterialCost;
    /**
     * å®žé™…物料成本(已发生消耗)
     */
    private BigDecimal actualMaterialCost;
    /**
     * è¶…耗物料成本
     */
    private BigDecimal overConsumeCost;
    /**
     * ç‰©æ–™å•位成本(实际物料成本 / å·²æŠ¥å·¥æ•°é‡ï¼‰
     */
    private BigDecimal materialUnitCost;
    /**
     * æˆæœ¬è®¡ç®—æ—¶é—´
     */
    private LocalDateTime costUpdateTime;
    /**
     * å·²è£…箱数量
     */
    private BigDecimal packedQuantity;
    /**
     * å·²è£…箱箱数
     */
    private Integer packedBoxCount;
    /**
     * è£…箱状态
     *
     * å­—å…¸ {@link DictTypeConstants#MES_PRO_WORK_ORDER_PACKING_STATUS}
     * 0=未装箱 1=部分已装箱 2=已装箱完成
     */
    private Integer packingStatus;
    /**
     * å®¢æˆ·ç¼–号
     *
     * å…³è” CRM å®¢æˆ· {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/retentionsample/MesQcRetentionSampleDO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.qc.retentionsample;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDateTime;
/**
 * MES ç•™æ ·è®°å½• DO
 *
 * @author è¶…级管理员
 */
@TableName("mes_qc_retention_sample")
@KeySequence("mes_qc_retention_sample_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MesQcRetentionSampleDO extends BaseDO {
    /**
     * ç¼–号
     */
    @TableId
    private Long id;
    /**
     * ç•™æ ·ç¼–号
     */
    private String code;
    /**
     * ç”Ÿäº§å·¥å• ID
     *
     * å…³è” {@link MesProWorkOrderDO#getId()}
     */
    private Long workOrderId;
    /**
     * ç”Ÿäº§å·¥å•编号(冗余)
     */
    private String workOrderCode;
    /**
     * é”€å”®è®¢å• ID
     */
    private Long saleOrderId;
    /**
     * é”€å”®è®¢å•号(冗余)
     */
    private String saleOrderNo;
    /**
     * äº§å“ ID
     *
     * å…³è” {@link MesMdItemDO#getId()}
     */
    private Long productId;
    /**
     * ç”Ÿäº§æ‰¹æ¬¡å·
     */
    private String batchCode;
    /**
     * ç•™æ ·æ•°é‡
     */
    private Integer sampleQuantity;
    /**
     * ç•™æ ·æ—¥æœŸ
     */
    private LocalDateTime sampleDate;
    /**
     * ç•™æ ·åˆ°æœŸæ—¥æœŸ
     */
    private LocalDateTime expiryDate;
    /**
     * ç•™æ ·äººç”¨æˆ· ID
     */
    private Long keeperUserId;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java
@@ -43,6 +43,12 @@
     */
    private LocalDateTime packageDate;
    /**
     * é”€å”®è®¢å• ID
     *
     * å…³è” ERP é”€å”®è®¢å• {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO#getId()}
     */
    private Long saleOrderId;
    /**
     * é”€å”®è®¢å•编号
     */
    private String salesOrderCode;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java
@@ -48,6 +48,12 @@
     * è£…箱数量
     */
    private BigDecimal quantity;
    /**
     * ç®±æ•°
     *
     * æŒ‰ è£…箱数量 / ç‰©æ–™æ¯ç®±æ•°é‡ å‘上取整自动计算
     */
    private Integer boxCount;
    // DONE @芋艿:需要在确认下;
    /**
     * ç”Ÿäº§å·¥å• ID
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java
@@ -62,6 +62,12 @@
     */
    private BigDecimal quantity;
    /**
     * ç®±æ•°
     *
     * æŒ‰ å‡ºåº“数量 / ç‰©æ–™æ¯ç®±æ•°é‡ å‘上取整自动计算
     */
    private Integer boxCount;
    /**
     * æ‰¹æ¬¡ ID
     *
     * å…³è” {@link MesWmBatchDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/alert/MesProOverConsumeAlertMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.mes.dal.mysql.pro.alert;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.pro.alert.vo.MesProOverConsumeAlertPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.alert.MesProOverConsumeAlertDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * MES å·¥å•物料超耗报警记录 Mapper
 *
 * @author è¶…级管理员
 */
@Mapper
public interface MesProOverConsumeAlertMapper extends BaseMapperX<MesProOverConsumeAlertDO> {
    default PageResult<MesProOverConsumeAlertDO> selectPage(MesProOverConsumeAlertPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MesProOverConsumeAlertDO>()
                .eqIfPresent(MesProOverConsumeAlertDO::getWorkOrderId, reqVO.getWorkOrderId())
                .eqIfPresent(MesProOverConsumeAlertDO::getItemId, reqVO.getItemId())
                .eqIfPresent(MesProOverConsumeAlertDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(MesProOverConsumeAlertDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MesProOverConsumeAlertDO::getId));
    }
    default List<MesProOverConsumeAlertDO> selectListByWorkOrderId(Long workOrderId) {
        return selectList(new LambdaQueryWrapperX<MesProOverConsumeAlertDO>()
                .eq(MesProOverConsumeAlertDO::getWorkOrderId, workOrderId)
                .orderByDesc(MesProOverConsumeAlertDO::getId));
    }
    default MesProOverConsumeAlertDO selectByWorkOrderIdAndItemId(Long workOrderId, Long itemId) {
        return selectOne(new LambdaQueryWrapperX<MesProOverConsumeAlertDO>()
                .eq(MesProOverConsumeAlertDO::getWorkOrderId, workOrderId)
                .eq(MesProOverConsumeAlertDO::getItemId, itemId)
                .last("LIMIT 1"));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java
@@ -8,10 +8,13 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
 * MES ç”Ÿäº§æŠ¥å·¥ Mapper
@@ -70,4 +73,22 @@
                .in(MesProFeedbackDO::getTaskId, taskIds));
    }
    /**
     * æ±‡æ€»æŒ‡å®šå·¥å•、指定工序下已完成报工的合格数量
     *
     * @param workOrderId ç”Ÿäº§å·¥å•编号
     * @param processIds  å·¥åºç¼–号集合
     * @return åˆæ ¼æ•°é‡åˆè®¡
     */
    default BigDecimal selectFinishedQualifiedQuantitySum(Long workOrderId, Collection<Long> processIds) {
        return selectList(new LambdaQueryWrapperX<MesProFeedbackDO>()
                .eq(MesProFeedbackDO::getWorkOrderId, workOrderId)
                .in(MesProFeedbackDO::getProcessId, processIds)
                .eq(MesProFeedbackDO::getStatus, MesProFeedbackStatusEnum.FINISHED.getStatus()))
                .stream()
                .map(MesProFeedbackDO::getQualifiedQuantity)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/mps/MesProMpsMapper.java
@@ -69,6 +69,15 @@
        return selectOne(MesProMpsDO::getSaleOrderItemId, saleOrderItemId);
    }
    /**
     * æ ¹æ®å·¥å• ID æŸ¥è¯¢ MPS åˆ—表(合并下发时一个工单对应多条 MPS)
     */
    default List<MesProMpsDO> selectListByWorkOrderId(Long workOrderId) {
        return selectList(new LambdaQueryWrapperX<MesProMpsDO>()
                .eq(MesProMpsDO::getWorkOrderId, workOrderId)
                .orderByAsc(MesProMpsDO::getId));
    }
    default List<MesProMpsDO> selectListBySaleOrderItemIds(Collection<Long> saleOrderItemIds) {
        if (saleOrderItemIds == null || saleOrderItemIds.isEmpty()) {
            return Collections.emptyList();
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
@@ -34,7 +34,10 @@
                .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                .notIn(CollUtil.isNotEmpty(reqVO.getExcludeStatuses()),
                        MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses())
                .orderByDesc(MesProWorkOrderDO::getId));
    }
@@ -50,8 +53,12 @@
                .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                .orderByDesc(MesProWorkOrderDO::getId);
        if (CollUtil.isNotEmpty(reqVO.getExcludeStatuses())) {
            wrapper.notIn(MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses());
        }
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
@@ -103,4 +110,24 @@
        return selectCount(MesProWorkOrderDO::getVendorId, vendorId);
    }
    /**
     * ç´¯åŠ å·¥å•çš„å·²è£…ç®±æ•°é‡ä¸Žå·²è£…ç®±ç®±æ•°
     */
    default void updatePackedQuantity(Long id, BigDecimal incrQuantity, Integer incrBoxCount) {
        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
                .eq(MesProWorkOrderDO::getId, id)
                .setSql("packed_quantity = IFNULL(packed_quantity, 0) + " + incrQuantity.toPlainString())
                .setSql("packed_box_count = IFNULL(packed_box_count, 0) + " + incrBoxCount));
    }
    /**
     * æ ¹æ®å·²è£…箱数量重算装箱状态:已装 >= å·¥å•数量为完成(2),部分为 1,否则 0
     */
    default void updatePackingStatus(Long id) {
        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
                .eq(MesProWorkOrderDO::getId, id)
                .setSql("packing_status = CASE WHEN IFNULL(packed_quantity, 0) >= IFNULL(quantity, 0) THEN 2 "
                        + "WHEN IFNULL(packed_quantity, 0) > 0 THEN 1 ELSE 0 END"));
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/retentionsample/MesQcRetentionSampleMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.mes.dal.mysql.qc.retentionsample;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSamplePageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.retentionsample.MesQcRetentionSampleDO;
import org.apache.ibatis.annotations.Mapper;
/**
 * MES ç•™æ ·è®°å½• Mapper
 *
 * @author è¶…级管理员
 */
@Mapper
public interface MesQcRetentionSampleMapper extends BaseMapperX<MesQcRetentionSampleDO> {
    default PageResult<MesQcRetentionSampleDO> selectPage(MesQcRetentionSamplePageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MesQcRetentionSampleDO>()
                .likeIfPresent(MesQcRetentionSampleDO::getCode, reqVO.getCode())
                .likeIfPresent(MesQcRetentionSampleDO::getWorkOrderCode, reqVO.getWorkOrderCode())
                .eqIfPresent(MesQcRetentionSampleDO::getWorkOrderId, reqVO.getWorkOrderId())
                .eqIfPresent(MesQcRetentionSampleDO::getSaleOrderId, reqVO.getSaleOrderId())
                .likeIfPresent(MesQcRetentionSampleDO::getSaleOrderNo, reqVO.getSaleOrderNo())
                .eqIfPresent(MesQcRetentionSampleDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesQcRetentionSampleDO::getBatchCode, reqVO.getBatchCode())
                .eqIfPresent(MesQcRetentionSampleDO::getKeeperUserId, reqVO.getKeeperUserId())
                .betweenIfPresent(MesQcRetentionSampleDO::getSampleDate, reqVO.getSampleDate())
                .betweenIfPresent(MesQcRetentionSampleDO::getExpiryDate, reqVO.getExpiryDate())
                .betweenIfPresent(MesQcRetentionSampleDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MesQcRetentionSampleDO::getId));
    }
    default MesQcRetentionSampleDO selectByCode(String code) {
        return selectOne(MesQcRetentionSampleDO::getCode, code);
    }
    default MesQcRetentionSampleDO selectByWorkOrderId(Long workOrderId) {
        return selectOne(MesQcRetentionSampleDO::getWorkOrderId, workOrderId);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemconsume/MesWmItemConsumeLineMapper.java
@@ -3,8 +3,10 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemconsume.vo.MesWmItemConsumeLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemconsume.vo.MesWmItemConsumeLineRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeLineDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -38,4 +40,16 @@
        return selectList(MesWmItemConsumeLineDO::getConsumeId, consumeId);
    }
    /**
     * æŸ¥è¯¢æŒ‡å®šç”Ÿäº§å·¥å•的全部物料消耗行
     */
    default List<MesWmItemConsumeLineDO> selectListByWorkOrderId(Long workOrderId) {
        MPJLambdaWrapperX<MesWmItemConsumeLineDO> query = new MPJLambdaWrapperX<>();
        query.selectAll(MesWmItemConsumeLineDO.class);
        query.innerJoin(MesWmItemConsumeDO.class,
                MesWmItemConsumeDO::getId, MesWmItemConsumeLineDO::getConsumeId);
        query.eq(MesWmItemConsumeDO::getWorkOrderId, workOrderId);
        return selectJoinList(MesWmItemConsumeLineDO.class, query);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java
@@ -25,4 +25,12 @@
        delete(MesWmPackageLineDO::getPackageId, packageId);
    }
    default java.util.List<MesWmPackageLineDO> selectListByPackageId(Long packageId) {
        return selectList(MesWmPackageLineDO::getPackageId, packageId);
    }
    default java.util.List<MesWmPackageLineDO> selectListByWorkOrderId(Long workOrderId) {
        return selectList(MesWmPackageLineDO::getWorkOrderId, workOrderId);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java
@@ -5,8 +5,12 @@
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -62,4 +66,11 @@
        return selectList(MesWmProductSalesDO::getClientId, clientId);
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢å‘货统计:按 å®¢æˆ· + é”€å”®è®¢å•号 + ç‰©æ–™ æ±‡æ€»å·²å®Œæˆå‡ºåº“单的箱数与数量
     */
    IPage<MesWmProductSalesStatisticsRespVO> selectStatisticsPage(
            IPage<MesWmProductSalesStatisticsRespVO> page,
            @Param("pageReqVO") MesWmProductSalesStatisticsPageReqVO pageReqVO);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
@@ -19,6 +19,7 @@
    String MES_PRO_WORK_ORDER_STATUS = "mes_pro_work_order_status"; // MES ç”Ÿäº§å·¥å•状态
    String MES_PRO_WORK_ORDER_SOURCE_TYPE = "mes_pro_work_order_source_type"; // MES å·¥å•来源类型
    String MES_PRO_WORK_ORDER_TYPE = "mes_pro_work_order_type"; // MES å·¥å•类型
    String MES_PRO_WORK_ORDER_PACKING_STATUS = "mes_pro_work_order_packing_status"; // MES ç”Ÿäº§å·¥å•装箱状态
    String MES_PRO_MPS_STATUS = "mes_pro_mps_status"; // MES ç”Ÿäº§ä¸»è®¡åˆ’状态
    String MES_PRO_LINK_TYPE = "mes_pro_link_type"; // MES å·¥åºå…³ç³»ç±»åž‹
    String MES_TIME_UNIT_TYPE = "mes_time_unit_type"; // MES æ—¶é—´å•位
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -282,6 +282,8 @@
    ErrorCode PRO_WORK_ORDER_HAS_CHILDREN = new ErrorCode(1_040_502_004, "存在子工单,无法删除");
    ErrorCode PRO_WORK_ORDER_PRODUCT_MISMATCH = new ErrorCode(1_040_502_005, "当前产品物料与生产工单产品不一致");
    ErrorCode PRO_WORK_ORDER_SCHEDULE_QUANTITY_EXCEED = new ErrorCode(1_040_502_006, "排产数量超限:工单{}(计划{},已排产{},本次排产{})");
    ErrorCode PRO_WORK_ORDER_RETENTION_SAMPLE_REQUIRED = new ErrorCode(1_040_502_007, "生产工单【{}】尚未登记留样记录,无法完成;请先在【质量管理 â†’ ç•™æ ·ç®¡ç†ã€‘中新增该工单的留样记录");
    ErrorCode PRO_WORK_ORDER_NO_PRODUCED_QUANTITY = new ErrorCode(1_040_502_008, "生产工单【{}】已生产数量为 0,无法完成;请先在最后一道工序完成报工并审批通过,待工单已生产数量大于 0 åŽå†å®Œæˆå·¥å•");
    ErrorCode PRO_WORK_ORDER_BOM_NOT_EXISTS = new ErrorCode(1_040_502_100, "生产工单BOM不存在");
    // ========== MES ç”Ÿäº§ç®¡ç†-生产工单工序(1-040-502-300) ==========
@@ -460,6 +462,21 @@
    ErrorCode QC_NCR_NOT_PENDING_REVIEW = new ErrorCode(1_040_609_002, "只有待评审状态的不合格品处理单才可操作");
    ErrorCode QC_NCR_NOT_REVIEWED = new ErrorCode(1_040_609_003, "只有已评审状态的不合格品处理单才可执行处置");
    ErrorCode QC_NCR_NOT_DISPOSED = new ErrorCode(1_040_609_004, "只有已处置状态的不合格品处理单才可关闭");
    // ========== MES è´¨é‡ç®¡ç†-留样管理(1-040-610-000) ==========
    ErrorCode QC_RETENTION_SAMPLE_NOT_EXISTS = new ErrorCode(1_040_610_000, "留样记录不存在");
    ErrorCode QC_RETENTION_SAMPLE_CODE_DUPLICATE = new ErrorCode(1_040_610_001, "留样编号【{}】已存在,请刷新页面后重试");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_NOT_EXISTS = new ErrorCode(1_040_610_002, "生产工单不存在,请重新选择工单");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_DUPLICATE = new ErrorCode(1_040_610_003, "生产工单【{}】已登记留样记录(留样编号【{}】),每张工单只能登记一条留样;如需调整请修改原留样记录");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_CANCELED = new ErrorCode(1_040_610_004, "生产工单【{}】已取消,不能登记留样");
    ErrorCode QC_RETENTION_SAMPLE_QUANTITY_INVALID = new ErrorCode(1_040_610_005, "留样数量必须大于 0,请填写实际留样件数");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_REQUIRED = new ErrorCode(1_040_610_006, "生产工单【{}】来源销售订单【{}】,请选择对应的销售订单后再登记留样");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_MISMATCH = new ErrorCode(1_040_610_007, "所选销售订单与工单不一致:工单【{}】对应销售订单为【{}】,提交的销售订单为【{}】;请重新选择该工单对应的销售订单");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_610_008, "所选销售订单不存在({}),请重新选择");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_CHANGED = new ErrorCode(1_040_610_009, "留样记录不允许修改所属生产工单;如需更换工单,请删除本条记录后重新登记");
    ErrorCode QC_RETENTION_SAMPLE_FINISHED_DELETE = new ErrorCode(1_040_610_010, "生产工单【{}】已完成,留样记录不允许删除;如需调整请联系管理员");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_AMBIGUOUS = new ErrorCode(1_040_610_011, "生产工单【{}】由多张销售订单合并下发({}),请选择本次留样对应的销售订单");
    ErrorCode QC_RETENTION_SAMPLE_MPS_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_610_012, "生产工单【{}】由 MPS ä¸‹å‘,但 MPS è®°å½•的销售订单【{}】(ID={})在销售订单中不存在,无法登记留样;请先修正该 MPS çš„销售订单信息后再登记");
    // ========== MES ä»“库管理-仓库(1-040-700-000) ==========
    ErrorCode WM_WAREHOUSE_NOT_EXISTS = new ErrorCode(1_040_700_000, "仓库不存在");
@@ -805,6 +822,12 @@
    ErrorCode WM_PACKAGE_CHILD_NOT_FINISHED = new ErrorCode(1_040_740_007, "子箱必须是已完成状态才能添加");
    ErrorCode WM_PACKAGE_HAS_CHILDREN = new ErrorCode(1_040_740_008, "存在子箱,不允许删除");
    ErrorCode WM_PACKAGE_LINE_NOT_EXISTS = new ErrorCode(1_040_740_100, "装箱明细不存在");
    ErrorCode WM_PACKAGE_LINE_ITEM_NOT_FINISHED = new ErrorCode(1_040_740_101, "装箱物料【{}】所属分类不是成品分类,不能装箱;请选择成品分类下的物料");
    ErrorCode WM_PACKAGE_LINE_BOX_QUANTITY_NOT_CONFIGURED = new ErrorCode(1_040_740_102, "装箱物料【{}】未配置每箱数量,无法自动计算箱数;请先在物料档案中维护每箱数量");
    ErrorCode WM_PACKAGE_LINE_WORK_ORDER_PRODUCT_MISMATCH = new ErrorCode(1_040_740_103, "装箱物料【{}】与生产工单【{}】的产品【{}】不一致,请选择该工单对应的产品装箱");
    ErrorCode WM_PACKAGE_LINE_WORK_ORDER_QUANTITY_EXCEED = new ErrorCode(1_040_740_104, "生产工单【{}】装箱数量超限:工单数量 {},已装箱/已计划 {},本次装箱 {};请调整装箱数量");
    ErrorCode WM_PACKAGE_LINE_ASSEMBLY_PROCESS_NOT_FOUND = new ErrorCode(1_040_740_105, "生产工单【{}】未配置【组装】工序,不能装箱;请先在该工单的「工单工序」中添加名称为「组装」(编码 PRO-ASSEMBLY)的工序,并完成报工");
    ErrorCode WM_PACKAGE_LINE_ASSEMBLY_NOT_COMPLETED = new ErrorCode(1_040_740_106, "生产工单【{}】组装工序报工合格数量不足:已完成组装合格 {},本次装箱后累计装箱 {}(已装箱/已计划 {} + æœ¬æ¬¡ {});请先完成组装工序报工,或调小本次装箱数量");
    // ========== MES äº§å“è®¾è®¡-设计项目(1-040-800-000) ==========
    ErrorCode PD_PROJECT_NOT_EXISTS = new ErrorCode(1_040_800_000, "设计项目不存在");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -31,6 +31,7 @@
    QC_IPQC_CODE("QC_IPQC_CODE", "过程检验单编码"),
    QC_OQC_CODE("QC_OQC_CODE", "出货检验单编码"),
    QC_RQC_CODE("QC_RQC_CODE", "退货检验单编码"),
    QC_RETENTION_SAMPLE_CODE("QC_RETENTION_SAMPLE_CODE", "留样记录编码"),
    WM_WAREHOUSE_CODE("WM_WAREHOUSE_CODE", "仓库编码"),
    WM_LOCATION_CODE("WM_LOCATION_CODE", "库区编码"),
    WM_AREA_CODE("WM_AREA_CODE", "库位编码"),
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProMaterialPriceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.mes.service.pro.cost;
import cn.iocoder.yudao.module.mes.service.pro.cost.dto.MesProMaterialPriceRespDTO;
import java.util.Collection;
import java.util.Map;
/**
 * MES ç‰©æ–™ä»·æ ¼ Service æŽ¥å£
 *
 * @author è¶…级管理员
 */
public interface MesProMaterialPriceService {
    /**
     * æ‰¹é‡èŽ·å–ç‰©æ–™å•ä»·
     *
     * å–价顺序:物料主数据采购价 â†’ å·²å®¡æ ¸é‡‡è´­è®¢å•加权平均价 â†’ æ— ä»·æ ¼ï¼ˆå•ä»· 0,标记 priceMissing)
     *
     * @param itemIds MES ç‰©æ–™ç¼–号集合
     * @return ç‰©æ–™ç¼–号 â†’ ä»·æ ¼ä¿¡æ¯
     */
    Map<Long, MesProMaterialPriceRespDTO> getMaterialPriceMap(Collection<Long> itemIds);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProMaterialPriceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package cn.iocoder.yudao.module.mes.service.pro.cost;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.pro.cost.dto.MesProMaterialPriceRespDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
 * MES ç‰©æ–™ä»·æ ¼ Service å®žçŽ°ç±»
 *
 * @author è¶…级管理员
 */
@Service
@Validated
public class MesProMaterialPriceServiceImpl implements MesProMaterialPriceService {
    private static final String SOURCE_PURCHASE_PRICE = "PURCHASE_PRICE";
    private static final String SOURCE_ERP_AVERAGE = "ERP_AVERAGE";
    private static final String SOURCE_NONE = "NONE";
    @Resource
    private MesMdItemService itemService;
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private ErpPurchaseOrderApi purchaseOrderApi;
    @Override
    public Map<Long, MesProMaterialPriceRespDTO> getMaterialPriceMap(Collection<Long> itemIds) {
        if (CollUtil.isEmpty(itemIds)) {
            return Collections.emptyMap();
        }
        // 1. MES ç‰©æ–™ â†’ MDM ç‰©æ–™
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(itemIds);
        Set<Long> mdmItemIds = new HashSet<>();
        for (MesMdItemDO item : itemMap.values()) {
            if (item.getMdmItemId() != null) {
                mdmItemIds.add(item.getMdmItemId());
            }
        }
        Map<Long, MesMdmItemDO> mdmItemMap = mdmItemIds.isEmpty()
                ? Collections.emptyMap() : mdmItemService.getItemMap(mdmItemIds);
        // 2. ä¸»æ•°æ®æ²¡æœ‰é‡‡è´­ä»·çš„,查已审核采购订单加权平均价
        Set<Long> missingPriceMdmIds = new HashSet<>();
        for (Long mdmItemId : mdmItemIds) {
            MesMdmItemDO mdmItem = mdmItemMap.get(mdmItemId);
            if (mdmItem == null || !isPositive(mdmItem.getPurchasePrice())) {
                missingPriceMdmIds.add(mdmItemId);
            }
        }
        Map<Long, BigDecimal> averagePriceMap = missingPriceMdmIds.isEmpty()
                ? Collections.emptyMap()
                : purchaseOrderApi.getItemAveragePurchasePriceMap(missingPriceMdmIds).getCheckedData();
        // 3. ç»„装结果
        Map<Long, MesProMaterialPriceRespDTO> result = new HashMap<>(itemMap.size());
        for (Long itemId : itemIds) {
            MesMdItemDO item = itemMap.get(itemId);
            MesMdmItemDO mdmItem = item != null && item.getMdmItemId() != null
                    ? mdmItemMap.get(item.getMdmItemId()) : null;
            BigDecimal purchasePrice = mdmItem != null ? mdmItem.getPurchasePrice() : null;
            BigDecimal averagePrice = mdmItem != null ? averagePriceMap.get(mdmItem.getId()) : null;
            if (isPositive(purchasePrice)) {
                result.put(itemId, buildPrice(itemId, purchasePrice, SOURCE_PURCHASE_PRICE));
            } else if (isPositive(averagePrice)) {
                result.put(itemId, buildPrice(itemId, averagePrice, SOURCE_ERP_AVERAGE));
            } else {
                result.put(itemId, MesProMaterialPriceRespDTO.builder()
                        .itemId(itemId).unitPrice(BigDecimal.ZERO)
                        .source(SOURCE_NONE).priceMissing(true).build());
            }
        }
        return result;
    }
    private static MesProMaterialPriceRespDTO buildPrice(Long itemId, BigDecimal price, String source) {
        return MesProMaterialPriceRespDTO.builder()
                .itemId(itemId)
                .unitPrice(price.setScale(6, RoundingMode.HALF_UP))
                .source(source)
                .priceMissing(false)
                .build();
    }
    private static boolean isPositive(BigDecimal value) {
        return value != null && value.compareTo(BigDecimal.ZERO) > 0;
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProWorkOrderCostService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.mes.service.pro.cost;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
/**
 * MES ç”Ÿäº§å·¥å•物料成本 Service æŽ¥å£
 *
 * @author è¶…级管理员
 */
public interface MesProWorkOrderCostService {
    /**
     * é‡æ–°è®¡ç®—工单物料成本并回写工单
     *
     * @param workOrderId ç”Ÿäº§å·¥å•编号
     */
    void recalculateWorkOrderCost(Long workOrderId);
    /**
     * æŠ¥å·¥å®¡æ‰¹é€šè¿‡åŽå¤„理:重算成本 + æ£€æŸ¥è¶…耗并发送站内信报警
     *
     * å†…部捕获异常,避免影响报工审批主流程
     *
     * @param feedback æŠ¥å·¥å•
     */
    void handleFeedbackApproved(MesProFeedbackDO feedback);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/MesProWorkOrderCostServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,430 @@
package cn.iocoder.yudao.module.mes.service.pro.cost;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.alert.MesProOverConsumeAlertDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.alert.MesProOverConsumeAlertMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemconsume.MesWmItemConsumeLineMapper;
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdProductBomService;
import cn.iocoder.yudao.module.mes.service.pro.cost.dto.MesProMaterialPriceRespDTO;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * MES ç”Ÿäº§å·¥å•物料成本 Service å®žçŽ°ç±»
 *
 * @author è¶…级管理员
 */
@Service
@Validated
@Slf4j
public class MesProWorkOrderCostServiceImpl implements MesProWorkOrderCostService {
    /**
     * å…¨å±€é»˜è®¤è¶…耗报警比例(%)
     */
    private static final String CONFIG_DEFAULT_RATIO = "mes.pro-over-consume.default-ratio";
    /**
     * è¶…耗报警站内信接收人用户编号(逗号分隔)
     */
    private static final String CONFIG_NOTIFY_USER_IDS = "mes.pro-over-consume.notify-user-ids";
    /**
     * è¶…耗报警站内信模板编号
     */
    private static final String TEMPLATE_CODE = "mes_pro_work_order_over_consume";
    private static final BigDecimal DEFAULT_THRESHOLD = new BigDecimal("5");
    private static final BigDecimal HUNDRED = new BigDecimal("100");
    private static final int SCALE = 6;
    @Resource
    private MesProWorkOrderMapper workOrderMapper;
    @Resource
    private MesProWorkOrderBomService workOrderBomService;
    @Resource
    private MesMdProductBomService productBomService;
    @Resource
    private MesMdItemService itemService;
    @Resource
    private MesProMaterialPriceService materialPriceService;
    @Resource
    private MesProFeedbackMapper feedbackMapper;
    @Resource
    private MesWmItemConsumeLineMapper consumeLineMapper;
    @Resource
    private MesProOverConsumeAlertMapper alertMapper;
    @Resource
    private ConfigApi configApi;
    @Resource
    private NotifyMessageSendApi notifyMessageSendApi;
    @Override
    public void recalculateWorkOrderCost(Long workOrderId) {
        if (workOrderId == null) {
            return;
        }
        MesProWorkOrderDO workOrder = workOrderMapper.selectById(workOrderId);
        if (workOrder == null) {
            return;
        }
        // 1. æ ‡å‡† BOM å•位用量 + å®žé™…消耗
        Map<Long, BigDecimal> perUnitBom = getPerUnitStandardBom(workOrder);
        Map<Long, BigDecimal> actualQuantities = getActualConsumption(workOrderId);
        Set<Long> itemIds = new HashSet<>(perUnitBom.keySet());
        itemIds.addAll(actualQuantities.keySet());
        Map<Long, MesProMaterialPriceRespDTO> priceMap = getPriceMap(itemIds);
        BigDecimal plannedQuantity = defaultZero(workOrder.getQuantity());
        BigDecimal reportedQuantity = getReportedQuantity(workOrder);
        BigDecimal standardCost = BigDecimal.ZERO;
        BigDecimal actualCost = BigDecimal.ZERO;
        BigDecimal overCost = BigDecimal.ZERO;
        for (Long itemId : itemIds) {
            BigDecimal unitPrice = getUnitPrice(priceMap, itemId);
            BigDecimal perUnit = perUnitBom.getOrDefault(itemId, BigDecimal.ZERO);
            BigDecimal actualQuantity = actualQuantities.getOrDefault(itemId, BigDecimal.ZERO);
            standardCost = standardCost.add(perUnit.multiply(plannedQuantity).multiply(unitPrice));
            actualCost = actualCost.add(actualQuantity.multiply(unitPrice));
            BigDecimal standardForReported = perUnit.multiply(reportedQuantity);
            if (standardForReported.compareTo(BigDecimal.ZERO) > 0) {
                BigDecimal overQuantity = actualQuantity.subtract(standardForReported);
                if (overQuantity.compareTo(BigDecimal.ZERO) > 0) {
                    overCost = overCost.add(overQuantity.multiply(unitPrice));
                }
            }
        }
        // 2. å›žå†™å·¥å•
        BigDecimal materialUnitCost = reportedQuantity.compareTo(BigDecimal.ZERO) > 0
                ? actualCost.divide(reportedQuantity, SCALE, RoundingMode.HALF_UP) : null;
        workOrderMapper.updateById(new MesProWorkOrderDO().setId(workOrderId)
                .setStandardMaterialCost(scale(standardCost))
                .setActualMaterialCost(scale(actualCost))
                .setOverConsumeCost(scale(overCost))
                .setMaterialUnitCost(materialUnitCost)
                .setCostUpdateTime(LocalDateTime.now()));
    }
    @Override
    public void handleFeedbackApproved(MesProFeedbackDO feedback) {
        if (feedback == null || feedback.getWorkOrderId() == null) {
            return;
        }
        try {
            recalculateWorkOrderCost(feedback.getWorkOrderId());
        } catch (Exception ex) {
            log.error("[handleFeedbackApproved][工单({}) é‡ç®—物料成本失败]",
                    feedback.getWorkOrderId(), ex);
        }
        try {
            checkOverConsumeAlerts(feedback.getWorkOrderId());
        } catch (Exception ex) {
            log.error("[handleFeedbackApproved][工单({}) è¶…耗报警检查失败]",
                    feedback.getWorkOrderId(), ex);
        }
    }
    // ==================== è¶…耗报警 ====================
    private void checkOverConsumeAlerts(Long workOrderId) {
        MesProWorkOrderDO workOrder = workOrderMapper.selectById(workOrderId);
        if (workOrder == null) {
            return;
        }
        Map<Long, BigDecimal> perUnitBom = getPerUnitStandardBom(workOrder);
        if (perUnitBom.isEmpty()) {
            return;
        }
        Map<Long, BigDecimal> actualQuantities = getActualConsumption(workOrderId);
        if (actualQuantities.isEmpty()) {
            return;
        }
        BigDecimal reportedQuantity = getReportedQuantity(workOrder);
        BigDecimal threshold = resolveThreshold(workOrder);
        BigDecimal allowedFactor = BigDecimal.ONE.add(threshold.divide(HUNDRED, SCALE, RoundingMode.HALF_UP));
        // 1. æ‰¾å‡ºè¶…耗物料
        Map<Long, BigDecimal> overQuantityMap = new LinkedHashMap<>();
        for (Map.Entry<Long, BigDecimal> entry : perUnitBom.entrySet()) {
            BigDecimal standardQuantity = entry.getValue().multiply(reportedQuantity);
            if (standardQuantity.compareTo(BigDecimal.ZERO) <= 0) {
                continue;
            }
            BigDecimal actualQuantity = actualQuantities.getOrDefault(entry.getKey(), BigDecimal.ZERO);
            if (actualQuantity.compareTo(standardQuantity.multiply(allowedFactor)) > 0) {
                overQuantityMap.put(entry.getKey(), actualQuantity.subtract(standardQuantity));
            }
        }
        if (overQuantityMap.isEmpty()) {
            return;
        }
        // 2. é€ä¸ªç‰©æ–™ç”ŸæˆæŠ¥è­¦è®°å½•(同一工单+物料只报警一次)
        Set<Long> itemIds = new HashSet<>(overQuantityMap.keySet());
        itemIds.add(workOrder.getProductId());
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(itemIds);
        Map<Long, MesProMaterialPriceRespDTO> priceMap = getPriceMap(overQuantityMap.keySet());
        MesMdItemDO product = itemMap.get(workOrder.getProductId());
        String notifyUserIds = getNotifyUserIds();
        for (Map.Entry<Long, BigDecimal> entry : overQuantityMap.entrySet()) {
            Long itemId = entry.getKey();
            if (alertMapper.selectByWorkOrderIdAndItemId(workOrderId, itemId) != null) {
                continue;
            }
            MesMdItemDO item = itemMap.get(itemId);
            BigDecimal perUnit = perUnitBom.getOrDefault(itemId, BigDecimal.ZERO);
            BigDecimal standardQuantity = perUnit.multiply(reportedQuantity);
            BigDecimal actualQuantity = actualQuantities.getOrDefault(itemId, BigDecimal.ZERO);
            BigDecimal overQuantity = entry.getValue();
            BigDecimal unitPrice = getUnitPrice(priceMap, itemId);
            MesProOverConsumeAlertDO alert = MesProOverConsumeAlertDO.builder()
                    .workOrderId(workOrderId).workOrderCode(workOrder.getCode())
                    .productId(workOrder.getProductId())
                    .productName(product != null ? product.getName() : null)
                    .itemId(itemId).itemCode(item != null ? item.getCode() : null)
                    .itemName(item != null ? item.getName() : null)
                    .standardQuantity(scale(standardQuantity))
                    .actualQuantity(scale(actualQuantity))
                    .overQuantity(scale(overQuantity))
                    .overRatio(overQuantity.multiply(HUNDRED).divide(standardQuantity, 4, RoundingMode.HALF_UP))
                    .thresholdRatio(threshold.setScale(4, RoundingMode.HALF_UP))
                    .unitPrice(scale(unitPrice))
                    .overAmount(scale(overQuantity.multiply(unitPrice)))
                    .notifyUserIds(notifyUserIds)
                    .status("FAILED")
                    .build();
            alertMapper.insert(alert);
            try {
                sendOverConsumeMessage(alert, notifyUserIds);
            } catch (Exception ex) {
                log.warn("[checkOverConsumeAlerts][工单({}) ç‰©æ–™({}) è¶…耗站内信发送失败]",
                        workOrder.getCode(), item != null ? item.getCode() : itemId, ex);
                alert.setStatus("FAILED");
                alert.setErrorMessage(StrUtil.maxLength(
                        "发送失败:" + StrUtil.blankToDefault(ex.getMessage(), ex.getClass().getSimpleName()), 500));
            }
            alertMapper.updateById(alert);
        }
    }
    private void sendOverConsumeMessage(MesProOverConsumeAlertDO alert, String notifyUserIds) {
        if (StrUtil.isBlank(notifyUserIds)) {
            throw new IllegalStateException(
                    "未配置超耗报警接收人,请在参数配置中设置 mes.pro-over-consume.notify-user-ids");
        }
        Map<String, Object> params = new HashMap<>();
        params.put("workOrderCode", StrUtil.blankToDefault(alert.getWorkOrderCode(), ""));
        params.put("productName", StrUtil.blankToDefault(alert.getProductName(), ""));
        params.put("itemName", StrUtil.blankToDefault(alert.getItemName(), ""));
        params.put("standardQuantity", alert.getStandardQuantity().toPlainString());
        params.put("actualQuantity", alert.getActualQuantity().toPlainString());
        params.put("overQuantity", alert.getOverQuantity().toPlainString());
        params.put("overRatio", alert.getOverRatio().toPlainString());
        params.put("threshold", alert.getThresholdRatio().stripTrailingZeros().toPlainString());
        params.put("overAmount", alert.getOverAmount().toPlainString());
        List<String> failures = new ArrayList<>();
        Long firstMessageId = null;
        int successCount = 0;
        for (String userIdText : notifyUserIds.split(",")) {
            String trimmed = userIdText.trim();
            if (trimmed.isEmpty()) {
                continue;
            }
            try {
                Long userId = Long.parseLong(trimmed);
                NotifySendSingleToUserReqDTO message = new NotifySendSingleToUserReqDTO();
                message.setUserId(userId);
                message.setTemplateCode(TEMPLATE_CODE);
                message.setTemplateParams(params);
                Long messageId = notifyMessageSendApi.sendSingleMessageToAdmin(message);
                if (messageId == null) {
                    throw new IllegalStateException("站内信模板已停用或不存在");
                }
                if (firstMessageId == null) {
                    firstMessageId = messageId;
                }
                successCount++;
            } catch (Exception ex) {
                failures.add("用户[" + trimmed + "]:" + StrUtil.blankToDefault(
                        ex.getMessage(), ex.getClass().getSimpleName()));
            }
        }
        alert.setMessageId(firstMessageId);
        if (failures.isEmpty()) {
            alert.setStatus("SENT");
            alert.setErrorMessage(null);
            return;
        }
        alert.setStatus(successCount > 0 ? "SENT" : "FAILED");
        alert.setErrorMessage(StrUtil.maxLength("部分接收人发送失败:" + String.join(";", failures), 500));
    }
    // ==================== æˆæœ¬åŸºç¡€æ•°æ® ====================
    /**
     * äº§å“æ ‡å‡† BOM å•位用量;无产品 BOM æ—¶å›žé€€å·¥å• BOM
     */
    private Map<Long, BigDecimal> getPerUnitStandardBom(MesProWorkOrderDO workOrder) {
        Map<Long, BigDecimal> perUnitBom = new LinkedHashMap<>();
        List<MesMdProductBomDO> productBomList = productBomService
                .getProductBomListByItemId(workOrder.getProductId());
        if (CollUtil.isNotEmpty(productBomList)) {
            for (MesMdProductBomDO bom : productBomList) {
                if (bom.getBomItemId() != null && bom.getQuantity() != null) {
                    perUnitBom.merge(bom.getBomItemId(), bom.getQuantity(), BigDecimal::add);
                }
            }
            return perUnitBom;
        }
        List<MesProWorkOrderBomDO> workOrderBomList = workOrderBomService
                .getWorkOrderBomListByWorkOrderId(workOrder.getId());
        if (CollUtil.isEmpty(workOrderBomList)) {
            return perUnitBom;
        }
        BigDecimal workOrderQuantity = defaultZero(workOrder.getQuantity());
        BigDecimal divisor = workOrderQuantity.compareTo(BigDecimal.ZERO) > 0
                ? workOrderQuantity : BigDecimal.ONE;
        for (MesProWorkOrderBomDO bom : workOrderBomList) {
            if (bom.getItemId() == null || bom.getQuantity() == null) {
                continue;
            }
            // æ— å·¥åºè¡Œåœ¨æ‰‹å·¥å»ºå•时已按工单数量放大,需折算回单位用量;有工序行为单位用量
            BigDecimal perUnit = bom.getProcessId() == null
                    ? bom.getQuantity().divide(divisor, SCALE, RoundingMode.HALF_UP)
                    : bom.getQuantity();
            perUnitBom.merge(bom.getItemId(), perUnit, BigDecimal::add);
        }
        return perUnitBom;
    }
    private Map<Long, BigDecimal> getActualConsumption(Long workOrderId) {
        Map<Long, BigDecimal> actualQuantities = new LinkedHashMap<>();
        for (MesWmItemConsumeLineDO line : consumeLineMapper.selectListByWorkOrderId(workOrderId)) {
            if (line.getItemId() != null && line.getQuantity() != null) {
                actualQuantities.merge(line.getItemId(), line.getQuantity(), BigDecimal::add);
            }
        }
        return actualQuantities;
    }
    /**
     * å·²æŠ¥å·¥æ•°é‡ï¼šå·¥å•已生产数量 ä¸Ž å„工序已审批报工累计数量 å–大
     *
     * å·¥å• quantityProduced åªåœ¨æœ«é“工序报工后更新,取各工序最大值可保证中间工序报工后即可计算超耗
     */
    private BigDecimal getReportedQuantity(MesProWorkOrderDO workOrder) {
        BigDecimal reported = defaultZero(workOrder.getQuantityProduced());
        List<MesProFeedbackDO> feedbackList = feedbackMapper.selectList(
                new LambdaQueryWrapperX<MesProFeedbackDO>()
                        .eq(MesProFeedbackDO::getWorkOrderId, workOrder.getId())
                        .in(MesProFeedbackDO::getStatus,
                                MesProFeedbackStatusEnum.FINISHED.getStatus(),
                                MesProFeedbackStatusEnum.UNCHECK.getStatus()));
        if (CollUtil.isEmpty(feedbackList)) {
            return reported;
        }
        Map<Long, BigDecimal> quantityByProcess = new HashMap<>();
        for (MesProFeedbackDO feedback : feedbackList) {
            if (feedback.getFeedbackQuantity() == null) {
                continue;
            }
            Long key = feedback.getProcessId() != null ? feedback.getProcessId() : 0L;
            quantityByProcess.merge(key, feedback.getFeedbackQuantity(), BigDecimal::add);
        }
        BigDecimal maxProcessQuantity = quantityByProcess.values().stream()
                .max(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
        return reported.max(maxProcessQuantity);
    }
    private BigDecimal resolveThreshold(MesProWorkOrderDO workOrder) {
        if (workOrder.getOverConsumeRatio() != null) {
            return workOrder.getOverConsumeRatio();
        }
        MesMdItemDO product = workOrder.getProductId() != null
                ? itemService.getItem(workOrder.getProductId()) : null;
        if (product != null && product.getOverConsumeRatio() != null) {
            return product.getOverConsumeRatio();
        }
        String configValue = null;
        try {
            configValue = configApi.getConfigValueByKey(CONFIG_DEFAULT_RATIO);
        } catch (Exception ex) {
            log.warn("[resolveThreshold][读取超耗报警默认比例失败,使用默认值 {}]", DEFAULT_THRESHOLD, ex);
        }
        if (StrUtil.isNotBlank(configValue)) {
            try {
                return new BigDecimal(configValue.trim());
            } catch (NumberFormatException ex) {
                log.warn("[resolveThreshold][超耗报警默认比例配置值非法:{},使用默认值 {}]",
                        configValue, DEFAULT_THRESHOLD);
            }
        }
        return DEFAULT_THRESHOLD;
    }
    private String getNotifyUserIds() {
        try {
            return StrUtil.trimToEmpty(configApi.getConfigValueByKey(CONFIG_NOTIFY_USER_IDS));
        } catch (Exception ex) {
            log.warn("[getNotifyUserIds][读取超耗报警接收人失败]", ex);
            return "";
        }
    }
    private Map<Long, MesProMaterialPriceRespDTO> getPriceMap(Collection<Long> itemIds) {
        if (CollUtil.isEmpty(itemIds)) {
            return Collections.emptyMap();
        }
        try {
            return materialPriceService.getMaterialPriceMap(itemIds);
        } catch (Exception ex) {
            log.error("[getPriceMap][获取物料价格失败,按无价格处理] itemIds={}", itemIds, ex);
            return Collections.emptyMap();
        }
    }
    private static BigDecimal getUnitPrice(Map<Long, MesProMaterialPriceRespDTO> priceMap, Long itemId) {
        MesProMaterialPriceRespDTO price = priceMap.get(itemId);
        return price != null && price.getUnitPrice() != null ? price.getUnitPrice() : BigDecimal.ZERO;
    }
    private static BigDecimal defaultZero(BigDecimal value) {
        return value != null ? value : BigDecimal.ZERO;
    }
    private static BigDecimal scale(BigDecimal value) {
        return value.setScale(SCALE, RoundingMode.HALF_UP);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/cost/dto/MesProMaterialPriceRespDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.mes.service.pro.cost.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
 * MES ç‰©æ–™ä»·æ ¼ä¿¡æ¯
 *
 * @author è¶…级管理员
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MesProMaterialPriceRespDTO {
    /**
     * MES ç‰©æ–™ç¼–号
     */
    private Long itemId;
    /**
     * ç‰©æ–™å•ä»·
     */
    private BigDecimal unitPrice;
    /**
     * ä»·æ ¼æ¥æºï¼šPURCHASE_PRICE(物料主数据采购价)/ ERP_AVERAGE(采购订单加权平均价)/ NONE(无价格)
     */
    private String source;
    /**
     * æ˜¯å¦ç¼ºå°‘ä»·æ ¼
     */
    private Boolean priceMissing;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -110,6 +110,8 @@
    private MdmItemBatchConfigApi itemBatchConfigApi;
    @Resource
    private cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi processInstanceApi;
    @Resource
    private cn.iocoder.yudao.module.mes.service.pro.cost.MesProWorkOrderCostService workOrderCostService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -372,6 +374,7 @@
            feedbackMapper.updateById(new MesProFeedbackDO().setId(reqVO.getId())
                    .setStatus(MesProFeedbackStatusEnum.UNCHECK.getStatus()));
            equipmentService.afterApproved(feedback);
            tryHandleCostAndAlert(feedback);
            return false;
        } else {
            // 6.2 æ— éœ€æ£€éªŒï¼šç”Ÿæˆäº§å‡ºå•(按合格/不合格拆行),直接完成入库
@@ -381,10 +384,24 @@
        }
        equipmentService.afterApproved(feedback);
        tryHandleCostAndAlert(feedback);
        return true; // å·²å®Œæˆ
    }
    /**
     * æŠ¥å·¥å®¡æ‰¹é€šè¿‡åŽé‡ç®—工单物料成本并检查超耗报警。
     * æˆæœ¬/报警属于旁路能力,失败只记录日志,不影响报工审批结果。
     */
    private void tryHandleCostAndAlert(MesProFeedbackDO feedback) {
        try {
            workOrderCostService.handleFeedbackApproved(feedback);
        } catch (Exception ex) {
            log.error("[tryHandleCostAndAlert][工单({}) æŠ¥å·¥({}) æˆæœ¬/超耗处理失败]",
                    feedback.getWorkOrderId(), feedback.getId(), ex);
        }
    }
    /**
     * æ ¹æ®å½“前报工单的最终结果,更新生产任务和生产工单的进度
     *
     * <ul>
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -73,6 +73,8 @@
    @Resource
    private MesProWorkOrderService workOrderService;
    @Resource
    private cn.iocoder.yudao.module.mes.service.pro.cost.MesProWorkOrderCostService workOrderCostService;
    @Resource
    private MesMdItemService itemService;
    @Resource
    private MesMdAutoCodeRecordService autoCodeRecordService;
@@ -603,6 +605,9 @@
        }
        workOrderProcessService.batchSaveWorkOrderProcess(processList);
        // 5.1 å·¥åºæŠ•æ–™ BOM ç”ŸæˆåŽé‡ç®—标准物料成本(路线 BOM ä¸Žäº§å“ BOM å¯èƒ½å­˜åœ¨å·®å¼‚)
        workOrderCostService.recalculateWorkOrderCost(workOrderId);
        // 6. å·¥å•直接确认为已确认状态
        workOrderService.confirmWorkOrder(workOrderId);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java
@@ -7,8 +7,12 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.mps.MesProMpsMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.retentionsample.MesQcRetentionSampleMapper;
import cn.iocoder.yudao.module.mes.enums.pro.MesProMpsStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService;
@@ -55,6 +59,10 @@
    @Resource
    private MesProWorkOrderMapper workOrderMapper;
    @Resource
    private MesProMpsMapper mpsMapper;
    @Resource
    private MesQcRetentionSampleMapper retentionSampleMapper;
    @Resource
    private MesProWorkOrderBomService workOrderBomService;
@@ -74,6 +82,8 @@
    private MesMdWorkstationService workstationService;
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
    private cn.iocoder.yudao.module.mes.service.pro.cost.MesProWorkOrderCostService workOrderCostService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -92,6 +102,8 @@
        // 3. è‡ªåŠ¨ç”Ÿæˆ BOM:根据产品 BOM ç”Ÿæˆå·¥å• BOM
        workOrderBomService.generateWorkOrderBom(workOrder.getId(), createReqVO, false);
        // 3.1 è®¡ç®—标准物料成本
        workOrderCostService.recalculateWorkOrderCost(workOrder.getId());
        // 4. å·¥åºç”±å‰ç«¯é€‰æ‹©äº§å“åŽå¸¦å…¥ï¼Œä¸å†è‡ªåŠ¨ç”Ÿæˆ
@@ -123,6 +135,11 @@
        // 3. æ›´æ–°
        MesProWorkOrderDO updateObj = BeanUtils.toBean(updateReqVO, MesProWorkOrderDO.class);
        workOrderMapper.updateById(updateObj);
        // 4. äº§å“æˆ–数量变化后重算标准物料成本
        if (productChanged || quantityChanged) {
            workOrderCostService.recalculateWorkOrderCost(updateReqVO.getId());
        }
    }
    @Override
@@ -221,14 +238,53 @@
        if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.CONFIRMED.getStatus())) {
            throw exception(PRO_WORK_ORDER_NOT_CONFIRMED);
        }
        // 2. æ ¡éªŒå·²ç”Ÿäº§æ•°é‡å¿…须大于 0(没有产出不允许完成)
        BigDecimal quantityProduced = ObjUtil.defaultIfNull(workOrder.getQuantityProduced(), BigDecimal.ZERO);
        if (quantityProduced.compareTo(BigDecimal.ZERO) <= 0) {
            throw exception(PRO_WORK_ORDER_NO_PRODUCED_QUANTITY, workOrder.getCode());
        }
        // 3. æ ¡éªŒç•™æ ·è®°å½•(所有工单完成前必须登记留样)
        if (retentionSampleMapper.selectByWorkOrderId(id) == null) {
            throw exception(PRO_WORK_ORDER_RETENTION_SAMPLE_REQUIRED, workOrder.getCode());
        }
        // 2. çº§è”完成所有关联任务
        // 4. çº§è”完成所有关联任务
        taskService.finishTaskByOrderId(id);
        // 3. æ›´æ–°å·¥å•状态为已完成
        // 5. æ›´æ–°å·¥å•状态为已完成
        workOrderMapper.updateById(new MesProWorkOrderDO().setId(id)
                .setStatus(MesProWorkOrderStatusEnum.FINISHED.getStatus())
                .setFinishDate(LocalDateTime.now()));
        // 6. åŒæ­¥å…³è” MPS çŠ¶æ€
        finishRelatedMps(workOrder, quantityProduced);
    }
    /**
     * å·¥å•完成时同步 MPS:已下发 â†’ å·²å®Œæˆï¼Œå¹¶å›žå¡«å®Œæˆæ—¶é—´ã€‚
     * åˆå¹¶ä¸‹å‘时一个工单对应多条 MPS,已生产数量由各 MPS è‡ªèº«ç»´æŠ¤ï¼Œè¿™é‡Œä¸å›žå¡«ï¼Œé¿å…é‡å¤ç´¯è®¡ã€‚
     */
    private void finishRelatedMps(MesProWorkOrderDO workOrder, BigDecimal quantityProduced) {
        List<MesProMpsDO> mpsList = mpsMapper.selectListByWorkOrderId(workOrder.getId());
        if (CollUtil.isEmpty(mpsList)) {
            return;
        }
        boolean singleMps = mpsList.size() == 1;
        LocalDateTime now = LocalDateTime.now();
        for (MesProMpsDO mps : mpsList) {
            // å·²å–消/已完成的 MPS ä¸åšçŠ¶æ€å›žå†™
            if (!ObjUtil.equal(mps.getStatus(), MesProMpsStatusEnum.ISSUED.getStatus())) {
                continue;
            }
            MesProMpsDO updateObj = new MesProMpsDO().setId(mps.getId())
                    .setStatus(MesProMpsStatusEnum.FINISHED.getStatus())
                    .setFinishDate(now);
            if (singleMps) {
                BigDecimal currentProduced = ObjUtil.defaultIfNull(mps.getQuantityProduced(), BigDecimal.ZERO);
                updateObj.setQuantityProduced(quantityProduced.max(currentProduced));
            }
            mpsMapper.updateById(updateObj);
        }
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/retentionsample/MesQcRetentionSampleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.mes.service.qc.retentionsample;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSamplePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSampleSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.retentionsample.MesQcRetentionSampleDO;
import jakarta.validation.Valid;
/**
 * MES ç•™æ ·è®°å½• Service æŽ¥å£
 *
 * @author è¶…级管理员
 */
public interface MesQcRetentionSampleService {
    /**
     * åˆ›å»ºç•™æ ·è®°å½•
     *
     * @param createReqVO åˆ›å»ºä¿¡æ¯
     * @return ç¼–号
     */
    Long createRetentionSample(@Valid MesQcRetentionSampleSaveReqVO createReqVO);
    /**
     * æ›´æ–°ç•™æ ·è®°å½•
     *
     * @param updateReqVO æ›´æ–°ä¿¡æ¯
     */
    void updateRetentionSample(@Valid MesQcRetentionSampleSaveReqVO updateReqVO);
    /**
     * åˆ é™¤ç•™æ ·è®°å½•
     *
     * @param id ç¼–号
     */
    void deleteRetentionSample(Long id);
    /**
     * èŽ·å¾—ç•™æ ·è®°å½•
     *
     * @param id ç¼–号
     * @return ç•™æ ·è®°å½•
     */
    MesQcRetentionSampleDO getRetentionSample(Long id);
    /**
     * èŽ·å¾—ç•™æ ·è®°å½•åˆ†é¡µ
     *
     * @param pageReqVO åˆ†é¡µæŸ¥è¯¢
     * @return ç•™æ ·è®°å½•分页
     */
    PageResult<MesQcRetentionSampleDO> getRetentionSamplePage(MesQcRetentionSamplePageReqVO pageReqVO);
    /**
     * æ ¹æ®ç”Ÿäº§å·¥å• ID èŽ·å¾—ç•™æ ·è®°å½•
     *
     * @param workOrderId ç”Ÿäº§å·¥å• ID
     * @return ç•™æ ·è®°å½•
     */
    MesQcRetentionSampleDO getRetentionSampleByWorkOrderId(Long workOrderId);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/retentionsample/MesQcRetentionSampleServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,279 @@
package cn.iocoder.yudao.module.mes.service.qc.retentionsample;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSamplePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.retentionsample.vo.MesQcRetentionSampleSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.retentionsample.MesQcRetentionSampleDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.mps.MesProMpsMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.retentionsample.MesQcRetentionSampleMapper;
import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderSourceTypeEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
/**
 * MES ç•™æ ·è®°å½• Service å®žçŽ°ç±»
 *
 * @author è¶…级管理员
 */
@Service
@Validated
public class MesQcRetentionSampleServiceImpl implements MesQcRetentionSampleService {
    /**
     * é»˜è®¤ç•™æ ·ä¿å­˜æ—¶é•¿ï¼ˆæœˆï¼‰
     */
    private static final int DEFAULT_RETENTION_MONTHS = 6;
    @Resource
    private MesQcRetentionSampleMapper retentionSampleMapper;
    @Resource
    private MesProWorkOrderService workOrderService;
    @Resource
    private MesProMpsMapper mpsMapper;
    @Resource
    private MesMdAutoCodeRecordService autoCodeRecordService;
    @Resource
    private ErpSaleOrderApi saleOrderApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createRetentionSample(MesQcRetentionSampleSaveReqVO createReqVO) {
        // 1. æ ¡éªŒå·¥å•
        MesProWorkOrderDO workOrder = validateWorkOrder(createReqVO.getWorkOrderId());
        // 2. æ ¡éªŒè¯¥å·¥å•是否已登记
        MesQcRetentionSampleDO existing = retentionSampleMapper.selectByWorkOrderId(workOrder.getId());
        if (existing != null) {
            throw exception(QC_RETENTION_SAMPLE_WORK_ORDER_DUPLICATE,
                    workOrder.getCode(), existing.getCode());
        }
        // 3. ç»„装留样记录(工单相关字段以后端查询结果为准)
        MesQcRetentionSampleDO sample = BeanUtils.toBean(createReqVO, MesQcRetentionSampleDO.class);
        sample.setId(null);
        sample.setCode(autoCodeRecordService.generateAutoCode(
                MesMdAutoCodeRuleCodeEnum.QC_RETENTION_SAMPLE_CODE.getCode()));
        sample.setWorkOrderCode(workOrder.getCode());
        sample.setProductId(workOrder.getProductId());
        sample.setBatchCode(workOrder.getBatchCode());
        sample.setExpiryDate(resolveExpiryDate(sample.getSampleDate(), createReqVO.getExpiryDate()));
        if (sample.getKeeperUserId() == null) {
            sample.setKeeperUserId(getLoginUserId());
        }
        fillSaleOrder(workOrder, sample, createReqVO.getSaleOrderId());
        // 4. æ’å…¥
        retentionSampleMapper.insert(sample);
        return sample.getId();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateRetentionSample(MesQcRetentionSampleSaveReqVO updateReqVO) {
        // 1. æ ¡éªŒå­˜åœ¨
        MesQcRetentionSampleDO oldSample = validateRetentionSampleExists(updateReqVO.getId());
        // 2.1 ä¸å…è®¸ä¿®æ”¹æ‰€å±žå·¥å•
        if (ObjUtil.notEqual(oldSample.getWorkOrderId(), updateReqVO.getWorkOrderId())) {
            throw exception(QC_RETENTION_SAMPLE_WORK_ORDER_CHANGED);
        }
        // 2.2 æ ¡éªŒå·¥å•
        MesProWorkOrderDO workOrder = validateWorkOrder(oldSample.getWorkOrderId());
        // 3. ç»„装更新对象(编码、工单、产品、批次不允许修改)
        MesQcRetentionSampleDO updateObj = BeanUtils.toBean(updateReqVO, MesQcRetentionSampleDO.class);
        updateObj.setCode(null);
        updateObj.setWorkOrderId(null);
        updateObj.setWorkOrderCode(null);
        updateObj.setProductId(null);
        updateObj.setBatchCode(null);
        updateObj.setExpiryDate(resolveExpiryDate(updateReqVO.getSampleDate(), updateReqVO.getExpiryDate()));
        fillSaleOrder(workOrder, updateObj, updateReqVO.getSaleOrderId());
        // 4. æ›´æ–°
        retentionSampleMapper.updateById(updateObj);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteRetentionSample(Long id) {
        // 1. æ ¡éªŒå­˜åœ¨
        MesQcRetentionSampleDO sample = validateRetentionSampleExists(id);
        // 2. å·¥å•已完成时不允许删除
        MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(sample.getWorkOrderId());
        if (workOrder != null
                && ObjUtil.equal(workOrder.getStatus(), MesProWorkOrderStatusEnum.FINISHED.getStatus())) {
            throw exception(QC_RETENTION_SAMPLE_FINISHED_DELETE, workOrder.getCode());
        }
        retentionSampleMapper.deleteById(id);
    }
    // ==================== æ ¡éªŒä¸Žå¡«å……方法 ====================
    private MesProWorkOrderDO validateWorkOrder(Long workOrderId) {
        MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(workOrderId);
        if (workOrder == null) {
            throw exception(QC_RETENTION_SAMPLE_WORK_ORDER_NOT_EXISTS);
        }
        if (ObjUtil.equal(workOrder.getStatus(), MesProWorkOrderStatusEnum.CANCELED.getStatus())) {
            throw exception(QC_RETENTION_SAMPLE_WORK_ORDER_CANCELED, workOrder.getCode());
        }
        return workOrder;
    }
    private MesQcRetentionSampleDO validateRetentionSampleExists(Long id) {
        MesQcRetentionSampleDO sample = retentionSampleMapper.selectById(id);
        if (sample == null) {
            throw exception(QC_RETENTION_SAMPLE_NOT_EXISTS);
        }
        return sample;
    }
    private LocalDateTime resolveExpiryDate(LocalDateTime sampleDate, LocalDateTime expiryDate) {
        if (expiryDate != null) {
            return expiryDate;
        }
        return sampleDate.plusMonths(DEFAULT_RETENTION_MONTHS);
    }
    /**
     * è§£æžå¹¶æ ¡éªŒé”€å”®è®¢å•:
     * 1. ç”± MPS ä¸‹å‘的工单,销售订单以 MPS ä¸ºå‡†ï¼›åˆå¹¶ä¸‹å‘时由用户指定本次留样对应的销售订单;
     * 2. å®¢æˆ·è®¢å•来源、但无 MPS çš„工单,按工单来源单号校验所选销售订单;
     * 3. åº“存备货工单可不绑定销售订单。
     */
    private void fillSaleOrder(MesProWorkOrderDO workOrder, MesQcRetentionSampleDO sample,
                               Long submittedSaleOrderId) {
        // 1. ä¼˜å…ˆä½¿ç”¨ MPS è®°å½•的销售订单(合并下发时一个工单对应多张销售订单)
        List<MesProMpsDO> mpsList = mpsMapper.selectListByWorkOrderId(workOrder.getId());
        Map<Long, String> saleOrderMap = new LinkedHashMap<>();
        for (MesProMpsDO mps : mpsList) {
            if (mps.getSaleOrderId() != null) {
                saleOrderMap.putIfAbsent(mps.getSaleOrderId(), mps.getSaleOrderNo());
            }
        }
        if (saleOrderMap.size() == 1) {
            Map.Entry<Long, String> entry = saleOrderMap.entrySet().iterator().next();
            if (submittedSaleOrderId != null
                    && ObjUtil.notEqual(submittedSaleOrderId, entry.getKey())) {
                throw exception(QC_RETENTION_SAMPLE_SALE_ORDER_MISMATCH,
                        workOrder.getCode(), entry.getValue(),
                        resolveSaleOrderNoOrId(submittedSaleOrderId));
            }
            // æ ¡éªŒ MPS è®°å½•的销售订单真实存在,避免把不存在的订单静默带入留样记录
            validateMpsSaleOrderExists(workOrder, entry.getKey(), entry.getValue());
            sample.setSaleOrderId(entry.getKey());
            sample.setSaleOrderNo(entry.getValue());
            return;
        }
        if (saleOrderMap.size() > 1) {
            String saleOrderNos = String.join("、", saleOrderMap.values());
            if (submittedSaleOrderId == null) {
                throw exception(QC_RETENTION_SAMPLE_SALE_ORDER_AMBIGUOUS,
                        workOrder.getCode(), saleOrderNos);
            }
            if (!saleOrderMap.containsKey(submittedSaleOrderId)) {
                throw exception(QC_RETENTION_SAMPLE_SALE_ORDER_MISMATCH,
                        workOrder.getCode(), saleOrderNos,
                        resolveSaleOrderNoOrId(submittedSaleOrderId));
            }
            validateMpsSaleOrderExists(workOrder, submittedSaleOrderId,
                    saleOrderMap.get(submittedSaleOrderId));
            sample.setSaleOrderId(submittedSaleOrderId);
            sample.setSaleOrderNo(saleOrderMap.get(submittedSaleOrderId));
            return;
        }
        // 2. å®¢æˆ·è®¢å•来源工单:必须选择与来源单号一致的销售订单
        if (ObjUtil.equal(workOrder.getOrderSourceType(), MesProWorkOrderSourceTypeEnum.ORDER.getType())
                && StrUtil.isNotEmpty(workOrder.getOrderSourceCode())) {
            if (submittedSaleOrderId == null) {
                throw exception(QC_RETENTION_SAMPLE_SALE_ORDER_REQUIRED,
                        workOrder.getCode(), workOrder.getOrderSourceCode());
            }
            ErpSaleOrderRespDTO saleOrder = getSaleOrderOrThrow(submittedSaleOrderId);
            if (StrUtil.isNotEmpty(saleOrder.getNo())
                    && ObjUtil.notEqual(saleOrder.getNo(), workOrder.getOrderSourceCode())) {
                throw exception(QC_RETENTION_SAMPLE_SALE_ORDER_MISMATCH,
                        workOrder.getCode(), workOrder.getOrderSourceCode(), saleOrder.getNo());
            }
            sample.setSaleOrderId(saleOrder.getId());
            sample.setSaleOrderNo(saleOrder.getNo());
            return;
        }
        // 3. åº“存备货工单:可选绑定
        if (submittedSaleOrderId != null) {
            ErpSaleOrderRespDTO saleOrder = getSaleOrderOrThrow(submittedSaleOrderId);
            sample.setSaleOrderId(saleOrder.getId());
            sample.setSaleOrderNo(saleOrder.getNo());
        }
    }
    private void validateMpsSaleOrderExists(MesProWorkOrderDO workOrder, Long saleOrderId,
                                            String saleOrderNo) {
        CommonResult<ErpSaleOrderRespDTO> result = saleOrderApi.getSaleOrder(saleOrderId);
        if (result.isError() || result.getData() == null) {
            throw exception(QC_RETENTION_SAMPLE_MPS_SALE_ORDER_NOT_EXISTS,
                    workOrder.getCode(), StrUtil.blankToDefault(saleOrderNo, "未记录"), saleOrderId);
        }
    }
    private ErpSaleOrderRespDTO getSaleOrderOrThrow(Long saleOrderId) {
        CommonResult<ErpSaleOrderRespDTO> result = saleOrderApi.getSaleOrder(saleOrderId);
        if (result.isError() || result.getData() == null) {
            throw exception(QC_RETENTION_SAMPLE_SALE_ORDER_NOT_EXISTS, "ID=" + saleOrderId);
        }
        return result.getData();
    }
    private String resolveSaleOrderNoOrId(Long saleOrderId) {
        CommonResult<ErpSaleOrderRespDTO> result = saleOrderApi.getSaleOrder(saleOrderId);
        if (result.isSuccess() && result.getData() != null) {
            return result.getData().getNo();
        }
        return "ID=" + saleOrderId;
    }
    // ==================== æŸ¥è¯¢æ–¹æ³• ====================
    @Override
    public MesQcRetentionSampleDO getRetentionSample(Long id) {
        return retentionSampleMapper.selectById(id);
    }
    @Override
    public PageResult<MesQcRetentionSampleDO> getRetentionSamplePage(
            MesQcRetentionSamplePageReqVO pageReqVO) {
        return retentionSampleMapper.selectPage(pageReqVO);
    }
    @Override
    public MesQcRetentionSampleDO getRetentionSampleByWorkOrderId(Long workOrderId) {
        return retentionSampleMapper.selectByWorkOrderId(workOrderId);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
@@ -1,22 +1,38 @@
package cn.iocoder.yudao.module.mes.service.wm.packages;
import cn.hutool.core.util.ObjUtil;
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.mes.controller.admin.wm.packages.vo.line.MesWmPackageLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PACKAGE_LINE_NOT_EXISTS;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
/**
 * MES è£…箱明细 Service å®žçŽ°ç±»
@@ -27,6 +43,9 @@
@Validated
public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
    private static final String ASSEMBLY_PROCESS_CODE = "PRO-ASSEMBLY";
    private static final String ASSEMBLY_PROCESS_NAME = "组装";
    @Resource
    private MesWmPackageLineMapper packageLineMapper;
@@ -36,15 +55,26 @@
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesMdItemService mdItemService;
    @Resource
    private MesMdItemTypeService itemTypeService;
    @Resource
    private MesProWorkOrderService workOrderService;
    @Resource
    private MesProWorkOrderProcessService workOrderProcessService;
    @Resource
    private MesProProcessService processService;
    @Resource
    private MesProFeedbackMapper feedbackMapper;
    @Override
    public Long createPackageLine(MesWmPackageLineSaveReqVO createReqVO) {
        // æ ¡éªŒæ•°æ®
        validateLineSaveData(createReqVO);
        int boxCount = validateLineSaveData(createReqVO);
        // æ’å…¥
        MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class);
        line.setBoxCount(boxCount);
        packageLineMapper.insert(line);
        return line.getId();
    }
@@ -55,10 +85,11 @@
        MesWmPackageLineDO line = validatePackageLineExists(updateReqVO.getId());
        // æ ¡éªŒæ•°æ®
        updateReqVO.setPackageId(line.getPackageId());
        validateLineSaveData(updateReqVO);
        int boxCount = validateLineSaveData(updateReqVO);
        // æ›´æ–°
        MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class);
        updateObj.setBoxCount(boxCount);
        packageLineMapper.updateById(updateObj);
    }
@@ -95,15 +126,87 @@
    // ========== æ ¡éªŒæ–¹æ³• ==========
    /**
     * æ ¡éªŒä¿å­˜æ—¶çš„关联数据
     * æ ¡éªŒä¿å­˜æ—¶çš„关联数据,并返回按 æ•°é‡ / æ¯ç®±æ•°é‡ å‘上取整计算的箱数
     */
    private void validateLineSaveData(MesWmPackageLineSaveReqVO reqVO) {
    private int validateLineSaveData(MesWmPackageLineSaveReqVO reqVO) {
        // æ ¡éªŒè£…箱单状态为草稿
        packageService.validatePackageStatusDraft(reqVO.getPackageId());
        // æ ¡éªŒäº§å“ç‰©æ–™å­˜åœ¨
        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
        // æ ¡éªŒå·¥å•已确认
        workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
        // æ ¡éªŒç‰©æ–™æ¡£æ¡ˆï¼šå¿…须属于成品分类,且已维护每箱数量
        MesMdItemDO item = mdItemService.getItem(reqVO.getItemId());
        if (item == null) {
            throw exception(WM_PACKAGE_LINE_BOX_QUANTITY_NOT_CONFIGURED, "ID=" + reqVO.getItemId());
        }
        String itemName = StrUtil.isNotBlank(item.getName()) ? item.getName() : item.getCode();
        MesMdItemTypeDO itemType = item.getItemTypeId() != null
                ? itemTypeService.getItemTypeMap(Collections.singleton(item.getItemTypeId()))
                        .get(item.getItemTypeId())
                : null;
        if (itemType == null || !Boolean.TRUE.equals(itemType.getFinishedFlag())) {
            throw exception(WM_PACKAGE_LINE_ITEM_NOT_FINISHED, itemName);
        }
        if (item.getBoxQuantity() == null || item.getBoxQuantity().compareTo(BigDecimal.ZERO) <= 0) {
            throw exception(WM_PACKAGE_LINE_BOX_QUANTITY_NOT_CONFIGURED, itemName);
        }
        // æ ¡éªŒå·¥å•已确认,且装箱物料必须为工单的产品
        MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
        if (ObjUtil.notEqual(reqVO.getItemId(), workOrder.getProductId())) {
            MesMdItemDO product = workOrder.getProductId() != null
                    ? mdItemService.getItem(workOrder.getProductId()) : null;
            String productName = product != null
                    ? (StrUtil.isNotBlank(product.getName()) ? product.getName() : product.getCode())
                    : "ID=" + workOrder.getProductId();
            throw exception(WM_PACKAGE_LINE_WORK_ORDER_PRODUCT_MISMATCH,
                    itemName, workOrder.getCode(), productName);
        }
        // æ ¡éªŒåŒä¸€å·¥å•累计装箱数量不超过工单数量(草稿与已完成的装箱单都计入)
        BigDecimal plannedQuantity = packageLineMapper.selectListByWorkOrderId(workOrder.getId()).stream()
                .filter(line -> ObjUtil.notEqual(line.getId(), reqVO.getId()))
                .map(MesWmPackageLineDO::getQuantity)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal totalQuantity = plannedQuantity.add(reqVO.getQuantity());
        if (workOrder.getQuantity() != null && totalQuantity.compareTo(workOrder.getQuantity()) > 0) {
            throw exception(WM_PACKAGE_LINE_WORK_ORDER_QUANTITY_EXCEED,
                    workOrder.getCode(), workOrder.getQuantity(), plannedQuantity, reqVO.getQuantity());
        }
        // æ ¡éªŒç»„装工序已完成报工:组装合格数量必须覆盖累计装箱数量
        validateAssemblyCompleted(workOrder, plannedQuantity, reqVO.getQuantity(), totalQuantity);
        // ç®±æ•° = æ•°é‡ / æ¯ç®±æ•°é‡ï¼Œå‘上取整
        return reqVO.getQuantity().divide(item.getBoxQuantity(), 0, RoundingMode.CEILING).intValue();
    }
    /**
     * æ ¡éªŒå·¥å•的【组装】工序已完成报工,且合格数量不少于累计装箱数量
     */
    private void validateAssemblyCompleted(MesProWorkOrderDO workOrder, BigDecimal packedQuantity,
                                           BigDecimal currentQuantity, BigDecimal totalQuantity) {
        List<Long> processIds = workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrder.getId())
                .stream()
                .map(MesProWorkOrderProcessDO::getProcessId)
                .filter(Objects::nonNull)
                .distinct()
                .toList();
        List<Long> assemblyProcessIds = processService.getProcessMap(processIds).values().stream()
                .filter(process -> ASSEMBLY_PROCESS_CODE.equalsIgnoreCase(process.getCode())
                        || ASSEMBLY_PROCESS_NAME.equals(process.getName()))
                .map(MesProProcessDO::getId)
                .toList();
        if (assemblyProcessIds.isEmpty()) {
            throw exception(WM_PACKAGE_LINE_ASSEMBLY_PROCESS_NOT_FOUND, workOrder.getCode());
        }
        BigDecimal assembledQuantity = feedbackMapper.selectFinishedQualifiedQuantitySum(
                workOrder.getId(), assemblyProcessIds);
        if (assembledQuantity.compareTo(totalQuantity) < 0) {
            throw exception(WM_PACKAGE_LINE_ASSEMBLY_NOT_COMPLETED,
                    workOrder.getCode(), assembledQuantity, totalQuantity, packedQuantity, currentQuantity);
        }
    }
    private MesWmPackageLineDO validatePackageLineExists(Long id) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java
@@ -8,6 +8,9 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageMapper;
import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmPackageStatusEnum;
@@ -17,8 +20,11 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -38,6 +44,10 @@
    @Resource
    private MesWmPackageLineService packageLineService;
    @Resource
    private MesWmPackageLineMapper packageLineMapper;
    @Resource
    private MesProWorkOrderMapper workOrderMapper;
    @Resource
    private MesWmBarcodeService barcodeService;
    @Resource
@@ -100,6 +110,7 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void finishPackage(Long id) {
        // æ ¡éªŒå­˜åœ¨ä¸”为草稿
        validatePackageExistsAndDraft(id);
@@ -107,6 +118,23 @@
        // æ›´æ–°çŠ¶æ€ä¸ºå·²å®Œæˆ
        packageMapper.updateById(new MesWmPackageDO()
                .setId(id).setStatus(MesWmPackageStatusEnum.FINISHED.getStatus()));
        // æŒ‰ç”Ÿäº§å·¥å•汇总本次装箱数量与箱数,累加到工单并重算装箱状态
        Map<Long, List<MesWmPackageLineDO>> linesByWorkOrder = packageLineMapper.selectListByPackageId(id).stream()
                .filter(line -> line.getWorkOrderId() != null)
                .collect(Collectors.groupingBy(MesWmPackageLineDO::getWorkOrderId));
        linesByWorkOrder.forEach((workOrderId, lines) -> {
            BigDecimal quantity = lines.stream()
                    .map(MesWmPackageLineDO::getQuantity)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            int boxCount = lines.stream()
                    .map(MesWmPackageLineDO::getBoxCount)
                    .filter(Objects::nonNull)
                    .mapToInt(Integer::intValue).sum();
            workOrderMapper.updatePackedQuantity(workOrderId, quantity, boxCount);
            workOrderMapper.updatePackingStatus(workOrderId);
        });
    }
    @Override
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java
@@ -7,11 +7,13 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
@@ -25,6 +27,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
@@ -50,6 +54,8 @@
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesMdItemService mdItemService;
    @Resource
    private MesWmBatchService batchService;
    @Resource
    @Lazy
@@ -68,6 +74,7 @@
        // æ–°å¢ž
        MesWmProductSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmProductSalesLineDO.class);
        line.setBoxCount(calculateBoxCount(line.getItemId(), line.getQuantity()));
        productSalesLineMapper.insert(line);
        return line.getId();
    }
@@ -82,6 +89,7 @@
        // æ›´æ–°
        MesWmProductSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductSalesLineDO.class);
        updateObj.setBoxCount(calculateBoxCount(updateObj.getItemId(), updateObj.getQuantity()));
        productSalesLineMapper.updateById(updateObj);
        // æ£€æŸ¥æ˜¯å¦éœ€è¦åˆ›å»º OQC æ£€éªŒå•:从不需要检验变为需要检验
@@ -167,6 +175,21 @@
    }
    /**
     * æŒ‰ æ•°é‡ / ç‰©æ–™æ¯ç®±æ•°é‡ å‘上取整计算箱数;未维护每箱数量时返回 0
     */
    private int calculateBoxCount(Long itemId, BigDecimal quantity) {
        if (itemId == null || quantity == null) {
            return 0;
        }
        MesMdItemDO item = mdItemService.getItem(itemId);
        if (item == null || item.getBoxQuantity() == null
                || item.getBoxQuantity().compareTo(BigDecimal.ZERO) <= 0) {
            return 0;
        }
        return quantity.divide(item.getBoxQuantity(), 0, RoundingMode.CEILING).intValue();
    }
    /**
     * æ ¹æ® batchCode è§£æž batchId
     */
    private void fillBatchId(MesWmProductSalesLineSaveReqVO reqVO) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java
@@ -4,6 +4,8 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesShippingReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import jakarta.validation.Valid;
@@ -55,6 +57,15 @@
    PageResult<MesWmProductSalesDO> getProductSalesPage(MesWmProductSalesPageReqVO pageReqVO);
    /**
     * èŽ·å¾—å‘è´§ç»Ÿè®¡åˆ†é¡µï¼ˆæŒ‰ å®¢æˆ· + é”€å”®è®¢å•号 + ç‰©æ–™ æ±‡æ€»å·²å®Œæˆå‡ºåº“单的箱数与数量)
     *
     * @param pageReqVO åˆ†é¡µå‚æ•°
     * @return å‘货统计分页
     */
    PageResult<MesWmProductSalesStatisticsRespVO> getProductSalesStatisticsPage(
            MesWmProductSalesStatisticsPageReqVO pageReqVO);
    /**
     * æäº¤é”€å”®å‡ºåº“单
     * <ul>
     *     <li>有 OQC æ£€éªŒè¡Œï¼šè‰ç¨¿ â†’ å¾…检测</li>
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
@@ -9,6 +9,8 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesShippingReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO;
@@ -30,6 +32,8 @@
import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
@@ -128,6 +132,14 @@
    }
    @Override
    public PageResult<MesWmProductSalesStatisticsRespVO> getProductSalesStatisticsPage(
            MesWmProductSalesStatisticsPageReqVO pageReqVO) {
        IPage<MesWmProductSalesStatisticsRespVO> mpPage = MyBatisUtils.buildPage(pageReqVO);
        IPage<MesWmProductSalesStatisticsRespVO> result = productSalesMapper.selectStatisticsPage(mpPage, pageReqVO);
        return new PageResult<>(result.getRecords(), result.getTotal());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitProductSales(Long id) {
        // æ ¡éªŒå­˜åœ¨ + è‰ç¨¿çŠ¶æ€
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
@@ -6,6 +6,7 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
@@ -17,6 +18,7 @@
import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
@@ -29,11 +31,14 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.mes.enums.wm.MesWmSalesNoticeStatusEnum.*;
@@ -64,6 +69,8 @@
    private MesWmProductSalesLineMapper productSalesLineMapper;
    @Resource
    private MesWmSalesNoticeLineMapper salesNoticeLineMapper;
    @Resource
    private MesMdItemService mdItemService;
    @Override
    public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) {
@@ -352,6 +359,8 @@
        productSalesMapper.insert(productSales);
        // 6. éåŽ†å‘è´§é€šçŸ¥å•è¡Œåˆ›å»ºé”€å”®å‡ºåº“å•è¡Œ
        Map<Long, MesMdItemDO> itemMap = mdItemService.getItemMap(
                convertSet(noticeLines, MesWmSalesNoticeLineDO::getItemId));
        for (MesWmSalesNoticeLineDO noticeLine : noticeLines) {
            MesWmProductSalesLineDO salesLine = new MesWmProductSalesLineDO();
            salesLine.setSalesId(productSales.getId());
@@ -362,6 +371,14 @@
            salesLine.setBatchId(noticeLine.getBatchId());
            salesLine.setBatchCode(noticeLine.getBatchCode());
            salesLine.setOqcCheckFlag(noticeLine.getOqcCheckFlag());
            // æŒ‰ æ•°é‡ / ç‰©æ–™æ¯ç®±æ•°é‡ å‘上取整计算箱数;未维护每箱数量时记 0
            MesMdItemDO item = itemMap.get(noticeLine.getItemId());
            if (item != null && item.getBoxQuantity() != null
                    && item.getBoxQuantity().compareTo(BigDecimal.ZERO) > 0
                    && noticeLine.getQuantity() != null) {
                salesLine.setBoxCount(noticeLine.getQuantity()
                        .divide(item.getBoxQuantity(), 0, RoundingMode.CEILING).intValue());
            }
            productSalesLineMapper.insert(salesLine);
        }
yudao-module-mes/src/main/resources/mapper/pro/workorder/MesProWorkOrderMapper.xml
@@ -30,6 +30,9 @@
            <if test="pageReqVO.status != null">
                AND t.status = #{pageReqVO.status}
            </if>
            <if test="pageReqVO.packingStatus != null">
                AND t.packing_status = #{pageReqVO.packingStatus}
            </if>
            <if test="pageReqVO.requestDate != null and pageReqVO.requestDate.length > 0">
                AND t.request_date >= #{pageReqVO.requestDate[0]}
                <if test="pageReqVO.requestDate.length > 1">
yudao-module-mes/src/main/resources/mapper/wm/productsales/MesWmProductSalesMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper">
    <!-- å‘货统计:按 å®¢æˆ· + é”€å”®è®¢å•号 + ç‰©æ–™ æ±‡æ€»å·²å®Œæˆå‡ºåº“单(status=4)的箱数与数量 -->
    <select id="selectStatisticsPage" resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesStatisticsRespVO">
        SELECT
            s.client_id,
            s.sales_order_code,
            l.item_id,
            IFNULL(SUM(l.quantity), 0) AS total_quantity,
            CAST(IFNULL(SUM(l.box_count), 0) AS SIGNED) AS total_box_count,
            COUNT(DISTINCT s.id) AS shipment_count,
            MAX(s.sales_date) AS last_shipment_date
        FROM mes_wm_product_sales s
        INNER JOIN mes_wm_product_sales_line l ON l.sales_id = s.id AND l.deleted = 0
        WHERE s.deleted = 0 AND s.status = 4
        <if test="pageReqVO.clientId != null">
            AND s.client_id = #{pageReqVO.clientId}
        </if>
        <if test="pageReqVO.salesOrderCode != null and pageReqVO.salesOrderCode != ''">
            AND s.sales_order_code LIKE CONCAT('%', #{pageReqVO.salesOrderCode}, '%')
        </if>
        <if test="pageReqVO.itemId != null">
            AND l.item_id = #{pageReqVO.itemId}
        </if>
        <if test="pageReqVO.shipmentDate != null and pageReqVO.shipmentDate.length > 0">
            AND s.sales_date &gt;= #{pageReqVO.shipmentDate[0]}
            <if test="pageReqVO.shipmentDate.length > 1">
                AND s.sales_date &lt;= #{pageReqVO.shipmentDate[1]}
            </if>
        </if>
        GROUP BY s.client_id, s.sales_order_code, l.item_id
        ORDER BY last_shipment_date DESC, s.client_id ASC, s.sales_order_code ASC
    </select>
</mapper>