wangxinhui
昨天 c6e8b600398de38b6684f5fa1eaaaade8562859b
Merge branch 'master' of http://115.159.85.185:8098/r/ZhiHuiQiCe/LongDeLiLiKu
已修改17个文件
已添加21个文件
3548 ■■■■■ 文件已修改
项目代码/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 885 ●●●●● 补丁 | 查看 | 原始文档 | 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_DTO/Equipment/EquipmentDTO.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | 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 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | 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 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC3.cs 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/Task/RequestInbound.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/码垛/MDJob_CP.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/.vs/WIDESEA_WMSServer/v17/DocumentLayout.backup.json 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/.vs/WIDESEA_WMSServer/v17/DocumentLayout.json 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/~$纸杯纸箱上料桁架通讯协议.xlsx 补丁 | 查看 | 原始文档 | 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() {
    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_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
@@ -329,6 +330,22 @@
                {
                    return content.Error($"未找到对应设备");
                }
                if (device.DeviceCode.Contains("Plate"))
                {
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    StackPlateTaskCommandCommand command = commonConveyorLine.ReadCustomer<StackPlateTaskCommandCommand>(device.DeviceCode);
                    if (command != null && command.State == 2 && command.InteractiveSignal == 1)
                    {
                        return content.OK("允许放料");
                    }
                    else
                    {
                        return content.Error("禁止放料");
                    }
                }
                else
                {
                OtherDevice otherDevice = (OtherDevice)device;
@@ -382,7 +399,7 @@
                        return content.Error("禁止放料");
                    }
                }
                }
                return content;
            }
            catch (Exception ex)
@@ -412,7 +429,14 @@
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备");
                }
                if (device.DeviceCode.Contains("Plate"))
                {
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    commonConveyorLine.SetValue(StackPlateDBName.WriteInteractiveSignal, Convert.ToInt16(1), device.DeviceCode);
                    return WebResponseContent.Instance.OK();
                }
                else
                {
                OtherDevice otherDevice = (OtherDevice)device;
                if (device.DeviceCode.Contains("Coveryor"))//接驳台
                {
@@ -421,6 +445,7 @@
                else if (device.DeviceCode.Contains("Retract"))//伸缩货叉
                {
                    otherDevice.SetValue(RetractDB.Ret_PutFinish, true, stationManger.StationDeviceCode);
                    }
                }
                return WebResponseContent.Instance.OK();
            }
@@ -452,7 +477,22 @@
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备{stationManger.StationDeviceCode}");
                }
                if (device.DeviceCode.Contains("Plate"))
                {
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    StackPlateTaskCommandCommand command = commonConveyorLine.ReadCustomer<StackPlateTaskCommandCommand>(device.DeviceCode);
                    if (command != null&&command.State == 2 && command.InteractiveSignal == 2)
                    {
                        return content.OK("允许取料");
                    }
                    else
                    {
                        return content.Error("禁止取料");
                    }
                }
                else
                {
                OtherDevice otherDevice = (OtherDevice)device;
                if (otherDevice.DeviceCode.Contains("CP"))//成品输送线
@@ -491,7 +531,7 @@
                        return content.Error("禁止取料");
                    }
                }
                }
                return content;
            }
            catch (Exception ex)
@@ -521,7 +561,14 @@
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备");
                }
                if (device.DeviceCode.Contains("Plate"))
                {
                    CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                    commonConveyorLine.SetValue(StackPlateDBName.WriteInteractiveSignal, Convert.ToInt16(2), device.DeviceCode);
                    return WebResponseContent.Instance.OK();
                }
                else
                {
                OtherDevice otherDevice = (OtherDevice)device;
                if (device.DeviceCode.Contains("CP"))
                {
@@ -535,6 +582,7 @@
                {
                    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
@@ -462,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>
@@ -765,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)
@@ -788,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;
                    }
@@ -805,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;
@@ -825,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/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;
            #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/Ô­ÁÏ¿â/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);
ÏîÄ¿´úÂë/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/Âë¶â/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);
                            }
                            ConsoleHelper.WriteInfoLine($"码垛工位{item.StationCode}状态{Allow}");
                            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) //码垛申请
                            {
                                if (Allow == 3 || Allow == 7)
                                {
                                    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,13 +139,21 @@
                                    #endregion
                                    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}码垛");
                                }
ÏîÄ¿´úÂë/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": ""
            }
          ]
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/~$Ö½±­Ö½ÏäÉÏÁÏèì¼ÜͨѶЭÒé.xlsx
Binary files differ