f23e0326aa05a1c5b47d4aec4c06e73d0d86b8e7..8e49faa42ff419efa0641478702ce7d5f8455bd9
10 天以前 huangxiaoqiang
1
8e49fa 对比 | 目录
10 天以前 huangxiaoqiang
1
8bcecb 对比 | 目录
10 天以前 huangxiaoqiang
忽略文件
41e899 对比 | 目录
10 天以前 huangxiaoqiang
代码提交
4110b7 对比 | 目录
10 天以前 huangxiaoqiang
忽略文件
324d3b 对比 | 目录
已添加1个文件
已修改23个文件
已删除2个文件
6336 ■■■■ 文件已修改
.gitignore 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/views/Home.vue 1265 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/views/LineComponent copy.vue 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/views/LineComponent.vue 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/views/LineInfo.vue 438 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/views/LineInfocopy.vue 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.metadata.v9.bin 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.projects.v9.bin 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.strings.v9.bin 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/HandTask/StackerHandTask.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs 1113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/IDeviceInfoService.cs 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceInfoController.cs 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/bin/Debug/net6.0/Log/2025-07-29/Info_调度任务控制_17-26-35.log 2232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RGVJob/CommonRGVJob.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RGVJob/RGVDBName.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RGVJob_FirstFloor/CommonRGV_FirstFloorJob.cs 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneDBName.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -3258,3 +3258,25 @@
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8e5c2ad7-336b-4cca-a14a-35776502c69d.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c52e40b6-c48b-4b97-b45c-c5cb4389287a.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/d00db2db-d8c4-429a-bbb5-be0caac522d5.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/091a3753-b9c0-44be-a409-27a05baf991c.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/43d237a3-be27-4d7c-8b7a-3579428633ed.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/96550164-889f-4451-bb42-472ed42c702f.vsidx
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/bin/Debug/net6.0/Log/2025-07-29/Info_调度任务控制_17-26-35.log
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_BasicInfoRepository.dll
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/bin/Debug/net6.0/Log_PLCReadWrite/二号堆垛机/Logs_20250730111710.txt
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_Model.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_BasicInfoRepository.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_BasicInfoRepository.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_Common.dll
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_Common.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_DTO.dll
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_DTO.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_IBasicInfoRepository.dll
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_IBasicInfoRepository.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_IBasicInfoRepository.pdb
/项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/bin/Debug/net6.0/WIDESEAWCS_Model.dll
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/83a81fe9-7165-4cd5-bb46-607acaa174b7.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/976c1c18-4a0b-4906-b9c6-4de0821e413d.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9f056991-1c02-4f45-af7c-d12f835ac7f3.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9f056991-1c02-4f45-af7c-d12f835ac7f3.vsidx
/项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/665fe3b3-a2a4-414f-bc89-34892fd3a2b8.vsidx
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/views/Home.vue
@@ -1,18 +1,72 @@
<template>
    <div>
        111
    </div>
    <div class="title">
        <el-row :gutter="20" style="height:100%">
        <el-row :gutter="20" style="height:85%">
            <el-col :span="8">
                <span style="position: relative; top: 100px;left: 30px;">第一层</span>
                <span style="position: relative; top: 100px;left: 30px;">
                    <h4>一楼设备监控</h4>
                </span>
                <el-row :gutter="20" style="height:1000px">
                    <el-col :span="8"></el-col>
                    <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 class="line-container">
                            <div class="RGVline"></div>
                            <div :class="updateRGVOne()" :style="{ marginTop: RGV01.LevelPoint + 'px' }" ref="childDot" @click="mouseClick">1</div>
                            <div :class="updateRGVTwo()" :style="{ marginTop: RGV02.LevelPoint + 'px' }" ref="childDot" @click="mouseClick">2</div>
                            <div :class="updateRGVOne()" :style="{ marginTop: RGV01.LevelPoint + 'px' }"
                                @click="mouseClickRGVFirst">1</div>
                            <div :class="updateRGVTwo()" :style="{ marginTop: 1000 + 'px' }" @click="mouseClickSecond">2
                            </div>
                        </div>
                    </el-col>
                    <el-col :span="8">
@@ -21,7 +75,8 @@
                                <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" />
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 118px;"></div>
@@ -29,7 +84,8 @@
                                <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" />
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 115px;"></div>
@@ -37,7 +93,8 @@
                                <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" />
                                        :positionY="line.positionY" :condition="line.condition"
                                        url="api/Equipment/GetLineInfoByNo" />
                                </div>
                            </div>
                            <div style="margin-top: 112px;"></div>
@@ -103,86 +160,415 @@
                    </div>
                </div>
            </el-col>
            <!-- <el-col :span="8">
                <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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                        </div>
                    </div>
                    <div style="margin-top: 105px;"></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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                        </div>
                    </div>
                    <div style="margin-top: 105px;"></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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                        </div>
                    </div>
                    <div style="margin-top: 105px;"></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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                        </div>
                    </div>
                    <div style="margin-top: 100px;"></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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                        </div>
                    </div>
                    <div style="margin-top: 100px;"></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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                        </div>
                    </div>
                </div>
            </el-col> -->
        </el-row>
        <el-row :gutter="20" class="cardWidthrow">
            <el-col :span="12">
                <div>
                    <span style="position: relative; top: 120px;left: 30px;">第二层</span>
                    <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"
                                url="api/Equipment/GetLineInfoByNo" :condition="line.condition" />
                    <el-row :gutter="20" style="height:1000px;margin-top:50px;">
                        <span style="position: relative; top: 150px;left: 30px;">第二层</span>
                        <div>
                            <div v-for="(group, index) in groupedLines(linescopy13)" :key="index">
                                <div class="positionY-group">
                                    <LineInfo 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>
                    </div>
                        <div class="line-containerThird">
                            <div class="lineThird"></div>
                            <div :class="updateRGVThird()"
                                :style="{ transform: `translateX(${RGV03.LevelPoint}px)`, marginTop: '3px' }"
                                @click="mouseClickThird">3</div>
                        </div>
                        <div style="margin-top:180px;margin-right:100px">
                            <div v-for="(group, index) in groupedLines(linescopy14)" :key="index">
                                <div class="positionY-group">
                                    <LineInfo 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>
                    </el-row>
                </div>
            </el-col>
        </el-row>
    </div>
    <el-dialog v-model="RGVFirst" title="RGV信息查看" :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="RGV01.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="RGV01.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="RGV01.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="RGV01.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="RGV01.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="RGV01.LevelPoint" 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="RGV01.Alarm" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-divider />
            <h4 style="margin-bottom: 50px;">手动操作</h4>
            <el-form ref="form" :model="formRGV" 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="formRGV.TaskType" placeholder="请选择任务命令">
                                <el-option label="取定位" value="1" />
                                <el-option label="放定位" value="2" />
                                <el-option label="取货" value="3" />
                                <el-option label="放货" value="4" />
                                <el-option label="取放货" value="5" />
                                <el-option label="退回" value="6" />
                            </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="formRGV.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="formRGV.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="4" :offset="0" :push="0" :pull="0" tag="div">
                    <el-button type="primary" size="small" plain @click="SendCommand(RGV01.DeviceCode)">
                        <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="RGVReset(RGV01.DeviceCode)">
                        <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="RGVemergencyStop(RGV01.DeviceCode)">
                        <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="RGVPause(RGV01.DeviceCode)">
                        <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="RGVCancel(RGV01.DeviceCode)">
                        <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="RGVInitialize(RGV01.DeviceCode)">
                        <i class="el-icon-check">工位初始化</i>
                    </el-button>
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="RGVFirst = false">取消</el-button>
                <el-button type="primary" @click="RGVFirst = false">
                    ç¡®è®¤
                </el-button>
            </div>
        </template>
    </el-dialog>
    <el-dialog v-model="RGVSecond" title="RGV信息查看" :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="RGV02.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="RGV02.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="RGV02.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="RGV02.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="RGV02.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="RGV02.LevelPoint" 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="RGV02.Alarm" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-divider />
            <h4 style="margin-bottom: 50px;">手动操作</h4>
            <el-form ref="form" :model="formRGV" 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="formRGV.TaskType" placeholder="请选择任务命令">
                                <el-option label="取定位" value="1" />
                                <el-option label="放定位" value="2" />
                                <el-option label="取货" value="3" />
                                <el-option label="放货" value="4" />
                                <el-option label="取放货" value="5" />
                                <el-option label="退回" value="6" />
                            </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="formRGV.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="formRGV.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="4" :offset="0" :push="0" :pull="0" tag="div">
                    <el-button type="primary" size="small" plain @click="SendCommand(RGV02.DeviceCode)">
                        <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="RGVReset(RGV02.DeviceCode)">
                        <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="RGVemergencyStop(RGV02.DeviceCode)">
                        <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="RGVPause(RGV02.DeviceCode)">
                        <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="RGVCancel(RGV02.DeviceCode)">
                        <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="RGVInitialize(RGV02.DeviceCode)">
                        <i class="el-icon-check">工位初始化</i>
                    </el-button>
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="RGVSecond = false">取消</el-button>
                <el-button type="primary" @click="RGVSecond = false">
                    ç¡®è®¤
                </el-button>
            </div>
        </template>
    </el-dialog>
    <el-dialog v-model="RGVThird" title="RGV信息查看" :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="RGV03.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="RGV03.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="RGV03.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="RGV03.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="RGV03.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="RGV03.LevelPoint" 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="RGV03.Alarm" type="primary" ellipsis></j-el-description>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-divider />
            <h4 style="margin-bottom: 50px;">手动操作</h4>
            <el-form ref="form" :model="formRGV" 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="formRGV.TaskType" placeholder="请选择任务命令">
                                <el-option label="取定位" value="1" />
                                <el-option label="放定位" value="2" />
                                <el-option label="取货" value="3" />
                                <el-option label="放货" value="4" />
                                <el-option label="取放货" value="5" />
                                <el-option label="退回" value="6" />
                            </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="formRGV.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="formRGV.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="4" :offset="0" :push="0" :pull="0" tag="div">
                    <el-button type="primary" size="small" plain @click="SendCommand(RGV03.DeviceCode)">
                        <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="RGVReset(RGV03.DeviceCode)">
                        <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="RGVemergencyStop(RGV03.DeviceCode)">
                        <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="RGVPause(RGV03.DeviceCode)">
                        <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="RGVCancel(RGV03.DeviceCode)">
                        <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="RGVInitialize(RGV03.DeviceCode)">
                        <i class="el-icon-check">工位初始化</i>
                    </el-button>
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="RGVThird = false">取消</el-button>
                <el-button type="primary" @click="RGVThird = false">
                    ç¡®è®¤
                </el-button>
            </div>
        </template>
    </el-dialog>
</template>
<script>
import { onMounted, ref, reactive } from "vue";
// import StackerInfo from "./StackerInfo.vue";
// import LineInfo from "./LineInfo.vue";
import LineInfo from "./LineInfo.vue";
import LineInfoCopy from "./LineInfocopy.vue";
import LineComponent from './LineComponent.vue';
import eventBus from "../uitils/eventBus";
import JElDescription from "./JElDescription";
export default {
    data() {
@@ -536,6 +922,343 @@
                    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,
                },
            ],
            linescopy13: [
                {
                    equipNo: "3005",
                    imgType: "2",
                    positionX: 5,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3006",
                    imgType: "2",
                    positionX: 5,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3007",
                    imgType: "2",
                    positionX: 6,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3008",
                    imgType: "2",
                    positionX: 6,
                    positionY: 9,
                    condition: false,
                }, {
                    equipNo: "3010",
                    imgType: "2",
                    positionX: 8,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3009",
                    imgType: "2",
                    positionX: 8,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3012",
                    imgType: "2",
                    positionX: 9,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3011",
                    imgType: "2",
                    positionX: 9,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3014",
                    imgType: "2",
                    positionX: 11,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3013",
                    imgType: "2",
                    positionX: 11,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3016",
                    imgType: "2",
                    positionX: 12,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3015",
                    imgType: "2",
                    positionX: 12,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3018",
                    imgType: "2",
                    positionX: 14,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3017",
                    imgType: "2",
                    positionX: 14,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3020",
                    imgType: "2",
                    positionX: 15,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3019",
                    imgType: "2",
                    positionX: 15,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3022",
                    imgType: "2",
                    positionX: 17,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3021",
                    imgType: "2",
                    positionX: 17,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3024",
                    imgType: "2",
                    positionX: 18,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3023",
                    imgType: "2",
                    positionX: 18,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3026",
                    imgType: "2",
                    positionX: 20,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3025",
                    imgType: "2",
                    positionX: 20,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3028",
                    imgType: "2",
                    positionX: 21,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3027",
                    imgType: "2",
                    positionX: 21,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3030",
                    imgType: "2",
                    positionX: 23,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3029",
                    imgType: "2",
                    positionX: 23,
                    positionY: 9,
                    condition: false,
                },
                {
                    equipNo: "3032",
                    imgType: "2",
                    positionX: 24,
                    positionY: 8,
                    condition: false,
                },
                {
                    equipNo: "3031",
                    imgType: "2",
                    positionX: 24,
                    positionY: 9,
                    condition: false,
                },
            ],
            linescopy14: [
                {
                    equipNo: "3004",
                    imgType: "2",
                    positionX: -8,
                    positionY: 1,
                    condition: false,
                },
                {
                    equipNo: "3002",
                    imgType: "2",
                    positionX: -6,
                    positionY: 1,
                    condition: false,
                },
                {
                    equipNo: "3001",
                    imgType: "2",
                    positionX: -5,
                    positionY: 2,
                    condition: false,
                },
            ],
            StackerCrane: {
                Automatic: "",
                Fault: "",
@@ -545,7 +1268,12 @@
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCOde: "",
                StackerAlarm: "",
            },
            RGVFirst: false,
            RGVSecond: false,
            RGVThird: false,
            xValue1: 0,
            xValue2: 0,
            xValue3: 0,
@@ -554,38 +1282,49 @@
            xValue6: 0,
            timer1: null, // å®šæ—¶å™¨å˜é‡
            timer2: null, // å®šæ—¶å™¨å˜é‡
            RGV01:{
            RGV01: {
                Automatic: "",
                Fault: "",
                LevelPoint:0,
                LevelPoint: 0,
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCode:"RGV01",
                DeviceCode: "RGV01",
                Alarm:"",
            },
            RGV02:{
            RGV02: {
                Automatic: "",
                Fault: "",
                LevelPoint:1280,
                LevelPoint: 1280,
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCode:"RGV02",
                DeviceCode: "RGV02",
                Alarm:"",
            },
            RGV03:{
            RGV03: {
                Automatic: "",
                Fault: "",
                LevelPoint:0,
                LevelPoint: 0,
                CurrentTaskNum: "",
                Running: "",
                DeviceName: "",
                DeviceCode:"",
                DeviceCode: "RGV03",
                Alarm:"",
            },
            formRGV: {
                TaskType: "",
                SourceAddress: "",
                TargetAddress: "",
                DeviceCode: "",
            },
        };
    },
    components: {
        LineInfoCopy,
        LineInfo,
        LineComponent,
        JElDescription,
    },
    methods: {
        groupedLines(linescopy) {
@@ -602,41 +1341,144 @@
            });
            return Object.values(groups);
        },
        updateRGVOne(){
        if(this.RGV01.Automatic=="联机模式"&&this.RGV01.Fault!="故障"&&this.RGV01.Running=="待机"){
          return 'dot-Automatic ';
        }
        else if(this.RGV01.Automatic=="联机模式"&&this.RGV01.Fault!="故障"&&this.RGV01.Running=="运行中"){
          return 'dot-Running ';
        }else if(this.RGV01.Fault=="故障"){
          return 'dot-Fault ';
        }else{
          return 'dot-Fault ';
        }
        updateRGVOne() {
            if (this.RGV01.Automatic == "联机模式" && this.RGV01.Fault != "故障" && this.RGV01.Running == "待机") {
                return 'dot-Automatic ';
            }
            else if (this.RGV01.Automatic == "联机模式" && this.RGV01.Fault != "故障" && this.RGV01.Running == "运行中") {
                return 'dot-Running ';
            } else if (this.RGV01.Fault == "故障") {
                return 'dot-Fault ';
            } else {
                return 'dot-Fault ';
            }
        },
        updateRGVTwo(){
            if(this.RGV02.Automatic=="联机模式"&&this.RGV02.Fault!="故障"&&this.RGV02.Running=="待机"){
          return 'dot-Automatic ';
        }
        else if(this.RGV02.Automatic=="联机模式"&&this.RGV01.Fault!="故障"&&this.RGV02.Running=="运行中"){
          return 'dot-Running ';
        }else if(this.RGV02.Fault=="故障"){
          return 'dot-Fault ';
        }else{
          return 'dot-Fault ';
        }
        updateRGVTwo() {
            if (this.RGV02.Automatic == "联机模式" && this.RGV02.Fault != "故障" && this.RGV02.Running == "待机") {
                return 'dot-Automatic ';
            }
            else if (this.RGV02.Automatic == "联机模式" && this.RGV01.Fault != "故障" && this.RGV02.Running == "运行中") {
                return 'dot-Running ';
            } else if (this.RGV02.Fault == "故障") {
                return 'dot-Fault ';
            } else {
                return 'dot-Fault ';
            }
        },
        updateRGV03(){
            if(this.RGV03.Automatic=="联机模式"&&this.RGV03.Fault!="故障"&&this.RGV03.Running=="待机"){
          return 'dot-Automatic ';
        }
        else if(this.RGV03.Automatic=="联机模式"&&this.RGV03.Fault!="故障"&&this.RGV03.Running=="运行中"){
          return 'dot-Running ';
        }else if(this.RGV03.Fault=="故障"){
          return 'dot-Fault ';
        }else{
          return 'dot-Fault ';
        }
        updateRGVThird() {
            if (this.RGV03.Automatic == "联机模式" && this.RGV03.Fault != "故障" && this.RGV03.Running == "待机") {
                return 'dot-Automatic ';
            }
            else if (this.RGV03.Automatic == "联机模式" && this.RGV03.Fault != "故障" && this.RGV03.Running == "运行中") {
                return 'dot-Running ';
            } else if (this.RGV03.Fault == "故障") {
                return 'dot-Fault ';
            } else {
                return 'dot-Fault ';
            }
        },
        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: {
@@ -646,7 +1488,7 @@
    },
    created() {
        eventBus.on('stackerData', eventData => {
            const stackerComponentsMap = {
                "SC01": 'stacker1',
                "SC02": 'stacker2',
@@ -657,53 +1499,72 @@
            };
            const componentKey = stackerComponentsMap[eventData.data.deviceCode];
            if (componentKey) {
                this.StackerCrane.Automatic=eventData.data.automatic;
                this.StackerCrane.Fault=eventData.data.fault;
                this.StackerCrane.Running=eventData.data.running;
                this.StackerCrane.CurrentColumn=eventData.data.currentColumn;
                this.StackerCrane.CurrentLayer=eventData.data.currentLayer;
                this.StackerCrane.LevelPoint=eventData.data.levelPoint;
                this.StackerCrane.DeviceName=eventData.data.deviceName;
                this.StackerCrane.Automatic = eventData.data.automatic;
                this.StackerCrane.Fault = eventData.data.fault;
                this.StackerCrane.Running = eventData.data.running;
                this.StackerCrane.CurrentColumn = eventData.data.currentColumn;
                this.StackerCrane.CurrentLayer = eventData.data.currentLayer;
                this.StackerCrane.LevelPoint = eventData.data.levelPoint;
                this.StackerCrane.DeviceName = eventData.data.deviceName;
                this.StackerCrane.DeviceCode = eventData.data.deviceCode;
                this.StackerCrane.StackerAlarm = eventData.data.stackerAlarm;
                this.$nextTick(() => {
                    this.$refs[componentKey].moveDot(this.StackerCrane);
                });
            }
        });
        eventBus.on('RGVData', eventData => {
            if(eventData.data.deviceCode=="RGV01"){
                this.RGV01.Automatic=eventData.data.automatic;
                this.RGV01.Fault=eventData.data.fault;
                this.RGV01.Running=eventData.data.running;
                this.RGV01.LevelPoint=eventData.data.levelPoint;
                this.RGV01.DeviceName=eventData.data.deviceName;
                console.log(this.RGV01.LevelPoint)
            }else if(eventData.data.deviceCode=="RGV02"){
                this.RGV02.Automatic=eventData.data.automatic;
                this.RGV02.Fault=eventData.data.fault;
                this.RGV02.Running=eventData.data.running;
                this.RGV02.LevelPoint=eventData.data.levelPoint;
                this.RGV02.DeviceName=eventData.data.deviceName;
            }else if(eventData.data.deviceCode=="RGV03"){
                this.RGV03.Automatic=eventData.data.automatic;
                this.RGV03.Fault=eventData.data.fault;
                this.RGV03.Running=eventData.data.running;
                this.RGV03.LevelPoint=eventData.data.levelPoint;
                this.RGV03.DeviceName=eventData.data.deviceName;
        eventBus.on('RGVData', x => {
            if (x.data.deviceCode == "RGV01") {
                this.RGV01.Automatic = x.data.automatic == null ? "故障" : x.data.automatic;
                this.RGV01.Fault = x.data.fault == null ? "故障" : x.data.fault;
                this.RGV01.Running = x.data.running == null ? "故障" : x.data.running;
                this.RGV01.LevelPoint = x.data.levelPoint;
                this.RGV01.DeviceName = x.data.deviceName;
                this.RGV01.DeviceCode = x.data.deviceCode;
                this.RGV01.Alarm = x.data.alarm;
            } else if (x.data.deviceCode == "RGV02") {
                this.RGV02.Automatic = x.data.automatic == null ? "故障" : x.data.automatic;
                this.RGV02.Fault = x.data.fault == null ? "故障" : x.data.fault;
                this.RGV02.Running = x.data.running == null ? "故障" : x.data.running;
                this.RGV02.LevelPoint = x.data.levelPoint;
                this.RGV02.DeviceName = x.data.deviceName;
                this.RGV02.Alarm = x.data.alarm;
            } else if (x.data.deviceCode == "RGV03") {
                this.RGV03.Automatic = x.data.automatic == null ? "故障" : x.data.automatic;
                this.RGV03.Fault = x.data.fault == null ? "故障" : x.data.fault;
                this.RGV03.Running = x.data.running == null ? "故障" : x.data.running;
                this.RGV03.LevelPoint = x.data.levelPoint;
                this.RGV03.DeviceName = x.data.deviceName;
                this.RGV03.Alarm = x.data.alarm;
            }
        });
        eventBus.on("LineData", eventData => {
            const stationMap = {
                "SC01": this.linescopy1,
                "SC02": this.linescopy2,
                "SC03": this.linescopy3,
                "SC04": this.linescopy4,
                "SC05": this.linescopy5,
                "SC06": this.linescopy6,
                "SC07": this.linescopy7,
                "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;
@@ -736,7 +1597,7 @@
.cardWidthrow {
    height: 40%;
    width: 100%;
    margin-top: 10px;
    /* margin-top: 10px; */
    box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
}
@@ -762,52 +1623,54 @@
    color: rgba(0, 195, 255, 0.822);
    margin-bottom: 12px;
}
.dot-Running {
  position: absolute;
  top: -5px;
  width: 20px;
    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;
    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;
    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;
    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;
    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;
    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;
}
@@ -816,9 +1679,10 @@
    height: 1280px;
    background-color: #ecf5ff;
    width: 20px;
    top:30px;
    left:200px
    top: 30px;
    left: 200px
}
.RGVline {
    position: absolute;
    top: 0;
@@ -827,6 +1691,7 @@
    height: 2px;
    background-color: #a0cfff;
}
.line {
    position: absolute;
    top: 0;
@@ -835,4 +1700,22 @@
    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/WIDESEAWCS_Client/src/views/LineComponent copy.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/views/LineComponent.vue
@@ -20,7 +20,9 @@
  <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-29:0}px)` }" ref="childDot" @click="mouseClick"></div>
    <div :class="update()"
      :style="{ transform: `translateX(${StackerCrane.CurrentColumn < 33 ? StackerCrane.CurrentColumn * 30 - 29 : 0}px)` }"
      ref="childDot" @click="mouseClick"></div>
  </div>
  <div>
    <el-row style="padding-top: 5px;">
@@ -41,19 +43,17 @@
    </el-row>
  </div>
  <el-dialog v-model="dialogVisible" title="信息查看" :before-close="handleClose">
    <el-form ref="$form" :model="StackerCrane" label-position="left" label-width="100px" size="medium">
  <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="设备编号:">
            <!-- <el-input v-model="equipNo"></el-input> -->
            <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>
            <j-el-description :value="StackerCrane.Fault" type="primary" ellipsis></j-el-description>
          </el-form-item>
        </el-col>
      </el-row>
@@ -69,7 +69,7 @@
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
      <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>
@@ -81,6 +81,64 @@
              :value="StackerCrane.CurrentRow + '-' + StackerCrane.CurrentColumn + '-' + StackerCrane.CurrentLayer"
              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: 50px;">手动操作</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="8" :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="8" :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="8" :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-row>
    </el-form>
@@ -116,7 +174,15 @@
        CurrentTaskNum: "",
        Running: "",
        DeviceName: "",
      }
        DeviceCode: "",
        StackerAlarm:"",
      },
      form: {
        TaskType: "",
        SourceAddress: "",
        TargetAddress: "",
        DeviceCode: "",
      },
    };
  },
  props: {
@@ -135,31 +201,84 @@
  },
  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.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.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 ';
        }
        },
    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;
        });
    }
  },
};
</script>
@@ -196,6 +315,7 @@
  font-weight: bold;
  color: white;
}
.dot-Automatic {
  position: absolute;
  top: -5px;
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/views/LineInfo.vue
@@ -1,131 +1,327 @@
<template>
  <div>
    <el-popover placement="bottom" :title="equipNo" width="200" trigger="click">
      <template #reference>
        <div :style="{
          color: equipNoFontColor,
          width: width,
          height: height,
          left: left,
          top: top,
          margin_top: marginTop
        }" style="position: absolute" @click="mouseClick">
          <img v-if="imgType == '1'" src="../../public/lines.png" style="width: 40px" />
          <img v-if="imgType == '1'" src="../../public/lines2.png" style="width: 40px" />
          <label v-if="equipNo != ''" style="position: relative; margin-left: 5px; top: -35px;font-size: 12px;">{{
            equipNo }}</label>
        </div>
      </template>
      <el-row>
        <el-col :span="12">是否有盘:</el-col>
        <el-col :span="12">{{ lineItemInfo.r_Line_HasPallet }}</el-col>
      </el-row>
      <el-row>
        <el-col :span="12">托盘条码</el-col>
        <el-col :span="12">{{ lineItemInfo.r_Line_Barcode }}</el-col>
      </el-row>
      <el-row>
        <el-col :span="12">目标位置</el-col>
        <el-col :span="12">{{ lineItemInfo.r_Line_Target }}</el-col>
      </el-row>
      <el-row>
        <el-col :span="12">任务号</el-col>
        <el-col :span="12">{{ lineItemInfo.r_Line_TaskNum }}</el-col>
      </el-row>
      <el-row>
        <el-col :span="12">报警代码</el-col>
        <el-col :span="12">{{ lineItemInfo.r_Line_ErrorCode }}</el-col>
      </el-row>
    </el-popover>
  </div>
    <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.r_Line_HasPallet" 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.r_Line_Barcode" 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.r_Line_ErrorCode" 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.SourceAddress" 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({
  props: {
    equipNoFontColor: {
      type: String,
      default: "blue",
    },
    width: {
      type: String,
      default: "40px",
    },
    height: {
      type: String,
      default: "40px",
    },
    equipNo: {
      type: String,
      default: "0",
    },
    imgType: {
      type: String,
      default: "1",
    },
    positionX: {
      type: Int32Array,
      default: 1,
    },
    positionY: {
      type: Int32Array,
      default: 1,
    },
    url: {
      type: String,
      default: "",
    },
    marginTop: {
      type: String,
      default: "10px",
    }
    // mouseClick: {
    //   type: Function,
    //   default: function () {
    //     alert(this.equipNo);
    //   },
    // },
  },
  data() {
    return {
      left: "20px",
      top: "260px",
      lineItemInfo: {
        r_Line_Barcode: "",
        r_Line_HasPallet: "",
        r_Line_TaskNum: "",
        r_Line_ErrorCode: "",
        r_Line_Target: "",
      },
    };
  },
  mounted: function () {
    var axisX = (this.positionX - 1) * 40 + 100;
    this.left = axisX + "px";
    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: {
                r_Line_Barcode: "",
                r_Line_HasPallet: "",
                r_Line_TaskNum: "",
                r_Line_ErrorCode: "",
                r_Line_Target: "",
            },
            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,
                        });
                    }
                });
    var axisY = (this.positionY - 1) * 40 + 50;
    this.top = axisY + "px";
  },
  methods: {
    mouseClick() {
      if (this.url != "") {
        this.http
          .post(this.url + "?equipNo=" + 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></style>
<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/WIDESEAWCS_Client/src/views/LineInfocopy.vue
@@ -1,10 +1,11 @@
<template>
        <div :class="update()" :style="{ left: left, top: top, marginBottom:0+'px',marginTop:15+'px'} " @click="mouseClick" v-loading.fullscreen.lock="fullscreenLoading">
    <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-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">
@@ -14,26 +15,78 @@
                </el-col>
                <el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
                    <el-form-item label="是否有盘:">
                        <j-el-description :value="lineItemInfo.r_Line_HasPallet" type="primary"
                            ellipsis></j-el-description>
                        <j-el-description :value="lineItemInfo.r_Line_HasPallet" 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.r_Line_Barcode" type="primary"
                            ellipsis></j-el-description>
                        <j-el-description :value="lineItemInfo.r_Line_Barcode" 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.r_Line_ErrorCode" type="primary"
                            ellipsis></j-el-description>
                        <j-el-description :value="lineItemInfo.r_Line_ErrorCode" 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.SourceAddress" 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>
@@ -77,7 +130,7 @@
            type: String,
            default: "",
        },
        condition:{
        condition: {
            type: Boolean,
            default: false,
        },
@@ -94,6 +147,11 @@
                r_Line_ErrorCode: "",
                r_Line_Target: "",
            },
            form: {
                TaskType: "",
                TargetAddress: "",
                DeviceCode: "",
            },
        };
    },
    mounted() {
@@ -109,25 +167,110 @@
            this.fullscreenLoading = true;
            this.dialogVisible = true;
            // å¤„理点击事件
            if (this.url != "") {
                this.http.post(this.url + "?equipNo=" + this.equipNo, null, "")
                    .then((x) => {
                        if (x.status) {
                            this.lineItemInfo = x.data;
                        } else {
                            this.$message({
                                type: "error",
                                message: x.message,
                            });
                        }
                    });
            }
            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;
            // this.dialogVisible = false;
        },
        update(){
             return !this.condition ? 'custom-img' : 'custom-img-color'
        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秒执行一次
@@ -145,10 +288,11 @@
    display: inline-block;
    /* background-color:  #d9ecff ; */
}
.custom-img-color {
    position: relative;
    display: inline-block;
    background-color:  #05fa7f ;
    background-color: #05fa7f;
    color: white;
    text-align: center;
}
@@ -168,6 +312,7 @@
    width: 40px;
    height: 40px;
}
.custom-img-color img {
    width: 40px;
    height: 40px;
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.metadata.v9.bin
Binary files differ
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.projects.v9.bin
Binary files differ
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.strings.v9.bin
Binary files differ
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2
Binary files differ
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo
Binary files differ
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
@@ -3,36 +3,44 @@
  "WorkspaceRootPath": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\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:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\service\\deviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\service\\deviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\service\\ideviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\service\\ideviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\rgvjob\\commonrgvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\rgvjob\\commonrgvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\quartzjob\\deviceinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\quartzjob\\deviceinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\rgvjob_firstfloor\\commonrgv_firstfloorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\rgvjob_firstfloor\\commonrgv_firstfloorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\rgvjob\\commonrgvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\rgvjob\\commonrgvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\stackercranedbname.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\stackercranedbname.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_dto\\enum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|solutionrelative:wideseawcs_dto\\enum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itaskinfoservice\\itaskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|solutionrelative:wideseawcs_itaskinfoservice\\itaskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -42,7 +50,7 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 7,
          "SelectedChildIndex": 3,
          "Children": [
            {
              "$type": "Bookmark",
@@ -54,55 +62,104 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "DocumentIndex": 3,
              "Title": "CommonRGV_FirstFloorJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ViewState": "AgIAAIYAAAAAAAAAAAAIwJ8AAAAYAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T09:52:26.156Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "DeviceInfoService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "RelativeToolTip": "WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "ViewState": "AgIAAEMAAAAAAAAAAADwv9gCAAA/AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T01:59:05.153Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "TaskStatusEnum.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "RelativeToolTip": "WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "ViewState": "AgIAAEUAAAAAAAAAAAAewFQAAAAMAAAAAAAAAA==",
              "ViewState": "AgIAAMcAAAAAAAAAAAAAwM8AAAAeAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-29T03:10:22.341Z",
              "EditorCaption": ""
              "WhenOpened": "2025-07-29T03:10:22.341Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "DocumentIndex": 5,
              "Title": "CommonConveyorLineJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "ViewState": "AgIAALEAAAAAAAAAAAAvwNIAAAAlAAAAAAAAAA==",
              "ViewState": "AgIAAN8AAAAAAAAAAAAYwB4BAACTAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T03:47:03.579Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "CommonRGV_FirstFloorJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ViewState": "AgIAAMsCAAAAAAAAAAD4v+QCAAA7AAAAAAAAAA==",
              "DocumentIndex": 6,
              "Title": "CommonStackerCraneJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ViewState": "AgIAAGMAAAAAAAAAAAAuwKgAAACSAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-28T02:06:53.534Z",
              "WhenOpened": "2025-07-24T03:54:34.335Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "IDeviceInfoService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "RelativeToolTip": "WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "ViewState": "AgIAAHEAAAAAAAAAAAAAAJQAAAA1AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T02:35:39.48Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "DeviceInfoController.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "ViewState": "AgIAAEMAAAAAAAAAAAAwwGMAAAAuAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T02:36:25.787Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "RequestInbound.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "ViewState": "AgIAABQAAAAAAAAAAAAowC4AAAAxAAAAAAAAAA==",
              "ViewState": "AgIAADQAAAAAAAAAAAAWwDgAAACkAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T04:21:01.123Z",
              "EditorCaption": ""
              "WhenOpened": "2025-07-24T04:21:01.123Z"
            },
            {
              "$type": "Document",
@@ -112,49 +169,22 @@
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\RGVJob\\CommonRGVJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob\\CommonRGVJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\RGVJob\\CommonRGVJob.cs",
              "ViewState": "AgIAAJIAAAAAAAAAAAAAAKsAAACWAAAAAAAAAA==",
              "ViewState": "AgIAAKMAAAAAAAAAAAAQwMkAAABaAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-28T04:13:17.74Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAALkCAAAAAAAAAAAAAJwCAABKAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T03:47:03.559Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "ITaskService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "ViewState": "AgIAAFIAAAAAAAAAAAAnwGIAAAAiAAAAAAAAAA==",
              "Title": "StackerCraneDBName.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "ViewState": "AgIAAG4AAAAAAAAAAADwv5EAAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-28T11:23:22.437Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "CommonStackerCraneJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ViewState": "AgIAAMUAAAAAAAAAAAAUwNQAAABEAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T03:54:34.335Z",
              "EditorCaption": ""
              "WhenOpened": "2025-07-30T05:32:19.549Z"
            }
          ]
        }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
@@ -3,36 +3,44 @@
  "WorkspaceRootPath": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\rgvjob_firstfloor\\commonrgv_firstfloorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\rgvjob_firstfloor\\commonrgv_firstfloorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\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\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\service\\deviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\service\\deviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\service\\ideviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\service\\ideviceinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\quartzjob\\deviceinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\quartzjob\\deviceinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\rgvjob_firstfloor\\commonrgv_firstfloorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\rgvjob_firstfloor\\commonrgv_firstfloorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\rgvjob\\commonrgvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\rgvjob\\commonrgvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\stackercranedbname.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\stackercranedbname.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_dto\\enum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|solutionrelative:wideseawcs_dto\\enum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itaskinfoservice\\itaskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|solutionrelative:wideseawcs_itaskinfoservice\\itaskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\aotansiwcs\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\task\\requestinbound.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -42,7 +50,7 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 4,
          "SelectedChildIndex": 5,
          "Children": [
            {
              "$type": "Bookmark",
@@ -54,55 +62,104 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "DocumentIndex": 4,
              "Title": "CommonRGV_FirstFloorJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ViewState": "AgIAAIYAAAAAAAAAAAAIwJ8AAAAYAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T09:52:26.156Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "DeviceInfoService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "RelativeToolTip": "WIDESEAWCS_QuartzJob\\Service\\DeviceInfoService.cs",
              "ViewState": "AgIAAPUCAAAAAAAAAAAIwNkCAAAIAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T01:59:05.153Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "TaskStatusEnum.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "RelativeToolTip": "WIDESEAWCS_DTO\\Enum\\TaskStatusEnum.cs",
              "ViewState": "AgIAAEUAAAAAAAAAAAAewFQAAAAMAAAAAAAAAA==",
              "ViewState": "AgIAAMcAAAAAAAAAAAAAwM8AAAAeAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-29T03:10:22.341Z",
              "EditorCaption": ""
              "WhenOpened": "2025-07-29T03:10:22.341Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "DocumentIndex": 0,
              "Title": "CommonConveyorLineJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "ViewState": "AgIAALEAAAAAAAAAAAAvwNIAAAAlAAAAAAAAAA==",
              "ViewState": "AgIAAHEAAAAAAAAAAAAQwIYAAADHAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T03:47:03.579Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "CommonRGV_FirstFloorJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\RGVJob_FirstFloor\\CommonRGV_FirstFloorJob.cs",
              "ViewState": "AgIAAL8AAAAAAAAAAAAtwNUAAAAcAAAAAAAAAA==",
              "DocumentIndex": 6,
              "Title": "CommonStackerCraneJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ViewState": "AgIAAGMAAAAAAAAAAAAuwKgAAACSAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-28T02:06:53.534Z",
              "WhenOpened": "2025-07-24T03:54:34.335Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "IDeviceInfoService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "RelativeToolTip": "WIDESEAWCS_QuartzJob\\Service\\IDeviceInfoService.cs",
              "ViewState": "AgIAAHEAAAAAAAAAAAAAAJQAAAA1AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T02:35:39.48Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "DeviceInfoController.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "ViewState": "AgIAAEMAAAAAAAAAAAAwwGMAAAAuAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-30T02:36:25.787Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "RequestInbound.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\Task\\RequestInbound.cs",
              "ViewState": "AgIAABQAAAAAAAAAAAAowC4AAAAxAAAAAAAAAA==",
              "ViewState": "AgIAADQAAAAAAAAAAAAWwDgAAACkAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T04:21:01.123Z",
              "EditorCaption": ""
              "WhenOpened": "2025-07-24T04:21:01.123Z"
            },
            {
              "$type": "Document",
@@ -112,49 +169,22 @@
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\RGVJob\\CommonRGVJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\RGVJob\\CommonRGVJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\RGVJob\\CommonRGVJob.cs",
              "ViewState": "AgIAAJIAAAAAAAAAAAAAAKsAAACWAAAAAAAAAA==",
              "ViewState": "AgIAAKMAAAAAAAAAAAAQwMkAAABaAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-28T04:13:17.74Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAAH0CAAAAAAAAAAAuwJwCAABKAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T03:47:03.559Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "ITaskService.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITaskInfoService\\ITaskService.cs",
              "ViewState": "AgIAAFIAAAAAAAAAAAAnwGIAAAAiAAAAAAAAAA==",
              "Title": "StackerCraneDBName.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneDBName.cs",
              "ViewState": "AgIAAG4AAAAAAAAAAADwv5EAAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-28T11:23:22.437Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "CommonStackerCraneJob.cs",
              "DocumentMoniker": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ToolTip": "E:\\GET\\AoTanSiWCS\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ViewState": "AgIAAMUAAAAAAAAAAAAUwNQAAABEAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-07-24T03:54:34.335Z",
              "EditorCaption": ""
              "WhenOpened": "2025-07-30T05:32:19.549Z"
            }
          ]
        }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/HandTask/StackerHandTask.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.StackerHandTask
{
    public class HandTask
    {
        public string DeviceCode { get; set; }
        public string TaskType { get; set; }
        public string SourceAddress { get; set; }
        public string TargetAddress { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs
@@ -16,31 +16,42 @@
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AutoMapper;
using HslCommunication;
using Newtonsoft.Json;
using SixLabors.ImageSharp.ColorSpaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.StackerHandTask;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_Model.BasicInfo;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.DeviceEnum;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
using static WIDESEAWCS_QuartzJob.Service.DeviceInfoService;
namespace WIDESEAWCS_QuartzJob.Service
{
    public class DeviceInfoService : ServiceBase<Dt_DeviceInfo, IDeviceInfoRepository>, IDeviceInfoService
    {
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        private readonly IMapper _mapper;
        public DeviceInfoService(IDeviceInfoRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper) : base(BaseDal)
        public DeviceInfoService(IDeviceInfoRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, IDt_StationManagerRepository stationManagerRepository) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _mapper = mapper;
            _stationManagerRepository = stationManagerRepository;
        }
        public override WebResponseContent AddData(SaveModel saveModel)
@@ -57,5 +68,1105 @@
            List<Dt_DeviceInfo> deviceInfos = await Db.Queryable<Dt_DeviceInfo>().Where(x => x.DeviceStatus == ((int)DeviceStatusEnum.Enable).ToString()).Includes(x => x.ProtocolList).ToListAsync();
            return _mapper.Map<List<DeviceInfoDTO>>(deviceInfos);
        }
        #region  å †åž›æœºæ‰‹åЍ命令
        public WebResponseContent StackerHandTask(HandTask stackerhand)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand();
                if (stackerhand == null || stackerhand.TaskType == "")
                {
                    return content.Error("请输入任务命令");
                }
                stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(stackerhand.TaskType);
                //入库
                if (stackerhand.TaskType == "17")
                {
                    string[] sourceCodes = stackerhand.SourceAddress.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                    }
                    else
                    {
                        return content.Error($"起点错误:【{stackerhand.SourceAddress}】");
                    }
                    string[] targetCodes = stackerhand.TargetAddress.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(targetCodes[0]);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                    }
                    else
                    {
                        return content.Error($"终点错误:【{stackerhand.TargetAddress}】");
                    }
                }
                //出库
                else if (stackerhand.TaskType == "18")
                {
                    string[] sourceCodes = stackerhand.SourceAddress.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                    }
                    else
                    {
                        return content.Error($"起点错误:【{stackerhand.SourceAddress}】");
                    }
                    string[] targetCodes = stackerhand.TargetAddress.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(targetCodes[0]);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                    }
                    else
                    {
                        return content.Error($"终点错误:【{stackerhand.TargetAddress}】");
                    }
                }
                //移库
                else if (stackerhand.TaskType == "20")
                {
                    string[] sourceCodes = stackerhand.SourceAddress.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                    }
                    else
                    {
                        return content.Error($"起点错误:【{stackerhand.SourceAddress}】");
                    }
                    string[] targetCodes = stackerhand.TargetAddress.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(targetCodes[0]);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                    }
                    else
                    {
                        return content.Error($"终点错误:【{stackerhand.TargetAddress}】");
                    }
                }
                //取货
                else if (stackerhand.TaskType == "24")
                {
                    string[] sourceCodes = stackerhand.SourceAddress.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(0);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(0);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(0);
                    }
                    else
                    {
                        return content.Error($"起点错误:【{stackerhand.SourceAddress}】");
                    }
                }
                //放货
                else if (stackerhand.TaskType == "48")
                {
                    string[] targetCodes = stackerhand.TargetAddress.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(0);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(0);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(0);
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(targetCodes[0]);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                    }
                    else
                    {
                        return content.Error($"终点错误:【{stackerhand.SourceAddress}】");
                    }
                }
                else
                {
                    return content.Error("未找到任务命令");
                }
                StackerSendCommand(stackerCraneTaskCommand, stackerhand.DeviceCode);
                return content;
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent StackerReset(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    CommonStackerCrane commonStackerCrane = (CommonStackerCrane)device;
                    commonStackerCrane.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(2));
                    return content.OK();
                }
                else
                {
                    return content.Error("未找到设备信息请联系IT");
                }
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent StackerEmergencyStop(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    CommonStackerCrane commonStackerCrane = (CommonStackerCrane)device;
                    commonStackerCrane.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(2));
                    return content.OK();
                }
                else
                {
                    return content.Error("未找到设备信息请联系IT");
                }
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public void StackerSendCommand(StackerCraneTaskCommand? command,string DeviceCode)
        {
            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
            if (device != null)
            {
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)device;
                if (commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic) && !commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Fault) && !commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Running))
                {
                    commonStackerCrane.SetValue(StackerCraneDBName.TaskNum, (short)Convert.ToInt16(1));
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.StartRow, command.StartRow);
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.StartColumn, command.StartColumn);
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.StartColumn, command.StartLayer);
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.EndRow, command.EndRow);
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.EndColumn, command.EndColumn);
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.EndLayer, command.EndLayer);
                    Thread.Sleep(100);
                    commonStackerCrane.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(command.WorkType));
                }
                else
                {
                    throw new Exception("请在堆垛机联机模式、待机状态、无故障的情况下下发任务");
                }
            }
            else
            {
                throw new Exception("未找到设备信息请联系IT");
            }
        }
        public class StackerCraneTaskCommand
        {
            #region <Public Menber>
            /// <summary>
            /// èµ·å§‹è¡Œ
            /// </summary>
            public byte StartRow { get; set; }
            /// <summary>
            /// èµ·å§‹åˆ—
            /// </summary>
            public byte StartColumn { get; set; }
            /// <summary>
            /// èµ·å§‹å±‚
            /// </summary>
            public byte StartLayer { get; set; }
            /// <summary>
            /// ç›®æ ‡è¡Œ
            /// </summary>
            public byte EndRow { get; set; }
            /// <summary>
            /// ç›®æ ‡åˆ—
            /// </summary>
            public byte EndColumn { get; set; }
            /// <summary>
            /// ç›®æ ‡å±‚
            /// </summary>
            public byte EndLayer { get; set; }
            /// <summary>
            /// ä½œä¸šç±»åž‹
            /// </summary>
            public byte WorkType { get; set; }
            /// <summary>
            /// é¢„留字节
            /// </summary>
            public byte Spare { get; set; }
            /// <summary>
            /// ä»»åŠ¡å·
            /// </summary>
            public short TaskNum { get; set; }
            #endregion <Public Menber>
        }
        public enum StackerCraneDBName
        {
            /// <summary>
            /// ä»»åŠ¡å·
            /// </summary>
            TaskNum,
            /// <summary>
            /// ä½œä¸šç±»åž‹
            /// </summary>
            WorkType,
            /// <summary>
            /// èµ·å§‹è¡Œ
            /// </summary>
            StartRow,
            /// <summary>
            /// èµ·å§‹åˆ—
            /// </summary>
            StartColumn,
            /// <summary>
            /// èµ·å§‹å±‚
            /// </summary>
            StartLayer,
            /// <summary>
            /// ç›®æ ‡è¡Œ
            /// </summary>
            EndRow,
            /// <summary>
            /// ç›®æ ‡åˆ—
            /// </summary>
            EndColumn,
            /// <summary>
            /// ç›®æ ‡å±‚
            /// </summary>
            EndLayer,
            /// <summary>
            /// æ‰˜ç›˜å·
            /// </summary>
            Barcode,
            /// <summary>
            /// èµ·ç‚¹
            /// </summary>
            StartAddress,
            /// <summary>
            /// ç»ˆç‚¹
            /// </summary>
            EndAddress,
            /// <summary>
            /// ä»»åŠ¡å®Œæˆ
            /// </summary>
            TaskCompleted,
            /// <summary>
            /// ä»»åŠ¡å‘é€
            /// </summary>
            SendTask,
            /// <summary>
            /// è‡ªåŠ¨çŠ¶æ€
            /// </summary>
            Automatic,
            /// <summary>
            /// ä½œä¸šå®Œæˆ
            /// </summary>
            WorkCompleted,
            /// <summary>
            /// è¿è¡Œä¸­
            /// </summary>
            Running,
            /// <summary>
            /// æ•…éšœ
            /// </summary>
            Fault,
            /// <summary>
            /// ä½œä¸šç±»åž‹
            /// </summary>
            TaskType,
            /// <summary>
            /// å½“前任务号
            /// </summary>
            CurrentTaskNum,
            /// <summary>
            /// æœ‰è´§
            /// </summary>
            InStock,
            PickupLocation,
            PutcargoLocation,
            /// <summary>
            /// å½“前列
            /// </summary>
            CurrentColumn,
            /// <summary>
            /// å½“前层
            /// </summary>
            CurrentLayer,
            /// <summary>
            /// æ°´å¹³ç‚¹ä½
            /// </summary>
            LevelPoint,
        }
        #endregion
        #region  è¾“送线手动命令
        public WebResponseContent GetConveyorLineInfo(string DeviceChildCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == DeviceChildCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        ushort x = conveyorLine.GetValue<ConveyorLineDBName, ushort>(ConveyorLineDBName.InteractiveSignal, stationManager.stationChildCode);
                        var structs = BitConverter.GetBytes(x).ToArray().ToBoolArray();
                        short ConveyorLineTaskNum = conveyorLine.GetValue<ConveyorLineDBName, short>(ConveyorLineDBName.ConveyorLineTaskNum, stationManager.stationChildCode);
                        int ConveyorLineAlarm = conveyorLine.GetValue<ConveyorLineDBName, int>(ConveyorLineDBName.ConveyorLineAlarm, stationManager.stationChildCode);
                        ConveyorLineTaskCommand obj = new()
                        {
                            InStock = structs[2] == true ? "有货" : "空闲",
                            TaskNum = ConveyorLineTaskNum.ToString(),
                            Alarm = AlarmInfo(ConveyorLineAlarm)
                        };
                        return content.OK(data:obj);
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent ConveyorLineHandTask(HandTask ConveyorLinehand)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (ConveyorLinehand == null || ConveyorLinehand.TaskType == "")
                {
                    return content.Error("请输入任务命令");
                }
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == ConveyorLinehand.DeviceCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        //入库
                        if (ConveyorLinehand.TaskType == "1")
                        {
                            conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTargetAddress, Convert.ToInt16(ConveyorLinehand.TargetAddress), stationManager.stationChildCode);
                            Thread.Sleep(100);
                            conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTaskNum, Convert.ToInt16(1), stationManager.stationChildCode);
                            Thread.Sleep(100);
                            conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(ConveyorLinehand.TaskType), stationManager.stationChildCode);
                            return content.OK("发送输送线入库任务成功!");
                        }
                        //出库
                        else if (ConveyorLinehand.TaskType == "2")
                        {
                            conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTargetAddress, Convert.ToInt16(ConveyorLinehand.TargetAddress), stationManager.stationChildCode);
                            Thread.Sleep(100);
                            conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTaskNum, Convert.ToInt16(1), stationManager.stationChildCode);
                            Thread.Sleep(100);
                            conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(ConveyorLinehand.TaskType), stationManager.stationChildCode);
                            return content.OK("发送输送线出库任务成功!");
                        }
                        else
                        {
                            return content.Error("未找到任务命令");
                        }
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent ConveyorLineReset(string DeviceChildCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == DeviceChildCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(7), stationManager.stationChildCode);
                        return content.OK("复位成功");
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent ConveyorLineEmergencyStop(string DeviceChildCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == DeviceChildCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(7), stationManager.stationChildCode);
                        return content.OK("停止成功");
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent ConveyorLineReturn(string DeviceChildCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == DeviceChildCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(3), stationManager.stationChildCode);
                        return content.OK("退回成功");
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent ConveyorLineCancel(string DeviceChildCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == DeviceChildCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(4), stationManager.stationChildCode);
                        return content.OK("取消成功");
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent ConveyorLineInitialize(string DeviceChildCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == DeviceChildCode);
                if (stationManager != null)
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                    if (device != null)
                    {
                        CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                        conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(6), stationManager.stationChildCode);
                        return content.OK("初始化成功");
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        string AlarmInfo(int Alarm) => Alarm switch
        {
            0 => "急停",
            1 => "变频器报警1",
            2 => "变频器报警2",
            3 => "左超宽",
            4 => "右超宽",
            5 => "超高",
            6 => "读码失败",
            7 => "货物超重",
            8 => "运行超时",
            9 => "工位传感器异常",
            10 => "预留1",
            11 => "预留2",
            12 => "预留3",
            13 => "预留4",
            14 => "预留5",
            15 => "预留6",
        };
        public enum ConveyorLineDBName
        {
            InteractiveSignal,
            ConveyorLineBarcode,
            ConveyorLineAlarm,
            ConveyorLineTargetAddress,
            ConveyorLineTaskNum,
            WriteInteractiveSignal,
            WriteConveyorLineTargetAddress,
            WriteConveyorLineTaskNum,
        }
        public class ConveyorLineTaskCommand
        {
            public string InStock { get; set; }
            public string TaskNum { get; set; }
            public string Alarm { get; set; }
        }
        #endregion
        #region  RGV手动命令
        public WebResponseContent RGVHandTask(HandTask RGVhand)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (RGVhand == null || RGVhand.TaskType == "")
                {
                    return content.Error("请输入任务命令");
                }
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == RGVhand.DeviceCode);
                if (device != null)
                {
                    if (RGVhand.DeviceCode == "RGV01" || RGVhand.DeviceCode == "RGV02")
                    {
                        CommonRGV_FirstFloor RGVcommand = (CommonRGV_FirstFloor)device;
                        if (RGVhand.TaskType == "1")
                        {
                            if (RGVhand.SourceAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PickupLocation = (byte)Convert.ToSByte(RGVhand.SourceAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandFirstFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}取定位命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}取定位命令取货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "2")
                        {
                            if (RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandFirstFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}放定位命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}放定位命令放货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "3")
                        {
                            if (RGVhand.SourceAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PickupLocation = (byte)Convert.ToSByte(RGVhand.SourceAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandFirstFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}取货命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}取货命令取货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "4")
                        {
                            if (RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandFirstFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}放货命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}放货命令放货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "5")
                        {
                            if (RGVhand.TargetAddress != null && RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PickupLocation = (byte)Convert.ToSByte(RGVhand.SourceAddress),
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandFirstFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}取放货命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}取放货命令放货位和取货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "6")
                        {
                            if (RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandFirstFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}退命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}退回命令放货位不能为空");
                            }
                        }
                        else
                        {
                            return content.Error($"{device.DeviceName}未知任务命令");
                        }
                    }
                    else
                    {
                        CommonRGV RGVcommand = (CommonRGV)device;
                        if (RGVhand.TaskType == "1")
                        {
                            if (RGVhand.SourceAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PickupLocation = (byte)Convert.ToSByte(RGVhand.SourceAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandSecondFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}取定位命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}取定位命令取货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "2")
                        {
                            if (RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandSecondFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}放定位命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}放定位命令放货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "3")
                        {
                            if (RGVhand.SourceAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PickupLocation = (byte)Convert.ToSByte(RGVhand.SourceAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandSecondFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}取货命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}取货命令取货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "4")
                        {
                            if (RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandSecondFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}放货命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}放货命令放货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "5")
                        {
                            if (RGVhand.TargetAddress != null && RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PickupLocation = (byte)Convert.ToSByte(RGVhand.SourceAddress),
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandSecondFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}取放货命令下发成功");
                            }
                            else
                            {
                                return content.Error("取放货命令放货位和取货位不能为空");
                            }
                        }
                        else if (RGVhand.TaskType == "6")
                        {
                            if (RGVhand.TargetAddress != null)
                            {
                                RGVTaskCommand command = new RGVTaskCommand()
                                {
                                    PutcargoLocation = (byte)Convert.ToSByte(RGVhand.TargetAddress),
                                    TaskType = (byte)Convert.ToSByte(RGVhand.TaskType),
                                };
                                SendCommandSecondFloor(RGVcommand, command);
                                return content.OK($"{device.DeviceName}退回命令下发成功");
                            }
                            else
                            {
                                return content.Error($"{device.DeviceName}退回命令放货位不能为空");
                            }
                        }
                        else
                        {
                            return content.Error($"{device.DeviceName}未知任务命令");
                        }
                    }
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent RGVReset(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    if (DeviceCode == "RGV01" || DeviceCode == "RGV02")
                    {
                        CommonRGV_FirstFloor commonRGV = (CommonRGV_FirstFloor)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(9));
                    }
                    else
                    {
                        CommonRGV commonRGV = (CommonRGV)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(9));
                    }
                    return content.OK($"{device.DeviceName}复位成功");
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent RGVEmergencyStop(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    if (DeviceCode == "RGV01" || DeviceCode == "RGV02")
                    {
                        CommonRGV_FirstFloor commonRGV = (CommonRGV_FirstFloor)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(11));
                    }
                    else
                    {
                        CommonRGV commonRGV = (CommonRGV)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(11));
                    }
                    return content.OK($"{device.DeviceName}停止成功");
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent RGVCancel(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    if (DeviceCode == "RGV01" || DeviceCode == "RGV02")
                    {
                        CommonRGV_FirstFloor commonRGV = (CommonRGV_FirstFloor)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(9));
                    }
                    else
                    {
                        CommonRGV commonRGV = (CommonRGV)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(9));
                    }
                    return content.OK($"{device.DeviceName}中断成功");
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent RGVInitialize(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    if (DeviceCode == "RGV01" || DeviceCode == "RGV02")
                    {
                        CommonRGV_FirstFloor commonRGV = (CommonRGV_FirstFloor)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(9));
                    }
                    else
                    {
                        CommonRGV commonRGV = (CommonRGV)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(9));
                    }
                    return content.OK($"{device.DeviceName}初始化成功");
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent RGVPause(string DeviceCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                if (device != null)
                {
                    if (DeviceCode == "RGV01" || DeviceCode == "RGV02")
                    {
                        CommonRGV_FirstFloor commonRGV = (CommonRGV_FirstFloor)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(10));
                    }
                    else
                    {
                        CommonRGV commonRGV = (CommonRGV)device;
                        commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(10));
                    }
                    return content.OK($"{device.DeviceName}暂停成功");
                }
                return content.Error("未找到设备信息请联系IT");
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        public void SendCommandFirstFloor(CommonRGV_FirstFloor commonRGV, RGVTaskCommand? rgvTaskCommand)
        {
            commonRGV.SetValue(StackerCraneDBName.TaskNum, Convert.ToInt16(1));
            Thread.Sleep(100);
            commonRGV.SetValue(StackerCraneDBName.PutcargoLocation, (byte)Convert.ToSByte(rgvTaskCommand.PutcargoLocation));
            Thread.Sleep(100);
            commonRGV.SetValue(StackerCraneDBName.PickupLocation, (byte)Convert.ToSByte(rgvTaskCommand.PickupLocation));
            Thread.Sleep(100);
            commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(rgvTaskCommand.TaskType));
        }
        public void SendCommandSecondFloor(CommonRGV commonRGV, RGVTaskCommand? rgvTaskCommand)
        {
            commonRGV.SetValue(StackerCraneDBName.TaskNum, Convert.ToInt16(1));
            Thread.Sleep(100);
            commonRGV.SetValue(StackerCraneDBName.PutcargoLocation, (byte)Convert.ToSByte(rgvTaskCommand.PutcargoLocation));
            Thread.Sleep(100);
            commonRGV.SetValue(StackerCraneDBName.PickupLocation, (byte)Convert.ToSByte(rgvTaskCommand.PickupLocation));
            Thread.Sleep(100);
            commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(rgvTaskCommand.TaskType));
        }
        public class RGVTaskCommand
        {
            #region <Public Menber>
            /// <summary>
            /// å–货位
            /// </summary>
            public byte PickupLocation { get; set; }
            /// <summary>
            /// æ”¾è´§ä½
            /// </summary>
            public byte PutcargoLocation { get; set; }
            /// <summary>
            /// ä»»åŠ¡ç±»åž‹
            /// </summary>
            public byte TaskType { get; set; }
            /// <summary>
            /// é¢„ç•™
            /// </summary>
            public byte Spare { get; set; }
            /// <summary>
            /// ä»»åŠ¡å·
            /// </summary>
            public short TaskNum { get; set; }
            #endregion <Public Menber>
        }
        #endregion
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/IDeviceInfoService.cs
@@ -22,7 +22,7 @@
using System.Threading.Tasks;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.StackerHandTask;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
@@ -36,5 +36,116 @@
        /// <returns>返回设备信息以及对应协议信息的集合。</returns>
        Task<List<DeviceInfoDTO>> QueryDeviceProInfos();
        /// <summary>
        /// å †åž›æœºæ‰‹åŠ¨ä»»åŠ¡
        /// </summary>
        /// <param name="stackerhand"></param>
        /// <returns></returns>
        WebResponseContent StackerHandTask(HandTask stackerhand);
        /// <summary>
        /// å †åž›æœºæ€¥åœ
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent StackerEmergencyStop(string DeviceCode);
        /// <summary>
        /// å †åž›æœºå¤ä½
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent StackerReset(string DeviceCode);
        /// <summary>
        /// èŽ·å–è¾“é€çº¿ä¿¡æ¯
        /// </summary>
        /// <param name="DeviceChildCode"></param>
        /// <returns></returns>
        WebResponseContent GetConveyorLineInfo(string DeviceChildCode);
        /// <summary>
        /// è¾“送线手动任务
        /// </summary>
        /// <param name="stackerhand"></param>
        /// <returns></returns>
        WebResponseContent ConveyorLineHandTask(HandTask stackerhand);
        /// <summary>
        /// è¾“送线复位
        /// </summary>
        /// <param name="DeviceChildCode"></param>
        /// <returns></returns>
        WebResponseContent ConveyorLineReset(string DeviceChildCode);
        /// <summary>
        /// è¾“送线急停
        /// </summary>
        /// <param name="DeviceChildCode"></param>
        /// <returns></returns>
        WebResponseContent ConveyorLineEmergencyStop(string DeviceChildCode);
        /// <summary>
        /// è¾“送线退回
        /// </summary>
        /// <param name="DeviceChildCode"></param>
        /// <returns></returns>
        WebResponseContent ConveyorLineReturn(string DeviceChildCode);
        /// <summary>
        /// è¾“送线取消任务
        /// </summary>
        /// <param name="DeviceChildCode"></param>
        /// <returns></returns>
        WebResponseContent ConveyorLineCancel(string DeviceChildCode);
        /// <summary>
        /// è¾“送线初始化
        /// </summary>
        /// <param name="DeviceChildCode"></param>
        /// <returns></returns>
        WebResponseContent ConveyorLineInitialize(string DeviceChildCode);
        /// <summary>
        /// RGV手动任务
        /// </summary>
        /// <param name="RGVhand"></param>
        /// <returns></returns>
        WebResponseContent RGVHandTask(HandTask RGVhand);
        /// <summary>
        /// RGV复位
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent RGVReset(string DeviceCode);
        /// <summary>
        /// RGV急停
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent RGVEmergencyStop(string DeviceCode);
        /// <summary>
        /// RGV中断任务
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent RGVCancel(string DeviceCode);
        /// <summary>
        /// RGV初始化
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent RGVInitialize(string DeviceCode);
        /// <summary>
        /// RGV暂停
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        WebResponseContent RGVPause(string DeviceCode);
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
@@ -13,8 +13,10 @@
    </ItemGroup>
    <ItemGroup>
        <ProjectReference Include="..\WIDESEAWCS_BasicInfoRepository\WIDESEAWCS_BasicInfoRepository.csproj" />
        <ProjectReference Include="..\WIDESEAWCS_Communicator\WIDESEAWCS_Communicator.csproj" />
        <ProjectReference Include="..\WIDESEAWCS_Core\WIDESEAWCS_Core.csproj" />
        <ProjectReference Include="..\WIDESEAWCS_DTO\WIDESEAWCS_DTO.csproj" />
    </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceInfoController.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseController;
using WIDESEAWCS_DTO.StackerHandTask;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob.DTO;
@@ -26,5 +27,101 @@
        {
            return await Service.QueryDeviceProInfos();
        }
        [HttpPost, Route("StackerHandTask"), AllowAnonymous]
        public WebResponseContent StackerHandTask([FromBody] HandTask stackerhand)
        {
            return Service.StackerHandTask(stackerhand);
        }
        [HttpPost, Route("StackerReset"), AllowAnonymous]
        public WebResponseContent StackerReset(string DeviceCode)
        {
            return Service.StackerReset(DeviceCode);
        }
        [HttpPost, Route("StackerEmergencyStop"), AllowAnonymous]
        public WebResponseContent StackerEmergencyStop(string DeviceCode)
        {
            return Service.StackerEmergencyStop(DeviceCode);
        }
        [HttpPost, Route("GetConveyorLineInfo"), AllowAnonymous]
        public WebResponseContent GetConveyorLineInfo(string DeviceChildCode)
        {
            return Service.GetConveyorLineInfo(DeviceChildCode);
        }
        [HttpPost, Route("ConveyorLineHandTask"), AllowAnonymous]
        public WebResponseContent ConveyorLineHandTask([FromBody] HandTask ConveyorLinehand)
        {
            return Service.ConveyorLineHandTask(ConveyorLinehand);
        }
        [HttpPost, Route("ConveyorLineReset"), AllowAnonymous]
        public WebResponseContent ConveyorLineReset(string DeviceChildCode)
        {
            return Service.ConveyorLineReset(DeviceChildCode);
        }
        [HttpPost, Route("ConveyorLineEmergencyStop"), AllowAnonymous]
        public WebResponseContent ConveyorLineEmergencyStop(string DeviceChildCode)
        {
            return Service.ConveyorLineEmergencyStop(DeviceChildCode);
        }
        [HttpPost, Route("ConveyorLineReturn"), AllowAnonymous]
        public WebResponseContent ConveyorLineReturn(string DeviceChildCode)
        {
            return Service.ConveyorLineReturn(DeviceChildCode);
        }
        [HttpPost, Route("ConveyorLineCancel"), AllowAnonymous]
        public WebResponseContent ConveyorLineCancel(string DeviceChildCode)
        {
            return Service.ConveyorLineCancel(DeviceChildCode);
        }
        [HttpPost, Route("ConveyorLineInitialize"), AllowAnonymous]
        public WebResponseContent ConveyorLineInitialize(string DeviceChildCode)
        {
            return Service.ConveyorLineInitialize(DeviceChildCode);
        }
        [HttpPost, Route("RGVHandTask"), AllowAnonymous]
        public WebResponseContent RGVHandTask([FromBody] HandTask RGVhand)
        {
            return Service.RGVHandTask(RGVhand);
        }
        [HttpPost, Route("RGVReset"), AllowAnonymous]
        public WebResponseContent RGVReset(string DeviceCode)
        {
            return Service.RGVReset(DeviceCode);
        }
        [HttpPost, Route("RGVEmergencyStop"), AllowAnonymous]
        public WebResponseContent RGVEmergencyStop(string DeviceCode)
        {
            return Service.RGVEmergencyStop(DeviceCode);
        }
        [HttpPost, Route("RGVCancel"), AllowAnonymous]
        public WebResponseContent RGVCancel(string DeviceCode)
        {
            return Service.RGVCancel(DeviceCode);
        }
        [HttpPost, Route("RGVInitialize"), AllowAnonymous]
        public WebResponseContent RGVInitialize(string DeviceCode)
        {
            return Service.RGVInitialize(DeviceCode);
        }
        [HttpPost, Route("RGVPause"), AllowAnonymous]
        public WebResponseContent RGVPause(string DeviceCode)
        {
            return Service.RGVPause(DeviceCode);
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/bin/Debug/net6.0/Log/2025-07-29/Info_µ÷¶ÈÈÎÎñ¿ØÖÆ_17-26-35.log
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -132,7 +132,7 @@
                        foreach (var item in deviceProtocolDetails)
                        {
                            int itemValue = Convert.ToInt32(item.ProtocalDetailValue);
                            _noticeService.LineData(userIds?.FirstOrDefault(), userTokenIds, new { station.stationChildCode,InStock= structs[itemValue] , Roadway =station.Roadway});
                            _noticeService.LineData(userIds?.FirstOrDefault(), userTokenIds, new { station.stationChildCode,InStock= structs[itemValue] , Roadway =station.Roadway+station.stationFloor});
                            if (structs[itemValue] == true)
                            {
                                MethodInfo? method = GetType().GetMethod(item.ProtocolDetailType);
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs
@@ -141,7 +141,7 @@
            }
            else
            {
                DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.Where(x => x.DeviceChildCode == stationManager.stationChildCode && x.DeviceProParamName == "ConveyorLineBarcode").FirstOrDefault();
                DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.Where(x => x.DeviceChildCode == stationManager.stationNextChildCode && x.DeviceProParamName == "ConveyorLineBarcode").FirstOrDefault();
                var x = conveyorLine.Communicator.Read(devicePro.DeviceProAddress, 5);
                string Barcode = Encoding.UTF8.GetString(x);
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RGVJob/CommonRGVJob.cs
@@ -198,10 +198,10 @@
                                if (Barcode == null || Barcode == "")
                                {
                                    conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(3), stationManager.stationChildCode);
                                    //conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(3), stationManager.stationChildCode);
                                    commonRGV.SetValue(StackerCraneDBName.PutcargoLocation, Convert.ToSByte(stationManager.stationRemark));
                                    commonRGV.SetValue(StackerCraneDBName.TaskNum, Convert.ToInt16(task.TaskNum));
                                    //    commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(4));
                                    commonRGV.SetValue(StackerCraneDBName.TaskType, Convert.ToSByte(4));
                                    task.TaskState = (int)TaskInStatusEnum.InRetuen;
                                    _taskRepository.UpdateData(task);
                                    return;
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RGVJob/RGVDBName.cs
@@ -38,6 +38,7 @@
        TaskType,
        TaskNum,
        LevelPoint,
        CurrentTaskNum,
        CurrentTaskNum,
        RGVAlarm,
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RGVJob_FirstFloor/CommonRGV_FirstFloorJob.cs
@@ -79,7 +79,7 @@
        public Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine(DateTime.Now.ToString() + ",线程ID:" + Thread.CurrentThread.ManagedThreadId);
            //Console.WriteLine(DateTime.Now.ToString() + ",线程ID:" + Thread.CurrentThread.ManagedThreadId);
            try
            {
                //用这种方式能确保类型转换不会有问题
@@ -164,6 +164,7 @@
                            Running = RGVWorkStatus(FirstRgv.GetValue<RGVDBName, bool>(RGVDBName.Running)),
                            LevelPoint = FirstRgv.GetValue<RGVDBName, int>(RGVDBName.LevelPoint),
                            CurrentTaskNum = FirstRgv.GetValue<RGVDBName, short>(RGVDBName.RGVTaskNum),
                            RGVAlarm = FirstRgv.GetValue<RGVDBName, uint>(RGVDBName.RGVAlarm),
                            FirstRgv.DeviceCode,
                            FirstRgv.DeviceName,
                        };
@@ -175,16 +176,16 @@
                }
                else
                {
                    if (commonRGVFirst == null)
                        Console.WriteLine($"RGV01未找到设备对象的值");
                    else
                        Console.WriteLine($"RGV01设备对象类型错误");
                    //if (commonRGVFirst == null)
                    //    Console.WriteLine($"RGV01未找到设备对象的值");
                    //else
                    //    Console.WriteLine($"RGV01设备对象类型错误");
                }
                #endregion
                #region  RGV02调度
                if (commonRGVSecond != null && commonRGVFirst is CommonRGV_FirstFloor SecondRgv)//这样能看出来传参到底哪里有问题
                if (commonRGVSecond != null && commonRGVSecond is CommonRGV_FirstFloor SecondRgv)//这样能看出来传参到底哪里有问题
                {
                    if (SecondRgv.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.WorkCompleted))
                    {
@@ -254,6 +255,7 @@
                            Running = RGVWorkStatus(SecondRgv.GetValue<RGVDBName, bool>(RGVDBName.Running)),
                            LevelPoint = SecondRgv.GetValue<RGVDBName, int>(RGVDBName.LevelPoint),
                            CurrentTaskNum = SecondRgv.GetValue<RGVDBName, short>(RGVDBName.RGVTaskNum),
                            RGVAlarm = SecondRgv.GetValue<RGVDBName, uint>(RGVDBName.RGVAlarm),
                            SecondRgv.DeviceCode,
                            SecondRgv.DeviceName,
                        };
@@ -265,10 +267,10 @@
                }
                else
                {
                    if (commonRGVSecond == null)
                        Console.WriteLine($"RGV02未找到设备对象的值");
                    else
                        Console.WriteLine($"RGV02设备对象类型错误");
                    //if (commonRGVSecond == null)
                    //    Console.WriteLine($"RGV02未找到设备对象的值");
                    //else
                    //    Console.WriteLine($"RGV02设备对象类型错误");
                }
                #endregion
                //}
@@ -435,7 +437,7 @@
            {
                var tasks = _taskService.QueryRGVTask();
                Dt_Task task;
                if (tasks == null && tasks.Count() == 0)
                if (tasks.Count() == 0)
                {
                    return null;
                }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -122,6 +122,41 @@
                        true => "故障",
                        false => "正常",
                    };
                    string StackerCraneAlarm(uint alarm) => alarm switch
                    {
                        0 => "指令或地址错误",
                        1 => "急停",
                        2 => "光通讯中断",
                        3 => "组态失联",
                        4 => "行走变频故障",
                        5 => "行走极限触发",
                        6 => "行走运行超时",
                        7 => "提升变频故障",
                        8 => "提升极限触发",
                        9 => "提升运行超时",
                        10 => "载货台超载",
                        11 => "载货台欠载(松绳)",
                        12 => "载货台失速",
                        13 => "货叉变频报警",
                        14 => "货叉运行超时",
                        15 => "货叉极限触发",
                        16 => "货叉不居中",
                        17 => "左侧超高",
                        18 => "右侧超高",
                        19 => "左侧超宽",
                        20 => "右侧超宽",
                        21 => "左超出",
                        22 => "右超出",
                        23 => "取货时载货台有货",
                        24 => "取货后载货台无货",
                        25 => "取深货位时浅货位有货",
                        26 => "放货时载货台无货",
                        27 => "放货时货架有货",
                        28 => "放货后载货台有货",
                        29 => "放深货时浅货位有货",
                        30 => "",
                        31 => "",
                    };
                    object obj = new
                    {
                        Automatic = StackerCraneAutoStatus(commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic)),
@@ -131,6 +166,8 @@
                        CurrentLayer = Convert.ToInt32(commonStackerCrane.GetValue<StackerCraneDBName, byte>(StackerCraneDBName.CurrentLayer)),
                        LevelPoint = commonStackerCrane.GetValue<StackerCraneDBName, int>(StackerCraneDBName.LevelPoint),
                        CurrentTaskNum = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.CurrentTaskNum),
                        StackerAlarm = StackerCraneAlarm(commonStackerCrane.GetValue<StackerCraneDBName, uint>(StackerCraneDBName.StackerAlarm)),
                        commonStackerCrane.DeviceCode,
                        commonStackerCrane.DeviceName,
                    };
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneDBName.cs
@@ -141,5 +141,10 @@
        /// æ°´å¹³ç‚¹ä½
        /// </summary>
        LevelPoint,
        /// <summary>
        /// æŠ¥è­¦ä¿¡æ¯
        /// </summary>
        StackerAlarm,
    }
}