liulijun
2025-11-24 9086b238cd9fbb9fbeae7cab11d59576cd9d2853
合并
已添加14个文件
已修改71个文件
2478 ■■■■ 文件已修改
项目代码/BigScreen/package-lock.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreen/src/api/ajax.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreen/src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreen/src/views/indexLine.vue 198 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/MESResponse.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/ConveyorLineJob_YL1ndFloor.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC2.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC3.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/ConveyorLineJob_CPH.cs 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/StackerCraneJob_CP.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/接驳台/CoveryorJobYL.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/桁架/TrussCartonJob.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/config/buttons.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/public/webconfig.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/extend/SelectedStock.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/extend/outSGOrderDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/outbound/outSGOrder.js 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/Index.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/OrderEnum/OutboundOrderMenu.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/HttpContextUser/AspNetUser.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Basic/ERPMaterialDTO.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTPickInfoDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTStockInfoDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/SGOutOrderDTO.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/MES/MESReturnIssueDTO.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Task/WMSTaskDTO.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/MESDeliveryModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IInboundService/IMESProInOrderInfoService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutLineViewRepository.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutboundRepository.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutLineViewService.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutboundService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IStockService/IStockInfoService.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/InboundOrderService.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/MESProInOrderInfoService.cs 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/PurchaseOrderService.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_MaterielInfo.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_MESProInOrderInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutLineView.cs 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutMESOrder.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutSGOrder.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutSGOrderDetail.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutStockLockInfo.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundRepository/OutLineViewRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundRepository/OutboundRepository.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutLineViewService.cs 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutSGOrderDetailService.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutSGOrderService.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutStockLockInfoService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutboundService.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/WIDESEA_StockService.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs 355 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 381 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 156 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/MES/MesController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutLineViewController.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/龙利得PDA/common/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/龙利得PDA/pages/stash/boxing.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/博斯通利拓接口.V2.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利得MES接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/原料库输送线通讯协议.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/接驳台与上位机WCS交互.xls 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸杯纸箱上料桁架通讯协议.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片三台料架DB块数据/企业微信截图_1763189335703.png 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片三台料架DB块数据/企业微信截图_17631893492052.png 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片上料桁架数量.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片两台料架DB块数据/企业微信截图_17631892881691.png 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片两台料架DB块数据/企业微信截图_17631893013030.png 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片四台料架DB块数据/企业微信截图_17631895456628.png 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/纸片四台料架DB块数据/企业微信截图_17631895685290.png 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/BigScreen/package-lock.json
@@ -2349,11 +2349,6 @@
        "fastq": "^1.6.0"
      }
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.7",
      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
    },
    "@sideway/address": {
      "version": "4.1.5",
      "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.5.tgz",
@@ -7396,6 +7391,13 @@
        "lodash-unified": "^1.0.2",
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      },
      "dependencies": {
        "@popperjs/core": {
          "version": "npm:@sxzz/popperjs-es@2.11.7",
          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
        }
      }
    },
    "element-ui": {
ÏîÄ¿´úÂë/BigScreen/src/api/ajax.js
@@ -1,8 +1,8 @@
// è¿™ä¸ªæ—¶axios的配置
import axios from 'axios';
// import { config } from 'vue/types/umd';
axios.defaults.baseURL = 'http://192.168.2.155:8099'; //'http://192.168.2.155:8099';
//axios.defaults.baseURL = 'http://127.0.0.1:9293';
axios.defaults.baseURL = 'http://192.168.35.3:9283';
// é”™è¯¯ä¿¡æ¯å¤„理
const  errorHandle = (status, other) => {
  switch (status) {
ÏîÄ¿´úÂë/BigScreen/src/router/index.js
@@ -4,7 +4,7 @@
Vue.use(VueRouter)
const routes = [{
  path: '/line',
  path: '/',
  name: 'indexLine',
  component: () => import('../views/indexLine.vue')
},
ÏîÄ¿´úÂë/BigScreen/src/views/indexLine.vue
@@ -24,7 +24,7 @@
                    font-size: 50px;
                    font-weight: bold;
                    color: #90EE90;
                  ">立库输送轨道原纸信息(共 å·ï¼‰</span>
                  ">立库输送轨道原纸信息(共{{showMsg}}卷)</span>
                            //时间
                            <div style="position: absolute; right: 20px;">
                                <p style="
@@ -64,6 +64,7 @@
    data() {
        return {
            timing: null,
            timeRequest: null,
            loading: true,
            dateDay: null,
            dateYear: null,
@@ -82,139 +83,22 @@
                ],
                data: [
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">1</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                        '<span style="color:#FF4500; font-size:60px;">705010</span>',
                        '<span style="color:#FF4500; font-size:60px;">015004</span>',
                        '<span style="color:#FF4500; font-size:60px;">X2</span>',
                        '<span style="color:#FF4500; font-size:60px;">1</span>',
                        '<span style="color:#FF4500; font-size:60px;">1200</span>',
                        '<span style="color:#FF4500; font-size:60px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:60px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">2</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">3</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">4</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">5</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">6</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">7</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">8</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">9</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">10</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">11</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">12</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">13</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">14</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                    ],
                    [
                        '<span style="color:#FF4500; font-size:75px;">705010</span>',
                        '<span style="color:#FF4500; font-size:75px;">015004</span>',
                        '<span style="color:#FF4500; font-size:75px;">X2</span>',
                        '<span style="color:#FF4500; font-size:75px;">15</span>',
                        '<span style="color:#FF4500; font-size:75px;">1200</span>',
                        '<span style="color:#FF4500; font-size:75px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:75px;">180</span>',
                        '<span style="color:#FF4500; font-size:60px;">705010</span>',
                        '<span style="color:#FF4500; font-size:60px;">015004</span>',
                        '<span style="color:#FF4500; font-size:60px;">X2</span>',
                        '<span style="color:#FF4500; font-size:60px;">2</span>',
                        '<span style="color:#FF4500; font-size:60px;">1200</span>',
                        '<span style="color:#FF4500; font-size:60px;;">4798</span>',
                        '<span style="color:#FF4500; font-size:60px;">180</span>',
                    ],
                ],
                headerHeight: 60,
@@ -222,12 +106,12 @@
                evenRowBGC: "rgba(0, 0, 0, 0.6)",
                headerBGC: "rgba(0, 0, 0, 0.6)",
                waitTime: 5000,
                columnWidth: [350, 350, 200, 200, 250, 250, 350],
                columnWidth: [380, 380, 180, 200, 200, 250, 250],
                rowNum: 10,
                align: ["center", "center", "center", "center", "center", "center", "center"],
            },
            IsDetail: true,
            OrderCreator: {},
            showMsg:""
        };
    },
    components: {
@@ -240,10 +124,11 @@
            this.updateTime(); // æ¯ç§’æ›´æ–°æ—¶é—´
        }, 1000);
        this.cancelLoading();
        // this.GetOrderDetail();
        this.GetOrderDetail();
    },
    beforeDestroy() {
        clearInterval(this.timing);
        clearInterval(this.timeRequest);
    },
    methods: {
        // æ›´æ–°åŒ—京时间
@@ -278,42 +163,51 @@
            }, 1000);
        },
        GetOrderDetail() {
            axios.post("/api/dt_WorkOrder/getWorkOrderInfo", null, "").then((res) => {
            axios.post("/api/OutLineView/GetOutLineView", null, "").then((res) => {
                if (res.data.status) {
                    if (res.data.data == null) {
                        return;
                    }
                    var sp = '</span>';
                    this.showMsg=res.data.message
                    var arr = [];
                    res.data.data.dt_WorkOrderDetail.forEach((x) => {
                    res.data.data.forEach((x) => {
                        var item = [
                            '<span style="color:#67e0e3;">' + x.layer + '层' + sp,
                            '<span style="color:#9fe6b8;">' + (x.lj_hight == null ? '无需测量' : x.lj_hight + 'mm') + sp,
                            '<span style="color:#fb7503;">' + (x.measure_hight == null ? '无需测量' : x.measure_hight + 'mm') + sp,
                            '<span style="color:#fb7503;">' + x.lj_is_tolerance + sp,
                                '<span style="color:#FF4500; font-size:55px;">'+x.palletCode+'</span>',
                                '<span style="color:#FF4500; font-size:55px;">'+x.orderNo+'</span>',
                                '<span style="color:#FF4500; font-size:55px;">'+x.materielCode+'</span>',
                                '<span style="color:#FF4500; font-size:55px;">'+x.machineName+'</span>',
                                '<span style="color:#FF4500; font-size:55px;">'+x.materialWide+'</span>',
                                '<span style="color:#FF4500; font-size:55px;;">'+x.originalQuantity+'</span>',
                                '<span style="color:#FF4500; font-size:55px;">'+x.orderQuantity+'</span>',
                        ];
                        arr.push(item);
                    });
                    this.OrderCreator = res.data.data;
                    if (this.IsDetail) {
                        this.config = {
                            header: [
                                '<span style="font-size:18px;">层数</span>',
                                '<span style="font-size:18px;">累计标准饼厚</span>',
                                '<span style="font-size:18px;">累计饼厚</span>',
                                '<span style="font-size:18px;">测高结果</span>'
                            '<span style="font-size:50px;">纸卷条码</span>',
                            '<span style="font-size:50px;">工单号</span>',
                            '<span style="font-size:50px;">代码</span>',
                            '<span style="font-size:50px;">上机位</span>',
                            '<span style="font-size:50px;">宽幅</span>',
                            '<span style="font-size:50px;">纸卷长</span>',
                            '<span style="font-size:50px;">需用纸长</span>'
                            ],
                            data: arr,
                            waitTime: 10000,
                            rowNum: 15,
                            columnWidth: [75, 150, 110, 110],
                            align: ["center", "center", "center", "center"]
                            headerHeight: 60,
                            oddRowBGC: "rgba(0, 0, 0, 0.6)",
                            evenRowBGC: "rgba(0, 0, 0, 0.6)",
                            headerBGC: "rgba(0, 0, 0, 0.6)",
                            waitTime: 5000,
                            columnWidth: [380, 380, 180, 200, 200, 250, 250],
                            rowNum: 10,
                            align: ["center", "center", "center", "center", "center", "center", "center"],
                        };
                    } else {
                        this.$refs["scrollBoard"].updateRows(arr)
                    }
                    if (this.IsDetail) {
                        setInterval(() => {
                        this.timeRequest = setInterval(() => {
                            this.GetOrderDetail();
                        }, 10000);
                        this.IsDetail = false;
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs
@@ -80,6 +80,11 @@
        /// é¢„调度接口
        /// </summary>
        [Description("预调度接口")]
        AGV_CTUScheduleTaskTask
        AGV_CTUScheduleTaskTask,
        /// <summary>
        /// MES小车到达通知
        /// </summary>
        [Description("MES小车到达通知")]
        MESAvgArriveNotice
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/MESResponse.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_External.Model
{
    /// <summary>
    /// MES返回
    /// </summary>
    public class MESResponse
    {
        /// <summary>
        /// æˆåŠŸç»“æžœ
        /// </summary>
        public bool Result { get; set; }
        /// <summary>
        /// è¿”回信息
        /// </summary>
        public string Msg { get; set; }
        /// <summary>
        /// è¿”回对象
        /// </summary>
        public bool Obj { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs
@@ -73,5 +73,13 @@
        public string AGVArea { get; set; }
        public int PalletType { get; set; }
        /// <summary>
        /// MES计划Id
        /// </summary>
        public int DispatchPlanId { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒ
        /// </summary>
        public string WorkCentreCode { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -99,7 +99,11 @@
        //上传条码
        WebResponseContent MESBoxCodeNotice(string boxCode);
        WebResponseContent MESAvgArriveNotice(RequestAGVArriveDTO requestAGVArriveDTO);
        /// <summary>
        /// åˆ¤æ–­å…è®¸æ”¾è´§
        /// </summary>
        /// <returns></returns>
        string MESAvgArriveNotice(RequestAGVArriveDTO requestAGVArriveDTO);
        /// <summary>
        /// å ç›˜æœºç”³è¯·ç©ºæ‰˜å…¥æˆå“åº“
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -205,5 +205,21 @@
        [ExporterHeader(DisplayName = "备注")]
        [SugarColumn(IsNullable = true, Length = 255, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒç¼–ç 
        /// </summary>
        [ImporterHeader(Name = "加工中心编码")]
        [ExporterHeader(DisplayName = "加工中心编码")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "加工中心编码")]
        public string WorkCentreCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [ImporterHeader(Name = "MES计划Id")]
        [ExporterHeader(DisplayName = "MES计划Id")]
        [SugarColumn(IsNullable = true, ColumnDescription = "MES计划Id")]
        public int DispatchPlanId { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -2,7 +2,9 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Text;
using System.Text.RegularExpressions;
using WIDESEA_DTO.Agv;
using WIDESEA_External.Model;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
@@ -70,7 +72,7 @@
                    }
                    else//出库放货请求
                    {
                        var content = PutRequest(task.NextAddress, task.PalletType);
                        var content = PutRequest(task.NextAddress, task);
                        if (!content.Status)
                        {
                            throw new Exception(content.Message);
@@ -89,7 +91,7 @@
                    }
                    else//入库放货请求
                    {
                        var content = PutRequest(task.NextAddress, task.TaskNum);
                        var content = PutRequest(task.NextAddress, task);
                        if (!content.Status)
                        {
                            throw new Exception(content.Message);
@@ -312,7 +314,7 @@
        /// <param name="palletType"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("PutRequest"), AllowAnonymous]
        public WebResponseContent PutRequest(string code, int taskNum)
        public WebResponseContent PutRequest(string code, Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
@@ -330,14 +332,20 @@
                    {
                        SD_WorkCentreAgvArriveNoticeInfo=new List<AgvArriveNotice> { new AgvArriveNotice()
                        {
                            DispatchPlanMaterialId=409,
                            WorkCentreCode="66",
                            LocationCode="3-ZD-ZJZZ",
                            CallId="4534c242-27a7-4fb6-86f5-460b09db303d"
                            DispatchPlanMaterialId=task.DispatchPlanId,
                            WorkCentreCode=task.WorkCentreCode,
                            LocationCode=code,
                            CallId=Guid.NewGuid().ToString().Replace("-","")
                        } }
                    };
                    WebResponseContent webResponse= _taskService.MESAvgArriveNotice(requestAGVArriveDTO);
                    if (webResponse.Message.Contains("\"obj\": true"))
                    MESResponse response = _taskService.MESAvgArriveNotice(requestAGVArriveDTO).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                    if (!response.Result)
                    {
                        throw new Exception($"调用MES小车允许放货报错,MES返回信息"+ Regex.Replace(response.Msg, @"\\u([0-9a-fA-F]{4})", match => {
                            return ((char)Convert.ToInt32(match.Groups[1].Value, 16)).ToString();
                        }));
                    }
                    if (response.Obj)
                    {
                        return content.Error($"允许取料");
                    }
@@ -389,7 +397,7 @@
                        bool RequestPut = otherDevice.GetValue<CoveryorDB, bool>(CoveryorDB.C_RequestPut, stationManger.StationDeviceCode);
                        if (!RequestPut)
                        {
                            otherDevice.SetValue(CoveryorDB.C_InTaskNum, taskNum, stationManger.StationDeviceCode);
                            otherDevice.SetValue(CoveryorDB.C_InTaskNum, task.TaskNum, stationManger.StationDeviceCode);
                            otherDevice.SetValue(CoveryorDB.C_RequestPut, true, stationManger.StationDeviceCode);
                            Thread.Sleep(1000);
                        }
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -18,7 +18,6 @@
using Newtonsoft.Json;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
@@ -524,24 +523,54 @@
            }
            return content;
        }
        public WebResponseContent MESAvgArriveNotice(RequestAGVArriveDTO requestAGVArriveDTO)
        /// <summary>
        /// åˆ¤æ–­å…è®¸æ”¾è´§
        /// </summary>
        /// <returns></returns>
        public string MESAvgArriveNotice(RequestAGVArriveDTO requestAGVArriveDTO)
        {
            WebResponseContent content = new WebResponseContent();
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.MESAvgArriveNotice.ToString());
            string response = Post(apiInfo.ApiAddress, JsonConvert.SerializeObject(requestAGVArriveDTO));
            return response;
        }
        public static string Post(string serviceAddress, string requestJson = "", string contentType = "application/json", Dictionary<string, string>? headers = null)
        {
            string result = string.Empty;
            DateTime beginDate = DateTime.Now;
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                using (HttpContent httpContent = new StringContent(requestJson))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    using HttpClient httpClient = new HttpClient();
                    httpClient.Timeout = new TimeSpan(0, 0, 30);
                    string LoginToken = AppSettings.Get("MESLoginToken");
                    headers = new Dictionary<string, string>
                    {
                        //正式
                        { "LoginToken", LoginToken }
                    };
                    if (headers != null)
                    {
                        foreach (var header in headers)
                            httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    HttpResponseMessage responseMessage = httpClient.PostAsync(serviceAddress, httpContent).Result;
                    result = responseMessage.Content.ReadAsStringAsync().Result;
                }
                string responseStr = HttpHelper.Post($"{address}/api/Mes/MESAvgArriveNotice", requestAGVArriveDTO.Serialize());
                return content.OK(responseStr);
                return result;
            }
            catch (Exception ex)
            catch (Exception e)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                throw new Exception(e.Message);
            }
            return content;
            finally
            {
                Logger.Add(serviceAddress, requestJson == null ? "" : requestJson, result, beginDate);
            }
        }
        public WebResponseContent CPEmptyInbound(string palletCode,string SourceAddress)
        {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/ConveyorLineJob_YL1ndFloor.cs
@@ -205,6 +205,17 @@
                                WriteInfo(item.StationCode, $"任务号:{task.TaskNum},RIFD{task.RfidCode}一楼出库至老厂房完成");
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_Task <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID) && conveyorLineInfoRead.WR_Request == 98) //一楼老厂出库口完成
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => (x.RfidCode == conveyorLineInfoRead.WR_TMID || x.PalletCode== conveyorLineInfoRead.WR_TMID) && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                //任务回复
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 98, item.StationCode);
                                _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: "CL3_YL");
                                WriteInfo(item.StationCode, $"任务号:{task.TaskNum},RIFD{task.RfidCode}一楼出库至老厂房完成");
                            }
                        }
                    }
                    else
                    {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/StackerCraneJob_YLSC2.cs
@@ -23,6 +23,8 @@
using SqlSugar.Extensions;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.StackerCrane;
namespace WIDESEAWCS_Tasks
{
@@ -57,8 +59,14 @@
                    {
                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                    }
                    commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal && commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                    //commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                    //获取当前堆垛机状态
                    if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.WorkCompleted)
                    {
                        StackerCraneTaskCompletedEventArgs e = new StackerCraneTaskCompletedEventArgs(commonStackerCrane.CurrentTaskNum);
                        CommonStackerCrane_StackerCraneTaskCompletedEventHandler(commonStackerCrane, e);
                    }
                    else if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal && commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)//判断下发
                    {
                        short stackerError = commonStackerCrane.Communicator.Read<short>("DB1000.54.0");
                        if (stackerError==0)
@@ -98,7 +106,7 @@
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, StackerCraneTaskCompletedEventArgs e)
        {
            CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane;
            if (commonStackerCrane != null)
@@ -197,6 +205,13 @@
        /// <returns></returns>
        private Dt_Task? GetTask(CommonStackerCrane commonStackerCrane)
        {
            //判断是否有正执行的任务,如果有则不下发
            Dt_Task? taskOld = _taskRepository.QueryFirst(x => x.DeviceCode == commonStackerCrane.DeviceCode && x.Roadway == commonStackerCrane.DeviceCode && x.TaskState == TaskStatusEnum.SC_Executing.ObjToInt());
            if (taskOld != null)
            {
                return null;
            }
            Dt_Task? task;
            if (commonStackerCrane.LastTaskType == null)
            {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/StackerCraneJob_YLSC3.cs
@@ -25,6 +25,7 @@
using WIDESEAWCS_Core.Helper;
using HslCommunication.WebSocket;
using WIDESEAWCS_DTO.Equipment;
using WIDESEAWCS_QuartzJob.StackerCrane;
namespace WIDESEAWCS_Tasks
{
@@ -63,7 +64,14 @@
                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                    }
                    commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal && commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                    //获取当前堆垛机状态
                    if (commonStackerCrane.CurrentTaskNum>0 && commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.WorkCompleted)
                    {
                        StackerCraneTaskCompletedEventArgs e = new StackerCraneTaskCompletedEventArgs(commonStackerCrane.CurrentTaskNum);
                        CommonStackerCrane_StackerCraneTaskCompletedEventHandler(commonStackerCrane, e);
                    }
                    else if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal && commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)//判断下发
                    {
                        short stackerError = commonStackerCrane.Communicator.Read<short>("DB1000.54.0");
                        if (stackerError == 0)
@@ -122,7 +130,7 @@
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender,StackerCraneTaskCompletedEventArgs e)
        {
            CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane;
            if (commonStackerCrane != null)
@@ -248,6 +256,13 @@
        /// <returns></returns>
        private Dt_Task? GetTask(CommonStackerCrane commonStackerCrane)
        {
            //判断是否有正执行的任务,如果有则不下发
            Dt_Task? taskOld = _taskRepository.QueryFirst(x => x.DeviceCode == commonStackerCrane.DeviceCode && x.Roadway == commonStackerCrane.DeviceCode && x.TaskState == TaskStatusEnum.SC_Executing.ObjToInt());
            if (taskOld != null)
            {
                return null;
            }
            Dt_Task? task;
            if (commonStackerCrane.LastTaskType == null)
            {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/ConveyorLineJob_CPH.cs
@@ -42,7 +42,6 @@
        private readonly IRouterExtension _routerExtension;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
        private static object lockObj = 0;//
        private static List<string> strings = new List<string>();
        public ConveyorLineJob_CPH(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension)
        {
@@ -54,14 +53,6 @@
            _routerRepository = routerRepository;
            _routerService = routerService;
            _routerExtension = routerExtension;
            string boxCodes = AppSettings.Get("BoxCodes");
            if (!string.IsNullOrEmpty(boxCodes) && strings.Count<=0)
            {
                foreach (string s in boxCodes.Split(","))
                {
                    strings.Add(s);
                }
            }
            string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
            if (!string.IsNullOrEmpty(warehouseDevicesStr))
            {
@@ -80,19 +71,19 @@
                if (lockObj.ToString()=="0")
                {
                    lockObj = 1;
                    Task task = Task.Run(() =>
                    Task task = Task.Run(async () =>
                    {
                        try
                        {
                            while (true)
                            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
                            if (flag && value != null)
                            {
                                bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
                                if (flag && value != null)
                                //获取当前设备
                                OtherDevice device = (OtherDevice)value;
                                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                                Dt_StationManger? RequestIn = stationMangers.FirstOrDefault(x => x.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt());
                                while (true)
                                {
                                    //获取当前设备
                                    OtherDevice device = (OtherDevice)value;
                                    List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                                    Dt_StationManger? RequestIn = stationMangers.FirstOrDefault(x => x.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt());
                                    if (RequestIn != null)
                                    {
                                        DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == RequestIn.StationCode && x.DeviceProParamType == nameof(R_CLineCPHDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
@@ -103,47 +94,26 @@
                                            //码垛环线请求任务 
                                            if (conveyorLineInfoRead != null && (conveyorLineInfoRead.R_State == 2 || conveyorLineInfoRead.R_State == 3) && conveyorLineInfoRead.R_TaskNo <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.R_BoxCode) && conveyorLineInfoRead.R_Request == 1)
                                            {
                                                //WebResponseContent content = _taskService.MESBoxCodeNotice(conveyorLineInfoRead.R_BoxCode);
                                                ////向WMS请求任务
                                                //if (true)
                                                //{
                                                //}
                                                //string[] strings = conveyorLineInfoRead.R_BoxCode.Split("-");
                                                //if (strings.Length==2)
                                                //{
                                                #region todo:临时逻辑
                                                //写入执行数据
                                                if (strings.FirstOrDefault(x=>x == conveyorLineInfoRead.R_BoxCode)!=null)
                                                device.SetValue(W_CLineCPHDB.W_TaskNo, 100 + 5, RequestIn.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Channel, 14, RequestIn.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Long, 485, RequestIn.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Wide, 460, RequestIn.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_High, 420, RequestIn.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_TMID, conveyorLineInfoRead.R_BoxCode, RequestIn.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Request, 1, RequestIn.StationCode);
                                                WebResponseContent content = _taskService.MESBoxCodeNotice(conveyorLineInfoRead.R_BoxCode);
                                                if (content.Status)
                                                {
                                                    device.SetValue(W_CLineCPHDB.W_TaskNo, 100 + 5, RequestIn.StationCode);
                                                    device.SetValue(W_CLineCPHDB.W_Channel, 5, RequestIn.StationCode);
                                                    device.SetValue(W_CLineCPHDB.W_Long, 450, RequestIn.StationCode);
                                                    device.SetValue(W_CLineCPHDB.W_Wide, 360, RequestIn.StationCode);
                                                    device.SetValue(W_CLineCPHDB.W_High, 400, RequestIn.StationCode);
                                                    device.SetValue(W_CLineCPHDB.W_TMID, conveyorLineInfoRead.R_BoxCode, RequestIn.StationCode);
                                                    device.SetValue(W_CLineCPHDB.W_Request, 1, RequestIn.StationCode);
                                                    WebResponseContent content = _taskService.MESBoxCodeNotice(conveyorLineInfoRead.R_BoxCode);
                                                    if (content.Message.Contains("true"))
                                                    {
                                                        strings.Remove(conveyorLineInfoRead.R_BoxCode);
                                                        WriteInfo(RequestIn.StationName, content.Message);
                                                    }
                                                    else
                                                    {
                                                        WriteError(RequestIn.StationName, content.Message);
                                                    }
                                                    WriteInfo(RequestIn.StationName, content.Message);
                                                }
                                                else
                                                {
                                                    WriteError(RequestIn.StationName, $"未找到条码{conveyorLineInfoRead.R_BoxCode}数据");
                                                    WriteError(RequestIn.StationName, content.Message);
                                                }
                                                #endregion
                                                //}
                                                //else
                                                //{
                                                //    WriteError(RequestIn.StationName, $"数据截取错误:{strings}");
                                                //}
                                            }
                                        }
                                        else
@@ -151,7 +121,7 @@
                                            WriteError(RequestIn.StationName, $"未找到设备子编号{RequestIn.StationCode}的协议信息");
                                        }
                                    }
                                    foreach (var item in stationMangers.Where(x=>x.StationType==StationTypeEnum.StationType_OnlyOutbound.ObjToInt()))
                                    foreach (var item in stationMangers.Where(x => x.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt()))
                                    {
                                        DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_CLineCPHDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                                        if (deviceProRead != null)
@@ -171,21 +141,20 @@
                                            }
                                        }
                                    }
                                    Thread.Sleep(100);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            lockObj = 0;
                            WriteError(nameof(ConveyorLineJob_CPH), $"错误信息:{ex.Message}");
                        }
                    });
                }
                
            }
            return Task.CompletedTask;
        }
    }
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/StackerCraneJob_CP.cs
@@ -121,7 +121,7 @@
                {
                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                    {
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StackerCraneStationCode == task.NextAddress && x.StackerCraneCode==deviceCode);
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress && x.StackerCraneCode==deviceCode);
                        if (stationManger == null)
                        {
                            _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"输送线出库站点未配置,{task.NextAddress}");
@@ -182,6 +182,13 @@
        /// <returns></returns>
        private Dt_Task? GetTask(CommonStackerCrane commonStackerCrane)
        {
            //判断是否有正执行的任务,如果有则不下发
            Dt_Task? taskOld = _taskRepository.QueryFirst(x => x.DeviceCode == commonStackerCrane.DeviceCode && x.Roadway == commonStackerCrane.DeviceCode && x.TaskState == TaskStatusEnum.SC_Executing.ObjToInt());
            if (taskOld!=null)
            {
                return null;
            }
            Dt_Task task;
            if (commonStackerCrane.LastTaskType == null)
            {
@@ -252,8 +259,8 @@
                    short command = client.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode);
                    if (command==3)//出库站台未被占用
                    {
                        task.NextAddress = stationManger.StackerCraneStationCode;
                        _taskRepository.UpdateData(task);
                        //task.NextAddress = stationManger.StackerCraneStationCode;
                        //_taskRepository.UpdateData(task);
                        return task;
                    }
                    else
@@ -319,7 +326,8 @@
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//判断是否是出库任务
            {
                string[] targetCodes = task.NextAddress.Split("-");
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress && x.StackerCraneCode == task.DeviceCode);
                string[] targetCodes = stationManger.StackerCraneStationCode.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/½Ó²µÌ¨/CoveryorJobYL.cs
@@ -79,16 +79,12 @@
                    {
                        bool RequestTake = device.GetValue<CoveryorDB, bool>(CoveryorDB.C_RequestTake, item.StationDeviceCode);
                        int OutTaskNum = device.GetValue<CoveryorDB, int>(CoveryorDB.C_OutTaskNum, item.StationDeviceCode);
                        if (RequestTake && OutTaskNum>0) //一楼出库申请
                        if (RequestTake && OutTaskNum>0) //出库申请
                        {
                            //获取当前任务
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum ==OutTaskNum && x.NextAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt());
                            if (task != null)
                            {
                                if (true)
                                {
                                }
                                //分配巷道 å­˜å…¥æ‰˜ç›˜æ•°æ®
                                List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.NextAddress == x.StartPosi);
                                Dt_Router router = routers.FirstOrDefault();
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/èì¼Ü/TrussCartonJob.cs
@@ -80,7 +80,7 @@
                        foreach (var item in stationMangers)
                        {
                            //码垛状态
                            bool Call = device.GetValue<R_TrussCartonDB, bool>(GetCartonCall(item.StackerCraneStationCode), item.StackerCraneCode);
                            bool Call = device.GetValue<R_TrussCartonDB, bool>(GetCartonCall(item.StackerCraneStationCode), device.DeviceCode);
                            if (Call && item.IsOccupied == 0)
                            {
ÏîÄ¿´úÂë/WMS/WMSClient/config/buttons.js
@@ -200,6 +200,15 @@
    onClick: function () {
    }
},
{
    name: "排 ç¨‹ å‡º åº“",
    icon: '',
    class: '',
    value: 'CreateSGManualTasks',
    type: 'success',
    onClick: function () {
    }
}
]
export default buttons
ÏîÄ¿´úÂë/WMS/WMSClient/public/webconfig.js
@@ -1,5 +1,5 @@
window.webConfig = {
    //"webApiBaseUrl": "http://192.168.35.3:9283/",
    // "webApiBaseUrl": "http://192.168.35.3:9283/",
    "webApiBaseUrl": "http://127.0.0.1:9293/",
    "webApiProduction":"http://192.168.35.3:9283/"
}
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/extend/SelectedStock.vue
@@ -124,6 +124,18 @@
          width: 150,
        },
        {
          prop: "materialWide",
          title: "物料幅宽",
          type: "string",
          width: 100,
        },
        {
          prop: "materialWeight",
          title: "物料重量",
          type: "string",
          width: 100,
        },
        {
          prop: "stockId",
          title: "库存主键",
          type: "string",
@@ -150,7 +162,7 @@
        },
        {
          prop: "taskNum",
          title: "出库任务号",
          title: "出库任务",
          type: "string",
          width: 100,
        },
@@ -158,13 +170,13 @@
          prop: "palletCode",
          title: "条码编号",
          type: "string",
          width: 150,
          width: 130,
        },
        {
          prop: "locationCode",
          title: "货位编号",
          type: "string",
          width: 180,
          width: 200,
        },
        {
          prop: "status",
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/extend/outSGOrderDetail.vue
@@ -325,7 +325,7 @@
        this.$refs.child.open(row);
      } else {
        //点击打开出库详情
        this.$refs.selectedStock.open(row,this.row.outSGOrderNo);
        this.$refs.selectedStock.open(row,this.row.orderId);
      }
    },
    outbound() {
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/outbound/outSGOrder.js
@@ -19,20 +19,43 @@
      onInit() {  
        //扩展页面初始化操作
        this.columns.push({
          field: '操作',
          title: '操作',
          width: 90,
          fixed: 'right',
          align: 'center',
          formatter: (row) => {
              return (
                  '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-view">查看明细</i>'
              );
          },
          click: (row) => {
              this.$refs.gridBody.open(row);
            field: '操作',
            title: '操作',
            width: 90,
            fixed: 'right',
            align: 'center',
            formatter: (row) => {
                return (
                    '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-view">查看明细</i>'
                );
            },
            click: (row) => {
                this.$refs.gridBody.open(row);
            }
        });
        //创建排程出库
        let OutOrder = this.buttons.find(x => x.value == 'CreateSGManualTasks');
        if (OutOrder) {
          OutOrder.onClick = function () {
            let rows = this.$refs.table.getSelected();
            if (rows.length == 0) return this.$error("请选择数据!");
            this.$confirm("确认要选择的数据出库嘛吗?", "警告", {
              confirmButtonText: "确定",
              cancelButtonText: "取消",
              type: "warning",
              center: true,
            }).then(() => {
              var keys = rows.map((x) => x.id);
              this.http
                .post("api/Task/CreateSGManualTasks?", keys, "数据处理中")
                .then((x) => {
                  if (!x.status) return this.$message.error(x.message);
                  this.$message.success("操作成功");
                  this.refresh();
                });
            });
          }
      });
        }
      },
      onInited() {
        //框架初始化配置后
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/Index.vue
@@ -324,24 +324,24 @@
      });
    };
    const createSocket = (url) => {
      // åˆ›å»ºWebSocket连接
      //"ws://127.0.0.1:9295/admin"
      client = new WebSocket(url);
    // const createSocket = (url) => {
    //   // åˆ›å»ºWebSocket连接
    //   //"ws://127.0.0.1:9295/admin"
    //   client = new WebSocket(url);
      client.onopen = function () {
        client.onmessage = handleMessage;
        store.commit("setWebsocket", client);
        console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
      };
    //   client.onopen = function () {
    //     client.onmessage = handleMessage;
    //     store.commit("setWebsocket", client);
    //     console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
    //   };
      client.onclose = function () {
        console.log("WebSocket è¿žæŽ¥å…³é—­");
        setTimeout(createSocket, 10000);
      };
      //监听socket错误信息
      client.onerror = function () {};
    };
    //   client.onclose = function () {
    //     console.log("WebSocket è¿žæŽ¥å…³é—­");
    //     setTimeout(createSocket, 10000);
    //   };
    //   //监听socket错误信息
    //   client.onerror = function () {};
    // };
    const changeTheme = (name) => {
      if (theme.value != name) {
@@ -606,7 +606,7 @@
        }
      }
      createSocket("ws://127.0.0.1:9296/" + _userInfo.userName);
      // createSocket("ws://127.0.0.1:9296/" + _userInfo.userName);
      Object.assign(_config.$tabs, { open: open, close: close });
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/OrderEnum/OutboundOrderMenu.cs
@@ -50,6 +50,11 @@
        /// ä¸€æœŸç”Ÿç®¡é¢†æ–™
        /// </summary>
        [Description("一期生管领料")]
        OutSGPick=1
        OutSGPick = 1,
        /// <summary>
        /// äºŒæœŸMES领料
        /// </summary>
        [Description("二期MES领料")]
        OutMESPick = 2
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/HttpContextUser/AspNetUser.cs
@@ -84,9 +84,9 @@
        public void UpdateToke(string token, int userId)
        {
            if (MenuType == 0)
                _cacheService.AddOrUpdate(userId.ToString(), token, 21600);
                _cacheService.AddOrUpdate(userId.ToString(), token);
            else
                _cacheService.AddOrUpdate(userId.ToString() + "-App", token, 21600);
                _cacheService.AddOrUpdate(userId.ToString() + "-App", token);
        }
        public bool IsSuperAdmin => IsRoleIdSuperAdmin(RoleId);
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Basic/ERPMaterialDTO.cs
@@ -85,9 +85,14 @@
        public string WarehouseCode { get; set; }
        /// <summary>
        /// è®¡é‡å•位(Kg:千克)
        /// è®¡é‡å•位
        /// </summary>
        [PropertyValidate("计量单位:Kg:公斤、M:米、Pcs:个(只)", NotNullAndEmpty = true)]
        public string Unit { get; set; }
        /// <summary>
        /// è®¡é‡å•位
        /// </summary>
        [PropertyValidate("计量单位:Kg:公斤、M:米、Pcs:个(只)", NotNullAndEmpty = true)]
        public string AssistUnitCode { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTPickInfoDTO.cs
@@ -50,7 +50,7 @@
        public List<PaperMattakeDetailItem> PaperMattakeDetails { get; set; }
    }
    /// <summary>
    /// ç”Ÿäº§æŽ’程明细
    /// ç”Ÿäº§æŽ’程领用明细
    /// </summary>
    public class PaperMattakeDetailItem
    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTStockInfoDTO.cs
@@ -28,7 +28,7 @@
        /// </summary>
        public string ReceiptDate { get; set; }
        /// <summary>
        /// é¾™åˆ©å¾—150g白卡
        /// ç‰©æ–™åç§°
        /// </summary>
        public string MaterialName { get; set; }
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/SGOutOrderDTO.cs
@@ -89,5 +89,17 @@
        /// </summary>
        [PropertyValidate("生产工单号", NotNullAndEmpty = true)]
        public string OrderId { get; set; }
        /// <summary>
        /// å·¥å•用纸序号(上游)
        /// </summary>
        [PropertyValidate("工单用纸序号", NotNullAndEmpty = true)]
        public int Number { get; set; }
        /// <summary>
        /// å¤‡æ³¨(上游)
        /// </summary>
        [PropertyValidate("工单用纸序号", NotNullAndEmpty = true)]
        public string Remark { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/MES/MESReturnIssueDTO.cs
@@ -14,22 +14,23 @@
    public class MESReturnIssueDTO
    {
        /// <summary>
        /// å‡ºåº“来源明细ID
        /// </summary>
        [PropertyValidate("出库来源明细ID", NotNullAndEmpty = true)]
        public int OutDetailId { get; set; }
        /// <summary>
        /// å‘¼å«Id
        /// </summary>
        [PropertyValidate("呼叫Id", NotNullAndEmpty = true)]
        public string IssueId { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒ
        /// </summary>
        [PropertyValidate("加工中心", NotNullAndEmpty = true)]
        public string MakeCode { get; set; }
        /// <summary>
        /// å‘¨è½¬ä½ç½®ç¼–号
        /// </summary>
        [PropertyValidate("周转位置编号", NotNullAndEmpty = true)]
        public string PointCode { get; set; }
        /// <summary>
        /// ä½™æ–™ä¿¡æ¯
        /// </summary>
@@ -62,10 +63,10 @@
        [PropertyValidate("退料数量", NotNullAndEmpty = true)]
        public decimal ReturnQuantity { get; set; }
        /// <summary>
        /// æ˜¯å¦é¢†æ–™ï¼ˆ1未领料 0已临料)
        /// æ˜¯å¦é¢†æ–™ï¼ˆ1未领料 0已领料)
        /// </summary>
        [PropertyValidate("是否领料(1未领料 0已临料)", NotNullAndEmpty = true)]
        public string Whether { get; set; }
        [PropertyValidate("是否领料(1未领料 0已领料)", NotNullAndEmpty = true)]
        public int Whether { get; set; }
        /// <summary>
        /// é€€æ–™å·¥å•号(ERP相关)
        /// </summary>
@@ -75,7 +76,7 @@
        /// ç›´å¾„
        /// </summary>
        [PropertyValidate("直径", NotNullAndEmpty = true)]
        public string Thickness { get; set; }
        public decimal Thickness { get; set; }
        /// <summary>
        /// å¹…宽
        /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Task/WMSTaskDTO.cs
@@ -85,6 +85,14 @@
        /// 
        /// </summary>
        public int PalletType { get; set; }
        /// <summary>
        /// MES计划Id
        /// </summary>
        public int DispatchPlanId { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒ
        /// </summary>
        public string WorkCentreCode { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/MESDeliveryModel.cs
@@ -35,7 +35,7 @@
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public int MainQuantity { get; set; }
        public decimal MainQuantity { get; set; }
        /// <summary>
        /// è¾…单位编码
        /// </summary>
@@ -47,7 +47,7 @@
        /// <summary>
        /// ä»“库编码
        /// </summary>
        public string StockInfoCode { get; set; }
        public string StockInfoCode { get; set; } = "CKDA003";
        /// <summary>
        /// æ‰¹å·
        /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundService/IMESProInOrderInfoService.cs
@@ -15,12 +15,10 @@
    {
        IMESProInOrderInfoRepository Repository { get; }
        /// <summary>
        /// æˆå“/半成品信息同步接口
        /// </summary>
        WebResponseContent ReceiveProCodeInfo(List<MESProInDTO> proInDTOs);
        /// <summary>
        /// MES工单停止接口
        /// </summary>
        WebResponseContent ReceiveProOrderStop(MESOrderStopDTO orderStopDTO);
        WebResponseContent MESBoxCode(string boxCode);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutLineViewRepository.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 IOutLineViewRepository : IRepository<Dt_OutLineView>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutboundRepository.cs
@@ -40,6 +40,9 @@
        /// æˆå“é”€å”®å‡ºåº“明细仓储接口层
        /// </summary>
        IProDeliveryOrderDetailRepository ProDeliveryOrderDetailRepository { get; }
        /// <summary>
        /// è€åŽ‚çº¿ä½“ç¼“å­˜ä»“å‚¨æŽ¥å£å±‚
        /// </summary>
        IOutLineViewRepository OutLineViewRepository { get; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutLineViewService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
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_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public interface IOutLineViewService : IService<Dt_OutLineView>
    {
        IOutLineViewRepository Repository { get; }
        /// <summary>
        /// å­˜å…¥æœ€æ–°çš„出库纸卷信息
        /// </summary>
        WebResponseContent SaveLineView(List<Dt_OutStockLockInfo> outStockLockInfos);
        /// <summary>
        /// èŽ·å–çº¿ä½“åŽŸçº¸
        /// </summary>
        /// <returns></returns>
        WebResponseContent GetOutLineView();
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutboundService.cs
@@ -28,5 +28,9 @@
        /// å‡ºåº“详情业务接口层
        /// </summary>
        IOutStockLockInfoService OutStockLockInfoService { get; }
        /// <summary>
        /// è€åŽ‚çº¿ä½“ç¼“å­˜ä¸šåŠ¡æŽ¥å£å±‚
        /// </summary>
        IOutLineViewService OutLineViewService { get; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IStockService/IStockInfoService.cs
@@ -1,4 +1,5 @@
using System;
using OfficeOpenXml.FormulaParsing.Excel.Operators;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -20,6 +21,11 @@
        /// </summary>
        WebResponseContent ManualMaterielGroup(SaveModel saveModel);
        /// <summary>
        /// æ›´æ–°è€åŽ‚æ®‹å·åº“å­˜
        /// </summary>
        /// <returns></returns>
        WebResponseContent UpBSTStock(int operate);
        /// <summary>
        /// èŽ·å–å¯ä½¿ç”¨åº“å­˜
        /// </summary>
        List<Dt_StockInfo> GetUseableStocks(int materielId,decimal width, int warehoseId);
@@ -35,5 +41,10 @@
        /// åˆ†é…å®žé™…库存
        /// </summary>
        List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity);
        /// <summary>
        /// åˆ†é…è€åŽ‚åº“å­˜
        /// </summary>
        List<Dt_StockInfo> GetOutOldStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -252,6 +252,13 @@
        /// </summary>
        /// <param name="bSTPickInfoDTO"></param>
        /// <returns></returns>
        WebResponseContent ReceivePicking(BSTPickInfoDTO bSTPickInfoDTO);
        WebResponseContent ReceivePicking(List<BSTPickInfoDTO> bSTPickInfoDTOs);
        /// <summary>
        /// åˆ›å»ºç”Ÿç®¡æ‰‹åŠ¨å‡ºåº“
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        WebResponseContent CreateSGManualTasks(List<int> ids);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/InboundOrderService.cs
@@ -56,9 +56,10 @@
                {
                    return content.Error($"入库条码{nameof(inboundDetailItem.BarCode)}:{inboundDetailItem.BarCode}物料:{inboundDetailItem.MaterialCode}不存在");
                }
                //获取所有采购信息
                //获取所有入库信息
                List<Dt_InboundOrder> inboundOrdersOld = BaseDal.Db.Queryable<Dt_InboundOrder>().Includes(x => x.Details).ToList();
                //获取所有入库明细信息
                List<Dt_InboundOrderDetail> inboundOrderDetailsOld = inboundOrdersOld.SelectMany(x=>x.Details).ToList();
                if (eRPInboundOrderDTO.OperateType == 1)
                {
                    //判断重复插入
@@ -76,6 +77,10 @@
                        {
                            throw new Exception($"物料{x.MaterialCode}条码{x.BarCode}直径需大于0");
                        }
                        if (inboundOrderDetailsOld.FirstOrDefault(t=>t.BarCode==x.BarCode)!=null)
                        {
                            throw new Exception($"入库单{inboundOrder.UpperOrderNo}{x.MaterialCode}条码{x.BarCode}已存在");
                        }
                        x.MaterialName = materielInfo?.MaterielName;
                        x.Unit = materielInfo?.MaterielUnit;
                        x.MaterialSpec = materielInfo.MaterielSpec;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/MESProInOrderInfoService.cs
@@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
@@ -11,6 +12,8 @@
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.MES;
using WIDESEA_External.MESService;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
@@ -24,75 +27,15 @@
        private readonly IBasicRepository _basicRepository;
        private readonly IAGVStationInfoRepository _agvStationInfoRepository;
        private readonly IMapper _mapper;
        public MESProInOrderInfoService(IMESProInOrderInfoRepository BaseDal,IBasicRepository basicRepository,IMapper mapper, IAGVStationInfoRepository agvStationInfoRepository) : base(BaseDal)
        private readonly IInvokeMESService _invokeMESService;
        public MESProInOrderInfoService(IMESProInOrderInfoRepository BaseDal,IBasicRepository basicRepository,IMapper mapper, IAGVStationInfoRepository agvStationInfoRepository,IInvokeMESService invokeMESService) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _mapper = mapper;
            _agvStationInfoRepository = agvStationInfoRepository;
            _invokeMESService = invokeMESService;
        }
        /// <summary>
        /// æˆå“/半成品信息同步接口
        /// </summary>
        public WebResponseContent ReceiveProCodeInfo(List<MESProInDTO> proInDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (proInDTOs==null || proInDTOs.Count<=0)
                {
                    return content.Error("传入信息为空");
                }
                //获取所有成品,半成品信息
                List<Dt_MESProInOrderInfo> proInOrderInfos = BaseDal.QueryData();
                //获取所有物料信息
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt());
                MESProInDTO? CheckMaterialCode = proInDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialCode));
                if (CheckMaterialCode != null)
                {
                    return content.Error($"物料编码{nameof(MESProInDTO.MaterialCode)}:{CheckMaterialCode.MaterialCode}信息不存在");
                }
                //获取所有AGV点位
                List<Dt_AGVStationInfo> aGVStationInfos = _agvStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
                //判断是否存在重复
                MESProInDTO? proInDTO = proInDTOs.FirstOrDefault(x=>x.IsMantissa==false && proInOrderInfos.Select(x=>x.BarCode).Contains(x.BarCode));
                if (proInDTO!=null)
                {
                    return content.Error($"{proInDTO.ProductOrderNo}生产工单{proInDTO.BarCode}条码已存在");
                }
                Dt_MESProInOrderInfo? proInOrderInfo = proInOrderInfos.FirstOrDefault(x=>x.MESProInStatus==InOrderStatusEnum.关闭.ObjToInt() && proInDTOs.Select(x=>x.ProductOrderNo).Distinct().Contains(x.ProductOrderNo));
                if (proInOrderInfo != null)
                {
                    return content.Error($"{proInOrderInfo.ProductOrderNo}生产工单已关闭");
                }
                List<Dt_MESProInOrderInfo> AddMESProInOrders = new List<Dt_MESProInOrderInfo>();
                foreach (var item in proInDTOs)
                {
                    Dt_MaterielInfo materielInfo = materielInfos.FirstOrDefault(x=>x.MaterielCode== item.MaterialCode);
                    if (materielInfo.MaterielSourceType!=MaterielTypeEnum.成品.ObjToInt())
                    {
                        Dt_AGVStationInfo? CheckPointCode = aGVStationInfos.FirstOrDefault(x=>x.MESPointCode==item?.PointCode);
                        if (CheckPointCode == null)
                        {
                            return content.Error($"周转位{nameof(MESReturnIssueDTO.PointCode)}{item?.PointCode}不存在,仅成品物料可不传");
                        }
                    }
                    Dt_MESProInOrderInfo AddproInOrderInfo = _mapper.Map<Dt_MESProInOrderInfo>(item);
                    AddproInOrderInfo.WarehouseId = materielInfo.WarehouseId;
                    AddproInOrderInfo.MESProOrderType = materielInfo.MaterielSourceType;
                    AddMESProInOrders.Add(AddproInOrderInfo);
                }
                BaseDal.AddData(AddMESProInOrders);
                content.OK("接收成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// MES工单停止接口
        /// </summary>
@@ -107,14 +50,14 @@
                    return content.Error("传入信息不能为空");
                }
                //获取对应单据
                List<Dt_MESProInOrderInfo>? mESProInOrderInfos = BaseDal.QueryData(x => x.ProductOrderNo == orderStopDTO.ProductOrderNo && x.MESProInStatus != OutOrderStatusEnum.关闭.ObjToInt());
                List<Dt_MESProInOrderInfo>? mESProInOrderInfos = BaseDal.QueryData(x => x.ProductOrderNo == orderStopDTO.ProductOrderNo && x.MESProInStatus != InOrderStatusEnum.关闭.ObjToInt());
                if (mESProInOrderInfos == null || mESProInOrderInfos.Count <= 0)
                {
                    return content.Error($"成品或半成品工单{nameof(MESOrderStopDTO.ProductOrderNo)}{orderStopDTO.ProductOrderNo}不存在或已关闭");
                }
                mESProInOrderInfos.ForEach(x =>
                {
                    x.MESProInStatus = OutOrderStatusEnum.关闭.ObjToInt();
                    x.MESProInStatus = InOrderStatusEnum.关闭.ObjToInt();
                });
                BaseDal.UpdateData(mESProInOrderInfos);
                content.OK($"工单{nameof(MESOrderStopDTO.ProductOrderNo)}{orderStopDTO.ProductOrderNo}停止成功");
@@ -125,5 +68,49 @@
            }
            return content;
        }
        /// <summary>
        /// MES工单停止接口
        /// </summary>
        /// <summary>
        public WebResponseContent MESBoxCode(string boxCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (boxCode.IsNullOrEmpty())
                {
                    return content.Error("传入信息不能为空");
                }
                //获取对应单据
                Dt_MESProInOrderInfo mESProInOrderInfo = BaseDal.QueryFirst(x => x.BarCode == boxCode);
                if (mESProInOrderInfo == null)
                {
                    return content.Error($"成品条码{boxCode}不存在");
                }
                if (mESProInOrderInfo.MESProInStatus==InOrderStatusEnum.入库完成.ObjToInt())
                {
                    return content.Error($"成品条码{boxCode}已入库");
                }
                mESProInOrderInfo.MESProInStatus = InOrderStatusEnum.入库完成.ObjToInt();
                MESResponse response = _invokeMESService.MESBoxCodeNotice(boxCode).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到MES返回信息");
                if (!response.Result)
                {
                    throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(response.Msg)}");
                }
                BaseDal.UpdateData(mESProInOrderInfo);
                content.OK($"成品条码{boxCode}扫码入库");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public static string DecodeUnicode(string input)
        {
            return Regex.Replace(input, @"\\u([0-9a-fA-F]{4})", match => {
                return ((char)Convert.ToInt32(match.Groups[1].Value, 16)).ToString();
            });
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/PurchaseOrderService.cs
@@ -116,7 +116,7 @@
                }
                //获取所有采购信息
                List<Dt_PurchaseOrder> purchaseOrdersOld = BaseDal.Db.Queryable<Dt_PurchaseOrder>().Includes(x=>x.Details).ToList();
                List<Dt_PurchaseOrderDetail> purchaseOrderDetailsOld = purchaseOrdersOld.SelectMany(x => x.Details).ToList();
                if (eRPPurchaseOrderDTO.OperateType == 1)
                {
                    //判断重复插入
@@ -130,6 +130,10 @@
                    purchaseOrderDetails.ForEach(x =>
                    {
                        Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(t => t.MaterielCode == x.MaterialCode);
                        if (materielInfo != null)
                        {
                        }
                        x.MaterielName = materielInfo?.MaterielName;
                        x.Unit = materielInfo?.MaterielUnit;
                        x.MaterielSpec=  materielInfo?.MaterielSpec;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_MaterielInfo.cs
@@ -96,6 +96,12 @@
        public string MaterielUnit { get; set; }
        /// <summary>
        /// è¾…单位
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "辅单位")]
        public string AssistUnitCode { get; set; }
        /// <summary>
        /// ç‰©æ–™çŠ¶æ€(0:禁用、1:可用)
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料状态(0:禁用、1:可用)")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_MESProInOrderInfo.cs
@@ -91,7 +91,7 @@
        /// <summary>
        /// ä½ç½®ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "位置编号")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "位置编号")]
        public string PointCode { get; set; }
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutLineView.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
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>
    /// è€åŽ‚å‡ºåº“çº¿ä½“ç¼“å­˜
    /// </summary>
    [SugarTable(nameof(Dt_OutLineView), "老厂出库线体缓存"), ModelValidate]
    public class Dt_OutLineView : 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>
        /// ç‰©æ–™ç¼–号
        /// </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 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 = false, Length = 50, ColumnDescription = "条码编号")]
        public string PalletCode { get; set; }
        /// <summary>
        /// æœºå°ä½ç½®
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "机台位置")]
        public string MachineName { get; set; }
        /// <summary>
        /// ç‰©æ–™å¹…宽
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "物料幅宽")]
        public decimal? MaterialWide { get; set; }
        /// <summary>
        /// ç‰©æ–™é‡é‡
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "物料重量")]
        public decimal? MaterialWeight { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "任务号")]
        public int? TaskNum { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutMESOrder.cs
@@ -120,6 +120,18 @@
        public decimal OutTotalUsage { get; set; }
        /// <summary>
        /// åŸºæœ¬å•位
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "基本单位")]
        public string MaterielUnit { get; set; }
        /// <summary>
        /// è¾…单位
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "辅单位")]
        public string AssistUnitCode { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutSGOrder.cs
@@ -55,6 +55,12 @@
        public string ShortName { get; set; }
        /// <summary>
        /// å·¥å•用纸序号
        /// </summary>
        [SugarColumn(IsNullable = false,  ColumnDescription = "工单用纸序号")]
        public int Number { get; set; }
        /// <summary>
        /// å‡ºåº“单状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库单状态")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutSGOrderDetail.cs
@@ -111,6 +111,12 @@
        public string MaterialName { get; set; }
        /// <summary>
        /// å¤‡æ³¨(上游)
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "备注(上游)")]
        public string Remark { get; set; }
        /// <summary>
        /// å‡ºåº“单明细状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库单明细状态")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutStockLockInfo.cs
@@ -106,6 +106,12 @@
        public string Unit { get; set; }
        /// <summary>
        /// è¾…单位
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "辅单位")]
        public string AssistUnit { get; set; }
        /// <summary>
        /// æœºå°ä½ç½®
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "机台位置")]
@@ -116,6 +122,16 @@
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "加工中心")]
        public string MakeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™å¹…宽
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "物料幅宽")]
        public decimal? MaterialWide { get; set; }
        /// <summary>
        /// ç‰©æ–™é‡é‡
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "物料重量")]
        public decimal? MaterialWeight { get; set; }
        /// <summary>
        /// ä»»åŠ¡å·
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs
@@ -1,4 +1,5 @@
using SqlSugar;
using Magicodes.ExporterAndImporter.Core;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -18,144 +19,192 @@
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [ExporterHeader(DisplayName = "主键")]
        [ImporterHeader(Name = "主键")]
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// æ¡ç ç¼–号
        /// </summary>
        [ExporterHeader(DisplayName = "条码编号")]
        [ImporterHeader(Name = "条码编号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "条码编号")]
        public string PalletCode { get; set; }
        /// <summary>
        /// RFID信息
        /// </summary>
        [ExporterHeader(DisplayName = "RFID信息")]
        [ImporterHeader(Name = "RFID信息")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "RFID信息")]
        public string RfidCode { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç±»åž‹
        /// </summary>
        [ExporterHeader(DisplayName = "托盘类型")]
        [ImporterHeader(Name = "托盘类型")]
        [SugarColumn(IsNullable = false, ColumnDescription = "托盘类型")]
        public int PalletType { get; set; }
        /// <summary>
        /// è´§ä½ç¼–号
        /// </summary>
        [ExporterHeader(DisplayName = "货位编号")]
        [ImporterHeader(Name = "货位编号")]
        [SugarColumn(IsNullable = true, Length = 30, ColumnDescription = "货位编号")]
        public string LocationCode { get; set; }
        /// <summary>
        /// ä»“库主键
        /// </summary>
        [ExporterHeader(DisplayName = "仓库主键")]
        [ImporterHeader(Name = "仓库主键")]
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        public int WarehouseId { get; set; }
        /// <summary>
        /// åº“存组织
        /// </summary>
        [ExporterHeader(DisplayName = "库存组织")]
        [ImporterHeader(Name = "库存组织")]
        [SugarColumn(IsNullable = false, ColumnDescription = "库存组织")]
        public int MaterielInvOrgId { get; set; }
        /// <summary>
        /// åº“存属性(原纸,半成...)
        /// </summary>
        [ExporterHeader(DisplayName = "库存属性")]
        [ImporterHeader(Name = "库存属性")]
        [SugarColumn(IsNullable = false, ColumnDescription = "库存属性")]
        public int StockAttribute { get; set; }
        /// <summary>
        /// åº“存状态
        /// </summary>
        [ExporterHeader(DisplayName = "库存状态")]
        [ImporterHeader(Name = "库存状态")]
        [SugarColumn(IsNullable = false, ColumnDescription = "库存状态")]
        public int StockStatus { get; set; }
        /// <summary>
        /// ç‰©æ–™Id
        /// </summary>
        [ExporterHeader(DisplayName = "物料Id")]
        [ImporterHeader(Name = "物料Id")]
        [SugarColumn(IsNullable = true, ColumnDescription = "物料Id")]
        public int MaterielId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [ExporterHeader(DisplayName = "物料编号")]
        [ImporterHeader(Name = "物料编号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [ExporterHeader(DisplayName = "物料名称")]
        [ImporterHeader(Name = "物料名称")]
        [SugarColumn(IsNullable = false, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        /// <summary>
        /// ç‰©æ–™è§„æ ¼
        /// </summary>
        [ExporterHeader(DisplayName = "物料规格")]
        [ImporterHeader(Name = "物料规格")]
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料规格")]
        public string MaterielSpec { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        [ExporterHeader(DisplayName = "批次号")]
        [ImporterHeader(Name = "批次号")]
        [SugarColumn(IsNullable = true, Length = 100, ColumnDescription = "批次号")]
        public string BatchNo { get; set; }
        /// <summary>
        /// è®¢å•号
        /// </summary>
        [ExporterHeader(DisplayName = "订单号")]
        [ImporterHeader(Name = "订单号")]
        [SugarColumn(IsNullable = true, Length = 100, ColumnDescription = "订单号")]
        public string OrderNo { get; set; }
        /// <summary>
        /// åº“存物料总长(m)
        /// </summary>
        [ExporterHeader(DisplayName = "库存物料总长")]
        [ImporterHeader(Name = "库存物料总长")]
        [SugarColumn(IsNullable = true, ColumnDescription = "库存物料总长(m)")]
        public decimal StockLength { get; set; }
        /// <summary>
        /// ç‰©æ–™é‡é‡
        /// </summary>
        [ExporterHeader(DisplayName = "物料重量")]
        [ImporterHeader(Name = "物料重量")]
        [SugarColumn(IsNullable = true, ColumnDescription = "物料重量")]
        public decimal? MaterielWeight { get; set; }
        /// <summary>
        /// æ£€æµ‹é‡é‡
        /// </summary>
        [ExporterHeader(DisplayName = "检测重量")]
        [ImporterHeader(Name = "检测重量")]
        [SugarColumn(IsNullable = true, ColumnDescription = "检测重量")]
        public decimal? CheckWeight { get; set; }
        /// <summary>
        /// ç‰©æ–™ç›´å¾„/高度
        /// </summary>
        [ExporterHeader(DisplayName = "物料直径")]
        [ImporterHeader(Name = "物料直径")]
        [SugarColumn(IsNullable = true, ColumnDescription = "物料直径/高度")]
        public decimal? MaterielThickness { get; set; }
        /// <summary>
        /// æ£€æµ‹ç›´å¾„
        /// </summary>
        [ExporterHeader(DisplayName = "检测直径")]
        [ImporterHeader(Name = "检测直径")]
        [SugarColumn(IsNullable = true, ColumnDescription = "检测直径")]
        public decimal? CheckThickness { get; set; }
        /// <summary>
        /// ç‰©æ–™ä¾§é¢å¹…宽(m)
        /// </summary>
        [ExporterHeader(DisplayName = "物料侧面幅宽")]
        [ImporterHeader(Name = "物料侧面幅宽")]
        [SugarColumn(IsNullable = true, ColumnDescription = "物料侧面幅宽(m)")]
        public decimal? MaterielWide { get; set; }
        /// <summary>
        /// æ£€æµ‹å¹…宽
        /// </summary>
        [ExporterHeader(DisplayName = "检测幅宽")]
        [ImporterHeader(Name = "检测幅宽")]
        [SugarColumn(IsNullable = true, ColumnDescription = "检测幅宽")]
        public decimal? CheckWide { get; set; }
        /// <summary>
        /// å‡ºåº“物料数量
        /// </summary>
        [ExporterHeader(DisplayName = "出库物料数量")]
        [ImporterHeader(Name = "出库物料数量")]
        [SugarColumn(IsNullable = false, ColumnDescription = "出库物料数量", DefaultValue = "0")]
        public decimal StockOutLength { get; set; }
        /// <summary>
        /// æ•´å·/残卷
        /// </summary>
        [ExporterHeader(DisplayName = "整卷/残卷")]
        [ImporterHeader(Name = "整卷/残卷")]
        [SugarColumn(IsNullable = false, ColumnDescription = "整卷/残卷", DefaultValue = "0")]
        public int IsFull { get; set; }
@@ -164,18 +213,24 @@
        /// 0 å¦<br/>
        /// 1 æ˜¯<br/>
        /// </summary>
        [ExporterHeader(DisplayName = "是否领料(1是0否)")]
        [ImporterHeader(Name = "是否领料(1是0否)")]
        [SugarColumn(IsNullable = false, ColumnDescription = "是否领料", DefaultValue = "0")]
        public int IsPick { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [ExporterHeader(DisplayName = "单位")]
        [ImporterHeader(Name = "单位")]
        [SugarColumn(IsNullable = true, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [ExporterHeader(DisplayName = "备注")]
        [ImporterHeader(Name = "备注")]
        [SugarColumn(IsNullable = true, ColumnDescription = "备注")]
        public string Remark { get; set; }
    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs
@@ -124,7 +124,7 @@
        /// </summary>
        [ImporterHeader(Name = "单据编号")]
        [ExporterHeader(DisplayName = "单据编号")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "单据编号")]
        [SugarColumn(IsNullable = true, Length = 100, ColumnDescription = "单据编号")]
        public string? OrderNo { get; set; }
        /// <summary>
@@ -142,6 +142,7 @@
        [ExporterHeader(DisplayName = "任务下发时间")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务下发时间")]
        public DateTime? Dispatchertime { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç»„
        /// </summary>
@@ -149,6 +150,7 @@
        [ExporterHeader(DisplayName = "任务组")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务组")]
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
@@ -156,6 +158,7 @@
        [ExporterHeader(DisplayName = "任务物料长度")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务物料长度")]
        public int TaskLength { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
@@ -163,6 +166,7 @@
        [ExporterHeader(DisplayName = "备注")]
        [SugarColumn(IsNullable = true, Length = 255, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
@@ -170,6 +174,23 @@
        [ExporterHeader(DisplayName = "物料编号")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒç¼–ç 
        /// </summary>
        [ImporterHeader(Name = "加工中心编码")]
        [ExporterHeader(DisplayName = "加工中心编码")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "加工中心编码")]
        public string WorkCentreCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [ImporterHeader(Name = "MES计划Id")]
        [ExporterHeader(DisplayName = "MES计划Id")]
        [SugarColumn(IsNullable = true, ColumnDescription = "MES计划Id")]
        public int DispatchPlanId { get; set; }
        /// <summary>
        /// ç‰©æ–™æ•°é‡
        /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundRepository/OutLineViewRepository.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 OutLineViewRepository : RepositoryBase<Dt_OutLineView>, IOutLineViewRepository
    {
        public OutLineViewRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundRepository/OutboundRepository.cs
@@ -19,7 +19,8 @@
        public IOutBSTPickInfoRepository OutBSTPickInfoRepository { get; }
        public IProDeliveryOrderRepository ProDeliveryOrderRepository { get; }
        public IProDeliveryOrderDetailRepository ProDeliveryOrderDetailRepository { get; }
        public OutboundRepository(IOutMESOrderRepository outMESOrderRepository, IOutSGOrderRepository outSGOrderRepository, IOutSGOrderDetailRepository outSGOrderDetailRepository, IOutStockLockInfoRepository outStockLockInfoRepository, IOutBSTPickInfoRepository outBSTPickInfoRepository, IProDeliveryOrderRepository proDeliveryOrderRepository, IProDeliveryOrderDetailRepository proDeliveryOrderDetailRepository)
        public IOutLineViewRepository OutLineViewRepository { get; }
        public OutboundRepository(IOutMESOrderRepository outMESOrderRepository, IOutSGOrderRepository outSGOrderRepository, IOutSGOrderDetailRepository outSGOrderDetailRepository, IOutStockLockInfoRepository outStockLockInfoRepository, IOutBSTPickInfoRepository outBSTPickInfoRepository, IProDeliveryOrderRepository proDeliveryOrderRepository, IProDeliveryOrderDetailRepository proDeliveryOrderDetailRepository, IOutLineViewRepository outLineViewRepository)
        {
            OutMESOrderRepository = outMESOrderRepository;
            OutSGOrderRepository = outSGOrderRepository;
@@ -28,6 +29,7 @@
            OutBSTPickInfoRepository = outBSTPickInfoRepository;
            ProDeliveryOrderRepository = proDeliveryOrderRepository;
            ProDeliveryOrderDetailRepository = proDeliveryOrderDetailRepository;
            OutLineViewRepository = outLineViewRepository;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutLineViewService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_OutboundService
{
    public class OutLineViewService : ServiceBase<Dt_OutLineView, IOutLineViewRepository>, IOutLineViewService
    {
        public IOutLineViewRepository Repository => BaseDal;
        private IBasicRepository _basicRepository;
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public OutLineViewService(IOutLineViewRepository BaseDal, IBasicRepository basicRepository, IMapper mapper, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
        }
        /// <summary>
        /// èŽ·å–çº¿ä½“åŽŸçº¸
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetOutLineView()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取数据
                List<Dt_OutLineView> lineViews = BaseDal.QueryData().OrderBy(x=>x.CreateDate).ToList();
                int taskCount = BaseDal.Db.Queryable<Dt_Task>().Where(x=>x.TaskType==TaskTypeEnum.OldYLOutbound.ObjToInt() && x.TaskStatus==TaskStatusEnum.Line_Executing.ObjToInt()).Count();
                content.OK($"{taskCount}", lineViews);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// å­˜å…¥æœ€æ–°çš„出库纸卷信息
        /// </summary>
        /// <param name="outStockLockInfos"></param>
        /// <returns></returns>
        public WebResponseContent SaveLineView(List<Dt_OutStockLockInfo> outStockLockInfos)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取当前老厂缓存所有纸卷信息
                List<Dt_OutLineView> outLineViews = BaseDal.QueryData();
                //获取当前纸卷个数
                int? outLineCount = outLineViews?.Select(x => x.PalletCode).Distinct().Count();
                if (outLineViews==null || outLineViews.Count<=0 || outLineCount<=2)
                {
                    List<Dt_OutLineView> outLineViewsAdd = outStockLockInfos.Select(x => _mapper.Map<Dt_OutLineView>(x)).ToList();
                    BaseDal.AddData(outLineViewsAdd);
                }
                else
                {
                    //获取最早的纸卷信息
                    string? code= outLineViews.FirstOrDefault()?.PalletCode;
                    List<Dt_OutLineView> outLineViewsDel = outLineViews.Where(x=>x.PalletCode==code).ToList();
                    List<Dt_OutLineView> outLineViewsAdd = outStockLockInfos.Select(x => _mapper.Map<Dt_OutLineView>(x)).ToList();
                    BaseDal.DeleteData(outLineViewsDel);
                    BaseDal.AddData(outLineViewsAdd);
                }
                content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutSGOrderDetailService.cs
@@ -76,10 +76,10 @@
                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(item.MaterialNo, item.Width, outBSTOrders.FirstOrDefault().WarehouseId).Where(x=>!outStocks.Select(x=>x.PalletCode).Contains(x.PalletCode)).ToList();
                if (!stockInfos.Any())
                {
                    throw new Exception($"未找到可分配库存");
                    continue;
                }
                //分配实际库存
                List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, needQuantity).ToList();
                List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutOldStocks(stockInfos, needQuantity).ToList();
                //添加库存分配
                outStocks.AddRange(autoAssignStocks);
                //获取所有该物料单据
@@ -100,6 +100,11 @@
                        decimal orderDetailNeedQuantity = details[i].XqLen - detailAssignQuantity;
                        if (autoAssignStocks.Count==0)
                        {
                            break;
                        }
                        decimal useStockLength = autoAssignStocks[0].StockLength- autoAssignStocks[0].StockOutLength;
                        Dt_OutSGOrder? sGOrder = outBSTOrders.FirstOrDefault(x => x.Id == details[i].OutSGOrderId);
                        if (orderDetailNeedQuantity > useStockLength)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutSGOrderService.cs
@@ -20,6 +20,9 @@
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core.Helper;
using System.Reflection;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Http;
using HslCommunication;
namespace WIDESEA_OutboundService
{
@@ -45,56 +48,84 @@
        
        public WebResponseContent AddOutSGOrder(List<SGOutOrderDTO> outOrderDTOs)
        {
                WebResponseContent content = new WebResponseContent();
                try
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有排程单
                List<Dt_OutSGOrder> outSGOrders = BaseDal.Db.Queryable<Dt_OutSGOrder>().Includes(x => x.Details).ToList();
                List<Dt_OutSGOrderDetail> outSGOrderDetails= outSGOrders.SelectMany(x=>x.Details).ToList();
                ////判断单据
                //Dt_OutSGOrderDetail? ExistAddOutOrderDetail = outSGOrderDetails.FirstOrDefault(x => outOrderDTOs.Select(t => t.BoardMpsDetailId).Distinct().Contains(x.BoardMpsDetailId));
                //if (ExistAddOutOrderDetail != null)
                //{
                //    return content.Error($"出库排程明细{nameof(SGOutOrderDTO.BoardMpsDetailId)}:{ExistAddOutOrderDetail.BoardMpsDetailId}已存在");
                //}
                //获取所有物料
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
                SGOutOrderDTO? sGOutOrderDTO = outOrderDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialNo));
                //SGOutOrderDTO? sGOutOrderDTO = outOrderDTOs.FirstOrDefault(x => materielInfos.FirstOrDefault(t=>t.MaterielCode.StartsWith(x.MaterialNo))==null);
                if (sGOutOrderDTO != null)
                {
                    //获取所有排程单
                    List<Dt_OutSGOrder> outSGOrders = BaseDal.Db.Queryable<Dt_OutSGOrder>().Includes(x => x.Details).ToList();
                    //判断单据
                    Dt_OutSGOrder? ExistAddOutOrder = outSGOrders.FirstOrDefault(x => outOrderDTOs.Select(x => x.OrderId).Distinct().Contains(x.OrderId));
                    if (ExistAddOutOrder != null)
                    return content.Error($"生产排程{sGOutOrderDTO.OrderId}物料:{sGOutOrderDTO.MaterialNo}不存在");
                }
                List<Dt_OutSGOrder> AddOutSGOrders = new List<Dt_OutSGOrder>();
                foreach (var item in outOrderDTOs.OrderBy(x=>x.Number))
                {
                    //获取工单
                    Dt_OutSGOrder? ExistOutSGOrder = AddOutSGOrders.FirstOrDefault(x => x.OrderId == item.OrderId);
                    //明细提前转换
                    Dt_OutSGOrderDetail outSGOrderDetail = _mapper.Map<Dt_OutSGOrderDetail>(item);
                    //获取物料
                    Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialNo);
                    string code = ExtractFirstPercentContent(outSGOrderDetail.Remark);
                    //处理特殊指定排程判断
                    if (!code.IsNullOrEmpty() && code.StartsWith(outSGOrderDetail.MaterialNo))
                    {
                        return content.Error($"出库排程单号{nameof(SGOutOrderDTO.OrderId)}:{ExistAddOutOrder.OrderId}已存在");
                    }
                    //获取所有物料
                    List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
                    SGOutOrderDTO? sGOutOrderDTO = outOrderDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialNo));
                    if (sGOutOrderDTO != null)
                    {
                        return content.Error($"生产排程{sGOutOrderDTO.OrderId}物料:{sGOutOrderDTO.MaterialNo}不存在");
                    }
                    List<Dt_OutSGOrder> AddOutSGOrders = new List<Dt_OutSGOrder>();
                    foreach (var item in outOrderDTOs)
                    {
                        //获取工单
                        Dt_OutSGOrder? ExistOutSGOrder = AddOutSGOrders.FirstOrDefault(x => x.OrderId == item.OrderId);
                        //获取物料
                        Dt_MaterielInfo materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialNo);
                        //明细提前转换
                        Dt_OutSGOrderDetail outSGOrderDetail = _mapper.Map<Dt_OutSGOrderDetail>(item);
                        outSGOrderDetail.MaterialName = materielInfo.MaterielName;
                        //判断工单是否已经存在
                        if (ExistOutSGOrder != null)
                        materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == code);
                        if (materielInfo==null)
                        {
                            ExistOutSGOrder.Details.Add(outSGOrderDetail);
                            return content.Error($"生产排程{item.OrderId}指定排程物料:{code}不存在");
                        }
                        else
                        {
                        outSGOrderDetail.MaterialNo = code;
                    }
                    outSGOrderDetail.MaterialName = materielInfo.MaterielName;
                    //判断工单是否已经存在
                    if (ExistOutSGOrder != null)
                    {
                        ExistOutSGOrder.Details.Add(outSGOrderDetail);
                    }
                    else
                    {
                        Dt_OutSGOrder outSGOrder = _mapper.Map<Dt_OutSGOrder>(item);
                        outSGOrder.Details = new List<Dt_OutSGOrderDetail>() { outSGOrderDetail };
                        AddOutSGOrders.Add(outSGOrder);
                    }
                }
                BaseDal.Db.InsertNav(AddOutSGOrders).Include(x => x.Details).ExecuteCommand();
                content.OK("接收排程成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public static string ExtractFirstPercentContent(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;
                            Dt_OutSGOrder outSGOrder = _mapper.Map<Dt_OutSGOrder>(item);
                            outSGOrder.Details = new List<Dt_OutSGOrderDetail>() { outSGOrderDetail };
                            AddOutSGOrders.Add(outSGOrder);
                        }
                    }
                    BaseDal.Db.InsertNav(AddOutSGOrders).Include(x => x.Details).ExecuteCommand();
                    content.OK("接收排程成功");
                }
                catch (Exception ex)
                {
                    content.Error(ex.Message);
                }
                return content;
            Regex regex = new Regex(@"%(.*?)%");
            Match match = regex.Match(input);
            if (match.Success && match.Groups[1].Success)
            {
                return match.Groups[1].Value.Trim();
            }
            return null;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutStockLockInfoService.cs
@@ -75,20 +75,22 @@
                PalletCode = outStock.PalletCode,
                AssignQuantity = assignQuantity,
                MaterielCode = ouMESOrder.MaterialCode,
                BatchNo = ouMESOrder.MaterialLot,
                BatchNo = outStock.BatchNo,
                LocationCode = outStock.LocationCode,
                MaterielName = outStock.MaterielName,
                OrderDetailId = ouMESOrder.OutDetailId,
                OrderNo = ouMESOrder.OutMESOrderNo,
                MakeCode = ouMESOrder.MakeCode,
                MachineName=ouMESOrder.MakeArea.ToString(),
                OrderType=OutOrderTypeEnum.OutMESPick.ObjToInt(),
                MaterielId = outStock.MaterielId,
                OriginalQuantity = outStock.StockLength,
                Status = taskNum == null ? OutLockStockStatusEnum.已分配.ObjToInt() : OutLockStockStatusEnum.出库中.ObjToInt(),
                StockId = outStock.Id,
                TaskNum = taskNum,
                OrderQuantity = ouMESOrder.ReqQuantity,
                Unit = outStock.Unit
                Unit = outStock.Unit,
                AssistUnit= ouMESOrder.AssistUnitCode
            };
            return outStockLockInfo;
@@ -115,6 +117,8 @@
                StockId = outStock.Id,
                TaskNum = taskNum,
                OrderQuantity = outSGOrderDetail.XqLen,
                MaterialWeight=outStock.MaterielWeight,
                MaterialWide=outStock.MaterielWide,
                Unit = outStock.Unit,
                MachineName=outSGOrderDetail.MachineName,
            };
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutboundService.cs
@@ -28,12 +28,17 @@
        /// å‡ºåº“详情业务接口层
        /// </summary>
        public IOutStockLockInfoService OutStockLockInfoService { get; }
        public OutboundService(IOutMESOrderService outMESOrderService, IOutSGOrderService outSGOrderService, IOutSGOrderDetailService outSGOrderDetailService, IOutStockLockInfoService outStockLockInfoService)
        /// <summary>
        /// è€åŽ‚çº¿ä½“ç¼“å­˜ä¸šåŠ¡æŽ¥å£å±‚
        /// </summary>
        public IOutLineViewService OutLineViewService { get; }
        public OutboundService(IOutMESOrderService outMESOrderService, IOutSGOrderService outSGOrderService, IOutSGOrderDetailService outSGOrderDetailService, IOutStockLockInfoService outStockLockInfoService, IOutLineViewService outLineViewService)
        {
            OutMESOrderService = outMESOrderService;
            OutSGOrderService = outSGOrderService;
            OutSGOrderDetailService = outSGOrderDetailService;
            OutStockLockInfoService = outStockLockInfoService;
            OutLineViewService = outLineViewService;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -1,21 +1,27 @@
using AutoMapper;
using MailKit.Search;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing.Excel.Operators;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.Stock;
using WIDESEA_External.ERPService;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_IRecordRepository;
using WIDESEA_IRecordService;
@@ -31,13 +37,15 @@
        private readonly IMapper _mapper;
        private readonly IBasicRepository _basicRepository;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IInvokeERPService _invokeERPService;
        public IStockInfoRepository Repository => BaseDal;
        public StockInfoService(IStockInfoRepository BaseDal, IMapper mapper, IBasicRepository basicRepository, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        public StockInfoService(IStockInfoRepository BaseDal, IMapper mapper, IBasicRepository basicRepository, IUnitOfWorkManage unitOfWorkManage,IInvokeERPService invokeERPService) : base(BaseDal)
        {
            _mapper = mapper;
            _basicRepository = basicRepository;
            _unitOfWorkManage = unitOfWorkManage;
            _invokeERPService = invokeERPService;
        }
@@ -123,6 +131,65 @@
            }
            return content;
        }
        /// <summary>
        /// æ›´æ–°è€åŽ‚ç«‹åº“æ®‹å·åº“å­˜
        /// </summary>
        /// <returns></returns>
        public WebResponseContent UpBSTStock(int operate)
        {
            WebResponseContent content=new WebResponseContent();
            try
            {
                DateTime dateTime = Convert.ToDateTime("2025-11-01 00:00:00");
                //获取所有的残卷立库库存
                List<Dt_StockInfo> stockInfos = BaseDal.QueryData(x => x.IsFull == WhetherEnum.True.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.ModifyDate> dateTime);
                if (operate>0)
                {
                    //获取所有的老厂缓存区库存
                    stockInfos = BaseDal.QueryData(x => x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.WarehouseId==WarehouseEnum.LLDOldCache.ObjToInt());
                }
                List<Dt_StockInfo> stockInfosUp = new List<Dt_StockInfo>();
                List<Dt_StockInfo> stockInfosDel = new List<Dt_StockInfo>();
                foreach (var item in stockInfos)
                {
                    BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(item.PalletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>();
                    if (bSTResponse.Code == 500)
                    {
                        content.Message += $"条码{item.PalletCode}一期ERP库存不存在,";
                        continue;
                    }
                    BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{item.PalletCode}的库存信息");
                    if (item.StockLength != bSTStockInfoDTO.StockMeter && bSTStockInfoDTO.StockMeter>0)
                    {
                        item.MaterielThickness = bSTStockInfoDTO.Thick;
                        item.MaterielWeight = bSTStockInfoDTO.Qty;
                        item.MaterielWide = bSTStockInfoDTO.W;
                        item.Remark = $"{item.StockLength}-{bSTStockInfoDTO.StockMeter}";
                        item.StockLength = bSTStockInfoDTO.StockMeter;
                        stockInfosUp.Add(item);
                    }
                    else if(item.StockLength != bSTStockInfoDTO.StockMeter && bSTStockInfoDTO.StockMeter == 0)
                    {
                        stockInfosDel.Add(item);
                    }
                }
                //数据库操作
                _unitOfWorkManage.BeginTran();
                BaseDal.UpdateData(stockInfosUp);
                if (stockInfosDel.Count>0)
                {
                    BaseDal.DeleteAndMoveIntoHty(stockInfosDel, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                }
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        public List<Dt_StockInfo> GetUseableStocks(int materielId,decimal width, int warehoseId)
        {
@@ -181,5 +248,34 @@
            }
            return outStocks;
        }
        /// <summary>
        /// åˆ†é…è€åŽ‚åº“å­˜
        /// </summary>
        /// <returns></returns>
        public List<Dt_StockInfo> GetOutOldStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity)
        {
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            //获取库存可用数量
            decimal stockTotalQuantity = stockInfos.Sum(x => x.StockLength - x.StockOutLength);
            int index = 0;
            while (needQuantity > 0 && (index + 1 <= stockInfos.Count))
            {
                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++;
            }
            return outStocks;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/WIDESEA_StockService.csproj
@@ -7,6 +7,7 @@
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\WIDESEA_External\WIDESEA_External.csproj" />
    <ProjectReference Include="..\WIDESEA_IBasicRepository\WIDESEA_IBasicRepository.csproj" />
    <ProjectReference Include="..\WIDESEA_IOutboundRepository\WIDESEA_IOutboundRepository.csproj" />
    <ProjectReference Include="..\WIDESEA_IRecordRepository\WIDESEA_IRecordRepository.csproj" />
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -33,12 +33,16 @@
using WIDESEA_External.Model;
using System.Text.Json;
using System.Text.RegularExpressions;
using WIDESEA_Common.MaterielEnum;
using MailKit.Search;
namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        static object lock_out = new object();
        static object lock_autoIssue = new object();
        static object lock_manualIssue = new object();
        static object lock_returnIssue = new object();
        /// <summary>
        /// MES自动叫料接口
        /// </summary>
@@ -48,63 +52,66 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (autoIssueDTO == null)
                lock (lock_autoIssue)
                {
                    return content.Error("传入信息不能为空");
                    if (autoIssueDTO == null)
                    {
                        return content.Error("传入信息不能为空");
                    }
                    //获取对应单据
                    Dt_OutMESOrder? outMESOrder = _outboundRepository.OutMESOrderRepository.QueryFirst(x => x.OutDetailId == autoIssueDTO.OutDetailId);
                    if (outMESOrder == null)
                    {
                        return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{autoIssueDTO.OutDetailId}不存在");
                    }
                    if (outMESOrder.OutMESOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                    {
                        return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{outMESOrder.ProductOrderNo}工单已出库完成");
                    }
                    //获取周转位置编号
                    Dt_AGVStationInfo? stationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.MESPointCode == autoIssueDTO.PointCode);
                    if (stationInfo == null)
                    {
                        return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{autoIssueDTO.PointCode}不存在");
                    }
                    if (autoIssueDTO.IsEmptyPallet > 0)
                    {
                        return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{autoIssueDTO.PointCode}存在空托");
                    }
                    Dt_Task? task = BaseDal.QueryData(x => x.OrderNo == outMESOrder.OutMESOrderNo && x.TaskStatus == TaskStatusEnum.CallPending.ObjToInt()).OrderByDescending(x => x.Grade).ThenBy(x => x.TaskNum).FirstOrDefault();
                    //获取任务
                    if (task == null)
                    {
                        return content.Error($"未找到领料计划编号{outMESOrder.ProductOrderNo}可配送任务");
                    }
                    //获取任务出库详情
                    Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutStockLockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
                    //调用MES配送出发指令
                    PlanDistributionInfo planDistribution = new PlanDistributionInfo()
                    {
                        DispatchPlanMaterialId = autoIssueDTO.OutDetailId,
                        InvItemCode = task.MaterielCode,
                        Quantity = outStockLockInfo.AssignQuantity,
                        SendOutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        ArrivalTime = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd HH:mm:ss")
                    };
                    MESDispatchModel dispatchModel = new MESDispatchModel()
                    {
                        PRO_DispachPlanDistributionInfos = new List<PlanDistributionInfo>() { planDistribution }
                    };
                    _unitOfWorkManage.BeginTran();
                    task.TaskStatus = TaskStatusEnum.New.ObjToInt();
                    task.TargetAddress = autoIssueDTO.PointCode.StartsWith("YS") ? stationInfo.AGVStationCode : autoIssueDTO.PointCode;
                    BaseDal.UpdateData(task);
                    MESResponse mESResponse = _invokeMESService.MESDispatchUp(dispatchModel).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                    if (!mESResponse.Result)
                    {
                        throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(mESResponse.Msg)}");
                    }
                    _unitOfWorkManage.CommitTran();
                    PushTasksToWCS(new List<Dt_Task> { task });
                    return content.OK("叫料成功");
                }
                //获取对应单据
                Dt_OutMESOrder? outMESOrder = _outboundRepository.OutMESOrderRepository.QueryFirst(x=>x.OutDetailId==autoIssueDTO.OutDetailId);
                if (outMESOrder==null)
                {
                    return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{autoIssueDTO.OutDetailId}不存在");
                }
                if (outMESOrder.OutMESOrderStatus==OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{outMESOrder.ProductOrderNo}工单已出库完成");
                }
                //获取周转位置编号
                Dt_AGVStationInfo? stationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x=>x.MESPointCode==autoIssueDTO.PointCode);
                if (stationInfo == null)
                {
                    return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{autoIssueDTO.PointCode}不存在");
                }
                if (autoIssueDTO.IsEmptyPallet>0)
                {
                    return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{autoIssueDTO.PointCode}存在空托");
                }
                Dt_Task? task = BaseDal.QueryData(x => x.OrderNo == outMESOrder.OutMESOrderNo && x.TaskStatus == TaskStatusEnum.CallPending.ObjToInt()).OrderByDescending(x => x.Grade).ThenBy(x => x.TaskNum).FirstOrDefault();
                //获取任务
                if (task == null)
                {
                    return content.Error($"未找到领料计划编号{outMESOrder.ProductOrderNo}可配送任务");
                }
                //获取任务出库详情
                Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutStockLockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
                //调用MES配送出发指令
                PlanDistributionInfo planDistribution = new PlanDistributionInfo()
                {
                    DispatchPlanMaterialId = autoIssueDTO.OutDetailId,
                    InvItemCode = task.MaterielCode,
                    Quantity = outStockLockInfo.AssignQuantity,
                    SendOutTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
                    ArrivalTime = DateTime.Now.AddMinutes(10).ToString("yyyy-MM-dd hh:mm:ss")
                };
                MESDispatchModel dispatchModel= new MESDispatchModel()
                {
                    PRO_DispachPlanDistributionInfos=new List<PlanDistributionInfo> (){ planDistribution }
                };
                _unitOfWorkManage.BeginTran();
                task.TaskStatus = TaskStatusEnum.New.ObjToInt();
                task.TargetAddress = stationInfo.AGVStationCode;
                BaseDal.UpdateData(task);
                MESResponse mESResponse = _invokeMESService.MESDispatchUp(dispatchModel).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                if (!mESResponse.Result)
                {
                    throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(mESResponse.Msg)}");
                }
                PushTasksToWCS(new List<Dt_Task> { task });
                _unitOfWorkManage.CommitTran();
                return content.OK("叫料成功");
            }
            catch (Exception ex)
            {
@@ -126,59 +133,62 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (manualIssueDTO == null)
                lock (lock_manualIssue)
                {
                    return content.Error("传入信息不能为空");
                    if (manualIssueDTO == null)
                    {
                        return content.Error("传入信息不能为空");
                    }
                    //获取对应单据
                    Dt_OutMESOrder? outMESOrder = _outboundRepository.OutMESOrderRepository.QueryFirst(x => x.OutDetailId == manualIssueDTO.OutDetailId);
                    if (outMESOrder == null)
                    {
                        return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{manualIssueDTO.OutDetailId}不存在");
                    }
                    if (outMESOrder.OutMESOrderStatus == OutOrderStatusEnum.关闭.ObjToInt())
                    {
                        return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{outMESOrder.ProductOrderNo}工单已关闭");
                    }
                    //获取周转位置编号
                    Dt_AGVStationInfo? stationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.MESPointCode == manualIssueDTO.PointCode);
                    if (stationInfo == null)
                    {
                        return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{manualIssueDTO.PointCode}不存在");
                    }
                    Dt_Task? task = BaseDal.QueryData(x => x.OrderNo == outMESOrder.OutMESOrderNo && x.TaskStatus == TaskStatusEnum.CallPending.ObjToInt()).OrderByDescending(x => x.Grade).ThenBy(x => x.TaskNum).FirstOrDefault();
                    //获取任务
                    if (task == null)
                    {
                        return content.Error($"未找到领料计划编号{outMESOrder.ProductOrderNo}可配送任务");
                    }
                    //获取任务出库详情
                    Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutStockLockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
                    //调用MES配送出发指令
                    PlanDistributionInfo planDistribution = new PlanDistributionInfo()
                    {
                        DispatchPlanMaterialId = manualIssueDTO.OutDetailId,
                        InvItemCode = task.MaterielCode,
                        Quantity = outStockLockInfo.AssignQuantity,
                        SendOutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        ArrivalTime = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd HH:mm:ss")
                    };
                    MESDispatchModel dispatchModel = new MESDispatchModel()
                    {
                        PRO_DispachPlanDistributionInfos = new List<PlanDistributionInfo>() { planDistribution }
                    };
                    _unitOfWorkManage.BeginTran();
                    task.TaskStatus = TaskStatusEnum.New.ObjToInt();
                    task.TargetAddress = manualIssueDTO.PointCode.StartsWith("YS") ? stationInfo.AGVStationCode : manualIssueDTO.PointCode;
                    BaseDal.UpdateData(task);
                    MESResponse mESResponse = _invokeMESService.MESDispatchUp(dispatchModel).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                    if (!mESResponse.Result)
                    {
                        throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(mESResponse.Msg)}");
                    }
                    _unitOfWorkManage.CommitTran();
                    PushTasksToWCS(new List<Dt_Task> { task });
                    return content.OK("叫料成功");
                }
                //获取对应单据
                Dt_OutMESOrder? outMESOrder = _outboundRepository.OutMESOrderRepository.QueryFirst(x => x.OutDetailId == manualIssueDTO.OutDetailId);
                if (outMESOrder == null)
                {
                    return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{manualIssueDTO.OutDetailId}不存在");
                }
                if (outMESOrder.OutMESOrderStatus == OutOrderStatusEnum.关闭.ObjToInt())
                {
                    return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{outMESOrder.ProductOrderNo}工单已关闭");
                }
                //获取周转位置编号
                Dt_AGVStationInfo? stationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.MESPointCode == manualIssueDTO.PointCode);
                if (stationInfo == null)
                {
                    return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{manualIssueDTO.PointCode}不存在");
                }
                Dt_Task? task = BaseDal.QueryData(x => x.OrderNo == outMESOrder.OutMESOrderNo && x.TaskStatus == TaskStatusEnum.CallPending.ObjToInt()).OrderByDescending(x => x.Grade).ThenBy(x => x.TaskNum).FirstOrDefault();
                //获取任务
                if (task == null)
                {
                    return content.Error($"未找到领料计划编号{outMESOrder.ProductOrderNo}可配送任务");
                }
                //获取任务出库详情
                Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutStockLockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
                //调用MES配送出发指令
                PlanDistributionInfo planDistribution = new PlanDistributionInfo()
                {
                    DispatchPlanMaterialId = manualIssueDTO.OutDetailId,
                    InvItemCode = task.MaterielCode,
                    Quantity = outStockLockInfo.AssignQuantity,
                    SendOutTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
                    ArrivalTime = DateTime.Now.AddMinutes(10).ToString("yyyy-MM-dd hh:mm:ss")
                };
                MESDispatchModel dispatchModel = new MESDispatchModel()
                {
                    PRO_DispachPlanDistributionInfos = new List<PlanDistributionInfo>() { planDistribution }
                };
                _unitOfWorkManage.BeginTran();
                task.TaskStatus = TaskStatusEnum.New.ObjToInt();
                task.TargetAddress = stationInfo.AGVStationCode;
                BaseDal.UpdateData(task);
                MESResponse mESResponse = _invokeMESService.MESDispatchUp(dispatchModel).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                if (!mESResponse.Result)
                {
                    throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(mESResponse.Msg)}");
                }
                PushTasksToWCS(new List<Dt_Task> { task });
                _unitOfWorkManage.CommitTran();
                return content.OK("叫料成功");
            }
            catch (Exception ex)
            {
@@ -186,31 +196,138 @@
            }
            return content;
        }
        /// <summary>
        /// MES空托/余料呼叫接口
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ReceiveReturnIssue(List<MESReturnIssueDTO> returnIssueDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (returnIssueDTOs==null || returnIssueDTOs.Count<=0)
                lock (lock_returnIssue)
                {
                    return content.Error("传入信息不能为空");
                    if (returnIssueDTOs == null || returnIssueDTOs.Count <= 0)
                    {
                        return content.Error("传入信息不能为空");
                    }
                    //获取所有AGV点位
                    List<Dt_AGVStationInfo> aGVStationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
                    MESReturnIssueDTO? returnIssueDTO = returnIssueDTOs.FirstOrDefault(x => !aGVStationInfos.Select(x => x.MESPointCode).Contains(x.PointCode));
                    if (returnIssueDTO != null)
                    {
                        return content.Error($"周转位{nameof(MESReturnIssueDTO.PointCode)}{returnIssueDTO.PointCode}不存在");
                    }
                    //获取所有库存
                    List<Dt_StockInfo> stockInfosOld = _stockRepository.StockInfoRepository.QueryData();
                    ////空托
                    //foreach (var item in returnIssueDTOs.Where(x=>x.ReturnMaterial==null))
                    //{
                    //}
                    //退料
                    List<Dt_StockInfo> stockInfos=new List<Dt_StockInfo>();
                    List<Dt_Task> tasksNew = new List<Dt_Task>();
                    foreach (var item in returnIssueDTOs.Where(x => x.ReturnMaterial != null))
                    {
                        MESReturnMaterial? returnMaterial = item.ReturnMaterial;
                        if (returnMaterial.BarCode.IsNullOrEmpty())
                        {
                            return content.Error($"退料传入条码不能为空");
                        }
                        Dt_AGVStationInfo aGVStationInfo = aGVStationInfos.FirstOrDefault(x => x.MESPointCode == item.PointCode);
                        Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == returnMaterial.MaterialCode);
                        if (materielInfo == null)
                        {
                            return content.Error($"未找到条码{returnMaterial.BarCode}物料信息");
                        }
                        //判断
                        if (returnMaterial.Thickness <= 0 && materielInfo.WarehouseId==WarehouseEnum.LLDYL.ObjToInt())
                        {
                            return content.Error($"物料{returnMaterial.MaterialCode}条码{returnMaterial.BarCode}直径不能小于0");
                        }
                        if (returnMaterial.Wide <= 0 && materielInfo.WarehouseId == WarehouseEnum.LLDYL.ObjToInt())
                        {
                            return content.Error($"物料{returnMaterial.MaterialCode}条码{returnMaterial.BarCode}直径不能小于0");
                        }
                        Dt_StockInfo? stockInfoOld = stockInfosOld.FirstOrDefault(x => x.PalletCode == returnMaterial.BarCode);
                        if (stockInfoOld != null)
                        {
                            return content.Error($"条码{returnMaterial.BarCode}信息已存在");
                        }
                        //生成库存组盘信息
                        Dt_StockInfo stockInfo = new Dt_StockInfo()
                        {
                            MaterielInvOrgId = materielInfo.MaterielInvOrgId,
                            PalletCode = returnMaterial.BarCode,
                            LocationCode = "",
                            PalletType = 1,
                            WarehouseId = materielInfo.WarehouseId,
                            StockAttribute = materielInfo.MaterielSourceType,
                            StockStatus = StockStatusEmun.MES余料退库.ObjToInt(),
                            MaterielSpec = materielInfo.MaterielSpec,
                            BatchNo = returnMaterial.MaterialLot,
                            Unit = materielInfo.MaterielUnit,
                            MaterielThickness = returnMaterial.Thickness,
                            MaterielWide = returnMaterial.Wide,
                            MaterielWeight = returnMaterial.Weight,
                            MaterielCode = materielInfo.MaterielCode,
                            StockLength = returnMaterial.ReturnQuantity,
                            OrderNo = returnMaterial.ReturnOrderNo,
                            MaterielName = materielInfo.MaterielName,
                            IsFull = WhetherEnum.True.ObjToInt(),
                            IsPick = returnMaterial.Whether == 0 ? WhetherEnum.True.ObjToInt() : WhetherEnum.False.ObjToInt(),
                            Remark = StockStatusEmun.MES余料退库.ToString()
                        };
                        if (stockInfo.MaterielWide > 1200)
                        {
                            stockInfo.PalletType = 2;
                        }
                        stockInfos.Add(stockInfo);
                        //生成余料退料任务
                        Dt_Task newTask = new Dt_Task()
                        {
                            CurrentAddress = item.PointCode.StartsWith("YS") ? aGVStationInfo.AGVStationCode : item.PointCode,
                            Grade = 0,
                            NextAddress = "",
                            PalletCode = stockInfo.PalletCode,
                            Roadway = "",
                            SourceAddress = item.PointCode.StartsWith("YS") ? aGVStationInfo.AGVStationCode : item.PointCode,
                            TargetAddress = "",
                            TaskStatus = TaskStatusEnum.New.ObjToInt(),
                            WarehouseId = materielInfo.WarehouseId,
                            PalletType = stockInfo.PalletType,
                            MaterielCode=stockInfo.MaterielCode,
                            Quantity=stockInfo.StockLength,
                            OrderNo=stockInfo.OrderNo,
                            TaskLength = (int)stockInfo.MaterielWide,
                            GroupId= item.IssueId,
                            WorkCentreCode=item.MakeCode
                        };
                        TaskTypeEnum taskTypeEnum = aGVStationInfo.StationArea switch
                        {
                            nameof(StationAreaEnum.一楼印刷) => TaskTypeEnum.PrintYLBackInbound,
                            _ => throw new Exception("未找到对应任务")
                        };
                        newTask.TaskType = taskTypeEnum.ObjToInt();
                        tasksNew.Add(newTask);
                    }
                    _unitOfWorkManage.BeginTran();
                    BaseDal.AddData(tasksNew);
                    _stockRepository.StockInfoRepository.AddData(stockInfos);
                    _unitOfWorkManage.CommitTran();
                    //推送任务
                    PushTasksToWCS(tasksNew);
                    content.OK("呼叫成功");
                }
                //获取所有AGV点位
                List<Dt_AGVStationInfo> aGVStationInfos= _basicRepository.AGVStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
                MESReturnIssueDTO? returnIssueDTO = returnIssueDTOs.FirstOrDefault(x=> !aGVStationInfos.Select(x=>x.MESPointCode).Contains(x.PointCode));
                if (returnIssueDTO != null)
                {
                    return content.Error($"周转位{nameof(MESReturnIssueDTO.PointCode)}{returnIssueDTO.PointCode}不存在");
                }
                content.OK("呼叫成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -164,7 +164,9 @@
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType,
                    TaskLength = (int)stockInfo.MaterielWide
                    TaskLength = (int)stockInfo.MaterielWide,
                    MaterielCode=stockInfo.MaterielCode,
                    Quantity=stockInfo.StockLength
                };
                //更新状态
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
@@ -213,22 +215,25 @@
                    }
                    else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.出库完成.ObjToInt() && stockInfoOld.IsPick==WhetherEnum.False.ObjToInt() && stationCode.IsNotEmptyOrNull())
                    {
                        stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
                        stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
                        stockInfoOld.StockOutLength = 0;
                        stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
                        decimal oldQty = stockInfoOld.StockLength;
                        //调用更新退料库存
                        stockInfoOld = ReturnStockUp(stockInfoOld, thickness);
                        //更新数据
                        UpdateStock(stockInfoOld, weight, thickness, wide);
                        return content.OK($"老厂未领料退库{stockInfoOld.RfidCode}");
                        //记录库存变动
                        _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoOld, oldQty, oldQty < stockInfoOld.StockLength ? stockInfoOld.StockLength - oldQty : oldQty - stockInfoOld.StockLength, StockChangeTypeEnum.MaterielGroup);
                        return content.OK($"老厂未领料退库RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}");
                    }
                    else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.老厂退料暂存.ObjToInt() && stationCode.IsNotEmptyOrNull())
                    {
                        stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
                        stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
                        stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
                        stockInfoOld.StockOutLength = 0;
                        stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
                        decimal oldQty = stockInfoOld.StockLength;
                        //调用更新退料库存
                        stockInfoOld = ReturnStockUp(stockInfoOld, thickness);
                        //更新数据
                        UpdateStock(stockInfoOld, weight, thickness, wide);
                        return content.OK($"老厂领料退库{stockInfoOld.RfidCode}");
                        //记录库存变动
                        _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoOld, oldQty, oldQty < stockInfoOld.StockLength ? stockInfoOld.StockLength- oldQty: oldQty- stockInfoOld.StockLength, StockChangeTypeEnum.MaterielGroup);
                        return content.OK($"老厂领料退库RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}");
                    }
                    else if (stockInfoOld != null)
                    {
@@ -263,7 +268,7 @@
                                    UpdateStock(ExistStockInfo, weight, thickness, wide);
                                    _inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
                                    _unitOfWorkManage.CommitTran();
                                    return content.OK($"采购入库{ExistStockInfo.RfidCode}");
                                    return content.OK($"采购入库RFID{ExistStockInfo.RfidCode}绑定{ExistStockInfo.PalletCode}");
                                }
                                else
                                {
@@ -339,6 +344,37 @@
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æ›´æ–°é€€æ–™åº“å­˜
        /// </summary>
        /// <returns></returns>
        public Dt_StockInfo ReturnStockUp(Dt_StockInfo stockInfoOld,decimal thickness)
        {
            BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(stockInfoOld.PalletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>();
            if (bSTResponse.Code == 500)
            {
                throw new Exception($"未找到条码{stockInfoOld.PalletCode}一期ERP库存不存在");
            }
            BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{stockInfoOld.PalletCode}的库存信息");
            if (stockInfoOld.StockStatus == StockStatusEmun.老厂退料暂存.ObjToInt())
            {
                stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
            }
            stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
            stockInfoOld.MaterielThickness = bSTStockInfoDTO.Thick;
            stockInfoOld.MaterielWeight = bSTStockInfoDTO.Qty;
            stockInfoOld.MaterielWide = bSTStockInfoDTO.W;
            stockInfoOld.StockLength = bSTStockInfoDTO.StockMeter;
            stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
            stockInfoOld.StockOutLength = 0;
            stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
            if (thickness < 800)
            {
                throw new Exception($"RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}直径小于800mm");
            }
            return stockInfoOld;
        }
        public void UpdateStock(Dt_StockInfo stockInfo, decimal weight = 0, decimal thickness = 0, decimal wide = 0)
        {
@@ -453,6 +489,7 @@
                        }
                        _unitOfWorkManage.CommitTran();
                        Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                        //记录库存变动
                        _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
                        return content.OK("成功", yLInboundCache);
                    }
@@ -524,6 +561,7 @@
                            }
                            _unitOfWorkManage.CommitTran();
                            Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                            //记录库存变动
                            _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
                            return content.OK("成功", yLInboundCache);
                        }
@@ -601,6 +639,7 @@
                            }
                            _unitOfWorkManage.CommitTran();
                            Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                            //记录库存变动
                            _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
                            return content.OK("成功", yLInboundCache);
                        }
@@ -671,7 +710,7 @@
                    if (stockInfo.MaterielThickness >= 300 && stockInfo.MaterielThickness <= 1300 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2700)
                    {
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YLDual") && (stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt() ? x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt(): x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YLDual") && (stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt() ? x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt(): x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).OrderBy(x => x.RoadwayNo).ToList();
                        roadwayNo = HandleRoadway(locationCounts, warehouse);
                    }
@@ -679,7 +718,7 @@
                else
                {
                    //限制
                    if (stockInfo.MaterielThickness >= 800 && stockInfo.MaterielThickness <= 1500 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2500)
                    if ((stockInfo.MaterielThickness >= 800 || (stockInfo.CheckThickness >= 800 && stockInfo.StockStatus==StockStatusEmun.老厂退库.ObjToInt())) && stockInfo.MaterielThickness <= 1500 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2500)
                    {
                        bool LayerLimit = false;
                        if (stockInfo.MaterielThickness>1300)
@@ -687,10 +726,10 @@
                            LayerLimit = true;
                        }
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() &&  x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YL") && !x.RoadwayNo.Contains("YLDual") && (LayerLimit ? x.Columns>=56 : x.Columns<=55)).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() &&  x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YL") && !x.RoadwayNo.Contains("YLDual") && (LayerLimit ? x.Columns>=56 : x.Columns<=55)).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).OrderBy(x => x.RoadwayNo).ToList();
                        if (stockInfo.MaterielWide > 2200)
                        {
                            locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo == "SC02_YL" && (LayerLimit ? x.Columns >= 56 : x.Columns <= 55)).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                            locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo == "SC02_YL" && (LayerLimit ? x.Columns >= 56 : x.Columns <= 55)).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).OrderBy(x => x.RoadwayNo).ToList();
                        }
                        roadwayNo = HandleRoadway(locationCounts, warehouse);
@@ -778,7 +817,7 @@
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
                        _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(proStockInfo, 0, proStockInfo.proStockInfoDetails.Sum(x => x.StockQty), StockChangeTypeEnum.MaterielGroup);
                        _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(proStockInfo, 0, proStockInfo.proStockInfoDetails.Sum(x => x.StockQty), StockChangeTypeEnum.Inbound);
                    }
                    else
                    {
@@ -816,8 +855,11 @@
                    _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.自动完成);
                    _unitOfWorkManage.CommitTran();
                    //记录库存变动
                    _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.StockLength, 0, StockChangeTypeEnum.Inbound,taskNum:task.TaskNum);
                    //上报老厂ERP
                    if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && task.TaskType==TaskTypeEnum.Inbound.ObjToInt())
                    if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
                    {
                        int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
                        BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
@@ -828,16 +870,10 @@
                            RfidUpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                        };
                        BSTResponse<object> bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse<object>>();
                        if (bSTResponse.Code == 500)
                        {
                            throw new Exception($"BST一期ERP同步入库信息失败,错误信息:{bSTResponse.Msg}");
                        }
                        content.Message = bSTResponse.Msg;
                        content.Message = bSTResponse?.Msg;
                    }
                    _unitOfWorkManage.CommitTran();
                    _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.StockLength, 0, StockChangeTypeEnum.Inbound,taskNum:task.TaskNum);
                }
                return content.OK();
                content.OK();
            }
            catch (Exception ex)
            {
@@ -1137,97 +1173,208 @@
            WebResponseContent content=new WebResponseContent();
            try
            {
                //获取主单
                Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderType == orderType).Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == bindCode)).First();
                if (inboundOrder == null)
                InOrderTypeEnum inOrderTypeEnum = (InOrderTypeEnum)orderType;
                if (inOrderTypeEnum == InOrderTypeEnum.InventoryIn)
                {
                    throw new Exception($"未找到条码{bindCode}入库单据信息");
                }
                Dt_InboundOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == bindCode);
                if (inboundOrderDetail == null)
                {
                    throw new Exception($"未找到入库单号为{inboundOrder.UpperOrderNo}条码{bindCode}单据信息");
                }
                if (inboundOrderDetail.OrderDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
                {
                    throw new Exception($"条码{bindCode}信息已入库或入库中");
                }
                Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == startPoint);
                if (agvstation == null)
                {
                    return content.Error($"起点错误{startPoint}");
                }
                //判断当前点位是否重复
                Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_Executing.ObjToInt()));
                if (taskOldPoint != null)
                {
                    return content.Error($"站点{startPoint}已存在任务");
                }
                Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
                if (taskOld != null)
                {
                    return content.Error($"托盘{barCode}任务已存在");
                }
                Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
                if (proStockInfoOld != null)
                {
                    return content.Error($"托盘{barCode}已存在");
                }
                //分配巷道
                string roadWay = AssignCPRoadwayNo();
                //获取物料
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x =>x.WarehouseId==inboundOrder.WarehouseId && x.MaterielCode == inboundOrderDetail.MaterialCode);
                Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                {
                    ProductCode = materielInfo.MaterielCode,
                    ProductNo=bindCode,
                    ProductName = materielInfo.MaterielName,
                    ProductSpec = materielInfo.MaterielSpec,
                    LotNumber = inboundOrderDetail.MaterialLot,
                    ProductUnit = materielInfo.MaterielUnit,
                    StockQty = inboundOrderDetail.OrderQuantity,
                    ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt()
                };
                Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                {
                    PalletCode = barCode,
                    ProStockAttribute = materielInfo.MaterielSourceType,
                    PalletType = 1,
                    LocationCode = "",
                    WarehouseId = materielInfo.WarehouseId,
                    StockStatus = StockStatusEmun.入库确认.ObjToInt(),
                    proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
                };
                    //获取主单
                    Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == bindCode)).First();
                Dt_Task newTask = new Dt_Task()
                {
                    CurrentAddress = startPoint,
                    Grade = 0,
                    NextAddress = "",
                    PalletCode = barCode,
                    Roadway = roadWay,
                    SourceAddress = startPoint,
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = inboundOrder.WarehouseId,
                    PalletType = 1,
                    Remark="初期入库"
                };
                inboundOrderDetail.OrderDetailStatus=InOrderStatusEnum.入库中.ObjToInt();
                _unitOfWorkManage.BeginTran();
                if (inboundOrder.InboundOrderStatus==InOrderStatusEnum.未开始.ObjToInt())
                {
                    inboundOrder.InboundOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                    _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                    if (inboundOrder == null)
                    {
                        throw new Exception($"未找到条码{bindCode}入库单据信息");
                    }
                    Dt_InboundOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == bindCode);
                    if (inboundOrderDetail == null)
                    {
                        throw new Exception($"未找到入库单号为{inboundOrder.UpperOrderNo}条码{bindCode}单据信息");
                    }
                    if (inboundOrderDetail.OrderDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
                    {
                        throw new Exception($"条码{bindCode}信息已入库或入库中");
                    }
                    Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == startPoint);
                    if (agvstation == null)
                    {
                        return content.Error($"起点错误{startPoint}");
                    }
                    //判断当前点位是否重复
                    Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_Executing.ObjToInt()));
                    if (taskOldPoint != null)
                    {
                        return content.Error($"站点{startPoint}已存在任务");
                    }
                    Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
                    if (taskOld != null)
                    {
                        return content.Error($"托盘{barCode}任务已存在");
                    }
                    Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
                    if (proStockInfoOld != null)
                    {
                        return content.Error($"托盘{barCode}已存在");
                    }
                    //分配巷道
                    string roadWay = AssignCPRoadwayNo();
                    //获取物料
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId && x.MaterielCode == inboundOrderDetail.MaterialCode);
                    Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                    {
                        ProductCode = materielInfo.MaterielCode,
                        ProductNo = bindCode,
                        ProductName = materielInfo.MaterielName,
                        ProductSpec = materielInfo.MaterielSpec,
                        LotNumber = inboundOrderDetail.MaterialLot,
                        ProductUnit = materielInfo.MaterielUnit,
                        StockQty = inboundOrderDetail.OrderQuantity,
                        ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt()
                    };
                    Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                    {
                        PalletCode = barCode,
                        ProInOrderNo = inboundOrder.UpperOrderNo,
                        ProStockAttribute = materielInfo.MaterielSourceType,
                        PalletType = 1,
                        LocationCode = "",
                        WarehouseId = materielInfo.WarehouseId,
                        StockStatus = StockStatusEmun.入库确认.ObjToInt(),
                        proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
                    };
                    //生成任务
                    Dt_Task newTask = new Dt_Task()
                    {
                        CurrentAddress = startPoint,
                        Grade = 0,
                        NextAddress = "",
                        PalletCode = barCode,
                        Roadway = roadWay,
                        SourceAddress = startPoint,
                        TargetAddress = "",
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = inboundOrder.WarehouseId,
                        OrderNo = inboundOrder.UpperOrderNo,
                        MaterielCode = inboundOrderDetail.MaterialCode,
                        Quantity = inboundOrderDetail.OrderQuantity,
                        PalletType = 1
                    };
                    inboundOrderDetail.OrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    if (inboundOrder.InboundOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                    {
                        inboundOrder.InboundOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                        _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                    }
                    _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                    int taskId = BaseDal.AddData(newTask);
                    BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
                    newTask.TaskId = taskId;
                    _unitOfWorkManage.CommitTran();
                    //推送任务
                    PushTasksToWCS(new List<Dt_Task> { newTask }, "AGV");
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                int taskId = BaseDal.AddData(newTask);
                BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
                newTask.TaskId = taskId;
                _unitOfWorkManage.CommitTran();
                //推送任务
                PushTasksToWCS(new List<Dt_Task> { newTask }, "AGV");
                else if (inOrderTypeEnum == InOrderTypeEnum.PurchaseIn)
                {
                    //获取主单
                    Dt_PurchaseOrder inboundOrder = BaseDal.Db.Queryable<Dt_PurchaseOrder>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == bindCode)).First();
                    if (inboundOrder == null)
                    {
                        throw new Exception($"未找到条码{bindCode}采购入库单据信息");
                    }
                    Dt_PurchaseOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == bindCode);
                    if (inboundOrderDetail == null)
                    {
                        throw new Exception($"未找到入库单号为{inboundOrder.PurchaseOrderNo}条码{bindCode}单据信息");
                    }
                    if (inboundOrderDetail.PurchaseDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
                    {
                        throw new Exception($"条码{bindCode}信息已入库或入库中");
                    }
                    Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == startPoint);
                    if (agvstation == null)
                    {
                        return content.Error($"起点错误{startPoint}");
                    }
                    //判断当前点位是否重复
                    Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_Executing.ObjToInt()));
                    if (taskOldPoint != null)
                    {
                        return content.Error($"站点{startPoint}已存在任务");
                    }
                    Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
                    if (taskOld != null)
                    {
                        return content.Error($"托盘{barCode}任务已存在");
                    }
                    Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
                    if (proStockInfoOld != null)
                    {
                        return content.Error($"托盘{barCode}已存在");
                    }
                    //分配巷道
                    string roadWay = AssignCPRoadwayNo();
                    //获取物料
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId && x.MaterielCode == inboundOrderDetail.MaterialCode);
                    Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                    {
                        ProductCode = materielInfo.MaterielCode,
                        ProductNo = bindCode,
                        ProductName = materielInfo.MaterielName,
                        ProductSpec = materielInfo.MaterielSpec,
                        LotNumber = inboundOrderDetail.MaterialLot,
                        ProductUnit = materielInfo.MaterielUnit,
                        StockQty = inboundOrderDetail.PurchaseDetailQuantity,
                        ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt()
                    };
                    Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                    {
                        PalletCode = barCode,
                        ProInOrderNo = inboundOrder.PurchaseOrderNo,
                        ProStockAttribute = materielInfo.MaterielSourceType,
                        PalletType = 1,
                        LocationCode = "",
                        WarehouseId = materielInfo.WarehouseId,
                        StockStatus = StockStatusEmun.入库确认.ObjToInt(),
                        proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
                    };
                    //生成任务
                    Dt_Task newTask = new Dt_Task()
                    {
                        CurrentAddress = startPoint,
                        Grade = 0,
                        NextAddress = "",
                        PalletCode = barCode,
                        Roadway = roadWay,
                        SourceAddress = startPoint,
                        TargetAddress = "",
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = inboundOrder.WarehouseId,
                        OrderNo = inboundOrder.PurchaseOrderNo,
                        MaterielCode=inboundOrderDetail.MaterialCode,
                        Quantity=inboundOrderDetail.PurchaseDetailQuantity,
                        PalletType = 1
                    };
                    inboundOrderDetail.PurchaseDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    if (inboundOrder.PurchaseOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                    {
                        inboundOrder.PurchaseOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                        _inboundRepository.PurchaseOrderRepository.UpdateData(inboundOrder);
                    }
                    _inboundRepository.PurchaseOrderDetailRepository.UpdateData(inboundOrderDetail);
                    int taskId = BaseDal.AddData(newTask);
                    BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
                    newTask.TaskId = taskId;
                    _unitOfWorkManage.CommitTran();
                    //推送任务
                    PushTasksToWCS(new List<Dt_Task> { newTask }, "AGV");
                }
                else
                {
                    return content.Error($"未找到对应单据类型");
                }
                content.OK("发送成功");
            }
@@ -1458,6 +1605,10 @@
                            return content.Error($"周转位{nameof(MESReturnIssueDTO.PointCode)}{item?.PointCode}不存在,仅成品物料可不传");
                        }
                    }
                    if (materielInfo.MaterielSourceType == MaterielTypeEnum.成品.ObjToInt() && (item.Length <= 0 || item.Width <= 0 || item.Height<=0))
                    {
                        return content.Error($"箱码{item.ProPackCode},长度/宽度/高度不能为0");
                    }
                    Dt_MESProInOrderInfo AddproInOrderInfo = _mapper.Map<Dt_MESProInOrderInfo>(item);
                    AddproInOrderInfo.WarehouseId = materielInfo.WarehouseId;
                    AddproInOrderInfo.MESProOrderType = materielInfo.MaterielSourceType;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -25,6 +25,7 @@
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Outbound;
using Microsoft.IdentityModel.Tokens;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
namespace WIDESEA_TaskInfoService
{
@@ -137,13 +138,13 @@
                        task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                        _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo,App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo,App.User.UserId > 0 ? OperateTypeEnum.人工完成 : 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.自动完成);
                            _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfo.proStockInfoDetails, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : 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.自动完成);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
                    }
                    else
@@ -180,7 +181,7 @@
                        else
                        {
                            stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                            _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                            _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                        }
                        if (outStockLockInfos!=null && outStockLockInfos.Count>0)
                        {
@@ -189,9 +190,25 @@
                                x.Status=OutLockStockStatusEnum.出库完成.ObjToInt();
                            });
                            _outboundRepository.OutStockLockInfoRepository.UpdateData(outStockLockInfos);
                            List<Dt_OutStockLockInfo> outStockLockInfosSG = outStockLockInfos.Where(x => x.OrderType == OutOrderTypeEnum.OutSGPick.ObjToInt()).ToList();
                            List<Dt_OutStockLockInfo> outStockLockInfosMES = outStockLockInfos.Where(x => x.OrderType == OutOrderTypeEnum.OutMESPick.ObjToInt()).ToList();
                            if (outStockLockInfosSG !=null && outStockLockInfosSG.Count()>0)
                            {
                                _outboundService.OutLineViewService.SaveLineView(outStockLockInfosSG);
                            }
                            if (outStockLockInfosMES != null && outStockLockInfosMES.Count() > 0)
                            {
                                Dt_AGVStationInfo aGVStationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x=>x.AGVStationCode==task.TargetAddress);
                                MESDeliveryModel mESDeliveryModel = MESDeliveryUp(outStockLockInfosMES, aGVStationInfo.MESPointCode);
                                MESResponse response = _invokeMESService.MESDelivery(mESDeliveryModel).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                                if (!response.Result)
                                {
                                    throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(response.Msg)}");
                                }
                            }
                        }
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
                    }
                    else
@@ -206,6 +223,34 @@
                _unitOfWorkManage.RollbackTran();
                return content.Error(ex.Message);
            }
        }
        /// <summary>
        /// é…é€é€è¾¾ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        public MESDeliveryModel MESDeliveryUp(List<Dt_OutStockLockInfo> outStockLockInfos,string address)
        {
            MESDeliveryModel mESDeliveryModel = new MESDeliveryModel()
            {
                PRO_DispatchPlanMaterialsInfoNew= new List<MESDeliveryInfo>()
            };
            foreach (var item in outStockLockInfos)
            {
                MESDeliveryInfo mESDeliveryInfo = new MESDeliveryInfo()
                {
                    InvItemCode=item.MaterielCode,
                    DispatchPlanMaterialId=item.OrderDetailId,
                    UnitCode=item.Unit,
                    GradeCode="001",
                    MainQuantity=item.AssignQuantity,
                    AssistUnitCode=item.AssistUnit,
                    LocationCode= address,
                    LotNumber=item.BatchNo,
                    MaterialBarCode=item.PalletCode
                };
                mESDeliveryModel.PRO_DispatchPlanMaterialsInfoNew.Add(mESDeliveryInfo);
            }
            return mESDeliveryModel;
        }
        /// <summary>
        /// åº“存数据转出库任务(原料/半成品)
@@ -257,7 +302,7 @@
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <returns></returns>
        public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos,List<Dt_OutStockLockInfo> outStockLockInfos, TaskTypeEnum taskType)
        public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos,List<Dt_OutStockLockInfo> outStockLockInfos, TaskTypeEnum taskType=new TaskTypeEnum())
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            for (int i = 0; i < stockInfos.Count; i++)
@@ -293,7 +338,9 @@
                            MaterielCode = stockInfo.MaterielCode,
                            RfidCode = stockInfo.RfidCode,
                            Quantity = stockInfo.StockLength,
                            OrderNo= outStockLockInfo.OrderNo
                            OrderNo= outStockLockInfo.OrderNo,
                            DispatchPlanId=outStockLockInfo.OrderDetailId,
                            WorkCentreCode=outStockLockInfo.MakeCode
                        };
                        if (stockInfo.MaterielWide > 0)
                        {
@@ -620,10 +667,12 @@
            {
                //获取任务
                tasks = GetTasks(result.Item1, TaskTypeEnum.OldYLOutbound);
                result.Item2.ForEach(x =>
                {
                    x.OutSGOrderDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                    if (result.Item3.FirstOrDefault(t=>t.OrderDetailId==x.Id)!=null)
                    {
                        x.OutSGOrderDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                    }
                });
                result.Item3.ForEach(x =>
                {
@@ -656,7 +705,7 @@
                {
                    tasks.ForEach(x =>
                    {
                        string orderNos = string.Join(",", outStockLockInfos.Where(x => x.PalletCode == x.PalletCode).Select(x => x.OrderNo).Distinct());
                        string orderNos = string.Join(",", outStockLockInfos.Where(t => t.PalletCode == x.PalletCode).Select(x => x.OrderNo).Distinct());
                        x.OrderNo = orderNos;
                    });
                }
@@ -667,11 +716,7 @@
                    {
                        x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    });
                    outboundOrderDetails.ForEach(x =>
                    {
                        x.OutSGOrderDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                    });
                    List<Dt_OutSGOrder> outSGOrders = _outboundRepository.OutSGOrderRepository.QueryData(x => outboundOrderDetails.Select(x=>x.OutSGOrderId).Distinct().Contains(x.Id));
                    List<Dt_OutSGOrder> outSGOrders = _outboundRepository.OutSGOrderRepository.QueryData(x => outStockLockInfos.Select(x=>x.OrderNo).Distinct().Contains(x.OrderId));
                    if (outSGOrders.Count<=0)
                    {
                        throw new Exception("未找到单据信息");
@@ -704,16 +749,79 @@
        /// </summary>
        /// <param name="bSTPickInfoDTO"></param>
        /// <returns></returns>
        public WebResponseContent ReceivePicking(BSTPickInfoDTO bSTPickInfoDTO)
        public WebResponseContent ReceivePicking(List<BSTPickInfoDTO> bSTPickInfoDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //新增
                List<BSTPickInfoDTO> bSTPickInfosAdd = bSTPickInfoDTOs.Where(x => x.Way == 1).ToList();
                //获取新增明细领料
                List<PaperMattakeDetailItem>? paperMattakeDetailItemsAdd = null;
                //修改
                List<BSTPickInfoDTO> bSTPickInfosUp = bSTPickInfoDTOs.Where(x => x.Way == 2).ToList();
                //获取新增明细领料
                List<PaperMattakeDetailItem>? paperMattakeDetailItemsUp = null;
                if (bSTPickInfosAdd != null && bSTPickInfosAdd.Count > 0)
                {
                    paperMattakeDetailItemsAdd = bSTPickInfosAdd.SelectMany(x => x.PaperMattakeDetails).ToList();
                }
                if (bSTPickInfosUp != null && bSTPickInfosUp.Count > 0)
                {
                    paperMattakeDetailItemsUp = bSTPickInfosUp.SelectMany(x => x.PaperMattakeDetails).ToList();
                }
                //获取所有待领料的出库详情
                List<Dt_OutStockLockInfo> outStockLockInfos = _outboundRepository.OutStockLockInfoRepository.QueryData(x=>x.OrderType==OutOrderTypeEnum.OutSGPick.ObjToInt());
                List<Dt_OutStockLockInfo> outStockLockInfos = _outboundRepository.OutStockLockInfoRepository.QueryData(x => x.OrderType == OutOrderTypeEnum.OutSGPick.ObjToInt() && x.Status==OutLockStockStatusEnum.出库完成.ObjToInt());
                #region é¢†æ–™é€»è¾‘
                if (paperMattakeDetailItemsAdd != null && paperMattakeDetailItemsAdd.Count > 0)
                {
                    foreach (var item in paperMattakeDetailItemsAdd)
                    {
                        //获取对应的
                    }
                }
                if (paperMattakeDetailItemsUp != null && paperMattakeDetailItemsUp.Count > 0)
                {
                    foreach (var item in paperMattakeDetailItemsUp)
                    {
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åˆ›å»ºç”Ÿç®¡æ‰‹åŠ¨å‡ºåº“
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public WebResponseContent CreateSGManualTasks(List<int> ids)
        {
            WebResponseContent content=new WebResponseContent();
            try
            {
                //获取所有明细
                List<Dt_OutSGOrder> outSGOrders = BaseDal.Db.Queryable<Dt_OutSGOrder>().Where(x=>ids.Contains(x.Id)).Includes(x=>x.Details).ToList();
                List<Dt_OutSGOrderDetail> outSGOrderDetails = outSGOrders.SelectMany(x=>x.Details.Where(t=>t.OutSGOrderDetailStatus==OutOrderStatusEnum.未开始.ObjToInt())).ToList();
                List<int> ints = outSGOrderDetails.Select(x => x.Id).ToList();
                int[] reseponse = new int[ints.Count];
                for (int i = 0; i < ints.Count; i++)
                {
                    reseponse[i] = ints[i];
                }
                content = CreateSGOutboundTasks(reseponse);
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
@@ -735,22 +843,21 @@
                {
                    return content.Error("领料计划传入信息为空");
                }
                outMESOrderDTOs.Select(x => x.OutDetailId);
                List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData();
                OutMESOrderDTO? CheckGradeCode = outMESOrderDTOs.FirstOrDefault(x => !GradeCodes.Contains(x.GradeCode));
                if (CheckGradeCode != null)
                {
                    return content.Error($"领料计划库区{nameof(OutMESOrderDTO.GradeCode)}:{CheckGradeCode.GradeCode}不存在");
                    return content.Error($"领料计划等级{nameof(OutMESOrderDTO.GradeCode)}:{CheckGradeCode.GradeCode}不存在");
                }
                OutMESOrderDTO? CheckOutDetailId = outMESOrderDTOs.FirstOrDefault(x => x.OutDetailId <= 0);
                if (CheckOutDetailId != null)
                {
                    return content.Error($"领料计划{nameof(OutMESOrderDTO.OutDetailId)}:{CheckOutDetailId.ProductOrderNo}需要大于0");
                    return content.Error($"领料计划ID:{CheckOutDetailId.OutDetailId}需大于0");
                }
                OutMESOrderDTO? CheckReqQuantity = outMESOrderDTOs.FirstOrDefault(x => x.ReqQuantity <= 0);
                if (CheckReqQuantity != null)
                {
                    return content.Error($"领料计划{nameof(OutMESOrderDTO.ReqQuantity)}:{CheckReqQuantity.ProductOrderNo}需要大于0");
                    return content.Error($"领料计划ID:{CheckReqQuantity.OutDetailId},{CheckReqQuantity.ProductOrderNo}物料需求需要大于0");
                }
                //获取所有物料信息
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt());
@@ -781,11 +888,12 @@
                    Dt_MakeCenterInfo makeCenterInfo=makeCenterInfos.FirstOrDefault(x => x.MakeCode == item.MakeCode);
                    item.MakeArea = makeCenterInfo.MakeArea;
                    item.WarehouseId = materielInfo.WarehouseId;
                    item.MaterielUnit = materielInfo.MaterielUnit;
                    item.AssistUnitCode = materielInfo.AssistUnitCode;
                }
                
                _unitOfWorkManage.BeginTran();
                //操作数据,并分配需求库存
                _outboundRepository.OutMESOrderRepository.AddData(AddoutMESOrders);
                List<Dt_OutMESOrder> mESOrders = _outboundRepository.OutMESOrderRepository.QueryData(x => AddoutMESOrders.Select(x => x.OutDetailId).Contains(x.OutDetailId));
                List<Dt_Task> tasks = new List<Dt_Task>();
@@ -799,7 +907,7 @@
                    if (result.Item1 != null && result.Item1.Count > 0)
                    {
                        //创建任务
                        tasks = GetTasks(result.Item1, result.Item3, TaskTypeEnum.PrintYLOutbound);
                        tasks = GetTasks(result.Item1, result.Item3);
                        result.Item2.ForEach(x =>
                        {
                            OutOrderStatusEnum.出库中.ObjToInt();
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs
@@ -92,9 +92,9 @@
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceivePicking"), AllowAnonymous]
        public WebResponseContent ReceivePicking(BSTPickInfoDTO bSTPickInfoDTO)
        public WebResponseContent ReceivePicking([FromBody] List<BSTPickInfoDTO> bSTPickInfoDTOs)
        {
            return _taskService.ReceivePicking(bSTPickInfoDTO);
            return _taskService.ReceivePicking(bSTPickInfoDTOs);
        }
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/MES/MesController.cs
@@ -144,9 +144,9 @@
        /// <param name="boxCode"></param>
        /// <returns></returns>
        [HttpPost,HttpGet, Route("MESBoxCodeNotice"), AllowAnonymous]
        public string MESBoxCodeNotice(string boxCode)
        public WebResponseContent MESBoxCodeNotice(string boxCode)
        {
            return _invokeMESService.MESBoxCodeNotice(boxCode);
            return _proInOrderInfoService.MESBoxCode(boxCode);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutLineViewController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Authorization;
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/OutLineView")]
    [ApiController]
    public class OutLineViewController : ApiBaseController<IOutLineViewService, Dt_OutLineView>
    {
        public OutLineViewController(IOutLineViewService service) : base(service)
        {
        }
        /// <summary>
        /// èŽ·å–çº¿ä½“åŽŸçº¸
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("GetOutLineView"), AllowAnonymous]
        public WebResponseContent GetOutLineView()
        {
            return Service.GetOutLineView();
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
@@ -41,5 +41,14 @@
        {
            return Service.ManualMaterielGroup(saveModel);
        }
        /// <summary>
        /// æ›´æ–°è€åŽ‚æ®‹å·åº“å­˜
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("UpBSTStock"),AllowAnonymous]
        public WebResponseContent UpBSTStock(int operate)
        {
            return Service.UpBSTStock(operate);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -68,7 +68,7 @@
        /// <param name="startPoint"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("EmptyBackTask"), AllowAnonymous]
        public WebResponseContent EmptyBackTask(string barCode, string startPoint)
        public WebResponseContent EmptyBackTask(string barCode, string startPoint,int target)
        {
            return Service.EmptyBackTask(barCode, startPoint);
        }
@@ -82,6 +82,7 @@
        {
            return Service.InboundFLOrCPTask(barCode, startPoint, matCode, matCount,oneCount);
        }
        /// <summary>
        /// è¾…æ–™(成品)采购/期初入库
        /// </summary>
@@ -139,6 +140,17 @@
        }
        /// <summary>
        /// åˆ›å»ºç”Ÿç®¡æ‰‹åŠ¨å‡ºåº“
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        [HttpPost, Route("CreateSGManualTasks"), AllowAnonymous]
        public WebResponseContent CreateSGManualTasks([FromBody] List<int> ids)
        {
            return Service.CreateSGManualTasks(ids);
        }
        /// <summary>
        /// ä¿®æ”¹ä»»åŠ¡çŠ¶æ€
        /// </summary>
        /// <param name="task"></param>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs
@@ -83,6 +83,8 @@
            CreateMap<InboundDetailItem, Dt_InboundOrderDetail>().ForMember(x => x.OrderQuantity, b => b.MapFrom(b => b.MaterialQty)).ForMember(x => x.OrderDetailStatus, b => b.MapFrom(b => InOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.MaterialThick, b => b.MapFrom(b => b.Thickness)).ForMember(x => x.MaterialWide, b => b.MapFrom(b => b.Wide)).ForMember(x => x.MaterialWeight, b => b.MapFrom(b => b.Weight)).ForMember(x => x.OrderQuantity, b => b.MapFrom(b => b.MaterialQty));
            //博思通缓存采购转换
            CreateMap<Dt_InboundOrderDetail, Dt_YLInboundCache>().ForMember(x => x.Id, b => b.MapFrom(b => 0)).ForMember(x => x.BindStatus, b => b.MapFrom(b => WhetherEnum.False.ObjToInt())).ForMember(x => x.RfidCode, b => b.MapFrom(b => "")).ForMember(x => x.MaterialNo, b => b.MapFrom(b => b.MaterialCode)).ForMember(x => x.InvOrg, b => b.MapFrom(b => MaterielInvOrgEnum.新厂.ToString()));
            //博思通出库详情老厂出库线体缓存转换
            CreateMap<Dt_OutStockLockInfo, Dt_OutLineView>().ForMember(x => x.Id, b => b.MapFrom(b => 0));
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json
@@ -13,7 +13,7 @@
  //连接字符串
  //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;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_WMSLLD;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_WMSLLD;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=WIDESEA_WMSLLD;User ID=sa;Password=Sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //旧WMS数据库连接
  //"TeConnectionString": "Data Source=10.30.4.92;Initial Catalog=TeChuang;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
@@ -30,7 +30,7 @@
  "LogAopEnable": false,
  "PrintSql": true, //打印SQL语句
  "ApiName": "WIDESEA",
  "ExpMinutes": 120,
  "ExpMinutes": 360,
  "QuartzJobAutoStart": true,
  "PDAVersion": "4",
  "WebSocketPort": 9296
ÏîÄ¿´úÂë/ÁúÀûµÃPDA/common/config.js
@@ -1,6 +1,6 @@
let config = {
    baseUrl: 'http://192.168.35.3:9283',
    //baseUrl: 'http://127.0.0.1:9293',
    //baseUrl: 'http://192.168.35.3:9283',
    baseUrl: 'http://127.0.0.1:9293',
    urls: [
        'http://192.168.35.3:9283',
        'http://192.168.35.3:9283'
ÏîÄ¿´úÂë/ÁúÀûµÃPDA/pages/stash/boxing.vue
@@ -84,8 +84,11 @@
                            <uni-easyinput type="text" v-model="addressEmpty" placeholder="请扫描地址条码" ref='midInput'
                                :focus="addressEmptyFocus" />
                        </uni-forms-item>
                        <uni-forms-item label="叠盘/立库">
                            <uni-data-checkbox v-model="target" :localdata="targetAddress" style="margin-top: 5px;"/>
                        </uni-forms-item>
                        <uni-forms-item>
                            <button @click="inEmpty" type="primary" size="default" style="margin-top: 2%;">入库确认</button>
                            <button @click="inEmpty" type="primary" size="default" style="margin-top: 2%;">呼叫确认</button>
                        </uni-forms-item>
                    </uni-forms>
                </view>
@@ -147,6 +150,14 @@
                bindCode: "",
                rfidCode: "",
                rfid:"",
                targetAddress: [{
                        text: '叠盘',
                        value: 0
                    }, {
                        text: '立库',
                        value: 1
                    }],
                target: 0,
                outCount: 0,
                addressEmptyFocus: false,
                startPointRange: []
@@ -194,12 +205,6 @@
                } else {
                    this.addressEmptyFocus = false;
                }
                if (this.inboundCode) {
                    this.addressEmptyFocus = true;
                } else {
                    this.addressEmptyFocus = false;
                }
            },
            inEmpty() {
                if (this.emptyCode == "") {
@@ -216,11 +221,13 @@
                    })
                    return;
                }
                var url = "?barCode=" + this.emptyCode + "&startPoint=" + this.addressEmpty;
                var url = "?barCode=" + this.emptyCode + "&startPoint=" + this.addressEmpty + "&target=" + this.target;
                this.$u.post('/api/Task/EmptyBackTask' + url, {}).then(res => {
                    if (res.status) {
                        this.emptyCode = "";
                        this.addressEmpty = "";
                        this.target=0;
                        this.addressEmptyFocus=false;
                        //获取总数量
                        setTimeout(() => {
                            this.addressEmptyFocus = false;
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/²©Ë¹Í¨ÀûÍØ½Ó¿Ú.V2.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÃMES½Ó¿Ú.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/Ô­ÁÏ¿âÊäËÍÏßͨѶЭÒé.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/½Ó²µÌ¨ÓëÉÏλ»úWCS½»»¥.xls
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/Ö½±­Ö½ÏäÉÏÁÏèì¼ÜͨѶЭÒé.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬÈý̨ÁϼÜDB¿éÊý¾Ý/Æóҵ΢ÐŽØÍ¼_1763189335703.png
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬÈý̨ÁϼÜDB¿éÊý¾Ý/Æóҵ΢ÐŽØÍ¼_17631893492052.png
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬÉÏÁÏèì¼ÜÊýÁ¿.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬÁ½Ì¨ÁϼÜDB¿éÊý¾Ý/Æóҵ΢ÐŽØÍ¼_17631892881691.png
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬÁ½Ì¨ÁϼÜDB¿éÊý¾Ý/Æóҵ΢ÐŽØÍ¼_17631893013030.png
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬËĄ̈ÁϼÜDB¿éÊý¾Ý/Æóҵ΢ÐŽØÍ¼_17631895456628.png
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ֽƬËĄ̈ÁϼÜDB¿éÊý¾Ý/Æóҵ΢ÐŽØÍ¼_17631895685290.png