wangxinhui
2025-12-29 d0cc37c3c11859cc55f30624692dca55be2b8a32
变更及代码优化
已添加8个文件
已修改44个文件
1921 ■■■■ 文件已修改
项目代码/WCS/WCSClient/package-lock.json 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_IPackInfoRepository/IDt_PackaxisRepository.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_IPackInfoService/IDt_PackaxisService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Model/Models/PackInfo/Dt_PackType.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Model/Models/PackInfo/Dt_Packaxis.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_PackaxisTask.cs 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_PackaxisTask_Hty.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_PackInfoRepository/Dt_PackaxisRepository.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_PackInfoService/Dt_PackaxisService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/PackInfo/PackaxisController.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/ConveyorLineJob_YL1ndFloor.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/AGV_CPExtend.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/ConveyorLineJob_CPB.cs 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/ConveyorLineJob_CPH.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/码垛/MDJob_CP.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/package-lock.json 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/components/basic/ViewGrid/methods.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/basic/agvStationInfo.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/basic/agvStationInfo.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/APIEnum/APIEnum.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/CommonEnum/StationAreaEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/BaseModels/WebResponseContent.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/Helper/HttpHelper.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Basic/ERPMaterialDTO.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTWeightUpDTO.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/ERPService/InvokeERPService.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/IERPService/IInvokeERPService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutMESOrderService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutStockLockInfoService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IStockRepository/IProStockInfoRepository.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IStockService/IProStockInfoService.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutStockLockInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutMESOrderService.cs 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutStockLockInfoService.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockRepository/ProStockInfoRepository.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/ProStockInfoService.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 223 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/ERP 原纸重量修正接口对接文档.docx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/RCS取货放货完成信号.docx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/物料克重查询 API 接口文档.pdf 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片料架DB块数据.zip 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WCSClient/package-lock.json
@@ -1278,11 +1278,6 @@
        "fastq": "^1.6.0"
      }
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.7",
      "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
    },
    "@soda/friendly-errors-webpack-plugin": {
      "version": "1.8.0",
      "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927406873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz",
@@ -1841,6 +1836,87 @@
        "webpack-chain": "^6.4.0",
        "webpack-dev-server": "^3.11.0",
        "webpack-merge": "^4.2.2"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
    },
    "@vue/cli-shared-utils": {
@@ -4938,6 +5014,13 @@
        "lodash-unified": "^1.0.2",
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      },
      "dependencies": {
        "@popperjs/core": {
          "version": "npm:@sxzz/popperjs-es@2.11.7",
          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
        }
      }
    },
    "elliptic": {
@@ -12522,87 +12605,6 @@
          "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
          "dev": true
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -10,12 +10,6 @@
    public enum TaskTypeEnum
    {
        /// <summary>
        /// é¢†æ–™å‡ºåº“
        /// </summary>
        [Description("领料出库")]
        Outbound = 100,
        /// <summary>
        /// ç›˜ç‚¹å‡ºåº“
        /// </summary>
        [Description("盘点出库")]
@@ -34,28 +28,46 @@
        OutEmpty = 130,
        /// <summary>
        /// äºŒæ¥¼ç©ºæ‰˜å ç›˜å‡ºåº“
        /// </summary>
        [Description("二楼空托叠盘出库")]
        OutEmptyPlate = 140,
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        [Description("成品出库")]
        OutProduct = 230,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚å‡ºåº“
        /// è€åŽ‚å‡ºåº“
        /// </summary>
        [Description("原料老厂出库")]
        [Description("老厂出库")]
        OldYLOutbound = 300,
        /// <summary>
        /// åŽŸæ–™å°åˆ·å‡ºåº“
        /// å°åˆ·å‡ºåº“
        /// </summary>
        [Description("原料印刷出库")]
        [Description("印刷出库")]
        PrintYLOutbound = 310,
        /// <summary>
        /// åŽŸæ–™çº¸è¢‹åˆ¶è¢‹ä¾›æ–™
        /// çº¸å¼ æ·‹è†œå‡ºåº“
        /// </summary>
        [Description("原料纸袋制袋供料")]
        [Description("纸张淋膜出库")]
        OutPaperLM = 320,
        /// <summary>
        /// çº¸è¢‹åˆ¶è¢‹ä¾›æ–™
        /// </summary>
        [Description("纸袋制袋供料")]
        PaperYLOutZDGL = 330,
        /// <summary>
        /// æ— çººå¸ƒåˆ¶è¢‹ä¾›æ–™
        /// </summary>
        [Description("无纺袋制袋供料")]
        OutWFBGL = 340,
        /// <summary>
        /// è¾…料无纺布出库
@@ -76,12 +88,6 @@
        OutWFBLM = 370,
        /// <summary>
        /// çº¸å¼ æ·‹è†œå‡ºåº“
        /// </summary>
        [Description("纸张淋膜出库")]
        OutPaperLM = 380,
        /// <summary>
        /// å†²åˆ‡åŒºå‡ºåº“
        /// </summary>
        [Description("冲切区出库")]
@@ -98,12 +104,6 @@
        /// </summary>
        [Description("分切区出库")]
        OutFenQie = 410,
        /// <summary>
        /// æ— çººå¸ƒåˆ¶è¢‹ä¾›æ–™
        /// </summary>
        [Description("无纺袋制袋供料")]
        OutWFBGL = 420,
        /// <summary>
        /// é‡‡è´­å…¥åº“
@@ -142,27 +142,57 @@
        EmptyProductBack = 630,
        /// <summary>
        /// åŽŸæ–™å°åˆ·åŠæˆå“å…¥åº“
        /// æ— çººå¸ƒåŠæˆå“å…¥åº“
        /// </summary>
        [Description("原料印刷半成品入库")]
        [Description("无纺布半成品入库")]
        WFBYLInbound = 700,
        /// <summary>
        /// çº¸å¼ æ·‹è†œåŠæˆå“å…¥åº“
        /// </summary>
        [Description("纸张淋膜半成品入库")]
        PaperFilmInbound = 705,
        /// <summary>
        /// å°åˆ·åŠæˆå“å…¥åº“
        /// </summary>
        [Description("印刷半成品入库")]
        PrintYLInbound = 710,
        /// <summary>
        /// åŽŸæ–™å°åˆ·ä½™æ–™é€€åº“
        /// æ— çººå¸ƒæ·‹è†œä½™æ–™é€€åº“
        /// </summary>
        [Description("原料印刷余料退库")]
        [Description("无纺布淋膜余料退库")]
        WFBLMYLBackInbound = 715,
        /// <summary>
        /// å°åˆ·ä½™æ–™é€€åº“
        /// </summary>
        [Description("印刷余料退库")]
        PrintYLBackInbound = 720,
        /// <summary>
        /// åŽŸæ–™å°åˆ·ä½™æ–™é€€åº“
        /// çº¸å¼ æ·‹è†œä½™æ–™é€€åº“
        /// </summary>
        [Description("原料纸袋余料退库")]
        [Description("纸张淋膜余料退库")]
        PaperFilmYLBackInbound = 725,
        /// <summary>
        /// çº¸è¢‹ä½™æ–™é€€åº“
        /// </summary>
        [Description("纸袋余料退库")]
        PaperYLBackInbound = 730,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚é€€åº“
        /// åˆ†åˆ‡ä½™æ–™é€€åº“
        /// </summary>
        [Description("原料老厂退库")]
        [Description("分切余料退库")]
        PartOffYLBackInbound = 735,
        /// <summary>
        /// è€åŽ‚é€€åº“
        /// </summary>
        [Description("老厂退库")]
        PaperOldYLBackInbound = 740,
        /// <summary>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_IPackInfoRepository/IDt_PackaxisRepository.cs
@@ -5,7 +5,6 @@
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.PackInfo;
namespace WIDESEAWCS_IPackInfoRepository
{
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_IPackInfoService/IDt_PackaxisService.cs
@@ -4,7 +4,7 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Model.Models.PackInfo;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_PackInfoService
{
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -60,12 +60,13 @@
        WebResponseContent ReceiveWMSTask([NotNull] List<WMSTaskDTO> taskDTOs);
        /// <summary>
        /// æ ¹æ®æ‰˜ç›˜å·ã€èµ·å§‹åœ°å€å‘WMS请求任务
        /// æ ¹æ®ç»ˆç‚¹åœ°å€å‘WMS请求任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "");
        WebResponseContent RequestPlateOutTask(string targetAddress);
        /// <summary>
        /// è¯·æ±‚原料入库
        /// </summary>
@@ -95,7 +96,7 @@
        /// <param name="sourceAddress">起始地址</param>
        /// /// <param name="roadWay">巷道</param>
        /// <returns></returns>
        WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress, string roadWay="", int taskType = 630,int taskNum=0,string targetAddress="");
        WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress, string roadWay="", int taskType = 630);
        //上传条码
        WebResponseContent MESBoxCodeNotice(string boxCode);
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Model/Models/PackInfo/Dt_PackType.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_PackType), "码垛类型")]
    public class Dt_PackType : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int id { get; set; }
        /// <summary>
        /// ç åž›åž›åž‹é•¿åº¦
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "码垛垛型长度")]
        public int PackLength { get; set; }
        /// <summary>
        /// ç åž›åž›åž‹å®½åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 200, ColumnDescription = "码垛垛型宽度")]
        public string PackWidth { get; set; }
        /// <summary>
        /// ç åž›åž›åž‹é«˜åº¦
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "码垛垛型高度")]
        public int PackHeight { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Model/Models/PackInfo/Dt_Packaxis.cs
@@ -6,7 +6,7 @@
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models.PackInfo
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_Packaxis), "码垛坐标")]
    public class Dt_Packaxis : BaseEntity
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_PackaxisTask.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_Model.Models.TaskInfo
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using Magicodes.ExporterAndImporter.Core;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.Attributes;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_PackaxisTask), "码垛任务信息"), SugarIndex("unique_pack_taskNum", nameof(PackTaskNum), OrderByType.Asc, true)]
    public class Dt_PackaxisTask : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "主键")]
        [ExporterHeader(DisplayName = "主键")]
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int PackTaskId { get; set; }
        /// <summary>
        /// ç åž›ä»»åŠ¡å·
        /// </summary>
        [ImporterHeader(Name = "码垛任务号")]
        [ExporterHeader(DisplayName = "码垛任务号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "码垛任务号")]
        public int PackTaskNum { get; set; }
        /// <summary>
        /// ç®±ç 
        /// </summary>
        [ImporterHeader(Name = "箱码")]
        [ExporterHeader(DisplayName = "箱码")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "箱码")]
        public string BoxCode { get; set; }
        /// <summary>
        /// è®¾å¤‡ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "设备编号")]
        public string DeviceCode { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "任务类型")]
        [ExporterHeader(DisplayName = "任务类型")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务类型")]
        public int TaskType { get; set; }
        /// <summary>
        /// ä»»åŠ¡çŠ¶æ€
        /// </summary>
        [ImporterHeader(Name = "任务状态")]
        [ExporterHeader(DisplayName = "任务状态")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务状态")]
        public int TaskState { get; set; }
        /// <summary>
        /// èµ·å§‹åœ°å€
        /// </summary>
        [ImporterHeader(Name = "起始地址")]
        [ExporterHeader(DisplayName = "起始地址")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "起始地址")]
        public string SourceAddress { get; set; }
        /// <summary>
        /// ç›®æ ‡åœ°å€
        /// </summary>
        [ImporterHeader(Name = "目标地址")]
        [ExporterHeader(DisplayName = "目标地址")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "目标地址")]
        public string TargetAddress { get; set; }
        /// <summary>
        /// å½“前位置
        /// </summary>
        [ImporterHeader(Name = "当前位置")]
        [ExporterHeader(DisplayName = "当前位置")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "当前位置")]
        public string CurrentAddress { get; set; }
        /// <summary>
        /// ä¸‹ä¸€åœ°å€
        /// </summary>
        [ImporterHeader(Name = "下一地址")]
        [ExporterHeader(DisplayName = "下一地址")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "下一地址")]
        public string NextAddress { get; set; }
        /// <summary>
        /// ç®±ç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "箱类型")]
        [ExporterHeader(DisplayName = "箱类型")]
        [SugarColumn(IsNullable = false, ColumnDescription = "箱类型")]
        public int PackType { get; set; }
        /// <summary>
        /// ä»»åŠ¡ä¸‹å‘æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "任务下发时间")]
        [ExporterHeader(DisplayName = "任务下发时间")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务下发时间")]
        public DateTime? Dispatchertime { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_PackaxisTask_Hty.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    public class Dt_PackaxisTask_Hty : Dt_PackaxisTask, IBaseHistoryEntity
    {
        public int SourceId { get; set; }
        public string OperateType { get; set; }
        public DateTime InsertTime { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_PackInfoRepository/Dt_PackaxisRepository.cs
@@ -6,7 +6,6 @@
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_IPackInfoRepository;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.PackInfo;
namespace WIDESEAWCS_PackInfoRepository
{
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_PackInfoService/Dt_PackaxisService.cs
@@ -11,11 +11,11 @@
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_IPackInfoRepository;
using WIDESEAWCS_Model.Models.PackInfo;
using WIDESEAWCS_PackInfoRepository;
using Magicodes.ExporterAndImporter.Core.Models;
using Magicodes.ExporterAndImporter.Excel;
using WIDESEAWCS_Common.Utilities;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_PackInfoService
{
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -278,6 +278,10 @@
                                _taskService.UpdateTask(task, TaskStatusEnum.AGV_Finish);
                                PutFinish(oldAddress, task.TaskNum);
                            }
                            else if (task.TaskType == TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() || task.TaskType == TaskTypeEnum.WFBYLInbound.ObjToInt())
                            {
                                _taskService.TaskCompleted(task.TaskNum);
                            }
                            else
                            {
                                task.CurrentAddress = dt_Station.StationCode;
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/PackInfo/PackaxisController.cs
@@ -9,7 +9,6 @@
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.PackInfo;
using WIDESEAWCS_PackInfoService;
using WIDESEAWCS_Tasks;
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -234,9 +234,18 @@
                            //入库
                            if (taskTypeGroup == TaskTypeGroup.InboundGroup)
                            {
                                task.CurrentAddress = router.StartPosi;
                                task.NextAddress = router.NextPosi;
                                task.DeviceCode = router.ChildPosiDeviceCode;
                                if (router.NextPosi == "AGV" && router.StartPosi=="AGV")
                                {
                                    task.CurrentAddress = item.SourceAddress;
                                    task.NextAddress = item.TargetAddress;
                                    task.DeviceCode = router.ChildPosiDeviceCode;
                                }
                                else
                                {
                                    task.CurrentAddress = router.StartPosi;
                                    task.NextAddress = router.NextPosi;
                                    task.DeviceCode = router.ChildPosiDeviceCode;
                                }
                            }
                            else //出库
                            {
@@ -302,17 +311,15 @@
        }
        /// <summary>
        /// æ ¹æ®æ‰˜ç›˜å·ã€èµ·å§‹åœ°å€å‘WMS请求任务
        /// æ ¹æ®ç»ˆç‚¹åœ°å€å‘WMS请求任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "")
        public WebResponseContent RequestPlateOutTask(string targetAddress)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == sourceAddress);
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == targetAddress);
                if (stationManger == null)
                {
                    return WebResponseContent.Instance.Error($"未找到站台信息");
@@ -322,29 +329,15 @@
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = "";
                if (!string.IsNullOrEmpty(materielBoxCode))
                {
                    responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}&materielBoxCode={materielBoxCode}");
                }
                else
                {
                    responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}");
                }
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/PlateOutbound?stationCode={targetAddress}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("结果返回为空");
                content = responseContent;
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                content.Error(ex.Message);
            }
            return content;
        }
@@ -366,7 +359,7 @@
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/RequestYLWMSTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}&taskNum{taskNum}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("结果返回为空");
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
@@ -377,13 +370,13 @@
                }
                else
                {
                    content = responseContent ?? content.Error("结果错误");
                    content = responseContent;
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                content.Error(ex.Message);
            }
            return content;
        }
@@ -392,7 +385,7 @@
        /// </summary>
        public WebResponseContent YLPurchaseBoxing(string palletCode, decimal weight = 0, decimal thickness = 0, decimal wide = 0,string stationCode="")
        {
            WebResponseContent? content = new WebResponseContent();
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
@@ -401,7 +394,7 @@
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/YLPurchaseBoxing?palletCode={palletCode}&weight={weight}&thickness={thickness}&wide={wide}&stationCode={stationCode}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("结果返回为空");
                content = responseContent;
@@ -436,7 +429,7 @@
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                content.Error(ex.Message);
            }
            return content;
        }
@@ -456,16 +449,15 @@
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/AssignYLRoadwayNo?palletCode={palletCode}&wide={wide}&thickness={thickness}&weight={weight}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    content = responseContent;
                }
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("结果返回为空");
                content = responseContent;
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                content.Error(ex.Message);
            }
            return content;
        }
@@ -476,40 +468,30 @@
        /// <param name="sourceAddress">起始地址</param>
        /// /// <param name="roadWay">巷道</param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress,string roadWay="", int taskType=630, int taskNum = 0, string targetAddress = "")
        public WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress,string roadWay="", int taskType=630)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //string address = AppSettings.Get("WMSApiAddress");
                //if (string.IsNullOrEmpty(address))
                //{
                //    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                //}
                //string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}");
                //WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                //if (responseContent != null && responseContent.Status && responseContent.Data != null)
                //{
                //    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                //    if (taskDTO != null)
                //    {
                WMSTaskDTO? taskDTO = new WMSTaskDTO()
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    TaskNum = taskNum ==0 ? DateTime.Now.ToString("mmss").ObjToInt(): taskNum,
                    PalletCode= palletCode,
                    RoadWay= roadWay,
                    TaskType= taskType,
                    PalletType=1,
                    TaskStatus= TaskStatusEnum.New.ObjToInt(),
                    SourceAddress= sourceAddress,
                    TargetAddress= targetAddress,
                    WarehouseId=2,
                    Grade=0,
                };
                content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                //    }
                //}
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("结果返回为空");
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
                else
                {
                    content = responseContent;
                }
            }
            catch (Exception ex)
            {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/ConveyorLineJob_YL1ndFloor.cs
@@ -120,22 +120,26 @@
                                if (string.IsNullOrEmpty(task.Roadway) && string.IsNullOrEmpty(task.NextAddress))
                                {
                                    WebResponseContent content = _taskService.AssignYLRoadwayNo(task.PalletCode,weight: conveyorLineInfoRead.WR_Weight, thickness: conveyorLineInfoRead.WR_Height, wide: conveyorLineInfoRead.WR_Width);
                                    if (!content.Status)
                                    if (content.Status)
                                    {
                                        string roadWay = content.Data.ToString();
                                        //获取路由配置
                                        List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi && x.ChildPosiDeviceCode == roadWay);
                                        Dt_Router router = routers.FirstOrDefault();
                                        if (router == null)
                                        {
                                            WriteError(item.StationName, $"任务号:{task.TaskNum}未找到路由配置信息");
                                            return Task.CompletedTask;
                                        }
                                        task.Roadway = roadWay;
                                        task.NextAddress = router.NextPosi;
                                        _taskService.UpdateTask(task, TaskStatusEnum.AGV_Finish);
                                    }
                                    else
                                    {
                                        WriteError(item.StationCode, $"请求入库失败:{content.Message}");
                                    }
                                    string roadWay = content.Data.ToString();
                                    //获取路由配置
                                    List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi && x.ChildPosiDeviceCode== roadWay);
                                    Dt_Router router = routers.FirstOrDefault();
                                    if (router == null)
                                    {
                                        WriteError(item.StationName, $"任务号:{task.TaskNum}未找到路由配置信息");
                                        return Task.CompletedTask;
                                    }
                                    task.Roadway = roadWay;
                                    task.NextAddress = router.NextPosi;
                                    _taskService.UpdateTask(task,TaskStatusEnum.AGV_Finish);
                                }
                                else
                                {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/AGV_CPExtend.cs
@@ -139,7 +139,7 @@
                            {
                                agvTaskSend.Variables.FirstOrDefault(x => x.Code == "FHMH").Value = "0";
                                agvTaskSend.Variables.FirstOrDefault(x => x.Code == "GoodPoint").Value = "";
                                //判断人工手动
                                //判断人工手动 1 éœ€æ”¾è´§å®Œæˆ 2需取货完成 3 å–货完成和放货完成都需要 0 å–货放货完成都不需要
                                PointDetail complete = new();
                                if (stationMangerStart.IsManual==1 && stationMangerEnd.IsManual==0)
                                {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/ConveyorLineJob_CPB.cs
@@ -79,74 +79,77 @@
                        {
                            R_ConveyorLineCPInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineCPInfo>(deviceProRead.DeviceProAddress);
                            //二楼入库扫码请求工位
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 5 && conveyorLineInfoRead.TaskNo > 0)//&& !string.IsNullOrEmpty(conveyorLineInfoRead.PalletCode) todo临时删除条件限制
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 5 && conveyorLineInfoRead.TaskNo > 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.PalletCode))
                            {
                                //查找对应任务
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNo && x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                                if (task != null)
                                {
                                    //分配巷道 å­˜å…¥æ‰˜ç›˜æ•°æ®
                                    //string roadWay = _taskService.AssignCPRoadwayNo().Data.ToString();
                                    //if (!string.IsNullOrEmpty(roadWay))
                                    //{
                                    //}
                                    Dt_StationManger stationManger = stationMangers.FirstOrDefault(x => x.StationCode == task.SourceAddress);
                                    if (stationManger != null)
                                    string roadWay = _taskService.AssignCPRoadwayNo().Data.ToString();
                                    if (!string.IsNullOrEmpty(roadWay))
                                    {
                                        string roadWay = "";
                                        switch (stationManger.AGVStationCode.ObjToInt() % 5)
                                        List<Dt_Router> routers = _routerService.QueryNextRoutes(item.StationCode, roadWay, task.TaskType);
                                        Dt_Router? router = routers.FirstOrDefault();
                                        if (routers == null || routers.Count == 0 || router == null)
                                        {
                                            case 1:
                                                roadWay = "SC01_CP";
                                                break;
                                            case 2:
                                                roadWay = "SC02_CP";
                                                break;
                                            case 3:
                                                roadWay = "SC03_CP";
                                                break;
                                            case 4:
                                                roadWay = "SC04_CP";
                                                break;
                                            case 0:
                                                roadWay = "SC05_CP";
                                                break;
                                            default:
                                                WriteError(item.StationName, $"未找到可分配巷道{task.TaskNum}");
                                                break;
                                            WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        if (!string.IsNullOrEmpty(roadWay))
                                        if (routers.Count > 1)
                                        {
                                            List<Dt_Router> routers = _routerService.QueryNextRoutes(item.StationCode, roadWay, task.TaskType);
                                            Dt_Router? router = routers.FirstOrDefault();
                                            if (routers == null || routers.Count == 0 || router == null)
                                            {
                                                WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                continue;
                                            }
                                            if (routers.Count > 1)
                                            {
                                                WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                continue;
                                            }
                                            device.SetValue(W_ConveyorLineCPDB.W_TargetAddress, router.NextPosi, item.StationCode);
                                            device.SetValue(W_ConveyorLineCPDB.W_TaskNo, task.TaskNum, item.StationCode);
                                            device.SetValue(W_ConveyorLineCPDB.W_Command, 1, item.StationCode);
                                            task.CurrentAddress = item.StationCode;
                                            task.NextAddress = router.NextPosi;
                                            task.PalletCode = DateTime.Now.ToString("yyMMddHHmmss");//todo临时
                                            task.Roadway = roadWay;
                                            task.DeviceCode = router.ChildPosiDeviceCode;
                                            _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                            WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}下一步");
                                            WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        device.SetValue(W_ConveyorLineCPDB.W_TargetAddress, router.NextPosi, item.StationCode);
                                        device.SetValue(W_ConveyorLineCPDB.W_TaskNo, task.TaskNum, item.StationCode);
                                        device.SetValue(W_ConveyorLineCPDB.W_Command, 1, item.StationCode);
                                        task.CurrentAddress = item.StationCode;
                                        task.NextAddress = router.NextPosi;
                                        task.PalletCode = conveyorLineInfoRead.PalletCode;
                                        task.Roadway = roadWay;
                                        task.DeviceCode = router.ChildPosiDeviceCode;
                                        _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                        WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}下一步");
                                    }
                                    else
                                    {
                                        WriteError(item.StationName, $"任务号:{task.TaskNum}未找到可分配巷道");
                                    }
                                }
                            }
                        }
                        else if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && deviceProRead != null)
                        {//入库RGV接驳位交互
                            R_ConveyorLineCPInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineCPInfo>(deviceProRead.DeviceProAddress);
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 4 && conveyorLineInfoRead.TaskNo > 0)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNo && x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() && x.DeviceCode == device.DeviceCode);
                                if (task != null)
                                {
                                    List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi);
                                    Dt_Router? router = routers.FirstOrDefault();
                                    if (routers == null || routers.Count == 0 || router == null)
                                    {
                                        WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    if (routers.Count > 1)
                                    {
                                        WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    device.SetValue(W_ConveyorLineCPDB.W_Command, 2, item.StationCode);
                                    task.NextAddress = router.NextPosi;
                                    _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                    WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}下一步");
                                }
                            }
                        }
                        else if (item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt() && deviceProRead != null)
                        {//入库RGV接驳位交互
                        {//二楼出库口转AGV任务
                            R_ConveyorLineCPInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineCPInfo>(deviceProRead.DeviceProAddress);
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 2 && conveyorLineInfoRead.TaskNo > 0)
                            {
@@ -173,7 +176,7 @@
                        else if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && deviceProRead != null && deviceProWrite != null)
                        {
                            R_ConveyorLineCPInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineCPInfo>(deviceProRead.DeviceProAddress);
                            //成品一楼入库口写入对应入库站台地址
                            //成品二楼入库口写入对应入库站台地址
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 4 && !string.IsNullOrEmpty(conveyorLineInfoRead.PalletCode))
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.PalletCode == conveyorLineInfoRead.PalletCode && x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.AGV_Finish.ObjToInt() && x.DeviceCode == device.DeviceCode);
@@ -209,72 +212,32 @@
                                }
                            }
                        }
                        else if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && deviceProRead != null)
                        {//入库RGV接驳位交互
                            R_ConveyorLineCPInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineCPInfo>(deviceProRead.DeviceProAddress);
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 4 && conveyorLineInfoRead.TaskNo > 0)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNo && x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() && x.DeviceCode == device.DeviceCode);
                                if (task != null)
                                {
                                    List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi);
                                    Dt_Router? router = routers.FirstOrDefault();
                                    if (routers == null || routers.Count == 0 || router == null)
                                    {
                                        WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    if (routers.Count > 1)
                                    {
                                        WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    device.SetValue(W_ConveyorLineCPDB.W_Command, 2, item.StationCode);
                                    task.NextAddress = router.NextPosi;
                                    _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                    WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}下一步");
                                }
                            }
                        }
                        else if (item.StationType == StationTypeEnum.StationType_StackingPlates.ObjToInt() && deviceProRead != null && deviceProWrite != null)
                        {//叠盘机工位叫料
                            R_ConveyorLineCPInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineCPInfo>(deviceProRead.DeviceProAddress);
                            //if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 7 && conveyorLineInfoRead.TaskNo <= 0)
                            //{
                            //    Dt_Task task = _taskRepository.QueryFirst(x =>  x.TargetAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType));
                            //    if (task == null)
                            //    {
                            //        //请求任务
                            //        WMSTaskDTO taskDTO = new WMSTaskDTO()
                            //        {
                            //            Id = 1,
                            //            SourceAddress = "SC02_CP-001-064-001-01",
                            //            TaskNum = DateTime.Now.ToString("mmss").ObjToInt(),
                            //            PalletCode = "" + DateTime.Now.ToString("mmss"),
                            //            RoadWay = "SC02_CP",
                            //            TaskType = 160,
                            //            TaskStatus = TaskStatusEnum.New.ObjToInt(),
                            //            TargetAddress = item.StationCode,
                            //            Grade = 0,
                            //            WarehouseId = 1,
                            //            PalletType = 1
                            //        };
                            //        WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}生成,下一步");
                            //        _taskService.ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                            //    }
                            //}
                            ////叠盘任务完成交互
                            //else if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 8 && conveyorLineInfoRead.TaskNo > 0)
                            //{
                            //    Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNo && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            //    if (task != null)
                            //    {
                            //        //任务完成
                            //        device.SetValue(W_ConveyorLineCPDB.W_Command, 2, item.StationCode);
                            //        WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}叠盘位出库完成");
                            //    }
                            //}
                            if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 7 && conveyorLineInfoRead.TaskNo <= 0)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TargetAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType));
                                if (task == null)
                                {
                                    //请求任务
                                    WebResponseContent content = _taskService.RequestPlateOutTask(item.StationCode);
                                    WriteInfo(item.StationName, $"二楼空托叠盘出库任务生成");
                                }
                            }
                            //叠盘任务完成交互
                            else if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 8 && conveyorLineInfoRead.TaskNo > 0)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNo && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                                if (task != null)
                                {
                                    //任务完成
                                    device.SetValue(W_ConveyorLineCPDB.W_Command, 2, item.StationCode);
                                    _taskService.TaskCompleted(task.TaskNum);
                                    WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}叠盘出库完成");
                                }
                            }
                        }
                        else
                        {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/ConveyorLineJob_CPH.cs
@@ -106,7 +106,6 @@
                                            //码垛环线请求任务 
                                            if (conveyorLineInfoRead != null && (conveyorLineInfoRead.R_State == 2 || conveyorLineInfoRead.R_State == 3) && conveyorLineInfoRead.R_TaskNo <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.R_BoxCode) && conveyorLineInfoRead.R_Request == 1)
                                            {
                                                #region todo:临时逻辑
                                                //写入执行数据
                                                device.SetValue(W_CLineCPHDB.W_TaskNo, 100 + 5, RequestIn.StationCode);
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Âë¶â/MDJob_CP.cs
@@ -21,7 +21,6 @@
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.PackInfo;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
using WIDESEAWCS_QuartzJob.DTO;
@@ -157,7 +156,7 @@
                                    //更新任务信息
                                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                                    //_taskRepository.UpdateData(task);
                                    //_taskService.TaskCompleted(task.TaskNum);
                                    _taskService.TaskCompleted(task.TaskNum);
                                    Thread.Sleep(1000);
                                    WriteInfo(item.StationName, $"任务号{task.TaskNum}码垛");
                                    return Task.CompletedTask;
ÏîÄ¿´úÂë/WMS/WMSClient/package-lock.json
@@ -1438,6 +1438,11 @@
      "dev": true,
      "optional": true
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.7",
      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
    },
    "@soda/friendly-errors-webpack-plugin": {
      "version": "1.8.0",
      "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927406873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz",
@@ -1996,87 +2001,6 @@
        "webpack-chain": "^6.4.0",
        "webpack-dev-server": "^3.11.0",
        "webpack-merge": "^4.2.2"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
    },
    "@vue/cli-shared-utils": {
@@ -5174,13 +5098,6 @@
        "lodash-unified": "^1.0.2",
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      },
      "dependencies": {
        "@popperjs/core": {
          "version": "npm:@sxzz/popperjs-es@2.11.7",
          "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
        }
      }
    },
    "elliptic": {
@@ -12932,6 +12849,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-qrcode": {
      "version": "2.2.2",
      "resolved": "https://registry.npmmirror.com/vue-qrcode/-/vue-qrcode-2.2.2.tgz",
ÏîÄ¿´úÂë/WMS/WMSClient/src/components/basic/ViewGrid/methods.js
@@ -853,7 +853,7 @@
    this.boxModel = true;
  },
  async linkData(row, column) {
    this.boxOptions.title = this.table.cnName + '(编辑)';
    this.boxOptions.title = this.table.cnName + '(查看)';
    //点击table单元格快捷链接显示编辑数据
    this.currentAction = this.const.EDIT;
    this.currentRow = row;
@@ -861,6 +861,13 @@
    this.resetDetailTable(row);
    this.setEditForm(row);
    this.setContinueAdd(false);
    this.boxButtons.forEach((btn) => {
      if (btn.name == '保 å­˜') {
          btn.hidden = true;
          //或者设置只读
          //btn.readonly=true;
      }
    });
    //设置远程查询表单的默认key/value
    this.getRemoteFormDefaultKeyValue();
    //点击编辑按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/basic/agvStationInfo.js
@@ -16,6 +16,36 @@
    methods: {
       //下面这些方法可以保留也可以删除
      onInit() {  //框架初始化配置前,
        let EnableBtn = this.buttons.find(x => x.value == 'Enable');
      if (EnableBtn) {
        EnableBtn.onClick = function () {
          let rows = this.$refs.table.getSelected();
          if (rows.length == 0) return this.$error("请选择数据!");
          var keys = rows.map(x => { return x.id });
          this.http
            .post("api/Task/EnableStatus", keys, "数据处理中")
            .then((x) => {
              if (!x.status) return this.$message.error(x.message);
              this.$message.success(x.message);
              this.refresh();
            });
        }
      }
      let DisableBtn = this.buttons.find(x => x.value == 'Disable');
      if (DisableBtn) {
        DisableBtn.onClick = function () {
          let rows = this.$refs.table.getSelected();
          if (rows.length == 0) return this.$error("请选择数据!");
          var keys = rows.map(x => { return x.id });
          this.http
            .post("api/Task/DisableStatus", keys, "数据处理中")
            .then((x) => {
              if (!x.status) return this.$message.error(x.message);
              this.$message.success(x.message);
              this.refresh();
            });
        }
      }
          //示例:在按钮的最前面添加一个按钮
          //   this.buttons.unshift({  //也可以用push或者splice方法来修改buttons数组
          //     name: '按钮', //按钮名称
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/basic/agvStationInfo.vue
@@ -69,13 +69,15 @@
            const searchFormFields = ref({
                aGVStationCode:"",
                aGVStationHeight:"",
                aGVFrontCode:""
                aGVFrontCode:"",
                enable:""
            });
            const searchFormOptions = ref([
               [
                    {title:"站点信息", field:"aGVStationCode", type:"like"},
                    {title:"MES点位", field:"mesPointCode", type:"flaot"},
                    {title:"区域", field:"stationArea",type:"select",dataKey:"agvStationAreaEnum",data:[]}
                    {title:"区域", field:"stationArea",type:"select",dataKey:"agvStationAreaEnum",data:[]},
                    { title: "是否占用", field: "isOccupied", type: "select", dataKey: "enable", data: [] },
               ]
            ]);
            const columns = ref([{field:'id',title:'主键',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/APIEnum/APIEnum.cs
@@ -72,5 +72,10 @@
        /// </summary>
        [Description("ERP半成品入库推送")]
        ERPSemiProInUp,
        /// <summary>
        /// BST称重回传
        /// </summary>
        [Description("BST称重回传")]
        BSTWeightUp
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/CommonEnum/StationAreaEnum.cs
@@ -114,6 +114,11 @@
        /// äºŒæ¥¼æˆå“åº“缓存区
        /// </summary>
        [Description("二楼成品库缓存区")]
        äºŒæ¥¼æˆå“åº“缓存区 = 18
        äºŒæ¥¼æˆå“åº“缓存区 = 18,
        /// <summary>
        /// ä¸€æ¥¼æš‚存架
        /// </summary>
        [Description("一楼暂存架")]
        ä¸€æ¥¼æš‚存架 = 19
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs
@@ -28,21 +28,27 @@
        OutEmpty = 130,
        /// <summary>
        /// äºŒæ¥¼ç©ºæ‰˜å ç›˜å‡ºåº“
        /// </summary>
        [Description("二楼空托叠盘出库")]
        OutEmptyPlate = 140,
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        [Description("成品出库")]
        OutProduct = 230,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚å‡ºåº“
        /// è€åŽ‚å‡ºåº“
        /// </summary>
        [Description("原料老厂出库")]
        [Description("老厂出库")]
        OldYLOutbound = 300,
        /// <summary>
        /// åŽŸæ–™å°åˆ·å‡ºåº“
        /// å°åˆ·å‡ºåº“
        /// </summary>
        [Description("原料印刷出库")]
        [Description("印刷出库")]
        PrintYLOutbound = 310,
        /// <summary>
@@ -52,9 +58,9 @@
        OutPaperLM = 320,
        /// <summary>
        /// åŽŸæ–™çº¸è¢‹åˆ¶è¢‹ä¾›æ–™
        /// çº¸è¢‹åˆ¶è¢‹ä¾›æ–™
        /// </summary>
        [Description("原料纸袋制袋供料")]
        [Description("纸袋制袋供料")]
        PaperYLOutZDGL = 330,
        /// <summary>
@@ -136,27 +142,57 @@
        EmptyProductBack = 630,
        /// <summary>
        /// åŽŸæ–™å°åˆ·åŠæˆå“å…¥åº“
        /// æ— çººå¸ƒåŠæˆå“å…¥åº“
        /// </summary>
        [Description("原料印刷半成品入库")]
        [Description("无纺布半成品入库")]
        WFBYLInbound = 700,
        /// <summary>
        /// çº¸å¼ æ·‹è†œåŠæˆå“å…¥åº“
        /// </summary>
        [Description("纸张淋膜半成品入库")]
        PaperFilmInbound = 705,
        /// <summary>
        /// å°åˆ·åŠæˆå“å…¥åº“
        /// </summary>
        [Description("印刷半成品入库")]
        PrintYLInbound = 710,
        /// <summary>
        /// åŽŸæ–™å°åˆ·ä½™æ–™é€€åº“
        /// æ— çººå¸ƒæ·‹è†œä½™æ–™é€€åº“
        /// </summary>
        [Description("原料印刷余料退库")]
        [Description("无纺布淋膜余料退库")]
        WFBLMYLBackInbound = 715,
        /// <summary>
        /// å°åˆ·ä½™æ–™é€€åº“
        /// </summary>
        [Description("印刷余料退库")]
        PrintYLBackInbound = 720,
        /// <summary>
        /// åŽŸæ–™å°åˆ·ä½™æ–™é€€åº“
        /// çº¸å¼ æ·‹è†œä½™æ–™é€€åº“
        /// </summary>
        [Description("原料纸袋余料退库")]
        [Description("纸张淋膜余料退库")]
        PaperFilmYLBackInbound = 725,
        /// <summary>
        /// çº¸è¢‹ä½™æ–™é€€åº“
        /// </summary>
        [Description("纸袋余料退库")]
        PaperYLBackInbound = 730,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚é€€åº“
        /// åˆ†åˆ‡ä½™æ–™é€€åº“
        /// </summary>
        [Description("原料老厂退库")]
        [Description("分切余料退库")]
        PartOffYLBackInbound = 735,
        /// <summary>
        /// è€åŽ‚é€€åº“
        /// </summary>
        [Description("老厂退库")]
        PaperOldYLBackInbound = 740,
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/BaseModels/WebResponseContent.cs
@@ -43,7 +43,7 @@
            Status = true;
            Message = message;
            Data = data;
            Datetime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            Datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            return this;
        }
@@ -51,7 +51,7 @@
        {
            Status = false;
            Message = message;
            Datetime= DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            Datetime= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            return this;
        }
    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/Helper/HttpHelper.cs
@@ -111,11 +111,7 @@
                {
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    using HttpClient httpClient = new HttpClient();
                    httpClient.Timeout = new TimeSpan(0, 0, 60);
                    if (serviceAddress.Contains("cimforce/AtomJsonService"))
                    {
                        httpClient.Timeout = new TimeSpan(0, 0, 30);
                    }
                    httpClient.Timeout = new TimeSpan(0, 0, 30);
                    if (headers != null)
                    {
                        foreach (var header in headers)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Basic/ERPMaterialDTO.cs
@@ -64,8 +64,8 @@
        /// <summary>
        /// ç‰©æ–™é‡
        /// </summary>
        [PropertyValidate("物料重", NotNullAndEmpty = true)]
        public decimal Weight { get; set; }
        [PropertyValidate("物料重", NotNullAndEmpty = false)]
        public string Weight { get; set; }
        /// <summary>
        /// çŠ¶æ€
        /// </summary>
@@ -90,9 +90,9 @@
        [PropertyValidate("计量单位:Kg:公斤、M:米、Pcs:个(只)", NotNullAndEmpty = true)]
        public string Unit { get; set; }
        /// <summary>
        /// è®¡é‡å•位
        /// è¾…单位
        /// </summary>
        [PropertyValidate("计量单位:Kg:公斤、M:米、Pcs:个(只)", NotNullAndEmpty = true)]
        [PropertyValidate("辅单位:Kg:公斤、M:米、Pcs:个(只)", NotNullAndEmpty = true)]
        public string AssistUnitCode { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTWeightUpDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.ERP
{
    /// <summary>
    /// ç”Ÿäº§æŽ’程明细
    /// </summary>
    public class BSTWeightUpDTO
    {
        /// <summary>
        /// åŽŸçº¸å”¯ä¸€ç¼–ç 
        /// </summary>
        public string Paper_code { get; set; }
        /// <summary>
        /// ç”Ÿç®¡é¢„估重量
        /// </summary>
        public decimal Estimate_weight { get; set; }
        /// <summary>
        /// ç§°é‡é‡é‡
        /// </summary>
        public decimal Actual_weight { get; set; }
        /// <summary>
        /// è¯¯å·®é‡é‡
        /// </summary>
        public decimal Error_weight { get; set; }
        /// <summary>
        /// ç§°é‡æ—¶é—´
        /// </summary>
        public string Weigh_time { get; set; }
        /// <summary>
        /// æµ‹è¯•人员
        /// </summary>
        public string Operator { get; set; }
        /// <summary>
        /// åŽŸçº¸é—¨å¹…
        /// </summary>
        public decimal Width { get; set; }
        /// <summary>
        /// å…‹é‡
        /// </summary>
        public int Gram_weight { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/ERPService/InvokeERPService.cs
@@ -8,6 +8,7 @@
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.ERP;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_Model.Models;
@@ -106,5 +107,19 @@
            return response;
        }
        /// <summary>
        /// BST称重回传
        /// </summary>
        /// <returns></returns>
        public string BSTWeightUp(BSTWeightUpDTO bSTWeightUpDTO)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.BSTWeightUp.ToString() && x.Enable == WhetherEnum.True.ObjToInt());
            Dictionary<string, string> headers = new Dictionary<string, string>{{ "X-API-Token", "300883" }};
            string request = JsonConvert.SerializeObject(bSTWeightUpDTO, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request, headers: headers);
            return response;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/IERPService/IInvokeERPService.cs
@@ -5,6 +5,7 @@
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.ERP;
using WIDESEA_External.Model;
using WIDESEA_Model.Models;
@@ -45,5 +46,10 @@
        /// </summary>
        /// <returns></returns>
        string ERPSemiProInUp(ERPProInUpModel eRPProInUpModel);
        /// <summary>
        /// BST称重回传
        /// </summary>
        /// <returns></returns>
        string BSTWeightUp(BSTWeightUpDTO bSTWeightUpDTO);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutMESOrderService.cs
@@ -20,9 +20,24 @@
        /// </summary>
        WebResponseContent ReceiveOutBound(List<OutMESOrderDTO> outMESOrderDTO);
        /// <summary>
        /// å‡ºåº“库存分配后,更新数据库数据
        /// å‡ºåº“库存分配后,更新数据库数据(原料)
        /// </summary>
        WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutMESOrder> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
        /// <summary>
        /// å‡ºåº“库存分配后,更新数据库数据(成品)
        /// </summary>
        WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> stockInfos, List<Dt_OutMESOrder> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
        /// <summary>
        /// åˆ†é…åº“å­˜(原料)
        /// </summary>
        /// <param name="outboundOrderDetails"></param>
        /// <returns></returns>
        (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_OutMESOrder> outboundOrderDetails);
        /// <summary>
        /// åˆ†é…åº“å­˜(成品)
        /// </summary>
        /// <param name="outboundOrderDetails"></param>
        /// <returns></returns>
        (List<Dt_ProStockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignProStockOutbound(List<Dt_OutMESOrder> outboundOrderDetails);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutStockLockInfoService.cs
@@ -32,6 +32,10 @@
        /// <summary>
        /// ç”Ÿæˆå‡ºåº“详情
        /// </summary>
        Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutMESOrder ouMESOrder, Dt_ProStockInfo outStock, decimal assignQuantity, int? taskNum = null);
        /// <summary>
        /// ç”Ÿæˆå‡ºåº“详情
        /// </summary>
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutSGOrder outBSTOrder, Dt_OutSGOrderDetail outSGOrderDetail, Dt_StockInfo outStock, decimal assignQuantity, int? taskNum = null);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IStockRepository/IProStockInfoRepository.cs
@@ -10,5 +10,6 @@
{
    public interface IProStockInfoRepository : IRepository<Dt_ProStockInfo>
    {
        List<Dt_ProStockInfo> GetStockInfos(string materielCode, List<string> locationCodes);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IStockService/IProStockInfoService.cs
@@ -13,5 +13,13 @@
    public interface IProStockInfoService : IService<Dt_ProStockInfo>
    {
        IProStockInfoRepository Repository { get; }
        /// <summary>
        /// èŽ·å–å¯ä½¿ç”¨åº“å­˜
        /// </summary>
        List<Dt_ProStockInfo> GetUseableStocks(string materielCode, int warehoseId);
        /// <summary>
        /// åˆ†é…å®žé™…库存
        /// </summary>
        List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, decimal needQuantity);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -260,5 +260,20 @@
        /// <param name="ids"></param>
        /// <returns></returns>
        WebResponseContent CreateSGManualTasks(List<int> ids);
        /// <summary>
        /// ç©ºæ‰˜å ç›˜å‡ºåº“
        /// </summary>
        /// <returns></returns>
        WebResponseContent PlateOutbound(string stationCode);
        /// <summary>
        /// å¯ç”¨ç«™ç‚¹
        /// </summary>
        /// <returns></returns>
        WebResponseContent EnableStatus(int[] keys);
        /// <summary>
        /// ç¦ç”¨ç«™ç‚¹
        /// </summary>
        /// <returns></returns>
        WebResponseContent DisableStatus(int[] keys);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutStockLockInfo.cs
@@ -10,7 +10,7 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// å‡ºåº“详情
    /// å‡ºåº“详情(原料)
    /// </summary>
    [SugarTable(nameof(Dt_OutStockLockInfo), "出库详情")]
    public class Dt_OutStockLockInfo : BaseEntity
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutMESOrderService.cs
@@ -6,6 +6,7 @@
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
@@ -107,7 +108,7 @@
        }
        /// <summary>
        /// å‡ºåº“库存分配后,更新数据库数据
        /// å‡ºåº“库存分配后,更新数据库数据(原料)
        /// </summary>
        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutMESOrder> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
        {
@@ -146,7 +147,46 @@
            }
        }
        /// <summary>
        /// åˆ†é…åº“å­˜
        /// å‡ºåº“库存分配后,更新数据库数据(成品)
        /// </summary>
        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> stockInfos, List<Dt_OutMESOrder> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
        {
            try
            {
                _stockService.ProStockInfoService.Repository.UpdateData(stockInfos);
                BaseDal.UpdateData(outboundOrderDetails);
                List<Dt_OutStockLockInfo> addOutStockLockInfos = outStockLockInfos.Where(x => x.Id == 0).ToList();
                if (addOutStockLockInfos != null && addOutStockLockInfos.Any())
                {
                    if (tasks != null)
                    {
                        addOutStockLockInfos.ForEach(x =>
                        {
                            x.TaskNum = tasks.FirstOrDefault(v => v.PalletCode == x.PalletCode)?.TaskNum;
                        });
                    }
                    _outStockLockInfoService.Repository.AddData(addOutStockLockInfos);
                }
                List<Dt_OutStockLockInfo> updateOutStockLockInfos = outStockLockInfos.Where(x => x.Id > 0).ToList();
                if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
                {
                    _outStockLockInfoService.Repository.UpdateData(updateOutStockLockInfos);
                }
                //添加货位状态
                _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList());
                //批量更新货位状态
                _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// åˆ†é…åº“å­˜(原料)
        /// </summary>
        public (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_OutMESOrder> outboundOrders)
        {
@@ -212,5 +252,72 @@
            return (outStocks, outboundOrders, outStockLockInfos, locationInfos);
        }
        /// <summary>
        /// åˆ†é…åº“å­˜(成品)
        /// </summary>
        public (List<Dt_ProStockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignProStockOutbound(List<Dt_OutMESOrder> outboundOrders)
        {
            if (!outboundOrders.Any())
            {
                throw new Exception($"未找到出库单明细信息");
            }
            List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
            //出库详情
            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
            //货位存储
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            foreach (var item in outboundOrders)
            {
                decimal needQuantity = item.ReqQuantity;
                //获取可用库存
                List<Dt_ProStockInfo> stockInfos = _stockService.ProStockInfoService.GetUseableStocks(item.MaterialCode, WarehouseEnum.LLDCP.ObjToInt()).Where(x => !outStocks.Select(x => x.PalletCode).Contains(x.PalletCode)).ToList();
                if (!stockInfos.Any())
                {
                    throw new Exception($"未找到可分配库存");
                }
                //分配实际库存
                List<Dt_ProStockInfo> autoAssignStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfos, needQuantity);
                //添加库存分配
                outStocks.AddRange(autoAssignStocks);
                //订单数量
                decimal orderQuantity = item.ReqQuantity;
                bool assignStop = true;
                while (assignStop)
                {
                    //出库订单明细已分配数量
                    decimal detailAssignQuantity = outStockLockInfos.Where(x => x.OrderDetailId == item.OutDetailId).Sum(x => x.AssignQuantity);
                    decimal orderDetailNeedQuantity = item.ReqQuantity - detailAssignQuantity;
                    decimal useStockLength = autoAssignStocks[0].proStockInfoDetails
                        .Sum(x => x.StockQty);
                    if (orderDetailNeedQuantity > useStockLength)
                    {
                        //生成详情
                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(item, autoAssignStocks[0], useStockLength);
                        outStockLockInfos.Add(outStockLockInfo);
                        item.AssignTotalUsage += useStockLength;
                        autoAssignStocks.Remove(autoAssignStocks[0]);
                    }
                    else
                    {
                        //生成详情
                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(item, autoAssignStocks[0], orderDetailNeedQuantity);
                        outStockLockInfos.Add(outStockLockInfo);
                        item.AssignTotalUsage = orderQuantity;
                        autoAssignStocks.Remove(autoAssignStocks[0]);
                        assignStop = false;
                    }
                }
                locationInfos.AddRange(_basicRepository.LocationInfoRepository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
            }
            return (outStocks, outboundOrders, outStockLockInfos, locationInfos);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutStockLockInfoService.cs
@@ -66,7 +66,7 @@
            return outStockLockInfo;
        }
        /// <summary>
        /// ç”ŸæˆMES出库详情
        /// ç”ŸæˆMES出库详情(原料)
        /// </summary>
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutMESOrder ouMESOrder, Dt_StockInfo outStock, decimal assignQuantity, int? taskNum = null)
        {
@@ -75,7 +75,7 @@
                PalletCode = outStock.PalletCode,
                AssignQuantity = assignQuantity,
                MaterielCode = ouMESOrder.MaterialCode,
                BatchNo = outStock.BatchNo,
                BatchNo = outStock.BatchNo ?? "",
                LocationCode = outStock.LocationCode,
                MaterielName = outStock.MaterielName,
                OrderDetailId = ouMESOrder.OutDetailId,
@@ -96,6 +96,35 @@
            return outStockLockInfo;
        }
        /// <summary>
        /// ç”ŸæˆMES出库详情(成品)
        /// </summary>
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutMESOrder ouMESOrder, Dt_ProStockInfo outStock, decimal assignQuantity, int? taskNum = null)
        {
            Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
            {
                PalletCode = outStock.PalletCode,
                AssignQuantity = assignQuantity,
                MaterielCode = ouMESOrder.MaterialCode,
                BatchNo = outStock.proStockInfoDetails.FirstOrDefault()?.LotNumber ?? "",
                LocationCode = outStock.LocationCode,
                MaterielName = outStock.proStockInfoDetails.FirstOrDefault()?.ProductName,
                OrderDetailId = ouMESOrder.OutDetailId,
                OrderNo = ouMESOrder.OutMESOrderNo,
                MakeCode = ouMESOrder.MakeCode,
                MachineName = ouMESOrder.MakeArea.ToString(),
                OrderType = OutOrderTypeEnum.OutMESPick.ObjToInt(),
                OriginalQuantity = outStock.proStockInfoDetails.Sum(x=>x.StockQty),
                Status = taskNum == null ? OutLockStockStatusEnum.已分配.ObjToInt() : OutLockStockStatusEnum.出库中.ObjToInt(),
                StockId = outStock.Id,
                TaskNum = taskNum,
                OrderQuantity = ouMESOrder.ReqQuantity,
                Unit = outStock.proStockInfoDetails.FirstOrDefault()?.ProductUnit,
                AssistUnit = ouMESOrder.AssistUnitCode
            };
            return outStockLockInfo;
        }
        /// <summary>
        /// ç”Ÿæˆç”Ÿç®¡å‡ºåº“详情
        /// </summary>
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutSGOrder outSGOrder, Dt_OutSGOrderDetail outSGOrderDetail, Dt_StockInfo outStock, decimal assignQuantity, int? taskNum = null)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockRepository/ProStockInfoRepository.cs
@@ -21,5 +21,15 @@
        {
            _basicRepository = basicRepository;
        }
        public List<Dt_ProStockInfo> GetStockInfos(string materielCode, List<string> locationCodes)
        {
            List<Dt_ProStockInfo> stockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationCodes.Contains(x.LocationCode) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).Includes(x => x.proStockInfoDetails)
                    .Where(x => x.proStockInfoDetails
                    .Any(v =>
                        v.ProductCode == materielCode &&
                        v.OutboundQuantity<=0)
                    ).OrderBy(x=>x.CreateDate).ToList();
            return stockInfos;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/ProStockInfoService.cs
@@ -26,5 +26,52 @@
            _stockRepository = stockRepository;
            _basicRepository = basicRepository;
        }
        public List<Dt_ProStockInfo> GetUseableStocks(string materielCode, int warehoseId)
        {
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            return BaseDal.GetStockInfos(materielCode, locationCodes);
        }
        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, decimal needQuantity)
        {
            List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>();
            decimal stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockQty-v.OutboundQuantity)).Sum(x => x);
            if (stockTotalQuantity >= needQuantity)//库存够
            {
                int index = 0;
                while (needQuantity > 0)
                {
                    Dt_ProStockInfo stockInfo = stockInfos[index];
                    decimal useableStockQuantity = stockInfo.proStockInfoDetails
                        .Sum(x => x.StockQty - x.OutboundQuantity);
                    if (useableStockQuantity < needQuantity && useableStockQuantity > 0)
                    {
                        stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockQty);
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.proStockInfoDetails.ForEach(x =>
                        {
                            if (x.StockQty - x.OutboundQuantity >= needQuantity)
                            {
                                x.OutboundQuantity += needQuantity;
                                needQuantity = 0;
                            }
                            else
                            {
                                needQuantity -= (x.StockQty - x.OutboundQuantity);
                                x.OutboundQuantity = x.StockQty;
                            }
                        });
                    }
                    assignOutStocks.Add(stockInfo);
                    index++;
                }
            }
            return assignOutStocks;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -228,6 +228,7 @@
                    //退料
                    List<Dt_StockInfo> stockInfos=new List<Dt_StockInfo>();
                    List<Dt_Task> tasksNew = new List<Dt_Task>();
                    List<Dt_AGVStationInfo> _AGVStationInfos = new List<Dt_AGVStationInfo>();
                    foreach (var item in returnIssueDTOs.Where(x => x.ReturnMaterial != null))
                    {
                        MESReturnMaterial? returnMaterial = item.ReturnMaterial;
@@ -309,13 +310,25 @@
                        TaskTypeEnum taskTypeEnum = aGVStationInfo.StationArea switch
                        {
                            nameof(StationAreaEnum.一楼印刷) => TaskTypeEnum.PrintYLBackInbound,
                            nameof(StationAreaEnum.一楼纸张淋膜) => TaskTypeEnum.PaperFilmYLBackInbound,
                            nameof(StationAreaEnum.一楼无纺淋膜) => TaskTypeEnum.WFBLMYLBackInbound,
                            _ => throw new Exception("未找到对应任务")
                        };
                        if (taskTypeEnum== TaskTypeEnum.WFBLMYLBackInbound)
                        {
                            Dt_AGVStationInfo? stationInfo = AssignWFBStation(_AGVStationInfos?.Select(x=>x.AGVStationCode).ToList()) ?? throw new Exception("未找到可用无纺布暂存架");
                            newTask.NextAddress = stationInfo.AGVStationCode;
                            newTask.TargetAddress = stationInfo.AGVStationCode;
                            newTask.Roadway = "AGV";
                            stationInfo.IsOccupied = 1;
                            _AGVStationInfos.Add(stationInfo);
                        }
                        newTask.TaskType = taskTypeEnum.ObjToInt();
                        tasksNew.Add(newTask);
                    }
                    _unitOfWorkManage.BeginTran();
                    BaseDal.AddData(tasksNew);
                    _basicRepository.AGVStationInfoRepository.UpdateData(_AGVStationInfos);
                    _stockRepository.StockInfoRepository.AddData(stockInfos);
                    _unitOfWorkManage.CommitTran();
                    //推送任务
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs
@@ -18,11 +18,13 @@
using AutoMapper;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using SqlSugar;
using System.Reflection.Emit;
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
@@ -35,6 +37,7 @@
using WIDESEA_DTO;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
using WIDESEA_DTO.Stock;
using WIDESEA_DTO.Task;
using WIDESEA_External.ERPService;
@@ -185,5 +188,68 @@
            }
            return content;
        }
        /// <summary>
        /// å¯ç”¨
        /// </summary>
        /// <returns></returns>
        public WebResponseContent EnableStatus(int[] keys)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_Task> tasks = BaseDal.QueryData(x => x.TaskType < TaskTypeEnum.Inbound.ObjToInt());
                List<Dt_AGVStationInfo> stationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => keys.Contains(x.Id));
                foreach (var station in stationInfos)
                {
                    Dt_Task? taskOld = tasks.FirstOrDefault(x => x.TargetAddress == station.AGVStationCode);
                    if (taskOld!=null)
                    {
                        content.Message+= $"{station.AGVStationCode}出库{taskOld.TaskNum}任务执行中;";
                        continue;
                    }
                    if (station.StationArea==StationAreaEnum.一楼暂存架.ToString())
                    {
                        Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x=>x.LocationCode==station.AGVStationCode);
                        if (stockInfo!=null)
                        {
                            content.Message += $"{station.AGVStationCode}{stockInfo.PalletCode}库存绑定;";
                            continue;
                        }
                    }
                    station.IsOccupied = WhetherEnum.False.ObjToInt();
                }
                _basicRepository.AGVStationInfoRepository.UpdateData(stationInfos);
                content.OK(content.Message.IsNullOrEmpty() ? "成功" : $"部分成功启用!{content.Message}无法启用");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ç¦ç”¨
        /// </summary>
        /// <returns></returns>
        public WebResponseContent DisableStatus(int[] keys)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_AGVStationInfo> stationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => keys.Contains(x.Id));
                stationInfos.ForEach(x =>
                {
                    x.IsOccupied = WhetherEnum.True.ObjToInt();
                });
                _basicRepository.AGVStationInfoRepository.UpdateData(stationInfos);
                content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -2,6 +2,7 @@
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing.Excel.Operators;
using SqlSugar;
using System;
using System.Collections;
@@ -51,12 +52,7 @@
                    return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
                }
                if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
                {
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_ProStockInfo stockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
@@ -98,7 +94,7 @@
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfo);
                _unitOfWorkManage.CommitTran();
                WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
@@ -216,8 +212,13 @@
                    else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.出库完成.ObjToInt() && stockInfoOld.IsPick==WhetherEnum.False.ObjToInt() && stationCode.IsNotEmptyOrNull())
                    {
                        decimal oldQty = stockInfoOld.StockLength;
                        //调用更新退料库存
                        stockInfoOld = ReturnStockUp(stockInfoOld, thickness);
                        //调用更新退料库存及上报重量
                        WebResponseContent returnContent = ReturnStockUp(stockInfoOld, thickness, weight);
                        if (!returnContent.Status)
                        {
                            throw new Exception(returnContent.Message);
                        }
                        stockInfoOld = returnContent.Data as Dt_StockInfo;
                        //更新数据
                        UpdateStock(stockInfoOld, weight, thickness, wide);
                        //记录库存变动
@@ -227,8 +228,13 @@
                    else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.老厂退料暂存.ObjToInt() && stationCode.IsNotEmptyOrNull())
                    {
                        decimal oldQty = stockInfoOld.StockLength;
                        //调用更新退料库存
                        stockInfoOld = ReturnStockUp(stockInfoOld, thickness);
                        //调用更新退料库存及上报重量
                        WebResponseContent returnContent = ReturnStockUp(stockInfoOld, thickness, weight);
                        if (!returnContent.Status)
                        {
                            throw new Exception(returnContent.Message);
                        }
                        stockInfoOld = returnContent.Data as Dt_StockInfo;
                        //更新数据
                        UpdateStock(stockInfoOld, weight, thickness, wide);
                        //记录库存变动
@@ -349,32 +355,64 @@
        /// æ›´æ–°é€€æ–™åº“å­˜
        /// </summary>
        /// <returns></returns>
        public Dt_StockInfo ReturnStockUp(Dt_StockInfo stockInfoOld,decimal thickness)
        public WebResponseContent ReturnStockUp(Dt_StockInfo stockInfoOld,decimal thickness,decimal weight)
        {
            BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(stockInfoOld.PalletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>();
            if (bSTResponse.Code == 500)
            WebResponseContent content = new WebResponseContent();
            try
            {
                throw new Exception($"未找到条码{stockInfoOld.PalletCode}一期ERP库存不存在");
            }
                BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(stockInfoOld.PalletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>();
                if (bSTResponse.Code == 500)
                {
                    throw new Exception($"未找到条码{stockInfoOld.PalletCode}一期ERP库存不存在");
                }
            BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{stockInfoOld.PalletCode}的库存信息");
            if (stockInfoOld.StockStatus == StockStatusEmun.老厂退料暂存.ObjToInt())
            {
                stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
                BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{stockInfoOld.PalletCode}的库存信息");
                if (stockInfoOld.StockStatus == StockStatusEmun.老厂退料暂存.ObjToInt())
                {
                    stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
                }
                decimal stockLength = bSTStockInfoDTO.StockMeter;
                if (weight != bSTStockInfoDTO.Qty)
                {
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == stockInfoOld.MaterielId);
                    int gramWeight = (int)(materielInfo.MaterielWeight * 1000);
                    BSTWeightUpDTO bSTWeightUpDTO = new BSTWeightUpDTO()
                    {
                        Paper_code = stockInfoOld.PalletCode,
                        Estimate_weight = bSTStockInfoDTO.Qty,
                        Actual_weight = weight,
                        Error_weight = Math.Abs(weight - bSTStockInfoDTO.Qty),
                        Weigh_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        Operator = "LiKu",
                        Width = bSTStockInfoDTO.W,
                        Gram_weight = gramWeight
                    };
                    BSTResponse<object> Response = _invokeERPService.BSTWeightUp(bSTWeightUpDTO).DeserializeObject<BSTResponse<object>>();
                    if (Response.Code != 200)
                    {
                        throw new Exception($"上报称重失败");
                    }
                    stockLength = weight / bSTStockInfoDTO.W / gramWeight * 1000000;
                }
                stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
                stockInfoOld.MaterielThickness = bSTStockInfoDTO.Thick;
                stockInfoOld.MaterielWeight = weight;
                stockInfoOld.MaterielWide = bSTStockInfoDTO.W;
                stockInfoOld.StockLength = stockLength;
                stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
                stockInfoOld.StockOutLength = 0;
                stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
                if (thickness < 400)
                {
                    throw new Exception($"RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}直径小于400mm");
                }
                content.OK("成功",data:stockInfoOld);
            }
            stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
            stockInfoOld.MaterielThickness = bSTStockInfoDTO.Thick;
            stockInfoOld.MaterielWeight = bSTStockInfoDTO.Qty;
            stockInfoOld.MaterielWide = bSTStockInfoDTO.W;
            stockInfoOld.StockLength = bSTStockInfoDTO.StockMeter;
            stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
            stockInfoOld.StockOutLength = 0;
            stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
            if (thickness < 400)
            catch (Exception ex)
            {
                throw new Exception($"RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}直径小于400mm");
                content.Error(ex.Message);
            }
            return stockInfoOld;
            return content;
        }
        public void UpdateStock(Dt_StockInfo stockInfo, decimal weight = 0, decimal thickness = 0, decimal wide = 0)
        {
@@ -820,9 +858,14 @@
                    //限制直径
                    if (stockInfo.CheckThickness >= 300 && stockInfo.CheckThickness <= 1300 && stockInfo.MaterielWide >= 690 && stockInfo.MaterielWide <= 2500)
                    {
                        bool LayerLimit = stockInfo.CheckThickness >= 1200;
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YLDual") && (stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt() ? x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt(): x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).OrderBy(x => x.RoadwayNo).ToList();
                        if (LayerLimit)
                        {
                            locationCounts = locationCounts.Where(x => x.RoadwayNo != "SC03_YLDual").ToList();
                        }
                        roadwayNo = HandleRoadway(locationCounts, warehouse);
                    }
                }
@@ -916,7 +959,7 @@
                    {
                        return content.Error($"未找到对应的终点货位信息");
                    }
                    Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.SourceAddress && ( x.StationArea == nameof(StationAreaEnum.一楼月台码头) || x.StationArea == nameof(StationAreaEnum.一楼无纺织布) || x.StationArea == nameof(StationAreaEnum.一楼无纺淋膜) || x.StationArea == nameof(StationAreaEnum.一楼无纺淋膜)));
                    Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.SourceAddress && ( x.StationArea == nameof(StationAreaEnum.一楼月台码头) || x.StationArea == nameof(StationAreaEnum.一楼无纺织布) || x.StationArea == nameof(StationAreaEnum.一楼无纺淋膜)));
                    if (agvstation != null)
                    {
                        agvstation.IsOccupied = WhetherEnum.False.ObjToInt();
@@ -973,7 +1016,7 @@
                    }
                    //获取货位信息
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    if (locationInfoEnd == null && task.TaskType!=TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
                    {
                        return content.Error($"未找到对应的终点货位信息");
                    }
@@ -985,14 +1028,25 @@
                        Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                    }
                    stockInfo.LocationCode = locationInfoEnd.LocationCode;
                    if (task.TaskType != TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
                    {
                        stockInfo.LocationCode = locationInfoEnd.LocationCode;
                    }
                    else
                    {
                        stockInfo.LocationCode = task.TargetAddress;
                    }
                    stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    if (task.TaskType!=TaskTypeEnum.Inbound.ObjToInt())
                    {
                        stockInfo.IsFull = WhetherEnum.True.ObjToInt();
                    }
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                    if (locationInfoEnd!=null)
                    {
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                    }
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                    _unitOfWorkManage.CommitTran();
                    //记录库存变动
@@ -1883,5 +1937,21 @@
            }
            return content;
        }
        public Dt_AGVStationInfo? AssignWFBStation(List<string> assignPoints)
        {
            try
            {
                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    { nameof(Dt_AGVStationInfo.Depth),OrderByType.Asc }
                };
                List<string> stockPoints = _stockRepository.StockInfoRepository.QueryData(x=>x.StockAttribute== MaterielTypeEnum.半成品.ObjToInt() && x.LocationCode.StartsWith("PNT")).Select(x=>x.LocationCode).ToList();
                return _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.StationArea == StationAreaEnum.一楼暂存架.ToString() && x.IsOccupied == WhetherEnum.False.ObjToInt() && !stockPoints.Contains(x.AGVStationCode) && !assignPoints.Contains(x.AGVStationCode), orderBy);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -299,7 +299,59 @@
            return tasks;
        }
        /// <summary>
        /// åº“存数据转出库任务(MES工单)
        /// åº“存数据转出库任务(MES工单成品)
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <returns></returns>
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, List<Dt_OutStockLockInfo> outStockLockInfos, TaskTypeEnum taskType = new TaskTypeEnum())
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            for (int i = 0; i < stockInfos.Count; i++)
            {
                Dt_ProStockInfo stockInfo = stockInfos[i];
                if (stockInfo != null)
                {
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
                    {
                        Dt_OutStockLockInfo outStockLockInfo = outStockLockInfos.FirstOrDefault(x => x.PalletCode == stockInfo.PalletCode);
                        taskType = outStockLockInfo.MachineName.ObjToInt() switch
                        {
                            (int)StationAreaEnum.二楼纸袋 or
                            (int)StationAreaEnum.二楼无纺布袋 or
                            (int)StationAreaEnum.二楼纸杯 => TaskTypeEnum.OutCarton,
                            (int)StationAreaEnum.一楼无纺织布 => TaskTypeEnum.OutWFB,
                            _ => throw new Exception($"未找到加工中心任务类型分配")
                        };
                        Dt_Task task = new()
                        {
                            CurrentAddress = stockInfo.LocationCode,
                            Grade = 0,
                            PalletCode = stockInfo.PalletCode,
                            NextAddress = "",
                            Roadway = locationInfo.RoadwayNo,
                            SourceAddress = stockInfo.LocationCode,
                            TargetAddress = "",
                            TaskStatus = TaskStatusEnum.CallPending.ObjToInt(),
                            TaskType = taskType.ObjToInt(),
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            MaterielCode = stockInfo.proStockInfoDetails?.FirstOrDefault().ProductCode ??"",
                            Quantity = stockInfo.proStockInfoDetails?.Sum(x=>x.StockQty) ?? 0,
                            OrderNo = outStockLockInfo.OrderNo,
                            DispatchPlanId = outStockLockInfo.OrderDetailId,
                            WorkCentreCode = outStockLockInfo.MakeCode
                        };
                        tasks.Add(task);
                    }
                }
            }
            return tasks;
        }
        /// <summary>
        /// åº“存数据转出库任务(MES工单原料)
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <returns></returns>
@@ -320,6 +372,7 @@
                        {
                            (int)StationAreaEnum.二楼纸袋 => TaskTypeEnum.PaperYLOutZDGL,
                            (int)StationAreaEnum.一楼印刷 => TaskTypeEnum.PrintYLOutbound,
                            (int)StationAreaEnum.一楼分切 => TaskTypeEnum.OutFenQie,
                            _ => throw new Exception($"未找到加工中心任务类型分配")
                        };
                        Dt_Task task = new()
@@ -383,7 +436,7 @@
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            MaterielCode= stockInfo.proStockInfoDetails?.FirstOrDefault().ProductCode ?? "" ,
                            Quantity = 0,
                            Quantity = stockInfo.proStockInfoDetails?.Sum(x=>x.StockQty) ?? 0,
                        };
                        tasks.Add(task);
                    }
@@ -455,6 +508,7 @@
                    nameof(StationAreaEnum.一楼分切) => TaskTypeEnum.OutFenQie,
                    nameof(StationAreaEnum.一楼模切) => TaskTypeEnum.OutMoQie,
                    nameof(StationAreaEnum.一楼冲切) => TaskTypeEnum.OutChongQie,
                    nameof(StationAreaEnum.一楼成品) => TaskTypeEnum.OutProduct,
                    nameof(StationAreaEnum.二楼纸袋) or 
                    nameof(StationAreaEnum.二楼无纺布袋) or 
                    nameof(StationAreaEnum.二楼纸杯) => TaskTypeEnum.OutCarton,
@@ -897,54 +951,98 @@
                //操作数据,并分配需求库存
                _outboundRepository.OutMESOrderRepository.AddData(AddoutMESOrders);
                List<Dt_OutMESOrder> mESOrders = _outboundRepository.OutMESOrderRepository.QueryData(x => AddoutMESOrders.Select(x => x.OutDetailId).Contains(x.OutDetailId));
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<Dt_StockInfo>? stockInfos = null;
                List<Dt_OutMESOrder>? Orders = null;
                List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                List<Dt_LocationInfo>? locationInfos = null;
                {
                    //分配库存
                    (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignStockOutbound(mESOrders);
                    if (result.Item1 != null && result.Item1.Count > 0)
                    List<Dt_Task> tasks = new List<Dt_Task>();
                    List<Dt_ProStockInfo>? stockInfos = null;
                    List<Dt_OutMESOrder>? Orders = null;
                    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                    List<Dt_LocationInfo>? locationInfos = null;
                    {
                        //创建任务
                        tasks = GetTasks(result.Item1, result.Item3);
                        result.Item2.ForEach(x =>
                        if (mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()).ToList().Count>0)
                        {
                            OutOrderStatusEnum.出库中.ObjToInt();
                        });
                        result.Item3.ForEach(x =>
                        {
                            x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                        });
                            //分配库存
                            (List<Dt_ProStockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignProStockOutbound(mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()).ToList());
                            if (result.Item1 != null && result.Item1.Count > 0)
                            {
                                //创建任务
                                tasks = GetTasks(result.Item1, result.Item3);
                                result.Item2.ForEach(x =>
                                {
                                    OutOrderStatusEnum.出库中.ObjToInt();
                                });
                                result.Item3.ForEach(x =>
                                {
                                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                                });
                        stockInfos = result.Item1;
                        Orders = result.Item2;
                        outStockLockInfos = result.Item3;
                        locationInfos = result.Item4;
                                stockInfos = result.Item1;
                                Orders = result.Item2;
                                outStockLockInfos = result.Item3;
                                locationInfos = result.Item4;
                            }
                        }
                    }
                    else
                    if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0 && tasks.Count>0)
                    {
                        throw new Exception("无库存");
                        BaseDal.AddData(tasks);
                        stockInfos.ForEach(x =>
                        {
                            x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                        });
                        WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
                        if (!contentResponse.Status)
                        {
                            _unitOfWorkManage.RollbackTran();
                            return content.Error(contentResponse.Message);
                        }
                    }
                }
                int id = BaseDal.AddData(tasks);
                if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                {
                    stockInfos.ForEach(x =>
                    List<Dt_Task> tasks = new List<Dt_Task>();
                    List<Dt_StockInfo>? stockInfos = null;
                    List<Dt_OutMESOrder>? Orders = null;
                    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                    List<Dt_LocationInfo>? locationInfos = null;
                    {
                        x.StockStatus=StockStatusEmun.出库锁定.ObjToInt();
                    });
                    WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
                    if (!contentResponse.Status)
                        if (mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt()).ToList().Count > 0)
                        {
                            //分配库存
                            (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignStockOutbound(mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt()).ToList());
                            if (result.Item1 != null && result.Item1.Count > 0)
                            {
                                //创建任务
                                tasks = GetTasks(result.Item1, result.Item3);
                                result.Item2.ForEach(x =>
                                {
                                    OutOrderStatusEnum.出库中.ObjToInt();
                                });
                                result.Item3.ForEach(x =>
                                {
                                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                                });
                                stockInfos = result.Item1;
                                Orders = result.Item2;
                                outStockLockInfos = result.Item3;
                                locationInfos = result.Item4;
                            }
                        }
                    }
                    if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0 && tasks.Count>0)
                    {
                        _unitOfWorkManage.RollbackTran();
                        return content.Error(contentResponse.Message);
                        BaseDal.AddData(tasks);
                        stockInfos.ForEach(x =>
                        {
                            x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                        });
                        WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
                        if (!contentResponse.Status)
                        {
                            _unitOfWorkManage.RollbackTran();
                            return content.Error(contentResponse.Message);
                        }
                    }
                }
                _unitOfWorkManage.CommitTran();
                
                return content.OK("接收成功");
@@ -955,5 +1053,56 @@
            }
            return content;
        }
        /// <summary>
        /// ç©ºæ‰˜å ç›˜å‡ºåº“
        /// </summary>
        /// <returns></returns>
        public WebResponseContent PlateOutbound(string stationCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有月台出库任务
                Dt_Task TasksOut = BaseDal.QueryFirst(x => x.TaskType == TaskTypeEnum.OutEmptyPlate.ObjToInt());
                if (TasksOut != null)
                    throw new Exception($"任务已存在");
                //获取货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
                Dt_ProStockInfo? stockInfo = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Select(x => x.LocationCode).Contains(x.LocationCode) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.ProStockAttribute == ProStockAttributeEnum.空托.ObjToInt()).OrderBy(x => x.CreateDate).ToList().FirstOrDefault() ?? throw new Exception($"库存空托数量不足");
                Dt_LocationInfo locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
                stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                TaskTypeEnum typeEnum = TaskTypeEnum.OutEmptyPlate;
                List<Dt_Task> tasks = GetTasks(new List<Dt_ProStockInfo>() { stockInfo }, typeEnum, new List<Dt_LocationInfo>() { locationInfo });
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
                }
                tasks.ForEach(x =>
                {
                    x.TargetAddress = stationCode;
                });
                //判断是否有出库单信息
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfo);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(new List<Dt_LocationInfo>() { locationInfo }, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(new List<Dt_LocationInfo>() { locationInfo }, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -300,5 +300,31 @@
        {
            return Service.PrintInbound(saveModel);
        }
        /// <summary>
        /// ç©ºæ‰˜å ç›˜å‡ºåº“
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("PlateOutbound"), AllowAnonymous]
        public WebResponseContent PlateOutbound(string stationCode)
        {
            return Service.PlateOutbound(stationCode);
        }
        /// <summary>
        /// å¯ç”¨AGV站点
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("EnableStatus")]
        public WebResponseContent EnableStatus([FromBody] int[] keys)
        {
            return Service.EnableStatus(keys);
        }
        [HttpPost, HttpGet, Route("DisableStatus")]
        public WebResponseContent DisableStatus([FromBody] int[] keys)
        {
            return Service.DisableStatus(keys);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs
@@ -52,7 +52,7 @@
            //成品半成品实体转换
            CreateMap<MESProInDTO, Dt_MESProInOrderInfo>().ForMember(x => x.MESProInStatus, b => b.MapFrom(b => InOrderStatusEnum.未开始.ObjToInt()));
            //二期ERP物料接收实体转换
            CreateMap<ERPMaterialDTO, Dt_MaterielInfo>().ForMember(x => x.MaterielInvOrgId, b => b.MapFrom(b => MaterielInvOrgEnum.新厂.ObjToInt())).ForMember(x => x.MaterielCode, b => b.MapFrom(b => b.MaterielNo)).ForMember(x => x.MaterielSourceType, b => b.MapFrom(b => b.MaterielType)).ForMember(x => x.MaterielWide, b => b.MapFrom(b => b.MaterielWidth)).ForMember(x => x.MaterielWeight, b => b.MapFrom(b => b.Weight)).ForMember(x => x.MaterielState, b => b.MapFrom(b => b.State)).ForMember(x => x.MaterielUnit, b => b.MapFrom(b => b.Unit)).ForMember(x => x.MaterielSpec, b => b.MapFrom(b => b.MaterielSpec));
            CreateMap<ERPMaterialDTO, Dt_MaterielInfo>().ForMember(x => x.MaterielInvOrgId, b => b.MapFrom(b => MaterielInvOrgEnum.新厂.ObjToInt())).ForMember(x => x.MaterielCode, b => b.MapFrom(b => b.MaterielNo)).ForMember(x => x.MaterielSourceType, b => b.MapFrom(b => b.MaterielType)).ForMember(x => x.MaterielWide, b => b.MapFrom(b => b.MaterielWidth)).ForMember(x => x.MaterielWeight, b => b.MapFrom(b => b.Weight.IsNullOrEmpty()? 0: Convert.ToDecimal(b.Weight))).ForMember(x => x.MaterielState, b => b.MapFrom(b => b.State)).ForMember(x => x.MaterielUnit, b => b.MapFrom(b => b.Unit)).ForMember(x => x.MaterielSpec, b => b.MapFrom(b => b.MaterielSpec));
            //博思通缓存采购转换
            CreateMap<Dt_PurchaseBSTOrderDetail, Dt_YLInboundCache>().ForMember(x => x.Id, b => b.MapFrom(b => 0)).ForMember(x => x.BindStatus, b => b.MapFrom(b => WhetherEnum.False.ObjToInt())).ForMember(x => x.RfidCode, b => b.MapFrom(b => "")).ForMember(x => x.InvOrg, b => b.MapFrom(b => MaterielInvOrgEnum.老厂.ToString()));
            //二期ERP供应商转换
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ERP Ô­Ö½ÖØÁ¿ÐÞÕý½Ó¿Ú¶Ô½ÓÎĵµ.docx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/RCSÈ¡»õ·Å»õÍê³ÉÐźÅ.docx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÎïÁÏ¿ËÖØ²éѯ API ½Ó¿ÚÎĵµ.pdf
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬÁϼÜDB¿éÊý¾Ý.zip
Binary files differ