新火炬后端单体项目初始化代码
cuilei
4 天以前 578639bf4bb9be9808d7c482345b8c35b02510b7
Merge remote-tracking branch 'origin/master'

# Conflicts:
# db/双林新火炬MES数据库设计.pdma.json
已重命名1个文件
已添加21个文件
已修改28个文件
已删除11个文件
5025 ■■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 558 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java 311 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/controller/AndonOrderController.java 280 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/controller/AndonResponseConfigController.java 269 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/dto/AndonButtonDTO.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/entity/AndonButtonConfig.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/entity/AndonOrder.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/entity/AndonResponseConfig.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/mapper/AndonButtonConfigMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/mapper/AndonResponseConfigMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/mapper/xml/AndonButtonConfigMapper.xml 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/mapper/xml/AndonResponseConfigMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/service/IAndonButtonConfigService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/service/IAndonOrderService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/service/IAndonResponseConfigService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/service/impl/AndonButtonConfigServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/service/impl/AndonOrderServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/service/impl/AndonResponseConfigServiceImpl.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingToolMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/feishu/job/FeishuSyncTask.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/feishu/service/FeishuUserService.java 635 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesMaterialTransferDetailController.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesMaterialTransferRequestController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesMaterialTransferDetail.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesMaterialTransferRequest.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MessageResponse.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/mapper/MesMaterialTransferDetailMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/mapper/xml/MesMaterialTransferDetailMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesMaterialTransferDetailService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesMaterialTransferDetailServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/CxfClientUtil.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/MESObjectFactory.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/WMSObjectFactory.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/WMSWebService.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/controller/WMSTestController.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/DeliOrderDeleteResponse.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/HelloWorldResponse.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/ReceiveMESScanItemListResponse.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/ReceiveReservationResponse.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/ReceiveWMSScanItemListResponse.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/WSResponse.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/ArrayOfWebServiceSendItem.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/DeliOrderDelete.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/HelloWorld.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/ReceiveReservation.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/ReceiveWMSScanItemList.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/WMSWebServiceSendItem.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/WebReservationOrder.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/WebServiceSendItem.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/MESWebServiceSoap.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/WMSWebService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/WebServiceSoap.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/impl/MESWebServiceSoapImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/wsdl/WebService.asmx.wsdl 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -2,7 +2,7 @@
  "name": "双林新火炬MES数据库设计",
  "describe": "描述双薪新火炬MES数据库设计详情",
  "avatar": "",
  "version": "4.9.4",
  "version": "4.9.2",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-8-18 15:02:20",
  "dbConns": [],
@@ -632,7 +632,7 @@
      "#DDE5FF"
    ],
    "DDLToggleCase": "L",
    "menuWidth": "296px"
    "menuWidth": "364px"
  },
  "entities": [
    {
@@ -64779,6 +64779,24 @@
          "id": "FC8D8EFD-EDAD-42FD-81CA-B2B3962BD05F"
        },
        {
          "defKey": "publish_time",
          "defName": "发布时间",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098",
          "extProps": {},
          "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC",
          "id": "7BC5A8E6-31E0-4B70-BAC5-87EFF639FE63"
        },
        {
          "defKey": "request_status",
          "defName": "请求状态",
          "comment": "",
@@ -64789,7 +64807,7 @@
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "hideInGraph": true,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
@@ -64816,7 +64834,7 @@
        },
        {
          "defKey": "original_warehouse_id",
          "defName": "原库存地",
          "defName": "起始库存地",
          "comment": "",
          "type": "",
          "len": "",
@@ -64905,6 +64923,146 @@
          "extProps": {},
          "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC",
          "id": "F0CEC477-F5FE-4622-83DB-FBFDA4344E30"
        },
        {
          "defKey": "material_number",
          "defName": "物料编码",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "domain": "BE09D493-E183-402D-ACC4-EEA21EB35B8E",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "0B5A2CD6-7472-4E18-ACB1-6418C2A8A109",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "material_name",
          "defName": "物料名称",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": true,
          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "AFBDF9D2-3B49-4620-9541-C15731785905",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "specified_quantity",
          "defName": "理论拉动数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "60A2C50B-3F37-4319-B53A-72AE3E55CAFC",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E"
        },
        {
          "defKey": "actual_quantity",
          "defName": "实际拉动数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "AE123111-CDE3-4CFE-96ED-EFA3D3115CD2",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E"
        },
        {
          "defKey": "remaining_quantity",
          "defName": "车间剩余数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "12249855-7F62-4734-B5B8-1AACBE2A50CC",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E"
        }
      ],
      "correlations": [],
@@ -65743,397 +65901,6 @@
          "attr9": "",
          "id": "4B21EDEF-B9C4-48C7-BF6A-AC5ABA159B8A",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E"
        }
      ],
      "correlations": [],
      "indexes": [],
      "type": "P"
    },
    {
      "id": "2FF92658-07FE-49BC-A690-E24FA5226BB3",
      "env": {
        "base": {
          "nameSpace": "",
          "codeRoot": ""
        }
      },
      "defKey": "mes_material_transfer_detail",
      "defName": "物料拉动明细",
      "comment": "",
      "properties": {
        "partitioned by": "(date string)",
        "row format delimited": "",
        "fields terminated by ','": "",
        "collection items terminated by '-'": "",
        "map keys terminated by ':'": "",
        "store as textfile;": ""
      },
      "sysProps": {
        "nameTemplate": "{defKey}[{defName}]"
      },
      "notes": {},
      "headers": [
        {
          "refKey": "hideInGraph",
          "hideInGraph": true
        },
        {
          "refKey": "defKey",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "defName",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "primaryKey",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "notNull",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "autoIncrement",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "domain",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "type",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "len",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "scale",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "comment",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "refDict",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "defaultValue",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "isStandard",
          "freeze": false,
          "hideInGraph": false
        },
        {
          "refKey": "uiHint",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "extProps",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr1",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr2",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr3",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr4",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr5",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr6",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr7",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr8",
          "freeze": false,
          "hideInGraph": true
        },
        {
          "refKey": "attr9",
          "freeze": false,
          "hideInGraph": true
        }
      ],
      "fields": [
        {
          "defKey": "id",
          "defName": "主键",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": true,
          "notNull": true,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "16120F75-6AA7-4483-868D-F07F511BB081",
          "id": "F7E0BFAE-F178-43E0-8482-2DCE7CEFB184"
        },
        {
          "defKey": "create_by",
          "defName": "创建人",
          "comment": "",
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": true,
          "refDict": "",
          "uiHint": "",
          "id": "F445F433-E877-4D2A-8ECE-03043F0ACB7D",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "create_time",
          "defName": "创建时间",
          "comment": "",
          "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": true,
          "refDict": "",
          "uiHint": "",
          "id": "E690295E-8BFF-49DA-8966-6A3FE3824883",
          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098"
        },
        {
          "defKey": "update_by",
          "defName": "更新人",
          "comment": "",
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": true,
          "refDict": "",
          "uiHint": "",
          "id": "E3C7E33A-8B8C-4F70-BA59-3B5A10C50734",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "update_time",
          "defName": "更新时间",
          "comment": "",
          "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": true,
          "refDict": "",
          "uiHint": "",
          "id": "93258189-F627-4142-BC39-0295E3A52033",
          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098"
        },
        {
          "defKey": "del_flag",
          "defName": "删除标记",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
          "extProps": {},
          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
          "id": "F80D66E7-8670-4B1C-9940-041DBAD0580A"
        },
        {
          "defKey": "request_id",
          "defName": "申请单ID",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "16120F75-6AA7-4483-868D-F07F511BB081",
          "id": "850A2C7A-D321-4283-B735-7BCC56DF7933"
        },
        {
          "defKey": "material_number",
          "defName": "物料编码",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "domain": "BE09D493-E183-402D-ACC4-EEA21EB35B8E",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "E77D6EFA-7408-4891-888B-D6FC2CF8E6E5",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "material_name",
          "defName": "物料名称",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": true,
          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "270E5417-96C7-4540-AC29-07C8FCC3CD38",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "specified_quantity",
          "defName": "理论拉动数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E",
          "extProps": {},
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "id": "D7028092-5311-4FC1-B6F2-19B1FFBFA85B"
        },
        {
          "defKey": "actual_quantity",
          "defName": "实际拉动数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E",
          "extProps": {},
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "id": "4E9708B3-14B0-45A0-A3B8-351D759C7B47"
        },
        {
          "defKey": "remaining_quantity",
          "defName": "车间剩余数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E",
          "extProps": {},
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "id": "FE041E9A-5D05-42EE-AA33-C563B66B99A5"
        }
      ],
      "correlations": [],
@@ -70054,7 +69821,6 @@
        "70FEB6D0-FC18-42C5-8608-34E8BBB4A406",
        "D16FD5E0-8B16-4C0E-AD67-6E5C2FED1A65",
        "5835D3E9-4B10-48DC-B116-584E447AA201",
        "2FF92658-07FE-49BC-A690-E24FA5226BB3",
        "23C6B8F0-0010-4453-B3C2-9305746C37AB",
        "D3263A0C-1D6A-453A-B933-86651B5566FE"
      ],
pom.xml
@@ -582,6 +582,32 @@
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>
            <!-- CXF Codegen Plugin:根据 WSDL ç”Ÿæˆ Java å®¢æˆ·ç«¯ä»£ç  -->
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>3.5.5</version> <!-- ä½ å¯ä»¥ä½¿ç”¨æœ€æ–°çš„稳定版本,比如 3.5.6 / 4.x -->
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                        <configuration>
                            <!-- æŒ‡å®šç”Ÿæˆçš„ Java ç±» æ”¾åœ¨å“ªä¸ªç›®å½•下(通常是 target/generated-sources/cxf) -->
                            <sourceRoot>${project.basedir}/target/generated-sources/cxf</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/wsdl/WebService.asmx.wsdl</wsdl>
                                    <!-- æˆ–者直接使用 WSDL çš„网络地址 -->
                                    <!-- <wsdl>http://10.101.0.182:8002/MesWebService/WebService.asmx?wsdl</wsdl> -->
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java
@@ -6,14 +6,14 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonButtonConfig;
import org.jeecg.modules.andon.service.IAndonButtonConfigService;
import org.jeecg.modules.andon.service.impl.AndonOrderServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@@ -21,47 +21,26 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
/**
* @Description: å®‰ç¯æŒ‰é’®é…ç½®
* @Author: jeecg-boot
* @Date:   2025-07-10
* @Version: V1.0
*/
@Api(tags="安灯按钮配置")
 * @Description: å®‰ç¯æŒ‰é’®é…ç½®
 * @Author: jeecg-boot
 * @Date: 2025-07-10
 * @Version: V1.0
 */
@Api(tags = "安灯按钮配置")
@RestController
@RequestMapping("/andonbuttonconfig/andonButtonConfig")
@Slf4j
public class AndonButtonConfigController extends JeecgController<AndonButtonConfig, IAndonButtonConfigService> {
   @Autowired
   private IAndonButtonConfigService andonButtonConfigService;
   /**
    * åˆ†é¡µåˆ—表查询
    *
    * @param andonButtonConfig
    * @param pageNo
    * @param pageSize
    * @param req
    * @return
    */
   //@AutoLog(value = "安灯按钮配置-分页列表查询")
   @ApiOperation(value="安灯按钮配置-分页列表查询", notes="安灯按钮配置-分页列表查询")
   @GetMapping(value = "/list")
   public Result<IPage<AndonButtonConfig>> queryPageList(AndonButtonConfig andonButtonConfig,
                                  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                  HttpServletRequest req) {
       QueryWrapper<AndonButtonConfig> queryWrapper = QueryGenerator.initQueryWrapper(andonButtonConfig, req.getParameterMap());
       Page<AndonButtonConfig> page = new Page<AndonButtonConfig>(pageNo, pageSize);
       IPage<AndonButtonConfig> pageList = andonButtonConfigService.page(page, queryWrapper);
       return Result.OK(pageList);
   }
    @Autowired
    private IAndonButtonConfigService andonButtonConfigService;
    @Autowired
    private AndonOrderServiceImpl andonOrderServiceImpl;
    /**
     * APP分页列表查询
     * åˆ†é¡µåˆ—表查询
     *
     * @param andonButtonConfig
     * @param pageNo
@@ -69,126 +48,172 @@
     * @param req
     * @return
     */
    @ApiOperation(value="安灯按钮配置-分页列表查询", notes="安灯按钮配置-分页列表查询")
    @GetMapping(value = "/App/list")
    public Result<IPage<AndonButtonConfig>> queryPageAppList(AndonButtonConfig andonButtonConfig,
                                                             @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                             @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                                             HttpServletRequest req) {
    //@AutoLog(value = "安灯按钮配置-分页列表查询")
    @ApiOperation(value = "安灯按钮配置-分页列表查询", notes = "安灯按钮配置-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<AndonButtonConfig>> queryPageList(AndonButtonConfig andonButtonConfig,
                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                          HttpServletRequest req) {
        QueryWrapper<AndonButtonConfig> queryWrapper = QueryGenerator.initQueryWrapper(andonButtonConfig, req.getParameterMap());
        // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser != null) {
            // å¢žåŠ é€šè¿‡ç³»ç»Ÿç™»å½•äººè¿›è¡Œè¿‡æ»¤
            queryWrapper.eq("create_by", sysUser.getUsername());
        }
        Page<AndonButtonConfig> page = new Page<AndonButtonConfig>(pageNo, pageSize);
        IPage<AndonButtonConfig> pageList = andonButtonConfigService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
   /**
    *   æ·»åŠ 
    *
    * @param andonButtonConfig
    * @return
    */
   @AutoLog(value = "安灯按钮配置-添加")
   @ApiOperation(value="安灯按钮配置-添加", notes="安灯按钮配置-添加")
   //@RequiresPermissions("org.jeecg.modules:andon_button_config:add")
   @PostMapping(value = "/add")
   public Result<String> add(@RequestBody AndonButtonConfig andonButtonConfig) {
       andonButtonConfigService.save(andonButtonConfig);
       return Result.OK("添加成功!");
   }
   /**
    *  ç¼–辑
    *
    * @param andonButtonConfig
    * @return
    */
   @AutoLog(value = "安灯按钮配置-编辑")
   @ApiOperation(value="安灯按钮配置-编辑", notes="安灯按钮配置-编辑")
   //@RequiresPermissions("org.jeecg.modules:andon_button_config:edit")
   @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
   public Result<String> edit(@RequestBody AndonButtonConfig andonButtonConfig) {
       andonButtonConfigService.updateById(andonButtonConfig);
       return Result.OK("编辑成功!");
   }
    /**
     * APP安灯按钮列表查询
     *
     * @param factoryId
     * @return
     */
    @ApiOperation(value = "安灯按钮配置-分页列表查询", notes = "安灯按钮配置-分页列表查询")
    @GetMapping(value = "/queryUserAndonButtonList")
    public Result<List<AndonButtonDTO>> queryUserAndonButtonList(@RequestParam("factoryId") String factoryId) {
        List<AndonButtonDTO> list = andonButtonConfigService.queryUserAndonButtonList(factoryId);
        return Result.OK(list);
    }
   /**
    *   é€šè¿‡id删除
    *
    * @param id
    * @return
    */
   @AutoLog(value = "安灯按钮配置-通过id删除")
   @ApiOperation(value="安灯按钮配置-通过id删除", notes="安灯按钮配置-通过id删除")
   //@RequiresPermissions("org.jeecg.modules:andon_button_config:delete")
   @DeleteMapping(value = "/delete")
   public Result<String> delete(@RequestParam(name="id",required=true) String id) {
       andonButtonConfigService.removeById(id);
       return Result.OK("删除成功!");
   }
   /**
    *  æ‰¹é‡åˆ é™¤
    *
    * @param ids
    * @return
    */
   @AutoLog(value = "安灯按钮配置-批量删除")
   @ApiOperation(value="安灯按钮配置-批量删除", notes="安灯按钮配置-批量删除")
   //@RequiresPermissions("org.jeecg.modules:andon_button_config:deleteBatch")
   @DeleteMapping(value = "/deleteBatch")
   public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
       this.andonButtonConfigService.removeByIds(Arrays.asList(ids.split(",")));
       return Result.OK("批量删除成功!");
   }
    /**
     * APP安灯发起列表查询
     *
     * @param factoryId
     * @return
     */
    @ApiOperation(value = "安灯发起-分页列表查询", notes = "安灯发起-分页列表查询")
    @GetMapping(value = "/queryUserAndonCallList")
    public Result<List<AndonButtonDTO>> queryUserAndonCallList(@RequestParam("factoryId") String factoryId) {
        List<AndonButtonDTO> list = andonButtonConfigService.queryUserAndonCallList(factoryId);
        return Result.OK(list);
    }
   /**
    * é€šè¿‡id查询
    *
    * @param id
    * @return
    */
   //@AutoLog(value = "安灯按钮配置-通过id查询")
   @ApiOperation(value="安灯按钮配置-通过id查询", notes="安灯按钮配置-通过id查询")
   @GetMapping(value = "/queryById")
   public Result<AndonButtonConfig> queryById(@RequestParam(name="id",required=true) String id) {
       AndonButtonConfig andonButtonConfig = andonButtonConfigService.getById(id);
       if(andonButtonConfig==null) {
           return Result.error("未找到对应数据");
       }
       return Result.OK(andonButtonConfig);
   }
    /**
     * APP安灯响应列表查询
     *
     * @param factoryId
     * @return
     */
    @ApiOperation(value = "安灯响应-分页列表查询", notes = "安灯响应-分页列表查询")
    @GetMapping(value = "/queryUserAndonRespondList")
    public Result<List<AndonButtonDTO>> queryUserAndonRespondList(@RequestParam("factoryId") String factoryId) {
        List<AndonButtonDTO> list = andonButtonConfigService.queryUserAndonRespondList(factoryId);
        return Result.OK(list);
    }
   /**
   * å¯¼å‡ºexcel
   *
   * @param request
   * @param andonButtonConfig
   */
   //@RequiresPermissions("org.jeecg.modules:andon_button_config:exportXls")
   @RequestMapping(value = "/exportXls")
   public ModelAndView exportXls(HttpServletRequest request, AndonButtonConfig andonButtonConfig) {
       return super.exportXls(request, andonButtonConfig, AndonButtonConfig.class, "安灯按钮配置");
   }
    /**
     * APP安灯已处理列表查询
     *
     * @param factoryId
     * @return
     */
    @ApiOperation(value = "安灯响应-分页列表查询", notes = "安灯响应-分页列表查询")
    @GetMapping(value = "/queryUserAndonHandelList")
    public Result<List<AndonButtonDTO>> queryUserAndonHandelList(@RequestParam("factoryId") String factoryId) {
        List<AndonButtonDTO> list = andonButtonConfigService.queryUserAndonHandelList(factoryId);
        return Result.OK(list);
    }
    /**
     * æ·»åŠ 
     *
     * @param andonButtonConfig
     * @return
     */
    @AutoLog(value = "安灯按钮配置-添加")
    @ApiOperation(value = "安灯按钮配置-添加", notes = "安灯按钮配置-添加")
    //@RequiresPermissions("org.jeecg.modules:andon_button_config:add")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody AndonButtonConfig andonButtonConfig) {
        andonButtonConfigService.save(andonButtonConfig);
        return Result.OK("添加成功!");
    }
   /**
    /**
     * ç¼–辑
     *
     * @param andonButtonConfig
     * @return
     */
    @AutoLog(value = "安灯按钮配置-编辑")
    @ApiOperation(value = "安灯按钮配置-编辑", notes = "安灯按钮配置-编辑")
    //@RequiresPermissions("org.jeecg.modules:andon_button_config:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<String> edit(@RequestBody AndonButtonConfig andonButtonConfig) {
        andonButtonConfigService.updateById(andonButtonConfig);
        return Result.OK("编辑成功!");
    }
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "安灯按钮配置-通过id删除")
    @ApiOperation(value = "安灯按钮配置-通过id删除", notes = "安灯按钮配置-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:andon_button_config:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
        andonButtonConfigService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "安灯按钮配置-批量删除")
    @ApiOperation(value = "安灯按钮配置-批量删除", notes = "安灯按钮配置-批量删除")
    //@RequiresPermissions("org.jeecg.modules:andon_button_config:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        this.andonButtonConfigService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "安灯按钮配置-通过id查询")
    @ApiOperation(value = "安灯按钮配置-通过id查询", notes = "安灯按钮配置-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<AndonButtonConfig> queryById(@RequestParam(name = "id", required = true) String id) {
        AndonButtonConfig andonButtonConfig = andonButtonConfigService.getById(id);
        if (andonButtonConfig == null) {
            return Result.error("未找到对应数据");
        }
        return Result.OK(andonButtonConfig);
    }
    /**
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param andonButtonConfig
     */
    //@RequiresPermissions("org.jeecg.modules:andon_button_config:exportXls")
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, AndonButtonConfig andonButtonConfig) {
        return super.exportXls(request, andonButtonConfig, AndonButtonConfig.class, "安灯按钮配置");
    }
    /**
     * é€šè¿‡excel导入数据
   *
   * @param request
   * @param response
   * @return
   */
   //@RequiresPermissions("andon_button_config:importExcel")
   @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
   public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
       return super.importExcel(request, response, AndonButtonConfig.class);
   }
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("andon_button_config:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, AndonButtonConfig.class);
    }
}
src/main/java/org/jeecg/modules/andon/controller/AndonOrderController.java
@@ -12,6 +12,8 @@
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.andon.entity.AndonOrder;
import org.jeecg.modules.andon.service.IAndonOrderService;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@@ -21,141 +23,173 @@
import java.util.Arrays;
/**
* @Description: å®‰ç¯å·¥å•
* @Author: jeecg-boot
* @Date:   2025-07-10
* @Version: V1.0
*/
@Api(tags="安灯工单")
 * @Description: å®‰ç¯å·¥å•
 * @Author: jeecg-boot
 * @Date: 2025-07-10
 * @Version: V1.0
 */
@Api(tags = "安灯工单")
@RestController
@RequestMapping("/andonorder/andonOrder")
@Slf4j
public class AndonOrderController extends JeecgController<AndonOrder, IAndonOrderService> {
   @Autowired
   private IAndonOrderService andonOrderService;
    @Autowired
    private IAndonOrderService andonOrderService;
   /**
    * åˆ†é¡µåˆ—表查询
    *
    * @param andonOrder
    * @param pageNo
    * @param pageSize
    * @param req
    * @return
    */
   //@AutoLog(value = "安灯工单-分页列表查询")
   @ApiOperation(value="安灯工单-分页列表查询", notes="安灯工单-分页列表查询")
   @GetMapping(value = "/list")
   public Result<IPage<AndonOrder>> queryPageList(AndonOrder andonOrder,
                                  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                  HttpServletRequest req) {
       QueryWrapper<AndonOrder> queryWrapper = QueryGenerator.initQueryWrapper(andonOrder, req.getParameterMap());
       Page<AndonOrder> page = new Page<AndonOrder>(pageNo, pageSize);
       IPage<AndonOrder> pageList = andonOrderService.page(page, queryWrapper);
       return Result.OK(pageList);
   }
   /**
    *   æ·»åŠ 
    *
    * @param andonOrder
    * @return
    */
   @AutoLog(value = "安灯工单-添加")
   @ApiOperation(value="安灯工单-添加", notes="安灯工单-添加")
   //@RequiresPermissions("org.jeecg.modules:andon_order:add")
   @PostMapping(value = "/add")
   public Result<String> add(@RequestBody AndonOrder andonOrder) {
       andonOrderService.save(andonOrder);
       return Result.OK("添加成功!");
   }
   /**
    *  ç¼–辑
    *
    * @param andonOrder
    * @return
    */
   @AutoLog(value = "安灯工单-编辑")
   @ApiOperation(value="安灯工单-编辑", notes="安灯工单-编辑")
   //@RequiresPermissions("org.jeecg.modules:andon_order:edit")
   @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
   public Result<String> edit(@RequestBody AndonOrder andonOrder) {
       andonOrderService.updateById(andonOrder);
       return Result.OK("编辑成功!");
   }
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param andonOrder
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "安灯工单-分页列表查询")
    @ApiOperation(value = "安灯工单-分页列表查询", notes = "安灯工单-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<AndonOrder>> queryPageList(AndonOrder andonOrder,
                                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                   HttpServletRequest req) {
        QueryWrapper<AndonOrder> queryWrapper = QueryGenerator.initQueryWrapper(andonOrder, req.getParameterMap());
        Page<AndonOrder> page = new Page<AndonOrder>(pageNo, pageSize);
        IPage<AndonOrder> pageList = andonOrderService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
   /**
    *   é€šè¿‡id删除
    *
    * @param id
    * @return
    */
   @AutoLog(value = "安灯工单-通过id删除")
   @ApiOperation(value="安灯工单-通过id删除", notes="安灯工单-通过id删除")
   //@RequiresPermissions("org.jeecg.modules:andon_order:delete")
   @DeleteMapping(value = "/delete")
   public Result<String> delete(@RequestParam(name="id",required=true) String id) {
       andonOrderService.removeById(id);
       return Result.OK("删除成功!");
   }
   /**
    *  æ‰¹é‡åˆ é™¤
    *
    * @param ids
    * @return
    */
   @AutoLog(value = "安灯工单-批量删除")
   @ApiOperation(value="安灯工单-批量删除", notes="安灯工单-批量删除")
   //@RequiresPermissions("org.jeecg.modules:andon_order:deleteBatch")
   @DeleteMapping(value = "/deleteBatch")
   public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
       this.andonOrderService.removeByIds(Arrays.asList(ids.split(",")));
       return Result.OK("批量删除成功!");
   }
    /**
     * æ·»åŠ 
     *
     * @param andonOrder
     * @return
     */
    @AutoLog(value = "安灯工单-添加")
    @ApiOperation(value = "安灯工单-添加", notes = "安灯工单-添加")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody AndonOrder andonOrder) {
        andonOrderService.save(andonOrder);
        return Result.OK("添加成功!");
    }
   /**
    * é€šè¿‡id查询
    *
    * @param id
    * @return
    */
   //@AutoLog(value = "安灯工单-通过id查询")
   @ApiOperation(value="安灯工单-通过id查询", notes="安灯工单-通过id查询")
   @GetMapping(value = "/queryById")
   public Result<AndonOrder> queryById(@RequestParam(name="id",required=true) String id) {
       AndonOrder andonOrder = andonOrderService.getById(id);
       if(andonOrder==null) {
           return Result.error("未找到对应数据");
       }
       return Result.OK(andonOrder);
   }
   /**
   * å¯¼å‡ºexcel
   *
   * @param request
   * @param andonOrder
   */
   //@RequiresPermissions("org.jeecg.modules:andon_order:exportXls")
   @RequestMapping(value = "/exportXls")
   public ModelAndView exportXls(HttpServletRequest request, AndonOrder andonOrder) {
       return super.exportXls(request, andonOrder, AndonOrder.class, "安灯工单");
   }
    /**
     * APP安灯响应操作
     *
     * @param orderId
     * @return
     */
    @ApiOperation(value = "APP安灯响应操作", notes = "APP安灯响应操作")
    @GetMapping(value = "/AndonRespond")
    public Result<String> AndonRespond(@RequestParam("orderId") String orderId) {
        AndonOrder andonOrder = andonOrderService.getById(orderId);
        andonOrder.setOrderStatus("2");
        andonOrderService.updateById(andonOrder);
        return Result.OK("响应成功!");
    }
   /**
    /**
     * APP安灯处理操作
     *
     *
     * @return
     */
    @ApiOperation(value = "APP安灯处理操作", notes = "APP安灯处理操作")
    @PostMapping(value = "/AndonHandel")
    public Result<String> AndonHandel(@RequestBody AndonOrder andonOrder) {
        return andonOrderService.handleAndonOrder(andonOrder);
    }
    /**
     * ç¼–辑
     *
     * @param andonOrder
     * @return
     */
    @AutoLog(value = "安灯工单-编辑")
    @ApiOperation(value = "安灯工单-编辑", notes = "安灯工单-编辑")
    //@RequiresPermissions("org.jeecg.modules:andon_order:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<String> edit(@RequestBody AndonOrder andonOrder) {
        andonOrderService.updateById(andonOrder);
        return Result.OK("编辑成功!");
    }
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "安灯工单-通过id删除")
    @ApiOperation(value = "安灯工单-通过id删除", notes = "安灯工单-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:andon_order:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
        andonOrderService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "安灯工单-批量删除")
    @ApiOperation(value = "安灯工单-批量删除", notes = "安灯工单-批量删除")
    //@RequiresPermissions("org.jeecg.modules:andon_order:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        this.andonOrderService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "安灯工单-通过id查询")
    @ApiOperation(value = "安灯工单-通过id查询", notes = "安灯工单-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<AndonOrder> queryById(@RequestParam(name = "id", required = true) String id) {
        AndonOrder andonOrder = andonOrderService.getById(id);
        if (andonOrder == null) {
            return Result.error("未找到对应数据");
        }
        return Result.OK(andonOrder);
    }
    /**
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param andonOrder
     */
    //@RequiresPermissions("org.jeecg.modules:andon_order:exportXls")
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, AndonOrder andonOrder) {
        return super.exportXls(request, andonOrder, AndonOrder.class, "安灯工单");
    }
    /**
     * é€šè¿‡excel导入数据
   *
   * @param request
   * @param response
   * @return
   */
   //@RequiresPermissions("andon_order:importExcel")
   @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
   public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
       return super.importExcel(request, response, AndonOrder.class);
   }
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("andon_order:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, AndonOrder.class);
    }
}
src/main/java/org/jeecg/modules/andon/controller/AndonResponseConfigController.java
@@ -10,6 +10,7 @@
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonResponseConfig;
import org.jeecg.modules.andon.service.IAndonResponseConfigService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,143 +20,165 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
/**
* @Description: å®‰ç¯å“åº”配置
* @Author: jeecg-boot
* @Date:   2025-07-10
* @Version: V1.0
*/
@Api(tags="安灯响应配置")
 * @Description: å®‰ç¯å“åº”配置
 * @Author: jeecg-boot
 * @Date: 2025-07-10
 * @Version: V1.0
 */
@Api(tags = "安灯响应配置")
@RestController
@RequestMapping("/andonresponseconfig/andonResponseConfig")
@Slf4j
public class AndonResponseConfigController extends JeecgController<AndonResponseConfig, IAndonResponseConfigService> {
   @Autowired
   private IAndonResponseConfigService andonResponseConfigService;
    @Autowired
    private IAndonResponseConfigService andonResponseConfigService;
   /**
    * åˆ†é¡µåˆ—表查询
    *
    * @param andonResponseConfig
    * @param pageNo
    * @param pageSize
    * @param req
    * @return
    */
   //@AutoLog(value = "安灯响应配置-分页列表查询")
   @ApiOperation(value="安灯响应配置-分页列表查询", notes="安灯响应配置-分页列表查询")
   @GetMapping(value = "/list")
   public Result<IPage<AndonResponseConfig>> queryPageList(AndonResponseConfig andonResponseConfig,
                                  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                  HttpServletRequest req) {
       QueryWrapper<AndonResponseConfig> queryWrapper = QueryGenerator.initQueryWrapper(andonResponseConfig, req.getParameterMap());
       Page<AndonResponseConfig> page = new Page<AndonResponseConfig>(pageNo, pageSize);
       IPage<AndonResponseConfig> pageList = andonResponseConfigService.page(page, queryWrapper);
       return Result.OK(pageList);
   }
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param andonResponseConfig
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "安灯响应配置-分页列表查询")
    @ApiOperation(value = "安灯响应配置-分页列表查询", notes = "安灯响应配置-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<AndonResponseConfig>> queryPageList(AndonResponseConfig andonResponseConfig,
                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                            HttpServletRequest req) {
        QueryWrapper<AndonResponseConfig> queryWrapper = QueryGenerator.initQueryWrapper(andonResponseConfig, req.getParameterMap());
        Page<AndonResponseConfig> page = new Page<AndonResponseConfig>(pageNo, pageSize);
        IPage<AndonResponseConfig> pageList = andonResponseConfigService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
   /**
    *   æ·»åŠ 
    *
    * @param andonResponseConfig
    * @return
    */
   @AutoLog(value = "安灯响应配置-添加")
   @ApiOperation(value="安灯响应配置-添加", notes="安灯响应配置-添加")
   //@RequiresPermissions("org.jeecg.modules:andon_response_config:add")
   @PostMapping(value = "/add")
   public Result<String> add(@RequestBody AndonResponseConfig andonResponseConfig) {
       andonResponseConfigService.save(andonResponseConfig);
       return Result.OK("添加成功!");
   }
   /**
    *  ç¼–辑
    *
    * @param andonResponseConfig
    * @return
    */
   @AutoLog(value = "安灯响应配置-编辑")
   @ApiOperation(value="安灯响应配置-编辑", notes="安灯响应配置-编辑")
   //@RequiresPermissions("org.jeecg.modules:andon_response_config:edit")
   @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
   public Result<String> edit(@RequestBody AndonResponseConfig andonResponseConfig) {
       andonResponseConfigService.updateById(andonResponseConfig);
       return Result.OK("编辑成功!");
   }
    /**
     * å‘送安灯消息
     *
     * @param andonButtonDTO
     * @return
     */
    @AutoLog(value = "安灯工单-发送飞书消息")
    @ApiOperation(value = "安灯工单-发送飞书消息", notes = "安灯工单-发送飞书消息")
    @PostMapping(value = "/sendMessage")
    public Result<String> sendMessage(@RequestBody AndonButtonDTO andonButtonDTO) {
        try {
            andonButtonDTO.setBlinkingFlag(1);
            // è°ƒç”¨æœåŠ¡å±‚å¤„ç†ä¸šåŠ¡é€»è¾‘
            andonResponseConfigService.sendAndonNotification(andonButtonDTO);
            return Result.OK("添加成功!");
        } catch (Exception e) {
            log.error("安灯工单[{}]飞书通知发送失败", andonButtonDTO.getId(), e);
            return Result.error("发送消息失败: " + e.getMessage());
        }
    }
   /**
    *   é€šè¿‡id删除
    *
    * @param id
    * @return
    */
   @AutoLog(value = "安灯响应配置-通过id删除")
   @ApiOperation(value="安灯响应配置-通过id删除", notes="安灯响应配置-通过id删除")
   //@RequiresPermissions("org.jeecg.modules:andon_response_config:delete")
   @DeleteMapping(value = "/delete")
   public Result<String> delete(@RequestParam(name="id",required=true) String id) {
       andonResponseConfigService.removeById(id);
       return Result.OK("删除成功!");
   }
    /**
     * æ·»åŠ 
     *
     * @param andonResponseConfig
     * @return
     */
    @AutoLog(value = "安灯响应配置-添加")
    @ApiOperation(value = "安灯响应配置-添加", notes = "安灯响应配置-添加")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody AndonResponseConfig andonResponseConfig) {
        andonResponseConfigService.save(andonResponseConfig);
        return Result.OK("添加成功!");
    }
   /**
    *  æ‰¹é‡åˆ é™¤
    *
    * @param ids
    * @return
    */
   @AutoLog(value = "安灯响应配置-批量删除")
   @ApiOperation(value="安灯响应配置-批量删除", notes="安灯响应配置-批量删除")
   //@RequiresPermissions("org.jeecg.modules:andon_response_config:deleteBatch")
   @DeleteMapping(value = "/deleteBatch")
   public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
       this.andonResponseConfigService.removeByIds(Arrays.asList(ids.split(",")));
       return Result.OK("批量删除成功!");
   }
    /**
     * ç¼–辑
     *
     * @param andonResponseConfig
     * @return
     */
    @AutoLog(value = "安灯响应配置-编辑")
    @ApiOperation(value = "安灯响应配置-编辑", notes = "安灯响应配置-编辑")
    //@RequiresPermissions("org.jeecg.modules:andon_response_config:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<String> edit(@RequestBody AndonResponseConfig andonResponseConfig) {
        andonResponseConfigService.updateById(andonResponseConfig);
        return Result.OK("编辑成功!");
    }
   /**
    * é€šè¿‡id查询
    *
    * @param id
    * @return
    */
   //@AutoLog(value = "安灯响应配置-通过id查询")
   @ApiOperation(value="安灯响应配置-通过id查询", notes="安灯响应配置-通过id查询")
   @GetMapping(value = "/queryById")
   public Result<AndonResponseConfig> queryById(@RequestParam(name="id",required=true) String id) {
       AndonResponseConfig andonResponseConfig = andonResponseConfigService.getById(id);
       if(andonResponseConfig==null) {
           return Result.error("未找到对应数据");
       }
       return Result.OK(andonResponseConfig);
   }
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "安灯响应配置-通过id删除")
    @ApiOperation(value = "安灯响应配置-通过id删除", notes = "安灯响应配置-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:andon_response_config:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
        andonResponseConfigService.removeById(id);
        return Result.OK("删除成功!");
    }
   /**
   * å¯¼å‡ºexcel
   *
   * @param request
   * @param andonResponseConfig
   */
   //@RequiresPermissions("org.jeecg.modules:andon_response_config:exportXls")
   @RequestMapping(value = "/exportXls")
   public ModelAndView exportXls(HttpServletRequest request, AndonResponseConfig andonResponseConfig) {
       return super.exportXls(request, andonResponseConfig, AndonResponseConfig.class, "安灯响应配置");
   }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "安灯响应配置-批量删除")
    @ApiOperation(value = "安灯响应配置-批量删除", notes = "安灯响应配置-批量删除")
    //@RequiresPermissions("org.jeecg.modules:andon_response_config:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        this.andonResponseConfigService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
   /**
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "安灯响应配置-通过id查询")
    @ApiOperation(value = "安灯响应配置-通过id查询", notes = "安灯响应配置-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<AndonResponseConfig> queryById(@RequestParam(name = "id", required = true) String id) {
        AndonResponseConfig andonResponseConfig = andonResponseConfigService.getById(id);
        if (andonResponseConfig == null) {
            return Result.error("未找到对应数据");
        }
        return Result.OK(andonResponseConfig);
    }
    /**
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param andonResponseConfig
     */
    //@RequiresPermissions("org.jeecg.modules:andon_response_config:exportXls")
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, AndonResponseConfig andonResponseConfig) {
        return super.exportXls(request, andonResponseConfig, AndonResponseConfig.class, "安灯响应配置");
    }
    /**
     * é€šè¿‡excel导入数据
   *
   * @param request
   * @param response
   * @return
   */
   //@RequiresPermissions("andon_response_config:importExcel")
   @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
   public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
       return super.importExcel(request, response, AndonResponseConfig.class);
   }
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("andon_response_config:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, AndonResponseConfig.class);
    }
}
src/main/java/org/jeecg/modules/andon/dto/AndonButtonDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package org.jeecg.modules.andon.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
@Data
public class AndonButtonDTO {
    /** å“åº”ID */
    @ApiModelProperty(value = "响应ID")
    private String id;
    /** æŒ‰é’®ID */
    @ApiModelProperty(value = " æŒ‰é’®ID ")
    private String buttonId;
    /**安灯名称*/
    @ApiModelProperty(value = "安灯名称")
    private String buttonName;
    /**安灯编码*/
    @ApiModelProperty(value = "安灯编码")
    private String buttonCode;
    /** ä¸€çº§å“åº”人 */
    @ApiModelProperty(value = "一级响应人")
    private String responder;
    @ApiModelProperty(value = "二级响应人")
    private String secondResponder;
    /**产线名称*/
    @ApiModelProperty(value = "产线名称")
    private String factoryName;
    /**产线名称*/
    @ApiModelProperty(value = "工厂名称")
    private String parentFactoryName;
    /**一级响应时长*/
    @ApiModelProperty(value = "一级响应时长")
    private Integer upgradeResponseDuration;
    /**二级响应时长*/
    @ApiModelProperty(value = "二级响应时长")
    private Integer secondUpgradeResponseDuration;
    /**三级级响应时长*/
    @ApiModelProperty(value = "三级响应时长")
    private Integer thirdUpgradeResponseDuration;
    /**
     * æ˜¯å¦é—ªçƒ
     * å¯¹åº”数据库表中 is_blinking å­—段(大于0 æœ‰å¾…处理的工单闪,相反不闪烁)
     */
    @ApiModelProperty(value = "标识闪烁")
    private Integer blinkingFlag;
    @ApiModelProperty(value = "一级响应人openId")
    private String responderOpenId;
    @ApiModelProperty(value = "二级响应人openId")
    private String secondResponderOpenId;
    @ApiModelProperty(value = "三级响应人openId")
    private String thirdResponderOpenId;
    @ApiModelProperty(value = "三级响应人")
    private String thirdResponder;
    @ApiModelProperty(value = "工单ID")
    private String orderIds;
    @ApiModelProperty(value = "工单状态")
    private String orderStatus;
    @ApiModelProperty(value = "安灯发起人")
    private String operator;
}
src/main/java/org/jeecg/modules/andon/entity/AndonButtonConfig.java
@@ -1,12 +1,10 @@
package org.jeecg.modules.andon.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import liquibase.pro.packaged.B;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -89,4 +87,13 @@
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * æ˜¯å¦é—ªçƒ
     * å¯¹åº”数据库表中 is_blinking å­—段(tinyint类型,默认值0)
     */
    @ApiModelProperty(value = "标识闪烁")
    @TableField(exist = false)
    private boolean blinkingFlag;
}
src/main/java/org/jeecg/modules/andon/entity/AndonOrder.java
@@ -68,6 +68,7 @@
    private String buttonId;
    /**安灯人*/
    @Excel(name = "安灯人", width = 15)
    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
    @ApiModelProperty(value = "安灯人")
    private String operator;
    /**安灯时间*/
@@ -82,6 +83,7 @@
    @ApiModelProperty(value = "安灯等级")
    private String andonLevel;
    /**响应人*/
    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
    @Excel(name = "响应人", width = 15)
    @ApiModelProperty(value = "响应人")
    private String responder;
@@ -92,6 +94,7 @@
    @ApiModelProperty(value = "响应时间")
    private Date responseTime;
    /**处理人*/
    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
    @Excel(name = "处理人", width = 15)
    @ApiModelProperty(value = "处理人")
    private String processor;
src/main/java/org/jeecg/modules/andon/entity/AndonResponseConfig.java
@@ -78,4 +78,7 @@
    @Excel(name = "三级响应人(升级两次)", width = 15)
    @ApiModelProperty(value = "三级响应人(升级两次)")
    private String thirdResponder;
}
src/main/java/org/jeecg/modules/andon/mapper/AndonButtonConfigMapper.java
@@ -2,7 +2,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonButtonConfig;
import java.util.List;
/**
 * @Description: å®‰ç¯æŒ‰é’®é…ç½®
@@ -12,4 +15,36 @@
 */
public interface AndonButtonConfigMapper extends BaseMapper<AndonButtonConfig> {
    AndonButtonConfig getAndonButtonById(@Param("id") String id);
    /**
     * å®‰ç¯æŒ‰é’®åˆ—表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonButtonList(String factoryId);
    /**
     * å‘起安灯列表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonCallList(String factoryId);
    /**
     * å“åº”安灯列表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonRespondList(String factoryId);
    /**
     * å¤„理安灯列表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonHandelList(String factoryId);
}
src/main/java/org/jeecg/modules/andon/mapper/AndonResponseConfigMapper.java
@@ -2,7 +2,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonResponseConfig;
import java.util.List;
/**
 * @Description: å®‰ç¯å“åº”配置
@@ -12,4 +15,5 @@
 */
public interface AndonResponseConfigMapper extends BaseMapper<AndonResponseConfig> {
    AndonResponseConfig getAndonResponseConfigByFactoryIdAndButtonId(@Param("factoryId") String factoryId, @Param("buttonId") String buttonId);
}
src/main/java/org/jeecg/modules/andon/mapper/xml/AndonButtonConfigMapper.xml
@@ -2,6 +2,204 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.andon.mapper.AndonButtonConfigMapper">
    <select id="getAndonButtonById" resultType="org.jeecg.modules.andon.entity.AndonButtonConfig">
        SELECT * FROM andon_button_config WHERE id = #{id} and del_flag = 0 and button_status = '启用'
        SELECT *
        FROM andon_button_config
        WHERE id = #{id}
          and del_flag = 0
          and button_status = '启用'
    </select>
    <select id="queryUserAndonButtonList" resultType="org.jeecg.modules.andon.dto.AndonButtonDTO">
        select arc.id,
               abc.id as button_id,
               abc.button_name,
               abc.button_code,
               (select count(1)
                from andon_order ao
                where ao.button_id = arc.button_id
                  and ao.factory_id = arc.factory_id
                  and ao.order_status != '3') as blinking_flag, STUFF((SELECT ',' + CAST (ao.id AS VARCHAR)
            FROM andon_order ao
            WHERE ao.button_id = arc.button_id
            and ao.factory_id = arc.factory_id
            FOR XML PATH ('')), 1, 1, '') as order_ids
        from andon_response_config arc
            left join andon_button_config abc
        on arc.button_id = abc.id
        where arc.factory_id=#{factoryId};
    </select>
    <select id="queryUserAndonCallList" resultType="org.jeecg.modules.andon.dto.AndonButtonDTO">
        select arc.id,
               abc.id          as buttonId,
               abc.button_name as buttonName,
               abc.button_code as buttonCode,
               (select count(1)
                from andon_order ao
                where ao.button_id = arc.button_id
                  and ao.factory_id = arc.factory_id
                  and ao.order_status = '1') as blinkingFlag,
               STUFF((SELECT ',' + CAST (ao.id AS VARCHAR)
                      FROM andon_order ao
                      WHERE ao.button_id = arc.button_id
                        and ao.factory_id = arc.factory_id
                        and ao.order_status = '1'
                   FOR XML PATH ('')), 1, 1, '') as orderIds,
               bf.factory_name as factoryName,
               parent_bf.factory_name as parentFactoryName,
               abc.upgrade_response_duration as upgradeResponseDuration,
               abc.second_upgrade_response_duration as secondUpgradeResponseDuration,
               arc.firster_responder as responder,
               arc.second_responder,
               arc.third_responder,
               STUFF((SELECT ',' + ao.order_status
                      FROM andon_order ao
                      WHERE ao.button_id = arc.button_id
                        and ao.factory_id = arc.factory_id
                        and ao.order_status = '1'
                   FOR XML PATH ('')), 1, 1, '') as orderStatus
        from andon_response_config arc
                 left join andon_button_config abc
                           on arc.button_id = abc.id
                 left join base_factory bf on arc.factory_id = bf.id
                 left join base_factory parent_bf on bf.parent_id = parent_bf.id
        where arc.factory_id=#{factoryId}
          and (select count (1)
               from andon_order ao
               where ao.button_id = arc.button_id
                 and ao.factory_id = arc.factory_id
                 and ao.order_status = '1') = 1
    </select>
    <select id="queryUserAndonRespondList" resultType="org.jeecg.modules.andon.dto.AndonButtonDTO">
        select arc.id,
               abc.id                               as buttonId,
               abc.button_name                      as buttonName,
               abc.button_code                      as buttonCode,
               (select count(1)
                from andon_order ao
                where ao.button_id = arc.button_id
                  and ao.factory_id = arc.factory_id
                  and ao.order_status = '2')        as blinkingFlag,
               STUFF((SELECT ',' + CAST(ao.id AS VARCHAR)
                      FROM andon_order ao
                      WHERE ao.button_id = arc.button_id
                        and ao.factory_id = arc.factory_id
                        and ao.order_status = '2'
                   FOR XML PATH ('')), 1, 1, '')    as orderIds,
               bf.factory_name                      as factoryName,
               parent_bf.factory_name               as parentFactoryName,
               abc.upgrade_response_duration        as upgradeResponseDuration,
               abc.second_upgrade_response_duration as secondUpgradeResponseDuration,
               arc.firster_responder                as responder,
               arc.second_responder,
               arc.third_responder,
               STUFF((SELECT ',' + ao.order_status
                      FROM andon_order ao
                      WHERE ao.button_id = arc.button_id
                        and ao.factory_id = arc.factory_id
                        and ao.order_status = '2'
                   FOR XML PATH ('')), 1, 1, '')    as orderStatus,
               (SELECT TOP 1 ao.operator
                FROM andon_order ao
                WHERE ao.button_id = arc.button_id
                  and ao.factory_id = arc.factory_id
                  and ao.order_status = '2')         as operator
        from andon_response_config arc
                 left join andon_button_config abc
                           on arc.button_id = abc.id
                 left join base_factory bf on arc.factory_id = bf.id
                 left join base_factory parent_bf on bf.parent_id = parent_bf.id
        where arc.factory_id = #{factoryId}
          and (select count(1)
               from andon_order ao
               where ao.button_id = arc.button_id
                 and ao.factory_id = arc.factory_id
                 and ao.order_status = '2') = 1
    </select>
<!--    <select id="queryUserAndonRespondList" resultType="org.jeecg.modules.andon.dto.AndonButtonDTO">-->
<!--        select arc.id,-->
<!--               abc.id                               as buttonId,-->
<!--               abc.button_name                      as buttonName,-->
<!--               abc.button_code                      as buttonCode,-->
<!--               (select count(1)-->
<!--                from andon_order ao-->
<!--                where ao.button_id = arc.button_id-->
<!--                  and ao.factory_id = arc.factory_id-->
<!--                  and ao.order_status = '2')        as blinkingFlag,-->
<!--               STUFF((SELECT ',' + CAST(ao.id AS VARCHAR)-->
<!--                      FROM andon_order ao-->
<!--                      WHERE ao.button_id = arc.button_id-->
<!--                        and ao.factory_id = arc.factory_id-->
<!--                        and ao.order_status = '2'-->
<!--                   FOR XML PATH ('')), 1, 1, '')    as orderIds,-->
<!--               bf.factory_name                      as factoryName,-->
<!--               parent_bf.factory_name               as parentFactoryName,-->
<!--               abc.upgrade_response_duration        as upgradeResponseDuration,-->
<!--               abc.second_upgrade_response_duration as secondUpgradeResponseDuration,-->
<!--               arc.firster_responder                as responder,-->
<!--               arc.second_responder,-->
<!--               arc.third_responder,-->
<!--               STUFF((SELECT ',' + ao.order_status-->
<!--                      FROM andon_order ao-->
<!--                      WHERE ao.button_id = arc.button_id-->
<!--                        and ao.factory_id = arc.factory_id-->
<!--                        and ao.order_status = '2'-->
<!--                   FOR XML PATH ('')), 1, 1, '')    as orderStatus-->
<!--        from andon_response_config arc-->
<!--                 left join andon_button_config abc-->
<!--                           on arc.button_id = abc.id-->
<!--                 left join base_factory bf on arc.factory_id = bf.id-->
<!--                 left join base_factory parent_bf on bf.parent_id = parent_bf.id-->
<!--        where arc.factory_id = #{factoryId}-->
<!--          and (select count(1)-->
<!--               from andon_order ao-->
<!--               where ao.button_id = arc.button_id-->
<!--                 and ao.factory_id = arc.factory_id-->
<!--                 and ao.order_status = '2') = 1-->
<!--    </select>-->
    <select id="queryUserAndonHandelList" resultType="org.jeecg.modules.andon.dto.AndonButtonDTO">
        select arc.id,
               abc.id                               as buttonId,
               abc.button_name                      as buttonName,
               abc.button_code                      as buttonCode,
               (select count(1)
                from andon_order ao
                where ao.button_id = arc.button_id
                  and ao.factory_id = arc.factory_id
                  and ao.order_status = '3')        as blinkingFlag,
               STUFF((SELECT ',' + CAST(ao.id AS VARCHAR)
                      FROM andon_order ao
                      WHERE ao.button_id = arc.button_id
                        and ao.factory_id = arc.factory_id
                        and ao.order_status = '3'
                   FOR XML PATH ('')), 1, 1, '')    as orderIds,
               bf.factory_name                      as factoryName,
               parent_bf.factory_name               as parentFactoryName,
               abc.upgrade_response_duration        as upgradeResponseDuration,
               abc.second_upgrade_response_duration as secondUpgradeResponseDuration,
               arc.firster_responder                as responder,
               arc.second_responder,
               arc.third_responder,
               STUFF((SELECT ',' + ao.order_status
                      FROM andon_order ao
                      WHERE ao.button_id = arc.button_id
                        and ao.factory_id = arc.factory_id
                        and ao.order_status = '3'
                   FOR XML PATH ('')), 1, 1, '')    as orderStatus
        from andon_response_config arc
                 left join andon_button_config abc
                           on arc.button_id = abc.id
                 left join base_factory bf on arc.factory_id = bf.id
                 left join base_factory parent_bf on bf.parent_id = parent_bf.id
        where arc.factory_id = #{factoryId}
          and (select count(1)
               from andon_order ao
               where ao.button_id = arc.button_id
                 and ao.factory_id = arc.factory_id
                 and ao.order_status = '3') = 1
    </select>
</mapper>
src/main/java/org/jeecg/modules/andon/mapper/xml/AndonResponseConfigMapper.xml
@@ -1,7 +1,13 @@
<?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="org.jeecg.modules.andon.mapper.AndonResponseConfigMapper">
    <select id="getAndonResponseConfigByFactoryIdAndButtonId" resultType="org.jeecg.modules.andon.entity.AndonResponseConfig">
        SELECT * FROM andon_response_config WHERE factory_id = #{factoryId} AND button_id = #{buttonId} AND del_flag = 0
    <select id="getAndonResponseConfigByFactoryIdAndButtonId"
            resultType="org.jeecg.modules.andon.entity.AndonResponseConfig">
        SELECT *
        FROM andon_response_config
        WHERE factory_id = #{factoryId}
          AND button_id = #{buttonId}
          AND del_flag = 0
    </select>
</mapper>
</mapper>
src/main/java/org/jeecg/modules/andon/service/IAndonButtonConfigService.java
@@ -1,7 +1,10 @@
package org.jeecg.modules.andon.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonButtonConfig;
import java.util.List;
/**
 * @Description: å®‰ç¯æŒ‰é’®é…ç½®
@@ -11,4 +14,35 @@
 */
public interface IAndonButtonConfigService extends IService<AndonButtonConfig> {
    AndonButtonConfig getAndonButtonById(String id);
    /**
     * æŸ¥è¯¢ç”¨æˆ·å®‰ç¯æŒ‰é’®åˆ—表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonButtonList(String factoryId);
    /**
     * æŸ¥è¯¢ç”¨æˆ·å‘起安灯按钮列表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonCallList(String factoryId);
    /**
     * æŸ¥è¯¢ç”¨æˆ·å‘起安灯响应列表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonRespondList(String factoryId);
    /**
     * æŸ¥è¯¢ç”¨æˆ·å‘起安灯处理列表
     * @param factoryId
     * @return
     */
    List<AndonButtonDTO> queryUserAndonHandelList(String factoryId);
}
src/main/java/org/jeecg/modules/andon/service/IAndonOrderService.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.andon.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.andon.entity.AndonOrder;
import java.util.List;
@@ -14,4 +15,20 @@
public interface IAndonOrderService extends IService<AndonOrder> {
    //已完成状态除外
    List<AndonOrder> getAndonOrdersExceptYWC();
    /**
     * èŽ·å–å·¥å•çš„åˆå§‹å“åº”äºº
     * @param andonOrder
     * @return
     */
    String getPrimaryResponder(AndonOrder andonOrder);
    /**
     * å¤„理安灯工单
     * @param andonOrder
     * @return
     */
    Result<String> handleAndonOrder(AndonOrder andonOrder);
}
src/main/java/org/jeecg/modules/andon/service/IAndonResponseConfigService.java
@@ -1,7 +1,10 @@
package org.jeecg.modules.andon.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonResponseConfig;
import java.util.List;
/**
 * @Description: å®‰ç¯å“åº”配置
@@ -11,4 +14,14 @@
 */
public interface IAndonResponseConfigService extends IService<AndonResponseConfig> {
    AndonResponseConfig getAndonResponseConfigByFactoryIdAndButtonId(String factoryId, String buttonId);
    /**
     * å‘送安灯通知
     * @param andonButtonDTO å®‰ç¯æŒ‰é’®DTO
     * @return ç»“æžœ
     */
    void sendAndonNotification(AndonButtonDTO andonButtonDTO);
}
src/main/java/org/jeecg/modules/andon/service/impl/AndonButtonConfigServiceImpl.java
@@ -1,10 +1,14 @@
package org.jeecg.modules.andon.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonButtonConfig;
import org.jeecg.modules.andon.mapper.AndonButtonConfigMapper;
import org.jeecg.modules.andon.service.IAndonButtonConfigService;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
 * @Description: å®‰ç¯æŒ‰é’®é…ç½®
@@ -19,4 +23,26 @@
    public AndonButtonConfig getAndonButtonById(String id) {
        return baseMapper.getAndonButtonById(id);
    }
    @Override
    public List<AndonButtonDTO> queryUserAndonButtonList(String factoryId) {
        return baseMapper.queryUserAndonButtonList(factoryId);
    }
    @Override
    public List<AndonButtonDTO> queryUserAndonCallList(String factoryId) {
        return baseMapper.queryUserAndonCallList(factoryId);
    }
    @Override
    public List<AndonButtonDTO> queryUserAndonRespondList(String factoryId) {
        return baseMapper.queryUserAndonRespondList(factoryId);
    }
    @Override
    public List<AndonButtonDTO> queryUserAndonHandelList(String factoryId) {
        return baseMapper.queryUserAndonHandelList(factoryId);
    }
}
src/main/java/org/jeecg/modules/andon/service/impl/AndonOrderServiceImpl.java
@@ -1,9 +1,18 @@
package org.jeecg.modules.andon.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.andon.entity.AndonResponseConfig;
import org.jeecg.modules.andon.mapper.AndonResponseConfigMapper;
import org.jeecg.modules.andon.service.IAndonOrderService;
import org.jeecg.modules.andon.entity.AndonOrder;
import org.jeecg.modules.andon.mapper.AndonOrderMapper;
import org.jeecg.modules.feishu.service.FeishuUserService;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -11,14 +20,78 @@
/**
 * @Description: å®‰ç¯å·¥å•
 * @Author: jeecg-boot
 * @Date:   2025-07-10
 * @Date: 2025-07-10
 * @Version: V1.0
 */
@Service
public class AndonOrderServiceImpl extends ServiceImpl<AndonOrderMapper, AndonOrder> implements IAndonOrderService {
    @Autowired
    private FeishuUserService feishuService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
    private AndonResponseConfigMapper andonResponseConfigMapper;
    @Override
    public List<AndonOrder> getAndonOrdersExceptYWC() {
        return baseMapper.getAndonOrdersExceptYWC();
    }
    @Override
    public String getPrimaryResponder(AndonOrder andonOrder) {
        // 1. æ ¡éªŒå¿…要参数
        if (StringUtils.isBlank(andonOrder.getFactoryId()) || StringUtils.isBlank(andonOrder.getButtonId())) {
            return null;
        }
        // 2. æŸ¥è¯¢å“åº”人配置(假设存在响应人配置实体和Mapper)
        // æž„建查询条件:匹配产线ID、安灯类型ID,且配置为启用状态
        QueryWrapper<AndonResponseConfig> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("factory_id", andonOrder.getFactoryId())
                .eq("button_id", andonOrder.getButtonId())
                .eq("status", 1) // 1表示启用状态
                .last("limit 1"); // åªå–一条有效配置
        // 3. æ‰§è¡ŒæŸ¥è¯¢
        AndonResponseConfig config = andonResponseConfigMapper.selectOne(queryWrapper);
        if (config == null) {
            return null;
        }
        return config.getFirsterResponder();
    }
    @Override
    public Result<String> handleAndonOrder(AndonOrder andonOrder) {
        // è®¾ç½®å·¥å•状态为处理中
        andonOrder.setOrderStatus("3");
        // èŽ·å–å“åº”è€…ç”¨æˆ·å
        String responderUsername = andonOrder.getResponder();
        // éªŒè¯å“åº”者用户名不为空
        if (StringUtils.isBlank(responderUsername)) {
            return Result.error("响应者信息不能为空");
        }
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
        SysUser sysUser = sysUserService.getOne(
                new QueryWrapper<SysUser>().eq("username", responderUsername)
        );
        // éªŒè¯ç”¨æˆ·æ˜¯å¦å­˜åœ¨
        if (sysUser == null) {
            return Result.error("找不到用户名为 " + responderUsername + " çš„用户");
        }
        // è®¾ç½®å“åº”者ID
        andonOrder.setResponder(sysUser.getId());
        andonOrder.setProcessor(sysUser.getId());
        // æ›´æ–°å·¥å•信息
        this.updateById(andonOrder);
        return Result.OK("处理成功");
    }
}
src/main/java/org/jeecg/modules/andon/service/impl/AndonResponseConfigServiceImpl.java
@@ -1,22 +1,215 @@
package org.jeecg.modules.andon.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.andon.entity.AndonButtonConfig;
import org.jeecg.modules.andon.entity.AndonOrder;
import org.jeecg.modules.andon.entity.AndonResponseConfig;
import org.jeecg.modules.andon.mapper.AndonResponseConfigMapper;
import org.jeecg.modules.andon.service.IAndonButtonConfigService;
import org.jeecg.modules.andon.service.IAndonOrderService;
import org.jeecg.modules.andon.service.IAndonResponseConfigService;
import org.jeecg.modules.base.entity.Factory;
import org.jeecg.modules.base.service.IFactoryService;
import org.jeecg.modules.feishu.service.FeishuUserService;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
 * @Description: å®‰ç¯å“åº”配置
 * @Author: jeecg-boot
 * @Date:   2025-07-10
 * @Date: 2025-07-10
 * @Version: V1.0
 */
@Service
public class AndonResponseConfigServiceImpl extends ServiceImpl<AndonResponseConfigMapper, AndonResponseConfig> implements IAndonResponseConfigService {
    @Autowired
    private IFactoryService factoryService;
    @Autowired
    private ISysUserService iSysUserService;
    @Autowired
    private FeishuUserService feishuUserService;
    @Autowired
    private IAndonButtonConfigService andonButtonConfigService;
    @Autowired
    private IAndonOrderService andonOrderService;
    @Override
    public AndonResponseConfig getAndonResponseConfigByFactoryIdAndButtonId(String factoryId, String buttonId) {
        return baseMapper.getAndonResponseConfigByFactoryIdAndButtonId(factoryId,buttonId);
        return baseMapper.getAndonResponseConfigByFactoryIdAndButtonId(factoryId, buttonId);
    }
    @Override
    public void sendAndonNotification(AndonButtonDTO andonButtonDTO) {
        /**
         * 1. éªŒè¯å·¥å•状态
         */
        if (andonButtonDTO == null) {
            log.warn("请求参数为空");
            throw new IllegalArgumentException("请求参数不能为空");
        }
        /**
         * è®¾ç½®å®‰ç¯äºº
         */
        /**
         * 2. èŽ·å–å“åº”é…ç½®
         */
        AndonResponseConfig andonResponseConfig = this.getById(andonButtonDTO.getId());
        AndonOrder andonOrder = andonOrderService.getById(andonButtonDTO.getOrderIds());
        if (andonOrder == null) {
            log.warn("未找到ID为[{}]的安灯订单");
            throw new IllegalArgumentException("未找到对应的安灯订单");
        }
        // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (loginUser != null) {
            log.warn("未找到当前用户");
        }
        assert loginUser != null;
        andonOrder.setResponder(loginUser.getId());
        String orderStatus = andonOrder.getOrderStatus();
        andonButtonDTO.setOrderStatus(orderStatus);
        if (andonResponseConfig == null) {
            log.warn("未找到ID为[{}]的响应配置");
            throw new IllegalArgumentException("未找到对应的响应配置");
        }
        /**
         * 3. è®¾ç½®äºŒçº§å“åº”人
         */
        String secondResponder = andonResponseConfig.getSecondResponder();
        if (StringUtils.isNotBlank(secondResponder)) {
            andonButtonDTO.setSecondResponder(secondResponder);
        }
        /**
         * 4. èŽ·å–å·¥åŽ‚ä¿¡æ¯
         */
        String factoryId = andonResponseConfig.getFactoryId();
        if (factoryId == null || factoryId.isEmpty()) {
            log.warn("响应配置[{}]未设置工厂ID");
            throw new IllegalArgumentException("响应配置未设置工厂信息");
        }
        Factory factory = factoryService.getOne(new QueryWrapper<Factory>()
                .eq("id", factoryId)
                .eq("del_flag", 0));
        if (factory == null) {
            log.warn("未找到ID为[{}]的工厂");
            throw new IllegalArgumentException("未找到对应的工厂信息");
        }
        /**
         * èŽ·å–äº§çº¿åç§°
         */
        String factoryName = factory.getFactoryName();
        andonButtonDTO.setFactoryName(factoryName);
        /**
         * 6. è®¾ç½®å·¥åŽ‚åç§°
         */
        String parentId = factory.getParentId();
        if (parentId != null && !parentId.isEmpty()) {
            Factory parentFactory = factoryService.getOne(new QueryWrapper<Factory>()
                    .eq("id", parentId)
                    .eq("del_flag", 0));
            if (parentFactory != null) {
                andonButtonDTO.setParentFactoryName(parentFactory.getFactoryName());
            }
        }
        /**
         * 6. èŽ·å–å®‰ç¯æŒ‰é’®é…ç½®
         */
        AndonButtonConfig andonButtonById = andonButtonConfigService.getAndonButtonById(andonButtonDTO.getButtonId());
        if (andonButtonById == null) {
            log.warn("未找到ID为[{}]的安灯按钮");
            throw new IllegalArgumentException("未找到对应的安灯按钮信息");
        }
        /**
         * 7. è®¾ç½®å“åº”æ—¶é—´
         */
        Integer upgradeResponseDuration = andonButtonById.getUpgradeResponseDuration();
        andonButtonDTO.setUpgradeResponseDuration(upgradeResponseDuration);
        Integer secondUpgradeResponseDuration = andonButtonById.getSecondUpgradeResponseDuration();
        andonButtonDTO.setSecondUpgradeResponseDuration(secondUpgradeResponseDuration);
        /**
         * 8. èŽ·å–å“åº”äººä¿¡æ¯
         */
        String firstResponder = andonResponseConfig.getFirsterResponder();
        String threeResponder = andonResponseConfig.getThirdResponder();
        SysUser thirdUser = iSysUserService.getUserByName(threeResponder);
        SysUser userByName = iSysUserService.getUserByName(firstResponder);
        SysUser secondUser = null;
        if (StringUtils.isNotBlank(secondResponder)) {
            secondUser = iSysUserService.getUserByName(secondResponder);
        }
        /**
         * 9. éªŒè¯å¹¶è®¾ç½®å“åº”人信息
         */
        if (userByName == null) {
            log.warn("用户[{}]未找到,无法发送通知");
            throw new IllegalArgumentException("用户[{}]未找到,无法发送通知");
        }
        if (secondUser == null && StringUtils.isNotBlank(secondResponder)) {
            log.warn("用户[{}]未找到,无法发送通知");
            throw new IllegalArgumentException("用户[{}]未找到,无法发送通知");
        }
        if (threeResponder == null) {
            StringUtils.isNotBlank(null);
        }
        //
        /**
         * 10. è®¾ç½®å“åº”人相关信息
         */
        andonButtonDTO.setResponderOpenId(userByName.getOpenId());
        andonButtonDTO.setResponder(userByName.getRealname());
        log.warn("用户[{}]已找到,开始发送通知");
        if (secondUser != null) {
            andonButtonDTO.setSecondResponderOpenId(secondUser.getOpenId());
            andonButtonDTO.setSecondResponder(secondUser.getRealname());
            log.warn("用户[{}]已找到,开始发送通知");
        }
        if (thirdUser != null) {
            andonButtonDTO.setThirdResponderOpenId(thirdUser.getOpenId());
            andonButtonDTO.setThirdResponder(thirdUser.getRealname());
            log.warn("用户[{}]已找到,开始发送通知");
        }
        /**
         *  11. å‘送飞书通知
         */
        if (StringUtils.isNotBlank(firstResponder)) {
            String feishuAccessToken = feishuUserService.getFeishuAccessToken();
            feishuUserService.sendAndonNotification(feishuAccessToken, andonButtonDTO);
        } else {
            log.warn("工单[{}]未找到对应响应人,无法发送通知");
        }
    }
}
src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingToolMapper.xml
@@ -15,6 +15,7 @@
        t1.cutting_model cuttingModel,
        t1.drawing_number drawingNumber,
        t1.inventory_warning inventoryWarning,
        t1.remark remark,
        t2.item_text cuttingCategory
        FROM
        cms_cutting_tool t1
src/main/java/org/jeecg/modules/feishu/job/FeishuSyncTask.java
ÎļþÃû´Ó src/main/java/org/jeecg/modules/mes/job/FeishuSyncTask.java ÐÞ¸Ä
@@ -1,7 +1,8 @@
package org.jeecg.modules.mes.job;
package org.jeecg.modules.feishu.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.feishu.service.FeishuUserService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
@@ -17,7 +18,7 @@
public class FeishuSyncTask implements Job {
    @Autowired
    private org.jeecg.modules.mes.job.FeishuUserService feishuUserService;
    private FeishuUserService feishuUserService;
    @Value("${feishu.sync.departmentId:0}")
    private String departmentId;
src/main/java/org/jeecg/modules/feishu/service/FeishuUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,635 @@
package org.jeecg.modules.feishu.service;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.PasswordUtil;
import org.jeecg.common.util.RestUtil;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.andon.dto.AndonButtonDTO;
import org.jeecg.modules.mes.entity.FeishuUser;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class FeishuUserService {
    // ç±»ä¸­å®šä¹‰æ¨¡æ¿å¸¸é‡ï¼ˆä¾¿äºŽç»´æŠ¤ï¼‰
    private static final String FIRST_LEVEL_TEMPLATE = "【工艺安灯】\n%s Â· %s å‘起了工艺安灯,请%d分钟内在PDA上进行响应处理!!!";
    private static final String SECOND_LEVEL_TEMPLATE = "【工艺安灯】\n%s Â· %s å‘起的工艺安灯,%s未在%d分钟内响应,请尽快督促进行响应处理!!!";
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private RestTemplate restTemplate;
    @Value("${feishu.appId:}")
    private String appId;
    @Value("${feishu.appSecret:}")
    private String appSecret;
    @Value("${feishu.url:}")
    private String feishuUrl;
    // å®šæ—¶ä»»åŠ¡çº¿ç¨‹æ± ï¼ˆæ”¯æŒå¤šçº§å“åº”è°ƒåº¦ï¼‰
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
    private final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    /**
     * åŒæ­¥é£žä¹¦éƒ¨é—¨ç”¨æˆ·åˆ°ç³»ç»Ÿç”¨æˆ·è¡¨
     */
    public void syncFeishuDepartmentUsers(String departmentId) {
        try {
            log.info("开始同步飞书部门用户,部门ID: {}", departmentId);
            // 1. èŽ·å–é£žä¹¦è®¿é—®ä»¤ç‰Œ
            String accessToken = getFeishuAccessToken();
            if (oConvertUtils.isEmpty(accessToken)) {
                log.error("获取飞书访问令牌失败,终止同步流程");
                return;
            }
            // 2. èŽ·å–éƒ¨é—¨ä¸‹çš„ç”¨æˆ·åˆ—è¡¨
            List<FeishuUser> feishuUsers = getDepartmentUsers(accessToken, departmentId);
            log.info("获取到飞书部门用户数量: {}", feishuUsers.size());
            // 3. åŒæ­¥åˆ°ç³»ç»Ÿç”¨æˆ·è¡¨
            int successCount = 0;
            int updateCount = 0;
            int addCount = 0;
            for (FeishuUser feishuUser : feishuUsers) {
                try {
                    boolean isUpdated = syncFeishuUserToSystem(feishuUser);
                    successCount++;
                    if (isUpdated) {
                        updateCount++;
                    } else {
                        addCount++;
                    }
                } catch (Exception e) {
                    log.error("同步飞书用户失败,用户ID: {}", feishuUser.getUserId(), e);
                }
            }
            log.info("飞书用户同步完成,总处理: {},新增: {},更新: {}", successCount, addCount, updateCount);
        } catch (Exception e) {
            log.error("同步飞书部门用户失败,部门ID: {}", departmentId, e);
            throw new RuntimeException("同步飞书用户失败: " + e.getMessage());
        }
    }
    public String getFeishuAccessToken() {
        try {
            String url = feishuUrl + "open-apis/auth/v3/tenant_access_token/internal";
            log.info("开始获取飞书访问令牌,AppId: {}",
                    appId != null ? appId.substring(0, Math.min(appId.length(), 10)) + "..." : "null");
            JSONObject params = new JSONObject();
            params.put("app_id", appId);
            params.put("app_secret", appSecret);
            log.debug("获取令牌请求参数: {}", params.toJSONString());
            JSONObject result = RestUtil.post(url, params);
            log.info("获取飞书访问令牌响应: {}", result != null ? result.toJSONString() : "null");
            if (result != null && result.getInteger("code") == 0) {
                String accessToken = result.getString("tenant_access_token");
                log.info("成功获取飞书访问令牌,令牌长度: {}", accessToken != null ? accessToken.length() : 0);
                return accessToken;
            } else {
                log.error("获取飞书访问令牌失败,响应: {}", result != null ? result.toJSONString() : "null");
                if (result != null) {
                    log.error("错误码: {}, é”™è¯¯ä¿¡æ¯: {}", result.getInteger("code"), result.getString("msg"));
                }
                return null;
            }
        } catch (Exception e) {
            log.error("获取飞书访问令牌异常", e);
            return null;
        }
    }
    /**
     * å‘送安灯通知消息(支持一、二、三级响应)
     * æµç¨‹ï¼š
     * 1. APP点击发送一级响应(初级响应)
     * 2. ä¸€çº§å“åº”时长后检查状态,未处理则发送二级
     * 3. äºŒçº§å“åº”时长后检查状态,未处理则发送三级
     */
    public boolean sendAndonNotification(String accessToken, AndonButtonDTO andonOrde) {
        try {
            String currentTime = sdf.format(new Date());
            log.info("【{}】触发一级响应(初级响应),安灯ID: {}", currentTime, andonOrde.getId());
            // 1. å‚数验证
            if (!validateNotificationParams(andonOrde)) {
                return false;
            }
            if (accessToken == null || accessToken.isEmpty()) {
                log.error("访问令牌为空,无法发送安灯通知");
                return false;
            }
            // 2. å‘送一级响应通知(即时发送)
            boolean firstLevelResult = sendLevelNotification(accessToken, andonOrde, 1);
            // 3. è°ƒåº¦äºŒçº§å“åº”通知(延迟时间=一级响应时长)
            if (firstLevelResult) {
                int secondDelay = andonOrde.getUpgradeResponseDuration();
                String secondTime = sdf.format(new Date(System.currentTimeMillis() + secondDelay * 60 * 1000L));
                log.info("【{}】一级响应调度二级通知,延迟{}分钟,预计发送时间: {}",
                        currentTime, secondDelay, secondTime);
                scheduleNextLevelNotification(accessToken, andonOrde, 1, secondDelay);
            } else {
                log.warn("一级通知发送失败,终止后续通知流程,安灯ID: {}", andonOrde.getId());
            }
            return firstLevelResult;
        } catch (Exception e) {
            log.error("处理安灯通知异常,安灯ID: {}", andonOrde != null ? andonOrde.getId() : "未知", e);
            return false;
        }
    }
    /**
     * å‘送指定级别的通知
     * @param level 1-一级,2-二级,3-三级
     */
    private boolean sendLevelNotification(String accessToken, AndonButtonDTO andonOrde, int level) {
        try {
            String levelDesc = getLevelDesc(level);
            String openId = getResponderOpenId(andonOrde, level);
            String currentTime = sdf.format(new Date());
            log.info("【{}】开始发送{}级安灯通知,接收人openId: {}, å®‰ç¯ID: {}",
                    currentTime, levelDesc, openId, andonOrde.getId());
            // æž„建请求URL
            String url = feishuUrl + "open-apis/im/v1/messages?receive_id_type=open_id";
            log.info("{}级通知请求URL: {}", levelDesc, url);
            // è®¾ç½®è¯·æ±‚头
            HttpHeaders headers = new HttpHeaders();
            String authHeader = "Bearer " + accessToken;
            headers.add("Authorization", authHeader);
            headers.add("Content-Type", "application/json; charset=utf-8");
            log.info("设置{}级通知请求头: Authorization = {}", levelDesc,
                    authHeader.substring(0, Math.min(30, authHeader.length())) + "...");
            // æž„建消息内容
            JSONObject content = new JSONObject();
            String notificationContent = buildNotificationContent(andonOrde, level);
            content.put("text", notificationContent);
            log.debug("【{}】{}级通知内容: {}", currentTime, levelDesc, notificationContent);
            // æž„建请求体
            JSONObject requestBody = new JSONObject();
            requestBody.put("receive_id", openId);
            requestBody.put("msg_type", "text");
            requestBody.put("content", content.toJSONString());
            requestBody.put("uuid", "andon_" + andonOrde.getId() + "_level_" + level + "_" + System.currentTimeMillis());
            // å‘送请求
            HttpEntity<String> requestEntity = new HttpEntity<>(requestBody.toJSONString(), headers);
            ResponseEntity<String> response = restTemplate.exchange(
                    url, HttpMethod.POST, requestEntity, String.class
            );
            // è§£æžå“åº”
            JSONObject result = JSONObject.parseObject(response.getBody());
            log.debug("{}级通知API响应: {}", levelDesc, result != null ? result.toJSONString() : "null");
            if (result != null && result.getInteger("code") == 0) {
                JSONObject data = result.getJSONObject("data");
                if (data != null) {
                    log.info("【{}】{}级安灯通知发送成功,消息ID: {}, å®‰ç¯ID: {}",
                            currentTime, levelDesc, data.getString("message_id"), andonOrde.getId());
                    return true;
                } else {
                    log.warn("{}级通知响应data为空,安灯ID: {}", levelDesc, andonOrde.getId());
                    return false;
                }
            } else {
                log.error("发送{}级安灯通知失败,安灯ID: {}", levelDesc, andonOrde.getId());
                if (result != null) {
                    log.error("错误码: {}, é”™è¯¯ä¿¡æ¯: {}", result.getInteger("code"), result.getString("msg"));
                }
                return false;
            }
        } catch (Exception e) {
            log.error("发送{}级安灯通知异常,安灯ID: {}", getLevelDesc(level), andonOrde.getId(), e);
            return false;
        }
    }
    /**
     * è°ƒåº¦ä¸‹ä¸€çº§é€šçŸ¥ï¼ˆ1→2→3)
     * @param currentLevel å½“前级别
     * @param delayMinutes å»¶è¿Ÿåˆ†é’Ÿæ•°ï¼ˆç”±å½“前级别响应时长决定)
     */
    private void scheduleNextLevelNotification(String accessToken, AndonButtonDTO andonOrde, int currentLevel, int delayMinutes) {
        int nextLevel = currentLevel + 1;
        if (nextLevel > 3) {
            log.info("已到达最高级别通知,无需继续调度,安灯ID: {}", andonOrde.getId());
            return;
        }
        String currentLevelDesc = getLevelDesc(currentLevel);
        String nextLevelDesc = getLevelDesc(nextLevel);
        String scheduleTime = sdf.format(new Date());
        String executeTime = sdf.format(new Date(System.currentTimeMillis() + delayMinutes * 60 * 1000L));
        log.info("【{}】调度{}通知,延迟{}分钟(当前级别{}时长),预计执行时间: {}",
                scheduleTime, nextLevelDesc, delayMinutes, currentLevelDesc, executeTime);
        scheduler.schedule(() -> {
            try {
                String currentExecuteTime = sdf.format(new Date());
                log.info("【{}】开始执行{}通知检查,安灯ID: {}", currentExecuteTime, nextLevelDesc, andonOrde.getId());
                // æ£€æŸ¥è®¢å•状态:3表示已响应,无需发送下一级
                if (andonOrde.getOrderStatus() != null && "3".equals(andonOrde.getOrderStatus())) {
                    log.info("【{}】订单已响应(status=3),取消{}通知发送,安灯ID: {}",
                            currentExecuteTime, nextLevelDesc, andonOrde.getId());
                    return;
                }
                // æ£€æŸ¥ä¸‹ä¸€çº§å“åº”人是否有效
                if (!hasValidResponder(andonOrde, nextLevel)) {
                    log.warn("【{}】{}响应人信息无效,取消通知发送,安灯ID: {}",
                            currentExecuteTime, nextLevelDesc, andonOrde.getId());
                    return;
                }
                // å‘送下一级通知
                boolean nextLevelResult = sendLevelNotification(accessToken, andonOrde, nextLevel);
                if (nextLevelResult && nextLevel < 3) {
                    int nextDelay = getResponseDuration(andonOrde, nextLevel);
                    String nextExecuteTime = sdf.format(new Date(System.currentTimeMillis() + nextDelay * 60 * 1000L));
                    log.info("【{}】{}通知调度三级通知,延迟{}分钟,预计发送时间: {}",
                            currentExecuteTime, nextLevelDesc, nextDelay, nextExecuteTime);
                    scheduleNextLevelNotification(accessToken, andonOrde, nextLevel, nextDelay);
                } else if (!nextLevelResult) {
                    log.warn("【{}】{}通知发送失败,终止后续调度,安灯ID: {}",
                            currentExecuteTime, nextLevelDesc, andonOrde.getId());
                }
            } catch (Exception e) {
                log.error("执行{}调度任务异常,安灯ID: {}", nextLevelDesc, andonOrde.getId(), e);
            }
        }, delayMinutes, TimeUnit.MINUTES);
    }
    /**
     * æž„建通知内容(优化分隔符,提升可读性)
     */
    private String buildNotificationContent(AndonButtonDTO andonOrde, int level) {
        // èŽ·å–å·¥åŽ‚åç§°å’Œäº§çº¿åç§°ï¼Œåšç©ºå€¼ä¿æŠ¤
        String parentFactoryName = andonOrde.getParentFactoryName() != null ? andonOrde.getParentFactoryName() : "未知工厂";
        String factoryName = andonOrde.getFactoryName() != null ? andonOrde.getFactoryName() : "未知产线";
        String content;
        if (level == 1) {
            // ä¸€çº§æ¨¡æ¿ï¼šä½¿ç”¨"·"分隔工厂和产线
            int firstDuration = andonOrde.getUpgradeResponseDuration() != null ? andonOrde.getUpgradeResponseDuration() : 0;
            content = String.format(FIRST_LEVEL_TEMPLATE, parentFactoryName, factoryName, firstDuration);
        } else {
            // äºŒçº§æ¨¡æ¿ï¼šä¿æŒä¸€è‡´çš„分隔风格
            String prevResponder = getResponderName(andonOrde, level - 1);
            int prevDuration = getResponseDuration(andonOrde, level - 1);
            prevResponder = oConvertUtils.isEmpty(prevResponder) ? "未知人员" : prevResponder;
            prevDuration = Math.max(prevDuration, 0);
            content = String.format(SECOND_LEVEL_TEMPLATE, parentFactoryName, factoryName, prevResponder, prevDuration);
        }
        log.debug("构建{}级通知内容: {}", level, content);
        return content;
    }
//    /**
//     * æž„建通知内容(按级别使用不同模板)
//     */
//    private String buildNotificationContent(AndonButtonDTO andonOrde, int level) {
//        String factoryName = andonOrde.getFactoryName() != null ? andonOrde.getFactoryName() : "未知产线";
//
//        if (level == 1) {
//            // ä¸€çº§æ¨¡æ¿ï¼šã€å·¥è‰ºå®‰ç¯ã€‘XXX产线发起了工艺安灯,请xx分钟内在PDA上进行响应处理!!!
//            return String.format("【工艺安灯】\n%s产线发起了工艺安灯,请%d分钟内在PDA上进行响应处理!!!",
//                    factoryName,
//                    andonOrde.getUpgradeResponseDuration());
//        } else {
//            // äºŒ/三级模板:【工艺安灯】XXX(产线)发起的工艺安灯,xxx(上一级响应人)未在xx分钟内响应,请尽快督促进行响应处理!!!
//            String prevLevelDesc = getLevelDesc(level - 1);
//            String prevResponder = getResponderName(andonOrde, level - 1);
//            int prevDuration = getResponseDuration(andonOrde, level - 1);
//
//            return String.format("【工艺安灯】\n%s(产线)发起的工艺安灯,%s(%s响应人)未在%d分钟内响应,请尽快督促进行响应处理!!!",
//                    factoryName,
//                    prevResponder,
//                    prevLevelDesc,
//                    prevDuration);
//        }
//    }
    /**
     * éªŒè¯é€šçŸ¥ç›¸å…³å‚æ•°
     */
    private boolean validateNotificationParams(AndonButtonDTO andonOrde) {
        if (andonOrde == null) {
            log.error("安灯订单信息为空");
            return false;
        }
        if (andonOrde.getId() == null) {
            log.error("安灯ID为空");
            return false;
        }
        // ä¸€çº§å“åº”校验(必选)
        if (andonOrde.getResponderOpenId() == null || andonOrde.getResponderOpenId().isEmpty()
                || andonOrde.getUpgradeResponseDuration() == null || andonOrde.getUpgradeResponseDuration() <= 0) {
            log.error("一级响应人信息无效(openId或时长缺失),安灯ID: {}", andonOrde.getId());
            return false;
        }
        // äºŒçº§å“åº”校验(若存在则必选完整)
        if (andonOrde.getSecondResponderOpenId() != null && !andonOrde.getSecondResponderOpenId().isEmpty()) {
            if (andonOrde.getSecondUpgradeResponseDuration() == null || andonOrde.getSecondUpgradeResponseDuration() <= 0) {
                log.error("二级响应人存在但时长无效,安灯ID: {}", andonOrde.getId());
                return false;
            }
        }
        // ä¸‰çº§å“åº”校验(若存在则必选完整)
        if (andonOrde.getThirdResponderOpenId() != null && !andonOrde.getThirdResponderOpenId().isEmpty()) {
            if (andonOrde.getSecondUpgradeResponseDuration() == null || andonOrde.getSecondUpgradeResponseDuration() <= 0) {
                log.error("三级响应人存在但二级时长无效(三级依赖二级时长),安灯ID: {}", andonOrde.getId());
                return false;
            }
        }
        return true;
    }
    // å·¥å…·æ–¹æ³•:获取级别描述
    private String getLevelDesc(int level) {
        switch (level) {
            case 1: return "一级";
            case 2: return "二级";
            case 3: return "三级";
            default: return "未知级别";
        }
    }
    // å·¥å…·æ–¹æ³•:获取响应人openId
    private String getResponderOpenId(AndonButtonDTO andonOrde, int level) {
        switch (level) {
            case 1: return andonOrde.getResponderOpenId();
            case 2: return andonOrde.getSecondResponderOpenId();
            case 3: return andonOrde.getThirdResponderOpenId();
            default: return null;
        }
    }
    // å·¥å…·æ–¹æ³•:获取响应人名称
    private String getResponderName(AndonButtonDTO andonOrde, int level) {
        String name = null;
        switch (level) {
            case 1:
                name = andonOrde.getResponder();
                break;
            case 2:
                name = andonOrde.getSecondResponder();
                break;
            case 3:
                name = andonOrde.getThirdResponder();
                break;
            default:
                name = null;
        }
        return name != null ? name : "未知响应人";
    }
    // å·¥å…·æ–¹æ³•:获取响应时长(一级=二级延迟,二级=三级延迟)
    private int getResponseDuration(AndonButtonDTO andonOrde, int level) {
        int duration = 0;
        switch (level) {
            case 1:
                duration = andonOrde.getUpgradeResponseDuration() != null ? andonOrde.getUpgradeResponseDuration() : 0;
                break;
            case 2:
                duration = andonOrde.getSecondUpgradeResponseDuration() != null ? andonOrde.getSecondUpgradeResponseDuration() : 0;
                break;
            case 3:
                duration = 0; // ä¸‰çº§æ˜¯æœ€åŽä¸€çº§ï¼Œæ— éœ€å»¶è¿Ÿ
                break;
            default:
                duration = 0;
        }
        return duration;
    }
    // å·¥å…·æ–¹æ³•:判断指定级别响应人是否有效
    private boolean hasValidResponder(AndonButtonDTO andonOrde, int level) {
        String openId = getResponderOpenId(andonOrde, level);
        return openId != null && !openId.isEmpty();
    }
    /**
     * èŽ·å–éƒ¨é—¨ç”¨æˆ·åˆ—è¡¨ï¼ˆç›´å±žå‘˜å·¥ï¼‰
     */
    private List<FeishuUser> getDepartmentUsers(String accessToken, String departmentId) {
        List<FeishuUser> userList = new ArrayList<>();
        try {
            log.info("开始获取飞书部门用户列表,部门ID: {}", departmentId);
            if (accessToken == null || accessToken.isEmpty()) {
                log.error("访问令牌为空,无法继续执行");
                return userList;
            }
            log.info("使用的访问令牌前缀: Bearer {}", accessToken.substring(0, Math.min(20, accessToken.length())) + "...");
            String url = feishuUrl + "open-apis/contact/v3/users/find_by_department";
            String pageToken = null;
            int pageNumber = 1;
            do {
                StringBuilder urlBuilder = new StringBuilder(url);
                urlBuilder.append("?department_id=").append(departmentId);
                urlBuilder.append("&department_id_type=open_department_id");
                urlBuilder.append("&page_size=50");
                urlBuilder.append("&user_id_type=open_id");
                if (pageToken != null && !pageToken.isEmpty()) {
                    urlBuilder.append("&page_token=").append(pageToken);
                }
                log.info("请求第{}页数据,URL: {}", pageNumber, urlBuilder.toString());
                HttpHeaders headers = new HttpHeaders();
                String authHeader = "Bearer " + accessToken;
                headers.add("Authorization", authHeader);
                headers.add("Content-Type", "application/json; charset=utf-8");
                log.info("设置请求头: Authorization = {}", authHeader.substring(0, Math.min(30, authHeader.length())) + "...");
                HttpEntity<String> requestEntity = new HttpEntity<>(headers);
                ResponseEntity<String> response = restTemplate.exchange(
                        urlBuilder.toString(), HttpMethod.GET, requestEntity, String.class
                );
                JSONObject result = JSONObject.parseObject(response.getBody());
                log.debug("第{}页API响应: {}", pageNumber, result != null ? result.toJSONString() : "null");
                if (result != null && result.getInteger("code") == 0) {
                    JSONObject data = result.getJSONObject("data");
                    if (data != null) {
                        Object items = data.get("items");
                        log.info("第{}页原始用户数据数量: {}", pageNumber, items instanceof List ? ((List<?>) items).size() : 0);
                        if (items != null) {
                            List<FeishuUser> pageUsers = parseUsers(items);
                            userList.addAll(pageUsers);
                            log.info("第{}页解析后用户数量: {}", pageNumber, pageUsers.size());
                        }
                        pageToken = data.getString("page_token");
                        boolean hasMore = data.getBooleanValue("has_more");
                        log.info("第{}页has_more: {}, page_token: {}", pageNumber, hasMore, pageToken);
                        pageNumber++;
                    } else {
                        log.warn("第{}页data为空", pageNumber);
                        break;
                    }
                } else {
                    log.error("获取飞书部门用户列表失败,响应: {}", result != null ? result.toJSONString() : "null");
                    if (result != null) {
                        log.error("错误码: {}, é”™è¯¯ä¿¡æ¯: {}", result.getInteger("code"), result.getString("msg"));
                    }
                    break;
                }
            } while (pageToken != null && !pageToken.isEmpty());
            log.info("获取飞书部门用户完成,总用户数量: {}", userList.size());
        } catch (Exception e) {
            log.error("获取飞书部门用户列表异常", e);
        }
        return userList;
    }
    /**
     * è§£æžç”¨æˆ·æ•°æ®
     */
    @SuppressWarnings("unchecked")
    private List<FeishuUser> parseUsers(Object items) {
        Logger log = LoggerFactory.getLogger(FeishuUserService.class);
        List<FeishuUser> userList = new ArrayList<>();
        if (!(items instanceof List)) {
            log.warn("解析用户数据失败,items不是列表类型: {}", items);
            return userList;
        }
        List<?> userItems = (List<?>) items;
        log.info("开始解析飞书用户列表,共{}条记录", userItems.size());
        for (Object item : userItems) {
            if (item == null || !(item instanceof Map)) {
                log.warn("跳过无效用户数据项,类型不匹配: {}", item != null ? item.getClass() : "null");
                continue;
            }
            Map<String, Object> userMap = (Map<String, Object>) item;
            FeishuUser user = new FeishuUser();
            user.setOpenId((String) userMap.getOrDefault("open_id", ""));
            String name = (String) userMap.getOrDefault("name", "");
            if (name.contains(" ")) {
                String[] parts = name.split(" ");
                if (parts.length == 2) {
                    user.setUsername(parts[0].trim());
                    user.setRealname(parts[1].trim());
                    user.setWorkNo(parts[0].trim());
                } else {
                    user.setUsername(name);
                    user.setRealname(name);
                    user.setWorkNo("");
                    log.warn("飞书用户name字段格式异常,无法拆分,原始值:{}", name);
                }
            } else {
                user.setUsername(name);
                user.setRealname(name);
                user.setWorkNo("");
                log.warn("飞书用户name字段无空格分隔,无法拆分,原始值:{}", name);
            }
            user.setEnName((String) userMap.getOrDefault("en_name", ""));
            user.setDescription((String) userMap.getOrDefault("description", ""));
            Object mobileVisibleObj = userMap.get("mobile_visible");
            user.setMobileVisible(mobileVisibleObj instanceof Boolean ? (Boolean) mobileVisibleObj : false);
            Object avatarObj = userMap.get("avatar");
            if (avatarObj instanceof Map) {
                Map<String, Object> avatarMap = (Map<String, Object>) avatarObj;
                user.setAvatar240((String) avatarMap.getOrDefault("avatar_240", ""));
                user.setAvatar640((String) avatarMap.getOrDefault("avatar_640", ""));
                user.setAvatar72((String) avatarMap.getOrDefault("avatar_72", ""));
                user.setAvatarOrigin((String) avatarMap.getOrDefault("avatar_origin", ""));
            } else {
                log.info("用户[{}]未设置头像或头像格式异常", user.getRealname());
            }
            user.setPassword("123456");
            user.setOpenId((String) userMap.getOrDefault("open_id", ""));
            userList.add(user);
        }
        return userList;
    }
    /**
     * åŒæ­¥å•个飞书用户到系统
     */
    private boolean syncFeishuUserToSystem(FeishuUser feishuUser) {
        String username = feishuUser.getUsername();
        SysUser existUser = sysUserService.getUserByName(username);
        SysUser sysUser = new SysUser();
        sysUser.setUsername(username);
        sysUser.setStatus(1);
        sysUser.setDelFlag(0);
        sysUser.setAvatar(feishuUser.getAvatar640());
        sysUser.setRealname(feishuUser.getRealname());
        sysUser.setWorkNo(feishuUser.getWorkNo());
        String password = "123456", salt = oConvertUtils.randomGen(8);
        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
        sysUser.setSalt(salt);
        sysUser.setPassword(passwordEncode);
        sysUser.setOpenId(feishuUser.getOpenId());
        if (existUser == null) {
            sysUserService.addUserWithRole(sysUser, "5");
            log.info("新增用户: {}", username);
            return false;
        } else {
            sysUser.setId(existUser.getId());
            sysUserService.editUser(sysUser);
            log.info("更新用户: {}", username);
            return true;
        }
    }
}
src/main/java/org/jeecg/modules/mes/controller/MesMaterialTransferDetailController.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/mes/controller/MesMaterialTransferRequestController.java
@@ -28,7 +28,7 @@
*/
@Api(tags="物料拉动申请")
@RestController
@RequestMapping("/mesmaterialtransferrequest/mesMaterialTransferRequest")
@RequestMapping("/mes/mesMaterialTransferRequest")
@Slf4j
public class MesMaterialTransferRequestController extends JeecgController<MesMaterialTransferRequest, IMesMaterialTransferRequestService> {
   @Autowired
src/main/java/org/jeecg/modules/mes/entity/MesMaterialTransferDetail.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/mes/entity/MesMaterialTransferRequest.java
@@ -49,57 +49,61 @@
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    @ApiModelProperty(value = "删除标记")
    @TableLogic
    private Integer delFlag;
    /**拉动单号*/
    @Excel(name = "拉动单号", width = 15)
    @ApiModelProperty(value = "拉动单号")
    private String requestCode;
    /**工单ID*/
    @Excel(name = "工单ID", width = 15)
    @ApiModelProperty(value = "工单ID")
    private String workOrderId;
    /**SAP预留号*/
    @Excel(name = "SAP预留号", width = 15)
    @ApiModelProperty(value = "SAP预留号")
    private String reservationCode;
    /**发布状态*/
    @Excel(name = "发布状态", width = 15, dicCode = "publish_status")
    @Dict(dicCode = "publish_status")
    @ApiModelProperty(value = "发布状态")
    private String publishStatus;
    /**请求状态*/
    @Excel(name = "请求状态", width = 15, dicCode = "request_status")
    @Dict(dicCode = "request_status")
    @ApiModelProperty(value = "请求状态")
    private String requestStatus;
    /**请求时间*/
    @Excel(name = "请求时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "请求时间")
    private Date requestTime;
    /**原库存地*/
    @Excel(name = "原库存地", width = 15)
    @ApiModelProperty(value = "原库存地")
    private String originalWarehouseId;
    /**目标库存地*/
    @Excel(name = "目标库存地", width = 15)
    @ApiModelProperty(value = "目标库存地")
    private String targetWarehouseId;
    /**优先级(拉动类型)*/
    @Excel(name = "优先级(拉动类型)", width = 15, dicCode = "priority")
    @Dict(dicCode = "priority")
    @ApiModelProperty(value = "优先级(拉动类型)")
    private String priority;
    @Dict(dicCode = "material_transfer_category")
    @ApiModelProperty(value = "拉动类型")
    private String materialTransferCategory;
    /**最晚配送时间*/
    @Excel(name = "最晚配送时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "最晚配送时间")
    private Date latestDeliveryTime;
    /**物料编码*/
    @ApiModelProperty(value = "物料编码")
    private String materialNumber;
    /**物料名称*/
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**理论拉动数量*/
    @ApiModelProperty(value = "理论拉动数量")
    private Double specifiedQuantity;
    /**实际拉动数量*/
    @ApiModelProperty(value = "实际拉动数量")
    private Double actualQuantity;
    /**车间剩余数量*/
    @ApiModelProperty(value = "车间剩余数量")
    private Double remainingQuantity;
    @TableField(exist = false)
    @ApiModelProperty(value = "工单号")
src/main/java/org/jeecg/modules/mes/entity/MessageResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package org.jeecg.modules.mes.entity;
import lombok.Data;
@Data
public class MessageResponse {
    private boolean success;
    private String message;
    private String messageId;
    private Long timestamp;
}
src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/mes/mapper/MesMaterialTransferDetailMapper.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/mes/mapper/xml/MesMaterialTransferDetailMapper.xml
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/mes/service/IMesMaterialTransferDetailService.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/mes/service/impl/MesMaterialTransferDetailServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/wms/CxfClientUtil.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/wms/MESObjectFactory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package org.jeecg.modules.wms;
import org.jeecg.modules.wms.dto.ReceiveWMSScanItemListResponse;
import org.jeecg.modules.wms.dto.WSResponse;
import org.jeecg.modules.wms.request.ReceiveWMSScanItemList;
import org.jeecg.modules.wms.request.WMSWebServiceSendItem;
import javax.xml.bind.annotation.XmlRegistry;
@XmlRegistry
public class MESObjectFactory {
    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.tempuri
     *
     */
    public MESObjectFactory() {
    }
    /**
     * Create an instance of {@link ReceiveWMSScanItemList }
     *
     */
    public ReceiveWMSScanItemList createReceiveWMSScanItemList() {
        return new ReceiveWMSScanItemList();
    }
    /**
     * Create an instance of {@link WMSWebServiceSendItem }
     *
     */
    public WMSWebServiceSendItem createWMSWebServiceSendItem() {
        return new WMSWebServiceSendItem();
    }
    /**
     * Create an instance of {@link ReceiveWMSScanItemListResponse }
     *
     */
    public ReceiveWMSScanItemListResponse createReceiveWMSScanItemListResponse() {
        return new ReceiveWMSScanItemListResponse();
    }
    /**
     * Create an instance of {@link WSResponse }
     *
     */
    public WSResponse createWSResponse() {
        return new WSResponse();
    }
}
src/main/java/org/jeecg/modules/wms/WMSObjectFactory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
package org.jeecg.modules.wms;
import org.jeecg.modules.wms.dto.*;
import org.jeecg.modules.wms.request.*;
import org.jeecg.modules.wms.request.WebServiceSendItem;
import javax.xml.bind.annotation.XmlRegistry;
/**
 * This object contains factory methods for each
 * Java content interface and Java element interface
 * generated in the org.tempuri package.
 * <p>An ObjectFactory allows you to programatically
 * construct new instances of the Java representation
 * for XML content. The Java representation of XML
 * content can consist of schema derived interfaces
 * and classes representing the binding of schema
 * type definitions, element declarations and model
 * groups.  Factory methods for each of these are
 * provided in this class.
 *
 */
@XmlRegistry
public class WMSObjectFactory {
    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.tempuri
     *
     */
    public WMSObjectFactory() {
    }
    /**
     * Create an instance of {@link ReceiveMESScanItemList }
     *
     */
    public ReceiveMESScanItemList createReceiveMESScanItemList() {
        return new ReceiveMESScanItemList();
    }
    /**
     * Create an instance of {@link ArrayOfWebServiceSendItem }
     *
     */
    public ArrayOfWebServiceSendItem createArrayOfWebServiceSendItem() {
        return new ArrayOfWebServiceSendItem();
    }
    /**
     * Create an instance of {@link ReceiveMESScanItemListResponse }
     *
     */
    public ReceiveMESScanItemListResponse createReceiveMESScanItemListResponse() {
        return new ReceiveMESScanItemListResponse();
    }
    /**
     * Create an instance of {@link WSResponse }
     *
     */
    public WSResponse createWSResponse() {
        return new WSResponse();
    }
    /**
     * Create an instance of {@link DeliOrderDelete }
     *
     */
    public DeliOrderDelete createDeliOrderDelete() {
        return new DeliOrderDelete();
    }
    /**
     * Create an instance of {@link DeliOrderDeleteResponse }
     *
     */
    public DeliOrderDeleteResponse createDeliOrderDeleteResponse() {
        return new DeliOrderDeleteResponse();
    }
    /**
     * Create an instance of {@link ReceiveReservation }
     *
     */
    public ReceiveReservation createReceiveReservation() {
        return new ReceiveReservation();
    }
    /**
     * Create an instance of {@link WebReservationOrder }
     *
     */
    public WebReservationOrder createWebReservationOrder() {
        return new WebReservationOrder();
    }
    /**
     * Create an instance of {@link ReceiveReservationResponse }
     *
     */
    public ReceiveReservationResponse createReceiveReservationResponse() {
        return new ReceiveReservationResponse();
    }
    /**
     * Create an instance of {@link HelloWorld }
     *
     */
    public HelloWorld createHelloWorld() {
        return new HelloWorld();
    }
    /**
     * Create an instance of {@link HelloWorldResponse }
     *
     */
    public HelloWorldResponse createHelloWorldResponse() {
        return new HelloWorldResponse();
    }
    /**
     * Create an instance of {@link WebServiceSendItem }
     *
     */
    public WebServiceSendItem createWebServiceSendItem() {
        return new WebServiceSendItem();
    }
}
src/main/java/org/jeecg/modules/wms/WMSWebService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package org.jeecg.modules.wms;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.Service;
import org.jeecg.modules.wms.service.WebServiceSoap;
import org.springframework.stereotype.Component;
/**
 * This class was generated by Apache CXF 3.5.5
 * 2025-08-15T16:30:13.500+08:00
 * Generated source version: 3.5.5
 *
 */
@Component
@WebServiceClient(name = "WebService",
                  wsdlLocation = "classpath:/wsdl/WebService.asmx.wsdl",
                  targetNamespace = "http://tempuri.org/")
public class WMSWebService extends Service {
    public final static URL WSDL_LOCATION;
    public final static QName SERVICE = new QName("http://tempuri.org/", "WebService");
    public final static QName WebServiceSoap = new QName("http://tempuri.org/", "WebServiceSoap");
    public final static QName WebServiceSoap12 = new QName("http://tempuri.org/", "WebServiceSoap12");
    static {
        URL url = null;
        try {
            url = new URL("classpath:/wsdl/WebService.asmx.wsdl");
        } catch (MalformedURLException e) {
            java.util.logging.Logger.getLogger(WMSWebService.class.getName())
                .log(java.util.logging.Level.INFO,
                     "Can not initialize the default wsdl from {0}", "classpath:/wsdl/WebService.asmx.wsdl");
        }
        WSDL_LOCATION = url;
    }
    public WMSWebService(URL wsdlLocation) {
        super(wsdlLocation, SERVICE);
    }
    public WMSWebService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }
    public WMSWebService() {
        super(WSDL_LOCATION, SERVICE);
    }
    public WMSWebService(WebServiceFeature ... features) {
        super(WSDL_LOCATION, SERVICE, features);
    }
    public WMSWebService(URL wsdlLocation, WebServiceFeature ... features) {
        super(wsdlLocation, SERVICE, features);
    }
    public WMSWebService(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {
        super(wsdlLocation, serviceName, features);
    }
    /**
     *
     * @return
     *     returns WebServiceSoap
     */
    @WebEndpoint(name = "WebServiceSoap")
    public WebServiceSoap getWebServiceSoap() {
        return super.getPort(WebServiceSoap, WebServiceSoap.class);
    }
    /**
     *
     * @param features
     *     A list of {@link WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns WebServiceSoap
     */
    @WebEndpoint(name = "WebServiceSoap")
    public WebServiceSoap getWebServiceSoap(WebServiceFeature... features) {
        return super.getPort(WebServiceSoap, WebServiceSoap.class, features);
    }
    /**
     *
     * @return
     *     returns WebServiceSoap
     */
    @WebEndpoint(name = "WebServiceSoap12")
    public WebServiceSoap getWebServiceSoap12() {
        return super.getPort(WebServiceSoap12, WebServiceSoap.class);
    }
    /**
     *
     * @param features
     *     A list of {@link WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns WebServiceSoap
     */
    @WebEndpoint(name = "WebServiceSoap12")
    public WebServiceSoap getWebServiceSoap12(WebServiceFeature... features) {
        return super.getPort(WebServiceSoap12, WebServiceSoap.class, features);
    }
}
src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java
@@ -4,8 +4,8 @@
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.jeecg.modules.wms.service.ReceiveWMSScanItemListService;
import org.jeecg.modules.wms.service.impl.ReceiveWMSScanItemListServiceImpl;
import org.jeecg.modules.wms.service.MESWebServiceSoap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -15,6 +15,8 @@
@Configuration
public class WebServiceServerConfig {
    @Autowired
    private MESWebServiceSoap webServiceSoap;
    @Bean(name = Bus.DEFAULT_BUS_ID)
    public Bus springBus() {
@@ -27,16 +29,11 @@
    }
    @Bean
    public ReceiveWMSScanItemListService receiveWMSScanItemListService() {
        return new ReceiveWMSScanItemListServiceImpl();
    }
    @Bean
    public Endpoint endpoint() {
        // å‚数二,是SEI实现类对象
        Endpoint endpoint = new EndpointImpl(this.springBus(), this.receiveWMSScanItemListService());
        Endpoint endpoint = new EndpointImpl(this.springBus(), webServiceSoap);
        // å‘布服务
        endpoint.publish("/ReceiveWMSScanItemList");
        endpoint.publish("/MESWebService");
        return endpoint;
    }
}
src/main/java/org/jeecg/modules/wms/controller/WMSTestController.java
@@ -3,12 +3,18 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.wms.dto.ReceiveMESScanItemListResponse;
import org.jeecg.modules.wms.request.ReceiveMESScanItemList;
import org.jeecg.modules.wms.service.ReceiveWMSScanItemListService;
import org.jeecg.modules.wms.service.WMSWebService;
import org.jeecg.modules.wms.WMSWebService;
import org.jeecg.modules.wms.dto.WSResponse;
import org.jeecg.modules.wms.request.ReceiveWMSScanItemList;
import org.jeecg.modules.wms.service.MESWebServiceSoap;
import org.jeecg.modules.wms.service.WebServiceSoap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,27 +27,47 @@
public class WMSTestController {
    @Value("${webservice.url}")
    private String url;
    @Autowired
    private WMSWebService webService;
    private final static String localUrl = "http://localhost:9989/jeecg-boot/webservice/ReceiveWMSScanItemList?wsdl";
    @ApiOperation(value = "WMS集成测试-接收WMS移库结果", notes = "WMS集成测试-接收WMS移库结果")
    @PostMapping("/testReceiveWMSScanItemList")
    public Result<?> testReceiveWMSScanItemList() {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setAddress(url);
        factory.setServiceClass(ReceiveWMSScanItemListService.class);
        ReceiveWMSScanItemListService service = (ReceiveWMSScanItemListService) factory.create();
        ReceiveMESScanItemList request = new ReceiveMESScanItemList();
        ReceiveMESScanItemListResponse response = service.receiveWMSScanItemList(request);
        factory.setAddress(localUrl);
        factory.setServiceClass(MESWebServiceSoap.class);
        MESWebServiceSoap service = (MESWebServiceSoap) factory.create();
        ReceiveWMSScanItemList request = new ReceiveWMSScanItemList();
        WSResponse response = service.receiveWMSScanItemList(request);
        return Result.ok(response);
    }
    @ApiOperation(value = "WMS集成测试-HelloWord测试", notes = "WMS集成测试-HelloWord测试")
    @PostMapping("/testHelloWorld")
    public Result<?> testHelloWorld() {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setAddress(url);
        factory.setServiceClass(WMSWebService.class);
        WMSWebService service = (WMSWebService) factory.create();
        String response = service.helloWorld();
        return Result.ok(response);
//        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//        factory.setAddress(url);
//        factory.setServiceClass(WebServiceSoap.class);
//        WebServiceSoap service = (WebServiceSoap) factory.create();
//        String response = service.helloWorld();
//        return Result.ok(response);
        WebServiceSoap port = webService.getWebServiceSoap12();
        // 2. èŽ·å– CXF åº•层 Client å¯¹è±¡
        Client client = ClientProxy.getClient(port);
        // 3. èŽ·å– HTTPConduit å¹¶è®¾ç½®è¶…æ—¶
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(10 * 1000); // è¿žæŽ¥è¶…æ—¶ 10 ç§’
        httpClientPolicy.setReceiveTimeout(300 * 1000);   // è¯»å–è¶…æ—¶ 60 ç§’(重点!)
        http.setClient(httpClientPolicy);
        String result = port.helloWorld();
        return Result.ok(result);
    }
}
src/main/java/org/jeecg/modules/wms/dto/DeliOrderDeleteResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package org.jeecg.modules.wms.dto;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="DeliOrderDeleteResult" type="{http://tempuri.org/}WSResponse" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "deliOrderDeleteResult"
})
@XmlRootElement(name = "DeliOrderDeleteResponse")
@Getter
@Setter
public class DeliOrderDeleteResponse {
    @XmlElement(name = "DeliOrderDeleteResult")
    protected WSResponse deliOrderDeleteResult;
}
src/main/java/org/jeecg/modules/wms/dto/HelloWorldResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package org.jeecg.modules.wms.dto;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="HelloWorldResult" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "helloWorldResult"
})
@XmlRootElement(name = "HelloWorldResponse")
@Getter
@Setter
public class HelloWorldResponse {
    @XmlElement(name = "HelloWorldResult")
    protected String helloWorldResult;
}
src/main/java/org/jeecg/modules/wms/dto/ReceiveMESScanItemListResponse.java
@@ -1,19 +1,40 @@
package org.jeecg.modules.wms.dto;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import javax.xml.bind.annotation.*;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="ReceiveMESScanItemListResult" type="{http://tempuri.org/}WSResponse" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "receiveMESScanItemListResult"
})
@XmlRootElement(name = "ReceiveMESScanItemListResponse")
@Getter
@Setter
@XmlRootElement(name = "ReceiveMESScanItemListResponse")
@XmlAccessorType(XmlAccessType.FIELD)
public class ReceiveMESScanItemListResponse implements Serializable {
    @XmlElement(name = "WSResponse")
    private WSResponse wsResponse;
public class ReceiveMESScanItemListResponse {
    @XmlElement(name = "ReceiveMESScanItemListResult")
    protected WSResponse receiveMESScanItemListResult;
}
src/main/java/org/jeecg/modules/wms/dto/ReceiveReservationResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package org.jeecg.modules.wms.dto;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.*;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="ReceiveReservationResult" type="{http://tempuri.org/}WSResponse" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "receiveReservationResult"
})
@XmlRootElement(name = "ReceiveReservationResponse")
@Getter
@Setter
public class ReceiveReservationResponse {
    @XmlElement(name = "ReceiveReservationResult")
    protected WSResponse receiveReservationResult;
}
src/main/java/org/jeecg/modules/wms/dto/ReceiveWMSScanItemListResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package org.jeecg.modules.wms.dto;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "receiveWMSScanItemListResult"
})
@XmlRootElement(name = "ReceiveWMSScanItemListResponse")
@Getter
@Setter
public class ReceiveWMSScanItemListResponse {
    @XmlElement(name = "ReceiveWMSScanItemListResult")
    protected WSResponse receiveWMSScanItemListResult;
}
src/main/java/org/jeecg/modules/wms/dto/WSResponse.java
@@ -1,3 +1,4 @@
package org.jeecg.modules.wms.dto;
import lombok.Getter;
@@ -6,14 +7,40 @@
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>WSResponse complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType name="WSResponse"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="ErrorCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="ErrorDesc" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public class WSResponse implements Serializable {
@XmlType(name = "WSResponse", propOrder = {
        "errorCode",
        "errorDesc"
})
public class WSResponse {
    @XmlElement(name = "ErrorCode")
    private String errorCode;
    protected String errorCode;
    @XmlElement(name = "ErrorDesc")
    private String errorDesc;
    protected String errorDesc;
}
src/main/java/org/jeecg/modules/wms/request/ArrayOfWebServiceSendItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package org.jeecg.modules.wms.request;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>ArrayOfWebServiceSendItem complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType name="ArrayOfWebServiceSendItem"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="WebServiceSendItem" type="{http://tempuri.org/}WebServiceSendItem" maxOccurs="unbounded" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ArrayOfWebServiceSendItem", propOrder = {
        "webServiceSendItem"
})
public class ArrayOfWebServiceSendItem {
    @XmlElement(name = "WebServiceSendItem", nillable = true)
    protected List<WebServiceSendItem> webServiceSendItem;
    /**
     * Gets the value of the webServiceSendItem property.
     *
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the webServiceSendItem property.
     *
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getWebServiceSendItem().add(newItem);
     * </pre>
     *
     *
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link WebServiceSendItem }
     *
     *
     */
    public List<WebServiceSendItem> getWebServiceSendItem() {
        if (webServiceSendItem == null) {
            webServiceSendItem = new ArrayList<>();
        }
        return this.webServiceSendItem;
    }
}
src/main/java/org/jeecg/modules/wms/request/DeliOrderDelete.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="sFactoryCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="sStockRecord" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "sFactoryCode",
        "sStockRecord"
})
@XmlRootElement(name = "DeliOrderDelete")
@Getter
@Setter
public class DeliOrderDelete {
    protected String sFactoryCode;
    protected String sStockRecord;
}
src/main/java/org/jeecg/modules/wms/request/HelloWorld.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package org.jeecg.modules.wms.request;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "HelloWorld")
public class HelloWorld {
}
src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java
@@ -1,19 +1,40 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.*;
import java.io.Serializable;
import java.util.List;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="oMESScanItemList" type="{http://tempuri.org/}ArrayOfWebServiceSendItem" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "omesScanItemList"
})
@XmlRootElement(name = "ReceiveMESScanItemList")
@Getter
@Setter
@XmlRootElement(name = "ReceiveMESScanItemList")
@XmlAccessorType(XmlAccessType.FIELD)
public class ReceiveMESScanItemList implements Serializable {
public class ReceiveMESScanItemList {
    @XmlElementWrapper(name = "ArrayOfWebServiceSendItem")
    @XmlElement(name = "WebServiceSendItem")
    private List<WebServiceSendItem> items;
    @XmlElement(name = "oMESScanItemList")
    protected ArrayOfWebServiceSendItem omesScanItemList;
}
src/main/java/org/jeecg/modules/wms/request/ReceiveReservation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>anonymous complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="oWebReservationOrder" type="{http://tempuri.org/}WebReservationOrder" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "oWebReservationOrder"
})
@XmlRootElement(name = "ReceiveReservation")
@Getter
@Setter
public class ReceiveReservation {
    protected WebReservationOrder oWebReservationOrder;
}
src/main/java/org/jeecg/modules/wms/request/ReceiveWMSScanItemList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "wmsWebServiceSendItemList"
})
@XmlRootElement(name = "ReceiveWMSScanItemList")
@Getter
@Setter
public class ReceiveWMSScanItemList {
    @XmlElementWrapper(name = "ArrayOfWMSWebServiceSendItem")
    @XmlElement(name = "WMSWebServiceSendItem", nillable = true)
    protected List<WMSWebServiceSendItem> wmsWebServiceSendItemList;
}
src/main/java/org/jeecg/modules/wms/request/WMSWebServiceSendItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@Getter
@Setter
@XmlType(name = "WMSWebServiceSendItem", propOrder = {
        "factoryCode",
        "skuCode",
        "reservationOrder",
        "align",
        "pallet",
        "packageNo",
        "trackLot",
        "series",
        "mesStockID",
        "quantity",
        "sapTrackLot",
        "section",
        "destSection",
        "supplierCode",
        "supplierTrackLot",
        "stageID",
        "remark",
        "orderCode"
})
@XmlAccessorType(XmlAccessType.FIELD)
public class WMSWebServiceSendItem {
    /**工厂编码 */
    @XmlElement(name = "FactoryCode")
    private String factoryCode;
    /** ç‰©æ–™ç¼–码 */
    @XmlElement(name = "SkuCode")
    private String skuCode;
    /** é¢„留号 */
    @XmlElement(name = "ReservationOrder")
    private String reservationOrder;
    /** å¯¹é½æ–¹å¼ */
    @XmlElement(name = "Align")
    private String align;
    /** æ‰˜å· */
    @XmlElement(name = "Pallet")
    private String pallet;
    /** åŒ…装编码 */
    @XmlElement(name = "PackageNo")
    private String packageNo;
    /** æ‰¹æ¬¡å· */
    @XmlElement(name = "TrackLot")
    private String trackLot;
    /** ç³»åˆ—号 */
    @XmlElement(name = "Series")
    private String series;
    /** MES库存ID */
    @XmlElement(name = "MesStockID")
    private String mesStockID;
    /** æ•°é‡ */
    @XmlElement(name = "Quantity")
    private String quantity;
    /** SAP批次号 */
    @XmlElement(name = "SapTrackLot")
    private String sapTrackLot;
    /** å‘送库存地 */
    @XmlElement(name = "Section")
    private String section;
    /** ç›®æ ‡åº“存地 */
    @XmlElement(name = "DestSection")
    private String destSection;
    /** ä¾›åº”商代码 */
    @XmlElement(name = "SupplierCode")
    private String supplierCode;
    /** ä¾›åº”商批次号 */
    @XmlElement(name = "SupplierTrackLot")
    private String supplierTrackLot;
    /** é˜¶æ®µID */
    @XmlElement(name = "StageID")
    private String stageID;
    /** å¤‡æ³¨ */
    @XmlElement(name = "Remark")
    private String remark;
    /** è®¢å•编码 */
    @XmlElement(name = "OrderCode")
    private String orderCode;
}
src/main/java/org/jeecg/modules/wms/request/WebReservationOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import java.math.BigDecimal;
/**
 * <p>WebReservationOrder complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType name="WebReservationOrder"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="FactoryCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="ReservationOrder" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="Total" type="{http://www.w3.org/2001/XMLSchema}decimal"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "WebReservationOrder", propOrder = {
    "factoryCode",
    "reservationOrder",
    "total"
})
@Getter
@Setter
public class WebReservationOrder {
    @XmlElement(name = "FactoryCode")
    protected String factoryCode;
    @XmlElement(name = "ReservationOrder")
    protected String reservationOrder;
    @XmlElement(name = "Total", required = true)
    protected BigDecimal total;
}
src/main/java/org/jeecg/modules/wms/request/WebServiceSendItem.java
@@ -1,70 +1,107 @@
package org.jeecg.modules.wms.request;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlType;
/**
 * <p>WebServiceSendItem complex type的 Java ç±»ã€‚
 *
 * <p>以下模式片段指定包含在此类中的预期内容。
 *
 * <pre>
 * &lt;complexType name="WebServiceSendItem"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="FactoryCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="SkuCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="Align" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="Pallet" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="PackageNo" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="TrackLot" type="{http://www.w3.org/2001/XMLSchema}long"/&gt;
 *         &lt;element name="Series" type="{http://www.w3.org/2001/XMLSchema}long"/&gt;
 *         &lt;element name="MesStockID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="Quantity" type="{http://www.w3.org/2001/XMLSchema}decimal"/&gt;
 *         &lt;element name="SapTrackLot" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="Section" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="DestSection" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="SupplierCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="SupplierTrackLot" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="StageID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="Remark" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *         &lt;element name="OrderCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "WebServiceSendItem", propOrder = {
    "factoryCode",
    "skuCode",
    "align",
    "pallet",
    "packageNo",
    "trackLot",
    "series",
    "mesStockID",
    "quantity",
    "sapTrackLot",
    "section",
    "destSection",
    "supplierCode",
    "supplierTrackLot",
    "stageID",
    "remark",
    "orderCode"
})
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public class WebServiceSendItem implements Serializable {
    /**工厂编码 */
public class WebServiceSendItem {
    @XmlElement(name = "FactoryCode")
    private String factoryCode;
    /** ç‰©æ–™ç¼–码 */
    protected String factoryCode;
    @XmlElement(name = "SkuCode")
    private String skuCode;
    /** é¢„留号 */
    @XmlElement(name = "ReservationOrder")
    private String reservationOrder;
    /** å¯¹é½æ–¹å¼ */
    protected String skuCode;
    @XmlElement(name = "Align")
    private String align;
    /** æ‰˜å· */
    protected String align;
    @XmlElement(name = "Pallet")
    private String pallet;
    /** åŒ…装编码 */
    protected String pallet;
    @XmlElement(name = "PackageNo")
    private String packageNo;
    /** æ‰¹æ¬¡å· */
    protected String packageNo;
    @XmlElement(name = "TrackLot")
    private String trackLot;
    /** ç³»åˆ—号 */
    protected long trackLot;
    @XmlElement(name = "Series")
    private String series;
    /** MES库存ID */
    protected long series;
    @XmlElement(name = "MesStockID")
    private String mesStockID;
    /** æ•°é‡ */
    @XmlElement(name = "Quantity")
    private BigDecimal quantity;
    /** SAP批次号 */
    protected String mesStockID;
    @XmlElement(name = "Quantity", required = true)
    protected BigDecimal quantity;
    @XmlElement(name = "SapTrackLot")
    private String sapTrackLot;
    /** å‘送库存地 */
    protected String sapTrackLot;
    @XmlElement(name = "Section")
    private String section;
    /** ç›®æ ‡åº“存地 */
    protected String section;
    @XmlElement(name = "DestSection")
    private String destSection;
    /** ä¾›åº”商代码 */
    protected String destSection;
    @XmlElement(name = "SupplierCode")
    private String supplierCode;
    /** ä¾›åº”商批次号 */
    protected String supplierCode;
    @XmlElement(name = "SupplierTrackLot")
    private String supplierTrackLot;
    /** é˜¶æ®µID */
    protected String supplierTrackLot;
    @XmlElement(name = "StageID")
    private String stageID;
    /** å¤‡æ³¨ */
    protected String stageID;
    @XmlElement(name = "Remark")
    private String remark;
    /** è®¢å•编码 */
    protected String remark;
    @XmlElement(name = "OrderCode")
    private String orderCode;
    protected String orderCode;
}
src/main/java/org/jeecg/modules/wms/service/MESWebServiceSoap.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package org.jeecg.modules.wms.service;
import org.jeecg.modules.wms.MESObjectFactory;
import org.jeecg.modules.wms.dto.WSResponse;
import org.jeecg.modules.wms.request.ReceiveWMSScanItemList;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
@WebService(name = "MESWebServiceSoap", targetNamespace = "http://xhj008.server.webservice.com/")
@XmlSeeAlso({MESObjectFactory.class})
public interface MESWebServiceSoap {
    /**
     * æŽ¥æ”¶WMS移库信息
     * @param request
     * @return
     */
    @WebMethod(operationName = "ReceiveWMSScanItemList", action = "http://xhj008.server.webservice.com/ReceiveWMSScanItemList")
    @RequestWrapper(localName = "ReceiveWMSScanItemList", targetNamespace = "http://xhj008.server.webservice.com/", className = "ReceiveWMSScanItemList")
    @ResponseWrapper(localName = "ReceiveWMSScanItemListResponse", targetNamespace = "http://xhj008.server.webservice.com/", className = "ReceiveWMSScanItemListResponse")
    @WebResult(name = "ReceiveWMSScanItemListResult", targetNamespace = "http://xhj008.server.webservice.com/")
    WSResponse receiveWMSScanItemList(@WebParam(name = "ReceiveWMSScanItemList", targetNamespace = "http://xhj008.server.webservice.com/") ReceiveWMSScanItemList request);
}
src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/wms/service/WMSWebService.java
ÎļþÒÑɾ³ý
src/main/java/org/jeecg/modules/wms/service/WebServiceSoap.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package org.jeecg.modules.wms.service;
import org.jeecg.modules.wms.WMSObjectFactory;
import org.jeecg.modules.wms.dto.WSResponse;
import org.jeecg.modules.wms.request.ArrayOfWebServiceSendItem;
import org.jeecg.modules.wms.request.WebReservationOrder;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
/**
 * This class was generated by Apache CXF 3.5.5
 * 2025-08-15T16:30:13.468+08:00
 * Generated source version: 3.5.5
 *
 */
@WebService(targetNamespace = "http://tempuri.org/", name = "WebServiceSoap")
@XmlSeeAlso({WMSObjectFactory.class})
public interface WebServiceSoap {
    @WebMethod(operationName = "ReceiveReservation", action = "http://tempuri.org/ReceiveReservation")
    @RequestWrapper(localName = "ReceiveReservation", targetNamespace = "http://tempuri.org/", className = "ReceiveReservation")
    @ResponseWrapper(localName = "ReceiveReservationResponse", targetNamespace = "http://tempuri.org/", className = "ReceiveReservationResponse")
    @WebResult(name = "ReceiveReservationResult", targetNamespace = "http://tempuri.org/")
    WSResponse receiveReservation(
            @WebParam(name = "oWebReservationOrder", targetNamespace = "http://tempuri.org/")
            WebReservationOrder oWebReservationOrder
    );
    @WebMethod(operationName = "HelloWorld", action = "http://tempuri.org/HelloWorld")
    @RequestWrapper(localName = "HelloWorld", targetNamespace = "http://tempuri.org/", className = "HelloWorld")
    @ResponseWrapper(localName = "HelloWorldResponse", targetNamespace = "http://tempuri.org/", className = "HelloWorldResponse")
    @WebResult(name = "HelloWorldResult", targetNamespace = "http://tempuri.org/")
    String helloWorld();
    @WebMethod(operationName = "ReceiveMESScanItemList", action = "http://tempuri.org/ReceiveMESScanItemList")
    @RequestWrapper(localName = "ReceiveMESScanItemList", targetNamespace = "http://tempuri.org/", className = "ReceiveMESScanItemList")
    @ResponseWrapper(localName = "ReceiveMESScanItemListResponse", targetNamespace = "http://tempuri.org/", className = "ReceiveMESScanItemListResponse")
    @WebResult(name = "ReceiveMESScanItemListResult", targetNamespace = "http://tempuri.org/")
    WSResponse receiveMESScanItemList(
            @WebParam(name = "oMESScanItemList", targetNamespace = "http://tempuri.org/")
            ArrayOfWebServiceSendItem oMESScanItemList
    );
    @WebMethod(operationName = "DeliOrderDelete", action = "http://tempuri.org/DeliOrderDelete")
    @RequestWrapper(localName = "DeliOrderDelete", targetNamespace = "http://tempuri.org/", className = "DeliOrderDelete")
    @ResponseWrapper(localName = "DeliOrderDeleteResponse", targetNamespace = "http://tempuri.org/", className = "DeliOrderDeleteResponse")
    @WebResult(name = "DeliOrderDeleteResult", targetNamespace = "http://tempuri.org/")
    WSResponse deliOrderDelete(
            @WebParam(name = "sFactoryCode", targetNamespace = "http://tempuri.org/")
            String sFactoryCode,
            @WebParam(name = "sStockRecord", targetNamespace = "http://tempuri.org/")
            String sStockRecord
    );
}
src/main/java/org/jeecg/modules/wms/service/impl/MESWebServiceSoapImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package org.jeecg.modules.wms.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.aspect.annotation.ApiLog;
import org.jeecg.common.constant.ApiLogCategoryEnum;
import org.jeecg.modules.wms.dto.WSResponse;
import org.jeecg.modules.wms.request.ReceiveWMSScanItemList;
import org.jeecg.modules.wms.service.MESWebServiceSoap;
import org.springframework.stereotype.Service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
@Slf4j
@Service
@WebService(name = "MESWebServiceSoap", targetNamespace = "http://xhj008.server.webservice.com", endpointInterface = "org.jeecg.modules.wms.service.MESWebServiceSoap")
public class MESWebServiceSoapImpl implements MESWebServiceSoap {
    @Override
    @WebMethod(operationName = "ReceiveWMSScanItemList", action = "http://xhj008.server.webservice.com/ReceiveWMSScanItemList")
    @RequestWrapper(localName = "ReceiveWMSScanItemList", targetNamespace = "http://xhj008.server.webservice.com/", className = "ReceiveWMSScanItemList")
    @ResponseWrapper(localName = "ReceiveWMSScanItemListResponse", targetNamespace = "http://xhj008.server.webservice.com/", className = "ReceiveWMSScanItemListResponse")
    @WebResult(name = "ReceiveWMSScanItemListResult", targetNamespace = "http://xhj008.server.webservice.com/")
    @ApiLog(apiName = "接收WMS的移库信息(ReceiveWMSScanItemList(MES)", apiCategory = ApiLogCategoryEnum.WMS)
    public WSResponse receiveWMSScanItemList(@WebParam(name = "ReceiveWMSScanItemList", targetNamespace = "http://xhj008.server.webservice.com/") ReceiveWMSScanItemList request) {
        log.error("11111111111");
        WSResponse response = new WSResponse();
        response.setErrorCode("-1");
        response.setErrorDesc("我时结果集");
        return response;
    }
}
src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java
ÎļþÒÑɾ³ý
src/main/resources/application-dev.yml
@@ -7,7 +7,7 @@
    include-stacktrace: ALWAYS
    include-message: ALWAYS
  servlet:
    context-path: /jeecg-boot
    context-path:
  compression:
    enabled: true
    min-response-size: 1024
@@ -126,7 +126,7 @@
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      datasource:
        master:
          url: jdbc:sqlserver://192.168.1.118:1433;databasename=LXZN_TEST_XHJ;nullCatalogMeansCurrent=true
          url: jdbc:sqlserver://192.168.0.118:1433;databasename=LXZN_TEST_XHJ;nullCatalogMeansCurrent=true
          username: sa
          password: 123
          driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
src/main/resources/wsdl/WebService.asmx.wsdl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,227 @@
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="ReceiveMESScanItemList">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="oMESScanItemList" type="tns:ArrayOfWebServiceSendItem" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfWebServiceSendItem">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="WebServiceSendItem" nillable="true" type="tns:WebServiceSendItem" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="WebServiceSendItem">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="FactoryCode" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="SkuCode" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Align" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Pallet" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="PackageNo" type="s:string" />
          <s:element minOccurs="1" maxOccurs="1" name="TrackLot" type="s:long" />
          <s:element minOccurs="1" maxOccurs="1" name="Series" type="s:long" />
          <s:element minOccurs="0" maxOccurs="1" name="MesStockID" type="s:string" />
          <s:element minOccurs="1" maxOccurs="1" name="Quantity" type="s:decimal" />
          <s:element minOccurs="0" maxOccurs="1" name="SapTrackLot" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Section" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="DestSection" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="SupplierCode" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="SupplierTrackLot" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="StageID" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Remark" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="OrderCode" type="s:string" />
        </s:sequence>
      </s:complexType>
      <s:element name="ReceiveMESScanItemListResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ReceiveMESScanItemListResult" type="tns:WSResponse" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="WSResponse">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="ErrorCode" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="ErrorDesc" type="s:string" />
        </s:sequence>
      </s:complexType>
      <s:element name="DeliOrderDelete">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="sFactoryCode" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="sStockRecord" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="DeliOrderDeleteResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="DeliOrderDeleteResult" type="tns:WSResponse" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="ReceiveReservation">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="oWebReservationOrder" type="tns:WebReservationOrder" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="WebReservationOrder">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="FactoryCode" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="ReservationOrder" type="s:string" />
          <s:element minOccurs="1" maxOccurs="1" name="Total" type="s:decimal" />
        </s:sequence>
      </s:complexType>
      <s:element name="ReceiveReservationResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ReceiveReservationResult" type="tns:WSResponse" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="HelloWorld">
        <s:complexType />
      </s:element>
      <s:element name="HelloWorldResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="ReceiveMESScanItemListSoapIn">
    <wsdl:part name="parameters" element="tns:ReceiveMESScanItemList" />
  </wsdl:message>
  <wsdl:message name="ReceiveMESScanItemListSoapOut">
    <wsdl:part name="parameters" element="tns:ReceiveMESScanItemListResponse" />
  </wsdl:message>
  <wsdl:message name="DeliOrderDeleteSoapIn">
    <wsdl:part name="parameters" element="tns:DeliOrderDelete" />
  </wsdl:message>
  <wsdl:message name="DeliOrderDeleteSoapOut">
    <wsdl:part name="parameters" element="tns:DeliOrderDeleteResponse" />
  </wsdl:message>
  <wsdl:message name="ReceiveReservationSoapIn">
    <wsdl:part name="parameters" element="tns:ReceiveReservation" />
  </wsdl:message>
  <wsdl:message name="ReceiveReservationSoapOut">
    <wsdl:part name="parameters" element="tns:ReceiveReservationResponse" />
  </wsdl:message>
  <wsdl:message name="HelloWorldSoapIn">
    <wsdl:part name="parameters" element="tns:HelloWorld" />
  </wsdl:message>
  <wsdl:message name="HelloWorldSoapOut">
    <wsdl:part name="parameters" element="tns:HelloWorldResponse" />
  </wsdl:message>
  <wsdl:portType name="WebServiceSoap">
    <wsdl:operation name="ReceiveMESScanItemList">
      <wsdl:input message="tns:ReceiveMESScanItemListSoapIn" />
      <wsdl:output message="tns:ReceiveMESScanItemListSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="DeliOrderDelete">
      <wsdl:input message="tns:DeliOrderDeleteSoapIn" />
      <wsdl:output message="tns:DeliOrderDeleteSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="ReceiveReservation">
      <wsdl:input message="tns:ReceiveReservationSoapIn" />
      <wsdl:output message="tns:ReceiveReservationSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="HelloWorld">
      <wsdl:input message="tns:HelloWorldSoapIn" />
      <wsdl:output message="tns:HelloWorldSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="WebServiceSoap" type="tns:WebServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="ReceiveMESScanItemList">
      <soap:operation soapAction="http://tempuri.org/ReceiveMESScanItemList" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="DeliOrderDelete">
      <soap:operation soapAction="http://tempuri.org/DeliOrderDelete" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="ReceiveReservation">
      <soap:operation soapAction="http://tempuri.org/ReceiveReservation" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="HelloWorld">
      <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="WebServiceSoap12" type="tns:WebServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="ReceiveMESScanItemList">
      <soap12:operation soapAction="http://tempuri.org/ReceiveMESScanItemList" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="DeliOrderDelete">
      <soap12:operation soapAction="http://tempuri.org/DeliOrderDelete" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="ReceiveReservation">
      <soap12:operation soapAction="http://tempuri.org/ReceiveReservation" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="HelloWorld">
      <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="WebService">
    <wsdl:port name="WebServiceSoap" binding="tns:WebServiceSoap">
      <soap:address location="http://10.101.0.182:8002/MesWebService/WebService.asmx" />
    </wsdl:port>
    <wsdl:port name="WebServiceSoap12" binding="tns:WebServiceSoap12">
      <soap12:address location="http://10.101.0.182:8002/MesWebService/WebService.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>