已修改55个文件
已重命名4个文件
已删除9个文件
已添加30个文件
4524 ■■■■■ 文件已修改
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/package-lock.json 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/api/http.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/extension/PackInfo/packaxis.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/router/viewGird.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/PackInfo/packaxis.vue 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json 154 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json 155 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Common/Utilities/ImportExcelHelper.cs 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_PackInfoService/Dt_PackaxisService.cs 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/PackInfo/PackaxisController.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/appsettings.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/ConveyorLineJob_YL1ndFloor.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/extend/SelectedStock.vue 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/extend/outOrderDetail.vue 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/outBSTOrder.js 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/outBSTOrderDetail.js 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/outboundOrderDetail_Hty.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/outboundOrder_Hty.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/router/viewGird.js 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/basic/materielInfo.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/outbound/outBSTOrder.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/outbound/outBSTOrderDetail.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/outbound/outboundOrder.vue 371 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/outbound/outboundOrder_Hty.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/stock/ProStockView.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/stock/stockInfo.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicRepository/BasicRepository.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/APIEnum/APIEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/MaterielEnum/MaterialMenu.cs 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/MaterielEnum/MaterielInvOrgEnum.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/MaterielEnum/MaterielTypeEnum.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/OrderEnum/OutboundOrderMenu.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/WareHouseEnum/WarehouseEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/BaseModels/PageDataOptions.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/CodeConfigEnum/RuleCodeEnum.cs 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/Const/HtmlElementType.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/Helper/UtilConvert.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Basic/BSTMaterialDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTOutOrderDTO.cs 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Stock/ProStockViewDTO.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/ERPService/InvokeERPService.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/IERPService/IInvokeERPService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/BSTPurchaseUpModel.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/BSTResponse.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IBasicRepository/IBasicRepository.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutBSTOrderDetailRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutBSTOrderRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutStockLockInfoRepository.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutBSTOrderDetailService.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutBSTOrderService.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutStockLockInfoService.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IStockRepository/IStockInfoRepository.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IStockService/IStockInfoService.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/PurchaseBSTOrderService.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutBSTOrder.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutBSTOrderDetail.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Stock/Dt_ProStockInfoDetail.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/WIDESEA_Model.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundRepository/OutBSTOrderDetailRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundRepository/OutBSTOrderRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundRepository/OutStockLockInfoRepository.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderDetailService.cs 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderService.cs 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutStockLockInfoService.cs 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockRepository/StockInfoRepository.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/ProStockViewService.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_SystemService/Sys_DictionaryService.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutBSTOrderController.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutBSTOrderDetailController.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutStockLockInfoController.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Program.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/MES.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/一期BSTERP需求字段.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/博思通利拓接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/安全申请RCS-WCS-20250729.docx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利得-MES、ERP、WMS接口清单.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利得ERP&WMS接口清单.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利得MES接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/原纸残卷巷道库位数据.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/龙利得软件计划表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -266,3 +266,4 @@
/项目代码/WMS/WMSServices/.vs/WIDESEA_WMSServer/CopilotIndices/17.13.441.19478/CodeChunks.db
/项目代码/WMS/WMSServices/.vs/WIDESEA_WMSServer/CopilotIndices/17.13.441.19478/SemanticSymbols.db
/项目代码/WCS/WCSServices/.vs/WIDESEAWCS_Server/CopilotIndices/17.13.441.19478/CodeChunks.db
/项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/FakesAssemblies/WIDESEAWCS_PackInfoService.Fakes.dll
ÏîÄ¿´úÂë/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.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": {
@@ -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.npmjs.org/@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/WCSClient/src/api/http.js
@@ -12,8 +12,8 @@
let loadingInstance;
let loadingStatus = false;
if (process.env.NODE_ENV == 'development') {
    // axios.defaults.baseURL = 'http://127.0.0.1:9281/';
    axios.defaults.baseURL = 'http://192.168.35.3:9281/';
    axios.defaults.baseURL = 'http://127.0.0.1:9291/';
    // axios.defaults.baseURL = 'http://192.168.35.3:9281/';
}
else if (process.env.NODE_ENV == 'debug') {
    axios.defaults.baseURL = 'http://127.0.0.1:8098/';
ÏîÄ¿´úÂë/WCS/WCSClient/src/extension/PackInfo/packaxis.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
let extension = {
    components: {
        //查询界面扩展组件
        gridHeader: '',
        gridBody: '',
        gridFooter: '',
        //新建、编辑弹出框扩展组件
        modelHeader: '',
        modelBody: '',
        modelFooter: ''
    },
    tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
    buttons: { view: [], box: [], detail: [] }, //扩展的按钮
    methods: {
        //下面这些方法可以保留也可以删除
        onInit() {
            // this.$Notice.success({ title: this.detailOptions.cnName + ',查询结果', desc: '返回的对象:' + JSON.stringify(data) });
        },
        onInited() {
            //框架初始化配置后
            //如果要配置明细表,在此方法操作
            //this.detailOptions.columns.forEach(column=>{ });
        },
        searchBefore(param) {
            //界面查询前,可以给param.wheres添加查询参数
            //返回false,则不会执行查询
            return true;
        },
        searchAfter(result) {
            //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
            return true;
        },
        addBefore(formData) {
            //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
            return true;
        },
        updateBefore(formData) {
            //编辑保存前formData为对象,包括明细表、删除行的Id
            return true;
        },
        rowClick({ row, column, event }) {
            //查询界面点击行事件
            // this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
        },
        modelOpenAfter(row) {
            //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
            //(1)判断是编辑还是新建操作: this.currentAction=='Add';
            //(2)给弹出框设置默认值
            //(3)this.editFormFields.字段='xxx';
            //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
            //看不懂就把输出看:console.log(this.editFormOptions)
        }
    }
};
export default extension;
ÏîÄ¿´úÂë/WCS/WCSClient/src/router/viewGird.js
@@ -57,6 +57,10 @@
    path: '/router',
    name: 'router',
    component: () => import('@/views/basicinfo/router.vue')
  }, {
    path: '/packaxis',
    name: 'packaxis',
    component: () => import('@/views/PackInfo/packaxis.vue')
  }]
export default viewgird
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/PackInfo/packaxis.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,216 @@
<template>
  <view-grid
    ref="grid"
    :columns="columns"
    :detail="detail"
    :editFormFields="editFormFields"
    :editFormOptions="editFormOptions"
    :searchFormFields="searchFormFields"
    :searchFormOptions="searchFormOptions"
    :table="table"
    :extend="extend"
  >
  </view-grid>
</template>
  <script>
import extend from "@/extension/PackInfo/packaxis.js";
import { ref, defineComponent } from "vue";
export default defineComponent({
  setup() {
    const table = ref({
      key: "id",
      footer: "Foots",
      cnName: "码垛坐标信息",
      name: "Packaxis",
      url: "/Packaxis/",
      sortName: "CreateDate",
    });
    const editFormFields = ref({});
    const editFormOptions = ref([]);
    const searchFormFields = ref({
    });
    const searchFormOptions = ref([
      [
        { title: "任务号", field: "taskNum", type: "int" },
        { title: "托盘编号", field: "palletCode", type: "like" },
        {
          title: "任务类型",
          field: "taskType",
          type: "selectList",
          dataKey: "taskType",
          data: [],
        },
        {
          title: "任务状态",
          field: "taskState",
          type: "selectList",
          dataKey: "taskState",
          data: [],
        },
      ],
      [
        { title: "起始地址", field: "sourceAddress", type: "like" },
        { title: "目标地址", field: "targetAddress", type: "like" },
        { title: "当前位置", field: "currentAddress", type: "like" },
        { title: "下一位置", field: "nextAddress", type: "like" },
      ],
      [
        { title: "巷道号", field: "roadway", type: "like", type: "select",dataKey: "Stacker",data: [],},
        { title: "创建人", field: "creater", type: "like" },
        { title: "创建时间", field: "createDate", type: "datetime" },
      ],
    ]);
    const columns = ref([
      {
        field: "id",
        title: "id",
        type: "int",
        width: 90,
        hidden: true,
        readonly: true,
        require: true,
        align: "left",
      },
      {
        field: "deviceCode",
        title: "设备编号",
        type: "int",
        width: 90,
        align: "left",
      },
      {
        field: "stationCode",
        title: "工位号",
        type: "string",
        width: 200,
        align: "left",
      },
      {
        field: "packType",
        title: "垛型",
        type: "string",
        width: 150,
        align: "left",
      },
      {
        field: "packNum",
        title: "码垛数量",
        type: "int",
        width: 130,
        align: "left",
      },
      {
        field: "axisX",
        title: "X坐标",
        type: "int",
        width: 150,
        align: "left",
      },
      {
        field: "axisXCount",
        title: "X坐标码垛个数",
        type: "int",
        width: 120,
        align: "left",
      },
      {
        field: "axisXSpacing",
        title: "X坐标码垛间距",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "axisY",
        title: "Y坐标",
        type: "int",
        width: 150,
        align: "left",
      },
      {
        field: "axisYCount",
        title: "Y坐标码垛个数",
        type: "int",
        width: 120,
        align: "left",
      },
      {
        field: "axisYSpacing",
        title: "Y坐标码垛间距",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "axisZ",
        title: "Z坐标",
        type: "int",
        width: 150,
        align: "left",
      },
      {
        field: "axisZCount",
        title: "Z坐标码垛个数",
        type: "int",
        width: 120,
        align: "left",
      },
      {
        field: "axisZSpacing",
        title: "Z坐标码垛间距",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "creater",
        title: "创建人",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "createDate",
        title: "创建时间",
        type: "datetime",
        width: 150,
        align: "left",
      },
      {
        field: "modifier",
        title: "修改人",
        type: "string",
        width: 100,
        align: "left",
      },
      {
        field: "modifyDate",
        title: "修改时间",
        type: "datetime",
        width: 160,
        align: "left",
      },
    ]);
    const detail = ref({
      cnName: "",
      table: "",
      columns: [],
      sortName: "",
      key: "",
    });
    return {
      table,
      extend,
      editFormFields,
      editFormOptions,
      searchFormFields,
      searchFormOptions,
      columns,
      detail,
    };
  },
});
</script>
ÏîÄ¿´úÂë/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
@@ -3,40 +3,12 @@
  "WorkspaceRootPath": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_model\\models\\packinfo\\dt_packaxis.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\packinfo\\dt_packaxis.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl1ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl1ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_model\\models\\basicinfo\\dt_apiinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\basicinfo\\dt_apiinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\rgvjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\rgvjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\conveyorlinejob_cpc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\conveyorlinejob_cpc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
      "AbsoluteMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|solutionrelative:wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -46,7 +18,7 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 10,
          "SelectedChildIndex": 2,
          "Children": [
            {
              "$type": "Bookmark",
@@ -58,114 +30,28 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "ConveyorLineJob_YL1ndFloor.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "ViewState": "AgIAAG4AAAAAAAAAAAAQwIkAAABoAAAAAAAAAA==",
              "DocumentIndex": 0,
              "Title": "ImportExcelHelper.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ViewState": "AgIAAFQAAAAAAAAAAAAQwAsBAAAJAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-30T07:16:03.123Z",
              "WhenOpened": "2025-08-31T01:25:32.766Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "Dt_ApiInfo.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "ViewState": "AgIAABEAAAAAAAAAAAAxwCoAAAAFAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T08:39:38.773Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "Dt_Task.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ViewState": "AgIAABIAAAAAAAAAAAAAAB0AAABFAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T08:39:25.012Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "Dt_Packaxis.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "ViewState": "AgIAABUAAAAAAAAAAAAlwCkAAAASAAAAAAAAAA==",
              "Title": "Dt_PackaxisService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs*",
              "RelativeToolTip": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs*",
              "ViewState": "AgIAACQAAAAAAAAAAAAUwDoAAAAwAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T08:39:16.544Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "ConveyorLineJob_CPC.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "ViewState": "AgIAAEgAAAAAAAAAAAAkwEoAAAAUAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T07:57:43.158Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "RGVJob_CP.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "ViewState": "AgIAAFYAAAAAAAAAAAAqwEoAAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T07:52:50.611Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "RequestInbound.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T06:39:10.96Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\appsettings.json",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeToolTip": "WIDESEAWCS_Server\\appsettings.json",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvxAAAABgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
              "WhenOpened": "2025-08-29T06:03:36.387Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "MDJob_CP.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ViewState": "AgIAAFgAAAAAAAAAAAAswGoAAADNAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T05:53:11.231Z",
              "WhenOpened": "2025-08-31T01:15:08.521Z",
              "EditorCaption": ""
            }
          ]
ÏîÄ¿´úÂë/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
@@ -3,40 +3,16 @@
  "WorkspaceRootPath": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|solutionrelative:wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_model\\models\\packinfo\\dt_packaxis.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\packinfo\\dt_packaxis.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl1ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl1ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_model\\models\\basicinfo\\dt_apiinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\basicinfo\\dt_apiinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9D2AC22C-9A86-41AE-AA02-553554A7B1D7}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\rgvjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\rgvjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\conveyorlinejob_cpc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\conveyorlinejob_cpc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -46,7 +22,7 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 10,
          "SelectedChildIndex": 4,
          "Children": [
            {
              "$type": "Bookmark",
@@ -58,114 +34,41 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "ConveyorLineJob_YL1ndFloor.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL1ndFloor.cs",
              "ViewState": "AgIAAG4AAAAAAAAAAAAQwIkAAABoAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-30T07:16:03.123Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "Dt_ApiInfo.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\BasicInfo\\Dt_ApiInfo.cs",
              "ViewState": "AgIAABEAAAAAAAAAAAAxwCoAAAAFAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T08:39:38.773Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "Dt_Task.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ViewState": "AgIAABIAAAAAAAAAAAAAAB0AAABFAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T08:39:25.012Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "Dt_Packaxis.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\PackInfo\\Dt_Packaxis.cs",
              "ViewState": "AgIAABUAAAAAAAAAAAAlwCkAAAASAAAAAAAAAA==",
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAAAoBAAAAAAAAAAAgwO0AAAA7AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T08:39:16.544Z",
              "WhenOpened": "2025-08-31T02:17:00.82Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "ConveyorLineJob_CPC.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\ConveyorLineJob_CPC.cs",
              "ViewState": "AgIAAEgAAAAAAAAAAAAkwEoAAAAUAAAAAAAAAA==",
              "DocumentIndex": 2,
              "Title": "ImportExcelHelper.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ViewState": "AgIAAFQAAAAAAAAAAAAQwAsBAAAJAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T07:57:43.158Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "RGVJob_CP.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\RGVJob_CP.cs",
              "ViewState": "AgIAAFYAAAAAAAAAAAAqwEoAAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T07:52:50.611Z",
              "WhenOpened": "2025-08-31T01:25:32.766Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "RequestInbound.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\Task\\RequestInbound.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T06:39:10.96Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\appsettings.json",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeToolTip": "WIDESEAWCS_Server\\appsettings.json",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvxAAAABgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
              "WhenOpened": "2025-08-29T06:03:36.387Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "MDJob_CP.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ViewState": "AgIAAEAAAAAAAAAAAAAqwFcAAAAYAAAAAAAAAA==",
              "Title": "Dt_PackaxisService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "RelativeToolTip": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "ViewState": "AgIAAG0AAAAAAAAAAAAUwIQAAAAtAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-29T05:53:11.231Z",
              "WhenOpened": "2025-08-31T01:15:08.521Z",
              "EditorCaption": ""
            }
          ]
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/Utilities/ImportExcelHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,291 @@
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Common.Utilities
{
    public class ImportExcelHelper : IDisposable
    {
        private string fileName = null; //文件名
        private IWorkbook workbook = null;
        private FileStream fs = null;
        private bool disposed;
        public ImportExcelHelper(string fileName)
        {
            this.fileName = fileName;
            disposed = false;
        }
        /// <summary>
        /// å°†DataTable数据导入到excel中
        /// </summary>
        /// <param name="data">要导入的数据</param>
        /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
        /// <param name="sheetName">要导入的excel的sheet的名称</param>
        /// <returns>导入数据行数(包含列名那一行)</returns>
        public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)
        {
            int i = 0;
            int j = 0;
            int count = 0;
            ISheet sheet = null;
            fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            if (fileName.IndexOf(".xlsx") > 0) // 2007版本
                workbook = new XSSFWorkbook();
            else if (fileName.IndexOf(".xls") > 0) // 2003版本
                workbook = new HSSFWorkbook();
            try
            {
                if (workbook != null)
                {
                    sheet = workbook.CreateSheet(sheetName);
                }
                else
                {
                    return -1;
                }
                if (isColumnWritten == true) //写入DataTable的列名
                {
                    IRow row = sheet.CreateRow(0);
                    for (j = 0; j < data.Columns.Count; ++j)
                    {
                        row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
                    }
                    count = 1;
                }
                else
                {
                    count = 0;
                }
                for (i = 0; i < data.Rows.Count; ++i)
                {
                    IRow row = sheet.CreateRow(count);
                    for (j = 0; j < data.Columns.Count; ++j)
                    {
                        row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                    }
                    ++count;
                }
                workbook.Write(fs, true); //写入到excel
                return count;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return -1;
            }
        }
        /// <summary>
        /// å°†excel中的数据导入到DataTable中
        /// </summary>
        /// <param name="sheetName">excel工作薄sheet的名称</param>
        /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
        /// <returns>返回的DataTable</returns>
        //public DataTable ExcelToDataTable(string sheetName = null, bool isFirstRowColumn = true)
        //{
        //    ISheet sheet = null;
        //    DataTable data = new DataTable();
        //    int startRow = 0;
        //    try
        //    {
        //        fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        //        if (fileName.IndexOf(".xlsx") > 0) // 2007版本
        //            workbook = new XSSFWorkbook(fs);
        //        else if (fileName.IndexOf(".xls") > 0) // 2003版本
        //            workbook = new HSSFWorkbook(fs);
        //        if (sheetName != null)
        //        {
        //            sheet = workbook.GetSheet("Sheet1");
        //        }
        //        else
        //        {
        //            sheet = workbook.GetSheetAt(0);
        //        }
        //        if (sheet != null)
        //        {
        //            IRow firstRow = sheet.GetRow(0);
        //            int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 å³æ€»çš„列数
        //            if (isFirstRowColumn)
        //            {
        //                for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
        //                {
        //                    DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);
        //                    data.Columns.Add(column);
        //                }
        //                startRow = sheet.FirstRowNum + 1;
        //            }
        //            else
        //            {
        //                startRow = sheet.FirstRowNum;
        //            }
        //            //最后一列的标号
        //            int rowCount = sheet.LastRowNum;
        //            for (int i = startRow; i <= rowCount; ++i)
        //            {
        //                IRow row = sheet.GetRow(i);
        //                if (row == null) continue; //没有数据的行默认是null       
        //                DataRow dataRow = data.NewRow();
        //                for (int j = row.FirstCellNum; j < cellCount; ++j)
        //                {
        //                    if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
        //                        dataRow[j] = row.GetCell(j).ToString();
        //                }
        //                data.Rows.Add(dataRow);
        //            }
        //        }
        //        return data;
        //    }
        //    catch (Exception ex)
        //    {
        //        Console.WriteLine("Exception: " + ex.Message);
        //        return null;
        //    }
        //}
        public DataTable ExcelToDataTable(string sheetName = null, bool isFirstRowColumn = true)
        {
            ISheet sheet = null;
            DataTable data = new DataTable();
            int startRow = 0;
            try
            {
                using (fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    if (fileName.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) > 0)
                        workbook = new XSSFWorkbook(fs);
                    else if (fileName.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) > 0)
                        workbook = new HSSFWorkbook(fs);
                    // ä¿®å¤sheet选择逻辑
                    if (!string.IsNullOrEmpty(sheetName))
                    {
                        sheet = workbook.GetSheet(sheetName);  // ä½¿ç”¨ä¼ å…¥çš„sheetName
                    }
                    else
                    {
                        sheet = workbook.GetSheetAt(0);  // é»˜è®¤ç¬¬ä¸€ä¸ªsheet
                    }
                    if (sheet == null)
                    {
                        Console.WriteLine("未找到指定的工作表");
                        return null;
                    }
                    IRow firstRow = sheet.GetRow(0);
                    if (firstRow == null)
                    {
                        Console.WriteLine("工作表为空");
                        return null;
                    }
                    int cellCount = firstRow.LastCellNum;
                    if (isFirstRowColumn)
                    {
                        for (int i = firstRow.FirstCellNum; i < cellCount; i++)
                        {
                            ICell cell = firstRow.GetCell(i);
                            string columnName = (cell != null) ? cell.ToString() : $"Column{i}";
                            data.Columns.Add(columnName);
                        }
                        startRow = 1;  // ä»Žç¬¬äºŒè¡Œå¼€å§‹ï¼ˆè·³è¿‡æ ‡é¢˜è¡Œï¼‰
                    }
                    else
                    {
                        for (int i = 0; i < cellCount; i++)
                        {
                            data.Columns.Add($"Column{i}");
                        }
                        startRow = 0;
                    }
                    // è¯»å–数据行
                    for (int i = startRow; i <= sheet.LastRowNum; i++)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue;
                        DataRow dataRow = data.NewRow();
                        for (int j = 0; j < cellCount; j++)
                        {
                            ICell cell = row.GetCell(j);
                            if (cell != null)
                            {
                                // æ ¹æ®å•元格类型正确处理数据
                                switch (cell.CellType)
                                {
                                    case CellType.String:
                                        dataRow[j] = cell.StringCellValue;
                                        break;
                                    case CellType.Numeric:
                                        if (DateUtil.IsCellDateFormatted(cell))
                                            dataRow[j] = cell.DateCellValue;
                                        else
                                            dataRow[j] = cell.NumericCellValue;
                                        break;
                                    case CellType.Boolean:
                                        dataRow[j] = cell.BooleanCellValue;
                                        break;
                                    case CellType.Formula:
                                        dataRow[j] = cell.ToString(); // æˆ–者处理公式结果
                                        break;
                                    default:
                                        dataRow[j] = cell.ToString();
                                        break;
                                }
                            }
                        }
                        data.Rows.Add(dataRow);
                    }
                }
                return data;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"读取Excel异常: {ex.Message}");
                return null;
            }
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    if (fs != null)
                        fs.Close();
                }
                fs = null;
                disposed = true;
            }
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
@@ -6,4 +6,8 @@
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="NPOI" Version="2.7.4" />
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -73,6 +73,13 @@
        /// <returns></returns>
        WebResponseContent RequestYLWMSTaskSimple(string palletCode, string sourceAddress, int taskNum = 0);
        /// <summary>
        /// å…¥åº“申请
        /// </summary>
        /// <param name="palletCode">条码</param>
        /// <returns></returns>
        WebResponseContent YLPurchaseBoxing(string palletCode);
        WebResponseContent AssignCPRoadwayNo();
        // <summary>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_PackInfoService/Dt_PackaxisService.cs
@@ -1,11 +1,21 @@
using System;
using Magicodes.ExporterAndImporter.Excel.Utility;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
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;
namespace WIDESEAWCS_PackInfoService
{
@@ -14,5 +24,118 @@
        public Dt_PackaxisService(IDt_PackaxisRepository BaseDal) : base(BaseDal)
        {
        }
        public override WebResponseContent Import(List<IFormFile> files)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                // 1. éªŒè¯æ–‡ä»¶
                if (files == null || files.Count == 0)
                    return new WebResponseContent { Status = false, Message = "请选择上传的文件" };
                var formFile = files[0];
                // 2. å‡†å¤‡ç›®å½•(使用Path.Combine)
                var dicPath = Path.Combine(
                    AppDomain.CurrentDomain.BaseDirectory,
                    "ExcelImport",
                    DateTime.Now.ToString("yyyyMMdd"),
                    typeof(Dt_Packaxis).Name);
                Directory.CreateDirectory(dicPath);
                // 3. ä¿å­˜ä¸Šä¼ æ–‡ä»¶
                var fileName = $"{Guid.NewGuid()}_{formFile.FileName}";
                var fullPath = Path.Combine(dicPath, fileName);
                using (var stream = new FileStream(fullPath, FileMode.Create))
                {
                    formFile.CopyToAsync(stream);
                }
                // 4. å¯¼å…¥Excel数据
                DataTable dtExcel = new DataTable();
                using (ImportExcelHelper excelHelper = new ImportExcelHelper(fullPath))
                {
                    dtExcel = excelHelper.ExcelToDataTable();
                }
                List<Dt_Packaxis> addAxis = new List<Dt_Packaxis>();
                List<Dt_Packaxis> updateAxis = new List<Dt_Packaxis>();
                if (dtExcel == null || dtExcel.Rows.Count == 0)
                {
                    return content.Error("未找到数据请检查Excel表格数据格式是否正确!");
                }
                for (int i = 0; i < dtExcel.Rows.Count; i++)
                {
                    DataRow row = dtExcel.Rows[i];
                    string id = row["id"]?.ToString() ?? string.Empty;
                    string DeviceCode = row["DeviceCode"]?.ToString() ?? string.Empty;
                    string StationCode = row["StationCode"]?.ToString() ?? string.Empty;
                    string PackType = row["PackType"]?.ToString() ?? string.Empty;
                    string PackNum = row["PackNum"]?.ToString() ?? string.Empty;
                    string AxisX = row["AxisX"]?.ToString() ?? string.Empty;
                    string AxisXCount = row["AxisXCount"]?.ToString() ?? string.Empty;
                    string AxisXSpacing = row["AxisXSpacing"]?.ToString() ?? string.Empty;
                    string AxisY = row["AxisY"]?.ToString() ?? string.Empty;
                    string AxisYCount = row["AxisYCount"]?.ToString() ?? string.Empty;
                    string AxisYSpacing = row["AxisYSpacing"]?.ToString() ?? string.Empty;
                    string AxisZ = row["AxisZ"]?.ToString() ?? string.Empty;
                    string AxisZCount = row["AxisZCount"]?.ToString() ?? string.Empty;
                    string AxisZSpacing = row["AxisZSpacing"]?.ToString() ?? string.Empty;
                    var axis = BaseDal.QueryFirst(x => x.DeviceCode == DeviceCode && x.StationCode == Convert.ToInt32(StationCode) && x.PackType == PackType);
                    if(axis == null)
                    {
                        Dt_Packaxis packaxis = new Dt_Packaxis()
                        {
                            DeviceCode = DeviceCode,
                            StationCode = Convert.ToInt32(StationCode),
                            PackType = PackType,
                            PackNum = Convert.ToInt32(PackNum),
                            AxisX = Convert.ToInt32(AxisX),
                            AxisXCount = Convert.ToInt32(AxisXCount),
                            AxisXSpacing = Convert.ToInt32(AxisXSpacing),
                            AxisY = Convert.ToInt32(AxisY),
                            AxisYCount = Convert.ToInt32(AxisYCount),
                            AxisYSpacing = Convert.ToInt32(AxisYSpacing),
                            AxisZ = Convert.ToInt32(AxisZ),
                            AxisZCount = Convert.ToInt32(AxisZCount),
                            AxisZSpacing = Convert.ToInt32(AxisZSpacing),
                            Creater = App.User.UserId > 0 ? App.User.UserName : "System",
                            CreateDate = DateTime.Now
                        };
                        addAxis.Add(packaxis);
                    }
                    else
                    {
                        axis.DeviceCode = DeviceCode;
                        axis.StationCode = Convert.ToInt32(StationCode);
                        axis.PackType = PackType;
                        axis.PackNum = Convert.ToInt32(PackNum);
                        axis.AxisX = Convert.ToInt32(AxisX);
                        axis.AxisXCount = Convert.ToInt32(AxisXCount);
                        axis.AxisXSpacing = Convert.ToInt32(AxisXSpacing);
                        axis.AxisY = Convert.ToInt32(AxisY);
                        axis.AxisYCount = Convert.ToInt32(AxisYCount);
                        axis.AxisYSpacing = Convert.ToInt32(AxisYSpacing);
                        axis.AxisZ = Convert.ToInt32(AxisZ);
                        axis.AxisZCount = Convert.ToInt32(AxisZCount);
                        axis.AxisZSpacing = Convert.ToInt32(AxisZSpacing);
                        axis.Modifier = App.User.UserId > 0 ? App.User.UserName : "System";
                        axis.ModifyDate = DateTime.Now;
                        updateAxis.Add(axis);
                    }
                }
                BaseDal.AddData(addAxis);
                BaseDal.UpdateData(updateAxis);
                content = WebResponseContent.Instance.OK("导入成功!");
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/PackInfo/PackaxisController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
using HslCommunication.WebSocket;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseController;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.PackInfo;
using WIDESEAWCS_PackInfoService;
using WIDESEAWCS_Tasks;
namespace WIDESEAWCS_WCSServer.Controllers.PackInfo
{
    [Route("api/Packaxis")]
    [ApiController]
    public class PackaxisController : ApiBaseController<IDt_PackaxisService, Dt_Packaxis>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        public PackaxisController(IDt_PackaxisService service, IHttpContextAccessor httpContextAccessor) : base(service)
        {
            _httpContextAccessor = httpContextAccessor;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/appsettings.json
@@ -14,10 +14,10 @@
  //连接字符串
  //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=192.168.35.3;Initial Catalog=TestWCS_TC;User ID=sa;Password=Sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=TESTWCSCP_WCS;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"WMSConnectionStrings": "Data Source=10.30.4.92;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -328,7 +328,31 @@
            }
            return content;
        }
        // <summary>
        /// å…¥åº“申请
        /// </summary>
        public WebResponseContent YLPurchaseBoxing(string palletCode)
        {
            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/YLPurchaseBoxing?palletCode={palletCode}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                content = responseContent;
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        // <summary>
        /// è¯·æ±‚成品入库巷道
        /// </summary>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/ConveyorLineJob_YL1ndFloor.cs
@@ -78,8 +78,17 @@
                        R_ConveyorLineYLInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineYLInfo>(deviceProRead.DeviceProAddress);
                        if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 86 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID)) //一楼来料称重站台允许入库申请
                        {
                            device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                            WriteInfo(item.StationCode, $"请求入库条码:{conveyorLineInfoRead.WR_TMID}");
                            WebResponseContent content = _taskService.YLPurchaseBoxing(conveyorLineInfoRead.WR_TMID);
                            if (content.Status)
                            {
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                WriteInfo(item.StationCode, $"请求入库条码:{conveyorLineInfoRead.WR_TMID}");
                            }
                            else
                            {
                                WriteError(item.StationCode, $"请求入库失败:{content.Message}");
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 86 && conveyorLineInfoRead.WR_Task <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID)) //一楼分配站台入库分配目标点
                        {
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/extend/SelectedStock.vue
@@ -13,14 +13,14 @@
            <el-col :span="24">
              <span class="less-style">物料名称: {{ row.materielName }} </span>
              <el-divider direction="vertical"></el-divider>
              <span class="less-style">物料编号: {{ row.materielCode }} </span>
              <span class="less-style">物料编号: {{ row.materialNo }} </span>
              <el-divider direction="vertical"></el-divider>
              <span class="less-style"
                >需求数量: {{ row.orderQuantity }}
                >需求数量: {{ row.totalUsage }}
              </span>
              <el-divider direction="vertical"></el-divider>
              <span class="less-style"
                >已分配数量: {{ row.lockQuantity }}
                >已分配数量: {{ row.assignTotalUsage }}
              </span>
            </el-col>
          </el-row>
@@ -81,6 +81,7 @@
  data() {
    return {
      row: null,
      orderNo:null,
      showDetialBox: false,
      tableData: [],
      tableColumns: [
@@ -105,16 +106,10 @@
          hidden: true,
        },
        {
          prop: "orderType",
          title: "单据类型",
          prop: "materielId",
          title: "物料Id",
          type: "string",
          width: 90,
        },
        {
          prop: "batchNo",
          title: "批次号",
          type: "string",
          width: 120,
        },
        {
          prop: "materielCode",
@@ -136,16 +131,22 @@
          hidden: true,
        },
        {
          prop: "originalQuantity",
          title: "原始库存量",
          prop: "orderQuantity",
          title: "单据需求长度",
          type: "string",
          width: 100,
          width: 110,
        },
        {
          prop: "originalQuantity",
          title: "原库存长度",
          type: "string",
          width: 110,
        },
        {
          prop: "assignQuantity",
          title: "分配出库量",
          title: "分配出库长度",
          type: "string",
          width: 100,
          width: 110,
        },
        {
          prop: "taskNum",
@@ -155,7 +156,7 @@
        },
        {
          prop: "palletCode",
          title: "托盘编号",
          title: "条码编号",
          type: "string",
          width: 150,
        },
@@ -174,15 +175,16 @@
    };
  },
  methods: {
    open(row) {
    open(row,orderNo) {
      this.row = row;
      this.orderNo=orderNo;
      this.showDetialBox = true;
      this.getData();
    },
    getData() {
      this.http
        .post(
          "api/OutStockLockInfo/GetByOrderDetailId?orderDetailId=" +
          "api/OutStockLockInfo/GetByOrderDetailId?orderNo="+this.orderNo+"&orderDetailId=" +
            this.row.id,
          null,
          "查询中"
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/extend/outOrderDetail.vue
@@ -14,13 +14,13 @@
              <span>已选中 {{ selection.length }} é¡¹</span>
            </el-col>
            <el-col :span="8">
              <el-link
              <!-- <el-link
                type="primary"
                size="small"
                style="float: right; height: 20px"
                @click="lockstocks"
                >锁定库存</el-link
              >
              > -->
              <el-link
                type="primary"
                size="small"
@@ -124,14 +124,20 @@
          hidden: true,
        },
        {
          prop: "orderId",
          prop: "outBSTOrderId",
          title: "出库单主键",
          type: "string",
          width: 90,
          hidden: true,
        },
        {
          prop: "materielCode",
          prop: "materialId",
          title: "上游物料ID",
          type: "string",
          width: 120,
        },
        {
          prop: "materialNo",
          title: "物料编号",
          type: "string",
          width: 150,
@@ -141,51 +147,52 @@
          title: "物料名称",
          type: "string",
          width: 150,
          hidden: true,
        },
        {
          prop: "batchNo",
          title: "批次号",
          prop: "width",
          title: "幅宽",
          type: "string",
          width: 90,
          width: 100,
        },
        {
          prop: "orderQuantity",
          title: "单据数量",
          prop: "xqLen",
          title: "需求长度",
          type: "string",
          width: 90,
          width: 130,
        },
        {
          prop: "lockQuantity",
          title: "锁定数量",
          prop: "totalUsage",
          title: "总用重量",
          type: "int",
          width: 90,
          width: 130,
        },
        {
          prop: "overOutQuantity",
          title: "已出数量",
          prop: "assignTotalUsage",
          title: "已分配长度",
          type: "string",
          width: 90,
          width: 130,
        },
        {
          prop: "unit",
          title: "单位",
          prop: "outTotalUsage",
          title: "已出长度",
          type: "string",
          width: 90,
          width: 130,
        },
        {
          prop: "orderDetailStatus",
          prop: "outBSTOrderDetailStatus",
          title: "订单明细状态",
          type: "tag",
          width: 180,
          bindKey: "orderDetailStatusEnum",
          bindKey: "outboundStatusEnum",
        },
        {
          prop: "assignStock",
          title: "指定库存",
          type: "icon",
          width: 90,
          icon: "el-icon-s-grid",
        },
        // {
        //   prop: "assignStock",
        //   title: "指定库存",
        //   type: "icon",
        //   width: 90,
        //   icon: "el-icon-s-grid",
        // },
        {
          prop: "viewDetail",
          title: "出库详细",
@@ -194,33 +201,16 @@
          icon: "el-icon-s-operation",
        },
        {
          prop: "creater",
          title: "创建人",
          type: "string",
          width: 90,
        },
        {
          prop: "createDate",
          title: "创建时间",
          type: "datetime",
          width: 160,
        },
        {
          prop: "modifier",
          title: "修改人",
          type: "string",
          width: 100,
          width: 170,
        },
        {
          prop: "modifyDate",
          title: "修改时间",
          type: "datetime",
          width: 160,
        },
        {
          prop: "remark",
          title: "备注",
          type: "string",
          width: 170,
        },
      ],
      paginations: {
@@ -284,14 +274,15 @@
        }
        
        // ä»…对数值列求和
        // ä»…对某一列求和
        if (column.property === 'lockQuantity' || column.property === 'overOutQuantity' || column.property === 'orderQuantity') {
        if (column.property === 'xqLen' || column.property === 'assignTotalUsage' || column.property === 'outTotalUsage' || column.property === 'totalUsage') {
          const values = data.map(item => Number(item[column.property]))
        console.log(values);
        if (!values.every(value => isNaN(value))) {
          sums[index] = values.reduce((prev, curr) => {
            return prev + (isNaN(curr) ? 0 : curr)
          }, 0)
          }, 0);
          //保留两位小数
          sums[index] = sums[index].toFixed(4)
        } else {
          sums[index] = '-'
        }
@@ -302,7 +293,7 @@
      return sums
    },
    getData() {
      var wheres = [{ name: "orderId", value: this.row.id }];
      var wheres = [{ name: "outBSTOrderId", value: this.row.id }];
      var param = {
        page: this.paginations.page,
        rows: this.paginations.rows,
@@ -311,7 +302,7 @@
        wheres: JSON.stringify(wheres), // æŸ¥è¯¢æ¡ä»¶ï¼Œæ ¼å¼ä¸º[{ name: "字段", value: "xx" }]
      };
      this.http
        .post("api/OutboundOrderDetail/GetPageData", param, "查询中")
        .post("api/OutBSTOrderDetail/GetPageData", param, "查询中")
        .then((x) => {
          this.tableData = x.rows;
        });
@@ -321,25 +312,25 @@
        this.$refs.child.open(row);
      } else {
        //点击打开出库详情
        this.$refs.selectedStock.open(row);
        this.$refs.selectedStock.open(row,this.row.outBSTOrderNo);
      }
    },
    lockstocks() {
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
      }
      var keys = this.selection.map((item) => item.id); // èŽ·å–é€‰ä¸­è¡Œçš„id
      this.http
        .post("api/OutboundOrderDetail/LockOutboundStocks", keys, "数据处理中")
        .then((x) => {
          if (!x.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
          this.showDetialBox = false;
          this.$emit("parentCall", ($vue) => {
            $vue.getData();
          });
        });
    },
    // lockstocks() {
    //   if (this.selection.length === 0) {
    //     return this.$message.error("请选择单据明细");
    //   }
    //   var keys = this.selection.map((item) => item.id); // èŽ·å–é€‰ä¸­è¡Œçš„id
    //   this.http
    //     .post("api/OutboundOrderDetail/LockOutboundStocks", keys, "数据处理中")
    //     .then((x) => {
    //       if (!x.status) return this.$message.error(x.message);
    //       this.$message.success("操作成功");
    //       this.showDetialBox = false;
    //       this.$emit("parentCall", ($vue) => {
    //         $vue.getData();
    //       });
    //     });
    // },
    outbound() {
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
@@ -347,7 +338,7 @@
      var keys = this.selection.map((item) => item.id); // èŽ·å–é€‰ä¸­è¡Œçš„id
      this.http
        .post("api/Task/GenerateOutboundTasks", keys, "数据处理中")
        .post("api/Task/CreateBSTOutboundTasks", keys, "数据处理中")
        .then((x) => {
          if (!x.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/outBSTOrder.js
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/outBSTOrderDetail.js
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/outboundOrderDetail_Hty.js
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/outboundOrder_Hty.js
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSClient/src/router/viewGird.js
@@ -70,13 +70,13 @@
    name: 'inboundOrderDetail',
    component: () => import('@/views/inbound/inboundOrderDetail.vue')
  }, {
    path: '/outboundOrder',
    name: 'outboundOrder',
    component: () => import('@/views/outbound/outboundOrder.vue')
    path: '/outBSTOrder',
    name: 'outBSTOrder',
    component: () => import('@/views/outbound/outBSTOrder.vue')
  }, {
    path: '/outboundOrderDetail',
    name: 'outboundOrderDetail',
    component: () => import('@/views/outbound/outboundOrderDetail.vue')
    path: '/outBSTOrderDetail',
    name: 'outBSTOrderDetail',
    component: () => import('@/views/outbound/outBSTOrderDetail.vue')
  }, 
  {
    path: '/outStockLockInfo',
@@ -150,16 +150,6 @@
    path: '/purchaseOrderDetail',
    name: 'purchaseOrderDetail',
    component: () => import('@/views/inbound/purchaseOrderDetail.vue')
  }
  , {
    path: '/outboundOrder_Hty',
    name: 'outboundOrder_Hty',
    component: () => import('@/views/outbound/outboundOrder_Hty.vue')
  }
  , {
    path: '/outboundOrderDetail_Hty',
    name: 'outboundOrderDetail_Hty',
    component: () => import('@/views/outbound/outboundOrderDetail_Hty.vue')
  }
  , {
    path: '/receiveOrderDetail',
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/basic/materielInfo.vue
@@ -38,7 +38,8 @@
      materielWide: "",
      materielState: "",
      isCheck: "",
      materielInvOrgId: ""
      materielInvOrgId: "",
      materierlWeight: "",
    });
    const editFormOptions = ref([
@@ -62,9 +63,7 @@
          required: true,
          field: "materielName",
          type: "string",
        }
      ],
      [
        },
        {
          title: "物料分类",
          field: "materielSourceType",
@@ -73,6 +72,9 @@
          data: [],
          required: true,
        },
      ],
      [
        {
          title: "物料规格",
          required: true,
@@ -83,10 +85,10 @@
          title: "基本单位",
          required: true,
          field: "materielUnit",
          type: "string",
          type: "select",
          dataKey:"materielUnitEnum",
          data:[]
        },
      ],
      [
        {
          title: "库存组织",
          required: true,
@@ -103,16 +105,13 @@
          dataKey:"enableEnum",
          data:[]
        },
        {
          title: "是否质检",
          required: true,
          field: "isCheck",
          type: "select",
          dataKey:"yesno",
          data:[]
        },
      ],
      [
        {
          title: "物料重量",
          field: "materielWeight",
          type: "float",
        },
        {
          title: "物料长度",
          field: "materielLength",
@@ -127,6 +126,16 @@
          title: "物料宽度",
          field: "materielWide",
          type: "float",
        },
      ],
      [
        {
          title: "是否质检",
          required: true,
          field: "isCheck",
          type: "select",
          dataKey:"enableEnum",
          data:[]
        },
      ]
    ]);
@@ -205,6 +214,7 @@
        type: "string",
        width: 120,
        align: "left",
        bind: { key: "materielUnitEnum", data: [] },
      },
      {
        field: "materielState",
@@ -223,6 +233,13 @@
        align: "left",
      },
      {
        field: "materielWeight",
        title: "物料重量",
        type: "float",
        width: 180,
        align: "left",
      },
      {
        field: "materielLength",
        title: "物料长度",
        type: "float",
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/outbound/outBSTOrder.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,278 @@
<template>
  <view-grid
    ref="grid"
    :columns="columns"
    :detail="detail"
    :editFormFields="editFormFields"
    :editFormOptions="editFormOptions"
    :searchFormFields="searchFormFields"
    :searchFormOptions="searchFormOptions"
    :table="table"
    :extend="extend"
  >
  </view-grid>
</template>
    <script>
import extend from "@/extension/outbound/outBSTOrder.js";
import { ref, defineComponent } from "vue";
export default defineComponent({
  setup() {
    const table = ref({
      key: "id",
      footer: "Foots",
      cnName: "出库单",
      name: "outBSTOrder",
      url: "/OutBSTOrder/",
      sortName: "id",
    });
    const editFormFields = ref({
      boardMpsNo:""
    });
    const editFormOptions = ref([
      [
        {
          field: "boardMpsNo",
          title: "单据编号",
          type: "string",
          readonly:true
        }
      ],
    ]);
    const searchFormFields = ref({
      outBSTOrderNo: "",
      boardMpsId: "",
      boardMpsNo: "",
      outBSTOrderStatus: "",
      warehouseId: "",
    });
    const searchFormOptions = ref([
      [
        { title: "单据编号", field: "outBSTOrderNo", type: "like" },
        { title: "出库上游ID", field: "boardMpsId", type: "like" },
        { title: "上游单据编号", field: "boardMpsNo", type: "like" },
        {
          title: "单据状态",
          field: "outBSTOrderStatus",
          type: "select",
          dataKey: "outboundStatusEnum",
          data: [],
        },
      ],
      [
        { title: "所属仓库", field: "warehouseId",type: "selectList",dataKey: "warehouses",data: [],}
      ],
    ]);
    const columns = ref([
      {
        field: "id",
        title: "Id",
        type: "int",
        width: 90,
        hidden: true,
        readonly: true,
        require: true,
        align: "left",
      },
      {
        field: "warehouseId",
        title: "仓库",
        type: "string",
        width: 90,
        align: "left",
        bind:{key: "warehouses", data: []}
      },
      {
        field: "outBSTOrderNo",
        title: "单据编号",
        type: "string",
        width: 160,
        align: "left",
        // link: true,
      },
      {
        field: "boardMpsId",
        title: "上游单据ID",
        type: "int",
        width: 160,
        align: "left",
        // link: true,
      },
      {
        field: "boardMpsNo",
        title: "上游单据编号",
        type: "string",
        width: 160,
        align: "left",
      },
      {
        field: "outBSTOrderStatus",
        title: "出库单状态",
        type: "string",
        width: 110,
        align: "left",
        bind: { key: "outboundStatusEnum", data: [] },
      },
      {
        field: "creater",
        title: "创建人",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "createDate",
        title: "创建时间",
        type: "datetime",
        width: 160,
        align: "left",
      },
      {
        field: "remark",
        title: "备注",
        type: "string",
        width: 100,
        align: "left",
      },
    ]);
    const detail = ref({
      cnName: "出库明细单",
      table: "OutBSTOrderDetail",
      columns: [
        {
          field: "id",
          title: "Id",
          type: "int",
          width: 90,
          hidden: true,
          readonly: true,
          require: true,
          align: "left",
        },
        {
          field: "outBSTOrderId",
          title: "出库单主键",
          type: "string",
          width: 90,
          align: "left",
          hidden: true,
        },
        {
          field: "boardMpsId",
          title: "关联的主表ID(上游)",
          type: "string",
          width: 90,
          align: "left",
        },
        {
          field: "materialId",
          title: "关联的主表ID(上游)",
          type: "string",
          width: 90,
          align: "left",
        },
        {
          field: "materialNo",
          title: "物料编号",
          type: "string",
          width: 150,
          align: "left",
          edit: { type: "string" },
          required: true,
        },
        {
          field: "materielName",
          title: "物料名称",
          type: "string",
          width: 150,
          align: "left",
          edit: { type: "string" },
        },
        {
          field: "width",
          title: "幅宽",
          type: "string",
          width: 110,
          align: "left",
          edit: { type: "string" },
          required: true,
        },
        {
          field: "xqLen",
          title: "需求长度",
          type: "string",
          width: 110,
          align: "left",
          edit: { type: "number" },
          required: true,
        },
        {
          field: "totalUsage",
          title: "总用量",
          type: "string",
          width: 90,
          align: "left",
          edit: { type: "number" },
          required: true,
        },
        {
          field: "procurementLength",
          title: "采购长度",
          type: "string",
          width: 110,
          align: "left",
        },
        {
          field: "assignTotalUsage",
          title: "已分配用量",
          type: "string",
          width: 110,
          align: "left",
        },
        {
          field: "outTotalUsage",
          title: "已出用量",
          type: "string",
          width: 110,
          align: "left",
        },
        {
          field: "outBSTOrderDetailStatus",
          title: "订单明细状态",
          type: "string",
          width: 180,
          align: "left",
          bind: { key: "outboundStatusEnum", data: [] },
        },
        {
          field: "creater",
          title: "创建人",
          type: "string",
          width: 90,
          align: "left",
        },
        {
          field: "createDate",
          title: "创建时间",
          type: "datetime",
          width: 160,
          align: "left",
        }
      ],
      sortName: "id",
      key: "id",
    });
    return {
      table,
      extend,
      editFormFields,
      editFormOptions,
      searchFormFields,
      searchFormOptions,
      columns,
      detail,
    };
  },
});
</script>
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/outbound/outBSTOrderDetail.vue
ÎļþÃû´Ó ÏîÄ¿´úÂë/WMS/WMSClient/src/views/outbound/outboundOrderDetail.vue ÐÞ¸Ä
@@ -14,7 +14,7 @@
    </view-grid>
  </template>
    <script>
  import extend from "@/extension/outbound/outboundOrderDetail.js";
  import extend from "@/extension/outbound/outBSTOrderDetail.js";
  import { ref, defineComponent } from "vue";
  export default defineComponent({
    setup() {
@@ -22,8 +22,8 @@
        key: "id",
        footer: "Foots",
        cnName: "出库单明细",
        name: "outboundOrderDetail",
        url: "/OutboundOrderDetail/",
        name: "outBSTOrderDetail",
        url: "/OutBSTOrderDetail/",
        sortName: "id",
      });
      const editFormFields = ref({
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/outbound/outboundOrder.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/outbound/outboundOrder_Hty.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/stock/ProStockView.vue
@@ -113,10 +113,24 @@
          align: "left",
        },
        {
          field: "productName",
          title: "物料名称",
          type: "string",
          width: 200,
          align: "left",
        },
        {
          field: "lotNumber",
          title: "物料批号",
          type: "string",
          width: 110,
          align: "left",
        },
        {
          field: "productSpec",
          title: "物料规格",
          type: "string",
          width: 200,
          align: "left",
        },
        {
@@ -125,6 +139,14 @@
          type: "string",
          width: 100,
          align: "left",
        },
        {
          field: "productUnit",
          title: "物料单位",
          type: "string",
          width: 100,
          align: "left",
          bind: { key: "materielUnitEnum", data: [] },
        },
        {
          field: "row",
@@ -235,6 +257,27 @@
            align: "left",
          },
          {
            field: "productName",
            title: "物料名称",
            type: "string",
            width: 150,
            align: "left",
          },
          {
            field: "lotNumber",
            title: "物料批号",
            type: "string",
            width: 90,
            align: "left",
          },
          {
            field: "productSpec",
            title: "物料规格",
            type: "string",
            width: 90,
            align: "left",
          },
          {
            field: "stockQty",
            title: "库存数",
            type: "string",
@@ -242,8 +285,8 @@
            align: "left",
          },
          {
            field: "lotNumber",
            title: "物料批号",
            field: "productUnit",
            title: "单位",
            type: "string",
            width: 90,
            align: "left",
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/stock/stockInfo.vue
@@ -134,6 +134,13 @@
        bind: { key: "stockStatusEmun", data: [] },
      },
      {
          field: "stockLength",
          title: "库存总长",
          type: "string",
          width: 110,
          align: "left",
      },
      {
          field: "materielWeight",
          title: "物料重量",
          type: "string",
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicRepository/BasicRepository.cs
@@ -27,12 +27,15 @@
        public IPalletTypeInfoRepository PalletTypeInfoRepository { get; }
        public BasicRepository(ILocationInfoRepository locationInfoRepository, IMaterielInfoRepository materielInfoRepository, IWarehouseRepository warehouseRepository, IPalletTypeInfoRepository palletTypeInfoRepository)
        public ISupplierInfoRepository SupplierInfoRepository { get; }
        public BasicRepository(ILocationInfoRepository locationInfoRepository, IMaterielInfoRepository materielInfoRepository, IWarehouseRepository warehouseRepository, IPalletTypeInfoRepository palletTypeInfoRepository, ISupplierInfoRepository supplierInfoRepository)
        {
            LocationInfoRepository = locationInfoRepository;
            MaterielInfoRepository = materielInfoRepository;
            WarehouseRepository = warehouseRepository;
            PalletTypeInfoRepository = palletTypeInfoRepository;
            SupplierInfoRepository = supplierInfoRepository;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/APIEnum/APIEnum.cs
@@ -16,6 +16,11 @@
        /// å›žè°ƒWCS任务完成
        /// </summary>
        [Description("回调WCS任务完成")]
        FeedBackWCSTaskCompleted
        FeedBackWCSTaskCompleted,
        /// <summary>
        /// åšæ€é€šé‡‡è´­å…¥åº“上传
        /// </summary>
        [Description("博思通采购入库上传")]
        BSTPurchaseUp,
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/MaterielEnum/MaterialMenu.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Common.MaterielEnum
{
    /// <summary>
    /// åº“存组织
    /// </summary>
    public enum MaterielInvOrgEnum
    {
        /// <summary>
        /// è€åŽ‚
        /// </summary>
        [Description("老厂")]
        è€åŽ‚ = 1,
        /// <summary>
        /// æ–°åŽ‚
        /// </summary>
        [Description("新厂")]
        æ–°åŽ‚ = 2,
    }
    /// <summary>
    /// ç‰©æ–™åŸºæœ¬åˆ†ç±»
    /// </summary>
    public enum MaterielTypeEnum
    {
        /// <summary>
        /// æˆå“
        /// </summary>
        [Description("成品")]
        æˆå“ = 1,
        /// <summary>
        /// åŠæˆå“
        /// </summary>
        [Description("半成品")]
        åŠæˆå“ = 2,
        /// <summary>
        /// åŽŸææ–™
        /// </summary>
        [Description("原材料")]
        åŽŸææ–™ = 3,
        /// <summary>
        /// è¾…料备件
        /// </summary>
        [Description("辅料备件")]
        è¾…料备件 = 4
    }
    /// <summary>
    /// ç‰©æ–™å•位分类
    /// </summary>
    public enum MaterielUnitEnum
    {
        /// <summary>
        /// åƒå…‹
        /// </summary>
        [Description("千克")]
        Kg = 1,
        /// <summary>
        /// ç±³
        /// </summary>
        [Description("ç±³")]
        M = 2,
        /// <summary>
        /// ä¸ª
        /// </summary>
        [Description("个")]
        Pcs = 3
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/MaterielEnum/MaterielInvOrgEnum.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/MaterielEnum/MaterielTypeEnum.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/OrderEnum/OutboundOrderMenu.cs
@@ -10,8 +10,8 @@
    /// <summary>
    /// å‡ºåº“单据状态<br/>
    /// 0:未开始<br/>
    /// 1:入库中<br/>
    /// 2:入库完成<br/>
    /// 1:出库中<br/>
    /// 2:出库完成<br/>
    /// 99:关闭<br/>
    public enum OutOrderStatusEnum
    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/WareHouseEnum/WarehouseEnum.cs
@@ -24,6 +24,11 @@
        /// </summary>
        [Description("成品库")]
        LLDCP=2,
        /// <summary>
        /// è¾…料库
        /// </summary>
        [Description("辅料库")]
        LLDFL = 3
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/BaseModels/PageDataOptions.cs
@@ -79,11 +79,11 @@
                    }
                    else if (expressionType == LinqExpressionType.ThanOrEqual)
                    {
                        where += $"{searchParametersList[i].Name} {HtmlElementType.ThanOrEqual} '{searchParametersList[i].Value}'";
                        where += $"{searchParametersList[i].Name} {HtmlElementType.thanorequal} '{searchParametersList[i].Value}'";
                    }
                    else if (expressionType == LinqExpressionType.LessThanOrEqual)
                    {
                        where += $"{searchParametersList[i].Name} {HtmlElementType.LessOrequal} '{searchParametersList[i].Value}'";
                        where += $"{searchParametersList[i].Name} {HtmlElementType.lessOrequal} '{searchParametersList[i].Value}'";
                    }
                    else if (expressionType == LinqExpressionType.GreaterThan)
                    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/CodeConfigEnum/RuleCodeEnum.cs
@@ -17,44 +17,21 @@
        /// </summary>
        [Description("入库单号编码规则编号")]
        InboundOrderRule,
        /// <summary>
        /// å‡ºåº“单号编码规则编号
        /// </summary>
        [Description("出库单号编码规则编号")]
        OutboundOrderRule,
        /// <summary>
        /// æ”¶è´§å•号编码规则编号
        /// </summary>
        [Description("收货单号编码规则编号")]
        ReceiveOrderRule,
        /// <summary>
        /// è´¨æ£€å•号编码规则
        /// </summary>
        [Description("质检单号编码规则")]
        CheckOrderRule,
        /// <summary>
        /// å‘料单号编码规则
        /// </summary>
        [Description("发料单号编码规则")]
        FLCodeRule,
        /// <summary>
        /// å…¥æ–™å•号编码规则
        /// </summary>
        [Description("入料单号编码规则")]
        RLCodeRule,
        /// <summary>
        /// é€€æ–™å•号编码规则
        /// </summary>
        [Description("退料单号编码规则")]
        TLCodeRule,
        /// <summary>
        /// ç›˜ç‚¹å•号编码规则
        /// </summary>
        [Description("盘点单号编码规则")]
        PDCodeRule,
        /// <summary>
        /// é€€æ–™å•号编码规则
        /// </summary>
        [Description("退料单号编码规则")]
        TLCodeRule,
        /// <summary>
        /// æˆå“å…¥åº“单号编码规则
        /// </summary>
@@ -64,6 +41,6 @@
        /// æˆå“å‡ºåº“单号编码规则
        /// </summary>
        [Description("成品出库单号编码规则")]
        ProOutCOdeRule
        ProOutCodeRule
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/Const/HtmlElementType.cs
@@ -24,8 +24,8 @@
        public const string LT = "<";
        public const string like = "like";
        public const string ThanOrEqual = ">=";
        public const string LessOrequal = "<=";
        public const string thanOrEqual = ">=";
        public const string lessOrequal = "<=";
        public const string Contains = "in";
        public const string Equal = "=";
    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/Helper/UtilConvert.cs
@@ -958,10 +958,10 @@
                case HtmlElementType.Contains:
                    linqExpression = LinqExpressionType.In;
                    break;
                case HtmlElementType.ThanOrEqual:
                case HtmlElementType.thanOrEqual:
                    linqExpression = LinqExpressionType.ThanOrEqual;
                    break;
                case HtmlElementType.LessOrequal:
                case HtmlElementType.lessOrequal:
                    linqExpression = LinqExpressionType.LessThanOrEqual;
                    break;
                case HtmlElementType.GT:
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Basic/BSTMaterialDTO.cs
@@ -78,7 +78,7 @@
        /// çŠ¶æ€
        /// </summary>
        [PropertyValidate("状态", NotNullAndEmpty = true)]
        public int State { get; set; }
        public int Status { get; set; }
        /// <summary>
        /// åº“存组织
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTOutOrderDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
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.Basic
{
    /// <summary>
    /// åšæ€é€šé‡‡è´­å…¥åº“单接收实体
    /// </summary>
    [ModelValidate]
    public class BSTOutOrderDTO
    {
        /// <summary>
        /// æ•°æ®èŽ·å–æ–¹å¼æ ‡è¯†(1:新增 2:修改 3:删除)
        /// </summary>
        [PropertyValidate("数据获取方式标识(1:新增 2:修改 3:删除)", NotNullAndEmpty = true)]
        public int Way { get; set; }
        /// <summary>
        /// çº¸æ¿ä¸»ç”Ÿäº§è®¡åˆ’ID
        /// </summary>
        [PropertyValidate("纸板主生产计划ID", NotNullAndEmpty = true)]
        public int BoardMpsId { get; set; }
        /// <summary>
        /// è®¡åˆ’编号
        /// </summary>
        [PropertyValidate("计划编号", NotNullAndEmpty = true)]
        public string BoardMpsNo { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        [PropertyValidate("生产日期", NotNullAndEmpty = true)]
        public long ProductionDate { get; set; }
        /// <summary>
        /// çº¸è´¨å‡ºåº“单明细列表
        /// </summary>
        [PropertyValidate("纸质出库单明细列表", NotNullAndEmpty = true)]
        public List<BstBoardMpsDetailItem> BstBoardMpsDetails { get; set; }
    }
    /// <summary>
    /// é‡‡è´­æ”¶è´§æ˜Žç»†
    /// </summary>
    public class BstBoardMpsDetailItem
    {
        /// <summary>
        /// å…³è”的主表ID
        /// </summary>
        [PropertyValidate("关联的主表ID", NotNullAndEmpty = true)]
        public int BoardMpsId { get; set; }
        /// <summary>
        /// å¹…宽
        /// </summary>
        [PropertyValidate("幅宽", NotNullAndEmpty = true)]
        public decimal Width { get; set; }
        /// <summary>
        /// éœ€æ±‚长度
        /// </summary>
        [PropertyValidate("需求长度", NotNullAndEmpty = true)]
        public decimal XqLen { get; set; }
        /// <summary>
        /// æ€»ç”¨é‡
        /// </summary>
        [PropertyValidate("总用量", NotNullAndEmpty = true)]
        public decimal TotalUsage { get; set; }
        /// <summary>
        /// ç‰©æ–™æ¥æºID(上游)
        /// </summary>
        [PropertyValidate("物料ID", NotNullAndEmpty = true)]
        public int MaterialId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [PropertyValidate("物料编号", NotNullAndEmpty = true)]
        public string MaterialNo { get; set; }
        /// <summary>
        /// é‡‡è´­é•¿åº¦
        /// </summary>
        [PropertyValidate("采购长度", NotNullAndEmpty = true)]
        public decimal ProcurementLength { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Stock/ProStockViewDTO.cs
@@ -73,49 +73,47 @@
        [ExporterHeader(DisplayName = "出货单号")]
        public string ShipmentOrder { get; set; }
        /// <summary>
        /// èƒ¶æ¡†å·
        /// æ‰˜ç›˜å·
        /// </summary>
        [ExporterHeader(DisplayName = "胶框号")]
        [ExporterHeader(DisplayName = "托盘号")]
        public string PalletCode { get; set; }
        /// <summary>
        /// äº§å“ç¼–码
        /// ç‰©æ–™ç¼–码
        /// </summary>
        [ExporterHeader(DisplayName = "产品编码")]
        [ExporterHeader(DisplayName = "物料编码")]
        public string ProductCode { get; set; }
        /// <summary>
        /// ç‰ˆæœ¬
        /// ç‰©æ–™åç§°
        /// </summary>
        [ExporterHeader(DisplayName = "版本")]
        public string ProductVersion { get; set; }
        /// <summary>
        /// ç‰ˆæœ¬
        /// </summary>
        [ExporterHeader(DisplayName = "版本")]
        public string SpecifyVer { get; set; }
        [ExporterHeader(DisplayName = "物料名称")]
        public string? ProductName { get; set; }
        /// <summary>
        /// äº§å“å‘¨æœŸ
        /// è§„æ ¼
        /// </summary>
        [ExporterHeader(DisplayName = "产品周期")]
        public string DateCode { get; set; }
        [ExporterHeader(DisplayName = "规格")]
        public string ProductSpec { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [ExporterHeader(DisplayName = "单位")]
        public string ProductUnit { get; set; }
        /// <summary>
        /// äº§å“æ‰¹å·
        /// </summary>
        [ExporterHeader(DisplayName = "产品批号")]
        public string LotNumber { get; set; }
        /// <summary>
        /// ERP工单
        /// </summary>
        [ExporterHeader(DisplayName = "ERP工单")]
        public string ERPOrder { get; set; }
        /// <summary>
        /// åˆ¶é€ å·¥å•
        /// </summary>
        [ExporterHeader(DisplayName = "制造工单")]
        public string MoNumber { get; set; }
        /// <summary>
        /// é”€å”®è®¢å•
        /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/ERPService/InvokeERPService.cs
@@ -28,5 +28,16 @@
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        public string BSTPurchaseUp(BSTPurchaseUpModel bSTPurchaseUpModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x=>x.ApiCode==APIEnum.BSTPurchaseUp.ToString());
            string request = JsonConvert.SerializeObject(bSTPurchaseUpModel, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/IERPService/IInvokeERPService.cs
@@ -13,6 +13,6 @@
    /// </summary>
    public interface IInvokeERPService : IDependency
    {
        public string BSTPurchaseUp(BSTPurchaseUpModel bSTPurchaseUpModel);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/BSTPurchaseUpModel.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_External.Model
{
    /// <summary>
    /// é‡‡è´­ä¸Šä¼ 
    /// </summary>
    public class BSTPurchaseUpModel
    {
        public string Barcode { get; set; }
        public int BarcodeQty { get; set;}
        public string Rfid { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/BSTResponse.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_External.Model
{
    /// <summary>
    /// åšæ€é€šè¿”回
    /// </summary>
    public class BSTResponse
    {
        /// <summary>
        /// è¿”回信息
        /// </summary>
        public string Msg { get; set; }
        /// <summary>
        /// è¿”回码
        /// </summary>
        public int Code { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IBasicRepository/IBasicRepository.cs
@@ -18,5 +18,7 @@
        IPalletTypeInfoRepository PalletTypeInfoRepository { get; }
        ISupplierInfoRepository SupplierInfoRepository { get; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutBSTOrderDetailRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundRepository
{
    /// <summary>
    /// å‡ºåº“单明细仓储接口层
    /// </summary>
    public interface IOutBSTOrderDetailRepository : IRepository<Dt_OutBSTOrderDetail>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutBSTOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundRepository
{
    /// <summary>
    /// å‡ºåº“单仓储接口层
    /// </summary>
    public interface IOutBSTOrderRepository : IRepository<Dt_OutBSTOrder>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutStockLockInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundRepository
{
    /// <summary>
    /// å‡ºåº“详情信息仓储接口层
    /// </summary>
    public interface IOutStockLockInfoRepository : IRepository<Dt_OutStockLockInfo>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutBSTOrderDetailService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_DTO.Stock;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public interface IOutBSTOrderDetailService : IService<Dt_OutBSTOrderDetail>
    {
        IOutBSTOrderDetailRepository Repository { get; }
        /// <summary>
        /// åˆ†é…åº“å­˜
        /// </summary>
        (List<Dt_StockInfo>, List<Dt_OutBSTOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_OutBSTOrderDetail> outboundOrderDetails);
        /// <summary>
        /// å‡ºåº“库存分配后,更新数据库数据
        /// </summary>
        WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutBSTOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutBSTOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.Inbound;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public interface IOutBSTOrderService : IService<Dt_OutBSTOrder>
    {
        IOutBSTOrderRepository Repository { get; }
        /// <summary>
        /// æ·»åŠ å‡ºåº“æŽ’ç¨‹ä¿¡æ¯
        /// </summary>
        WebResponseContent AddOutBSTOrder(List<BSTOutOrderDTO> bSTOutOrderDTOs);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutStockLockInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public interface IOutStockLockInfoService : IService<Dt_OutStockLockInfo>
    {
        /// <summary>
        ///
        /// </summary>
        IOutStockLockInfoRepository Repository { get; }
        List<Dt_OutStockLockInfo> GetByOrderDetailId(string orderNo,int orderDetailId, OutLockStockStatusEnum? outStockStatus);
        /// <summary>
        /// ç”Ÿæˆå‡ºåº“详情
        /// </summary>
        Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutBSTOrder outBSTOrder, Dt_OutBSTOrderDetail outboundOrderDetail, Dt_StockInfo outStock, decimal assignQuantity, int? taskNum = null);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IStockRepository/IStockInfoRepository.cs
@@ -15,7 +15,7 @@
        List<Dt_StockInfo> GetStockInfos(string materielCode);
        List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, List<string> locationCodes);
        List<Dt_StockInfo> GetStockInfos(int materielId,decimal width, List<string> locationCodes);
        List<Dt_StockInfo> GetStockInfosByIds(List<int> ids);
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IStockService/IStockInfoService.cs
@@ -15,6 +15,17 @@
    {
        IStockInfoRepository Repository { get; }
        WebResponseContent StockQueryData(SaveModel saveModel);
        /// <summary>
        /// æ‰‹åŠ¨ç»„ç›˜
        /// </summary>
        WebResponseContent ManualMaterielGroup(SaveModel saveModel);
        /// <summary>
        /// èŽ·å–å¯ä½¿ç”¨åº“å­˜
        /// </summary>
        List<Dt_StockInfo> GetUseableStocks(int materielId,decimal width, int warehoseId);
        /// <summary>
        /// åˆ†é…å®žé™…库存
        /// </summary>
        List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -65,10 +65,17 @@
        WebResponseContent DeviceRequestInboundTaskSimple(string stationCode, string palletCode);
        /// <summary>
        /// å…¥åº“任务请求
        /// åŽŸæ–™å…¥åº“ä»»åŠ¡è¯·æ±‚
        /// </summary>
        /// <returns></returns>
        WebResponseContent RequestYLWMSTaskSimple(string stationCode, string palletCode);
        /// <summary>
        /// åŽŸæ–™å…¥åº“ç”³è¯·
        /// </summary>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        WebResponseContent YLPurchaseBoxing(string palletCode);
        /// <summary>
        /// åˆ†é…åŽŸæ–™å··é“
@@ -159,7 +166,7 @@
        /// è¾…料入库
        /// </summary>
        /// <returns></returns>
        WebResponseContent InboundFLTask(string barCode, string startPoint, string matCode, int matCount);
        WebResponseContent InboundFLOrCPTask(string barCode, string startPoint, string matCode, int matCount);
        /// <summary>
        /// æˆå“å‡ºåº“
@@ -215,5 +222,11 @@
        /// <param name="saveModel"></param>
        /// <returns></returns>
        WebResponseContent PrintInbound(SaveModel saveModel);
        /// <summary>
        /// åˆ›å»ºåŽŸçº¸ç”Ÿäº§æŽ’ç¨‹å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        WebResponseContent CreateBSTOutboundTasks(int[] keys);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/PurchaseBSTOrderService.cs
@@ -6,7 +6,9 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEA_BasicRepository;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
@@ -57,21 +59,47 @@
                List<BSTPurchaseOrderDTO> bSTPurchaseOrderDTOsUpdate = bSTPurchaseOrderDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTPurchaseOrderDTO> bSTPurchaseOrderDTOsDel = bSTPurchaseOrderDTOs.Where(x => x.Way == 3).ToList();
                //获取所有物料
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
                //获取所有供应商
                List<Dt_SupplierInfo> supplierInfos = _basicRepository.SupplierInfoRepository.QueryData(x => x.InvOrgId == MaterielInvOrgEnum.老厂.ObjToInt());
                List<Dt_PurchaseBSTOrder> purchaseAddBSTOrders = new List<Dt_PurchaseBSTOrder>();
                List<Dt_PurchaseBSTOrder> purchaseUpdateBSTOrders = new List<Dt_PurchaseBSTOrder>();
                List<Dt_PurchaseBSTOrder> purchaseDeleteBSTOrders = new List<Dt_PurchaseBSTOrder>();
                if (bSTPurchaseOrderDTOsAdd.Count>0)
                {
                    //判断重复插入
                    //判断供应商
                    BSTPurchaseOrderDTO? bSTPurchaseOrderDTO = bSTPurchaseOrderDTOsAdd.FirstOrDefault(x => !supplierInfos.Select(x=>x.SupplierCode).Contains(x.VendNo));
                    if (bSTPurchaseOrderDTO != null)
                    {
                        return content.Error($"采购{nameof(BSTPurchaseOrderDTO.PaperReceiptNo)}:{bSTPurchaseOrderDTO.PaperReceiptNo}供应商:{bSTPurchaseOrderDTO.VendNo}不存在");
                    }
                    //判断单据
                    Dt_PurchaseBSTOrder? ExistAddPurchase = OldpurchaseBSTOrders.FirstOrDefault(x => bSTPurchaseOrderDTOsAdd.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId));
                    if (ExistAddPurchase != null)
                    {
                        return content.Error($"采购收货Id{nameof(BSTPurchaseOrderDTO.PaperReceiptId)}:{ExistAddPurchase.PaperReceiptId}已存在");
                    }
                    //验证条码重复
                    List<Dt_PurchaseBSTOrderDetail> purchaseBSTOrderDetails = OldpurchaseBSTOrders.SelectMany(x => x.Details).ToList();
                    List<PaperReceiptDetailsItem> paperReceiptDetailsItems = bSTPurchaseOrderDTOsAdd.SelectMany(x => x.PaperReceiptDetails).ToList();
                    var ExistDetail = purchaseBSTOrderDetails.FirstOrDefault(x => paperReceiptDetailsItems.Select(x => x.Barcode).Contains(x.Barcode));
                    if (ExistDetail!=null)
                    {
                        return content.Error($"采购条码{nameof(ExistDetail.Barcode)}:{ExistDetail.Barcode}已存在");
                    }
                    //判断是否存在物料
                    PaperReceiptDetailsItem? paperReceiptDetailsItem = paperReceiptDetailsItems.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    if (paperReceiptDetailsItem!=null)
                    {
                        return content.Error($"采购条码{nameof(ExistDetail.Barcode)}:{ExistDetail.Barcode}物料Id:{paperReceiptDetailsItem.MaterialId}不存在");
                    }
                    foreach (var item in bSTPurchaseOrderDTOsAdd)
                    {
                        List<Dt_PurchaseBSTOrderDetail> bSTOrderDetails = item.PaperReceiptDetails.Select(x=>_mapper.Map<Dt_PurchaseBSTOrderDetail>(x)).ToList();
                        Dt_PurchaseBSTOrder purchaseBSTOrder = _mapper.Map<Dt_PurchaseBSTOrder>(item);
                        purchaseBSTOrder.Details = bSTOrderDetails;
                        purchaseAddBSTOrders.Add(purchaseBSTOrder);
                    }
                }
@@ -90,10 +118,28 @@
                        return content.Error($"未找到指定采购收货单{nameof(BSTPurchaseOrderDTO.PaperReceiptId)}:{bSTPurchaseOrderDTO?.PaperReceiptId}");
                    }
                }
                if (bSTPurchaseOrderDTOsDel.Count>0)
                {
                    List<Dt_PurchaseBSTOrder>? ExistDelPurchase = OldpurchaseBSTOrders.Where(x => bSTPurchaseOrderDTOsDel.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId)).ToList();
                    //更新的单据是否存在
                    if (ExistDelPurchase.Count == bSTPurchaseOrderDTOsDel.Count)
                    {
                    }
                    else
                    {
                        BSTPurchaseOrderDTO? bSTPurchaseOrderDTO = bSTPurchaseOrderDTOsDel.FirstOrDefault(x => !ExistDelPurchase.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId));
                        return content.Error($"未找到指定采购收货单{nameof(BSTPurchaseOrderDTO.PaperReceiptId)}:{bSTPurchaseOrderDTO?.PaperReceiptId}");
                    }
                }
                _unitOfWorkManage.BeginTran();
                BaseDal.Db.InsertNav(purchaseAddBSTOrders).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutBSTOrder.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// BST出库排程单
    /// </summary>
    [SugarTable(nameof(Dt_OutBSTOrder), "BST出库排程单"), ModelValidate]
    public class Dt_OutBSTOrder : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// ä»“库主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        public int WarehouseId { get; set; }
        /// <summary>
        /// å‡ºåº“来源ID
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库来源ID")]
        public int BoardMpsId { get; set; }
        /// <summary>
        /// WMS单据编号
        /// </summary>
        [CodeRule(RuleCodeEnum.OutboundOrderRule)]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "WMS单据编号", IsOnlyIgnoreUpdate = true)]
        public string OutBSTOrderNo { get; set; }
        /// <summary>
        /// å‡ºåº“编号(上游)
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "出库编号(上游)")]
        public string BoardMpsNo { get; set; }
        /// <summary>
        /// å‡ºåº“单状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库单状态")]
        public int OutBSTOrderStatus { get; set; }
        /// <summary>
        /// å‡ºåº“计划时间
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "出库计划时间")]
        public DateTime ProductionDate { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// é‡‡è´­åˆ—表
        /// </summary>
        [Navigate(NavigateType.OneToMany, nameof(Dt_OutBSTOrderDetail.OutBSTOrderId), nameof(Id))]
        public List<Dt_OutBSTOrderDetail> Details { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutBSTOrderDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// BST出库排程明细
    /// </summary>
    [SugarTable(nameof(Dt_OutBSTOrderDetail), "BST出库排程明细"), ModelValidate]
    public class Dt_OutBSTOrderDetail : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// å‡ºåº“主表ID
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库主表ID")]
        public int OutBSTOrderId { get; set; }
        /// <summary>
        /// å…³è”的主表ID(上游)
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "关联的主表ID(上游)")]
        public int BoardMpsId { get; set; }
        /// <summary>
        /// å¹…宽
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "幅宽")]
        public decimal Width { get; set; }
        /// <summary>
        /// éœ€æ±‚长度
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "需求长度")]
        public decimal XqLen { get; set; }
        /// <summary>
        /// æ€»ç”¨é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "总用量")]
        public decimal TotalUsage { get; set; }
        /// <summary>
        /// ç‰©æ–™æ¥æºID(上游)
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料来源ID(上游)")]
        public int MaterialId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料编号")]
        public string MaterialNo { get; set; }
        /// <summary>
        /// é‡‡è´­é•¿åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "采购长度")]
        public decimal ProcurementLength { get; set; }
        /// <summary>
        /// å·²åˆ†é…ç”¨é‡
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "已分配用量")]
        public decimal AssignTotalUsage { get; set; }
        /// <summary>
        /// å·²å‡ºç”¨é‡
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "已出用量")]
        public decimal OutTotalUsage { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "物料名称")]
        public string MaterialName { get; set; }
        /// <summary>
        /// å‡ºåº“单明细状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库单明细状态")]
        public int OutBSTOrderDetailStatus { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// å‡ºåº“详情
    /// </summary>
    [SugarTable(nameof(Dt_OutStockLockInfo), "出库详情")]
    public class Dt_OutStockLockInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// å•据编号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "单据编号")]
        public string OrderNo { get; set; }
        /// <summary>
        /// å•据明细主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据明细主键")]
        public int OrderDetailId { get; set; }
        /// <summary>
        /// ç‰©æ–™Id
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料Id")]
        public int MaterielId { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "批次号")]
        public string BatchNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        /// <summary>
        /// åº“存主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "库存主键")]
        public int StockId { get; set; }
        /// <summary>
        /// å•据数量
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据数量")]
        public decimal OrderQuantity { get; set; }
        /// <summary>
        /// åŽŸå§‹åº“å­˜é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "原始库存量")]
        public decimal OriginalQuantity {  get; set; }
        /// <summary>
        /// åˆ†é…å‡ºåº“量
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "分配出库量")]
        public decimal AssignQuantity {  get; set; }
        /// <summary>
        /// è´§ä½ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "货位编号")]
        public string LocationCode { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "托盘编号")]
        public string PalletCode { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "任务号")]
        public int? TaskNum { get; set; }
        /// <summary>
        /// çŠ¶æ€
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "状态")]
        public int Status { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Stock/Dt_ProStockInfoDetail.cs
@@ -32,6 +32,26 @@
        public string ProductCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料名称")]
        public string ProductName { get; set; }
        /// <summary>
        /// è§„æ ¼
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "规格")]
        public string ProductSpec { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "单位")]
        public string ProductUnit { get; set; }
        /// <summary>
        /// åº“存数
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "库存数")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs
@@ -64,6 +64,12 @@
        public int StockStatus { get; set; }
        /// <summary>
        /// ç‰©æ–™Id
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "物料Id")]
        public int MaterielId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
@@ -97,7 +103,7 @@
        /// åº“存物料总长(m)
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "库存物料总长(m)")]
        public int StockLength { get; set; }
        public decimal StockLength { get; set; }
        /// <summary>
        /// ç‰©æ–™é‡é‡
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs
@@ -168,6 +168,6 @@
        [ImporterHeader(Name = "物料数量")]
        [ExporterHeader(DisplayName = "物料数量")]
        [SugarColumn(IsNullable = true, Length = 20, ColumnDescription = "物料数量")]
        public float Quantity { get; set; }
        public decimal Quantity { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/WIDESEA_Model.csproj
@@ -18,7 +18,6 @@
    <ItemGroup>
      <Folder Include="Models\Check\" />
      <Folder Include="Models\Outbound\" />
    </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundRepository/OutBSTOrderDetailRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_OutboundRepository
{
    /// <summary>
    /// é‡‡è´­å•仓储实现层
    /// </summary>
    public class OutBSTOrderDetailRepository : RepositoryBase<Dt_OutBSTOrderDetail>, IOutBSTOrderDetailRepository
    {
        public OutBSTOrderDetailRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundRepository/OutBSTOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_OutboundRepository
{
    /// <summary>
    /// BST出库单仓储实现层
    /// </summary>
    public class OutBSTOrderRepository : RepositoryBase<Dt_OutBSTOrder>, IOutBSTOrderRepository
    {
        public OutBSTOrderRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundRepository/OutStockLockInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundRepository
{
    /// <summary>
    /// å‡ºåº“详情信息仓储实现层
    /// </summary>
    public class OutStockLockInfoRepository : RepositoryBase<Dt_OutStockLockInfo>, IOutStockLockInfoRepository
    {
        public OutStockLockInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderDetailService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,166 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
using WIDESEA_OutboundRepository;
namespace WIDESEA_OutboundService
{
    public class OutBSTOrderDetailService : ServiceBase<Dt_OutBSTOrderDetail, IOutBSTOrderDetailRepository>, IOutBSTOrderDetailService
    {
        public IOutBSTOrderDetailRepository Repository => BaseDal;
        private IOutBSTOrderRepository _outBSTOrderRepository;
        private IBasicRepository _basicRepository;
        private IStockService _stockService;
        private IOutStockLockInfoService _outStockLockInfoService;
        private IBasicService _basicService;
        private ILocationStatusChangeRecordService _locationStatusChangeRecordService;
        public OutBSTOrderDetailService(IOutBSTOrderDetailRepository BaseDal, IOutBSTOrderRepository outBSTOrderRepository,IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService,IBasicService basicService, ILocationStatusChangeRecordService locationStatusChangeRecordService) : base(BaseDal)
        {
            _outBSTOrderRepository = outBSTOrderRepository;
            _basicRepository = basicRepository;
            _stockService = stockService;
            _outStockLockInfoService = outStockLockInfoService;
            _basicService = basicService;
            _locationStatusChangeRecordService=locationStatusChangeRecordService;
        }
        /// <summary>
        /// åˆ†é…åº“å­˜
        /// </summary>
        public (List<Dt_StockInfo>, List<Dt_OutBSTOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_OutBSTOrderDetail> outboundOrderDetails)
        {
            if (!outboundOrderDetails.Any())
            {
                throw new Exception($"未找到出库单明细信息");
            }
            if (outboundOrderDetails.GroupBy(x => x.OutBSTOrderId).Count() > 1)
            {
                throw new Exception($"请勿同时操作多个单据明细");
            }
            //获取排程主表
            Dt_OutBSTOrder outBSTOrder = _outBSTOrderRepository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OutBSTOrderId);
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            //对出库物料进行分组
            List<Dt_OutBSTOrderDetail> groupDetails = outboundOrderDetails.GroupBy(x => new { x.MaterialId,x.Width }).Select(x =>
            new Dt_OutBSTOrderDetail {
                XqLen = x.Sum(v => v.XqLen),
                MaterialId = x.Key.MaterialId,
                Width=x.Key.Width
            }
            ).ToList();
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == outBSTOrder.WarehouseId);
            //出库详情
            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
            //货位存储
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            foreach (var item in groupDetails)
            {
                decimal needQuantity = item.XqLen;
                //获取可用库存
                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(item.MaterialId,item.Width, outBSTOrder.WarehouseId);
                if (!stockInfos.Any())
                {
                    throw new Exception($"未找到可分配库存");
                }
                //分配实际库存
                List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos,  needQuantity).OrderBy(x => x.StockLength - x.StockOutLength).ToList();
                //添加库存分配
                outStocks.AddRange(autoAssignStocks);
                //获取所有该物料单据
                List<Dt_OutBSTOrderDetail> details = outboundOrderDetails.Where(x => x.MaterialId == item.MaterialId).ToList();
                for (int i = 0; i < details.Count; i++)
                {
                    //订单数量
                    decimal orderQuantity = details[i].XqLen;
                    for (int j = 0; j < autoAssignStocks.Count; j++)
                    {
                        //出库订单明细已分配数量
                        decimal detailAssignQuantity = outStockLockInfos.Where(x => x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);
                        decimal orderDetailNeedQuantity = details[i].XqLen - detailAssignQuantity;
                        decimal useStockLength = autoAssignStocks[j].StockLength;
                        if (orderDetailNeedQuantity > useStockLength)
                        {
                            //生成详情
                            Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(outBSTOrder, details[i], autoAssignStocks[j], useStockLength);
                            outStockLockInfos.Add(outStockLockInfo);
                            details[i].AssignTotalUsage += useStockLength;
                        }
                        else
                        {
                            //生成详情
                            Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(outBSTOrder, details[i], autoAssignStocks[j], orderDetailNeedQuantity);
                            outStockLockInfos.Add(outStockLockInfo);
                            details[i].AssignTotalUsage = orderQuantity;
                            break;
                        }
                    }
                }
                locationInfos.AddRange(_basicRepository.LocationInfoRepository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
            }
            return (outStocks, outboundOrderDetails, outStockLockInfos, locationInfos);
        }
        /// <summary>
        /// å‡ºåº“库存分配后,更新数据库数据
        /// </summary>
        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutBSTOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
        {
            try
            {
                _stockService.StockInfoService.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);
            }
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Basic;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_OutboundService
{
    public class OutBSTOrderService : ServiceBase<Dt_OutBSTOrder, IOutBSTOrderRepository>, IOutBSTOrderService
    {
        public IOutBSTOrderRepository Repository => BaseDal;
        private readonly IBasicRepository _basicRepository;
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public OutBSTOrderService(IOutBSTOrderRepository BaseDal,IBasicRepository basicRepository,IMapper mapper,IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
        }
        /// <summary>
        /// æ·»åŠ å‡ºåº“æŽ’ç¨‹ä¿¡æ¯
        /// </summary>
        public WebResponseContent AddOutBSTOrder(List<BSTOutOrderDTO> bSTOutOrderDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有出库单
                List<Dt_OutBSTOrder> OldoutBSTOrders = BaseDal.Db.Queryable<Dt_OutBSTOrder>().Includes(x => x.Details).ToList();
                //新增
                List<BSTOutOrderDTO> outOrderDTOsAdd = bSTOutOrderDTOs.Where(x => x.Way == 1).ToList();
                //修改
                List<BSTOutOrderDTO> outOrderDTOsUpdate = bSTOutOrderDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTOutOrderDTO> outOrderDTOsDel = bSTOutOrderDTOs.Where(x => x.Way == 3).ToList();
                //获取所有物料
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
                List<Dt_OutBSTOrder> outBSTAddOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrder> outBSTUpOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrder> outBSTDelOrders = new List<Dt_OutBSTOrder>();
                //新增
                if (outOrderDTOsAdd.Count>0)
                {
                    //判断单据
                    Dt_OutBSTOrder? ExistAddOutOrder = OldoutBSTOrders.FirstOrDefault(x => outOrderDTOsAdd.Select(x => x.BoardMpsId).Contains(x.BoardMpsId));
                    if (ExistAddOutOrder != null)
                    {
                        return content.Error($"出库排程Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{ExistAddOutOrder.BoardMpsId}已存在");
                    }
                    List<BstBoardMpsDetailItem> bstBoardMpsDetailItems = outOrderDTOsAdd.SelectMany(x => x.BstBoardMpsDetails).ToList();
                    //判断是否存在物料
                    BstBoardMpsDetailItem? bstBoardMpsDetailItem = bstBoardMpsDetailItems.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    if (bstBoardMpsDetailItem != null)
                    {
                        return content.Error($"生产排程{nameof(bstBoardMpsDetailItem.BoardMpsId)}物料Id:{bstBoardMpsDetailItem.MaterialId}不存在");
                    }
                    foreach (var item in outOrderDTOsAdd)
                    {
                        List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                        Dt_OutBSTOrder outBSTOrder = _mapper.Map<Dt_OutBSTOrder>(item);
                        outBSTOrder.Details=bSTOrderDetails;
                        outBSTAddOrders.Add(outBSTOrder);
                    }
                }
                //修改
                if (outOrderDTOsUpdate.Count > 0)
                {
                    List<Dt_OutBSTOrder>? ExistUpdateoutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsUpdate.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList();
                    //更新的单据是否存在
                    if (ExistUpdateoutBSTOrders.Count == outOrderDTOsUpdate.Count)
                    {
                    }
                    else
                    {
                        BSTOutOrderDTO? bSTOutOrderDTO = outOrderDTOsUpdate.FirstOrDefault(x => !ExistUpdateoutBSTOrders.Select(x => x.BoardMpsId).Contains(x.BoardMpsId));
                        return content.Error($"未找到指定生产排程单Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{bSTOutOrderDTO?.BoardMpsId}");
                    }
                }
                //删除
                if (outOrderDTOsDel.Count > 0)
                {
                    List<Dt_OutBSTOrder>? ExistDeloutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsDel.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList();
                    //更新的单据是否存在
                    if (ExistDeloutBSTOrders.Count == outOrderDTOsDel.Count)
                    {
                    }
                    else
                    {
                        BSTOutOrderDTO? bSTOutOrderDTO = outOrderDTOsDel.FirstOrDefault(x => !ExistDeloutBSTOrders.Select(x => x.BoardMpsId).Contains(x.BoardMpsId));
                        return content.Error($"未找到指定生产排程单Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{bSTOutOrderDTO?.BoardMpsId}");
                    }
                }
                _unitOfWorkManage.BeginTran();
                BaseDal.Db.InsertNav(outBSTAddOrders).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutStockLockInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_IOutboundRepository;
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public partial class OutStockLockInfoService : ServiceBase<Dt_OutStockLockInfo, IOutStockLockInfoRepository>, IOutStockLockInfoService
    {
        private readonly IStockService _stockService;
        private readonly IRecordService _recordService;
        public IOutStockLockInfoRepository Repository => BaseDal;
        public IUnitOfWorkManage _unitOfWorkManage;
        public OutStockLockInfoService(IOutStockLockInfoRepository BaseDal, IStockService stockService, IRecordService recordService, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _recordService = recordService;
            _stockService = stockService;
            _unitOfWorkManage = unitOfWorkManage;
        }
        public List<Dt_OutStockLockInfo> GetByOrderDetailId(string orderNo, int orderDetailId, OutLockStockStatusEnum? outStockStatus)
        {
            return BaseDal.QueryData(x =>x.OrderNo== orderNo && x.OrderDetailId == orderDetailId && outStockStatus == null ? true : x.Status == outStockStatus.ObjToInt());
        }
        /// <summary>
        /// ç”Ÿæˆå‡ºåº“详情
        /// </summary>
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutBSTOrder outBSTOrder, Dt_OutBSTOrderDetail outboundOrderDetail, Dt_StockInfo outStock, decimal assignQuantity, int? taskNum = null)
        {
            Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
            {
                PalletCode = outStock.PalletCode,
                AssignQuantity = assignQuantity,
                MaterielCode = outboundOrderDetail.MaterialNo,
                BatchNo = "",
                LocationCode = outStock.LocationCode,
                MaterielName = outStock.MaterielName,
                OrderDetailId = outboundOrderDetail.Id,
                OrderNo = outBSTOrder.OutBSTOrderNo,
                MaterielId = outStock.MaterielId,
                OriginalQuantity = outStock.StockLength,
                Status = taskNum == null ? OutLockStockStatusEnum.已分配.ObjToInt() : OutLockStockStatusEnum.出库中.ObjToInt(),
                StockId = outStock.Id,
                TaskNum = taskNum,
                OrderQuantity = outboundOrderDetail.XqLen,
                Unit = outStock.Unit
            };
            return outStockLockInfo;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockRepository/StockInfoRepository.cs
@@ -32,18 +32,9 @@
            return Db.Queryable<Dt_StockInfo>().Where(x => x.MaterielCode == materielCode).ToList();
        }
        public List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, List<string> locationCodes)
        public List<Dt_StockInfo> GetStockInfos(int materielId,decimal width,  List<string> locationCodes)
        {
            List<Dt_StockInfo> stockInfos = null;
            if (!string.IsNullOrEmpty(lotNo))
            {
                var stockSort = Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode) && x.MaterielCode == materielCode && x.BatchNo == lotNo).ToList();
            }
            else
            {
                var stockSort = Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode) && x.MaterielCode == materielCode).ToList();
            }
            List<Dt_StockInfo> stockInfos = Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode) && x.MaterielId == materielId && x.MaterielWide==width && x.StockOutLength<=0).OrderBy(x=>x.CreateDate).ToList();
            return stockInfos;
        }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/ProStockViewService.cs
@@ -127,6 +127,9 @@
                stockViewDTOs.ForEach(x =>
                    {
                        x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct());
                        x.ProductName = x.Details.FirstOrDefault()?.ProductName ?? "";
                        x.ProductSpec = x.Details.FirstOrDefault()?.ProductSpec ?? "";
                        x.ProductUnit = x.Details.FirstOrDefault()?.ProductUnit ?? "";
                    }
                );
                return new PageGridData<ProStockViewDTO>(totalCount + pktotalCount, stockViewDTOs.OrderByDescending(x=>x.CreateDate).ToList());
@@ -259,7 +262,9 @@
                stockViewDTOs.ForEach(x =>
                {
                    x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct());
                    x.StockRemark = warehouses.FirstOrDefault(v => v.WarehouseId == x.WarehouseId).WarehouseName;
                    x.ProductName = x.Details.FirstOrDefault()?.ProductName ?? "";
                    x.ProductSpec = x.Details.FirstOrDefault()?.ProductSpec ?? "";
                    x.ProductUnit = x.Details.FirstOrDefault()?.ProductUnit ?? "";
                }
                );
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -114,21 +114,48 @@
            return content;
        }
        public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, int warehoseId)
        public List<Dt_StockInfo> GetUseableStocks(int materielId,decimal width, int warehoseId)
        {
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
            return BaseDal.GetStockInfos(materielId,width, locationCodes);
        }
        public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, string palletcode, int warehoseId)
        /// <summary>
        /// åˆ†é…å®žé™…库存
        /// </summary>
        /// <returns></returns>
        public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity)
        {
            Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletcode && x.WarehouseId == warehoseId).First();
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(stockInfo.LocationCode);
            return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            //获取库存可用数量
            decimal stockTotalQuantity = stockInfos.Sum(x => x.StockLength-x.StockOutLength);
            if (stockTotalQuantity >= needQuantity)//库存够
            {
                int index = 0;
                while (needQuantity > 0)
                {
                    Dt_StockInfo stockInfo = stockInfos[index];
                    decimal useableStockQuantity = stockInfo.StockLength-stockInfo.StockOutLength;
                    if (useableStockQuantity < needQuantity && useableStockQuantity > 0)
                    {
                        stockInfo.StockOutLength=stockInfo.StockLength;
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.StockOutLength += needQuantity;
                        needQuantity = 0;
                    }
                    outStocks.Add(stockInfo);
                    index++;
                }
            }
            else
            {
                throw new Exception("库存不足");
            }
            return outStocks;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_SystemService/Sys_DictionaryService.cs
@@ -109,22 +109,6 @@
                }
                vueDictionaryDTOs.AddRange(selectDics);
            }
            //object GetSourceData(string dicNo, string dbSql, object data)
            //{
            //    if (string.IsNullOrEmpty(dbSql))
            //    {
            //        return data;
            //    }
            //    return BaseDal.QueryObjectDataBySql(dbSql, null);
            //}
            //List<VueDictionaryDTO> vueDictionaryDTOs = dicConfig.Select(item => new VueDictionaryDTO
            //{
            //    DicNo = item.dicNo,
            //    Config = item.config,
            //    Data = GetSourceData(item.dicNo, item.dbSql, item.list)
            //}).ToList();
            try
            {
                List<string> dicList = dicNos.ToList();
@@ -427,26 +411,6 @@
                        {
                            List<object> data = new List<object>();
                            //{
                            //    Type type = typeof(TaskTypeEnum);
                            //    List<int> enums = Enum.GetValues(typeof(TaskTypeEnum)).Cast<int>().ToList();
                            //    int index = 0;
                            //    foreach (var item in enums)
                            //    {
                            //        FieldInfo? fieldInfo = typeof(TaskTypeEnum).GetField(((TaskTypeEnum)item).ToString());
                            //        DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                            //        if (description != null)
                            //        {
                            //            data.Add(new { key = item.ToString(), value = description.Description });
                            //        }
                            //        else
                            //        {
                            //            data.Add(new { key = item.ToString(), value = item.ToString() });
                            //        }
                            //        index++;
                            //    }
                            //}
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
@@ -474,25 +438,6 @@
                                }
                            }
                            //{
                            //    Type type = typeof(TaskStatusEnum);
                            //    List<int> enums = Enum.GetValues(typeof(TaskStatusEnum)).Cast<int>().ToList();
                            //    int index = 0;
                            //    foreach (var item in enums)
                            //    {
                            //        FieldInfo? fieldInfo = typeof(TaskStatusEnum).GetField(((TaskStatusEnum)item).ToString());
                            //        DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                            //        if (description != null)
                            //        {
                            //            data.Add(new { key = item.ToString(), value = description.Description });
                            //        }
                            //        else
                            //        {
                            //            data.Add(new { key = item.ToString(), value = item.ToString() });
                            //        }
                            //        index++;
                            //    }
                            //}
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
@@ -690,6 +635,33 @@
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
                    case "materielUnitEnum":
                        {
                            List<object> data = new List<object>();
                            {
                                Type type = typeof(MaterielUnitEnum);
                                List<string> enumNames = Enum.GetNames(typeof(MaterielUnitEnum)).ToList();
                                int index = 0;
                                foreach (var item in enumNames)
                                {
                                    FieldInfo? fieldInfo = typeof(MaterielUnitEnum).GetField((item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
                    case "agvStationAreaEnum":
                        {
                            List<object> data = new List<object>();
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs
@@ -40,6 +40,10 @@
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_IInboundRepository;
using WIDESEA_InboundRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_IRecordService;
using WIDESEA_IStockRepository;
using WIDESEA_IStockService;
@@ -63,6 +67,11 @@
        private readonly IInvokeERPService _invokeERPService;
        private readonly IPalletTypeInfoRepository _palletTypeInfoRepository;
        private readonly IAGVStationInfoRepository _agvStationInfoRepository;
        private readonly IPurchaseBSTOrderRepository _purchaseBSTOrderRepository;
        private readonly IPurchaseBSTOrderDetailRepository _purchaseBSTOrderDetailRepository;
        private readonly IOutBSTOrderDetailRepository _outBSTOrderDetailRepository;
        private readonly IOutBSTOrderRepository _outBSTOrderRepository;
        private readonly IOutBSTOrderDetailService _outBSTOrderDetailService;
        public ITaskRepository Repository => BaseDal;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
@@ -75,7 +84,7 @@
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 100 && x < 500).ToList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IPalletTypeInfoRepository palletTypeInfoRepository, IAGVStationInfoRepository agvStationInfoRepository) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IPalletTypeInfoRepository palletTypeInfoRepository, IAGVStationInfoRepository agvStationInfoRepository, IPurchaseBSTOrderRepository purchaseBSTOrderRepository, IPurchaseBSTOrderDetailRepository purchaseBSTOrderDetailRepository, IOutBSTOrderDetailRepository outBSTOrderDetailRepository, IOutBSTOrderRepository outBSTOrderRepository,IOutBSTOrderDetailService outBSTOrderDetailService) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -88,6 +97,11 @@
            _invokeERPService = invokeERPService;
            _palletTypeInfoRepository = palletTypeInfoRepository;
            _agvStationInfoRepository = agvStationInfoRepository;
            _purchaseBSTOrderRepository = purchaseBSTOrderRepository;
            _purchaseBSTOrderDetailRepository = purchaseBSTOrderDetailRepository;
            _outBSTOrderRepository= outBSTOrderRepository;
            _outBSTOrderDetailRepository= outBSTOrderDetailRepository;
            _outBSTOrderDetailService= outBSTOrderDetailService;
        }
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -20,6 +20,7 @@
using WIDESEA_DTO;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Task;
using WIDESEA_External.Model;
using WIDESEA_Model.Models;
namespace WIDESEA_TaskInfoService
@@ -131,7 +132,7 @@
                {
                    return content.Error($"未找到组盘信息");
                }
                if (stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt())
                if (stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                {
                    return content.Error($"该托盘状态不正确,不可申请入库");
                }
@@ -159,6 +160,10 @@
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
                }
                else
                {
                    stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                }
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
@@ -174,6 +179,86 @@
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åŽŸæ–™è¯·æ±‚ç»„ç›˜
        /// </summary>
        /// <returns></returns>
        public WebResponseContent YLPurchaseBoxing(string palletCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
                {
                    return content.OK($"新厂临时入库{stockInfoOld.PalletCode}");
                }
                else if (stockInfoOld != null)
                {
                    return content.Error($"条码{stockInfoOld.PalletCode}信息已存在");
                }
                //获取采购信息
                Dt_PurchaseBSTOrderDetail purchaseBSTOrderDetail = _purchaseBSTOrderDetailRepository.QueryFirst(x=>x.Barcode== palletCode);
                if (purchaseBSTOrderDetail == null)
                {
                    return content.Error($"未找到条码{palletCode}采购信息");
                }
                if (purchaseBSTOrderDetail.PurchaseBSTOrderDetailStatus!=InOrderStatusEnum.未开始.ObjToInt())
                {
                    return content.Error($"采购{purchaseBSTOrderDetail.Barcode}信息已入库或入库中");
                }
                else
                {
                    purchaseBSTOrderDetail.PurchaseBSTOrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
                }
                //获取采购主单
                Dt_PurchaseBSTOrder purchaseBSTOrder = _purchaseBSTOrderRepository.QueryFirst(x=>x.Id==purchaseBSTOrderDetail.PurchaseBSTOrderId);
                //获取物料
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == purchaseBSTOrderDetail.MaterialId);
                //生成库存组盘信息
                Dt_StockInfo stockInfo = new Dt_StockInfo()
                {
                    MaterielInvOrgId = materielInfo.MaterielInvOrgId,
                    PalletCode = purchaseBSTOrderDetail.Barcode,
                    LocationCode = "",
                    PalletType = 1,
                    WarehouseId = materielInfo.WarehouseId,
                    StockAttribute = materielInfo.MaterielSourceType,
                    StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                    MaterielSpec = materielInfo.MaterielSpec,
                    Unit = materielInfo.MaterielUnit,
                    MaterielThickness = purchaseBSTOrderDetail.MaterialThick,
                    MaterielWide = purchaseBSTOrderDetail.MaterialWide,
                    MaterielWeight = purchaseBSTOrderDetail.DeliveryQty,
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName = materielInfo.MaterielName,
                    StockLength= purchaseBSTOrderDetail.ProcurementLength,
                    MaterielId= purchaseBSTOrderDetail.MaterialId
                };
                if (purchaseBSTOrderDetail.MaterialWide > 1200)
                {
                    stockInfo.PalletType = 2;
                }
                _unitOfWorkManage.BeginTran();
                //新增组盘信息
                _stockRepository.StockInfoRepository.AddData(stockInfo);
                if (purchaseBSTOrder.PurchaseOrderStatus==InOrderStatusEnum.未开始.ObjToInt())
                {
                    purchaseBSTOrder.PurchaseOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                    _purchaseBSTOrderRepository.UpdateData(purchaseBSTOrder);
                }
                _purchaseBSTOrderDetailRepository.UpdateData(purchaseBSTOrderDetail);
                _unitOfWorkManage.CommitTran();
                content.OK("请求成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        public string AssignYLRoadwayNo(string palletCode)
        {
@@ -192,15 +277,27 @@
                }
                string roadwayNo = "";
                //限制直径
                if (stockInfo.MaterielThickness > 800)
                {
                    //获取分配
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    if (stockInfo.MaterielWide > 2200)
                    {
                        locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo=="SC02_YL").GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    }
                    List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                    && locationCounts.Select(j => j.RoadwayNo).Contains(x.Roadway)
                    && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                    foreach (var item in locationCounts)
                    {
                        LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                        if (count != null)
                        {
                            item.Count -= count.Count;
                        }
                    }
                    roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
@@ -215,6 +312,7 @@
        /// </summary>
        public WebResponseContent InboundTaskCompleted(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
@@ -223,7 +321,7 @@
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                        return content.Error($"未找到对应的终点货位信息");
                    }
                    Dt_AGVStationInfo agvstation = _agvStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.SourceAddress && ( x.StationArea == AGVStationAreaEnum.AreaA.ObjToInt() || x.StationArea == AGVStationAreaEnum.AreaC.ObjToInt()));
                    if (agvstation != null)
@@ -268,22 +366,24 @@
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"未找到对应库存信息");
                        return content.Error($"未找到对应库存信息");
                    }
                }
                else//原料库完成
                {
                    //获取库存
                    Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    if (stockInfo == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应库存信息");
                        return content.Error($"未找到对应库存信息");
                    }
                    //获取货位信息
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                        return content.Error($"未找到对应的终点货位信息");
                    }
                    //更新状态
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    if (task.TaskType == TaskTypeEnum.InPick.ObjToInt())
@@ -296,15 +396,31 @@
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _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.自动完成);
                    //if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt())
                    //{
                    //    int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
                    //    BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
                    //    {
                    //        Barcode = stockInfo.PalletCode,
                    //        BarcodeQty = Qty,
                    //        Rfid = stockInfo.PalletCode
                    //    };
                    //    BSTResponse bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse>();
                    //    if (bSTResponse.Code==500)
                    //    {
                    //        throw new Exception($"BST一期ERP同步入库信息失败,错误信息{bSTResponse.Msg}");
                    //    }
                    //}
                    _unitOfWorkManage.CommitTran();
                }
                return WebResponseContent.Instance.OK();
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åˆ†é…æˆå“å··é“
@@ -526,14 +642,14 @@
            }
            return content;
        }
        private readonly static object _lockerFL = new object();
        private readonly static object _lockerFLorCP = new object();
        /// <summary>
        /// è¾…料入库
        /// è¾…料成品入库
        /// </summary>
        /// <returns></returns>
        public WebResponseContent InboundFLTask(string barCode, string startPoint,string matCode,int matCount)
        public WebResponseContent InboundFLOrCPTask(string barCode, string startPoint,string matCode,int matCount)
        {
            lock (_lockerFL)
            lock (_lockerFLorCP)
            {
                WebResponseContent content = new WebResponseContent();
                try
@@ -544,7 +660,7 @@
                    //{
                    //    return content.Error($"框码格式错误{barCode}");
                    //}
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && x.MaterielSourceType == MaterielTypeEnum.辅料备件.ObjToInt());
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && x.WarehouseId==WarehouseEnum.LLDCP.ObjToInt());
                    if (materielInfo == null)
                    {
                        return content.Error($"未找到物料信息{matCode}");
@@ -577,14 +693,17 @@
                    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.LLDCP.ToString());
                    Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                    {
                        ProductCode = matCode,
                        ProductCode = materielInfo.MaterielCode,
                        ProductName= materielInfo.MaterielName,
                        ProductSpec=materielInfo.MaterielSpec,
                        ProductUnit=materielInfo.MaterielUnit,
                        StockQty = matCount,
                        ProStockDetailStatus = StockStatusEmun.手动组盘入库确认.ObjToInt()
                    };
                    Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                    {
                        PalletCode = barCode,
                        ProStockAttribute = ProStockAttributeEnum.辅料备件.ObjToInt(),
                        ProStockAttribute = materielInfo.MaterielSourceType,
                        PalletType = 1,
                        LocationCode = "",
                        WarehouseId = warehouse.WarehouseId,
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -94,13 +94,17 @@
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
                    }
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x=>x.proStockInfoDetails).First();
                    if (proStockInfo != null && proStockInfo.StockStatus==StockStatusEmun.出库锁定.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                        proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                        _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo,App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        if (proStockInfo.proStockInfoDetails!=null && proStockInfo.proStockInfoDetails.Count>0)
                        {
                            _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfo.proStockInfoDetails, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        }
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
@@ -173,7 +177,7 @@
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            MaterielCode = stockInfo.MaterielCode,
                            Quantity = 0,
                            Quantity = stockInfo.StockLength,
                        };
                        if (stockInfo.MaterielWide>0)
                        {
@@ -234,7 +238,7 @@
                {
                    return content.Error($"可用缓存数不足");
                }
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.空托.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                if (stockInfos.Count < Count)
                {
@@ -298,7 +302,7 @@
                {
                    return content.Error($"可用缓存数不足");
                }
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.空托.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x => x.CreateDate).Take(Count).ToList();
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.辅料备件.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x => x.CreateDate).Take(Count).ToList();
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                if (stockInfos.Count < Count)
                {
@@ -359,25 +363,23 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
                //获取对应库存
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.QueryData(x=>x.MaterielCode==materielCode && x.MaterielWide== materielWide && x.StockStatus==StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.QueryData(x=> locationInfos.Select(x=>x.LocationCode).Contains(x.LocationCode) && x.MaterielCode==materielCode && x.MaterielWide== materielWide && x.StockStatus==StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                if (stockInfos.Count< Count)
                {
                    return content.Error($"库存{materielCode}数量不足");
                }
                //获取货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                List<Dt_LocationInfo> AssignLocations =new List<Dt_LocationInfo>();
                foreach (var item in stockInfos)
                {
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x=>x.LocationCode==item.LocationCode);
                    if (locationInfo!=null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                    if (locationInfo!=null)
                    {
                        AssignLocations.Add(locationInfo);
                        item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    }
                    else
                    {
                        return content.Error($"货位状态不正确");
                    }
                }
                TaskTypeEnum taskTypeEnum = new();
@@ -406,10 +408,9 @@
                //更新库存状态
                _stockRepository.StockInfoRepository.UpdateData(stockInfos);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(AssignLocations, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos,  LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation,taskNums:tasks.Select(x=>x.TaskNum).ToList());
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(AssignLocations,  LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation,taskNums:tasks.Select(x=>x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
@@ -422,5 +423,156 @@
            }
            return content;
        }
        /// <summary>
        /// åˆ›å»ºåŽŸçº¸ç”Ÿäº§æŽ’ç¨‹å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        public WebResponseContent CreateBSTOutboundTasks(int[] keys)
        {
            WebResponseContent content=new WebResponseContent();
            try
            {
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<Dt_StockInfo> stockInfos = new List<Dt_StockInfo>();
                List<Dt_OutBSTOrderDetail> outBSTOrderDetails = new List<Dt_OutBSTOrderDetail>();
                List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
                List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutBSTOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(keys);
                if (result.Item2 != null && result.Item2.Count > 0)
                {
                    stockInfos.AddRange(result.Item2);
                }
                if (result.Item3 != null && result.Item3.Count > 0)
                {
                    outBSTOrderDetails.AddRange(result.Item3);
                }
                if (result.Item4 != null && result.Item4.Count > 0)
                {
                    outStockLockInfos.AddRange(result.Item4);
                }
                if (result.Item5 != null && result.Item5.Count > 0)
                {
                    locationInfos.AddRange(result.Item5);
                }
                if (result.Item1 != null && result.Item1.Count > 0)
                {
                    tasks.AddRange(result.Item1);
                }
                return GenerateOutboundTaskDataUpdate(tasks, stockInfos, outBSTOrderDetails, outStockLockInfos, locationInfos);
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// å‡ºåº“任务数据处理
        /// </summary>
        /// <param name="orderDetailId"></param>
        /// <param name="stockSelectViews"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutBSTOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int[] keys)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            List<Dt_OutBSTOrderDetail> outboundOrderDetails = _outBSTOrderDetailRepository.QueryData(x => keys.Contains(x.Id));
            if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
            {
                throw new Exception("未找到出库单明细信息");
            }
            Dt_OutBSTOrderDetail? outBSTOrderDetail = outboundOrderDetails.FirstOrDefault(x => x.OutBSTOrderDetailStatus != OutOrderStatusEnum.未开始.ObjToInt());
            if (outBSTOrderDetail!=null)
            {
                throw new Exception($"出库明细物料{outBSTOrderDetail.MaterialNo},出库中或已完成");
            }
            List<Dt_StockInfo>? stockInfos = null;
            List<Dt_OutBSTOrderDetail>? orderDetails = null;
            List<Dt_OutStockLockInfo>? outStockLockInfos = null;
            List<Dt_LocationInfo>? locationInfos = null;
            //分配库存
            (List<Dt_StockInfo>, List<Dt_OutBSTOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outBSTOrderDetailService.AssignStockOutbound(outboundOrderDetails);
            if (result.Item1 != null && result.Item1.Count > 0)
            {
                Dt_OutBSTOrder outBSTOrder = _outBSTOrderRepository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OutBSTOrderId);
                //获取任务
                tasks = GetTasks(result.Item1, TaskTypeEnum.OldYLOutbound);
                tasks.ForEach(x =>
                {
                    x.OrderNo = outBSTOrder.BoardMpsNo;
                });
                result.Item2.ForEach(x =>
                {
                    x.OutBSTOrderDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                });
                result.Item3.ForEach(x =>
                {
                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                });
                stockInfos = result.Item1;
                orderDetails = result.Item2;
                outStockLockInfos = result.Item3;
                locationInfos = result.Item4;
            }
            else
            {
                throw new Exception("无库存");
            }
            return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos);
        }
        /// <summary>
        /// ç”Ÿæˆå‡ºåº“任务后数据更新到数据库
        /// </summary>
        public WebResponseContent GenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_OutBSTOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null)
        {
            try
            {
                _unitOfWorkManage.BeginTran();
                BaseDal.AddData(tasks);
                if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                {
                    stockInfos.ForEach(x =>
                    {
                        x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    });
                    outboundOrderDetails.ForEach(x =>
                    {
                        x.OutBSTOrderDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                    });
                    Dt_OutBSTOrder outBSTOrder = _outBSTOrderRepository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OutBSTOrderId);
                    if (outBSTOrder.OutBSTOrderStatus == OutOrderStatusEnum.未开始.ObjToInt())
                    {
                        outBSTOrder.OutBSTOrderStatus = OutOrderStatusEnum.出库中.ObjToInt();
                        _outBSTOrderRepository.UpdateData(outBSTOrder);
                    }
                    WebResponseContent content = _outBSTOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
                    if (!content.Status)
                    {
                        _unitOfWorkManage.RollbackTran();
                        return content;
                    }
                }
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs
@@ -16,6 +16,7 @@
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_IInboundService;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
using static WIDESEA_DTO.ErpResponseContent;
@@ -31,12 +32,14 @@
        private readonly IBasicService _basicService;
        private readonly IInvokeERPService _invokeERPService;
        private readonly IPurchaseBSTOrderService _purchaseBSTOrderService;
        private readonly IOutBSTOrderService _outBSTOrderService;
        public ErpBSTController(IBasicService basicService, IInvokeERPService invokeERPService,IPurchaseBSTOrderService purchaseBSTOrderService)
        public ErpBSTController(IBasicService basicService, IInvokeERPService invokeERPService,IPurchaseBSTOrderService purchaseBSTOrderService,IOutBSTOrderService outBSTOrderService)
        {
            _basicService = basicService;
            _invokeERPService = invokeERPService;
            _purchaseBSTOrderService = purchaseBSTOrderService;
            _outBSTOrderService = outBSTOrderService;
        }
        /// <summary>
        /// æ·»åŠ è€åŽ‚ç‰©æ–™
@@ -69,5 +72,15 @@
        {
            return _purchaseBSTOrderService.AddPurchaseBSTOrder(bSTPurchaseOrderDTOs);
        }
        /// <summary>
        /// æ·»åŠ å‡ºåº“æŽ’ç¨‹ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveOutOrder"), AllowAnonymous]
        public WebResponseContent AddOutBSTOrder([FromBody] List<BSTOutOrderDTO> bSTOutOrderDTOs)
        {
            return _outBSTOrderService.AddOutBSTOrder(bSTOutOrderDTOs);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutBSTOrderController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core.BaseController;
using WIDESEA_IInboundService;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Outbound
{
    /// <summary>
    /// BST生产排程单
    /// </summary>
    [Route("api/OutBSTOrder")]
    [ApiController]
    public class OutBSTOrderController : ApiBaseController<IOutBSTOrderService, Dt_OutBSTOrder>
    {
        public OutBSTOrderController(IOutBSTOrderService service) : base(service)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutBSTOrderDetailController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core.BaseController;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Outbound
{
    /// <summary>
    /// BST生产排程明细
    /// </summary>
    [Route("api/OutBSTOrderDetail")]
    [ApiController]
    public class OutBSTOrderDetailController : ApiBaseController<IOutBSTOrderDetailService, Dt_OutBSTOrderDetail>
    {
        public OutBSTOrderDetailController(IOutBSTOrderDetailService service) : base(service)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutStockLockInfoController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Outbound
{
    /// <summary>
    /// å‡ºåº“详情
    /// </summary>
    [Route("api/OutStockLockInfo")]
    [ApiController]
    public class OutStockLockInfoController : ApiBaseController<IOutStockLockInfoService, Dt_OutStockLockInfo>
    {
        public OutStockLockInfoController(IOutStockLockInfoService service) : base(service)
        {
        }
        /// <summary>
        /// èŽ·å–å‡ºåº“è¯¦æƒ…
        /// </summary>
        [HttpPost, HttpGet, Route("GetByOrderDetailId"), AllowAnonymous]
        public List<Dt_OutStockLockInfo> GetByOrderDetailId(string orderNo,int orderDetailId)
        {
            return Service.GetByOrderDetailId(orderNo,orderDetailId, null);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -75,9 +75,9 @@
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("InboundFLTask"), AllowAnonymous]
        public WebResponseContent InboundFLTask(string barCode, string startPoint, string matCode, int matCount)
        public WebResponseContent InboundFLOrCPTask(string barCode, string startPoint, string matCode, int matCount)
        {
            return Service.InboundFLTask(barCode, startPoint, matCode, matCount);
            return Service.InboundFLOrCPTask(barCode, startPoint, matCode, matCount);
        }
        /// <summary>
@@ -183,6 +183,16 @@
            return Service.RequestYLWMSTaskSimple(stationCode,palletCode);
        }
        /// <summary>
        /// åŽŸæ–™å…¥åº“ç”³è¯·
        /// </summary>
        /// <param name="palletCode">条码</param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("YLPurchaseBoxing"), AllowAnonymous]
        public WebResponseContent YLPurchaseBoxing(string palletCode)
        {
            return Service.YLPurchaseBoxing(palletCode);
        }
        /// <summary>
        /// åˆ†é…åŽŸæ–™å…¥åº“å··é“
        /// </summary>
        /// <param name="palletCode"></param>
@@ -223,7 +233,6 @@
        /// </summary>
        /// <param name="materielCode">物料代码</param>
        /// <param name="materielWide">物料幅宽</param>
        /// <param name="Count">卷数</param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("RequestYLWMSTaskOut"), AllowAnonymous]
        public WebResponseContent RequestYLWMSTaskOut(string materielCode,int materielWide, int count,string address="")
@@ -280,5 +289,15 @@
        {
            return Service.PrintInbound(saveModel);
        }
        /// <summary>
        /// åˆ›å»ºåŽŸçº¸ç”Ÿäº§æŽ’ç¨‹å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("CreateBSTOutboundTasks"), AllowAnonymous]
        public WebResponseContent CreateBSTOutboundTasks([FromBody] int[] keys)
        {
            return Service.CreateBSTOutboundTasks(keys);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs
@@ -31,11 +31,15 @@
            CreateMap<Sys_Menu, MenuDTO>();
            CreateMap<Dt_Task, WMSTaskDTO>();
            //物料实体BST转换
            CreateMap<BSTMaterialDTO, Dt_MaterielInfo>().ForMember(x => x.MaterialSourceId, b => b.MapFrom(b => b.MaterialId)).ForMember(x => x.WarehouseId, b => b.MapFrom(b => WarehouseEnum.LLDYL.ObjToInt())).ForMember(x => x.MaterielCode, b => b.MapFrom(b => b.MaterialNo)).ForMember(x => x.MaterielName, b => b.MapFrom(b => b.Name)).ForMember(x => x.MaterielSourceType, b => b.MapFrom(b => b.MaterielType)).ForMember(x => x.MaterielInvOrgId, b => b.MapFrom(b => b.InvOrgId)).ForMember(x => x.MaterielUnit, b => b.MapFrom(b => b.Unit)).ForMember(x => x.MaterielUnit, b => b.MapFrom(b => b.Unit)).ForMember(x => x.MaterielState, b => b.MapFrom(b => b.State)).ForMember(x => x.IsCheck, b => b.MapFrom(b => WhetherEnum.True.ObjToInt())).ForMember(x => x.MaterielSpec, b => b.MapFrom(b => b.Spec)).ForMember(x => x.MaterielWeight, b => b.MapFrom(b => b.Weight));
            CreateMap<BSTMaterialDTO, Dt_MaterielInfo>().ForMember(x => x.MaterialSourceId, b => b.MapFrom(b => b.MaterialId)).ForMember(x => x.WarehouseId, b => b.MapFrom(b => WarehouseEnum.LLDYL.ObjToInt())).ForMember(x => x.MaterielCode, b => b.MapFrom(b => b.MaterialNo)).ForMember(x => x.MaterielName, b => b.MapFrom(b => b.Name)).ForMember(x => x.MaterielSourceType, b => b.MapFrom(b => b.MaterielType)).ForMember(x => x.MaterielInvOrgId, b => b.MapFrom(b => b.InvOrgId)).ForMember(x => x.MaterielUnit, b => b.MapFrom(b => b.Unit)).ForMember(x => x.MaterielUnit, b => b.MapFrom(b => b.Unit)).ForMember(x => x.MaterielState, b => b.MapFrom(b => b.Status)).ForMember(x => x.IsCheck, b => b.MapFrom(b => WhetherEnum.False.ObjToInt())).ForMember(x => x.MaterielSpec, b => b.MapFrom(b => b.Spec)).ForMember(x => x.MaterielWeight, b => b.MapFrom(b => b.Weight));
            //物料实体转换
            CreateMap<BSTSupplierDTO, Dt_SupplierInfo>().ForMember(x => x.SupplierSourceId, b => b.MapFrom(b => b.VendId)).ForMember(x => x.SupplierCode, b => b.MapFrom(b => b.VendNo)).ForMember(x => x.SupplierName, b => b.MapFrom(b => b.ShortName)).ForMember(x => x.SupplierShortName, b => b.MapFrom(b => b.ShortName)).ForMember(x => x.Contacts, b => b.MapFrom(b => b.BusinessContact)).ForMember(x => x.ContactNumber, b => b.MapFrom(b => b.Tel)).ForMember(x => x.ContactAddress, b => b.MapFrom(b => b.Address)).ForMember(x => x.InvOrgId, b => b.MapFrom(b => MaterielInvOrgEnum.老厂.ObjToInt()));
            //采购实体转换
            CreateMap<BSTPurchaseOrderDTO, Dt_PurchaseBSTOrder>().ForMember(x => x.ReceiptDate, b => b.MapFrom(b => DateTimeOffset.FromUnixTimeMilliseconds(b.ReceiptDate).DateTime));
            CreateMap<PaperReceiptDetailsItem, Dt_PurchaseBSTOrderDetail>().ForMember(x => x.MaterialWide, b => b.MapFrom(b => b.W)).ForMember(x => x.MaterialThick, b => b.MapFrom(b => b.Thick)).ForMember(x => x.PurchaseBSTOrderDetailStatus, b => b.MapFrom(b => InOrderStatusEnum.未开始.ObjToInt()));
            //BST出库排程实体转换
            CreateMap<BSTOutOrderDTO, Dt_OutBSTOrder>().ForMember(x => x.OutBSTOrderStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.ProductionDate, b => b.MapFrom(b => DateTimeOffset.FromUnixTimeMilliseconds(b.ProductionDate).DateTime)).ForMember(x => x.WarehouseId, b => b.MapFrom(b => WarehouseEnum.LLDYL.ObjToInt()));
            CreateMap<BstBoardMpsDetailItem, Dt_OutBSTOrderDetail>().ForMember(x => x.OutBSTOrderDetailStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt()));
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Program.cs
@@ -44,7 +44,7 @@
builder.Services.AddWebSocketSetup();
builder.Services.AddSqlsugarSetup();//SqlSugar å¯åŠ¨æœåŠ¡
builder.Services.AddDbSetup();//Db å¯åŠ¨æœåŠ¡
builder.Services.AddInitializationHostServiceSetup();//应用初始化服务注入
//builder.Services.AddInitializationHostServiceSetup();//应用初始化服务注入
builder.Services.AddHostedService<PermissionDataHostService>();//应用初始化服务注入
builder.Services.AddAutoMapperSetup();
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
@@ -93,7 +93,6 @@
    
    <ItemGroup>
      <Folder Include="Controllers\Check\" />
      <Folder Include="Controllers\Outbound\" />
      <Folder Include="Log\" />
    </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json
@@ -6,7 +6,7 @@
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "dics": "materielInvOrgEnum,agvStationAreaEnum,inOrderType,outOrderType,inboundState,createType,enableEnum,enableStatusEnum,locationStatusEnum,locationTypeEnum,taskTypeEnum,taskStatusEnum,outboundStatusEnum,orderDetailStatusEnum,stockStatusEmun,stockChangeType,outStockStatus,receiveOrderTypeEnum,authorityScope,authorityScopes,locationChangeType,warehouses,suppliers,taskType,receiveStatus,purchaseType,purchaseOrderStatus,printStatus,returnStatus,returnType,outLockStockStatusEnum,checkOrderStatusEnum,checkUploadEnum,checkAcceptEnum,proStockAttributeEnum,materielSourceTypeEnum,materielTypeEnum",
  "dics": "materielInvOrgEnum,agvStationAreaEnum,inOrderType,outOrderType,inboundState,createType,enableEnum,enableStatusEnum,locationStatusEnum,locationTypeEnum,taskTypeEnum,taskStatusEnum,outboundStatusEnum,orderDetailStatusEnum,stockStatusEmun,stockChangeType,outStockStatus,receiveOrderTypeEnum,authorityScope,authorityScopes,locationChangeType,warehouses,suppliers,taskType,receiveStatus,purchaseType,purchaseOrderStatus,printStatus,returnStatus,returnType,outLockStockStatusEnum,checkOrderStatusEnum,checkUploadEnum,checkAcceptEnum,proStockAttributeEnum,materielSourceTypeEnum,materielTypeEnum,materielUnitEnum",
  "AllowedHosts": "*",
  "ConnectionStringsEncryption": false,
  "MainDB": "DB_WIDESEA", //当前项目的主库,所对应的连接字符串的Enabled必须为true
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/MES.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/Ò»ÆÚBSTERPÐèÇó×Ö¶Î.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/²©Ë¼Í¨ÀûÍØ½Ó¿Ú.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/°²È«ÉêÇëRCS-WCS-20250729.docx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÃ-MES¡¢ERP¡¢WMS½Ó¿ÚÇåµ¥.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÃERP&WMS½Ó¿ÚÇåµ¥.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÃMES½Ó¿Ú.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/Ô­Ö½²Ð¾íÏïµÀ¿âλÊý¾Ý.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ÁúÀûµÃÈí¼þ¼Æ»®±í.xlsx
Binary files differ