已修改58个文件
已删除1个文件
已添加36个文件
5176 ■■■■ 文件已修改
项目代码/WCS/WCSClient/package-lock.json 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/1.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/2.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/lines.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/lines2.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/webconfig.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/堆垛机.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/public/货架.jpeg 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/uitils/websocket.js 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/Home.vue 893 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/Homes.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/JElDescription.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/LineComponent.vue 406 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/LineInfo.vue 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSClient/src/views/LineInfocopy.vue 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Equipment/EquipmentDTO.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 238 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Filter/CustomProfile.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Program.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile3.pubxml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/appsettings.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/ConveyorLineJob/W_CLineCPHDBName.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/ApartPlate.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/StackPlate.cs 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/StackPlateDBName.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/StackPlateTaskCommand.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/ConveyorLineJob_YL2ndFloor.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/ConveyorLineJob_YLOld.cs 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC2.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC3.cs 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/Task/RequestInbound.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/ConveyorLineJob_CPH.cs 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/码垛/MDJob_CP.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/config/buttons.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/public/webconfig.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/stock/stockInfo.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/basic/locationInfo.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/stock/ProStockView.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/stock/stockInfo.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/.vs/WIDESEA_WMSServer/v17/DocumentLayout.backup.json 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/.vs/WIDESEA_WMSServer/v17/DocumentLayout.json 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicRepository/LocationInfoRepository.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicService/Base/LocationInfoService.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService_Common.cs 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/LocationEnum/LocationStatusEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/StockEnum/StockStatusMenu.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/BaseModels/PageDataOptions.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/BaseModels/WebResponseContent.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/Const/HtmlElementType.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Core/Helper/UtilConvert.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTOutOrderDTO.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/MES/MESAutoIssueDTO.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/MES/OutMESOrderDTO.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/IMESService/IInvokeMESService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/MESService/InvokeMESService.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/ERPBaseModel.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/MESDispatchModel.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/MESResponse.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutMESOrderRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IOutboundService/IOutMESOrderService.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_AGVStationInfo.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_LocationInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutMESOrder.cs 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundRepository/OutMESOrderRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutMESOrderService.cs 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_RecordService/Service/LocationStatusChangeRecordService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/ProStockViewService.cs 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Reloaction.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Basic/LocationInfoRowController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/MES/MesController.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutMESOrderController.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/技术协议/AGV作业流程0911.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/博思通利拓接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利得MES接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/~$纸杯纸箱上料桁架通讯协议.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/原料库输送线通讯协议.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/项目图纸/龙利得纸卷库——纸卷库货架——总图——2025-05-20现场更改端部网架出图.dwg 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WCSClient/package-lock.json
@@ -1278,6 +1278,11 @@
        "fastq": "^1.6.0"
      }
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.7",
      "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
    },
    "@soda/friendly-errors-webpack-plugin": {
      "version": "1.8.0",
      "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927406873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz",
@@ -1836,87 +1841,6 @@
        "webpack-chain": "^6.4.0",
        "webpack-dev-server": "^3.11.0",
        "webpack-merge": "^4.2.2"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
    },
    "@vue/cli-shared-utils": {
@@ -5014,13 +4938,6 @@
        "lodash-unified": "^1.0.2",
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      },
      "dependencies": {
        "@popperjs/core": {
          "version": "npm:@sxzz/popperjs-es@2.11.7",
          "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
        }
      }
    },
    "elliptic": {
@@ -12608,6 +12525,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-router": {
      "version": "4.0.10",
      "resolved": "https://registry.nlark.com/vue-router/download/vue-router-4.0.10.tgz?cache=0&sync_timestamp=1624286995690&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-4.0.10.tgz",
ÏîÄ¿´úÂë/WCS/WCSClient/public/1.png
ÏîÄ¿´úÂë/WCS/WCSClient/public/2.png
ÏîÄ¿´úÂë/WCS/WCSClient/public/lines.png
ÏîÄ¿´úÂë/WCS/WCSClient/public/lines2.png
ÏîÄ¿´úÂë/WCS/WCSClient/public/webconfig.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
window.webConfig = {
    "webApiDevelopment": "http://localhost:9291/",
    "webApiProduction": "http://localhost:9291/",
    "webApiDebug": "http://localhost:9291/",
    "webSocketUrl": "ws://localhost:9260/",
}
ÏîÄ¿´úÂë/WCS/WCSClient/public/¶Ñ¶â»ú.png
ÏîÄ¿´úÂë/WCS/WCSClient/public/»õ¼Ü.jpeg
ÏîÄ¿´úÂë/WCS/WCSClient/src/uitils/websocket.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
import { ref, reactive } from 'vue';
export const useWebSocket = (protocols) => {
  const ws = new WebSocket("ws://localhost:9260/", protocols);
  const messages = ref([]);
  const status = reactive({
    isConnected: false,
    error: null
  });
  // äº‹ä»¶ç›‘听
  const connect = () => {
    ws.onopen = () => {
      status.isConnected = true;
      console.log('WebSocket è¿žæŽ¥æˆåŠŸ');
    };
    ws.onmessage = (event) => {
      try {
        const data = JSON.parse(event.data);
        messages.value.push(data);
      } catch (e) {
        console.error('消息解析失败', e);
      }
    };
    ws.onclose = (event) => {
      status.isConnected = false;
      console.log('连接关闭,准备重连...');
      setTimeout(connect, 3000); // 3秒后重连
    };
    ws.onerror = (error) => {
      status.error = error;
      console.error('WebSocket é”™è¯¯:', error);
    };
  };
  // åˆå§‹åŒ–连接
  connect();
  // å‘送消息方法
  const send = (data) => {
    if (status.isConnected) {
      ws.send(JSON.stringify(data));
    }
  };
  return {
    ws,
    messages,
    status,
    send,
    close: () => ws.close()
  };
};
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/Home.vue
@@ -1,24 +1,893 @@
<template>
  <div class="title"></div>
    <div class="title">
        <el-row :gutter="20" style="height:85%">
            <el-col :span="8">
                <span style="position: relative; top: 100px;left: 30px;">
                    <h4>一楼设备监控</h4>
                </span>
                <el-row :gutter="20" style="height:1000px">
                    <el-col :span="8">
                        <div>
                            <div v-for="(group, index) in groupedLines(linescopy7)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 118px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy8)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 115px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy9)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 112px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy10)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition" />
                                </div>
                            </div>
                            <div style="margin-top: 109px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy11)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition" />
                                </div>
                            </div>
                            <div style="margin-top: 107px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy12)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition" />
                                </div>
                            </div>
                        </div>
                    </el-col>
                    <el-col :span="8">
                        <div>
                            <div v-for="(group, index) in groupedLines(linescopy1)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 108px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy2)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 58px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy3)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 58px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy4)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition" />
                                </div>
                            </div>
                            <div style="margin-top: 115px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy5)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition" />
                                </div>
                            </div>
                            <div style="margin-top: 115px;"></div>
                            <div v-for="(group, index) in groupedLines(linescopy6)" :key="index">
                                <div class="positionY-group">
                                    <LineInfoCopy v-for="(line, lineIndex) in group.lines" :key="lineIndex"
                                        :equipNo="line.equipNo" :imgType="line.imgType" :positionX="line.positionX"
                                        :positionY="line.positionY" :condition="line.condition" />
                                </div>
                            </div>
                        </div>
                    </el-col>
                </el-row>
            </el-col>
            <el-col :span="8">
                <!-- å †åž›æœº -->
                <div style="position: relative; top: 50px;">
                    <div class="stackerDiv">
                        <div class="stackDivName">一号堆垛机</div>
                        <LineComponent :x="xValue1" ref="stacker1" :equipNo="SC01"></LineComponent>
                    </div>
                    <el-divider></el-divider>
                    <div class="stackerDiv">
                        <div class="stackDivName">二号堆垛机</div>
                        <LineComponent :x="xValue2" ref="stacker2" :equipNo="SC02"></LineComponent>
                    </div>
                    <el-divider></el-divider>
                    <div class="stackerDiv">
                        <div class="stackDivName">三号堆垛机</div>
                        <LineComponent :x="xValue3" ref="stacker3" :equipNo="SC03"></LineComponent>
                    </div>
                    <el-divider></el-divider>
                    <div class="stackerDiv">
                        <div class="stackDivName">四号堆垛机</div>
                        <LineComponent :x="xValue4" ref="stacker4" :equipNo="SC04"></LineComponent>
                    </div>
                    <el-divider></el-divider>
                    <div class="stackerDiv">
                        <div class="stackDivName">五号堆垛机</div>
                        <LineComponent :x="xValue5" ref="stacker5" :equipNo="SC05"></LineComponent>
                    </div>
                    <el-divider></el-divider>
                    <div class="stackerDiv">
                        <div class="stackDivName">六号堆垛机</div>
                        <LineComponent :x="xValue6" ref="stacker6" :equipNo="SC06"></LineComponent>
                    </div>
                </div>
            </el-col>
        </el-row>
    </div>
</template>
<script>
import { ref, reactive } from 'vue'
import { onMounted, ref, reactive } from "vue";
import LineInfo from "./LineInfo.vue";
import LineInfoCopy from "./LineInfocopy.vue";
import LineComponent from './LineComponent.vue';
import JElDescription from "./JElDescription";
import { useWebSocket } from '@/uitils/websocket';
export default {
  setup() {
    return {
    data() {
        return {
            ws: null,          // WebSocket实例
            messages: [],      // æ¶ˆæ¯åˆ—表
            status: {         // è¿žæŽ¥çŠ¶æ€
                isConnected: false,
                error: null
            },
            linescopy1: [
                {
                    equipNo: "1005",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1006",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
    }
  }
}
                {
                    equipNo: "1007",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1008",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                }
            ],
            linescopy2: [
                {
                    equipNo: "1009",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1010",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1011",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1025",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 21,
                    condition: false,
                },
                {
                    equipNo: "1012",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                }
            ],
            linescopy3: [
                {
                    equipNo: "1017",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1018",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1019",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1026",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 21,
                    condition: false,
                },
                {
                    equipNo: "1020",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                }
            ],
            linescopy4: [
                {
                    equipNo: "1021",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1022",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1023",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1024",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                }
            ],
            linescopy5: [
                {
                    equipNo: "1031",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1032",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1033",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1034",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                }
            ],
            linescopy6: [
                {
                    equipNo: "1035",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1036",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1037",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1038",
                    imgType: "1",
                    positionX: 0.6,
                    positionY: 20,
                    condition: false,
                }
            ],
            linescopy7: [
                {
                    equipNo: "1001",
                    imgType: "1",
                    positionX: 5,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1002",
                    imgType: "1",
                    positionX: 5,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1003",
                    imgType: "1",
                    positionX: 5,
                    positionY: 20,
                    condition: false,
                },
                {
                    equipNo: "1004",
                    imgType: "1",
                    positionX: 5,
                    positionY: 20,
                    condition: false,
                },
            ],
            linescopy8: [
                {
                    equipNo: "1039",
                    imgType: "1",
                    positionX: 6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1040",
                    imgType: "1",
                    positionX: 6,
                    positionY: 16,
                    condition: false,
                },
            ],
            linescopy9: [
                {
                    equipNo: "1013",
                    imgType: "1",
                    positionX: 6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1014",
                    imgType: "1",
                    positionX: 6,
                    positionY: 16,
                    condition: false,
                },
            ],
            linescopy10: [
                {
                    equipNo: "1015",
                    imgType: "1",
                    positionX: 6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1016",
                    imgType: "1",
                    positionX: 6,
                    positionY: 16,
                    condition: false,
                },
            ],
            linescopy11: [
                {
                    equipNo: "1027",
                    imgType: "1",
                    positionX: 6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1028",
                    imgType: "1",
                    positionX: 6,
                    positionY: 16,
                    condition: false,
                },
            ],
            linescopy12: [
                {
                    equipNo: "1029",
                    imgType: "1",
                    positionX: 6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "1030",
                    imgType: "1",
                    positionX: 6,
                    positionY: 16,
                    condition: false,
                },
            ],
            StackerCrane: {
                Automatic: "",
                Fault: "",
                CurrentLayer: "",
                CurrentRow: "1",
                CurrentColumn: "",
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCOde: "",
                StackerAlarm: "",
            },
            RGVFirst: false,
            RGVSecond: false,
            RGVThird: false,
            xValue1: 0,
            xValue2: 0,
            xValue3: 0,
            xValue4: 0,
            xValue5: 0,
            xValue6: 0,
            timer1: null, // å®šæ—¶å™¨å˜é‡
            timer2: null, // å®šæ—¶å™¨å˜é‡
            RGV01: {
                Automatic: "",
                Fault: "",
                LevelPoint: 0,
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCode: "RGV01",
                Alarm: "",
            },
            RGV02: {
                Automatic: "",
                Fault: "",
                LevelPoint: 1280,
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCode: "RGV02",
                Alarm: "",
            },
            RGV03: {
                Automatic: "",
                Fault: "",
                LevelPoint: 0,
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCode: "RGV03",
                Alarm: "",
            },
            formRGV: {
                TaskType: "",
                SourceAddress: "",
                TargetAddress: "",
                DeviceCode: "",
            },
        };
    },
    components: {
        LineInfoCopy,
        LineInfo,
        LineComponent,
        JElDescription,
    },
    methods: {
        groupedLines(linescopy) {
            const groups = {};
            linescopy.forEach((line) => {
                const positionY = line.positionY;
                if (!groups[positionY]) {
                    groups[positionY] = {
                        positionY,
                        lines: [],
                    };
                }
                groups[positionY].lines.push(line);
            });
            return Object.values(groups);
        },
        mouseClickRGVFirst() {
            this.fullscreenLoading = true;
            this.RGVFirst = true;
            this.fullscreenLoading = false;
        },
        mouseClickSecond() {
            this.fullscreenLoading = true;
            this.RGVSecond = true;
            this.fullscreenLoading = false;
        },
        mouseClickThird() {
            this.fullscreenLoading = true;
            this.RGVThird = true;
            this.fullscreenLoading = false;
        },
        SendCommand(x) {
            this.fullscreenLoading = true;
            this.formRGV.DeviceCode = x;
            this.http.post("api/DeviceInfo/RGVHandTask", this.formRGV)
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                        $vue.refresh();
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        RGVReset(x) {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/RGVReset?DeviceCode=" + x, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        RGVemergencyStop(x) {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/RGVemergencyStop?DeviceCode=" + x, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        RGVPause(x) {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/RGVPause?DeviceCode=" + x, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        RGVCancel(x) {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/RGVCancel?DeviceCode=" + x, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        RGVInitialize(x) {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/RGVInitialize?DeviceCode=" + x, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
    },
    computed: {
    },
    mounted() {
    },
    created() {
        this.ws = new WebSocket('ws://localhost:9260/');
    this.ws.onmessage = (event) => {
      try {
        const data = JSON.parse(event.data);
        console.log('收到消息:', data);
        // å¤„理消息...
      } catch (e) {
        console.error('消息解析失败', e);
      }
    };
        const stackerComponentsMap = {
            "SC01": 'stacker1',
            "SC02": 'stacker2',
            "SC03": 'stacker3',
            "SC04": 'stacker4',
            "SC05": 'stacker5',
            "SC06": 'stacker6',
        };
        // const componentKey = stackerComponentsMap[data.R_PP_Status];
        // if (componentKey) {
        //     this.StackerCrane.Automatic = data;
        //     this.StackerCrane.Fault = data;
        //     this.StackerCrane.Running = data;
        //     this.StackerCrane.CurrentColumn = data;
        //     this.StackerCrane.CurrentLayer = data;
        //     this.StackerCrane.LevelPoint = data;
        //     this.StackerCrane.DeviceName = data;
        //     this.StackerCrane.DeviceCode = data;
        //     this.StackerCrane.CurrentTaskNum = data;
        //     this.StackerCrane.StackerAlarm = data;
        //     this.$nextTick(() => {
        //         this.$refs[componentKey].moveDot(this.StackerCrane);
        //     });
        // }
        const stationMap = {
            "SC011F": this.linescopy1,
            "SC021F": this.linescopy2,
            "SC031F": this.linescopy3,
            "SC041F": this.linescopy4,
            "SC051F": this.linescopy5,
            "SC061F": this.linescopy6,
            "SC071F": this.linescopy7,
            "SC081F": this.linescopy8,
            "SC091F": this.linescopy9,
            "SC101F": this.linescopy10,
            "SC111F": this.linescopy11,
            "SC121F": this.linescopy12,
            "SC012F": this.linescopy13,
            "SC022F": this.linescopy13,
            "SC032F": this.linescopy13,
            "SC042F": this.linescopy13,
            "SC052F": this.linescopy13,
            "SC062F": this.linescopy13,
            "SC072F": this.linescopy13,
            "SC082F": this.linescopy14,
        };
        // var station = eventData.stationChildCode;
        // if (stationMap[eventData.roadway]) {
        //     stationMap[eventData.roadway].forEach((line) => {
        //         if (line.equipNo === station) {
        //             line.condition = eventData.inStock;
        //         }
        //     })
        // }
    },
};
</script>
<style scoped>
/* .positionY-group {
  margin-bottom: 10px;
} */
.title {
  line-height: 70vh;
  text-align: center;
  font-size: 28px;
  color: orange;
    height: 1800px;
}
</style>
.cardWidth {
    height: 100%;
    width: 100%;
    box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
}
.cardWidthrow {
    height: 00%;
    width: 100%;
    /* margin-top: 10px; */
    box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
}
.divider {
    top: 50px;
}
.layerSize {
    position: absolute;
    top: 100px;
    left: 30px;
    color: fuchsi
}
.stackerDiv {
    border: 1px solid rgba(0, 195, 255, 0.822);
    width: 980px;
    padding-left: 3px;
}
.stackDivName {
    text-align: center;
    color: rgba(0, 195, 255, 0.822);
    margin-bottom: 12px;
}
.dot-Running {
    position: absolute;
    top: -5px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background-color: #409eff;
    transition: transform 0.3s ease;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 9px;
    font-weight: bold;
    color: white;
}
.dot-Automatic {
    position: absolute;
    top: -5px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background-color: #0df705;
    transition: transform 0.3s ease;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 9px;
    font-weight: bold;
    color: white;
}
.dot-Fault {
    position: absolute;
    top: -5px;
    width: 20px;
    height: 20px;
    /* right:0px; */
    border-radius: 50%;
    background-color: #f80410;
    transition: transform 0.3s ease;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 9px;
    font-weight: bold;
    color: white;
}
.line-container {
    position: relative;
    height: 1280px;
    background-color: #ecf5ff;
    width: 20px;
    top: 30px;
    left: 200px
}
.RGVline {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 2px;
    background-color: #a0cfff;
}
.line {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 2px;
    background-color: #a0cfff;
}
.line-containerThird {
    position: absolute;
    height: 20px;
    background-color: #ecf5ff;
    width: 1330px;
    /* margin-top:180px; */
    top: 180px;
    left: 300px;
}
.lineThird {
    /* position: absolute; */
    height: 1px;
    /* margin-top:180px; */
    background-color: #a0cfff;
}</style>
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/Homes.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
<template>
  <div class="title"></div>
</template>
<script setup>
import { useWebSocket } from '@/uitils/websocket';
const { ws,messages, status, send } = useWebSocket();
// const sendTest = () => {
//   send({ type: 'test', content: 'Hello WebSocket!' });
// };
ws.onmessage = (event) => {
  try {
    const data = JSON.parse(event.data);
    console.log(data);
    // å¤„理数据...
  } catch (e) {
    console.error('消息解析失败', e);
  }
};
</script>
<style scoped>
.title {
  line-height: 70vh;
  text-align: center;
  font-size: 28px;
  color: orange;
}
</style>
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/JElDescription.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
<template>
  <div class="j-description wordwrap" :class="class__" :style="style__">{{value}}</div>
</template>
<script>
  export default {
    name: "j-el-description",
    inject: {
      elForm: {
        default: ''
      },
      elFormItem: {
        default: ''
      }
    },
    props: {
      value: [String, Number],    // å†…容
      type: {                     // ä¸»é¢˜
        type: String,
        validator(value) {
          return ['primary', 'success', 'info', 'warning', 'danger'].indexOf(value) !== -1;
        }
      },
      size: {                     // å°ºå¯¸
        type: String,
        validator(value) {
          return ['medium', 'small', 'mini'].indexOf(value) !== -1;
        }
      },
      height: [String, Number],   // é™åˆ¶é«˜åº¦
      ellipsis: Boolean,          // çœç•¥å·
    },
    computed: {
      elFormItemSize__() {
        return (this.elFormItem || {}).elFormItemSize;
      },
      size__() {
        return this.size || this.elFormItemSize__ || (this.$ELEMENT || {}).size;
      },
      class__() {
        let _class = [];
        if (this.type) {
          _class.push(this.type);
        }
        if (this.size__) {
          _class.push(this.size__);
        }
        if (this.height) {
          _class.push('scroll');
        }
        if (this.ellipsis) {
          _class.push('ellipsis');
        }
        return _class;
      },
      style__() {
        let _style = {};
        if (!this.ellipsis && this.height) {
          if (isNaN(this.height)) {
            _style.height = this.height;
          } else {
            _style.height = this.height + 'px';
          }
        }
        return _style;
      }
    }
  }
</script>
<style scoped>
  .j-description {
    min-height: 40px;
    line-height: 40px;
    padding: 0 50%;
  }
  /*大小*/
  .j-description.medium {
    min-height: 36px;
    line-height: 36px;
  }
  .j-description.small {
    min-height: 32px;
    line-height: 32px;
  }
  .j-description.mini {
    min-height: 28px;
    line-height: 28px;
  }
  /*滚动*/
  .j-description.scroll {
    overflow-x: hidden;
    overflow-y: auto;
  }
  .j-description.scroll::-webkit-scrollbar {
    width: 9px;
    height: 9px;
    background: #F3F3F3;
  }
  .j-description.scroll::-webkit-scrollbar-thumb {
    border: 1px solid #ffffff;
    border-radius: 6px;
    background: #c9c9c9;
  }
  .j-description.scroll::-webkit-scrollbar-thumb:hover {
    background: #b5b5b5;
  }
  /*换行*/
  .j-description.wordwrap {
    table-layout: fixed;
    word-break: break-all;
    word-wrap: break-word;
  }
  /*省略号*/
  .j-description.ellipsis {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }
  /*主题*/
  .j-description.primary {
    background-color: #ecf5ff;
    border: 1px solid #d9ecff;
    color: #409eff;
  }
  .j-description.success {
    background-color: #f0f9eb;
    border-color: #e1f3d8;
    color: #67c23a;
  }
  .j-description.info {
    background-color: #f4f4f5;
    border-color: #e9e9eb;
    color: #909399;
  }
  .j-description.warning {
    background-color: #fdf6ec;
    border-color: #faecd8;
    color: #e6a23c;
  }
  .j-description.danger {
    background-color: #fef0f0;
    border-color: #fde2e2;
    color: #f56c6c;
  }
</style>
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/LineComponent.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,406 @@
<template>
  <div>
    <el-row>
      <template v-for="item in 32" :key="item">
        <el-col :span="0.9">
          <span class="image-text"></span>
          <img src="../../public/货架.jpeg" />
        </el-col>
      </template>
    </el-row>
    <el-row style="padding-bottom: 5px;">
      <template v-for="item in 32" :key="item">
        <el-col :span="0.9">
          <span class="image-text"></span>
          <img src="../../public/货架.jpeg" />
        </el-col>
      </template>
    </el-row>
  </div>
  <div class="line-container">
    <div class="line"></div>
    <!-- <div class="dot" :style="{ right: dotPosition + 'px' }" ref="childDot" @click="mouseClick"></div> -->
    <div :class="update()"
      :style="{ transform: `translateX(${StackerCrane.CurrentColumn < 33 ? StackerCrane.CurrentColumn * 30 - 59 : 0}px)` }"
      ref="childDot" @click="mouseClick"></div>
  </div>
  <div>
    <el-row style="padding-top: 5px;">
      <template v-for="item in 32" :key="item">
        <el-col :span="0.9">
          <span class="image-text"></span>
          <img src="../../public/货架.jpeg" />
        </el-col>
      </template>
    </el-row>
    <el-row style="padding-bottom: 5px;">
      <template v-for="item in 32" :key="item">
        <el-col :span="0.9">
          <span class="image-text"></span>
          <img src="../../public/货架.jpeg" />
        </el-col>
      </template>
    </el-row>
  </div>
  <el-dialog v-model="dialogVisible" title="堆垛机信息查看" :before-close="handleClose">
    <el-form ref="$form" :model="StackerCrane" label-position="left" label-width="120px" size="medium">
      <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
        <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="设备编号:">
            <j-el-description :value="StackerCrane.DeviceName" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
        <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="设备状态:">
            <j-el-description :value="StackerCrane.Fault" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
        <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="工作模式:">
            <j-el-description :value="StackerCrane.Automatic" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
        <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="任务号:">
            <j-el-description :value="StackerCrane.CurrentTaskNum" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="20" type="flex" justify="start" align="top" tag="div" style="margin-bottom: 10px;">
        <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="作业状态:">
            <j-el-description :value="StackerCrane.Running" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
        <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="当前行列层:">
            <j-el-description
              :value="StackerCrane.CurrentRow + '-' + StackerCrane.CurrentLayer + '-' + StackerCrane.CurrentColumn "
              type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="20" type="flex" justify="start" align="top" tag="div" style="margin-bottom: 10px;">
        <el-col :span="24" :offset="0" :push="0" :pull="0" tag="div">
          <el-form-item label="报警信息:">
            <j-el-description :value="StackerCrane.StackerAlarm" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
      </el-row>
      <el-divider />
      <h4 style="margin-bottom: 20px;">手动操作</h4>
      <el-form ref="form" :model="form" label-width="90px">
        <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
          <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
            <el-form-item label="任务命令"  prop="TargetAddress">
              <el-select size="large" v-model="form.TaskType" placeholder="请选择任务命令">
                <el-option label="入库" value="17" />
                <el-option label="出库" value="18" />
                <el-option label="移库" value="20" />
                <el-option label="取货" value="24" />
                <el-option label="放货" value="48" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
          <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
            <el-form-item label="起点行列层:">
              <el-input size="large" v-model="form.SourceAddress" style="width: 800px" placeholder="请输入起点行列层" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
          <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
            <el-form-item label="终点行列层:">
              <el-input size="large" v-model="form.TargetAddress" style="width: 800px" placeholder="请输入终点行列层" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <el-divider />
      <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
        <el-col :span="5" :offset="0" :push="0" :pull="0" tag="div">
          <el-button type="primary" size="small" plain @click="start">
            <i class="el-icon-check">启动</i>
          </el-button>
        </el-col>
        <el-col :span="5" :offset="0" :push="0" :pull="0" tag="div">
          <el-button type="warning" size="small" plain @click="reset">
            <i class="el-icon-check">复位</i>
          </el-button>
        </el-col>
        <el-col :span="5" :offset="0" :push="0" :pull="0" tag="div">
          <el-button type="danger" size="small" plain @click="disconnected">
            <i class="el-icon-check">中断</i>
          </el-button>
        </el-col>
        <el-col :span="5" :offset="0" :push="0" :pull="0" tag="div">
          <el-button type="danger" size="small" plain @click="emergencyStop">
            <i class="el-icon-check">急停</i>
          </el-button>
        </el-col>
        <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
          <el-button type="danger" size="small" plain @click="StackerRecall">
            <i class="el-icon-check">召回</i>
          </el-button>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="dialogVisible = false">
          ç¡®è®¤
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>
<script>
import { id } from "element-plus/es/locale";
import JElDescription from "./JElDescription";
export default {
  components: {
    JElDescription
  },
  data() {
    return {
      x: 0, // åˆå§‹x值
      url: "api/Equipment/GetStackerInfoByNo",
      dialogVisible: false,
      StackerCrane: {
        Automatic: "",
        Fault: "",
        CurrentLayer: "1",
        CurrentRow: "1",
        CurrentColumn: "1",
        CurrentTaskNum: "",
        Running: "",
        DeviceName: "",
        DeviceCode: "",
        StackerAlarm:"",
      },
      form: {
        TaskType: "",
        SourceAddress: "",
        TargetAddress: "",
        DeviceCode: "",
      },
    };
  },
  props: {
    equipNo: {
      type: String,
      default: "0",
    },
  },
  computed: {
    dotPosition() {
      return this.x;
    },
  },
  mounted() {
    this.moveDot(this.x);
  },
  methods: {
    moveDot(x) {
      this.StackerCrane.Automatic = x.Automatic == null ? "故障" : x.Automatic;
      this.StackerCrane.Fault = x.Fault == null ? "故障" : x.Fault;
      this.StackerCrane.Running = x.Running == null ? "故障" : x.Running;
      this.StackerCrane.CurrentColumn = x.CurrentColumn == undefined ? 1 : x.CurrentColumn;
      this.StackerCrane.CurrentLayer = x.CurrentLayer == undefined ? 1 : x.CurrentLayer;
      this.StackerCrane.LevelPoint = x.LevelPoint;
      this.StackerCrane.DeviceName = x.DeviceName;
      this.StackerCrane.CurrentTaskNum = x.CurrentTaskNum;
      this.StackerCrane.StackerAlarm = x.StackerAlarm;
      this.form.DeviceCode = x.DeviceCode;
    },
    update() {
      if (this.StackerCrane.Automatic == "联机模式" && this.StackerCrane.Fault != "故障" && this.StackerCrane.Running == "待机") {
        return 'dot-Automatic ';
      }
      else if (this.StackerCrane.Automatic == "联机模式" && this.StackerCrane.Fault != "故障" && this.StackerCrane.Running == "运行中") {
        return 'dot-Running ';
      } else if (this.StackerCrane.Fault == "故障") {
        return 'dot-Fault ';
      } else {
        return 'dot-Fault ';
      }
    },
    mouseClick() {
      this.fullscreenLoading = true;
      this.dialogVisible = true;
      this.fullscreenLoading = false;
    },
    start() {
      this.fullscreenLoading = true;
      this.http.post("api/DeviceInfo/StackerHandTask", this.form)
        .then((x) => {
          if (!x.status) {
            this.$message.error(x.message);
          } else {
            this.$Message.success("堆垛机命令已下发");
            // $vue.success("成功.");
            this.show = false;
            $vue.refresh();
          }
        })
        .finally(() => {
          this.fullscreenLoading = false;
        });
    }, reset() {
      this.fullscreenLoading = true;
      this.http.post("api/DeviceInfo/StackerReset?DeviceCode=" + this.form.DeviceCode)
        .then((x) => {
          if (!x.status) {
            this.$message.error(x.message);
          } else {
            this.$Message.success("复位成功");
            // $vue.success("成功.");
            this.show = false;
            $vue.refresh();
          }
        })
        .finally(() => {
          this.fullscreenLoading = false;
        });
    },
    emergencyStop() {
      this.fullscreenLoading = true;
      this.http.post("api/DeviceInfo/StackerEmergencyStop?DeviceCode=" + this.form.DeviceCode)
        .then((x) => {
          if (!x.status) {
            this.$message.error(x.message);
          } else {
            this.$Message.success("急停已按下");
            // $vue.success("成功.");
            // this.show = false;
            // $vue.refresh();
          }
        })
        .finally(() => {
          this.fullscreenLoading = false;
        });
    },
    disconnected() {
      this.fullscreenLoading = true;
      this.http.post("api/DeviceInfo/StackerDisconnected?DeviceCode=" + this.form.DeviceCode)
        .then((x) => {
          if (!x.status) {
            this.$message.error(x.message);
          } else {
            this.$Message.success("中断堆垛机任务");
          }
        })
        .finally(() => {
          this.fullscreenLoading = false;
        });
    },
    StackerRecall() {
      this.fullscreenLoading = true;
      this.http.post("api/DeviceInfo/StackerRecall?DeviceCode=" + this.form.DeviceCode)
        .then((x) => {
          if (!x.status) {
            this.$message.error(x.message);
          } else {
            this.$Message.success("召回堆垛机");
          }
        })
        .finally(() => {
          this.fullscreenLoading = false;
        });
    }
  },
};
</script>
<style scoped>
.line-container {
  position: relative;
  height: 20px;
  background-color: #ecf5ff;
  width: 960px;
}
.line {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background-color: #a0cfff;
}
.dot-Running {
  position: absolute;
  top: -5px;
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background-color: #409eff;
  transition: transform 0.3s ease;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 9px;
  font-weight: bold;
  color: white;
}
.dot-Automatic {
  position: absolute;
  top: -5px;
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background-color: #0df705;
  transition: transform 0.3s ease;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 9px;
  font-weight: bold;
  color: white;
}
.dot-Fault {
  position: absolute;
  top: -5px;
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background-color: #f80410;
  transition: transform 0.3s ease;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 9px;
  font-weight: bold;
  color: white;
}
img {
  width: 30px;
  height: 25px;
}
.image-text {
  position: absolute;
  top: 5px;
  /* left: 10px;  */
  color: white;
  /* æ–‡å­—颜色 */
  font-size: 12px;
  /* å­—号大小 */
  font-weight: bold;
  /* å­—体粗细 */
  margin-left: 5px;
}
</style>
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/LineInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,325 @@
<template>
    <div :class="update()" :style="{ left: left, top: top, marginBottom: 0 + 'px', marginTop: 0 + 'px' }"
        @click="mouseClick" v-loading.fullscreen.lock="fullscreenLoading">
        <img v-if="imgType === '2'" src="../../public/lines.png" />
        <img v-if="imgType === '1'" src="../../public/lines2.png" />
        <label v-if="equipNo" class="equip-no">{{ equipNo }}</label>
    </div>
    <el-dialog v-model="dialogVisible" title="输送线信息查看" :before-close="handleClose">
        <el-form ref="$form" :model="lineItemInfo" label-position="left" label-width="100px" size="medium">
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="设备编号:">
                        <j-el-description :value="equipNo" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="是否有盘:">
                        <j-el-description :value="lineItemInfo.inStock" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="任务号:">
                        <j-el-description :value="lineItemInfo.taskNumm" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="报警代码:">
                        <j-el-description :value="lineItemInfo.alarm" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form><el-divider />
        <h4 style="margin-bottom: 20px;">手动操作</h4>
        <el-form ref="form" :model="form" label-width="100px">
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="ä»»  åŠ¡  å‘½  ä»¤" prop="TargetAddress">
                        <el-select size="large" v-model="form.TaskType" placeholder="请选择任务命令">
                            <el-option label="入库" value="1" />
                            <el-option label="出库" value="2" />
                        </el-select>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="下一目标地址:">
                        <el-input size="large" v-model="form.TargetAddress" placeholder="请输入下一目标地址" />
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <el-divider />
        <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="primary" size="small" plain @click="SendCommand">
                    <i class="el-icon-check">发送命令</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="warning" size="small" plain @click="ConveyorLineReset">
                    <i class="el-icon-check">复位</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineEmergencyStop">
                    <i class="el-icon-check">停止</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineReturn">
                    <i class="el-icon-check">退回</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineCancel">
                    <i class="el-icon-check">取消任务</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineInitialize">
                    <i class="el-icon-check">工位初始化</i>
                </el-button>
            </el-col>
        </el-row>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="dialogVisible = false">取消</el-button>
                <el-button type="primary" @click="dialogVisible = false">
                    ç¡®è®¤
                </el-button>
            </div>
        </template>
    </el-dialog>
</template>
<script>
import { defineComponent } from "vue";
import JElDescription from "./JElDescription";
export default defineComponent({
    components: {
        JElDescription
    },
    props: {
        equipNoFontColor: {
            type: String,
            default: "blue",
        },
        equipNo: {
            type: String,
            default: "0",
        },
        imgType: {
            type: String,
            default: "1",
        },
        positionX: {
            type: Int32Array,
            default: 1,
        },
        positionY: {
            type: Int32Array,
            default: 1,
        },
        url: {
            type: String,
            default: "",
        },
        condition: {
            type: Boolean,
            default: false,
        },
    },
    data() {
        return {
            left: "500px",
            top: "400px",
            dialogVisible: false,
            lineItemInfo: {
                inStock: "",
                taskNum: "",
                alarm: "",
            },
            form: {
                TaskType: "",
                TargetAddress: "",
                DeviceCode: "",
            },
        };
    },
    mounted() {
        const axisX = (this.positionX - 1) * 40 + 100;
        const axisY = (this.positionY - 1) + 50;
        this.$nextTick(() => {
            this.left = `${axisX}px`;
            this.top = `${axisY}px`;
        });
    },
    methods: {
        mouseClick() {
            this.fullscreenLoading = true;
            this.dialogVisible = true;
            // å¤„理点击事件
            this.http.post("api/DeviceInfo/GetConveyorLineInfo?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (x.status) {
                        this.lineItemInfo = x.data;
                    } else {
                        this.$message({
                            type: "error",
                            message: x.message,
                        });
                    }
                });
            this.fullscreenLoading = false;
        },
        SendCommand() {
            this.fullscreenLoading = true;
            this.form.DeviceCode=this.equipNo;
            this.http.post("api/DeviceInfo/ConveyorLineHandTask" ,this.form)
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineReset() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineReset?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineEmergencyStop() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineEmergencyStop?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineReturn() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineReturn?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineCancel() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineCancel?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineInitialize() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineInitialize?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        update() {
            return !this.condition ? 'custom-img' : 'custom-img-color'
        },
        startTimer() {
            // å¼€å¯å®šæ—¶å™¨ï¼Œæ¯3秒执行一次
            this.timer1 = setInterval(() => {
                update();
            }, 500);
        },
    },
});
</script>
<style scoped>
.custom-img {
    position: relative;
    display: inline-block;
    /* background-color:  #d9ecff ; */
}
.custom-img-color {
    position: relative;
    display: inline-block;
    background-color: #05fa7f;
    color: white;
    text-align: center;
}
/* .custom-img-color::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: #05fa7f;
  border-radius: 50%;
} */
.custom-img img {
    width: 40px;
    height: 40px;
}
.custom-img-color img {
    width: 40px;
    height: 40px;
}
.equip-no {
    position: absolute;
    top: 15px;
    font-size: 12px;
    margin-left: -35px;
}
</style>
ÏîÄ¿´úÂë/WCS/WCSClient/src/views/LineInfocopy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,325 @@
<template>
    <div :class="update()" :style="{ left: left, top: top, marginBottom: 0 + 'px', marginTop: 15 + 'px' }"
        @click="mouseClick" v-loading.fullscreen.lock="fullscreenLoading">
        <img v-if="imgType === '2'" src="../../public/lines.png" />
        <img v-if="imgType === '1'" src="../../public/lines2.png" />
        <label v-if="equipNo" class="equip-no">{{ equipNo }}</label>
    </div>
    <el-dialog v-model="dialogVisible" title="输送线信息查看" :before-close="handleClose">
        <el-form ref="$form" :model="lineItemInfo" label-position="left" label-width="100px" size="medium">
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="设备编号:">
                        <j-el-description :value="equipNo" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="是否有盘:">
                        <j-el-description :value="lineItemInfo.inStock" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="任务号:">
                        <j-el-description :value="lineItemInfo.taskNum" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="报警代码:">
                        <j-el-description :value="lineItemInfo.alarm" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form><el-divider />
        <h4 style="margin-bottom: 20px;">手动操作</h4>
        <el-form ref="form" :model="form" label-width="100px">
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="ä»»  åŠ¡  å‘½  ä»¤" prop="TargetAddress">
                        <el-select size="large" v-model="form.TaskType" placeholder="请选择任务命令">
                            <el-option label="入库" value="1" />
                            <el-option label="出库" value="2" />
                        </el-select>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
                <el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="下一目标地址:">
                        <el-input size="large" v-model="form.TargetAddress" placeholder="请输入下一目标地址" />
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <el-divider />
        <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="primary" size="small" plain @click="SendCommand">
                    <i class="el-icon-check">发送命令</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="warning" size="small" plain @click="ConveyorLineReset">
                    <i class="el-icon-check">复位</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineEmergencyStop">
                    <i class="el-icon-check">停止</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineReturn">
                    <i class="el-icon-check">退回</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineCancel">
                    <i class="el-icon-check">取消任务</i>
                </el-button>
            </el-col>
            <el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
                <el-button type="danger" size="small" plain @click="ConveyorLineInitialize">
                    <i class="el-icon-check">工位初始化</i>
                </el-button>
            </el-col>
        </el-row>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="dialogVisible = false">取消</el-button>
                <el-button type="primary" @click="dialogVisible = false">
                    ç¡®è®¤
                </el-button>
            </div>
        </template>
    </el-dialog>
</template>
<script>
import { defineComponent } from "vue";
import JElDescription from "./JElDescription";
export default defineComponent({
    components: {
        JElDescription
    },
    props: {
        equipNoFontColor: {
            type: String,
            default: "blue",
        },
        equipNo: {
            type: String,
            default: "0",
        },
        imgType: {
            type: String,
            default: "1",
        },
        positionX: {
            type: Int32Array,
            default: 1,
        },
        positionY: {
            type: Int32Array,
            default: 1,
        },
        url: {
            type: String,
            default: "",
        },
        condition: {
            type: Boolean,
            default: false,
        },
    },
    data() {
        return {
            left: "500px",
            top: "400px",
            dialogVisible: false,
            lineItemInfo: {
                inStock: "",
                taskNum: "",
                alarm: "",
            },
            form: {
                TaskType: "",
                TargetAddress: "",
                DeviceCode: "",
            },
        };
    },
    mounted() {
        const axisX = (this.positionX - 1) * 40 + 100;
        const axisY = (this.positionY - 1) + 50;
        this.$nextTick(() => {
            this.left = `${axisX}px`;
            this.top = `${axisY}px`;
        });
    },
    methods: {
        mouseClick() {
            this.fullscreenLoading = true;
            this.dialogVisible = true;
            // å¤„理点击事件
            this.http.post("api/DeviceInfo/GetConveyorLineInfo?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (x.status) {
                        this.lineItemInfo = x.data;
                    } else {
                        this.$message({
                            type: "error",
                            message: x.message,
                        });
                    }
                });
            this.fullscreenLoading = false;
        },
        SendCommand() {
            this.fullscreenLoading = true;
            this.form.DeviceCode=this.equipNo;
            this.http.post("api/DeviceInfo/ConveyorLineHandTask" ,this.form)
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineReset() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineReset?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineEmergencyStop() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineEmergencyStop?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineReturn() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineReturn?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineCancel() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineCancel?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        ConveyorLineInitialize() {
            this.fullscreenLoading = true;
            this.http.post("api/DeviceInfo/ConveyorLineInitialize?DeviceChildCode=" + this.equipNo, null, "")
                .then((x) => {
                    if (!x.status) {
                        this.$message.error(x.message);
                    } else {
                        this.$Message.success(x.message);
                    }
                })
                .finally(() => {
                    this.fullscreenLoading = false;
                });
        },
        update() {
            return !this.condition ? 'custom-img' : 'custom-img-color'
        },
        startTimer() {
            // å¼€å¯å®šæ—¶å™¨ï¼Œæ¯3秒执行一次
            this.timer1 = setInterval(() => {
                update();
            }, 500);
        },
    },
});
</script>
<style scoped>
.custom-img {
    position: relative;
    display: inline-block;
    /* background-color:  #d9ecff ; */
}
.custom-img-color {
    position: relative;
    display: inline-block;
    background-color: #05fa7f;
    color: white;
    text-align: center;
}
/* .custom-img-color::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: #05fa7f;
  border-radius: 50%;
} */
.custom-img img {
    width: 40px;
    height: 40px;
}
.custom-img-color img {
    width: 40px;
    height: 40px;
}
.equip-no {
    position: absolute;
    top: 15px;
    font-size: 12px;
    margin-left: -35px;
}
</style>
ÏîÄ¿´úÂë/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
@@ -3,12 +3,68 @@
  "WorkspaceRootPath": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\stackplatejob\\stackplatetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackplatejob\\stackplatetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|solutionrelative:wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\stackplatejob\\stackplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackplatejob\\stackplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\controllers\\agv\\agvcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\agv\\agvcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpextend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpextend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc3.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc3.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl2ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl2ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u63A5\u9A73\u53F0\\coveryorjobyl.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u63A5\u9A73\u53F0\\coveryorjobyl.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\hostedservice\\warehousehostedservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\hostedservice\\warehousehostedservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\hostedservice\\websocketsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\hostedservice\\websocketsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\conveyorlinejob\\conveyorlinetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\conveyorlinetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_dto\\equipment\\equipmentdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|solutionrelative:wideseawcs_dto\\equipment\\equipmentdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc2.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc2.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -18,8 +74,21 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 2,
          "SelectedChildIndex": 0,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "StackPlateTaskCommand.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAABoAAAAoAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-16T09:20:27.513Z",
              "EditorCaption": ""
            },
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
@@ -30,29 +99,189 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "ImportExcelHelper.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ViewState": "AgIAAFQAAAAAAAAAAAAQwAsBAAAJAAAAAAAAAA==",
              "DocumentIndex": 5,
              "Title": "AGV_CPExtend.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "ViewState": "AgIAAFsAAAAAAAAAAAD4v2IAAABMAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-31T01:25:32.766Z",
              "WhenOpened": "2025-09-16T08:53:13.236Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "Dt_PackaxisService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs*",
              "RelativeToolTip": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs*",
              "ViewState": "AgIAACQAAAAAAAAAAAAUwDoAAAAwAAAAAAAAAA==",
              "Title": "StackPlate.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "ViewState": "AgIAABQAAAAAAAAAAAAmwCoAAAAoAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-31T01:15:08.521Z",
              "WhenOpened": "2025-09-16T01:00:55.935Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "StackerCraneJob_YLSC3.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "ViewState": "AgIAAJABAAAAAAAAAAAIwKkBAAA0AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-12T09:27:40.79Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "ConveyorLineJob_YL2ndFloor.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "ViewState": "AgIAAFsAAAAAAAAAAAAIwHcAAAAeAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T08:15:08.692Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAABkCAAAAAAAAAAAqwDICAAAXAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T07:45:44.976Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "AGVController.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs*",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs*",
              "ViewState": "AgIAABkCAAAAAAAAAADgv64BAABqAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-16T01:12:14.478Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "AGV_CPJob.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "ViewState": "AgIAAAwAAAAAAAAAAADwvyQAAAAVAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-15T05:56:57.868Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "MDJob_CP.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAHQAAABYAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-12T06:32:50.674Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "WarehouseHostedService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "ViewState": "AgIAAAMAAAAAAAAAAAAAAA4AAAAiAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-15T01:20:30.887Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "CoveryorJobYL.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "ViewState": "AgIAAEcAAAAAAAAAAAAQwE8AAAAlAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-15T05:42:55.802Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 12,
              "Title": "Program.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Program.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Program.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
              "ViewState": "AgIAABIAAAAAAAAAAAAAAC4AAAAhAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-14T01:30:09.425Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 11,
              "Title": "WebSocketSetup.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwcAAAAsAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-14T01:29:56.948Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 13,
              "Title": "ConveyorLineTaskCommand.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "ViewState": "AgIAALgBAAAAAAAAAIA6wNQBAAAbAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-12T05:22:37.131Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 14,
              "Title": "EquipmentDTO.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "RelativeToolTip": "WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwgAAAAdAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-14T02:49:56.33Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 15,
              "Title": "StackerCraneJob_YLSC2.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "ViewState": "AgIAAIAAAAAAAAAAAAAYwIsAAAAqAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T08:12:55.606Z"
            }
          ]
        }
ÏîÄ¿´úÂë/WCS/WCSServices/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
@@ -3,16 +3,68 @@
  "WorkspaceRootPath": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E1633BFD-8807-4A29-89F2-0A7F26DF6976}|WIDESEAWCS_PackInfoService\\WIDESEAWCS_PackInfoService.csproj|solutionrelative:wideseawcs_packinfoservice\\dt_packaxisservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\stackplatejob\\stackplatetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackplatejob\\stackplatetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\stackplatejob\\stackplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackplatejob\\stackplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\controllers\\agv\\agvcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\agv\\agvcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u7801\u579B\\mdjob_cp.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpextend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u6210\u54C1\u4ED3\\agv_cpextend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\utilities\\importexcelhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc3.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc3.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl2ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\conveyorlinejob_yl2ndfloor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u63A5\u9A73\u53F0\\coveryorjobyl.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u63A5\u9A73\u53F0\\coveryorjobyl.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\hostedservice\\warehousehostedservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\hostedservice\\warehousehostedservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\hostedservice\\websocketsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\hostedservice\\websocketsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\conveyorlinejob\\conveyorlinetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\conveyorlinetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_dto\\equipment\\equipmentdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|solutionrelative:wideseawcs_dto\\equipment\\equipmentdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wcsservices\\wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc2.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\\u539F\u6599\u5E93\\stackercranejob_ylsc2.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -22,7 +74,7 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 4,
          "SelectedChildIndex": 2,
          "Children": [
            {
              "$type": "Bookmark",
@@ -34,42 +86,202 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "StackPlateTaskCommand.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs*",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlateTaskCommand.cs*",
              "ViewState": "AgIAAAAAAAAAAAAAAAAuwBkAAAAYAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-16T09:20:27.513Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "AGV_CPExtend.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPExtend.cs",
              "ViewState": "AgIAAFsAAAAAAAAAAAD4v2IAAABMAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-16T08:53:13.236Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "StackPlate.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackPlateJob\\StackPlate.cs",
              "ViewState": "AgIAABkAAAAAAAAAAAAAACoAAAAoAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-16T01:00:55.935Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "StackerCraneJob_YLSC3.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC3.cs",
              "ViewState": "AgIAAJABAAAAAAAAAAAIwKkBAAA0AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-12T09:27:40.79Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "ConveyorLineJob_YL2ndFloor.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\ConveyorLineJob_YL2ndFloor.cs",
              "ViewState": "AgIAAFsAAAAAAAAAAAAIwHcAAAAeAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T08:15:08.692Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAAAoBAAAAAAAAAAAgwO0AAAA7AAAAAAAAAA==",
              "ViewState": "AgIAABkCAAAAAAAAAAAqwDICAAAXAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-31T02:17:00.82Z",
              "WhenOpened": "2025-09-11T07:45:44.976Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "ImportExcelHelper.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\Utilities\\ImportExcelHelper.cs",
              "ViewState": "AgIAAFQAAAAAAAAAAAAQwAsBAAAJAAAAAAAAAA==",
              "Title": "AGVController.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\AGV\\AGVController.cs",
              "ViewState": "AgIAABkCAAAAAAAAAADgv64BAABqAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-31T01:25:32.766Z",
              "WhenOpened": "2025-09-16T01:12:14.478Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "Dt_PackaxisService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "RelativeToolTip": "WIDESEAWCS_PackInfoService\\Dt_PackaxisService.cs",
              "ViewState": "AgIAAG0AAAAAAAAAAAAUwIQAAAAtAAAAAAAAAA==",
              "DocumentIndex": 4,
              "Title": "AGV_CPJob.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u6210\u54C1\u4ED3\\AGV_CPJob.cs",
              "ViewState": "AgIAAAwAAAAAAAAAAADwvyQAAAAVAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-31T01:15:08.521Z",
              "WhenOpened": "2025-09-15T05:56:57.868Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "MDJob_CP.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u7801\u579B\\MDJob_CP.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAHQAAABYAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-12T06:32:50.674Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "WarehouseHostedService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\HostedService\\WarehouseHostedService.cs",
              "ViewState": "AgIAAAMAAAAAAAAAAAAAAA4AAAAiAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-15T01:20:30.887Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "CoveryorJobYL.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u63A5\u9A73\u53F0\\CoveryorJobYL.cs",
              "ViewState": "AgIAAEcAAAAAAAAAAAAQwE8AAAAlAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-15T05:42:55.802Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 12,
              "Title": "Program.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Program.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\Program.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
              "ViewState": "AgIAABIAAAAAAAAAAAAAAC4AAAAhAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-14T01:30:09.425Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 11,
              "Title": "WebSocketSetup.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\HostedService\\WebSocketSetup.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwcAAAAsAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-14T01:29:56.948Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 13,
              "Title": "ConveyorLineTaskCommand.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\ConveyorLineTaskCommand.cs",
              "ViewState": "AgIAALgBAAAAAAAAAIA6wNQBAAAbAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-12T05:22:37.131Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 14,
              "Title": "EquipmentDTO.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "RelativeToolTip": "WIDESEAWCS_DTO\\Equipment\\EquipmentDTO.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwgAAAAdAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-14T02:49:56.33Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 15,
              "Title": "StackerCraneJob_YLSC2.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WCSServices\\WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\\u539F\u6599\u5E93\\StackerCraneJob_YLSC2.cs",
              "ViewState": "AgIAAIAAAAAAAAAAAAAYwIsAAAAqAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T08:12:55.606Z"
            }
          ]
        }
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -104,6 +104,12 @@
        MD_Executing = 520,
        /// <summary>
        /// å ç›˜å¾…执行
        /// </summary>
        [Description("叠盘待执行")]
        StackPlate_Execute = 600,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        [Description("任务完成")]
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -112,6 +112,12 @@
        PaperYLBackInbound = 730,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚é€€åº“
        /// </summary>
        [Description("原料老厂退库")]
        PaperOldYLBackInbound = 740,
        /// <summary>
        /// å··é“内移库
        /// </summary>
        [Description("巷道内移库")]
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Equipment/EquipmentDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Equipment
{
    public class EquipmentDTO
    {
        public string StackerDataJson { get; set; }
        public string ConveyorLineDataJson { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -97,6 +97,14 @@
        WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress, string roadWay="", int taskType = 630,int taskNum=0,string targetAddress="");
        /// <summary>
        /// å ç›˜æœºç”³è¯·ç©ºæ‰˜å…¥æˆå“åº“
        /// </summary>
        /// <param name="palletCode"></param>
        /// <param name="SourceAddress"></param>
        /// <returns></returns>
        WebResponseContent CPEmptyInbound(string palletCode, string SourceAddress);
        /// <summary>
        /// å‘WMS申请任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -20,6 +20,7 @@
using WIDESEAWCS_Tasks;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_Tasks.DBNames;
using WIDESEAWCS_Tasks.StackPlateJob;
using static Dm.net.buffer.ByteArrayBuffer;
namespace WIDESEAWCS_Server.Controllers
@@ -54,6 +55,10 @@
            AgvResponse agvResponse = new AgvResponse();
            try
            {
                if (secureApplyModel.ReceiveTaskID=="100")
                {
                    return agvResponse.OK("成功", "0");
                }
                var task = _taskRepository.QueryFirst(x => secureApplyModel.ReceiveTaskID.ObjToInt() == x.TaskNum);
                if (task == null) throw new Exception("未找到任务");
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
@@ -325,60 +330,76 @@
                {
                    return content.Error($"未找到对应设备");
                }
                if (device.DeviceCode.Contains("Plate"))
                {
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    StackPlateTaskCommandCommand command = commonConveyorLine.ReadCustomer<StackPlateTaskCommandCommand>(device.DeviceCode);
                OtherDevice otherDevice = (OtherDevice)device;
                    if (command != null && command.State == 2 && command.InteractiveSignal == 1)
                    {
                        return content.OK("允许放料");
                    }
                    else
                    {
                        return content.Error("禁止放料");
                    }
                }
                else
                {
                if (device.DeviceCode.Contains("CP"))//成品输送线
                {
                    short Command = otherDevice.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode);
                    if (Command == 3)
                    OtherDevice otherDevice = (OtherDevice)device;
                    if (device.DeviceCode.Contains("CP"))//成品输送线
                    {
                        content.OK("允许放料");
                        short Command = otherDevice.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode);
                        if (Command == 3)
                        {
                            content.OK("允许放料");
                        }
                        else
                        {
                            return content.Error("禁止放料");
                        }
                    }
                    else
                    else if (device.DeviceCode.Contains("Coveryor"))//接驳台
                    {
                        return content.Error("禁止放料");
                        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_RequestPut, true, stationManger.StationDeviceCode);
                            Thread.Sleep(1000);
                        }
                        bool AllowFinish = otherDevice.GetValue<CoveryorDB, bool>(CoveryorDB.C_AllowFinish, stationManger.StationDeviceCode);
                        if (AllowFinish)
                        {
                            content.OK("允许放料");
                        }
                        else
                        {
                            return content.Error("禁止放料");
                        }
                    }
                    else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                    {
                        bool RequestPut = otherDevice.GetValue<RetractDB, bool>(RetractDB.Ret_RequestPut, stationManger.StationDeviceCode);
                        if (!RequestPut)
                        {
                            otherDevice.SetValue(RetractDB.Ret_TargetAddress, Convert.ToInt16(stationManger.StationCode), stationManger.StationDeviceCode);
                            otherDevice.SetValue(RetractDB.Ret_RequestPut, true, stationManger.StationDeviceCode);
                            Thread.Sleep(1000);
                        }
                        bool AllowFinish = otherDevice.GetValue<RetractDB, bool>(RetractDB.Ret_AllowFinish, stationManger.StationDeviceCode);
                        if (AllowFinish)
                        {
                            content.OK("允许放料");
                        }
                        else
                        {
                            return content.Error("禁止放料");
                        }
                    }
                }
                else if (device.DeviceCode.Contains("Coveryor"))//接驳台
                {
                    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_RequestPut, true, stationManger.StationDeviceCode);
                        Thread.Sleep(1000);
                    }
                    bool AllowFinish = otherDevice.GetValue<CoveryorDB, bool>(CoveryorDB.C_AllowFinish, stationManger.StationDeviceCode);
                    if (AllowFinish)
                    {
                        content.OK("允许放料");
                    }
                    else
                    {
                        return content.Error("禁止放料");
                    }
                }
                else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                {
                    bool RequestPut = otherDevice.GetValue<RetractDB, bool>(RetractDB.Ret_RequestPut, stationManger.StationDeviceCode);
                    if (!RequestPut)
                    {
                        otherDevice.SetValue(RetractDB.Ret_TargetAddress, Convert.ToInt16(stationManger.StationCode), stationManger.StationDeviceCode);
                        otherDevice.SetValue(RetractDB.Ret_RequestPut, true, stationManger.StationDeviceCode);
                        Thread.Sleep(1000);
                    }
                    bool AllowFinish = otherDevice.GetValue<RetractDB, bool>(RetractDB.Ret_AllowFinish, stationManger.StationDeviceCode);
                    if (AllowFinish)
                    {
                        content.OK("允许放料");
                    }
                    else
                    {
                        return content.Error("禁止放料");
                    }
                }
                return content;
            }
            catch (Exception ex)
@@ -408,15 +429,23 @@
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备");
                }
                OtherDevice otherDevice = (OtherDevice)device;
                if (device.DeviceCode.Contains("Coveryor"))//接驳台
                if (device.DeviceCode.Contains("Plate"))
                {
                    otherDevice.SetValue(CoveryorDB.C_PutFinish, true, stationManger.StationDeviceCode);
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    commonConveyorLine.SetValue(StackPlateDBName.WriteInteractiveSignal, Convert.ToInt16(1), device.DeviceCode);
                    return WebResponseContent.Instance.OK();
                }
                else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                else
                {
                    otherDevice.SetValue(RetractDB.Ret_PutFinish, true, stationManger.StationDeviceCode);
                    OtherDevice otherDevice = (OtherDevice)device;
                    if (device.DeviceCode.Contains("Coveryor"))//接驳台
                    {
                        otherDevice.SetValue(CoveryorDB.C_PutFinish, true, stationManger.StationDeviceCode);
                    }
                    else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                    {
                        otherDevice.SetValue(RetractDB.Ret_PutFinish, true, stationManger.StationDeviceCode);
                    }
                }
                return WebResponseContent.Instance.OK();
            }
@@ -448,46 +477,61 @@
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备{stationManger.StationDeviceCode}");
                }
                OtherDevice otherDevice = (OtherDevice)device;
                if (otherDevice.DeviceCode.Contains("CP"))//成品输送线
                if (device.DeviceCode.Contains("Plate"))
                {
                    short Command = otherDevice.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode);
                    if (Command == 2)
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    StackPlateTaskCommandCommand command = commonConveyorLine.ReadCustomer<StackPlateTaskCommandCommand>(device.DeviceCode);
                    if (command != null&&command.State == 2 && command.InteractiveSignal == 2)
                    {
                        content.OK("允许取料");
                        return content.OK("允许取料");
                    }
                    else
                    {
                        return content.Error("禁止取料");
                    }
                }
                else if (device.DeviceCode.Contains("Coveryor"))//接驳台
                else
                {
                    bool AllowTake = otherDevice.GetValue<CoveryorDB, bool>(CoveryorDB.C_AllowTake, stationManger.StationDeviceCode);
                    if (AllowTake)
                    {
                        content.OK("允许取料");
                    }
                    else
                    {
                        return content.Error("禁止取料");
                    }
                }
                else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                {
                    bool AllowTake = otherDevice.GetValue<RetractDB, bool>(RetractDB.Ret_AllowTake, stationManger.StationDeviceCode);
                    if (AllowTake)
                    {
                        content.OK("允许取料");
                    }
                    else
                    {
                        return content.Error("禁止取料");
                    }
                }
                    OtherDevice otherDevice = (OtherDevice)device;
                    if (otherDevice.DeviceCode.Contains("CP"))//成品输送线
                    {
                        short Command = otherDevice.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode);
                        if (Command == 2)
                        {
                            content.OK("允许取料");
                        }
                        else
                        {
                            return content.Error("禁止取料");
                        }
                    }
                    else if (device.DeviceCode.Contains("Coveryor"))//接驳台
                    {
                        bool AllowTake = otherDevice.GetValue<CoveryorDB, bool>(CoveryorDB.C_AllowTake, stationManger.StationDeviceCode);
                        if (AllowTake)
                        {
                            content.OK("允许取料");
                        }
                        else
                        {
                            return content.Error("禁止取料");
                        }
                    }
                    else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                    {
                        bool AllowTake = otherDevice.GetValue<RetractDB, bool>(RetractDB.Ret_AllowTake, stationManger.StationDeviceCode);
                        if (AllowTake)
                        {
                            content.OK("允许取料");
                        }
                        else
                        {
                            return content.Error("禁止取料");
                        }
                    }
                }
                return content;
            }
            catch (Exception ex)
@@ -517,19 +561,27 @@
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备");
                }
                OtherDevice otherDevice = (OtherDevice)device;
                if (device.DeviceCode.Contains("CP"))
                if (device.DeviceCode.Contains("Plate"))
                {
                    otherDevice.SetValue(W_ConveyorLineCPDB.W_Command, 2, stationManger.StationCode);
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    commonConveyorLine.SetValue(StackPlateDBName.WriteInteractiveSignal, Convert.ToInt16(2), device.DeviceCode);
                    return WebResponseContent.Instance.OK();
                }
                else if (device.DeviceCode.Contains("Coveryor"))
                else
                {
                    otherDevice.SetValue(CoveryorDB.C_TakeFinish, true, stationManger.StationDeviceCode);
                }
                else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                {
                    otherDevice.SetValue(RetractDB.Ret_TakeFinish, true, stationManger.StationDeviceCode);
                    OtherDevice otherDevice = (OtherDevice)device;
                    if (device.DeviceCode.Contains("CP"))
                    {
                        otherDevice.SetValue(W_ConveyorLineCPDB.W_Command, 2, stationManger.StationCode);
                    }
                    else if (device.DeviceCode.Contains("Coveryor"))
                    {
                        otherDevice.SetValue(CoveryorDB.C_TakeFinish, true, stationManger.StationDeviceCode);
                    }
                    else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                    {
                        otherDevice.SetValue(RetractDB.Ret_TakeFinish, true, stationManger.StationDeviceCode);
                    }
                }
                return WebResponseContent.Instance.OK();
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Filter/CustomProfile.cs
@@ -27,7 +27,8 @@
            CreateMap<Dt_Task, ConveyorLineTaskCommandWrite>()
                .ForMember(a => a.Barcode, b => b.MapFrom(b => b.PalletCode))
                .ForMember(a => a.TaskNum, b => b.MapFrom(b => b.TaskNum))
                .ForMember(a => a.Weight, b => b.MapFrom(b => b.TaskLength))
                .ForMember(a => a.Width, b => b.MapFrom(b => b.TaskLength))
                .ForMember(a => a.Height, b => b.MapFrom(b => b.HeightType))
                .ForMember(a => a.TargetAddress, b => b.MapFrom(b => b.NextAddress));
        }
    }
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Program.cs
@@ -53,7 +53,7 @@
builder.Services.AddHostedService<WarehouseHostedService>();
builder.Services.AddHostedService<QuartzJobDataTableHostedService>();
//builder.Services.AddWebSocketSetup();
builder.Services.AddWebSocketSetup();
builder.Services.AddAutoMapperSetup();
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile3.pubxml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
  <PropertyGroup>
    <DeleteExistingFiles>false</DeleteExistingFiles>
    <ExcludeApp_Data>false</ExcludeApp_Data>
    <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <PublishProvider>FileSystem</PublishProvider>
    <PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <_TargetId>Folder</_TargetId>
  </PropertyGroup>
</Project>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/appsettings.json
@@ -14,10 +14,10 @@
  //连接字符串
  //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=192.168.35.3;Initial Catalog=TestWCS_TC;User ID=sa;Password=Sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=TESTWCSCP_WCS;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"WMSConnectionStrings": "Data Source=10.30.4.92;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -320,6 +320,10 @@
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
                else
                {
                    content = responseContent ?? content.Error("结果错误");
                }
            }
            catch (Exception ex)
@@ -458,7 +462,26 @@
            }
            return content;
        }
        public WebResponseContent CPEmptyInbound(string palletCode,string SourceAddress)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                var result = HttpHelper.Get($"{address}/api/Task/EmptyBackTask?barCode={palletCode}&startPoint={SourceAddress}");
                content = JsonConvert.DeserializeObject<WebResponseContent>(result);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// 
        /// </summary>
@@ -761,7 +784,7 @@
        public Dt_Task QueryBarCodeAGVFinishTask(int TaskNum, string currentAddress)
        {
            return BaseDal.QueryFirst(x => TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskStatusEnum.AGV_Finish && x.NextAddress == currentAddress && x.TaskNum == TaskNum, TaskOrderBy);
            return BaseDal.QueryFirst(x => TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskStatusEnum.AGV_Finish && x.CurrentAddress == currentAddress && x.TaskNum == TaskNum, TaskOrderBy);
        }
        public Dt_Task QueryExecutingTaskByBarcode(int TaskNum, string nextAddress)
@@ -784,8 +807,14 @@
                {
                    if (task.TaskState == (int)TaskStatusEnum.SC_Executing)
                    {
                        Dt_Router router = _routerRepository.QueryFirst(x => x.InOutType == task.TaskType && x.StartPosi == stationManger.StationCode && x.ChildPosi == stationManger.StationDeviceCode);
                        if (router == null)
                        {
                            UpdateTaskExceptionMessage(task.TaskNum, $"未找到路由信息,{task.NextAddress}");
                            return WebResponseContent.Instance.Error($"未找到路由信息,{task.NextAddress}");
                        }
                        task.CurrentAddress = task.NextAddress;
                        task.NextAddress = task.TargetAddress;
                        task.NextAddress = router.NextPosi;
                        task.TaskState = (int)TaskStatusEnum.Line_Executing;
                        nextStatus = TaskStatusEnum.Line_Executing;
                    }
@@ -801,7 +830,7 @@
                    {
                        #region å…¥åº“调用接口获取货位地址
                        string? local = RequestAssignLocation(task.TaskNum, task.Roadway);
                        //string? local = "SC05_YLDual-002-090-009-01";
                        //string? local = "SC03_YLDual-002-090-001-01";
                        if (!string.IsNullOrEmpty(local))
                        {
                            task.CurrentAddress = stationManger.StackerCraneStationCode;
@@ -821,11 +850,11 @@
                    else if (task.TaskState == (int)TaskStatusEnum.AGV_Finish)
                    {
                        content = AssignYLRoadwayNo(task.PalletCode);
                        //content.OK(data: "SC05_YLDual");
                        if (!content.Status)
                        {
                            return content.Error($"请求入库失败:{content.Message}");
                        }
                        //string roadWay = "SC03_YLDual";
                        string roadWay = content.Data.ToString();
                        List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi && x.ChildPosiDeviceCode == roadWay);
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs
@@ -456,7 +456,7 @@
    public class ConveyorLineTaskCommandWrite : DeviceCommand
    {
        public ushort ResponState { get; set; }
        public ushort ResponState { get; set; } = 86;
        [DataLength(25)]
        public string Barcode { get; set; }
@@ -465,7 +465,8 @@
        public short TaskNum { get; set; }
        public short Weight { get; set; }
        public short Width { get; set; }
        public short Height { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/ConveyorLineJob/W_CLineCPHDBName.cs
@@ -20,10 +20,23 @@
        /// </summary>
        W_Channel,
        /// <summary>
        /// é•¿
        /// </summary>
        W_Long,
        /// <summary>
        /// å®½
        /// </summary>
        W_Wide,
        /// <summary>
        /// é«˜
        /// </summary>
        W_High,
        /// <summary>
        /// è¯·æ±‚确认<br/>
        /// 1:任务下发<br/>
        /// 2:清除确认<br/>
        /// </summary>
        W_Request
        W_Request,
        W_TMID,
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/ApartPlate.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
using Autofac.Core;
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using Quartz;
using System.Reflection;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IPackInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_Tasks.StackPlateJob;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class ApartPlate : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskRepository _taskRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IDt_PackaxisRepository _packaxisRepository;
        public ApartPlate(ICacheService cacheService, ITaskService taskService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IDt_PackaxisRepository packaxisRepository)
        {
            _cacheService = cacheService;
            _taskService = taskService;
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _packaxisRepository = packaxisRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            CommonConveyorLine device = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams");
            //获取当前设备对应的站台
            StackPlateTaskCommandCommand command = device.ReadCustomer<StackPlateTaskCommandCommand>(device.DeviceCode);
            if (command != null && command.State == 2)
            {
                DeviceProtocolDetailDTO? deviceProtocolDetails = device.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackPlateTaskCommandCommand.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString());
                if (deviceProtocolDetails != null)
                {
                    MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType);
                    if (method != null)
                    {
                        method.Invoke(this, new object[] { device, command });
                    }
                }
            }
            return Task.CompletedTask;
        }
        /// <summary>
        /// æœ‰æ–™å…è®¸
        /// </summary>
        /// <param name="device"></param>
        /// <param name="command"></param>
        public void InStockAllow(CommonConveyorLine device, StackPlateTaskCommandCommand command)
        {
            device.SetValue(StackPlateDBName.WriteInteractiveSignal, Convert.ToInt16(2), device.DeviceCode);
            //分配已拆分空托盘去向任务
        }
        /// <summary>
        /// ç©ºä½å…è®¸ï¼Œå…è®¸æ‹†ç›˜
        /// </summary>
        /// <param name="device"></param>
        /// <param name="command"></param>
        public void EmptySeatAllow(CommonConveyorLine device, StackPlateTaskCommandCommand command)
        {
            var task = _taskRepository.QueryFirst(x => x.Roadway == device.DeviceCode && x.TargetAddress == device.DeviceCode);
            if (task == null)
            {
                //todo请求WMS下发空托出库任务
            }
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/StackPlate.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
using Autofac.Core;
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using Quartz;
using System.Reflection;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IPackInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_Tasks.StackPlateJob;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class StackPlate : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskRepository _taskRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IDt_PackaxisRepository _packaxisRepository;
        public StackPlate(ICacheService cacheService, ITaskService taskService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IDt_PackaxisRepository packaxisRepository)
        {
            _cacheService = cacheService;
            _taskService = taskService;
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _packaxisRepository = packaxisRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            CommonConveyorLine device = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams");
            //获取当前设备对应的站台
            StackPlateTaskCommandCommand command = device.ReadCustomer<StackPlateTaskCommandCommand>(device.DeviceCode);
            if (command != null && command.State == 2)
            {
                DeviceProtocolDetailDTO? deviceProtocolDetails = device.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackPlateTaskCommandCommand.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString());
                if (deviceProtocolDetails != null)
                {
                    MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType);
                    if (method != null)
                    {
                        method.Invoke(this, new object[] { device, command });
                    }
                }
            }
            return Task.CompletedTask;
        }
        /// <summary>
        /// æœ‰æ–™è¿è¡Œï¼Œç”³è¯·å…¥åº“
        /// </summary>
        /// <param name="device"></param>
        /// <param name="command"></param>
        public void InStockAllow(CommonConveyorLine device, StackPlateTaskCommandCommand command)
        {
            var station = _stationMangerRepository.QueryFirst(x => x.StationDeviceCode == device.DeviceCode);
            if (station != null && station.Remark != null)//获取站台里面的托盘号
            {
                var task = _taskRepository.QueryFirst(x => x.DeviceCode == device.DeviceCode && (x.TaskState == (int)TaskStatusEnum.AGV_Execute || x.TaskState == (int)TaskStatusEnum.AGV_Executing) && x.SourceAddress == station.AGVStationCode);
                if (task == null)
                {
                    WebResponseContent content = _taskService.CPEmptyInbound(station.Remark, station.AGVStationCode);
                }
            }
        }
        /// <summary>
        /// ç©ºä½è¿è¡Œï¼Œå…è®¸å ç›˜
        /// </summary>
        /// <param name="device"></param>
        /// <param name="command"></param>
        public void EmptySeatAllow(CommonConveyorLine device, StackPlateTaskCommandCommand command)
        {
            var station = _stationMangerRepository.QueryFirst(x => x.StationDeviceCode == device.DeviceCode);
            var tasks = _taskRepository.QueryData(x => x.Roadway == device.DeviceCode && (x.TaskState == (int)TaskStatusEnum.AGV_Execute || x.TaskState == (int)TaskStatusEnum.AGV_Executing) && x.TargetAddress == device.DeviceCode);
            if (tasks.Count + Convert.ToInt32(command.Num) < 9)
            {
                var task = _taskRepository.QueryFirst(x => x.Roadway == device.DeviceCode && x.TaskState == (int)TaskStatusEnum.StackPlate_Execute);
                if (task != null && station != null)
                {
                    task.TaskState = (int)TaskStatusEnum.AGV_Execute;
                    _taskRepository.UpdateData(task);
                    station.Remark = task.PalletCode;
                    _stationMangerRepository.UpdateData(station);
                }
            }
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/StackPlateDBName.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Tasks.StackPlateJob
{
    public enum StackPlateDBName
    {
        WriteInteractiveSignal,
        InteractiveSignal,
        State
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/StackPlateJob/StackPlateTaskCommand.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_Tasks.ConveyorLineJob
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using WIDESEAWCS_QuartzJob.DeviceBase;
namespace WIDESEAWCS_Tasks.StackPlateJob
{
    public class StackPlateTaskCommandCommand : DeviceCommand
    {
        public short Num { get; set; }
        public short State { get; set; }
        public short InteractiveSignal { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/ConveyorLineJob_YL2ndFloor.cs
@@ -109,7 +109,6 @@
                if(task != null)
                {
                    ConveyorLineTaskCommandWrite taskCommand = _mapper.Map<ConveyorLineTaskCommandWrite>(task);
                    bool sendFlag = SendCommand(taskCommand, conveyorLine, stationManger.StationCode);
                    if (sendFlag)
                    {
@@ -138,7 +137,7 @@
        public void ConveyorLineInFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManger stationManger)
        {
            var task = _taskService.QueryExecutingTaskByBarcode(command.TaskNum, stationManger.StationCode);
            if (task != null && task.TaskState != (int)TaskStatusEnum.Line_Finish)
            if (task != null && task.TaskState != (int)TaskStatusEnum.SC_Execute)
            {
                WebResponseContent content = _taskService.UpdateTaskStatusToNext(task, stationManger);
@@ -154,45 +153,55 @@
        {
            conveyorLine.SetValue(ConveyorLineDBName.TaskNum, taskCommand.TaskNum, childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, taskCommand.TargetAddress, childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.Weight, taskCommand.Weight, childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.Width, taskCommand.Width, childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.Height, taskCommand.Height, childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.Barcode, taskCommand.Barcode, childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.ResponState, 86, childDeviceCode);
            for (int i = 0; i < 6; i++)
            {
                ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(childDeviceCode);
                if (command != null)
                {
                    if (command.TaskNum == taskCommand.TaskNum && command.TargetAddress == taskCommand.TargetAddress && command.Weight == taskCommand.Weight && command.Barcode == taskCommand.Barcode)
                    {
                        WriteInfo(conveyorLine.DeviceName, $"时间:【{DateTime.Now}】写入任务成功写入次数{i}写入任务【{JsonConvert.SerializeObject(taskCommand)}】");
                        return true;
                    }
                    if (command.TaskNum != taskCommand.TaskNum)
                    {
                        conveyorLine.SetValue(ConveyorLineDBName.TaskNum, taskCommand.TaskNum, childDeviceCode);
                        Thread.Sleep(100);
                    }
                    if (command.Barcode != taskCommand.Barcode)
                    {
                        conveyorLine.SetValue(ConveyorLineDBName.Barcode, taskCommand.Barcode, childDeviceCode);
                        Thread.Sleep(100);
                    }
                    if (command.TaskNum != taskCommand.TaskNum)
                    {
                        conveyorLine.SetValue(ConveyorLineDBName.TaskNum, taskCommand.TaskNum, childDeviceCode);
                        Thread.Sleep(100);
                    }
                    if (command.TargetAddress != taskCommand.TargetAddress)
                    {
                        conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, taskCommand.TargetAddress, childDeviceCode);
                        Thread.Sleep(100);
                    }
                }
                conveyorLine.SetValue(ConveyorLineDBName.ResponState, 86, childDeviceCode);
            }
            WriteInfo(conveyorLine.DeviceName, $"时间:【{DateTime.Now}】写入任务成功任务号【{taskCommand.TaskNum}】托盘号【{taskCommand.Barcode}】目标地址【{taskCommand.TargetAddress}】当前节点【{childDeviceCode}】");
            return false;
            return true;
            #region éœ€è¦æ ¡éªŒè‡ªå·±å–消注释
            //for (int i = 0; i < 6; i++)
            //{
            //    ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(childDeviceCode);
            //    if (command != null)
            //    {
            //        if (command.TaskNum == taskCommand.TaskNum && command.TargetAddress == taskCommand.TargetAddress && command.Height == taskCommand.Height && command.Width == taskCommand.Width && command.Barcode == taskCommand.Barcode)
            //        {
            //            WriteInfo(conveyorLine.DeviceName, $"时间:【{DateTime.Now}】写入任务成功写入次数{i}写入任务【{JsonConvert.SerializeObject(taskCommand)}】");
            //            return true;
            //        }
            //        if (command.TaskNum != taskCommand.TaskNum)
            //        {
            //            conveyorLine.SetValue(ConveyorLineDBName.TaskNum, taskCommand.TaskNum, childDeviceCode);
            //            Thread.Sleep(100);
            //        }
            //        if (command.Barcode != taskCommand.Barcode)
            //        {
            //            conveyorLine.SetValue(ConveyorLineDBName.Barcode, taskCommand.Barcode, childDeviceCode);
            //            Thread.Sleep(100);
            //        }
            //        if (command.Height != taskCommand.Height)
            //        {
            //            conveyorLine.SetValue(ConveyorLineDBName.Height, taskCommand.Height, childDeviceCode);
            //            Thread.Sleep(100);
            //        }
            //        if (command.Width != taskCommand.Width)
            //        {
            //            conveyorLine.SetValue(ConveyorLineDBName.Width, taskCommand.Width, childDeviceCode);
            //            Thread.Sleep(100);
            //        }
            //        if (command.TargetAddress != taskCommand.TargetAddress)
            //        {
            //            conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, taskCommand.TargetAddress, childDeviceCode);
            //            Thread.Sleep(100);
            //        }
            //    }
            //    conveyorLine.SetValue(ConveyorLineDBName.ResponState, 86, childDeviceCode);
            //}
            //WriteInfo(conveyorLine.DeviceName, $"时间:【{DateTime.Now}】写入任务成功任务号【{taskCommand.TaskNum}】托盘号【{taskCommand.Barcode}】目标地址【{taskCommand.TargetAddress}】当前节点【{childDeviceCode}】");
            //return false;
            #endregion
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/ConveyorLineJob_YLOld.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class ConveyorLineJob_YLOld : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IRouterRepository _routerRepository;
        private readonly IRouterService _routerService;
        private readonly IRouterExtension _routerExtension;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
        public ConveyorLineJob_YLOld(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension)
        {
            _cacheService = cacheService;
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _routerRepository = routerRepository;
            _routerService = routerService;
            _routerExtension = routerExtension;
            string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
            if (!string.IsNullOrEmpty(warehouseDevicesStr))
            {
                warehouseDevices = JsonConvert.DeserializeObject<List<Dt_WarehouseDevice>>(warehouseDevicesStr) ?? new List<Dt_WarehouseDevice>();
            }
            else
            {
                warehouseDevices = new List<Dt_WarehouseDevice>();
            }
        }
        public Task Execute(IJobExecutionContext context)
        {
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                //获取所有协议的输送线站台
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                {
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(WR_CLineYLDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    if (deviceProRead != null)
                    {
                        R_ConveyorLineYLInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineYLInfo>(deviceProRead.DeviceProAddress);
                        if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 86 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID)) //老厂申请入库
                        {
                            WebResponseContent content = _taskService.YLPurchaseBoxing(conveyorLineInfoRead.WR_TMID);
                            if (content.Status)
                            {
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                WriteInfo(item.StationCode, $"请求退料条码:{conveyorLineInfoRead.WR_TMID}");
                            }
                            else
                            {
                                WriteError(item.StationCode, $"请求退料失败:{content.Message}");
                            }
                        }
                    }
                    else
                    {
                        WriteError(item.StationName, $"未找到设备子编号{item.StationCode}的协议信息");
                    }
                }
            }
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/StackerCraneJob_YLSC2.cs
@@ -253,6 +253,11 @@
                        _taskRepository.UpdateData(task);
                        return task;
                    }
                    else
                    {
                        task.ExceptionMessage = "出库站台无法下发";
                        _taskRepository.UpdateData(task);
                    }
                }
                else
                {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/StackerCraneJob_YLSC3.cs
@@ -20,9 +20,11 @@
using WIDESEAWCS_Tasks.StackerCraneJob;
using WIDESEAWCS_Tasks;
using WIDESEAWCS_Core;
using SqlSugar.Extensions;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_Core.Helper;
using HslCommunication.WebSocket;
using WIDESEAWCS_DTO.Equipment;
namespace WIDESEAWCS_Tasks
{
@@ -36,8 +38,9 @@
        private readonly IRouterService _routerService;
        private readonly IRouterRepository _routerRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private WebSocketServer _webSocketServer;
        public StackerCraneJob_YLSC3(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository)
        public StackerCraneJob_YLSC3(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository,WebSocketServer webSocketServer)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -45,6 +48,7 @@
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _routerRepository = routerRepository;
            _webSocketServer = webSocketServer;
        }
        public Task Execute(IJobExecutionContext context)
@@ -76,8 +80,7 @@
                                        commonStackerCrane.LastTaskType = task.TaskType;
                                        task.Dispatchertime = DateTime.Now;
                                        task.ExceptionMessage = "";
                                        _taskService.UpdateTask(task, TaskStatusEnum.SC_Executing);
                                        //_taskService.UpdateTaskStatusToNext(task);
                                        _taskService.UpdateTaskStatusToNext(task);
                                        commonStackerCrane.Communicator.Write("DB1000.20.0", true);
                                        //延时1s
                                        Thread.Sleep(1000);
@@ -86,6 +89,25 @@
                            }
                        }
                    }
                    #region è°ƒç”¨äº‹ä»¶æ€»çº¿é€šçŸ¥å‰ç«¯
                    EquipmentDTO equipmentDTO = new EquipmentDTO();
                    object obj = new
                    {
                        commonStackerCrane.DeviceName,
                        commonStackerCrane.DeviceCode,
                        StackerCraneAutoStatus.Automatic,
                        StackerCraneStatus.Normal,
                        StackerCraneWorkStatus.Standby,
                        TaskNum = commonStackerCrane.CurrentTaskNum,
                        WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType),
                        StackerAlarm = commonStackerCrane.Communicator.Read<short>("DB1000.54.0"),
                    };
                    equipmentDTO.StackerDataJson = obj.Serialize();
                    _webSocketServer.PublishAllClientPayload(equipmentDTO.Serialize());
                    #endregion
                }
            }
            catch (Exception ex)
@@ -153,6 +175,7 @@
                                conveyorLine.SetValue(ConveyorLineDBName.TaskNum, taskNum, stationManger.StationCode);
                                conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, router.NextPosi, stationManger.StationCode);
                                conveyorLine.SetValue(ConveyorLineDBName.Width, task.TaskLength, stationManger.StationCode);
                                conveyorLine.SetValue(ConveyorLineDBName.Height, task.HeightType, stationManger.StationCode);
                                conveyorLine.SetValue(ConveyorLineDBName.Barcode, task.PalletCode, stationManger.StationCode);
                                conveyorLine.SetValue(ConveyorLineDBName.ResponState, 86, stationManger.StationCode);
                                _taskService.UpdateTaskStatusToNext(task);
@@ -282,6 +305,11 @@
                            _taskRepository.UpdateData(task);
                            return task;
                        }
                        else
                        {
                            task.ExceptionMessage = "出库站台无法下发";
                            _taskRepository.UpdateData(task);
                        }
                    }
                    else
                    {
@@ -300,6 +328,11 @@
                            task.NextAddress = stationManger.StackerCraneStationCode;
                            _taskRepository.UpdateData(task);
                            return task;
                        }
                        else
                        {
                            task.ExceptionMessage = "出库站台无法下发";
                            _taskRepository.UpdateData(task);
                        }
                    }
                    else
@@ -327,9 +360,9 @@
        {
            YLStackerCraneTaskCommand stackerCraneTaskCommand = new YLStackerCraneTaskCommand();
            stackerCraneTaskCommand.PalletType = Convert.ToInt16(task.PalletType);
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 5;
            stackerCraneTaskCommand.PalletType = Convert.ToInt16(task.PalletType);
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
@@ -364,9 +397,9 @@
                string[] targetCodes = task.NextAddress.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]);
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
                }
                else
                {
@@ -377,9 +410,9 @@
                string[] sourceCodes = task.CurrentAddress.Split("-");
                if (sourceCodes.Length == 5)
                {
                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]);
                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]);
                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]);
                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]);
                }
                else
                {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/Task/RequestInbound.cs
@@ -39,13 +39,11 @@
        {
            try
            {
                if (command.Barcode.IsNullOrEmpty()) return;
                var AGVFinishTask = _taskService.QueryBarCodeAGVFinishTask(command.TaskNum, stationManager.StationCode);
                if (AGVFinishTask == null)
                {
                    var log = $"时间:【{DateTime.Now}】【{conveyorLine.DeviceName}】托盘号:【{command.Barcode}】任务号:【{command.TaskNum}】设备编码:【{stationManager.StationCode}】【未找到任务】";
                    ConsoleHelper.WriteSuccessLine(log);
                    ConsoleHelper.WriteErrorLine(log);
                    WriteInfo(conveyorLine.DeviceName, log);
                    return;
@@ -61,7 +59,6 @@
                        bool sendFlag = SendCommand(taskCommand, conveyorLine, stationManager.StationCode);
                        if (sendFlag)
                        {
                            //_taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                            _taskService.UpdateTaskStatusToNext(ExecuteTask, stationManager);
                        }
                    }
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/ConveyorLineJob_CPH.cs
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using Org.BouncyCastle.Tls;
using Quartz;
using SqlSugar.Extensions;
using System;
@@ -39,6 +40,7 @@
        private readonly IRouterService _routerService;
        private readonly IRouterExtension _routerExtension;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
        private static object lockObj = 0;//
        public ConveyorLineJob_CPH(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension)
        {
@@ -64,53 +66,87 @@
        public Task Execute(IJobExecutionContext context)
        {
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            lock (lockObj)
            {
                //获取当前设备
                OtherDevice device = (OtherDevice)value;
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).Distinct().ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                if (lockObj.ToString()=="0")
                {
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_CLineCPHDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(W_CLineCPHDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && deviceProRead != null && deviceProWrite != null)
                    lockObj = 1;
                    Task task = Task.Run(() =>
                    {
                        R_CLineCPHInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_CLineCPHInfo>(deviceProRead.DeviceProAddress);
                        //码垛环线请求任务
                        if (conveyorLineInfoRead != null && (conveyorLineInfoRead.R_State == 2 || conveyorLineInfoRead.R_State == 3) && conveyorLineInfoRead.R_TaskNo <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.R_BoxCode) && conveyorLineInfoRead.R_Request==1)
                        try
                        {
                            //WebResponseContent content = _taskService.RequestWMSTaskSimple(conveyorLineInfoRead.R_BoxCode, item.StationCode);
                            ////向WMS请求任务
                            //if (true)
                            //{
                            //}
                        }
                    }
                    else if(item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt() && deviceProRead != null)
                    {
                        R_CLineCPHInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_CLineCPHInfo>(deviceProRead.DeviceProAddress);
                        //获取码垛口任务更新任务状态
                        if (conveyorLineInfoRead != null && (conveyorLineInfoRead.R_State == 2 || conveyorLineInfoRead.R_State == 3) && conveyorLineInfoRead.R_TaskNo > 0)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.R_TaskNo && x.NextAddress==item.StationCode && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt());
                            if (task != null)
                            while (true)
                            {
                                task.CurrentAddress = item.StationCode;
                                task.NextAddress = task.TargetAddress;
                                task.DeviceCode = item.StackerCraneCode;
                                _taskService.UpdateTask(task, TaskStatusEnum.MD_Executing);
                                bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
                                if (flag && value != null)
                                {
                                    //获取当前设备
                                    OtherDevice device = (OtherDevice)value;
                                    List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).Distinct().ToList();
                                    List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                                    foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                                    {
                                        DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_CLineCPHDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                                        DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(W_CLineCPHDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                                        if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && deviceProRead != null && deviceProWrite != null)
                                        {
                                            R_CLineCPHInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_CLineCPHInfo>(deviceProRead.DeviceProAddress);
                                            //码垛环线请求任务
                                            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.RequestWMSTaskSimple(conveyorLineInfoRead.R_BoxCode, item.StationCode);
                                                ////向WMS请求任务
                                                //if (true)
                                                //{
                                                //}
                                                //写入执行数据
                                                device.SetValue(W_CLineCPHDB.W_TaskNo, 1002, item.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Channel, 5, item.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Long, 400, item.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Wide, 370, item.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_High, 300, item.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_TMID, conveyorLineInfoRead.R_BoxCode, item.StationCode);
                                                device.SetValue(W_CLineCPHDB.W_Request, 1, item.StationCode);
                                            }
                                        }
                                        else if (item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt() && deviceProRead != null)
                                        {
                                            R_CLineCPHInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_CLineCPHInfo>(deviceProRead.DeviceProAddress);
                                            //获取码垛口任务更新任务状态
                                            if (conveyorLineInfoRead != null && (conveyorLineInfoRead.R_State == 2 || conveyorLineInfoRead.R_State == 3) && conveyorLineInfoRead.R_TaskNo > 0)
                                            {
                                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.R_TaskNo && x.NextAddress == item.StationCode && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt());
                                                if (task != null)
                                                {
                                                    task.CurrentAddress = item.StationCode;
                                                    task.NextAddress = task.TargetAddress;
                                                    task.DeviceCode = item.StackerCraneCode;
                                                    _taskService.UpdateTask(task, TaskStatusEnum.MD_Executing);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            WriteError(item.StationName, $"未找到设备子编号{item.StationCode}的协议信息");
                                        }
                                    }
                                }
                                Thread.Sleep(100);
                            }
                        }
                    }
                    else
                    {
                        WriteError(item.StationName, $"未找到设备子编号{item.StationCode}的协议信息");
                    }
                        catch (Exception ex)
                        {
                            lockObj = 0;
                            WriteError(nameof(ConveyorLineJob_CPH), $"错误信息:{ex.Message}");
                        }
                    });
                }
            }
            return Task.CompletedTask;
        }
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Âë¶â/MDJob_CP.cs
@@ -77,7 +77,7 @@
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StackerCraneCode == device.DeviceCode);
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StackerCraneCode == device.DeviceCode && x.StationType == 33);
                foreach (var item in stationMangers)
                {
                    //获取协议
@@ -113,14 +113,15 @@
                            {
                                device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 2);
                            }
                            //获取当前任务
                            Dt_Task task = _taskRepository.QueryData(x => x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.MD_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode).OrderBy(x => x.TaskNum).FirstOrDefault();
                            if (task != null) //码垛申请
                            ConsoleHelper.WriteInfoLine($"码垛工位{item.StationCode}状态{Allow}");
                            if (Allow == 3 || Allow == 7)
                            {
                                if (Allow == 3 || Allow == 7)
                                {
                                //获取当前任务
                                Dt_Task task = _taskRepository.QueryData(x => x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.MD_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode).OrderBy(x => x.TaskNum).FirstOrDefault();
                                if (task != null) //码垛申请
                                {
                                    device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 1);
                                    device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDSendID.ToString()).DeviceProDataBlock, Convert.ToInt16(item.StackerCraneStationCode));
@@ -138,17 +139,25 @@
                                    #endregion
                                    device.Communicator.Write<float>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDA.ToString()).DeviceProDataBlock, 1);
                                    if (device.DeviceCode == "MD8_CP")
                                    {
                                        device.Communicator.Write<float>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDA.ToString()).DeviceProDataBlock, -1);
                                    }
                                    else
                                    {
                                        device.Communicator.Write<float>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDA.ToString()).DeviceProDataBlock, 1);
                                    }
                                    device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDReceiveDone.ToString()).DeviceProDataBlock, 3);
                                    //更新任务信息
                                    //_taskService.TaskCompleted(task.TaskNum);
                                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                                    _taskRepository.UpdateData(task);
                                    //_taskRepository.UpdateData(task);
                                    Thread.Sleep(1500);
                                    WriteInfo(item.StationName, $"任务号{task.TaskNum}码垛");
                                }
                            }
                        }
                        else
ÏîÄ¿´úÂë/WMS/WMSClient/config/buttons.js
@@ -174,7 +174,7 @@
    }
},
{
    name: "指 å®š åº“ å­˜ å‡º åº“",
    name: "指 å®š è€ åŽ‚ åº“ å­˜ å‡º åº“",
    icon: '',
    class: '',
    value: 'StockOutbound',
ÏîÄ¿´úÂë/WMS/WMSClient/public/webconfig.js
@@ -1,4 +1,5 @@
window.webConfig = {
    // "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/stock/stockInfo.js
@@ -17,7 +17,30 @@
    methods: {
       //下面这些方法可以保留也可以删除
      onInit() {  
        //指定出库
        let OutOrder = this.buttons.find(x => x.value == 'StockOutbound');
        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/OldYLOutbound?", keys, "数据处理中")
                .then((x) => {
                  if (!x.status) return this.$message.error(x.message);
                  this.$message.success("操作成功");
                  this.refresh();
                });
            });
          }
        }
      },
      onInited() {
        //框架初始化配置后
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/basic/locationInfo.vue
@@ -41,20 +41,20 @@
      enableStatus: "",
      locationStatus: "",
      row: "",
      column: "",
      columns: "",
      layer: "",
    });
    const searchFormOptions = ref([
      [
        { title: "货位编号", field: "locationCode", type: "like" },
        { title: "巷道编号", field: "roadwayNo",type:"like" },
        { title: "巷道编号", field: "roadwayNo",type: "select",dataKey: "Roadways" },
        { title: "货位类型", field: "locationType",type: "select",dataKey: "locationTypeEnum",data: [], },
        { title: "禁用状态", field: "enableStatus" ,type: "select",dataKey: "enableStatusEnum",data: [],},
      ],
      [
        { title: "货位状态", field: "locationStatus" ,type: "selectList",dataKey: "locationStatusEnum",data: [],},
        { title: "行", field: "row" ,type: "int"},
        { title: "列", field: "column" ,type: "int"},
        { title: "列", field: "columns" ,type: "int"},
        { title: "层", field: "layer" ,type: "int"}
      ],
    ]);
@@ -81,21 +81,21 @@
        field: "locationCode",
        title: "货位编号",
        type: "string",
        width: 200,
        width: 240,
        align: "left",
      },
      {
        field: "locationName",
        title: "货位名称",
        type: "string",
        width: 280,
        width: 300,
        align: "left",
      },
      {
        field: "roadwayNo",
        title: "巷道编号",
        type: "decimal",
        width: 100,
        width: 110,
        align: "left",
      },
      {
@@ -104,23 +104,20 @@
        type: "string",
        width: 90,
        align: "left",
        hidden: true,
      },
      {
        field: "column",
        field: "columns",
        title: "货位列",
        type: "int",
        width: 120,
        type: "string",
        width: 90,
        align: "left",
        hidden: true,
      },
      {
        field: "layer",
        title: "货位层",
        type: "string",
        width: 200,
        width: 90,
        align: "left",
        hidden: true,
      },
      {
        field: "depth",
@@ -177,6 +174,7 @@
        type: "string",
        width: 100,
        align: "left",
        hidden: true
      },
      {
        field: "modifyDate",
@@ -185,6 +183,7 @@
        width: 160,
        align: "left",
        sort: true,
        hidden: true
      },
      {
        field: "remark",
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/stock/ProStockView.vue
@@ -47,6 +47,10 @@
          { title: "货位状态", field: "locationStatus" ,type: "selectList",dataKey: "locationStatusEnum",data: [],},
          { title: "库存状态", field: "stockStatus",type: "selectList",dataKey: "stockStatusEmun",data: [],},
        ],
        [
          { title: "所属仓库", field: "warehouseId",type: "select",dataKey: "warehouses",data: []},
          { title: "库存属性", field: "proStockAttribute" ,type: "selectList",dataKey: "proStockAttributeEnum",data: [],},
        ],
      ]);
      const columns = ref([
        {
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/stock/stockInfo.vue
@@ -45,6 +45,8 @@
      const searchFormFields = ref({
        palletCode: "",
        locationCode: "",
        materielCode: "",
        materielWide: "",
      });
      const searchFormOptions = ref([
        [
@@ -53,6 +55,11 @@
          {title: "库存组织", field:"materielInvOrgId",type:"select",dataKey:"materielInvOrgEnum",data:[]},
          {title: "物料编号", field:"materielCode",type:"like"},
        ],
        [
          {title: "物料幅宽", field:"materielWide",type:"int"},
          {title: "库存状态", field:"stockStatus",type:"select",dataKey:"stockStatusEmun",data:[]},
          { title: "创建时间", field: "createDate", type: "datetime" },
        ],
      ]);
      const columns = ref([
        {
ÏîÄ¿´úÂë/WMS/WMSServices/.vs/WIDESEA_WMSServer/v17/DocumentLayout.backup.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
{
  "Version": 1,
  "WorkspaceRootPath": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_basicservice\\base\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|solutionrelative:widesea_basicservice\\base\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_taskinfoservice\\taskservice_inbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|solutionrelative:widesea_taskinfoservice\\taskservice_inbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_taskinfoservice\\assigninboundtasklocation_bc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|solutionrelative:widesea_taskinfoservice\\assigninboundtasklocation_bc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 0,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "LocationInfoService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_BasicService\\Base\\LocationInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEA_BasicService\\Base\\LocationInfoService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_BasicService\\Base\\LocationInfoService.cs",
              "RelativeToolTip": "WIDESEA_BasicService\\Base\\LocationInfoService.cs",
              "ViewState": "AgIAAG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T09:31:06.62Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "AssignInboundTaskLocation_BC.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "RelativeDocumentMoniker": "WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "RelativeToolTip": "WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "ViewState": "AgIAAEoAAAAAAAAAAAAhwJMAAAARAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T07:40:25.502Z",
              "EditorCaption": ""
            },
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "TaskService_Inbound.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "RelativeDocumentMoniker": "WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "RelativeToolTip": "WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "ViewState": "AgIAANABAAAAAAAAAAAAAOMBAABaAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-11T07:30:48.968Z",
              "EditorCaption": ""
            }
          ]
        }
      ]
    }
  ]
}
ÏîÄ¿´úÂë/WMS/WMSServices/.vs/WIDESEA_WMSServer/v17/DocumentLayout.json
@@ -3,16 +3,8 @@
  "WorkspaceRootPath": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_common\\taskenum\\tasktypeenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|solutionrelative:widesea_common\\taskenum\\tasktypeenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{CE0DB91F-5A68-448E-A419-4C26B5039F51}|WIDESEA_ITaskInfoService\\WIDESEA_ITaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_itaskinfoservice\\itaskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{CE0DB91F-5A68-448E-A419-4C26B5039F51}|WIDESEA_ITaskInfoService\\WIDESEA_ITaskInfoService.csproj|solutionrelative:widesea_itaskinfoservice\\itaskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_taskinfoservice\\assigninboundtasklocation_bc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|solutionrelative:widesea_taskinfoservice\\assigninboundtasklocation_bc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|e:\\get\\longdeliliku\\\u9879\u76EE\u4EE3\u7801\\wms\\wmsservices\\widesea_taskinfoservice\\taskservice_inbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|solutionrelative:widesea_taskinfoservice\\taskservice_inbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -22,34 +14,8 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 0,
          "SelectedChildIndex": 2,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "TaskTypeEnum.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_Common\\TaskEnum\\TaskTypeEnum.cs",
              "RelativeDocumentMoniker": "WIDESEA_Common\\TaskEnum\\TaskTypeEnum.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_Common\\TaskEnum\\TaskTypeEnum.cs",
              "RelativeToolTip": "WIDESEA_Common\\TaskEnum\\TaskTypeEnum.cs",
              "ViewState": "AgIAAFYAAAAAAAAAAAAAwGMAAAAXAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-26T09:23:06.543Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "ITaskService.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_ITaskInfoService\\ITaskService.cs",
              "RelativeDocumentMoniker": "WIDESEA_ITaskInfoService\\ITaskService.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_ITaskInfoService\\ITaskService.cs",
              "RelativeToolTip": "WIDESEA_ITaskInfoService\\ITaskService.cs",
              "ViewState": "AgIAADkAAAAAAAAAAIAxwE0AAAAZAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-26T05:24:03.563Z",
              "EditorCaption": ""
            },
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
@@ -60,15 +26,15 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "AssignInboundTaskLocation_BC.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "RelativeDocumentMoniker": "WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "RelativeToolTip": "WIDESEA_TaskInfoService\\AssignInboundTaskLocation_BC.cs",
              "ViewState": "AgIAAAMAAAAAAAAAAADwvxQAAAAFAAAAAAAAAA==",
              "DocumentIndex": 0,
              "Title": "TaskService_Inbound.cs",
              "DocumentMoniker": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "RelativeDocumentMoniker": "WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "ToolTip": "E:\\GET\\LongDeLiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WMSServices\\WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "RelativeToolTip": "WIDESEA_TaskInfoService\\TaskService_Inbound.cs",
              "ViewState": "AgIAANABAAAAAAAAAAAAAOMBAAAJAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-08-26T05:23:49.344Z",
              "WhenOpened": "2025-09-11T07:30:48.968Z",
              "EditorCaption": ""
            }
          ]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicRepository/LocationInfoRepository.cs
@@ -31,7 +31,7 @@
        /// <returns></returns>
        public List<LocationGroupDTO> GetAllLocationGroups(string roadway)
        {
            return QueryTabs<Dt_LocationInfo, Dt_LocationInfo, LocationGroupDTO>((a, b) => a.Column == b.Column && a.Layer == b.Layer && a.Row != b.Row && SqlFunc.Abs(a.Row - b.Row) == 1, (a, b) => new LocationGroupDTO { DepthA = a.Depth, DepthB = b.Depth, EnableStatusA = a.EnableStatus, EnableStatusB = b.EnableStatus, IdA = a.Id, IdB = b.Id, LocationCodeA = a.LocationCode, LocationCodeB = b.LocationCode, LocationStatusA = a.LocationStatus, LocationStatusB = b.LocationStatus, LocationTypeA = a.LocationType, LocationTypeB = b.LocationType }, a => a.Depth == 1 && a.RoadwayNo == roadway, b => b.Depth == 2 && b.RoadwayNo == roadway, x => true);
            return QueryTabs<Dt_LocationInfo, Dt_LocationInfo, LocationGroupDTO>((a, b) => a.Columns == b.Columns && a.Layer == b.Layer && a.Row != b.Row && SqlFunc.Abs(a.Row - b.Row) == 1, (a, b) => new LocationGroupDTO { DepthA = a.Depth, DepthB = b.Depth, EnableStatusA = a.EnableStatus, EnableStatusB = b.EnableStatus, IdA = a.Id, IdB = b.Id, LocationCodeA = a.LocationCode, LocationCodeB = b.LocationCode, LocationStatusA = a.LocationStatus, LocationStatusB = b.LocationStatus, LocationTypeA = a.LocationType, LocationTypeB = b.LocationType }, a => a.Depth == 1 && a.RoadwayNo == roadway, b => b.Depth == 2 && b.RoadwayNo == roadway, x => true);
        }
        /// <summary>
@@ -44,7 +44,7 @@
        public List<LocationGroupDTO> GetLocationGroups(string roadway, LocationStatusEnum locationAStatus, LocationStatusEnum locationBStatus)
        {
            return QueryTabs<Dt_LocationInfo, Dt_LocationInfo, LocationGroupDTO>(
                (a, b) => a.Column == b.Column && a.Layer == b.Layer && a.Row != b.Row && SqlFunc.Abs(a.Row - b.Row) == 1,
                (a, b) => a.Columns == b.Columns && a.Layer == b.Layer && a.Row != b.Row && SqlFunc.Abs(a.Row - b.Row) == 1,
                (a, b) => new LocationGroupDTO { DepthA = a.Depth, DepthB = b.Depth, EnableStatusA = a.EnableStatus, EnableStatusB = b.EnableStatus, IdA = a.Id, IdB = b.Id, LocationCodeA = a.LocationCode, LocationCodeB = b.LocationCode, LocationStatusA = a.LocationStatus, LocationStatusB = b.LocationStatus, LocationTypeA = a.LocationType, LocationTypeB = b.LocationType },
                a => a.Depth == 1 && a.RoadwayNo == roadway && a.LocationStatus == locationAStatus.ObjToInt(),
                b => b.Depth == 2 && b.RoadwayNo == roadway && b.LocationStatus == locationBStatus.ObjToInt(),
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Base/LocationInfoService.cs
@@ -133,7 +133,7 @@
                            Dt_LocationInfo locationInfo = new Dt_LocationInfo()
                            {
                                WarehouseId = 0,
                                Column = j + 1,
                                Columns = j + 1,
                                EnableStatus = EnableStatusEnum.Normal.ObjToInt(),
                                Layer = k + 1,
                                LocationStatus = LocationStatusEnum.Free.ObjToInt(),
@@ -142,8 +142,8 @@
                                Row = i + 1,
                                Depth = depth,
                            };
                            locationInfo.LocationCode = $"{locationInfo.RoadwayNo}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}-{locationInfo.Depth.ToString().PadLeft(2, '0')}";
                            locationInfo.LocationName = $"{locationInfo.RoadwayNo}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Column.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层{locationInfo.Depth.ToString().PadLeft(2, '0')}æ·±";
                            locationInfo.LocationCode = $"{locationInfo.RoadwayNo}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Columns.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}-{locationInfo.Depth.ToString().PadLeft(2, '0')}";
                            locationInfo.LocationName = $"{locationInfo.RoadwayNo}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Columns.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层{locationInfo.Depth.ToString().PadLeft(2, '0')}æ·±";
                            locationInfos.Add(locationInfo);
                        }
                    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService.cs
@@ -60,13 +60,13 @@
                List<Dt_LocationInfo> definedTypeLocations = locationInfos.Where(x => x.LocationType == palletType.ObjToInt()).ToList();
                //未定义类型的空货位
                List<Dt_LocationInfo> undefinedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Column).ToList();
                List<Dt_LocationInfo> undefinedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Columns).ToList();
                if (locationInfos.Count * weightValue >= definedTypeLocations.Count && undefinedTypeEmptyLocations.Count > 0)//如果已定义类型货位未超过比例,且有未定义类型的货位
                {
                    if (palletType == PalletTypeEnum.LargePallet)
                    {
                        undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => x.Column % 2 == 1).ToList();
                        undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => x.Columns % 2 == 1).ToList();
                    }
                    for (int i = 0; i < undefinedTypeEmptyLocations.Count; i++)
                    {
@@ -82,7 +82,7 @@
                }
                else
                {
                    List<Dt_LocationInfo> definedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == palletType.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Column).ToList();
                    List<Dt_LocationInfo> definedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == palletType.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Columns).ToList();
                    for (int i = 0; i < definedTypeEmptyLocations.Count; i++)
                    {
@@ -106,7 +106,7 @@
            {
                case PalletTypeEnum.LargePallet:
                    {
                        Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == undefinedTypeEmptyLocation.Row && x.Layer == undefinedTypeEmptyLocation.Layer && x.Depth == undefinedTypeEmptyLocation.Depth && x.Column == undefinedTypeEmptyLocation.Column + 1);
                        Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == undefinedTypeEmptyLocation.Row && x.Layer == undefinedTypeEmptyLocation.Layer && x.Depth == undefinedTypeEmptyLocation.Depth && x.Columns == undefinedTypeEmptyLocation.Columns + 1);
                        if (nearLocation != null && nearLocation.LocationStatus == LocationStatusEnum.Free.ObjToInt() && DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation) != null)
                        {
                            Dt_LocationInfo? locationInfo = DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation);
@@ -175,7 +175,7 @@
                    locations[i].LocationType = palletType.ObjToInt();
                }
                Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
                Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Columns == location.Columns + 1);
                if (nearLocation != null)
                {
                    List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
@@ -220,7 +220,7 @@
                    locations[i].LocationType = palletType.ObjToInt();
                }
                Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
                Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Columns == location.Columns + 1);
                if (nearLocation != null)
                {
                    List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
@@ -252,7 +252,7 @@
            int maxDepth = locationInfos.Max(x => x.Depth);
            for (int j = location.Depth + 1; j <= maxDepth; j++)
            {
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer);
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Columns == location.Columns && x.Layer == location.Layer);
                if (locationInfo != null)
                {
                    groupLocations.Add(locationInfo);
@@ -261,7 +261,7 @@
            for (int j = location.Depth - 1; j >= 1; j--)
            {
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer);
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Columns == location.Columns && x.Layer == location.Layer);
                if (locationInfo != null)
                {
                    groupLocations.Add(locationInfo);
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService_Common.cs
@@ -76,7 +76,7 @@
                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    { nameof(Dt_LocationInfo.Column),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Columns),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Row),OrderByType.Asc }
@@ -106,7 +106,7 @@
                
                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    { nameof(Dt_LocationInfo.Column),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Columns),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Row),OrderByType.Asc }
@@ -128,8 +128,8 @@
                            Dt_LocationInfo? nearLocation1;
                            Dt_LocationInfo? nearLocation2;
                            nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Column == item.Column - 1);
                            nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Column == item.Column + 1);
                            nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Columns == item.Columns - 1);
                            nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Columns == item.Columns + 1);
                            if (nearLocation1!=null && nearLocation2!=null)
                            {
                                locationInfo = item;
@@ -162,159 +162,6 @@
            UpdateLocationStatus(location, palletType, locationStatus, warehousId);
        }
        /// <summary>
        /// ä¿®æ”¹è´§ä½çŠ¶æ€åŠç±»åž‹
        /// </summary>
        /// <param name="location">货位对象</param>
        /// <param name="palletType">托盘类型</param>
        /// <param name="locationStatus">货位状态</param>
        //public void UpdateLocationStatus2(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehousId)
        //{
        //    List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo);
        //    List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location);
        //    if (locationInfos.Max(x => x.Depth) < 3)
        //    {
        //        for (int i = 0; i < locations.Count; i++)
        //        {
        //            if (locations[i].LocationType != palletType.ObjToInt())
        //            {
        //                locations[i].LocationType = palletType.ObjToInt();
        //            }
        //            if (locations[i].LocationCode == location.LocationCode)
        //            {
        //                locations[i].LocationStatus = locationStatus.ObjToInt();
        //            }
        //            else
        //            {
        //                if (locationStatus == LocationStatusEnum.Lock)
        //                {
        //                    if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
        //                    }
        //                    else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
        //                    }
        //                }
        //                else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
        //                {
        //                    if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
        //                    }
        //                    else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
        //                    }
        //                }
        //            }
        //        }
        //        Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
        //        if(location.RoadwayNo == "SC01_BC")
        //        {
        //            nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
        //        }
        //        if (nearLocation != null)
        //        {
        //            List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
        //            for (int i = 0; i < nearLocations.Count; i++)
        //            {
        //                if (nearLocations[i].LocationType != palletType.ObjToInt())
        //                {
        //                    nearLocations[i].LocationType = palletType.ObjToInt();
        //                }
        //                if (palletType.ObjToInt() >= PalletTypeEnum.LargePallet.ObjToInt())
        //                {
        //                    if (nearLocations[i].LocationCode == nearLocation.LocationCode)
        //                    {
        //                        nearLocations[i].LocationStatus = locationStatus.ObjToInt();
        //                    }
        //                    else
        //                    {
        //                        if (locationStatus == LocationStatusEnum.Lock)
        //                        {
        //                            if (nearLocations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
        //                            {
        //                                nearLocations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
        //                            }
        //                            else if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
        //                            {
        //                                nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
        //                            }
        //                        }
        //                        else if (locationStatus == LocationStatusEnum.InStock)
        //                        {
        //                            if (nearLocations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
        //                            {
        //                                nearLocations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
        //                            }
        //                            else if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
        //                            {
        //                                nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
        //                            }
        //                        }
        //                    }
        //                }
        //            }
        //            locations.AddRange(nearLocations);
        //        }
        //    }
        //    else
        //    {
        //        for (int i = 0; i < locations.Count; i++)
        //        {
        //            if (locations[i].LocationCode == location.LocationCode)
        //            {
        //                locations[i].LocationStatus = locationStatus.ObjToInt();
        //            }
        //            else
        //            {
        //                if (locationStatus == LocationStatusEnum.Lock)
        //                {
        //                    if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
        //                    }
        //                    else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
        //                    }
        //                }
        //                else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
        //                {
        //                    if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
        //                    }
        //                    else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
        //                    {
        //                        locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
        //                    }
        //                }
        //            }
        //            if (locations[i].LocationType != palletType.ObjToInt())
        //            {
        //                locations[i].LocationType = palletType.ObjToInt();
        //            }
        //        }
        //    }
        //    if (locations.Where(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt()).Count() == locations.Count && locationStatus == LocationStatusEnum.Free)
        //    {
        //        locations.ForEach(x =>
        //        {
        //            x.LocationType = 0;
        //        });
        //    }
        //    Repository.UpdateData(locations);
        //}
        public void UpdateLocationStatus(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehouseId)
        {
@@ -378,8 +225,8 @@
                    Dt_LocationInfo? nearLocation1;
                    Dt_LocationInfo? nearLocation2;
                    nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1);
                    nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
                    nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Columns == location.Columns - 1);
                    nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Columns == location.Columns + 1);
                    if (nearLocation1 != null && nearLocation2 != null)
@@ -467,7 +314,7 @@
            for (int j = location.Depth + 1; j <= maxDepth; j++)
            {
                row += 1;
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && x.Row == row);
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Columns == location.Columns && x.Layer == location.Layer && x.Row == row);
                if (locationInfo != null)
                {
                    groupLocations.Add(locationInfo);
@@ -477,7 +324,7 @@
            for (int j = location.Depth - 1; j >= 1; j--)
            {
                row -= 1;
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && x.Row == row);
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Columns == location.Columns && x.Layer == location.Layer && x.Row == row);
                if (locationInfo != null)
                {
                    groupLocations.Add(locationInfo);
@@ -500,7 +347,7 @@
            int row = location.Row;
            for (int j = location.Depth + 1; j <= maxDepth; j++)
            {
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && (x.Row == row + 1 || x.Row == row - 1));
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Columns == location.Columns && x.Layer == location.Layer && (x.Row == row + 1 || x.Row == row - 1));
                if (locationInfo != null)
                {
                    groupLocations.Add(locationInfo);
@@ -509,7 +356,7 @@
            for (int j = location.Depth - 1; j >= 1; j--)
            {
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && (x.Row == row + 1 || x.Row == row - 1));
                Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Columns == location.Columns && x.Layer == location.Layer && (x.Row == row + 1 || x.Row == row - 1));
                if (locationInfo != null)
                {
                    groupLocations.Add(locationInfo);
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/LocationEnum/LocationStatusEnum.cs
@@ -40,11 +40,5 @@
        /// </summary>
        [Description("有货")]
        InStock = 100,
        /// <summary>
        /// æ‰˜ç›˜é”å®š
        /// </summary>
        [Description("托盘锁定")]
        PalletLock = 99
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/StockEnum/StockStatusMenu.cs
@@ -47,6 +47,9 @@
        [Description("拣选完成")]
        æ‹£é€‰å®Œæˆ =14,
        [Description("老厂退库")]
        è€åŽ‚é€€åº“ = 15,
        [Description("MES余料退库")]
        MES余料退库 = 21,
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskStatusEnum.cs
@@ -107,6 +107,12 @@
        MD_Executing = 520,
        /// <summary>
        /// ç­‰å¾…配送呼叫
        /// </summary>
        [Description("等待配送呼叫")]
        CallPending = 610,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        [Description("任务完成")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs
@@ -112,6 +112,12 @@
        PaperYLBackInbound = 730,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚é€€åº“
        /// </summary>
        [Description("原料老厂退库")]
        PaperOldYLBackInbound = 740,
        /// <summary>
        /// å··é“内移库
        /// </summary>
        [Description("巷道内移库")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/BaseModels/PageDataOptions.cs
@@ -79,11 +79,11 @@
                    }
                    else if (expressionType == LinqExpressionType.ThanOrEqual)
                    {
                        where += $"{searchParametersList[i].Name} {HtmlElementType.thanorequal} '{searchParametersList[i].Value}'";
                        where += $"{searchParametersList[i].Name} {HtmlElementType.thanOrEqual} '{searchParametersList[i].Value}'";
                    }
                    else if (expressionType == LinqExpressionType.LessThanOrEqual)
                    {
                        where += $"{searchParametersList[i].Name} {HtmlElementType.lessOrequal} '{searchParametersList[i].Value}'";
                        where += $"{searchParametersList[i].Name} {HtmlElementType.lessOrEqual} '{searchParametersList[i].Value}'";
                    }
                    else if (expressionType == LinqExpressionType.GreaterThan)
                    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/BaseModels/WebResponseContent.cs
@@ -25,9 +25,12 @@
        public string DevMessage { get; set; }
        public string Datetime { get; set; }
        public WebResponseContent OK()
        {
            Status = true;
            Datetime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            return this;
        }
@@ -40,6 +43,7 @@
            Status = true;
            Message = message;
            Data = data;
            Datetime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            return this;
        }
@@ -47,6 +51,7 @@
        {
            Status = false;
            Message = message;
            Datetime= DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            return this;
        }
    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/Const/HtmlElementType.cs
@@ -25,7 +25,7 @@
        public const string like = "like";
        public const string thanOrEqual = ">=";
        public const string lessOrequal = "<=";
        public const string lessOrEqual = "<=";
        public const string Contains = "in";
        public const string Equal = "=";
    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/Helper/UtilConvert.cs
@@ -958,10 +958,10 @@
                case HtmlElementType.Contains:
                    linqExpression = LinqExpressionType.In;
                    break;
                case HtmlElementType.thanOrEqual:
                case HtmlElementType.thanorequal:
                    linqExpression = LinqExpressionType.ThanOrEqual;
                    break;
                case HtmlElementType.lessOrequal:
                case HtmlElementType.lessorequal:
                    linqExpression = LinqExpressionType.LessThanOrEqual;
                    break;
                case HtmlElementType.GT:
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTOutOrderDTO.cs
@@ -9,7 +9,7 @@
namespace WIDESEA_DTO.ERP
{
    /// <summary>
    /// åšæ€é€šé‡‡è´­å…¥åº“单接收实体
    /// åšæ€é€šç”Ÿäº§æŽ’程接收实体
    /// </summary>
    [ModelValidate]
    public class BSTOutOrderDTO
@@ -45,7 +45,7 @@
        public List<BstBoardMpsDetailItem> BstBoardMpsDetails { get; set; }
    }
    /// <summary>
    /// é‡‡è´­æ”¶è´§æ˜Žç»†
    /// ç”Ÿäº§æŽ’程明细
    /// </summary>
    public class BstBoardMpsDetailItem
    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/MES/MESAutoIssueDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.MES
{
    /// <summary>
    /// MES领料自动叫料接收实体
    /// </summary>
    [ModelValidate]
    public class MESAutoIssueDTO
    {
        /// <summary>
        /// å‡ºåº“来源明细ID
        /// </summary>
        [PropertyValidate("出库来源明细ID", NotNullAndEmpty = true)]
        public int OutDetailId { get; set; }
        /// <summary>
        /// æœºå°ä½™æ–™å¯ç”¨æ—¶é•¿
        /// </summary>
        [PropertyValidate("机台余料可用时长", NotNullAndEmpty = true)]
        public int OddsTime { get; set; }
        /// <summary>
        /// ä¸Šæ–™å‘¨è½¬ä½ä½™æ–™æ•°é‡
        /// </summary>
        [PropertyValidate("上料周转位余料数量", NotNullAndEmpty = true)]
        public decimal OddsQuantity { get; set; }
        /// <summary>
        /// å‘¨è½¬ä½ç½®ç¼–号
        /// </summary>
        [PropertyValidate("周转位置编号", NotNullAndEmpty = true)]
        public string PointCode { get; set; }
        /// <summary>
        /// å‘¨è½¬ä½æ˜¯å¦å­˜åœ¨ç©ºæ‰˜
        /// </summary>
        [PropertyValidate("周转位是否存在空托", NotNullAndEmpty = true)]
        public int IsEmptyPallet { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/MES/OutMESOrderDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.MES
{
    /// <summary>
    /// MES领料计划接收实体
    /// </summary>
    [ModelValidate]
    public class OutMESOrderDTO
    {
        /// <summary>
        /// å‡ºåº“来源明细ID
        /// </summary>
        [PropertyValidate("出库来源明细ID", NotNullAndEmpty = true)]
        public int OutDetailId { get; set; }
        /// <summary>
        /// ä»“库代号
        /// </summary>
        [PropertyValidate("纸质收货单主表ID", NotNullAndEmpty = false)]
        public string WarehouseCode { get; set; }
        /// <summary>
        /// ç”Ÿäº§è®¢å•编码
        /// </summary>
        [PropertyValidate("生产订单编码", NotNullAndEmpty = true)]
        public string ProductOrderNo { get; set; }
        /// <summary>
        /// æ´¾å•工单编码
        /// </summary>
        [PropertyValidate("派单工单编码", NotNullAndEmpty = true)]
        public string SendOrderNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        [PropertyValidate("物料编码", NotNullAndEmpty = true)]
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™æ‰¹æ¬¡
        /// </summary>
        [PropertyValidate("物料批次", NotNullAndEmpty = false)]
        public string MaterialLot { get; set; }
        /// <summary>
        /// ç‰©æ–™ç­‰çº§
        /// </summary>
        [PropertyValidate("物料等级", NotNullAndEmpty = false)]
        public string GradeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™éœ€æ±‚数量
        /// </summary>
        [PropertyValidate("物料需求数量", NotNullAndEmpty = true)]
        public decimal ReqQuantity { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒç¼–ç (机台)
        /// </summary>
        [PropertyValidate("加工中心编码(机台)", NotNullAndEmpty = true)]
        public string MakeCode { get; set; }
        /// <summary>
        /// è®¡åˆ’领料时间
        /// </summary>
        [PropertyValidate("计划领料时间", NotNullAndEmpty = true)]
        public DateTime PlanDate { get; set; }
        /// <summary>
        /// ç»“束时间
        /// </summary>
        [PropertyValidate("结束时间", NotNullAndEmpty = true)]
        public DateTime EndDate { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/IMESService/IInvokeMESService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_External.Model;
namespace WIDESEA_External.MESService
{
    /// <summary>
    /// è°ƒç”¨MES接口
    /// </summary>
    public interface IInvokeMESService : IDependency
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/MESService/InvokeMESService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.APIEnum;
using WIDESEA_Core.Helper;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_External.MESService
{
    /// <summary>
    /// è°ƒç”¨MES接口
    /// </summary>
    public class InvokeMESService : IInvokeMESService
    {
        private readonly IApiInfoRepository _apiInfoRepository;
        public InvokeMESService(IApiInfoRepository apiInfoRepository)
        {
            _apiInfoRepository = apiInfoRepository;
        }
        // åˆ›å»ºä¸€ä¸ªä½¿ç”¨å°é©¼å³°å‘½åæ³•的序列化设置
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/ERPBaseModel.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/MESDispatchModel.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_External.Model
{
    internal class MESDispatchModel
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/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 object Obj { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundRepository/IOutMESOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundRepository
{
    /// <summary>
    /// MES领料计划单仓储接口层
    /// </summary>
    public interface IOutMESOrderRepository : IRepository<Dt_OutMESOrder>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IOutboundService/IOutMESOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
using WIDESEA_DTO.MES;
namespace WIDESEA_IOutboundService
{
    public interface IOutMESOrderService : IService<Dt_OutMESOrder>
    {
        IOutMESOrderRepository Repository { get; }
        /// <summary>
        /// æŽ¥æ”¶MES领料计划
        /// </summary>
        WebResponseContent ReceiveOutBound(OutMESOrderDTO outMESOrderDTO);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -29,6 +29,7 @@
using WIDESEA_Core.Enums;
using WIDESEA_DTO;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Stock;
using WIDESEA_DTO.Task;
using WIDESEA_ITaskInfoRepository;
@@ -113,7 +114,7 @@
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        WebResponseContent Outbound(int id);
        WebResponseContent Outbound(List<int> ids);
        /// <summary>
        /// ä¿®æ”¹ä»»åŠ¡çŠ¶æ€
@@ -195,5 +196,10 @@
        /// <param name="keys"></param>
        /// <returns></returns>
        WebResponseContent CreateBSTOutboundTasks(int[] keys);
        /// <summary>
        /// MES自动叫料接口
        /// </summary>
        /// <returns></returns>
        WebResponseContent ReceiveAutoIssue(MESAutoIssueDTO autoIssueDTO);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_AGVStationInfo.cs
@@ -37,9 +37,14 @@
        /// <summary>
        /// åŒºåŸŸ
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "区域")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "区域")]
        public int StationArea { get; set; }
        /// <summary>
        /// MES对应周转位
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "MES对应周转位")]
        public string MESPointCode { get; set; }
        /// <summary>
        /// æ˜¯å¦å ç”¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "是否占用")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_LocationInfo.cs
@@ -54,7 +54,7 @@
        /// è´§ä½åˆ—
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "货位列")]
        public int Column { get; set; }
        public int Columns { get; set; }
        /// <summary>
        /// è´§ä½å±‚
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Outbound/Dt_OutMESOrder.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
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>
    /// MES领料计划单
    /// </summary>
    [SugarTable(nameof(Dt_OutMESOrder), "MES领料计划单"), ModelValidate]
    public class Dt_OutMESOrder : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        ///// <summary>
        ///// ä»“库主键
        ///// </summary>
        //[SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        //public int WarehouseId { get; set; }
        /// <summary>
        /// å‡ºåº“来源明细ID
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库来源明细ID")]
        public int OutDetailId { get; set; }
        /// <summary>
        /// WMS单据编号
        /// </summary>
        [CodeRule(RuleCodeEnum.OutboundOrderRule)]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "WMS单据编号", IsOnlyIgnoreUpdate = true)]
        public string OutMESOrderNo { get; set; }
        /// <summary>
        /// ç”Ÿäº§è®¢å•编码(上游)
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "生产订单编码(上游)")]
        public string ProductOrderNo { get; set; }
        /// <summary>
        /// æ´¾å•工单编码
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "派单工单编码")]
        public string SendOrderNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编码")]
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™æ‰¹æ¬¡
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "物料批次")]
        public string MaterialLot { get; set; }
        /// <summary>
        /// ç‰©æ–™ç­‰çº§
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "物料等级")]
        public string GradeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™éœ€æ±‚数量
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料需求数量")]
        public decimal ReqQuantity { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒç¼–ç (机台)
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "加工中心编码(机台)")]
        public string MakeCode { get; set; }
        /// <summary>
        /// ç”Ÿäº§è®¢å•状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "生产订单状态")]
        public int OutMESOrderStatus { get; set; }
        /// <summary>
        /// è®¡åˆ’领料时间
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "计划领料时间")]
        public DateTime PlanDate { get; set; }
        /// <summary>
        /// ç»“束时间
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "结束时间")]
        public DateTime EndDate { get; set; }
        /// <summary>
        /// åˆ†é…éœ€æ±‚数量
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "分配需求数量")]
        public decimal AssignTotalUsage { get; set; }
        /// <summary>
        /// å·²å‡ºéœ€æ±‚数量
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "已出需求数量")]
        public decimal OutTotalUsage { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundRepository/OutMESOrderRepository.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>
    /// MES领料计划单仓储实现层
    /// </summary>
    public class OutMESOrderRepository : RepositoryBase<Dt_OutMESOrder>, IOutMESOrderRepository
    {
        public OutMESOrderRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderService.cs
@@ -42,14 +42,18 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有出库单
                List<Dt_OutBSTOrder> OldoutBSTOrders = BaseDal.Db.Queryable<Dt_OutBSTOrder>().Includes(x => x.Details).ToList();
                //新增
                List<BSTOutOrderDTO> outOrderDTOsAdd = bSTOutOrderDTOs.Where(x => x.Way == 1).ToList();
                //修改
                List<BSTOutOrderDTO> outOrderDTOsUpdate = bSTOutOrderDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTOutOrderDTO> outOrderDTOsDel = bSTOutOrderDTOs.Where(x => x.Way == 3).ToList();
                if (outOrderDTOsAdd.Count==0 && outOrderDTOsUpdate.Count==0 && outOrderDTOsDel.Count==0)
                {
                    return content.Error($"出库排程信息传入为空");
                }
                //获取所有出库单
                List<Dt_OutBSTOrder> OldoutBSTOrders = BaseDal.Db.Queryable<Dt_OutBSTOrder>().Includes(x => x.Details).ToList();
                //获取所有物料 
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutMESOrderService.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.MaterielEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.MES;
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
namespace WIDESEA_OutboundService
{
    public class OutMESOrderService : ServiceBase<Dt_OutMESOrder, IOutMESOrderRepository>, IOutMESOrderService
    {
        public IOutMESOrderRepository Repository => BaseDal;
        private IBasicRepository _basicRepository;
        private IStockService _stockService;
        private IOutStockLockInfoService _outStockLockInfoService;
        private IBasicService _basicService;
        private ILocationStatusChangeRecordService _locationStatusChangeRecordService;
        private readonly IMapper _mapper;
        public OutMESOrderService(IOutMESOrderRepository BaseDal,IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, ILocationStatusChangeRecordService locationStatusChangeRecordService,IMapper mapper) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _stockService = stockService;
            _outStockLockInfoService = outStockLockInfoService;
            _basicService = basicService;
            _locationStatusChangeRecordService = locationStatusChangeRecordService;
            _mapper = mapper;
        }
        /// <summary>
        /// æŽ¥æ”¶MES领料计划
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ReceiveOutBound(OutMESOrderDTO outMESOrderDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (outMESOrderDTO==null)
                {
                    return content.Error("领料计划传入信息为空");
                }
                if (outMESOrderDTO.OutDetailId <= 0)
                {
                    return content.Error($"领料计划{nameof(OutMESOrderDTO.OutDetailId)}:{outMESOrderDTO.OutDetailId}需要大于0");
                }
                if (outMESOrderDTO.ReqQuantity <= 0)
                {
                    return content.Error($"领料计划{nameof(OutMESOrderDTO.ReqQuantity)}:{outMESOrderDTO.ReqQuantity}需要大于0");
                }
                //获取所有物料信息
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x=>x.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt());
                //获取所有临料计划
                List<Dt_OutMESOrder> outMESOrders = BaseDal.QueryData();
                Dt_MaterielInfo? ExistmaterielInfo = materielInfos.FirstOrDefault(x=>x.MaterielCode== outMESOrderDTO.MaterialCode);
                if (ExistmaterielInfo == null)
                {
                    return content.Error($"物料编码{nameof(OutMESOrderDTO.MaterialCode)}:{outMESOrderDTO.MaterialCode}信息不存在");
                }
                Dt_OutMESOrder? OldoutMESOrder = outMESOrders.FirstOrDefault(x=>x.OutDetailId==outMESOrderDTO.OutDetailId);
                if (OldoutMESOrder!=null)
                {
                    return content.Error($"领料计划{nameof(OutMESOrderDTO.OutDetailId)}:{outMESOrderDTO.OutDetailId}信息已存在");
                }
                return content.Error($"领料计划{nameof(OutMESOrderDTO.ProductOrderNo)}:{outMESOrderDTO.ProductOrderNo},物料{outMESOrderDTO.MaterialCode}无可分配库存");
                Dt_OutMESOrder outMESOrder = _mapper.Map<Dt_OutMESOrder>(outMESOrderDTO);
                BaseDal.AddData(outMESOrder);
                return content.OK("接收成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_RecordService/Service/LocationStatusChangeRecordService.cs
@@ -43,7 +43,7 @@
                throw new Exception($"{ex.Message}");
            }
        }
        //货位变动记录添加
        public void AddLocationStatusChangeRecord(List<Dt_LocationInfo> locationInfos, LocationStatusEnum newStatus, LocationChangeType changeType, string? orderNo = null, List<int>? taskNums = null)
        {
            try
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/ProStockViewService.cs
@@ -54,14 +54,11 @@
                        List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                        if (searchParametersList.Count > 0)
                        {
                            SearchParameters? searchParameters1 = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower());
                            if (searchParameters1 != null)
                            {
                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower());
                                if (searchParameters != null)
                                {
                                    sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters.Value)));
                                }
                                sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters1.Value)));
                            }
                        }
                    }
@@ -81,7 +78,7 @@
                    {
                        ProStockAttribute=b.ProStockAttribute,
                        LocationCode = b.LocationCode,
                        Column = a.Column,
                        Column = a.Columns,
                        WarehouseId = b.WarehouseId,
                        CreateDate = b.CreateDate,
                        Creater = b.Creater,
@@ -100,29 +97,10 @@
                        SumStocks=b.proStockInfoDetails.Sum(x=>x.StockQty)
                    });
                var pklist = sugarQueryable1.Where(b => b.LocationCode == "成品待发货区" || b.LocationCode == "成品包装拣货区").Select(b => new ProStockViewDTO
                {
                    ProStockAttribute = b.ProStockAttribute,
                    LocationCode = b.LocationCode,
                    WarehouseId = b.WarehouseId,
                    CreateDate = b.CreateDate,
                    Creater = b.Creater,
                    LocationName = b.LocationCode,
                    Modifier = b.Modifier,
                    ModifyDate = b.ModifyDate,
                    PalletCode = b.PalletCode,
                    StockRemark = b.Remark,
                    ProStockId = b.Id,
                    StockStatus = b.StockStatus,
                    Details = b.proStockInfoDetails,
                    SumStocks = b.proStockInfoDetails.Sum(x => x.StockQty)
                });
                int totalCount = 0;
                int pktotalCount = 0;
                stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
                stockViewDTOs.AddRange(pklist.ToPageList(options.Page, options.Rows, ref pktotalCount));
                stockViewDTOs.ForEach(x =>
                    {
@@ -214,7 +192,7 @@
                    {
                        ProStockAttribute = b.ProStockAttribute,
                        LocationCode = b.LocationCode,
                        Column = a.Column,
                        Column = a.Columns,
                        WarehouseId = b.WarehouseId,
                        CreateDate = b.CreateDate,
                        Creater = b.Creater,
@@ -294,7 +272,7 @@
                {
                    if (userRole.WarehouseIds.Count > 0)
                    {
                        return $"{nameof(BaseWarehouseEntity.WarehouseId)} in ({userRole.WarehouseIds.Serialize().Replace("[", "").Replace("]", "")})";
                        return $"{nameof(BaseWarehouseEntity.WarehouseId)} in ({userRole.WarehouseIds.OrderBy(x=>x).Serialize().Replace("[", "").Replace("]", "")})";
                    }
                    else
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -29,11 +29,54 @@
using WIDESEA_DTO.Stock;
using SqlSugar;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using WIDESEA_DTO.MES;
namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        static object lock_out = new object();
        /// <summary>
        /// MES自动叫料接口
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ReceiveAutoIssue(MESAutoIssueDTO autoIssueDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取对应单据
                Dt_OutMESOrder? outMESOrder = _outMESOrderRepository.QueryFirst(x=>x.OutDetailId==autoIssueDTO.OutDetailId);
                if (outMESOrder==null)
                {
                    return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{autoIssueDTO.OutDetailId}不存在");
                }
                //获取周转位置编号
                Dt_AGVStationInfo? stationInfo = _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}可配送任务");
                }
                task.TaskStatus = TaskStatusEnum.New.ObjToInt();
                task.TargetAddress= stationInfo.AGVStationCode;
                PushTasksToWCS(new List<Dt_Task> { task });
                return content.OK("叫料成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs
@@ -72,6 +72,8 @@
        private readonly IOutBSTOrderDetailRepository _outBSTOrderDetailRepository;
        private readonly IOutBSTOrderRepository _outBSTOrderRepository;
        private readonly IOutBSTOrderDetailService _outBSTOrderDetailService;
        private readonly IOutMESOrderService _outMESOrderService;
        private readonly IOutMESOrderRepository _outMESOrderRepository;
        public ITaskRepository Repository => BaseDal;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
@@ -84,7 +86,7 @@
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 100 && x < 500).ToList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IPalletTypeInfoRepository palletTypeInfoRepository, IAGVStationInfoRepository agvStationInfoRepository, IPurchaseBSTOrderRepository purchaseBSTOrderRepository, IPurchaseBSTOrderDetailRepository purchaseBSTOrderDetailRepository, IOutBSTOrderDetailRepository outBSTOrderDetailRepository, IOutBSTOrderRepository outBSTOrderRepository,IOutBSTOrderDetailService outBSTOrderDetailService) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IPalletTypeInfoRepository palletTypeInfoRepository, IAGVStationInfoRepository agvStationInfoRepository, IPurchaseBSTOrderRepository purchaseBSTOrderRepository, IPurchaseBSTOrderDetailRepository purchaseBSTOrderDetailRepository, IOutBSTOrderDetailRepository outBSTOrderDetailRepository, IOutBSTOrderRepository outBSTOrderRepository,IOutBSTOrderDetailService outBSTOrderDetailService, IOutMESOrderService outMESOrderService, IOutMESOrderRepository outMESOrderRepository) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -99,9 +101,11 @@
            _agvStationInfoRepository = agvStationInfoRepository;
            _purchaseBSTOrderRepository = purchaseBSTOrderRepository;
            _purchaseBSTOrderDetailRepository = purchaseBSTOrderDetailRepository;
            _outBSTOrderRepository= outBSTOrderRepository;
            _outBSTOrderDetailRepository= outBSTOrderDetailRepository;
            _outBSTOrderDetailService= outBSTOrderDetailService;
            _outBSTOrderRepository = outBSTOrderRepository;
            _outBSTOrderDetailRepository = outBSTOrderDetailRepository;
            _outBSTOrderDetailService = outBSTOrderDetailService;
            _outMESOrderService = outMESOrderService;
            _outMESOrderRepository = outMESOrderRepository;
        }
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -132,10 +132,11 @@
                {
                    return content.Error($"未找到组盘信息");
                }
                if (stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                if (stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.老厂退库.ObjToInt())
                {
                    return content.Error($"该托盘状态不正确,不可申请入库");
                }
                //分配巷道
                string rowWay = AssignYLRoadwayNo(stockInfo.PalletCode);
                if (string.IsNullOrEmpty(rowWay))
                {
@@ -151,13 +152,13 @@
                    Roadway = rowWay,
                    SourceAddress = stationCode,
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskType = stationCode=="307" ? TaskTypeEnum.PaperOldYLBackInbound.ObjToInt() : TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType,
                    TaskLength = (int)stockInfo.MaterielWide
                };
                //更新状态
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
@@ -166,6 +167,7 @@
                {
                    stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                }
                //数据更新
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
@@ -196,10 +198,15 @@
                {
                    return content.OK($"新厂临时入库{stockInfoOld.PalletCode}");
                }
                else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.老厂退库.ObjToInt())
                {
                    return content.OK($"老厂临时退库{stockInfoOld.PalletCode}");
                }
                else if (stockInfoOld != null)
                {
                    return content.Error($"条码{stockInfoOld.PalletCode}信息已存在");
                }
                //获取采购信息
                Dt_PurchaseBSTOrderDetail purchaseBSTOrderDetail = _purchaseBSTOrderDetailRepository.QueryFirst(x=>x.Barcode== palletCode);
                if (purchaseBSTOrderDetail == null)
@@ -283,8 +290,13 @@
                if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
                {
                    //限制直径
                    if (stockInfo.MaterielThickness <= 1250)
                    if (stockInfo.MaterielThickness >= 300 && stockInfo.MaterielThickness <= 1300 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2700)
                    {
                        bool LayerLimit = false;
                        if (stockInfo.MaterielThickness >= 800)
                        {
                            LayerLimit = true;
                        }
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YLDual")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
@@ -293,14 +305,19 @@
                }
                else
                {
                    //限制直径
                    if (stockInfo.MaterielThickness >= 800 && stockInfo.MaterielThickness <= 1450)
                    //限制
                    if (stockInfo.MaterielThickness >= 800 && stockInfo.MaterielThickness <= 1500 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2500)
                    {
                        bool LayerLimit = false;
                        if (stockInfo.MaterielThickness>1300)
                        {
                            LayerLimit = true;
                        }
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL") && !x.RoadwayNo.Contains("YLDual")).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.OnlyIn.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();
                        if (stockInfo.MaterielWide > 2200)
                        {
                            locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo == "SC02_YL").GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                            locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo == "SC02_YL" && (LayerLimit ? x.Columns >= 56 : x.Columns <= 55)).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        }
                        roadwayNo = HandleRoadway(locationCounts, warehouse);
@@ -330,7 +347,7 @@
                    item.Count -= count.Count;
                }
            }
            return locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
            return locationCounts.Where(x => x.Count > 0).OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
        }
        /// <summary>
        /// å…¥åº“完成
@@ -462,7 +479,7 @@
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                //筛选当前入库任务中已分配巷道任务数量
                List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => (x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt()|| x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt())
                && locationCounts.Select(j=>j.RoadwayNo).Contains(x.Roadway)
                && locationCounts.Select(j=>j.RoadwayNo).Distinct().Contains(x.Roadway)
                && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                foreach (var item in locationCounts)
                {
@@ -473,7 +490,7 @@
                    }
                }
                //通过可用货位数量排序,最多的优先分配
                roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                roadwayNo = locationCounts.Where(x=>x.Count>0).OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -32,46 +32,45 @@
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public WebResponseContent Outbound(int id)
        public WebResponseContent Outbound(List<int> ids)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.Id == id).First();
                if (stockInfo == null)
                //获取选定库存
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => ids.Contains(x.Id) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt()).ToList();
                if (stockInfos == null || stockInfos.Count != ids.Count)
                {
                    return content.Error($"未找到库存");
                }
                Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && stockInfo.StockStatus == StockStatusEmun.入库完成.ObjToInt())
                //获取库存货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x =>x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && stockInfos.Select(x=>x.LocationCode).Contains(x.LocationCode) && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()));
                if (locationInfos == null || locationInfos.Count != stockInfos.Count)
                {
                    List<Dt_Task> tasks = GetTasks(new List<Dt_StockInfo>() { stockInfo }, TaskTypeEnum.Outbound);
                    if (tasks == null || tasks.Count <= 0)
                    {
                        return content.Error($"生成任务失败");
                    }
                    //处理库存数据
                    stockInfo.StockStatus = (int)StockStatusEmun.出库锁定;
                    LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                    locationInfo.LocationStatus = (int)LocationStatusEnum.Lock;
                    //判断是否有出库单信息
                    _unitOfWorkManage.BeginTran();
                    //更新库存状态
                    _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                    //更新货位状态
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                    //新建任务
                    BaseDal.AddData(tasks);
                    //加入货位变动记录
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.OrderNo ?? "", tasks[0].TaskNum);
                    _unitOfWorkManage.CommitTran();
                    PushTasksToWCS(tasks);
                    content.OK();
                    return content.Error($"货位出库条件不满足");
                }
                else
                //任务生成
                List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OldYLOutbound);
                if (tasks == null || tasks.Count <= 0)
                {
                    content.Error($"货位出库条件不满足");
                    return content.Error($"生成任务失败");
                }
                stockInfos.ForEach(x =>
                {
                    x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                });
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.StockInfoRepository.UpdateData(stockInfos);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
@@ -146,7 +145,7 @@
            }
        }
        /// <summary>
        /// åº“存数据转出库任务
        /// åº“存数据转出库任务(原料/半成品)
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <returns></returns>
@@ -189,6 +188,9 @@
            }
            return tasks;
        }
        /// <summary>
        /// åº“存数据转出库任务(辅料/成品)
        /// </summary>
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, TaskTypeEnum taskType,List<Dt_LocationInfo> locationInfos)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
@@ -245,7 +247,7 @@
                .Where(x => x.proStockInfoDetails
                .Any(v =>
                    v.ProductCode == materialCode)
                ).ToList();
                ).Take(Count).ToList();
                if (stockInfos.Count!=Count)
                {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Reloaction.cs
@@ -45,7 +45,7 @@
                List<Dt_LocationInfo> littleDepthLocations = _basicService.LocationInfoService.GetGroupLocations(locationInfo);
                Dt_LocationInfo? needRelocationItem = littleDepthLocations.Where(x => x.LocationStatus != LocationStatusEnum.Free.ObjToInt() && x.LocationStatus != LocationStatusEnum.PalletLock.ObjToInt() && x.LocationStatus != LocationStatusEnum.FreeLock.ObjToInt() && x.Depth < locationInfo.Depth).OrderBy(x => x.Depth).FirstOrDefault();
                Dt_LocationInfo? needRelocationItem = littleDepthLocations.Where(x => x.LocationStatus != LocationStatusEnum.Free.ObjToInt() && x.LocationStatus != LocationStatusEnum.FreeLock.ObjToInt() && x.Depth < locationInfo.Depth).OrderBy(x => x.Depth).FirstOrDefault();
                if (needRelocationItem == null)
                {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Basic/LocationInfoRowController.cs
@@ -81,7 +81,7 @@
                            //列
                            row = data_col.Row,
                            layer = data_col.Layer,
                            index = data_col.Column,
                            index = data_col.Columns,
                            locationCode = data_col.LocationCode,
                            location_state = data_col.LocationStatus,
                            location_lock = data_col.EnableStatus,
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/MES/MesController.cs
@@ -10,6 +10,10 @@
using WIDESEA_Core.Helper;
using Autofac.Core;
using WIDESEA_DTO.Stock;
using WIDESEA_BasicService;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.MES;
using WIDESEA_IOutboundService;
namespace WIDESEA_WMSServer.Controllers.MES
{
@@ -21,11 +25,76 @@
    public class MesController : ControllerBase
    {
        private readonly ITaskService _taskService;
        private readonly IOutMESOrderService _outMESOrderService;
        public MesController(ITaskService taskService)
        public MesController(ITaskService taskService,IOutMESOrderService outMESOrderService)
        {
            _taskService = taskService;
            _outMESOrderService = outMESOrderService;
        }
        /// <summary>
        /// æŽ¥æ”¶MES领料计划
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveOutBound"), AllowAnonymous]
        public WebResponseContent ReceiveOutBound([FromBody] OutMESOrderDTO outMESOrderDTO)
        {
            return _outMESOrderService.ReceiveOutBound(outMESOrderDTO);
        }
        /// <summary>
        /// MES自动叫料接口
        /// </summary>
        /// <returns></returns>
        /// <summary>
        [HttpPost, HttpGet, Route("ReceiveAutoIssue"), AllowAnonymous]
        public WebResponseContent ReceiveAutoIssue([FromBody] MESAutoIssueDTO autoIssueDTO)
        {
            return _taskService.ReceiveAutoIssue(autoIssueDTO);
        }
        /// <summary>
        /// MES手动叫料接口
        /// </summary>
        /// <returns></returns>
        /// <summary>
        [HttpPost, HttpGet, Route("ReceiveManualIssue"), AllowAnonymous]
        public WebResponseContent ReceiveManualIssue([FromBody] MESAutoIssueDTO autoIssueDTO)
        {
            return _taskService.ReceiveAutoIssue(autoIssueDTO);
        }
        /// <summary>
        /// MES空托/余料呼叫接口
        /// </summary>
        /// <returns></returns>
        /// <summary>
        [HttpPost, HttpGet, Route("ReceiveReturnIssue"), AllowAnonymous]
        public WebResponseContent ReceiveReturnIssue([FromBody] MESAutoIssueDTO autoIssueDTO)
        {
            return _taskService.ReceiveAutoIssue(autoIssueDTO);
        }
        /// <summary>
        /// æˆå“/半成品信息同步接口
        /// </summary>
        /// <returns></returns>
        /// <summary>
        [HttpPost, HttpGet, Route("ReceiveProCodeInfo"), AllowAnonymous]
        public WebResponseContent ReceiveProCodeInfo([FromBody] MESAutoIssueDTO autoIssueDTO)
        {
            return _taskService.ReceiveAutoIssue(autoIssueDTO);
        }
        /// <summary>
        /// MES工单停止接口
        /// </summary>
        /// <returns></returns>
        /// <summary>
        [HttpPost, HttpGet, Route("ReceiveProOrderStop"), AllowAnonymous]
        public WebResponseContent ReceiveProOrderStop([FromBody] MESAutoIssueDTO autoIssueDTO)
        {
            return _taskService.ReceiveAutoIssue(autoIssueDTO);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Outbound/OutMESOrderController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core.BaseController;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Outbound
{
    /// <summary>
    /// MES领料计划单
    /// </summary>
    [Route("api/OutMESOrder")]
    [ApiController]
    public class OutMESOrderController : ApiBaseController<IOutMESOrderService, Dt_OutMESOrder>
    {
        public OutMESOrderController(IOutMESOrderService service) : base(service)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -45,7 +45,7 @@
        {
            return Service.AssignInboundTaskLocation(taskNum, roadwayNo);
        }
        /// <summary>
        /// æˆå“ç©ºæ¡†å›žåº“
        /// </summary>
@@ -104,14 +104,13 @@
        }
        /// <summary>
        /// é€‰æ‹©åº“存生成出库任务
        /// é€‰æ‹©åº“存生成老厂出库任务
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpPost, Route("Outbound"), AllowAnonymous]
        public WebResponseContent Outbound(int id)
        [HttpPost, Route("OldYLOutbound"), AllowAnonymous]
        public WebResponseContent Outbound([FromBody] List<int> ids)
        {
            return Service.Outbound(id);
            return Service.Outbound(ids);
        }
        /// <summary>
@@ -203,9 +202,6 @@
        /// <summary>
        /// åŽŸæ–™ç§»åº“ä»»åŠ¡
        /// </summary>
        /// <param name="startAddress"></param>
        /// <param name="endAddress"></param>
        /// <param name="roadWay"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("Relocation"), AllowAnonymous]
        public WebResponseContent IsRelocation(string startAddress, string endAddress, string roadWay)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs
@@ -15,6 +15,7 @@
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.System;
using WIDESEA_DTO.Task;
using WIDESEA_Model.Models;
@@ -43,6 +44,8 @@
            //BST退料单实体转换
            CreateMap<BSTReturnOrderDTO, Dt_ReturnBSTOrder>().ForMember(x => x.ReturnOrderStatus, b => b.MapFrom(b => InOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.WreturnDate, b => b.MapFrom(b => DateTimeOffset.FromUnixTimeMilliseconds(b.WreturnDate).DateTime)).ForMember(x => x.WarehouseId, b => b.MapFrom(b => WarehouseEnum.LLDYL.ObjToInt()));
            CreateMap<BSTReturnOrderDTOItem, Dt_ReturnBSTOrderDetail>().ForMember(x => x.ReturnBSTOrderDetailStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.MaterialWide, b => b.MapFrom(b => b.W)).ForMember(x => x.MaterialThick, b => b.MapFrom(b => b.Thick));
            //MES领料计划实体转换
            CreateMap<OutMESOrderDTO, Dt_OutMESOrder>().ForMember(x => x.OutMESOrderStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt()));
        }
    }
}
ÏîÄ¿×ÊÁÏ/¼¼ÊõЭÒé/AGV×÷ÒµÁ÷³Ì0911.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/²©Ë¼Í¨ÀûÍØ½Ó¿Ú.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÃMES½Ó¿Ú.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/~$Ö½±­Ö½ÏäÉÏÁÏèì¼ÜͨѶЭÒé.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/Ô­ÁÏ¿âÊäËÍÏßͨѶЭÒé.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ÏîĿͼֽ/ÁúÀûµÃÖ½¾í¿â¡ª¡ªÖ½¾í¿â»õ¼Ü¡ª¡ª×Üͼ¡ª¡ª2025-05-20ÏÖ³¡¸ü¸Ä¶Ë²¿Íø¼Ü³öͼ.dwg
Binary files differ