c4885ceaf477654dc0d2c02c7235c6ca683e08d4..291067c13bfe8fb9c876e3764a828dc3ddd22f99
2025-11-17 helongyang
监控优化,代码功能优化
291067 对比 | 目录
2025-11-17 wangxinhui
Update appsettings.json
81ac12 对比 | 目录
已添加2个文件
已修改32个文件
1176 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Client/config/buttons.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/img/1.png 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/img/2.png 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/img/3.png 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/BoardWarehouse.vue 161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/TestFrameWarehouse.vue 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/ConveyorLineJob_PP.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/PPReadData.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/StackerCraneJob_PP.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/ConveyorLineJob_GM.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/GMReadData.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/StackerCraneJob_GM.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/BCReadData.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/StackerCraneJob_BC.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/油墨仓/StackerCraneJob_YM.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/油墨仓/YMReadData.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/测试架仓/CSJReadData.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/测试架仓/StackerCraneJob_CSJ.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/StackerCraneJob_ZH.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/ZHReadData.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/config/buttons.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.js 133 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/PurchaseOrderService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/ProStockInfoRepository.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/config/buttons.js
@@ -164,6 +164,15 @@
    onClick: function () {
    }
},
{
    name: "辅料输送任务重发",
    icon: '',
    class: '',
    type: 'warning',
    value: 'FLconverTaskResending',
    onClick: function () {
    }
},
]
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.js
@@ -96,6 +96,33 @@
                }
            }
            let FLconverTaskResendingBtn = this.buttons.find(x => x.value == 'FLconverTaskResending');
            if (FLconverTaskResendingBtn) {
                FLconverTaskResendingBtn.onClick = function () {
                this.$confirm("是否确认重发辅料输送任务","手动任务重发警告",{
                    confirmButtonText: "确定",
                    cancelButtonText: "取消",
                    type: "warning",
                    center: true,
                    }).then(() => {
                        let rows = this.$refs.table.getSelected();
                        if (rows.length == 0) return this.$error("请选择数据!");
                        if (rows.length > 1) return this.$error("请选择一条数据!");
                        var param = rows[0].taskNum;
                        this.http
                        .post("api/Task/FLconverTaskResending?taskNum="+param, "数据处理中...")
                        .then((x) => {
                            if (x.status) {
                            this.$Message.success('手动任务重发成功');
                            this.refresh();
                        } else {
                            return this.$error(x.message);
                        }
                        });
                    });
                }
            }
            let StackerCraneTaskPriorityBtn = this.buttons.find(x => x.value == 'StackerCraneTaskPriority');
            if (StackerCraneTaskPriorityBtn) {
                StackerCraneTaskPriorityBtn.onClick = function () {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/img/1.png

´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/img/2.png
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/img/3.png
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/BoardWarehouse.vue
@@ -28,10 +28,58 @@
          <div class="xname">托盘类型:</div>
          <div class="xbci" :title="bcData.R_BC_TrayType">{{ bcData.R_BC_TrayType || '-' }}</div>
        </div>
        <!-- æ–°å¢žï¼šå½“前列状态显示 -->
        <div class="bcankuang">
          <div class="xname">当前所在列:</div>
          <div class="xbci" :title="bcData.R_BC_Column">{{ bcData.R_BC_Column || '未知' }}</div>
        </div>
      </div>
    </div>
    <!-- æ–°å¢žï¼šå †åž›æœºå½“前列文字显示(与PP仓一致) -->
    <div id="bc-nowcolumn" :class="{ 'abnormal-column': bcData.R_BC_Status !== '正常' }">
      <div>板料堆垛机当前所在列:
        <span :title="bcData.R_BC_Column">{{ bcData.R_BC_Column || '未知' }}</span>
      </div>
    </div>
    <!-- æ–°å¢žï¼šåˆ—方格展示区域(与PP仓逻辑一致) -->
    <div class="bc-column-container" :class="{ 'pp-status-abnormal': bcData.R_BC_Status !== '正常' }">
      <!-- ä¸Šæ–¹1-24列 -->
      <div class="column-grid-container">
        <div
          v-for="num in 37"
          :key="num"
          class="column-grid-item"
          :class="{ 'active': num == bcData.R_BC_Column }"
          :title="`列号: ${num}`"
        >
          {{ num }}
        </div>
      </div>
      <!-- ä¸‹æ–¹25-47列 (23个) -->
      <div class="column-grid-container">
        <div
          v-for="i in 34"
          :key="'bc-lower-' + i"
          class="column-grid-item"
          :class="{ 'active': (103 + i) == bcData.R_BC_Column }"
          :title="`列号: ${103 + i}`"
        >
          {{ 103 + i }}
        </div>
      </div>
      <div class="column-grid-container">
        <div
          v-for="i in 34"
          :key="'bc-lower-' + i"
          class="column-grid-item"
          :class="{ 'active': (203 + i) == bcData.R_BC_Column }"
          :title="`列号: ${203 + i}`"
        >
          {{ 203 + i }}
        </div>
      </div>
    </div>
  </div>
</template>
@@ -49,19 +97,18 @@
  },
  setup() {
    const store = useStore();
    // ä»…存储BC数据,与其他数据隔离
    const bcData = ref({});
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é—ªçƒé—®é¢˜
    const UPDATE_DELAY = 300; // å»¶è¿Ÿ300ms更新UI
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // BC数据映射规则
    // BC数据映射规则(新增R_BC_Column列号处理)
    const bcStatusMap = {
      R_BC_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_BC_AutoStatus: {
        0: "ç»´ä¿®",
@@ -90,10 +137,11 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      }
      },
      // æ–°å¢žï¼šåˆ—号映射(与PP仓一致)
      R_BC_Column: (val) => val !== undefined ? val : "未知"
    };
    // BC字段分组
    const bcFieldGroups = {
      permissionFields: {
        keys: ["R_BC_IsCanPut1", "R_BC_IsCanTake1", "R_BC_IsCanPut2", "R_BC_IsCanTake2", 
@@ -117,19 +165,20 @@
      }
    };
    // å¤„理BC原始数据
    const processBCData = (rawData) => {
      if (!rawData) return {};
      const processedData = { ...rawData };
      // å¤„理核心状态字段
      // å¤„理核心状态字段(包含列号)
      Object.keys(bcStatusMap).forEach(key => {
        if (processedData.hasOwnProperty(key)) {
          processedData[key] = bcStatusMap[key][processedData[key]] || processedData[key];
          const mapper = bcStatusMap[key];
          processedData[key] = typeof mapper === 'function'
            ? mapper(processedData[key])
            : (mapper[processedData[key]] || processedData[key]);
        }
      });
      // å¤„理分组字段
      Object.values(bcFieldGroups).forEach(group => {
        group.keys.forEach(key => {
          if (processedData.hasOwnProperty(key)) {
@@ -141,18 +190,15 @@
      return processedData;
    };
    // å»¶è¿Ÿæ›´æ–°BC数据,避免高频刷新
    const delayedUpdateBCData = (newRawData) => {
      if (updateTimer) {
        clearTimeout(updateTimer);
      }
      updateTimer = setTimeout(() => {
        // åªå¤„理包含BC特征字段的数据
        if (newRawData && newRawData.R_BC_Status !== undefined) {
          bcData.value = processBCData(newRawData);
          
          // æ›´æ–°æ ·å¼
          nextTick(() => {
            const valueElements = document.getElementsByClassName("xbci");
            for (let i = 0; i < valueElements.length; i++) {
@@ -168,13 +214,11 @@
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_BC_Status !== undefined) {
        bcData.value = processBCData(initialData);
      }
      // ç›‘听数据变化,只处理BC数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
@@ -185,7 +229,6 @@
        { deep: true }
      );
      // ç»„件卸载时清理
      onUnmounted(() => {
        unwatch();
        if (updateTimer) {
@@ -338,4 +381,76 @@
  margin-left: 1.7%;
  border-radius: 10px;
}
</style>
/* æ–°å¢žï¼šBC堆垛机当前列文字样式(与PP仓一致) */
#bc-nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* æ–°å¢žï¼šBC堆垛机异常状态文字变色 */
#bc-nowcolumn.abnormal-column {
  color: red !important;
}
#bc-nowcolumn.abnormal-column span {
  color: red !important;
}
/* æ–°å¢žï¼šBC列容器样式 */
.bc-column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* å¤ç”¨ï¼šæ–¹æ ¼å®¹å™¨æ ·å¼ï¼ˆä¸ŽPP仓一致) */
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-items: center;
  gap: 2px;
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px;
}
/* å¤ç”¨ï¼šæ–¹æ ¼æ ·å¼ï¼ˆä¸ŽPP仓一致) */
.column-grid-item {
  flex: 1;
  min-width: 24px;
  max-width: 60px;
  height: 30px;
  border: 1px solid #fff;
  border-radius: 8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px);
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å¤ç”¨ï¼šå½“前列高亮样式 */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å¤ç”¨ï¼šå¼‚常状态下当前列红色高亮 */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue
@@ -28,6 +28,11 @@
          <div class="xname">托盘类型:</div>
          <div class="xzhi" :title="gmData.R_GM_TrayType">{{ gmData.R_GM_TrayType || '-' }}</div>
        </div>
        <!-- æ–°å¢žï¼šå½“前列状态显示 -->
        <div class="zhankuang">
          <div class="xname">当前所在列:</div>
          <div class="xzhi" :title="gmData.R_GM_Column">{{ gmData.R_GM_Column || '未知' }}</div>
        </div>
      </div>
      <!-- GM关联站台(入库7003) -->
@@ -154,6 +159,41 @@
        </div>
      </div>
    </div>
    <!-- æ–°å¢žï¼šå †åž›æœºå½“前列文字显示 -->
    <div id="gm-nowcolumn" :class="{ 'abnormal-column': gmData.R_GM_Status !== '正常' }">
      <div>干膜堆垛机当前所在列:
        <span :title="gmData.R_GM_Column">{{ gmData.R_GM_Column || '未知' }}</span>
      </div>
    </div>
    <!-- æ–°å¢žï¼šåˆ—方格展示区域 -->
    <div class="gm-column-container" :class="{ 'pp-status-abnormal': gmData.R_GM_Status !== '正常' }">
      <!-- ä¸Šæ–¹1-24列 -->
      <div class="column-grid-container">
        <div
          v-for="num in 20"
          :key="num"
          class="column-grid-item"
          :class="{ 'active': num == gmData.R_GM_Column }"
          :title="`列号: ${num}`"
        >
          {{ num }}
        </div>
      </div>
      <!-- ä¸‹æ–¹25-47列 (23个) -->
      <div class="column-grid-container">
        <div
          v-for="i in 19"
          :key="'gm-lower-' + i"
          class="column-grid-item"
          :class="{ 'active': (20 + i) == gmData.R_GM_Column }"
          :title="`列号: ${20 + i}`"
        >
          {{ 20 + i }}
        </div>
      </div>
    </div>
  </div>
</template>
@@ -170,21 +210,21 @@
  },
  setup() {
    const store = useStore();
    // ä»…存储GM数据,与其他仓数据隔离
    const gmData = ref({});
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é—ªçƒé—®é¢˜
    const UPDATE_DELAY = 300; // 300ms延迟,平衡实时性和界面稳定性
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // GM数据映射规则配置(按功能分组)
    // GM数据映射规则(新增列号处理)
    const gmStatusConfig = {
      coreStatus: {
        R_GM_Status: { 1: "正常", 2: "故障", 3: "急停" },
        R_GM_Status: { 0: "正常", 1: "故障", 2: "急停", 3: "未知" },
        R_GM_AutoStatus: { 0: "ç»´ä¿®", 1: "手动", 2: "半自动", 3: "自动" },
        R_GM_WorkStatus: { 0: "待机", 1: "取货中", 2: "取货完成", 4: "放货中", 5: "放货完成", 6: "任务完成" },
        R_GM_WorkType: { 0: "无作业任务(0)", 1: "取放货作业(1)", 2: "只取货作业(2)", 3: "只放货作业(3)", 4: "移动到指定位置" },
        R_GM_TrayType: { "-1": "空箱(-1)", 1: "小托盘(1)", 2: "中托盘(2)", 3: "大托盘(3)", 4: "特大托盘(4)" }
        R_GM_TrayType: { "-1": "空箱(-1)", 1: "小托盘(1)", 2: "中托盘(2)", 3: "大托盘(3)", 4: "特大托盘(4)" },
        // æ–°å¢žï¼šåˆ—号映射处理
        R_GM_Column: (val) => val !== undefined ? val : "未知"
      },
      onlineStatus: {
        keys: ["R_GM_Online3", "R_GM_Online4", "R_GM_Online5"],
@@ -212,15 +252,18 @@
      }
    };
    // å¤„理GM原始数据
    // å¤„理GM原始数据(包含列号处理)
    const processGMData = (rawData) => {
      if (!rawData) return {};
      const processed = { ...rawData };
      // å¤„理核心状态字段
      Object.entries(gmStatusConfig.coreStatus).forEach(([key, map]) => {
      Object.entries(gmStatusConfig.coreStatus).forEach(([key, handler]) => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = map[processed[key]] || processed[key];
          // åˆ—号字段使用函数处理,其他使用映射表
          processed[key] = typeof handler === 'function'
            ? handler(processed[key])
            : (handler[processed[key]] || processed[key]);
        }
      });
@@ -242,16 +285,13 @@
      return processed;
    };
    // å»¶è¿Ÿæ›´æ–°GM数据,避免高频刷新导致的闪烁
    const delayedUpdateGMData = (newRawData) => {
      if (updateTimer) clearTimeout(updateTimer);
      updateTimer = setTimeout(() => {
        // ä»…处理包含GM特征字段的数据
        if (newRawData && newRawData.R_GM_Status !== undefined) {
          gmData.value = processGMData(newRawData);
          
          // æ›´æ–°æ ·å¼
          nextTick(() => {
            const valueElements = document.getElementsByClassName("xzhi");
            for (let i = 0; i < valueElements.length; i++) {
@@ -268,13 +308,11 @@
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_GM_Status !== undefined) {
        gmData.value = processGMData(initialData);
      }
      // ç›‘听数据变化,只处理GM数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
@@ -285,7 +323,6 @@
        { deep: true }
      );
      // ç»„件卸载时清理资源
      onUnmounted(() => {
        unwatch();
        if (updateTimer) clearTimeout(updateTimer);
@@ -300,6 +337,7 @@
</script>
<style scoped>
/* åŽŸæœ‰æ ·å¼ä¿æŒä¸å˜ */
.ding {
  float: left;
  width: 20px;
@@ -436,5 +474,76 @@
  margin-left: 1.7%;
  border-radius: 10px;
}
</style>
/* æ–°å¢žï¼šGM堆垛机当前列样式 */
#gm-nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å¼‚常状态文字变色 */
#gm-nowcolumn.abnormal-column {
  color: red !important;
}
#gm-nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器样式 */
.gm-column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* æ–¹æ ¼å®¹å™¨æ ·å¼ */
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-items: center;
  gap: 2px;
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px;
}
/* æ–¹æ ¼æ ·å¼ */
.column-grid-item {
  flex: 1;
  min-width: 24px;
  max-width: 60px;
  height: 30px;
  border: 1px solid #fff;
  border-radius: 8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px);
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å½“前列高亮 */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å¼‚常状态下当前列红色高亮 */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue
@@ -28,6 +28,11 @@
          <div class="xname">托盘类型:</div>
          <div class="xzhi" :title="ymData.R_YM_TrayType">{{ ymData.R_YM_TrayType || '-' }}</div>
        </div>
        <!-- æ–°å¢žï¼šå½“前所在列显示 -->
        <div class="zhankuang">
          <div class="xname">当前所在列:</div>
          <div class="xzhi" :title="ymData.R_YM_Column">{{ ymData.R_YM_Column || '未知' }}</div>
        </div>
      </div>
      <!-- YM关联站台(出入库9001) -->
@@ -88,6 +93,30 @@
        </div>
      </div>
    </div>
    <!-- æ–°å¢žï¼šå †åž›æœºå½“前列文字显示 -->
    <div id="ym-nowcolumn" :class="{ 'abnormal-column': ymData.R_YM_Status !== '正常' }">
      <div>油墨堆垛机当前所在列:
        <span :title="ymData.R_YM_Column">{{ ymData.R_YM_Column || '未知' }}</span>
      </div>
    </div>
    <!-- æ–°å¢žï¼šåˆ—方格展示区域 -->
    <div class="ym-column-container" :class="{ 'pp-status-abnormal': ymData.R_YM_Status !== '正常' }">
      <!-- ä¸Šæ–¹1-24列 -->
      <div class="column-grid-container">
        <div
          v-for="num in 32"
          :key="num"
          class="column-grid-item"
          :class="{ 'active': num == ymData.R_YM_Column }"
          :title="`列号: ${num}`"
        >
          {{ num }}
        </div>
      </div>
    </div>
  </div>
</template>
@@ -104,19 +133,18 @@
  },
  setup() {
    const store = useStore();
    // ä»…存储YM数据,与其他数据隔离
    const ymData = ref({});
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é—ªçƒé—®é¢˜
    const UPDATE_DELAY = 300; // å»¶è¿Ÿ300ms更新UI
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // YM数据映射规则
    // YM数据映射规则(新增列号处理)
    const ymStatusMap = {
      R_YM_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_YM_AutoStatus: {
        0: "ç»´ä¿®",
@@ -145,7 +173,9 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      }
      },
      // æ–°å¢žï¼šåˆ—号映射处理
      R_YM_Column: (val) => val !== undefined ? val : "未知"
    };
    // YM字段分组
@@ -166,7 +196,7 @@
      }
    };
    // å¤„理YM原始数据
    // å¤„理YM原始数据(包含列号处理)
    const processYMData = (rawData) => {
      if (!rawData) return {};
      const processedData = { ...rawData };
@@ -174,7 +204,10 @@
      // å¤„理核心状态字段
      Object.keys(ymStatusMap).forEach(key => {
        if (processedData.hasOwnProperty(key)) {
          processedData[key] = ymStatusMap[key][processedData[key]] || processedData[key];
          const mapper = ymStatusMap[key];
          processedData[key] = typeof mapper === 'function'
            ? mapper(processedData[key])
            : (mapper[processedData[key]] || processedData[key]);
        }
      });
@@ -190,14 +223,13 @@
      return processedData;
    };
    // å»¶è¿Ÿæ›´æ–°YM数据,避免高频刷新
    // å»¶è¿Ÿæ›´æ–°YM数据
    const delayedUpdateYMData = (newRawData) => {
      if (updateTimer) {
        clearTimeout(updateTimer);
      }
      updateTimer = setTimeout(() => {
        // åªå¤„理包含YM特征字段的数据
        if (newRawData && newRawData.R_YM_Status !== undefined) {
          ymData.value = processYMData(newRawData);
          
@@ -217,13 +249,11 @@
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_YM_Status !== undefined) {
        ymData.value = processYMData(initialData);
      }
      // ç›‘听数据变化,只处理YM数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
@@ -251,6 +281,7 @@
</script>
<style scoped>
/* åŽŸæœ‰æ ·å¼ä¿æŒä¸å˜ */
.ding {
  float: left;
  width: 20px;
@@ -387,4 +418,76 @@
  margin-left: 1.7%;
  border-radius: 10px;
}
</style>
/* æ–°å¢žï¼šYM堆垛机当前列样式 */
#ym-nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å¼‚常状态文字变色 */
#ym-nowcolumn.abnormal-column {
  color: red !important;
}
#ym-nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器样式 */
.ym-column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* æ–¹æ ¼å®¹å™¨æ ·å¼ */
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-items: center;
  gap: 2px;
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px;
}
/* æ–¹æ ¼æ ·å¼ */
.column-grid-item {
  flex: 1;
  min-width: 24px;
  max-width: 60px;
  height: 30px;
  border: 1px solid #fff;
  border-radius: 8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px);
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å½“前列高亮 */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å¼‚常状态下当前列红色高亮 */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue
@@ -4,6 +4,7 @@
      <!-- PP仓堆垛机状态面板 -->
      <div class="skuang">
        <div class="zhuname">PP仓堆垛机</div>
        <div class="zhankuang">
          <div class="xname">堆垛机状态:</div>
          <div class="xzhi" :title="ppData.R_PP_Status">{{ ppData.R_PP_Status }}</div>
@@ -192,6 +193,39 @@
        </div>
      </div>
    </div>
    <div id="nowcolumn" :class="{ 'abnormal-column': ppData.R_PP_Status !== '正常' }">
      <div>PP堆垛机当前所在列:
        <span :title="ppData.R_PP_Column">{{ ppData.R_PP_Column || '未知' }}</span>
      </div>
    </div>
    <div class="column-container" :class="{ 'pp-status-abnormal': ppData.R_PP_Status !== '正常' }">
    <!-- ä¸Šæ–¹1-24列 -->
    <div class="column-grid-container">
      <div
        v-for="num in 24"
        :key="num"
        class="column-grid-item"
        :class="{ 'active': num == ppData.R_PP_Column }"
        :title="`列号: ${num}`"
      >
        {{ num }}
      </div>
    </div>
    <!-- ä¸‹æ–¹25-47列 (23个) -->
    <div class="column-grid-container">
      <div
        v-for="i in 23"
        :key="'lower-' + i"
        class="column-grid-item"
        :class="{ 'active': (24 + i) == ppData.R_PP_Column }"
        :title="`列号: ${24 + i}`"
      >
        {{ 24 + i }}
      </div>
    </div>
  </div>
  </div>
</template>
@@ -208,19 +242,19 @@
  },
  setup() {
    const store = useStore();
    // ä»…存储PP数据,避免与ZH数据混淆
    const ppData = ref({});
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é«˜é¢‘刷新导致的闪烁
    const UPDATE_DELAY = 300; // å»¶è¿Ÿ300ms更新UI
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    // å»¶è¿Ÿæ›´æ–°é…ç½®
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // PP数据映射规则(仅处理PP相关字段)
    // PP数据映射规则
    const statusMap = {
      R_PP_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_PP_AutoStatus: {
        0: "ç»´ä¿®",
@@ -249,7 +283,8 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      }
      },
      R_PP_Column: (val) => val !== undefined ? val : "未知"
    };
    // PP相关布尔字段分组
@@ -284,14 +319,15 @@
    // å¤„理PP原始数据
    const processPPData = (rawData) => {
      if (!rawData) return {};
      // å¤åˆ¶åŽŸå§‹æ•°æ®ï¼Œé¿å…ç›´æŽ¥ä¿®æ”¹
      const processed = { ...rawData };
      // å¤„理状态字段映射
      Object.keys(statusMap).forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = statusMap[key][processed[key]] || processed[key];
          const mapper = statusMap[key];
          processed[key] = typeof mapper === 'function'
            ? mapper(processed[key])
            : (mapper[processed[key]] || processed[key]);
        }
      });
@@ -307,20 +343,12 @@
      return processed;
    };
    // å»¶è¿Ÿæ›´æ–°PP数据,避免高频刷新
    // å»¶è¿Ÿæ›´æ–°PP数据
    const delayedUpdatePPData = (newRawData) => {
      // æ¸…除之前的定时器,确保只执行最后一次更新
      if (updateTimer) {
        clearTimeout(updateTimer);
      }
      // å»¶è¿ŸæŒ‡å®šæ—¶é—´åŽæ›´æ–°æ•°æ®
      if (updateTimer) clearTimeout(updateTimer);
      updateTimer = setTimeout(() => {
        // åªå¤„理包含PP特征字段的数据
        if (newRawData && newRawData.R_PP_Status !== undefined) {
          ppData.value = processPPData(newRawData);
          // æ›´æ–°æ ·å¼
          nextTick(() => {
            const valueElements = document.getElementsByClassName("xzhi");
            for (let i = 0; i < valueElements.length; i++) {
@@ -336,30 +364,24 @@
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_PP_Status !== undefined) {
        ppData.value = processPPData(initialData);
      }
      // ç›‘听数据变化,只处理PP数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
          // ä»…当数据包含PP特征字段时才更新
          if (newData && newData.R_PP_Status !== undefined) {
            delayedUpdatePPData(newData);
          }
        },
        { deep: true } // æ·±åº¦ç›‘听对象内部变化
        { deep: true }
      );
      // ç»„件卸载时清理资源
      onUnmounted(() => {
        unwatch();
        if (updateTimer) {
          clearTimeout(updateTimer);
        }
        if (updateTimer) clearTimeout(updateTimer);
      });
    });
@@ -506,6 +528,89 @@
  background: rgba(255, 255, 255, 0.2);
  margin-left: 1.7%;
  border-radius: 10px;
  padding-bottom: 20px;
}
</style>
/* å †åž›æœºå½“前列样式 */
#nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å †åž›æœºçŠ¶æ€å¼‚å¸¸æ—¶ï¼Œå½“å‰åˆ—æ–‡å­—å˜ä¸ºçº¢è‰² */
#nowcolumn.abnormal-column {
  color: red !important;
}
#nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器 */
.column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* è“è‰²åˆ†å‰²çº¿ */
.column-separator {
  width: 100%;
  height: 20px;
  background-color: #3bc0ed;
  position: absolute;
  top: 0; /* è°ƒæ•´åˆ°æ–¹æ ¼é¡¶éƒ¨å¯¹é½ */
  left: 0;
  z-index: 1; /* ç¡®ä¿åœ¨æ–¹æ ¼ä¸‹æ–¹ */
  border-radius: 4px 4px 0 0;
}
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap; /* ç¦æ­¢æ¢è¡Œ */
  justify-content: space-between; /* å‡åŒ€åˆ†å¸ƒ */
  align-items: center;
  gap: 2px; /* æ–¹æ ¼ä¹‹é—´çš„间距 */
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px; /* é¿å…è¾¹ç¼˜æ–¹æ ¼è´´è¾¹ */
}
/* åˆ—方格样式 - å…³é”®ä¿®æ”¹ */
.column-grid-item {
  flex: 1; /* æ ¸å¿ƒï¼šæ¯ä¸ªæ–¹æ ¼å¹³å‡åˆ†é…å‰©ä½™ç©ºé—´ */
  min-width: 24px; /* æœ€å°å®½åº¦ï¼ˆé¿å…è¿‡å°ï¼‰ */
  max-width: 60px; /* æœ€å¤§å®½åº¦ï¼ˆé¿å…è¿‡å¤§ï¼‰ */
  height: 30px;
  border: 1px solid #fff;
  border-radius:8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px); /* è‡ªé€‚应字体 */
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å½“前列高亮(正常状态) */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å †åž›æœºçŠ¶æ€å¼‚å¸¸æ—¶ï¼Œå½“å‰åˆ—é«˜äº®ä¸ºçº¢è‰² */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue
@@ -28,6 +28,11 @@
          <div class="xname">托盘类型:</div>
          <div class="xzhi" :title="zhData.R_ZH_TrayType">{{ zhData.R_ZH_TrayType || '-' }}</div>
        </div>
        <!-- æ–°å¢žï¼šå½“前所在列显示 -->
        <div class="zhankuang">
          <div class="xname">当前所在列:</div>
          <div class="xzhi" :title="zhData.R_ZH_Column">{{ zhData.R_ZH_Column || '未知' }}</div>
        </div>
      </div>
      <!-- ZH关联站台(入库301+入库302) -->
@@ -172,6 +177,30 @@
        </div>
      </div>
    </div>
    <!-- æ–°å¢žï¼šå †åž›æœºå½“前列文字显示 -->
    <div id="zh-nowcolumn" :class="{ 'abnormal-column': zhData.R_ZH_Status !== '正常' }">
      <div>阻焊堆垛机当前所在列:
        <span :title="zhData.R_ZH_Column">{{ zhData.R_ZH_Column || '未知' }}</span>
      </div>
    </div>
    <!-- æ–°å¢žï¼šåˆ—方格展示区域 -->
    <div class="zh-column-container" :class="{ 'pp-status-abnormal': zhData.R_ZH_Status !== '正常' }">
      <!-- ä¸Šæ–¹1-24列 -->
      <div class="column-grid-container">
        <div
          v-for="num in 28"
          :key="num"
          class="column-grid-item"
          :class="{ 'active': num == zhData.R_ZH_Column }"
          :title="`列号: ${num}`"
        >
          {{ num }}
        </div>
      </div>
    </div>
  </div>
</template>
@@ -188,19 +217,18 @@
  },
  setup() {
    const store = useStore();
    // ä»…存储ZH数据,与其他数据隔离
    const zhData = ref({});
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é—ªçƒé—®é¢˜
    const UPDATE_DELAY = 300; // å»¶è¿Ÿ300ms更新UI
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // ZH数据映射规则
    // ZH数据映射规则(新增列号处理)
    const zhStatusMap = {
      R_ZH_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_ZH_AutoStatus: {
        0: "ç»´ä¿®",
@@ -229,7 +257,9 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      }
      },
      // æ–°å¢žï¼šåˆ—号映射处理
      R_ZH_Column: (val) => val !== undefined ? val : "未知"
    };
    // ZH字段分组
@@ -256,7 +286,7 @@
      }
    };
    // å¤„理ZH原始数据
    // å¤„理ZH原始数据(包含列号处理)
    const processZHData = (rawData) => {
      if (!rawData) return {};
      const processedData = { ...rawData };
@@ -264,7 +294,10 @@
      // å¤„理核心状态字段
      Object.keys(zhStatusMap).forEach(key => {
        if (processedData.hasOwnProperty(key)) {
          processedData[key] = zhStatusMap[key][processedData[key]] || processedData[key];
          const mapper = zhStatusMap[key];
          processedData[key] = typeof mapper === 'function'
            ? mapper(processedData[key])
            : (mapper[processedData[key]] || processedData[key]);
        }
      });
@@ -280,14 +313,13 @@
      return processedData;
    };
    // å»¶è¿Ÿæ›´æ–°ZH数据,避免高频刷新
    // å»¶è¿Ÿæ›´æ–°ZH数据
    const delayedUpdateZHData = (newRawData) => {
      if (updateTimer) {
        clearTimeout(updateTimer);
      }
      updateTimer = setTimeout(() => {
        // åªå¤„理包含ZH特征字段的数据
        if (newRawData && newRawData.R_ZH_Status !== undefined) {
          zhData.value = processZHData(newRawData);
          
@@ -307,13 +339,11 @@
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_ZH_Status !== undefined) {
        zhData.value = processZHData(initialData);
      }
      // ç›‘听数据变化,只处理ZH数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
@@ -341,6 +371,7 @@
</script>
<style scoped>
/* åŽŸæœ‰æ ·å¼ä¿æŒä¸å˜ */
.ding {
  float: left;
  width: 20px;
@@ -477,4 +508,76 @@
  margin-left: 1.7%;
  border-radius: 10px;
}
</style>
/* æ–°å¢žï¼šZH堆垛机当前列样式 */
#zh-nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å¼‚常状态文字变色 */
#zh-nowcolumn.abnormal-column {
  color: red !important;
}
#zh-nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器样式 */
.zh-column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* æ–¹æ ¼å®¹å™¨æ ·å¼ */
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-items: center;
  gap: 2px;
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px;
}
/* æ–¹æ ¼æ ·å¼ */
.column-grid-item {
  flex: 1;
  min-width: 24px;
  max-width: 60px;
  height: 30px;
  border: 1px solid #fff;
  border-radius: 8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px);
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å½“前列高亮 */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å¼‚常状态下当前列红色高亮 */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/TestFrameWarehouse.vue
@@ -5,7 +5,8 @@
      <div class="skuang">
        <div class="csjuname">测试架仓堆垛机</div>
        <div class="csjankuang">
          <div class="xname">堆垛机状态:</div>
          <div class="xname">堆            å †åž›æœºçŠ¶æ€:
          </div>
          <div class="xcsji" :title="csjData.R_CSJ_Status">{{ csjData.R_CSJ_Status || '-' }}</div>
        </div>
        <div class="csjankuang">
@@ -27,6 +28,11 @@
        <div class="csjankuang">
          <div class="xname">托盘类型:</div>
          <div class="xcsji" :title="csjData.R_CSJ_TrayType">{{ csjData.R_CSJ_TrayType || '-' }}</div>
        </div>
        <!-- æ–°å¢žï¼šå½“前所在列显示 -->
        <div class="csjankuang">
          <div class="xname">当前所在列:</div>
          <div class="xcsji" :title="csjData.R_CSJ_Column">{{ csjData.R_CSJ_Column || '未知' }}</div>
        </div>
      </div>
@@ -86,6 +92,41 @@
        </div>
      </div>
    </div>
    <!-- æ–°å¢žï¼šå †åž›æœºå½“前列文字显示 -->
    <div id="csj-nowcolumn" :class="{ 'abnormal-column': csjData.R_CSJ_Status !== '正常' }">
      <div>测试架堆垛机当前所在列:
        <span :title="csjData.R_CSJ_Column">{{ csjData.R_CSJ_Column || '未知' }}</span>
      </div>
    </div>
    <!-- æ–°å¢žï¼šåˆ—方格展示区域 -->
    <div class="csj-column-container" :class="{ 'pp-status-abnormal': csjData.R_CSJ_Status !== '正常' }">
      <!-- ä¸Šæ–¹1-24列 -->
      <div class="column-grid-container">
        <div
          v-for="num in 20"
          :key="num"
          class="column-grid-item"
          :class="{ 'active': num == csjData.R_CSJ_Column }"
          :title="`列号: ${num}`"
        >
          {{ num }}
        </div>
      </div>
      <!-- ä¸‹æ–¹25-47列 (23个) -->
      <div class="column-grid-container">
        <div
          v-for="i in 23"
          :key="'csj-lower-' + i"
          class="column-grid-item"
          :class="{ 'active': (20 + i) == csjData.R_CSJ_Column }"
          :title="`列号: ${20 + i}`"
        >
          {{ 20 + i }}
        </div>
      </div>
    </div>
  </div>
</template>
@@ -102,19 +143,18 @@
  },
  setup() {
    const store = useStore();
    // ä»…存储CSJ数据,与其他数据隔离
    const csjData = ref({});
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é—ªçƒé—®é¢˜
    const UPDATE_DELAY = 300; // å»¶è¿Ÿ300ms更新UI
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // CSJ数据映射规则
    // CSJ数据映射规则(新增列号处理)
    const csjStatusMap = {
      R_CSJ_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_CSJ_AutoStatus: {
        0: "ç»´ä¿®",
@@ -143,7 +183,9 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      }
      },
      // æ–°å¢žï¼šåˆ—号映射处理
      R_CSJ_Column: (val) => val !== undefined ? val : "未知"
    };
    // CSJ字段分组
@@ -170,7 +212,7 @@
      }
    };
    // å¤„理CSJ原始数据
    // å¤„理CSJ原始数据(包含列号处理)
    const processCSJData = (rawData) => {
      if (!rawData) return {};
      const processedData = { ...rawData };
@@ -178,7 +220,10 @@
      // å¤„理核心状态字段
      Object.keys(csjStatusMap).forEach(key => {
        if (processedData.hasOwnProperty(key)) {
          processedData[key] = csjStatusMap[key][processedData[key]] || processedData[key];
          const mapper = csjStatusMap[key];
          processedData[key] = typeof mapper === 'function'
            ? mapper(processedData[key])
            : (mapper[processedData[key]] || processedData[key]);
        }
      });
@@ -194,14 +239,13 @@
      return processedData;
    };
    // å»¶è¿Ÿæ›´æ–°CSJ数据,避免高频刷新
    // å»¶è¿Ÿæ›´æ–°CSJ数据
    const delayedUpdateCSJData = (newRawData) => {
      if (updateTimer) {
        clearTimeout(updateTimer);
      }
      updateTimer = setTimeout(() => {
        // åªå¤„理包含CSJ特征字段的数据
        if (newRawData && newRawData.R_CSJ_Status !== undefined) {
          csjData.value = processCSJData(newRawData);
          
@@ -221,13 +265,11 @@
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_CSJ_Status !== undefined) {
        csjData.value = processCSJData(initialData);
      }
      // ç›‘听数据变化,只处理CSJ数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
@@ -255,6 +297,7 @@
</script>
<style scoped>
/* åŽŸæœ‰æ ·å¼ä¿æŒä¸å˜ */
.ding {
  float: left;
  width: 20px;
@@ -391,4 +434,76 @@
  margin-left: 1.7%;
  border-radius: 10px;
}
</style>
/* æ–°å¢žï¼šCSJ堆垛机当前列样式 */
#csj-nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å¼‚常状态文字变色 */
#csj-nowcolumn.abnormal-column {
  color: red !important;
}
#csj-nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器样式 */
.csj-column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* æ–¹æ ¼å®¹å™¨æ ·å¼ */
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-items: center;
  gap: 2px;
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px;
}
/* æ–¹æ ¼æ ·å¼ */
.column-grid-item {
  flex: 1;
  min-width: 24px;
  max-width: 60px;
  height: 30px;
  border: 1px solid #fff;
  border-radius: 8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px);
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å½“前列高亮 */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å¼‚常状态下当前列红色高亮 */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -170,5 +170,32 @@
        {
            return Service.RecWMSTaskHandCancel(taskNum);
        }
        //辅料输送线任务重发
        [HttpPost, HttpGet, Route("FLconverTaskResending"), AllowAnonymous]
        public WebResponseContent FLconverTaskResending(int taskNum)
        {
            try
            {
                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null)
                {
                    return WebResponseContent.Instance.Error("未找到该任务信息");
                }
                if (task.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && task.DeviceCode.Contains("FL"))
                {
                    _taskService.UpdateTask(task, TaskStatusEnum.New);
                }
                else
                {
                    return WebResponseContent.Instance.Error("非输送线执行中状态或非辅料仓任务");
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP²Ö/ConveyorLineJob_PP.cs
@@ -234,7 +234,7 @@
                    {
                        if (conveyorLineSignalRead1.STB && conveyorLineStatus1.Online && conveyorLineStatus1.Goods && !conveyorLineStatus1.Alarm && !conveyorLineSignalWrite1.ACK)
                        {
                            StackerCraneJob_PP.pPReadData.R_PP_Boxcode = device.Communicator.Read<string>("DB900.578.0");
                            StackerCraneJob_PP.pPReadData.R_PP_Boxcode = device.Communicator.Read<string>("DB900.528.0");
                        }
                        StackerCraneJob_PP.pPReadData.R_PP_HandShake4 = conveyorLineStatus1.HandShake;
                        StackerCraneJob_PP.pPReadData.R_PP_Online4 = conveyorLineStatus1.Online;
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP²Ö/PPReadData.cs
@@ -37,7 +37,10 @@
        /// æ‰˜ç›˜ç±»åž‹
        /// </summary>
        public short R_PP_TrayType;
        /// <summary>
        /// å½“前列
        /// </summary>
        public short R_PP_Column;
        ///站台
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP²Ö/StackerCraneJob_PP.cs
@@ -115,6 +115,7 @@
                    pPReadData.R_PP_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
                    pPReadData.R_PP_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
                    pPReadData.R_PP_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
                    pPReadData.R_PP_Column = commonStackerCrane.Communicator.Read<short>("DB11.42.0");
                    string pPData = JsonConvert.SerializeObject(pPReadData);
                    _webSocketServer.PublishAllClientPayload(pPData);
                }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/ConveyorLineJob_GM.cs
@@ -248,7 +248,7 @@
                    if (item.StationCode == "7003") {
                        if (conveyorLineSignalRead1.STB && conveyorLineStatus1.Online && conveyorLineStatus1.Goods && !conveyorLineStatus1.Alarm && !conveyorLineSignalWrite1.ACK)
                        {
                            StackerCraneJob_GM.gMReadData.R_GM_Boxcode = device.Communicator.Read<string>("DB900.478.0");
                            StackerCraneJob_GM.gMReadData.R_GM_Boxcode = device.Communicator.Read<string>("DB900.438.0");
                        }
                        StackerCraneJob_GM.gMReadData.R_GM_HandShake3 = conveyorLineStatus1.HandShake;
                        StackerCraneJob_GM.gMReadData.R_GM_Online3 = conveyorLineStatus1.Online;
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/GMReadData.cs
@@ -38,9 +38,14 @@
        /// </summary>
        public short R_GM_TrayType;
        /// <summary>
        /// å½“前列
        /// </summary>
        public short R_GM_Column;
        ///站台
        ///<summary>
        /// è¯»å–条码
        /// </summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/StackerCraneJob_GM.cs
@@ -30,6 +30,7 @@
using AutoMapper;
using HslCommunication.WebSocket;
using WIDESEAWCS_Tasks.干膜仓;
using WIDESEAWCS_Tasks.板材仓;
namespace WIDESEAWCS_Tasks
{
@@ -122,6 +123,7 @@
                    gMReadData.R_GM_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
                    gMReadData.R_GM_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
                    gMReadData.R_GM_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
                    gMReadData.R_GM_Column = commonStackerCrane.Communicator.Read<short>("DB11.42.0");
                    string gMData = JsonConvert.SerializeObject(gMReadData);
                    _webSocketServer.PublishAllClientPayload(gMData);
                }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/BCReadData.cs
@@ -37,5 +37,10 @@
        /// æ‰˜ç›˜ç±»åž‹
        /// </summary>
        public short R_BC_TrayType;
        /// <summary>
        /// å½“前列
        /// </summary>
        public short R_BC_Column;
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/StackerCraneJob_BC.cs
@@ -139,6 +139,7 @@
                    bCReadData.R_BC_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
                    bCReadData.R_BC_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
                    bCReadData.R_BC_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
                    bCReadData.R_BC_Column = commonStackerCrane.Communicator.Read<short>("DB11.42.0");
                    string bCData = JsonConvert.SerializeObject(bCReadData);
                    _webSocketServer.PublishAllClientPayload(bCData);
                }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ÓÍÄ«²Ö/StackerCraneJob_YM.cs
@@ -25,6 +25,7 @@
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_Tasks.HoisterJob;
using WIDESEAWCS_Tasks.StackerCraneJob;
using WIDESEAWCS_Tasks.板材仓;
using WIDESEAWCS_Tasks.油墨仓;
using WIDESEAWCS_Tasks.阻焊仓;
@@ -99,6 +100,7 @@
                        yMReadData.R_YM_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
                        yMReadData.R_YM_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
                        yMReadData.R_YM_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
                        yMReadData.R_YM_Column = commonStackerCrane.Communicator.Read<short>("DB11.42.0");
                        string yMData = JsonConvert.SerializeObject(yMReadData);
                        _webSocketServer.PublishAllClientPayload(yMData);
                    }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ÓÍÄ«²Ö/YMReadData.cs
@@ -38,6 +38,11 @@
        /// </summary>
        public short R_YM_TrayType;
        /// <summary>
        /// å½“前列
        /// </summary>
        public short R_YM_Column;
        ///提升机
        /// <summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/²âÊԼܲÖ/CSJReadData.cs
@@ -38,6 +38,11 @@
        /// </summary>
        public short R_CSJ_TrayType;
        /// <summary>
        /// å½“前列
        /// </summary>
        public short R_CSJ_Column;
        ///各站台读取103
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/²âÊԼܲÖ/StackerCraneJob_CSJ.cs
@@ -28,6 +28,7 @@
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_Tasks.HoisterJob;
using WIDESEAWCS_Tasks.StackerCraneJob;
using WIDESEAWCS_Tasks.板材仓;
using WIDESEAWCS_Tasks.测试架仓;
namespace WIDESEAWCS_Tasks
@@ -112,6 +113,7 @@
                    cSJReadData.R_CSJ_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
                    cSJReadData.R_CSJ_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
                    cSJReadData.R_CSJ_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
                    cSJReadData.R_CSJ_Column = commonStackerCrane.Communicator.Read<short>("DB11.42.0");
                    string cSJData = JsonConvert.SerializeObject(cSJReadData);
                    _webSocketServer.PublishAllClientPayload(cSJData);
                }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/×躸²Ö/StackerCraneJob_ZH.cs
@@ -29,6 +29,7 @@
using AutoMapper;
using WIDESEAWCS_Tasks.阻焊仓;
using HslCommunication.WebSocket;
using WIDESEAWCS_Tasks.板材仓;
namespace WIDESEAWCS_Tasks
{
@@ -111,6 +112,7 @@
                    zHReadData.R_ZH_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
                    zHReadData.R_ZH_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
                    zHReadData.R_ZH_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
                    zHReadData.R_ZH_Column = commonStackerCrane.Communicator.Read<short>("DB11.42.0");
                    string zHData = JsonConvert.SerializeObject(zHReadData);
                    _webSocketServer.PublishAllClientPayload(zHData);
                }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/×躸²Ö/ZHReadData.cs
@@ -38,8 +38,13 @@
        /// </summary>
        public short R_ZH_TrayType;
        /// <summary>
        /// å½“前列
        /// </summary>
        public short R_ZH_Column;
        ///各站台读取301
        ///取货托盘类型(读)
        public short R_ZH_TakePalletType1;
        /// <summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/config/buttons.js
@@ -219,6 +219,15 @@
    onClick: function () {
    }
},
{
    name: "更新物料是否过期",
    icon: '',
    class: '',
    value: 'UpdateExpirationlabel',
    type: 'success',
    onClick: function () {
    }
},
]
export default buttons
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.js
@@ -2,66 +2,79 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
let extension = {
    components: {
      //查询界面扩展组件
      gridHeader: '',
      gridBody: '',
      gridFooter: '',
      //新建、编辑弹出框扩展组件
      modelHeader: '',
      modelBody: '',
      modelFooter: ''
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridBody: '',
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
    modelFooter: ''
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
    //下面这些方法可以保留也可以删除
    onInit() {
      let UpdateExpirationlabelBtn = this.buttons.find(x => x.value == 'UpdateExpirationlabel');
      if (UpdateExpirationlabelBtn) {
        UpdateExpirationlabelBtn.onClick = function () {
          this.http
            .post("api/StockInfo/UpdateExpirationlabel", "数据处理中...")
            .then((x) => {
              if (x.status) {
                this.$Message.success('更新完成');
                this.refresh();
              } else {
                return this.$error(x.message);
              }
            });
        }
      }
    },
    tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
    buttons: { view: [], box: [], detail: [] }, //扩展的按钮
    methods: {
       //下面这些方法可以保留也可以删除
      onInit() {
      },
      onInited() {
        //框架初始化配置后
        //如果要配置明细表,在此方法操作
        //this.detailOptions.columns.forEach(column=>{ });
      },
      searchBefore(param) {
        //界面查询前,可以给param.wheres添加查询参数
        //返回false,则不会执行查询
        return true;
      },
      searchAfter(result) {
        //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
        return true;
      },
      addBefore(formData) {
        //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
        return true;
      },
      updateBefore(formData) {
        //编辑保存前formData为对象,包括明细表、删除行的Id
        return true;
      },
      rowClick({ row, column, event }) {
        //查询界面点击行事件
        this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
      },
      modelOpenAfter(row) {
        // ç‚¹å‡»ç¼–辑按钮弹出框后执行
            if (this.currentAction === 'Edit') { // åˆ¤æ–­å½“前是编辑操作
                // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·ï¼ˆå‡è®¾ä»Žå…¨å±€å˜é‡èŽ·å–ï¼Œå…·ä½“æ ¹æ®ä½ çš„é¡¹ç›®å®žçŽ°ï¼‰
                const currentUser = this.$store.state.userInfo?.username || 'system';
                // èŽ·å–å½“å‰æ—¶é—´å¹¶æ ¼å¼åŒ–ä¸ºåŽç«¯éœ€è¦çš„æ ¼å¼
                const now = new Date();
                const formattedDate = now.toISOString().slice(0, 19).replace('T', ' ');
                // è®¾ç½®ä¿®æ”¹äººå­—段
                this.editFormFields.modifier = currentUser;
                // è®¾ç½®ä¿®æ”¹æ—¶é—´å­—段
                this.editFormFields.modifyDate = formattedDate;
            }
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      //this.detailOptions.columns.forEach(column=>{ });
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      // ç‚¹å‡»ç¼–辑按钮弹出框后执行
      if (this.currentAction === 'Edit') { // åˆ¤æ–­å½“前是编辑操作
        // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·ï¼ˆå‡è®¾ä»Žå…¨å±€å˜é‡èŽ·å–ï¼Œå…·ä½“æ ¹æ®ä½ çš„é¡¹ç›®å®žçŽ°ï¼‰
        const currentUser = this.$store.state.userInfo?.username || 'system';
        // èŽ·å–å½“å‰æ—¶é—´å¹¶æ ¼å¼åŒ–ä¸ºåŽç«¯éœ€è¦çš„æ ¼å¼
        const now = new Date();
        const formattedDate = now.toISOString().slice(0, 19).replace('T', ' ');
        // è®¾ç½®ä¿®æ”¹äººå­—段
        this.editFormFields.modifier = currentUser;
        // è®¾ç½®ä¿®æ”¹æ—¶é—´å­—段
        this.editFormFields.modifyDate = formattedDate;
      }
    }
  };
  export default extension;
  }
};
export default extension;
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/PurchaseOrderService.cs
@@ -214,6 +214,7 @@
                            Unit = item.Unit,
                            WarehouseId = warehouse.WarehouseId,
                            RowNo = item.RowId,
                            PurchaseOrderId = purchaseOrder.Id,
                        };
                        purchaseOrderDetails.Add(purchaseOrderDetail);
                    }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -135,6 +135,11 @@
                            {
                                return content.Error($"订单{item.SaleOrder}终端客户获取失败!");
                            }
                            // æ–°å¢žï¼šåˆ¤æ–­Data是否为空集合
                            if (responseContent.Data == null || responseContent.Data.Count == 0)
                            {
                                return content.Error($"订单{item.SaleOrder}在ERP中无对应终端客户数据!");
                            }
                            //判断终端客户是否存在
                            Dt_CustomerInfo? customerInfoEnd = customerInfos.Where(x => x.Code == responseContent.Data[0].Endcustomer).FirstOrDefault();
                            if (customerInfoEnd == null)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/ProStockInfoRepository.cs
@@ -94,7 +94,7 @@
        public List<Dt_ProStockInfo> GetProStocks(Dt_ErpProScrapSheetDetail erpProScrapSheetDetail, List<string> locationInfos)
        {
            List<Dt_ProStockInfo>? proStockInfos = null;
            proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt())
            proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && (x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt()|| x.ProStockAttribute == ProStockAttributeEnum.尾数.ObjToInt()))
                .Includes(x => x.proStockInfoDetails)
                .Where(x => x.proStockInfoDetails
                .Any(v =>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs
@@ -116,6 +116,11 @@
        //查找可用报废库存
        public List<Dt_ProStockInfo> GetUseableStocks(int warehoseId, Dt_ErpProScrapSheetDetail erpProScrapSheetDetail)
        {
            //为尾数仓时报废出库
            if(warehoseId == 8)
            {
                warehoseId = 7;
            }
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            return BaseDal.GetProStocks(erpProScrapSheetDetail, locationCodes);
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -1212,7 +1212,10 @@
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                        _stockService.ProStockInfoService.Repository.DeleteAndMoveIntoHty(proStockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                        _stockService.ProStockInfoDetailService.Repository.DeleteAndMoveIntoHty(proStockInfo.proStockInfoDetails, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                        _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        if (prolocationInfo != null)
                        {
                            _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        }
                        _unitOfWorkManage.CommitTran();
                        return WebResponseContent.Instance.OK();
                    }
@@ -1229,7 +1232,10 @@
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                        _stockService.ProStockInfoService.Repository.UpdateData(proStockInfo);
                        _stockService.ProStockInfoDetailService.Repository.UpdateData(proStockInfo.proStockInfoDetails);
                        _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        if (prolocationInfo != null)
                        {
                            _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        }
                        _unitOfWorkManage.CommitTran();
                        return WebResponseContent.Instance.OK();
                    }
@@ -1335,6 +1341,7 @@
            }
            catch(Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
@@ -1423,6 +1430,7 @@
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -15,7 +15,7 @@
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //旧WMS数据库连接
  //旧WMS数据库连接1
  //"TeConnectionString": "Data Source=10.30.4.92;Initial Catalog=TeChuang;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
  "Cors": {