b35e72bcf8011cf6e30182b0800e2f6e1a18e149..fe77f3c9d11e3087c1efa56fd6205ffc10e39991
2025-06-05 helongyang
更新
fe77f3 对比 | 目录
2025-06-05 wangxinhui
Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn
30eb20 对比 | 目录
2025-06-05 wangxinhui
最新代码提交
17bca2 对比 | 目录
2025-06-03 helongyang
功能,页面更新优化
166a45 对比 | 目录
已删除4个文件
已修改52个文件
已添加6个文件
已重命名1个文件
2647 ■■■■■ 文件已修改
代码管理/LargeScreen/CP-Screen/src/api/ajax.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/api/api.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/api/http.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/store/modules/setting.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/views/indexs/center-map.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/views/indexs/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/views/indexs/left-bottom.vue 703 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/LargeScreen/CP-Screen/src/views/indexs/station-two.vue 710 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/009c71ac-3f6b-4e87-8d77-9e67b15f196a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/05de9a72-8eef-42af-bb91-2884b11682fc.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/1c314e67-7b22-4b95-82d8-39953c4ffcb1.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/30faed0f-10c1-4ef3-8430-efc0de767fc3.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9c8323bc-3d97-4f52-8315-faf14a56756c.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/be38a26a-2b17-43c8-b4f8-d9fd5f3264c6.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/fc24c9bc-a681-4021-afee-e9730bbda510.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/CTU_AGVController .cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/R_ConveyorLineDBName.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/ConveyorLineJob_PP.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskCommandGMPP.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/ConveyorLineJob_GM.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/StackerCraneJob_GM.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/ConveyorLineJob_FL.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/basic/extend/GetOrderMaterielSpec.vue 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/MesOutOrderDetail.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/basic/locationInfoRow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/inbound/returnOrder.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/b157c59e-a4e0-4f94-a6da-466245995b56.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/bfe4e4fb-c551-4c7f-94ec-d7011d126854.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Task/WMSTaskDTO.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IPurchaseOrderDetailService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/PurchaseOrderDetailService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielCodeInfo.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesProductService.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Reloaction.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/PurchaseOrderDetailController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/24KH244 深圳美瑞安 淮安特创立体库项目电控软件开发、测试及维护服务-技术协议-2024.11.21.pdf 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/api/ajax.js
@@ -3,7 +3,7 @@
// import { config } from 'vue/types/umd';
axios.defaults.withCredentials=true;
axios.defaults.crossDomain=true;
axios.defaults.baseURL = 'http://10.30.4.92:9283';//'http://192.168.2.51:8099'; //'http://localhost:8099'; //'http://192.168.2.51:8099';//
axios.defaults.baseURL = 'http://10.30.4.92:7081';//'http://192.168.2.51:8099'; //'http://localhost:8099'; //'http://192.168.2.51:8099';//
axios.defaults.headers.post["Content-Type"]="application/json;charset=utf-8";
// é”™è¯¯ä¿¡æ¯å¤„理
const  errorHandle = (status, other) => {
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/api/api.js
@@ -10,7 +10,7 @@
let baseUrl = UtilVar.baseUrl
const CancelToken = axios.CancelToken;
export { baseUrl };
// axios.defaults.withCredentials = true;
axios.defaults.withCredentials = true;
// æ·»åŠ è¯·æ±‚æ‹¦æˆªå™¨
axios.interceptors.request.use(function (config) {
    // åœ¨å‘送请求之前做些什么 ä¼ token
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/api/http.js
@@ -7,7 +7,7 @@
export function  ProLocationStatistics (data) {
    return axios.post('/api/Large/ProLocationStatistics?id=7', data)//返回的时promies对象,所以直接return出去就好了
}
//成品近七天统计
//成品入库产量统计
export function  Productions (data) {
    return axios.post('/api/Large/Productions', data)//返回的时promies对象,所以直接return出去就好了
}
@@ -23,3 +23,11 @@
export function  ProductionStock (data) {
    return axios.post('/api/Large/ProductionStock', data)//返回的时promies对象,所以直接return出去就好了
}
//成品产品库存总数统计
export function  GetCPLargeStockCount (data) {
    return axios.post('/api/Large/GetCPLargeStockCount', data)//返回的时promies对象,所以直接return出去就好了
}
//成品近七天任务统计
export function  GetProWeekTasks (data) {
    return axios.post('/api/Large/GetProWeekTasks', data)//返回的时promies对象,所以直接return出去就好了
}
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/router/index.js
@@ -29,7 +29,7 @@
];
const router = new VueRouter({
  mode: "hash",
  // base: process.env.BASE_URL,
  base: process.env.BASE_URL,
  routes
});
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/store/modules/setting.js
@@ -19,9 +19,9 @@
            limitMoveNum: 4, // å¼€å§‹æ— ç¼æ»šåŠ¨çš„æ•°æ®é‡ this.dataList.length
            singleHeight: 0, // å•步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
            singleWidth: 0, // å•步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
            waitTime: 3000 // å•步运动停止的时间(默认值1000ms)
            waitTime: 8000 // å•步运动停止的时间(默认值1000ms)
          },
          echartsAutoTime:3000,//echarts å›¾è‡ªåŠ¨è¯·æ±‚æŽ¥å£æ—¶é—´
          echartsAutoTime:8000,//echarts å›¾è‡ªåŠ¨è¯·æ±‚æŽ¥å£æ—¶é—´
    }),
    getters: {
        //根据菜单路径获取 èœå•信息
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/views/indexs/center-map.vue
@@ -268,7 +268,7 @@
              color: "#FFF",
              show: true,
            },
            // colorBy: "data",
            colorBy: "data",
            itemStyle: {
              color: "rgba(255,255,255,1)",
              borderColor: "rgba(2255,255,255,2)",
@@ -329,7 +329,7 @@
        #00eaff 48.8525390625%,
        #01aaff 100%
      );
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      margin: 0 10px;
    }
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/views/indexs/index.vue
@@ -17,14 +17,14 @@
      <ItemWrap
        class="contetn_left-bottom contetn_lr-item"
        title="成品执行任务统计"
        title="成品当月执行任务统计"
      >
      <stationone/>
      </ItemWrap>
      <ItemWrap
        class="contetn_left-bottom contetn_lr-item"
        title="成品库存属性分布"
        title="成品仓产品库存总数统计"
      >
      <stationtwo/>
      </ItemWrap>
@@ -38,7 +38,7 @@
    </div>
    <div class="contetn_center">
      <ItemWrap class="contetn_left-bottom contetn_lr-item" style="height: 66vh;" title="成品任务统计">
      <ItemWrap class="contetn_left-bottom contetn_lr-item" style="height: 66vh;" title="成品近九天任务统计">
        <LeftBottom/>
      </ItemWrap>
      <ItemWrap
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/views/indexs/left-bottom.vue
@@ -1,568 +1,187 @@
<!--
 * @Author: daidai
 * @Date: 2022-02-28 16:16:42
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2022-07-20 17:57:11
 * @FilePath: \web-pc\src\pages\big-screen\view\indexs\left-center.vue
-->
<template>
  <div id="name" style="width: 100%; height: 100%">
    <Echart :options="options" style="width: 100%; height: 100%"></Echart>
    <Echart
      :options="options"
      style="width: 100%; height: 100%"
      v-if="!loading"
    />
    <div v-else style="color: white; text-align: center; padding-top: 50px">
      æ•°æ®åŠ è½½ä¸­...
    </div>
    <div v-if="error" style="color: red; text-align: center; padding-top: 50px">
      æ•°æ®åŠ è½½å¤±è´¥: {{ error }}
    </div>
  </div>
</template>
<script>
import { currentGET } from "api/modules";
import { ProLocationStatistics } from "@/api/http.js";
import { GetProWeekTasks } from "@/api/http.js";
import * as echarts from 'echarts';
let style = {
  fontSize: 24,
};
export default {
  data() {
    return {
      pageflag: true,
      myChart: {},
      options: {},
      loading: false,
      error: null,
      timer: null
    };
  },
  filters: {
    numsFilter(msg) {
      return msg || 0;
    },
  },
  created() {
    this.getData();
  },
  mounted() {
    this.init();
    this.fetchData();
    this.startAutoRefresh();
  },
  beforeDestroy() {
    this.clearData();
    this.stopAutoRefresh();
  },
  methods: {
    init() {
    initEmptyChart() {
      this.options = {
     //浮动框
     tooltip: {},
     //图例
     legend: {
         right: '12%',
         bottom: '4%',
         textStyle: {
             color: '#fff',
             fontSize: '13'
         },
         itemGap: 20,
         itemWidth: 10,
         itemHeight: 10,
         icon: 'circle',
         data: ['PM2.5', 'CO2', 'SO']
     },
     grid: {
         left: '8%',
         top: '15%',
         bottom: '14%',
         width: '86%',
     },
     visualMap: [{
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#69dbf7'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: 'SO',
         seriesIndex: 2
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#1be57a'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: 'CO2',
         seriesIndex: 1
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#feb01e'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: 'PM2.5',
         seriesIndex: 0
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#69dbf7'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: 'SO',
         seriesIndex: 5
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#1be57a'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: 'CO2',
         seriesIndex: 4
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#feb01e'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: 'PM2.5',
         seriesIndex: 3
     }],
     //xè½´
     xAxis: {
         axisLine: {
             lineStyle: {
                 color: '#132987'
             }
         },
         axisLabel: {
             textStyle: {
                 color: '#FFF',
                 fontSize: 12
             },
         },
         //刻度线
         axisTick: {
             show: false
         },
         //坐标轴显示值
         data: ["1时", "2时", "3时", "4时", "5时", "6时", "7时", "8时"]
     },
     //yè½´
     yAxis: {
         min: 0,
         max: 100,
         axisLabel: { //  æ”¹å˜y轴字体颜色和大小
             //formatter: '{value} m³ ', //  ç»™y轴添加单位
             textStyle: {
                 color: '#fff',
                 fontSize: 12,
             },
         },
         //坐标轴线
         axisLine: {
             show: false,
         },
         //刻度线
         axisTick: {
             show: false
         },
         //在grid区域中的分隔线
         splitLine: {
             show: true,
             lineStyle: {
                 color: '#132987',
             }
         },
     },
     //
     series: [{
         name: 'PM2.5',
         type: 'line',
         symbolSize: [0, 0],
         itemStyle: {
             color: '#feb01e'
         },
         data: [43, 50, 41, 18, 28, 25, 26, 40],
     }, {
         name: 'CO2',
         type: 'line',
         symbolSize: [0, 0],
         itemStyle: {
             color: '#1be57a'
         },
         data: [21, 30, 37, 39, 23, 37, 5, 50]
     }, {
         name: 'SO',
         type: 'line',
         symbolSize: [0, 0],
         itemStyle: {
             color: '#69dbf7'
         },
         data: [76, 58, 60, 38, 49, 59, 78, 60]
     }, { //水波纹点
         name: 'PM2.5',
         type: 'effectScatter',
         symbolSize: [5, 5],
         rippleEffect: {
             period: 1,
             scale: 4,
             brushType: 'fill'
         },
         itemStyle: {
             color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                 offset: 0,
                 color: '#feb01e'
             }, {
                 offset: 1,
                 color: 'rgba(254,176,30,.3)'
             }])
         },
         data: [43, 50, 41, 18, 28, 25, 26, 40]
     }, { //水波纹点
         name: 'CO2',
         type: 'effectScatter',
         symbolSize: [5, 5],
         rippleEffect: {
             period: 1,
             scale: 4,
             brushType: 'fill'
         },
         itemStyle: {
             color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                 offset: 0,
                 color: '#1be57a'
             }, {
                 offset: 1,
                 color: 'rgba(27,229,122,.3)'
             }])
         },
         data: [21, 30, 37, 39, 23, 37, 5, 50]
     }, { //水波纹点
         name: 'SO',
         type: 'effectScatter',
         symbolSize: [5, 5],
         rippleEffect: {
             period: 1,
             scale: 4,
             brushType: 'fill'
         },
         itemStyle: {
             color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                 offset: 0,
                 color: '#69dbf7'
             }, {
                 offset: 1,
                 color: '#aefbc3'
             }])
         },
         markLine: {
             symbol: "none",
             label: {
                 normal: {
                     show: false,
                 }
             },
             lineStyle: {
                 type: "solid",
                 color: 'rgba(210,56,56,.6)',
                 width: 2
             },
             data: [{
                 yAxis: 60
             }]
         },
         data: [76, 58, 60, 38, 49, 59, 78, 60]
     }]
 };
    },
    clearData() {
      if (this.timer) {
        clearInterval(this.timer);
        this.timer = null;
      }
    },
    async getData() {
      this.pageflag = true;
      // currentGET("big2").then((res) => {
      //     if (!this.timer) {
      //         console.log("设备总览2", res);
      //     }
      //     if (res.success) {
      //         this.userOverview = res.data;
      //            this.onlineconfig = {
      //             ...this.onlineconfig,
      //             number: [1]
      //         }
      //         this.config = {
      //             ...this.config,
      //             number: [7]
      //         }
      //         this.offlineconfig = {
      //             ...this.offlineconfig,
      //             number: [4]
      //         }
      //         this.laramnumconfig = {
      //             ...this.laramnumconfig,
      //             number: [10]
      //         }
      //         this.switper();
      //     } else {
      //         this.pageflag = false;
      //         this.$Message.warning(res.msg);
      //     }
      // });
      var rep = await ProLocationStatistics();
      this.options = {
     //浮动框
     tooltip: {},
     //图例
     legend: {
         right: '12%',
         bottom: '4%',
         textStyle: {
             color: '#fff',
             fontSize: '13'
         },
         itemGap: 20,
         itemWidth: 10,
         itemHeight: 10,
         icon: 'circle',
         data: ['成品入库', '成品出库', '成品回框']
     },
     grid: {
         left: '8%',
         top: '15%',
         bottom: '14%',
         width: '86%',
     },
     visualMap: [{
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#69dbf7'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: '成品入库',
         seriesIndex: 2
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#1be57a'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: '成品出库',
         seriesIndex: 1
     }, {
         type: 'piecewise',
         show: false,
         pieces: [{
             gt: 0,
             lte: 60,
             color: '#feb01e'
         }, {
             gte: 60,
             color: '#e5421b'
         }],
         seriesName: '成品回框',
         seriesIndex: 0
     }],
     //xè½´
     xAxis: {
         axisLine: {
             lineStyle: {
                 color: '#132987'
             }
         },
         axisLabel: {
             textStyle: {
                 color: '#FFF',
                 fontSize: 12
             },
         },
         //刻度线
         axisTick: {
             show: false
         },
         //坐标轴显示值
         data: ["04/19", "04/20", "04/21", "04/22", "04/23", "04/24", "04/25"]
     },
     //yè½´
     yAxis: {
         axisLabel: { //  æ”¹å˜y轴字体颜色和大小
             //formatter: '{value} m³ ', //  ç»™y轴添加单位
             textStyle: {
                 color: '#fff',
                 fontSize: 12,
             },
         },
         //坐标轴线
         axisLine: {
             show: false,
         },
         //刻度线
         axisTick: {
             show: false
         },
         //在grid区域中的分隔线
         splitLine: {
             show: true,
             lineStyle: {
                 color: '#132987',
             }
         },
     },
     //
     series: [{
         name: '成品入库',
         type: 'line',
         symbolSize: [0, 0],
         itemStyle: {
             color: '#feb01e'
         },
         data: [160, 156, 150, 180, 170, 200, 20],
     }, {
         name: '成品出库',
         type: 'line',
         symbolSize: [0, 0],
         itemStyle: {
             color: '#1be57a'
         },
         data: [80, 115, 120, 130, 91, 99,  20]
     }, {
         name: '成品回框',
         type: 'line',
         symbolSize: [0, 0],
         itemStyle: {
             color: '#69dbf7'
         },
         data: [70, 113, 118, 111, 89, 99,  32]
     }, { //水波纹点
         name: '成品入库',
         type: 'effectScatter',
         symbolSize: [5, 5],
         rippleEffect: {
             period: 1,
             scale: 4,
             brushType: 'fill'
         },
         itemStyle: {
             color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                 offset: 0,
                 color: '#feb01e'
             }, {
                 offset: 1,
                 color: 'rgba(254,176,30,.3)'
             }])
         },
         data: [160, 156, 150, 180, 170, 200,  20]
     }, { //水波纹点
         name: '成品出库',
         type: 'effectScatter',
         symbolSize: [5, 5],
         rippleEffect: {
             period: 1,
             scale: 4,
             brushType: 'fill'
         },
         itemStyle: {
             color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                 offset: 0,
                 color: '#1be57a'
             }, {
                 offset: 1,
                 color: 'rgba(27,229,122,.3)'
             }])
         },
         data: [80, 115, 120, 130, 91, 99,  20]
     }, { //水波纹点
         name: '成品回框',
         type: 'effectScatter',
         symbolSize: [5, 5],
         rippleEffect: {
             period: 1,
             scale: 4,
             brushType: 'fill'
         },
         itemStyle: {
             color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                 offset: 0,
                 color: '#69dbf7'
             }, {
                 offset: 1,
                 color: '#aefbc3'
             }])
         },
         markLine: {
             symbol: "none",
             label: {
                 normal: {
                     show: false,
                 }
             },
             lineStyle: {
                 type: "solid",
                 color: 'rgba(210,56,56,.6)',
                 width: 2
             },
             data: [{
                 yAxis: 60
             }]
         },
         data: [70, 113, 118, 111, 89, 99, 32]
     }]
 };
      this.switper();
    },
    //轮询
    switper() {
      if (this.timer) {
        return;
      }
      let looper = (a) => {
        this.getData();
        tooltip: {
          trigger: 'axis',
          formatter: params => {
            let result = `${params[0].axisValue}<br>`;
            params.forEach(item => {
              result += `${item.marker} ${item.seriesName}: ${item.value}<br>`;
            });
            return result;
          }
        },
        legend: {
          right: '12%',
          bottom: '4%',
          textStyle: {
            color: '#fff',
            fontSize: '13'
          },
          itemGap: 20,
          itemWidth: 10,
          itemHeight: 10,
          icon: 'circle',
          data: ['成品入库', '成品出库', '空框回流', '成品回库']
        },
        grid: {
          left: '8%',
          top: '15%',
          bottom: '14%',
          width: '86%',
        },
        xAxis: {
          type: 'category',
          axisLine: {
            lineStyle: {
              color: '#132987'
            }
          },
          axisLabel: {
            textStyle: {
              color: '#FFF',
              fontSize: 12
            },
          },
          axisTick: {
            show: false
          },
          data: ['加载中...']
        },
        yAxis: {
          type: 'value',
          axisLabel: {
            textStyle: {
              color: '#fff',
              fontSize: 12,
            },
          },
          axisLine: {
            show: false,
          },
          axisTick: {
            show: false
          },
          splitLine: {
            show: true,
            lineStyle: {
              color: '#132987',
            }
          },
        },
        series: [
          { name: '成品入库', type: 'line', data: [] },
          { name: '成品出库', type: 'line', data: [] },
          { name: '空框回流', type: 'line', data: [] },
          { name: '成品回库', type: 'line', data: [] }
        ]
      };
      this.timer = setInterval(
        looper,
        this.$store.state.setting.echartsAutoTime
      );
    },
  },
    async fetchData() {
       this.loading = true;
      this.error = null;
      try {
        console.log('正在请求数据...');
        const response = await GetProWeekTasks({});
        console.log('完整响应:', response); // æ‰“印完整响应查看结构
        // ç›´æŽ¥ä½¿ç”¨response作为数据(根据实际响应结构调整)
        if (!response || !response.dateRange || !response.dailyStatistics) {
          throw new Error('数据格式不正确');
        }
        this.updateChart(response); // ç›´æŽ¥ä¼ å…¥response,而非response.data
      } catch (error) {
        console.error('获取数据错误:', error);
        this.error = error.message;
        this.initEmptyChart();
      } finally {
        this.loading = false;
      }
    },
    updateChart(data) {
      const dates = data.dateRange;
      const stats = data.dailyStatistics;
      const seriesData = {
        '成品入库': [],
        '成品出库': [],
        '空框回流': [],
        '成品回库': []
      };
      // æ ¹æ®å®žé™…数据格式调整字段名(小写开头)
      stats.forEach(day => {
        seriesData['成品入库'].push(day.inProduct || 0);
        seriesData['成品出库'].push(day.outProduct || 0);
        seriesData['空框回流'].push(day.emptyProductBack || 0);
        seriesData['成品回库'].push(day.inProductBack || 0);
      });
      this.options = {
        ...this.options,
        xAxis: {
          ...this.options.xAxis,
          data: dates
        },
        series: this.options.series.map(series => ({
          ...series,
          data: seriesData[series.name] || []
        }))
      };
    },
    startAutoRefresh() {
      this.stopAutoRefresh();
      this.timer = setInterval(() => {
        this.fetchData();
      }, this.$store.state.setting.echartsAutoTime || 10000);
    },
    stopAutoRefresh() {
      if (this.timer) clearInterval(this.timer);
    }
  }
};
</script>
<style lang='scss' scoped>
.user_Overview {
  li {
´úÂë¹ÜÀí/LargeScreen/CP-Screen/src/views/indexs/station-two.vue
@@ -1,463 +1,289 @@
<!--
 * @Author: daidai
 * @Date: 2022-02-28 16:16:42
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2022-07-20 17:57:11
 * @FilePath: \web-pc\src\pages\big-screen\view\indexs\left-center.vue
-->
<template>
    <div id="name" style="width: 100%; height: 100%">
      <Echart :options="options" style="width: 100%; height: 100%"></Echart>
    </div>
  </template>
  <script>
  import { currentGET } from "api/modules";
  import { ProductionStock } from "@/api/http.js";
  import * as echarts from 'echarts';
  let style = {
    fontSize: 24,
  };
  export default {
    data() {
      return {
        pageflag: true,
        myChart: {},
        options: {},
      };
    },
    filters: {
      numsFilter(msg) {
        return msg || 0;
      },
    },
    created() {
      this.getData();
    },
    mounted() {
      this.init();
    },
    beforeDestroy() {
      this.clearData();
    },
    methods: {
      init() {
        let dataPie = [
  <div class="tech-chart-container">
    <Echart
      :options="options"
      :autoresize="true"
      style="width: 100%; height: 100%"
    />
  </div>
</template>
    {
        value: 410,
        name: '企业'
    },
    {
        value: 380,
        name: '政府'
    },
    {
        value: 501,
        name: '个人'
    },
];
let colorPie = ['#173852', '#0b2036', '#002e49'];
let colorWrap = ['#3087d6', '#afe1ff', '#4be1ff'];
let baseDataPie = [],
    baseDataWrap = [];
for (var i = 0; i < dataPie.length; i++) {
    baseDataPie.push({
        value: dataPie[i].value,
        name: dataPie[i].name,
        itemStyle: {
            normal: {
                borderWidth: 50,
<script>
import { GetCPLargeStockCount } from "@/api/http.js";
import * as echarts from 'echarts';
                borderColor: colorPie[i],
            }
        }
    });
    baseDataWrap.push({
        value: dataPie[i].value,
        name: dataPie[i].name,
        itemStyle: {
            normal: {
                color: colorWrap[i],
                borderWidth: 10,
                borderColor: colorWrap[i],
                shadowBlur: 50,
                shadowColor: 'rgba(48, 135, 214, 0.3)',
            }
        }
    }, {
        value: 10,
        name: '',
        itemStyle: {
            normal: {
                color: 'transparent',
                borderWidth: 10,
                borderColor: 'transparent',
            }
        }
    });
}
this.options = {
    backgroundColor: '#021228',
    title: {
        text: '报警总数',
        subtext: '10,225',
        textStyle: {
export default {
  data() {
    return {
      options: {
        backgroundColor: 'transparent',
        title: {
          text: '成品产品库存总数',
          subtext: '加载中...',
          textStyle: {
            color: '#00b5f3',
            fontSize: 12,
        },
        subtextStyle: {
            fontSize: 14,
          },
          subtextStyle: {
            align: 'center',
            fontSize: 18,
            color: ['#85c7e3'],
            fontWeight:800
            fontSize: 28,
            color: '#4be1ff',
            fontWeight: 'bold',
            textShadow: '0 0 15px rgba(75, 225, 255, 0.7)'
          },
          x: 'center',
          y: 'center',
        },
        x: '38%',
        y: 'center',
    },
    tooltip: {
        show: true,
        trigger: 'item',
        formatter: "{a}:{b} <br/>占比:{d}%"
    },
    legend: {
        data: ['企业', '政府', '个人'],
        icon: 'vertical',
        right: '1%',
        top: 'center',
        orient: 'vertical',
        itemGap: 20,
        itemWidth: 15,
        itemHeight: 8,
        formatter: function(name) {
            let target;
            for (let i = 0; i < dataPie.length; i++) {
                if (dataPie[i].name === name) {
                    target = dataPie[i].value
                }
            }
            let arr = [name, target];
            return arr.join("\n")
        tooltip: {
          show: false // å®Œå…¨ç¦ç”¨tooltip
        },
        textStyle: {
            lineHeight: 20,
            color: '#9ed2f5',
        },
    },
    grid: {
        left: '1%', // ä¸Žå®¹å™¨å·¦ä¾§çš„距离
        right: '1%', // ä¸Žå®¹å™¨å³ä¾§çš„距离
        top: '1%', // ä¸Žå®¹å™¨é¡¶éƒ¨çš„距离
        bottom: '1%', // ä¸Žå®¹å™¨åº•部的距离
    },
    series: [
        {
            name: '',
        series: [
          {
            name: '库存数量',
            type: 'pie',
            clockWise: false, //顺时加载
            hoverAnimation: false, //鼠标移入变大
            center: ['40%', '50%'],
            radius: ['80%', '81%'],
            tooltip: {
                show: false
            },
            radius: ['65%', '85%'],
            center: ['50%', '50%'],
            hoverAnimation: false, // ç¦ç”¨æ‚¬åœåŠ¨ç”»
            silent: true, // ç¦ç”¨æ‰€æœ‰äº¤äº’
            label: {
                normal: {
                    show: false
                }
              show: false
            },
            data: baseDataWrap
        },
        {
            name: '报警',
            labelLine: {
              show: false
            },
            itemStyle: {
              borderWidth: 0,
              shadowBlur: 20,
              shadowColor: 'rgba(0, 150, 255, 0.5)'
            },
            data: [{
              value: 0,
              name: '',
              itemStyle: {
                // é’蓝色到蓝白色渐变,添加动态效果
                color: {
                  type: 'linear',
                  x: 0,
                  y: 0,
                  x2: 0,
                  y2: 1,
                  colorStops: [
                    { offset: 0, color: '#00ffcc' },
                    { offset: 0.5, color: '#00b4ff' },
                    { offset: 1, color: '#0062ff' }
                  ],
                  global: false
                }
              }
            }]
          },
          // æ·»åŠ å¤–å‘å…‰åœ†çŽ¯
          {
            type: 'pie',
            color: colorPie,
            selectedMode: 'single',
            radius: ['55%', '58%'],
            center: ['40%', '50%'],
            radius: ['85%', '87%'],
            center: ['50%', '50%'],
            hoverAnimation: false,
            label: {
                normal: {
                    show: false,
                }
            silent: true,
            label: { show: false },
            labelLine: { show: false },
            itemStyle: {
              // é’蓝色到蓝白色渐变,添加动态效果
              color: {
                type: 'linear',
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [
                  { offset: 0, color: '#00ffcc' },
                  { offset: 0.5, color: '#00b4ff' },
                  { offset: 1, color: '#0062ff' }
                ],
                global: false
              }
            },
            data: baseDataPie
        },
    ]
};
      },
      clearData() {
        if (this.timer) {
          clearInterval(this.timer);
          this.timer = null;
        }
      },
      async getData() {
        this.pageflag = true;
        // currentGET("big2").then((res) => {
        //     if (!this.timer) {
        //         console.log("设备总览2", res);
        //     }
        //     if (res.success) {
        //         this.userOverview = res.data;
        //            this.onlineconfig = {
        //             ...this.onlineconfig,
        //             number: [1]
        //         }
        //         this.config = {
        //             ...this.config,
        //             number: [7]
        //         }
        //         this.offlineconfig = {
        //             ...this.offlineconfig,
        //             number: [4]
        //         }
        //         this.laramnumconfig = {
        //             ...this.laramnumconfig,
        //             number: [10]
        //         }
        //         this.switper();
        //     } else {
        //         this.pageflag = false;
        //         this.$Message.warning(res.msg);
        //     }
        // });
        // var rep = await ProductionStock();
        let dataPie = [
    {
        value: 430,
        name: '库存产品'
    },
];
let colorPie = ['#173852'];
let colorWrap = ['#3087d6'];
let baseDataPie = [],
    baseDataWrap = [];
for (var i = 0; i < dataPie.length; i++) {
    baseDataPie.push({
        value: dataPie[i].value,
        name: dataPie[i].name,
        itemStyle: {
            normal: {
                borderWidth: 50,
                borderColor: colorPie[i],
            }
        }
    });
    baseDataWrap.push({
        value: dataPie[i].value,
        name: dataPie[i].name,
        itemStyle: {
            normal: {
                color: colorWrap[i],
                borderWidth: 10,
                borderColor: colorWrap[i],
                shadowBlur: 50,
                shadowColor: 'rgba(48, 135, 214, 0.3)',
            }
        }
    }, {
        value: 10,
        name: '',
        itemStyle: {
            normal: {
                color: 'transparent',
                borderWidth: 10,
                borderColor: 'transparent',
            }
        }
    });
}
this.options = {
    title: {
        text: '产品总数',
        subtext: '430',
        textStyle: {
            color: '#00b5f3',
            fontSize: 12,
        },
        subtextStyle: {
            align: 'center',
            fontSize: 18,
            color: ['#85c7e3'],
            fontWeight:800
        },
        x: '33%',
        y: 'center',
    },
    tooltip: {
        show: true,
        trigger: 'item',
        formatter: "{a}:{b} <br/>占比:{d}%"
    },
    legend: {
        data: ['库存产品'],
        icon: 'vertical',
        right: '1%',
        top: 'center',
        orient: 'vertical',
        itemGap: 20,
        itemWidth: 15,
        itemHeight: 8,
        formatter: function(name) {
            let target;
            for (let i = 0; i < dataPie.length; i++) {
                if (dataPie[i].name === name) {
                    target = dataPie[i].value
                }
            }
            let arr = [name, target];
            return arr.join("\n")
        },
        textStyle: {
            lineHeight: 20,
            color: '#9ed2f5',
        },
    },
    grid: {
        left: '1%', // ä¸Žå®¹å™¨å·¦ä¾§çš„距离
        right: '1%', // ä¸Žå®¹å™¨å³ä¾§çš„距离
        top: '1%', // ä¸Žå®¹å™¨é¡¶éƒ¨çš„距离
        bottom: '1%', // ä¸Žå®¹å™¨åº•部的距离
    },
    series: [
        {
            name: '',
            data: [{
              value: 1,
              name: ''
            }]
          },
          // æ·»åŠ å†…å‘å…‰åœ†çŽ¯
          {
            type: 'pie',
            clockWise: false, //顺时加载
            hoverAnimation: false, //鼠标移入变大
            center: ['40%', '50%'],
            radius: ['80%', '81%'],
            tooltip: {
                show: false
            },
            label: {
                normal: {
                    show: false
                }
            },
            data: baseDataWrap
        },
        {
            name: '种类',
            type: 'pie',
            color: colorPie,
            selectedMode: 'single',
            radius: ['55%', '58%'],
            center: ['40%', '50%'],
            radius: ['63%', '65%'],
            center: ['50%', '50%'],
            hoverAnimation: false,
            label: {
                normal: {
                    show: false,
                }
            silent: true,
            label: { show: false },
            labelLine: { show: false },
            itemStyle: {
              // é’蓝色到蓝白色渐变,添加动态效果
              color: {
                type: 'linear',
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [
                  { offset: 0, color: '#00ffcc' },
                  { offset: 0.5, color: '#00b4ff' },
                  { offset: 1, color: '#0062ff' }
                ],
                global: false
              }
            },
            data: baseDataPie
        },
    ]
};
        this.switper();
            data: [{
              value: 1,
              name: ''
            }]
          },
          // æ·»åŠ åŠ¨æ€ç²’å­æ•ˆæžœ
          {
            type: 'scatter',
            coordinateSystem: 'none',
            data: this.generateParticles(30),
            symbolSize: (val) => {
              return val[2] * 2;
            },
            itemStyle: {
              color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
                { offset: 0, color: 'rgba(0, 255, 255, 0.8)' },
                { offset: 1, color: 'rgba(0, 255, 255, 0)' }
              ])
            },
            // æ·»åŠ ç²’å­é—ªçƒæ•ˆæžœ
            effect: {
              show: true,
              period: 2,
              trailLength: 0.1,
              symbol: 'circle',
              symbolSize: 0
            }
          }
        ]
      },
      //轮询
      switper() {
        if (this.timer) {
          return;
        }
        let looper = (a) => {
          this.getData();
        };
        this.timer = setInterval(
          looper,
          this.$store.state.setting.echartsAutoTime
        );
      },
      timer: null,
      particleTimer: null,
      gradientTimer: null
    };
  },
  mounted() {
    this.fetchData();
    this.startAutoRefresh();
    this.startParticleAnimation();
    this.startGradientAnimation();
  },
  beforeDestroy() {
    this.stopAutoRefresh();
    this.stopParticleAnimation();
    this.stopGradientAnimation();
  },
  methods: {
    generateParticles(count) {
      const particles = [];
      for (let i = 0; i < count; i++) {
        const angle = Math.random() * Math.PI * 2;
        const radius = 0.7 + Math.random() * 0.2;
        particles.push([
          Math.cos(angle) * radius,
          Math.sin(angle) * radius,
          Math.random() * 2 + 1
        ]);
      }
      return particles;
    },
  };
  </script>
  <style lang='scss' scoped>
  .user_Overview {
    li {
      flex: 1;
      p {
        text-align: center;
        height: 16px;
        font-size: 16px;
    async fetchData() {
      try {
        const response = await GetCPLargeStockCount({});
        const stockCount = response.stockCount || 0;
        this.updateChart(stockCount);
      } catch (error) {
        console.error('获取库存总数失败:', error);
        this.options.title.subtext = '数据异常';
        this.options.title.subtextStyle.color = '#ff4d4f';
      }
      .user_Overview_nums {
        width: 100px;
        height: 100px;
        text-align: center;
        line-height: 100px;
        font-size: 22px;
        margin: 50px auto 30px;
        background-size: cover;
        background-position: center center;
        position: relative;
        &::before {
          content: "";
          position: absolute;
          width: 100%;
          height: 100%;
          top: 0;
          left: 0;
        }
        &.bgdonghua::before {
          animation: rotating 14s linear infinite;
        }
      }
      .allnum {
        // background-image: url("../../assets/img/left_top_lan.png");
        &::before {
          background-image: url("../../assets/img/left_top_lan.png");
        }
      }
      .online {
        &::before {
          background-image: url("../../assets/img/left_top_lv.png");
        }
      }
      .offline {
        &::before {
          background-image: url("../../assets/img/left_top_huang.png");
        }
      }
      .laramnum {
        &::before {
          background-image: url("../../assets/img/left_top_hong.png");
        }
      }
    },
    updateChart(count) {
      this.options.series[0].data[0].value = count;
      this.options.title.subtext = count + '种';
      this.options.title.subtextStyle.color = count > 0? '#4be1ff' : '#ff4d4f';
    },
    startAutoRefresh() {
      this.stopAutoRefresh();
      this.timer = setInterval(() => {
        this.fetchData();
      }, 3000);
    },
    stopAutoRefresh() {
      if (this.timer) clearInterval(this.timer);
    },
    startParticleAnimation() {
      this.stopParticleAnimation();
      this.particleTimer = setInterval(() => {
        this.options.series[3].data = this.generateParticles(30);
        this.options = {...this.options }; // è§¦å‘视图更新
      }, 2000);
    },
    stopParticleAnimation() {
      if (this.particleTimer) clearInterval(this.particleTimer);
    },
    startGradientAnimation() {
      this.stopGradientAnimation();
      this.gradientTimer = setInterval(() => {
        const offset = Math.random();
        this.options.series.forEach(series => {
          if (series.itemStyle.color.type === 'linear') {
            series.itemStyle.color.colorStops.forEach(stop => {
              stop.offset = (stop.offset + offset) % 1;
            });
          }
        });
        this.options = {...this.options }; // è§¦å‘视图更新
      }, 1000);
    },
    stopGradientAnimation() {
      if (this.gradientTimer) clearInterval(this.gradientTimer);
    }
  }
  </style>
};
</script>
<style lang="scss" scoped>
.tech-chart-container {
  width: 100%;
  height: 100%;
  position: relative;
  background: radial-gradient(circle at center, #021228 0%, #000810 100%);
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 0 30px rgba(0, 100, 255, 0.2);
  &::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background:
      radial-gradient(circle at 20% 30%, rgba(0, 150, 255, 0.1) 0%, transparent 50%),
      radial-gradient(circle at 80% 70%, rgba(0, 200, 255, 0.1) 0%, transparent 50%);
    z-index: 0;
    animation: pulse 8s infinite alternate;
  }
}
@keyframes pulse {
  0% {
    opacity: 0.3;
  }
  100% {
    opacity: 0.7;
  }
}
::v-deep .echarts {
  position: relative;
  z-index: 1;
}
</style>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/009c71ac-3f6b-4e87-8d77-9e67b15f196a.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/05de9a72-8eef-42af-bb91-2884b11682fc.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/1c314e67-7b22-4b95-82d8-39953c4ffcb1.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/30faed0f-10c1-4ef3-8430-efc0de767fc3.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9c8323bc-3d97-4f52-8315-faf14a56756c.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/be38a26a-2b17-43c8-b4f8-d9fd5f3264c6.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/fc24c9bc-a681-4021-afee-e9730bbda510.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs
@@ -60,6 +60,11 @@
        /// </summary>
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
        public int TaskLength { get; set; }
        public string AGVArea { get; set; }
        public int PalletType { get; set; }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -64,7 +64,7 @@
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress);
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "");
        /// <summary>
        /// å‘WMS申请任务
@@ -81,7 +81,7 @@
        /// <param name="sourceAddress">起始地址</param>
        /// <param name="roadway">巷道号</param>
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway);
        //WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway);
        /// <summary>
        /// 
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -183,7 +183,13 @@
        [ExporterHeader(DisplayName = "任务组")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务组")]
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
        [ImporterHeader(Name = "任务物料长度")]
        [ExporterHeader(DisplayName = "任务物料长度")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务物料长度")]
        public int TaskLength { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/CTU_AGVController .cs
@@ -293,12 +293,12 @@
                                //调用AGV预调度接口
                                AgvScheduleTaskDTO agvScheduleTask = new AgvScheduleTaskDTO()
                                {
                                    PositionCode = task.CurrentAddress,
                                    NextTask = "60",
                                    PositionCode = "8001",
                                    NextTask = "90",
                                    UseableLayers = "1",
                                    CacheCount = "1",
                                    Update = "0",
                                    AgvTyp = "11",
                                    AgvTyp = "10",
                                    PreTaskQty = "1",
                                    ReqCode = Guid.NewGuid().ToString().Replace("-", ""),
                                    ReqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -386,7 +386,7 @@
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress)
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "")
        {
            WebResponseContent content = new WebResponseContent();
            try
@@ -401,7 +401,15 @@
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}");
                string responseStr = "";
                if (!string.IsNullOrEmpty(materielBoxCode))
                {
                    responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}&materielBoxCode={materielBoxCode}");
                }
                else
                {
                    responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}");
                }
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
@@ -462,34 +470,34 @@
        /// <param name="sourceAddress"></param>
        /// <param name="roadway"></param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={roadway}&palletCode={palletCode}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
        //public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway)
        //{
        //    WebResponseContent content = new WebResponseContent();
        //    try
        //    {
        //        string address = AppSettings.Get("WMSApiAddress");
        //        if (string.IsNullOrEmpty(address))
        //        {
        //            return WebResponseContent.Instance.Error($"未找到WMSApi地址");
        //        }
        //        string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={roadway}&palletCode={palletCode}");
        //        WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
        //        if (responseContent != null && responseContent.Status && responseContent.Data != null)
        //        {
        //            WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
        //            if (taskDTO != null)
        //            {
        //                content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
        //            }
        //        }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        //    }
        //    catch (Exception ex)
        //    {
        //        content = WebResponseContent.Instance.Error(ex.Message);
        //    }
        //    return content;
        //}
        /// <summary>
        /// 
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs
@@ -163,6 +163,15 @@
        /// </summary>
        public short CheckPos { get; set; }
    }
    public class R_ConveyorLineGMInfo : DeviceCommand
    {
        /// <summary>
        /// ç®±å·
        /// </summary>
        /// <summary>
        [DataLength(120)]
        public string Boxcode { get; set; }
    }
    public class R_ConveyorLineFLInfo : DeviceCommand
    {
        /// <summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/R_ConveyorLineDBName.cs
@@ -118,7 +118,11 @@
        /// <summary>
        /// å“åº”信号
        /// </summary>
        ACK
        ACK,
        /// <summary>
        /// æ¡ç 
        /// </summary>
        Boxcode
    }
    public enum R_ConveyorLineWorkType
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP²Ö/ConveyorLineJob_PP.cs
@@ -73,14 +73,41 @@
                        {
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)
                            {
                                if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))
                                string boxcode = device.GetValue<R_ConveyorLineDB, string>(R_ConveyorLineDB.Boxcode, item.StationCode);
                                if (!string.IsNullOrEmpty(boxcode))
                                {
                                    WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode);
                                    string sc = device.Communicator.Read<string>("DB900.598.0");
                                    WriteError(device.DeviceName, $"读取值:{boxcode},对比{sc}");
                                    string boxEndCode = "";
                                    if (boxcode.LastIndexOf(",SC:") >= 0)
                                    {
                                        boxEndCode = "M" + boxcode.Substring(0, boxcode.LastIndexOf(",SC:")) + sc.Substring(sc.IndexOf(",SC:")).Replace("\0", "");
                                    }
                                    else if (boxcode.LastIndexOf(",SC") > 0)
                                    {
                                        boxEndCode = "M" + boxcode.Substring(0, boxcode.LastIndexOf(",SC")) + sc.Substring(sc.IndexOf("SC:")).Replace("\0", "");
                                    }
                                    else if (boxcode.LastIndexOf(",S") > 0)
                                    {
                                        boxEndCode = "M" + boxcode.Substring(0, boxcode.LastIndexOf(",S")) + sc.Substring(sc.IndexOf("SC:")).Replace("\0", "");
                                    }
                                    //入库申请任务
                                    WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode, boxEndCode);
                                    if (content.Status)
                                    {
                                        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                    }
                                }
                                //if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))
                                //{
                                //    WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode);
                                //    if (content.Status)
                                //    {
                                //        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                //    }
                                //}
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.ACK)
                            {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskCommandGMPP.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_Tasks.StackerCraneJob
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob.DeviceBase;
namespace WIDESEAWCS_Tasks.StackerCraneJob
{
    public class StackerCraneTaskCommandGMPP : DeviceCommand
    {
        #region <Public Menber>
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public int TaskNum { get; set; }
        /// <summary>
        /// ä½œä¸šç±»åž‹
        /// </summary>
        public short WorkType { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç±»åž‹
        /// </summary>
        public short TrayType { get; set; }
        /// <summary>
        /// èµ·å§‹è¡Œ
        /// </summary>
        public short StartRow { get; set; }
        /// <summary>
        /// èµ·å§‹åˆ—
        /// </summary>
        public short StartColumn { get; set; }
        /// <summary>
        /// èµ·å§‹å±‚
        /// </summary>
        public short StartLayer { get; set; }
        /// <summary>
        /// ç›®æ ‡è¡Œ
        /// </summary>
        public short EndRow { get; set; }
        /// <summary>
        /// ç›®æ ‡åˆ—
        /// </summary>
        public short EndColumn { get; set; }
        /// <summary>
        /// ç›®æ ‡å±‚
        /// </summary>
        public short EndLayer { get; set; }
        /// <summary>
        /// æ‰˜ç›˜å·
        /// </summary>
        [DataLength(30)]
        public string Barcode { get; set; }
        /// <summary>
        /// ç‰©æ–™é•¿åº¦
        /// </summary>
        public short TaskLength { get; set; }
        #endregion <Public Menber>
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/ConveyorLineJob_GM.cs
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
@@ -94,10 +95,28 @@
                        {
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)
                            {
                                if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))
                                string boxcode = device.GetValue<R_ConveyorLineDB, string>(R_ConveyorLineDB.Boxcode, item.StationCode);
                                if (!string.IsNullOrEmpty(boxcode))
                                {
                                    string sc = device.Communicator.Read<string>("DB900.508.0");
                                    WriteError(device.DeviceName, $"读取值:{boxcode},对比{sc}");
                                    string boxEndCode = "";
                                    if (boxcode.LastIndexOf(",SC:") >=0)
                                    {
                                        boxEndCode = "M"+ boxcode.Substring(0,boxcode.LastIndexOf(",SC:")) + sc.Substring(sc.IndexOf(",SC:")).Replace("\0", "");
                                    }
                                    else if (boxcode.LastIndexOf(",SC") > 0)
                                    {
                                        boxEndCode = "M" + boxcode.Substring(0, boxcode.LastIndexOf(",SC")) + sc.Substring(sc.IndexOf("SC:")).Replace("\0", "");
                                    }
                                    else if (boxcode.LastIndexOf(",S") > 0)
                                    {
                                        boxEndCode = "M" + boxcode.Substring(0, boxcode.LastIndexOf(",S")) + sc.Substring(sc.IndexOf("SC:")).Replace("\0", "");
                                    }
                                    //入库申请任务
                                    WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode);
                                    WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode, boxEndCode);
                                    if (content.Status)
                                    {
                                        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
@@ -106,7 +125,8 @@
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.ACK)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && x.PalletCode == conveyorLineInfoRead.Barcode && x.DeviceCode == item.StationDeviceCode && x.TaskState == TaskStatusEnum.New.ObjToInt());
                                string boxcode = device.GetValue<R_ConveyorLineDB, string>(R_ConveyorLineDB.Boxcode, item.StationCode);
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && boxcode.Contains(x.PalletCode) && x.TaskState == TaskStatusEnum.New.ObjToInt());
                                if (task != null)
                                {
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, currentAddress: item.StackerCraneStationCode, deviceCode: task.Roadway, nextAddress: task.TargetAddress);
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/StackerCraneJob_GM.cs
@@ -92,6 +92,12 @@
                                    commonStackerCrane.LastTaskType = task.TaskType;
                                    task.Dispatchertime = DateTime.Now;
                                    task.ExceptionMessage = "";
                                    if (task.TaskLength<=0)
                                    {
                                        WriteInfo(commonStackerCrane.DeviceCode, $"物料长度错误{task.TaskLength}");
                                        return Task.CompletedTask;
                                    }
                                    commonStackerCrane.Communicator.Write("DB105.58", (short)task.TaskLength);
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Executing);
                                    commonStackerCrane.Communicator.Write("DB105.54", (short)1);
                                    //延时1s
@@ -297,7 +303,7 @@
            stackerCraneTaskCommand.Barcode = task.PalletCode;
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TrayType = (Int16)task.PalletType;
            stackerCraneTaskCommand.TrayType = 0;
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
                string[] startCodes = task.CurrentAddress.Split("-");
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸¨ÁϲÖ/ConveyorLineJob_FL.cs
@@ -60,31 +60,38 @@
        public Task Execute(IJobExecutionContext context)
        {
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            try
            {
                OtherDevice device = (OtherDevice)value;
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
                if (flag && value != null)
                {
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_ConveyorLineFLDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && deviceProRead != null)
                    OtherDevice device = (OtherDevice)value;
                    List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                    List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                    foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                    {
                        R_ConveyorLineFLInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineFLInfo>(deviceProRead.DeviceProAddress);
                        bool conveyArrivaled = device.GetValue<R_ConveyorLineFLDB, bool>(R_ConveyorLineFLDB.ConveyArrivaled, item.StationCode);
                        if (conveyArrivaled)
                        DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_ConveyorLineFLDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                        if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && deviceProRead != null)
                        {
                            Dt_Task newTask = _taskRepository.QueryFirst(x => x.TaskNum== conveyorLineInfoRead.TaskNum.ObjToInt() && x.PalletCode == conveyorLineInfoRead.Barcode && x.TaskState == TaskStatusEnum.New.ObjToInt() && x.DeviceCode== item.StackerCraneCode && !string.IsNullOrEmpty(x.DeviceCode));
                            if (newTask != null)
                            R_ConveyorLineFLInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineFLInfo>(deviceProRead.DeviceProAddress);
                            bool conveyArrivaled = device.GetValue<R_ConveyorLineFLDB, bool>(R_ConveyorLineFLDB.ConveyArrivaled, item.StationCode);
                            if (conveyArrivaled)
                            {
                                _taskService.UpdateTask(newTask, TaskStatusEnum.AGV_Execute);
                                Dt_Task newTask = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNum.ObjToInt() && x.PalletCode == conveyorLineInfoRead.Barcode && x.TaskState == TaskStatusEnum.New.ObjToInt() && x.DeviceCode == item.StackerCraneCode && !string.IsNullOrEmpty(x.DeviceCode));
                                if (newTask != null)
                                {
                                    _taskService.UpdateTask(newTask, TaskStatusEnum.AGV_Execute);
                                }
                                WriteError(item.StationName, $"入库到位信号,托盘号{conveyorLineInfoRead.Barcode},任务号:{conveyorLineInfoRead.TaskNum}");
                            }
                            WriteError(item.StationName, $"入库到位信号,托盘号{conveyorLineInfoRead.Barcode},任务号:{conveyorLineInfoRead.TaskNum}");
                        }
                    }
                }
                }
            }
            catch (Exception ex)
            {
                WriteError(nameof(ConveyorLineJob_FL), ex.Message, ex);
            }
            return Task.CompletedTask;
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.vue
@@ -391,6 +391,15 @@
                  :selectable="detailSelectable"
                ></vol-table>
              </div>
              <!--明细body自定义组件-->
              <component
                :is="dynamicComponent.modelSpec"
                ref="modelSpec"
                @parentCall="parentCall"
              ></component>
              <!--明细footer自定义组件-->
              <component
                :is="dynamicComponent.modelFooter"
@@ -551,7 +560,8 @@
      gridFooter: Empty,
      modelHeader: Empty,
      modelBody: Empty,
      modelFooter: Empty
      modelFooter: Empty,
      modelSpec:Empty
    };
    //合并扩展组件
    if (props.extend.components) {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/basic/extend/GetOrderMaterielSpec.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
<template>
    <vol-box
      :lazy="true"
      v-model="model"
      title="选择物料规格"
      :width="280"
      :padding="0"
    >
      <div>
        <div>
          <!-- æœç´¢é…ç½® -->
          <div class="search-form">
            <label>物料规格:</label>
            <el-input style="width: 160px" v-model="MaterialCode"></el-input>
          </div>
          <el-table
            ref="singleTable"
            :data="filteredData"
            style="width: 100%; height: 100%"
            highlight-current-row
            height="500px"
            @selection-change="handleSelectionChange"
          >
            >
            <el-table-column type="selection" width="55"> </el-table-column>
            <el-table-column
              v-for="(item, index) in tableColumns.filter((x) => !x.hidden)"
              :key="index"
              :prop="item.prop"
              :label="item.title"
              align="center"
            >
            </el-table-column>
          </el-table>
        </div>
      </div>
      <template #footer>
        <div><el-button type="primary" @click="onSelect">确认</el-button></div>
      </template>
    </vol-box>
  </template>
  <script>
  import VolBox from "@/components/basic/VolBox.vue";
  /******注意:如果出现提示没有权限的问题,见后台开发文档上的【重写后台权限】*****/
  //这里使用的vue2语法,也可以写成vue3语法
  export default {
    components: {
      "vol-box": VolBox,
    },
    methods: {},
    data() {
      return {
        model: false, //弹出框
        wareId: null,
        materielSpec:null,
        showDetialBox: false,
        MaterialCode:null,
        selection:null,
        tableData: [],
        filteredData: [],
        tableColumns: [
          {
            prop: "materielSpec",
            title: "物料规格",
            type: "string",
          },
        ],
      };
    },
    watch: {
      MaterialCode(newVal) {
        this.filterLocalData(newVal);
      }
    },
    methods: {
      open(purchaseOrderNo, materielCode) { // é‡å‘½åå‚数,语义更清晰
    this.model = true;
    this.purchaseOrderNo = purchaseOrderNo; // å­˜å‚¨é‡‡è´­å•号
    this.materielCode = materielCode; // å­˜å‚¨ç‰©æ–™ç¼–号
    this.getData(); // è°ƒç”¨èŽ·å–æ•°æ®æ–¹æ³•
  },
      filterLocalData(code) {
        if (code) {
          this.filteredData = this.tableData.filter((item) => {
              return item.materielSpec.includes(code);
          });
          console.log(this.filteredData.length);
          console.log(this.tableData.length);
        } else {
          this.filteredData = [...this.tableData]; // é‡ç½®ä¸ºå®Œæ•´æ•°æ®
        }
      },
      handleSelectionChange(val,val2) {
          this.selection = val;
          this.selection1 = val2;
          if (this.selection.length > 1) {
              this.$message.error("仅选择一条数据");
              // æ¸…空选中的第一条数据
              this.$refs.singleTable.clearSelection();
          }
          if (this.selection1.length > 1) {
              this.$message.error("仅选择一条数据");
              // æ¸…空选中的第一条数据
              this.$refs.singleTable.clearSelection();
          }
          console.log(this.selection);
      },
      getData() {
    const url = `/api/PurchaseOrderDetail/GetOrderMaterielSpec?` +
      `purchaseOrderNo=${encodeURIComponent(this.purchaseOrderNo)}&` +
      `materielCode=${encodeURIComponent(this.materielCode)}`;
    this.http.post(url, null, "查询中")
      .then((x) => {
        if (!x.status) {
          return this.$error(x.message);
        }
        this.tableData = x.data.map((item) => ({
          materielSpec: item // å‡è®¾æŽ¥å£è¿”回的规格直接是字符串
        }));
        this.filteredData = [...this.tableData]; // é‡ç½®è¿‡æ»¤æ•°æ®
      })
      .catch((error) => {
        console.error("接口请求失败:", error);
        this.$message.error("获取物料规格失败,请重试");
      });
  },
      onSelect() {
        if (!this.selection) {
          return this.$message.error("请选择数据");
        }
        this.$emit("parentCall", ($parent) => {
          //如:回写编辑表单数据
          $parent.editFormFields.materielSpec = this.selection[0].materielSpec;
          this.model = false;
        });
        this.MaterialCode = null;
        this.tableData = [];
        this.filteredData = [];
      },
    },
  };
  </script>
  <style lang="less" scoped>
  .search-form {
    display: flex;
    padding: 10px;
    line-height: 34px;
    button {
      margin-left: 10px;
    }
  }
  </style>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.js
@@ -3,6 +3,7 @@
import modelHeader from './extend/materielcodeSelectView.vue'
import modelBody from './extend/purchaseOrderNoSelectView.vue'
import modelFooter from './extend/GetOrderQuantityView.vue'
import modelSpec from './extend/GetOrderMaterielSpec.vue'
let extension = {
  components: {
    //查询界面扩展组件
@@ -12,7 +13,8 @@
    //新建、编辑弹出框扩展组件
    modelHeader: modelHeader,
    modelBody: modelBody,
    modelFooter: modelFooter
    modelFooter: modelFooter,
    modelSpec: modelSpec
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
@@ -87,6 +89,22 @@
            }
          });
        });
        this.editFormOptions.forEach((option) => {
          option.forEach((item) => {
            if (item.field == 'materielSpec') {
              //初始化弹出框选择器配置
              item.extra = {
                icon: 'el-icon-zoom-out', //显示图标
                text: '选择物料规格', //显示文本
                style: 'color: #3a8ee6;font-size: 13px;cursor: pointer;',
                //触发事件
                click: (item) => {
                  this.$refs.modelSpec.open(this.editFormFields.purchaseOrderNo,this.editFormFields.materielCode);
                }
              };
            }
          });
        });
        // warehouseIdOption.onChange = (val, option) => {
        //   this.editFormFields.materielCode = "";
        //   materielCodeOption.data = [];
@@ -124,6 +142,33 @@
        // }
      });
      // é¡µé¢åŠ è½½æ—¶åˆå§‹åŒ–å·²é«˜äº®çš„è¡Œ
      const initHighlightedRows = () => {
        try {
          const highlightedRowIds = localStorage.getItem('highlightedRowIds');
          if (highlightedRowIds) {
            this.highlightedRowIds = JSON.parse(highlightedRowIds);
          } else {
            this.highlightedRowIds = [];
          }
        } catch (e) {
          console.error('Failed to load highlighted rows from localStorage:', e);
          this.highlightedRowIds = [];
        }
      };
      // ä¿å­˜é«˜äº®è¡ŒID到本地存储
      const saveHighlightedRows = () => {
        try {
          localStorage.setItem('highlightedRowIds', JSON.stringify(this.highlightedRowIds));
        } catch (e) {
          console.error('Failed to save highlighted rows to localStorage:', e);
        }
      };
      // åœ¨ç»„件初始化时调用
      initHighlightedRows();
      this.columns.push({
        field: '操作',
        title: '操作',
@@ -132,13 +177,46 @@
        align: 'center',
        formatter: (row) => {
          return (
            '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-printer">打印</i>'
            '<i style="cursor: pointer;color: #2d8cf0;" class="el-icon-printer">打印</i>'
          );
        },
        click: (row) => {
          // æ‰“开详情
          this.$refs.gridBody.open(row);
          // èŽ·å–è¡Œçš„å”¯ä¸€æ ‡è¯†ï¼ˆå‡è®¾row.id是唯一ID)
          const rowId = row.id;
          // æ·»åŠ åˆ°å·²é«˜äº®åˆ—è¡¨
          if (!this.highlightedRowIds.includes(rowId)) {
            this.highlightedRowIds.push(rowId);
            // ä¿å­˜åˆ°æœ¬åœ°å­˜å‚¨
            saveHighlightedRows();
            // åˆ·æ–°è¡¨æ ¼ä»¥åº”用样式
            this.$refs.gridBody.refresh();
          }
        }
      });
      // é…ç½®cellStyle
      this.columns.forEach((column) => {
        // ä¿å­˜åŽŸæœ‰çš„cellStyle函数
        const originalCellStyle = column.cellStyle;
        column.cellStyle = (row) => {
          // å…ˆåº”用原有的样式逻辑
          let style = originalCellStyle ? originalCellStyle(row) : {};
          // å¦‚果行被标记为高亮,则添加绿色背景
          if (this.highlightedRowIds.includes(row.id)) {
            style = {
              ...style,
              background: '#d4edda',
              color: '#155724'
            };
          }
          return style;
        };
      });
    },
    onInited() {
      //框架初始化配置后
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/MesOutOrderDetail.vue
@@ -160,6 +160,20 @@
          width: 150,
        },
        {
        prop: "productionDate",
        title: "生产日期",
        type: "string",
        width: 160,
      },
      {
        prop: "effectiveDate",
        title: "有效期",
        type: "string",
        width: 160,
      },
        {
          prop: "locationCode",
          title: "货位编号",
          type: "string",
@@ -188,7 +202,6 @@
          "查询中"
        )
        .then((x) => {
          var label=[
              { label: '已分配', value: 0 },
              { label: '出库中', value: 1 },
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/basic/locationInfoRow.vue
@@ -102,8 +102,8 @@
          <p><strong>货位号:</strong>{{ currentLocation.locationCode }}</p>
          <p>
            <strong>货位排列层:</strong> {{ currentLocation.row }}排{{
              currentLocation.layer
            }}列{{ currentLocation.index }}层
              currentLocation.index
            }}列{{ currentLocation.layer }}层
          </p>
          <p><strong>状态:</strong> {{ getStatusText(currentLocation) }}</p>
          <p>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue
@@ -62,6 +62,13 @@
      ],
      [
        {
          title: "物料规格",
          field: "materielSpec",
          type: "string",
        },
      ],
      [
        {
          title: "批次号",
          field: "lotNo",
          required: true,
@@ -122,7 +129,14 @@
        field: "materielName",
        title: "物料名称",
        type: "string",
        width: 100,
        width: 150,
        align: "left",
      },
      {
        field: "materielSpec",
        title: "物料规格",
        type: "string",
        width: 150,
        align: "left",
      },
      {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/inbound/returnOrder.vue
@@ -154,7 +154,7 @@
            field: "pickCode",
            title: "申请发料单号",
            type: "select",
            width: 160,
            width: 180,
            align: "left",
            required: true,
          },
@@ -186,7 +186,31 @@
            field: "mCode",
            title: "物料编码",
            type: "string",
            width: 90,
            width: 130,
            align: "left",
            required: true,
          },
          {
            field: "qty",
            title: "可退数量",
            type: "float",
            width: 130,
            align: "left",
            required: true,
          },
          {
            field: "returnQty",
            title: "退回数量",
            type: "float",
            width: 130,
            align: "left",
            required: true,
          },
          {
            field: "overReturnQty",
            title: "已退回数量",
            type: "float",
            width: 130,
            align: "left",
            required: true,
          },
@@ -201,7 +225,7 @@
            field: "materielSpec",
            title: "物料规格",
            type: "string",
            width: 90,
            width: 120,
            align: "left",
          },
          {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue
@@ -207,6 +207,20 @@
        align: "left",
      },
      {
        field: "productionDate",
        title: "生产日期",
        type: "string",
        width: 160,
        align: "left",
      },
      {
        field: "effectiveDate",
        title: "有效期",
        type: "string",
        width: 160,
        align: "left",
      },
      {
        field: "taskNum",
        title: "任务号",
        type: "string",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue
@@ -30,27 +30,81 @@
    const editFormOptions = ref([
      [
        {
          title: "库存主键",
          readonly:true,
          field: "stockId",
          type: "string",
        },
        {
          title: "物料编号",
          required: true,
          field: "materielCode",
          type: "string",
        },
        {
          title: "单据编号",
          title: "物料名称",
          required: true,
          field: "materielName",
          type: "string",
        },
        {
          title: "批次号",
          required: true,
          title: "单据编号",
          readonly: true,
          field: "orderNo",
          type: "string",
        },
      ],
      [
        {
          title: "批次号",
          required: true,
          field: "batchNo",
          type: "string",
        },
        {
          title: "库存数量",
          required: true,
          field: "stockQuantity",
          type: "string",
        },
        {
          title: "生产日期",
          required: true,
          field: "productionDate",
          type: "string",
        },
        {
          title: "有效期",
          required: true,
          field: "effectiveDate",
          type: "string",
        },
      ],
      [
        {
          title: "序列号",
          required: true,
          readonly: true,
          field: "serialNumber",
          type: "string",
        },
        {
          title: "出库数量",
          required: true,
          field: "outboundQuantity",
          type: "string",
        },
        {
          title: "库存明细状态",
          readonly: true,
          field: "status",
          type: "string",
        },
        {
          title: "入库单明细行号",
          readonly: true,
          field: "inboundOrderRowNo",
          type: "string",
        },
      ],
@@ -144,6 +198,21 @@
        bind: { key: "stockStatusEmun", data: [] },
      },
      {
        field: "productionDate",
        title: "生产日期",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "effectiveDate",
        title: "有效期",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "creater",
        title: "创建人",
        type: "string",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue
@@ -225,6 +225,20 @@
        align: "left",
        hidden: true,
      },
      {
        field: "materielCode",
        title: "物料编号",
        type: "string",
        width: 150,
        align: "left",
      },
      {
        field: "quantity",
        title: "物料数量",
        type: "float",
        width: 100,
        align: "left",
      },
    ]);
    const detail = ref({
      cnName: "#detailCnName",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue
@@ -225,6 +225,20 @@
        align: "left",
        hidden: true,
      },
      {
        field: "materielCode",
        title: "物料编号",
        type: "string",
        width: 150,
        align: "left",
      },
      {
        field: "quantity",
        title: "物料数量",
        type: "float",
        width: 100,
        align: "left",
      },
    ]);
    const detail = ref({
      cnName: "#detailCnName",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/b157c59e-a4e0-4f94-a6da-466245995b56.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/bfe4e4fb-c551-4c7f-94ec-d7011d126854.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Task/WMSTaskDTO.cs
@@ -67,6 +67,11 @@
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
        public int TaskLength { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string AGVArea { get; set; }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs
@@ -28,6 +28,8 @@
        //WebResponseContent FeedbackInboundOrder(int id);
        WebResponseContent MaterielGroup(SaveModel saveModel);
        WebResponseContent MaterielPPorGM(string materielBoxCode="");
        /// <summary>
        /// å…¥åº“完成上报
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IPurchaseOrderDetailService.cs
@@ -16,5 +16,7 @@
        WebResponseContent GetPurchaseOrderNos(string materielCode);
        WebResponseContent GetOrderQuantity(string purchaseOrderNo);
        WebResponseContent GetOrderMaterielSpec(string purchaseOrderNo, string materielCode);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -87,7 +87,7 @@
        /// <param name="roadwayNo"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode);
        WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode,string materielBoxCode = "");
        /// <summary>
        /// ä»…申请任务,让WCS根据路由确定下一地址
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using SqlSugar;
using System;
using System.Collections;
@@ -863,11 +864,17 @@
                    stockInfoDetails.Add(stockInfoDetail);
                    notGroupDetail.ReceiptQuantity += model.Quantity;
                    if (notGroupDetail.ReceiptQuantity>notGroupDetail.OrderQuantity)
                    decimal decimalReceiptQuantity = Convert.ToDecimal(notGroupDetail.ReceiptQuantity);
                    decimal decimalModelQuantity = Convert.ToDecimal(model.Quantity);
                    decimal decimalOrderQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
                    decimalReceiptQuantity += decimalModelQuantity;
                    // æ£€æŸ¥æ˜¯å¦è¶…出订单数量
                    if (decimalReceiptQuantity > decimalOrderQuantity)
                    {
                        return WebResponseContent.Instance.Error($"组盘数量溢出{notGroupDetail.ReceiptQuantity - notGroupDetail.OrderQuantity}");
                        return WebResponseContent.Instance.Error($"组盘数量溢出{decimalReceiptQuantity - decimalOrderQuantity}");
                    }
                    // è½¬å›žfloat类型存储,但比较和计算都使用decimal完成
                    notGroupDetail.ReceiptQuantity = Convert.ToSingle(decimalReceiptQuantity);
                    if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                    {
                        notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
@@ -900,6 +907,220 @@
            }
            return content;
        }
        public WebResponseContent MaterielPPorGM(string materielBoxCode = "")
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string SerNum = materielBoxCode.Substring(0, materielBoxCode.LastIndexOf("SC:")-1);
                MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, SerNum);
                //验证判断时间格式
                WebResponseContent IsValidContent = IsValidMCDates(new List<MatSerNumAnalysisModel>() { model });
                if (!IsValidContent.Status)
                {
                    return content.Error(IsValidContent.Message);
                }
                string result = materielBoxCode.Substring(materielBoxCode.LastIndexOf("SC:") + 3);
                //获取入库单明细
                Dt_InboundOrderDetail inboundOrderDetail = _inboundRepository.InboundOrderDetailRepository.QueryFirst(x=>x.BatchNo== model.LotNo && x.MaterielCode== model.MaterielCode);
                if (inboundOrderDetail == null)
                {
                    return InOtherGMOrPP(model, result);
                }
                Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().First(x => x.Id == inboundOrderDetail.OrderId);
                if (inboundOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单信息");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId);
                //除采购入库单以外其他入库单组盘数据处理
                if (inboundOrder.OrderType != InOrderTypeEnum.Purchase.ObjToInt())
                {
                    return OtherInGroup(inboundOrder, model.LotNo, 0, warehouse, new List<MatSerNumAnalysisModel>() { model });
                }
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单");
                }
                if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                string materielCode = model?.MaterielCode ?? "";
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
                if (materielInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该物料的信息");
                }
                float beforeQuantity = 0;
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == model.LotNo).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    stockInfo = new Dt_StockInfo()
                    {
                        PalletCode = model.LotNo,
                        StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                        WarehouseId = inboundOrder.WarehouseId,
                        PalletType = GetPalletTypeGMOrPP(warehouse, result.Split("*")[0]),
                        StockLength = result.Split("*")[0].ObjToInt(),
                        Details = new List<Dt_StockInfoDetail>()
                    };
                }
                else
                {
                    if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                    {
                        return WebResponseContent.Instance.Error($"托盘号重复");
                    }
                }
                if (stockInfo.PalletType==-1)
                {
                    return WebResponseContent.Instance.Error($"托盘类型不存在");
                }
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
                {
                    return WebResponseContent.Instance.Error($"未在收货明细中找到该采购单");
                }
                if (inboundOrderDetail.OrderDetailStatus > OrderDetailStatusEnum.Inbounding.ObjToInt() || inboundOrderDetail.OrderQuantity == inboundOrderDetail.ReceiptQuantity)
                {
                    return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
                }
                Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                {
                    BatchNo = model.LotNo,
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName = materielInfo.MaterielName,
                    MaterielSpec = materielInfo.MaterielSpec,
                    OrderNo = inboundOrder.InboundOrderNo,
                    SerialNumber = model.SerialNumber,
                    StockQuantity = model.Quantity,
                    OutboundQuantity = 0,
                    Unit = materielInfo.MaterielUnit,
                    Status = StockStatusEmun.组盘暂存.ObjToInt(),
                    ProductionDate = model.ProductionDate,
                    EffectiveDate = model.EffectiveDate,
                    InboundOrderRowNo = inboundOrderDetail.RowNo,
                };
                stockInfo.Details.Add(stockInfoDetail);
                stockInfoDetails.Add(stockInfoDetail);
                inboundOrderDetail.ReceiptQuantity += model.Quantity;
                if (inboundOrderDetail.ReceiptQuantity > inboundOrderDetail.OrderQuantity)
                {
                    return WebResponseContent.Instance.Error($"组盘数量溢出{inboundOrderDetail.ReceiptQuantity - inboundOrderDetail.OrderQuantity}");
                }
                if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                {
                    inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
                }
                float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
                if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                {
                    inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
                content.OK(data: stockInfo);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent InOtherGMOrPP(MatSerNumAnalysisModel model,string request = "")
        {
            string materielCode = model?.MaterielCode ?? "";
            Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
            if (materielInfo == null)
            {
                return WebResponseContent.Instance.Error($"未找到该物料的信息");
            }
            float beforeQuantity = 0;
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == materielInfo.WarehouseId);
            Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == model.LotNo).Includes(x => x.Details).First();
            if (stockInfo == null)
            {
                stockInfo = new Dt_StockInfo()
                {
                    PalletCode = model.LotNo,
                    StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId,
                    PalletType = GetPalletTypeGMOrPP(warehouse, request.Split("*")[0]),
                    StockLength = request.Split("*")[0].ObjToInt(),
                    Details = new List<Dt_StockInfoDetail>()
                };
            }
            else
            {
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"托盘号重复");
                }
            }
            if (stockInfo.PalletType == -1)
            {
                return WebResponseContent.Instance.Error($"托盘类型不存在");
            }
            List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
            Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
            {
                BatchNo = model.LotNo,
                MaterielCode = materielInfo.MaterielCode,
                MaterielName = materielInfo.MaterielName,
                MaterielSpec = materielInfo.MaterielSpec,
                OrderNo = "",
                SerialNumber = model.SerialNumber,
                StockQuantity = model.Quantity,
                OutboundQuantity = 0,
                Unit = materielInfo.MaterielUnit,
                Status = StockStatusEmun.组盘暂存.ObjToInt(),
                ProductionDate = model.ProductionDate,
                EffectiveDate = model.EffectiveDate,
                InboundOrderRowNo = 0,
            };
            stockInfo.Details.Add(stockInfoDetail);
            stockInfoDetails.Add(stockInfoDetail);
            float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
            _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
            return WebResponseContent.Instance.OK(data: stockInfo);
        }
        public int GetPalletTypeGMOrPP(Dt_Warehouse warehouse, string boxWidth)
        {
            if (warehouse.WarehouseCode == WarehouseEnum.HA152.ToString())
            {
                if (boxWidth.ObjToInt() <= 690 && boxWidth.ObjToInt()>=515)
                {
                    return 15;
                }
                else if (boxWidth.ObjToInt() > 690 && boxWidth.ObjToInt() <= 1400)
                {
                    return 16;
                }
            }
            else if (warehouse.WarehouseCode == WarehouseEnum.HA58.ToString())
            {
                Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.WarehouseId == warehouse.WarehouseId);
                return palletTypeInfo.PalletType;
            }
            return -1;
        }
        public WebResponseContent OtherInGroup(Dt_InboundOrder inboundOrder,string? palletCode,int Initiallife,Dt_Warehouse warehouse,List<MatSerNumAnalysisModel> models)
        {
            WebResponseContent content = new WebResponseContent();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/PurchaseOrderDetailService.cs
@@ -63,5 +63,22 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent GetOrderMaterielSpec(string purchaseOrderNo, string materielCode)
        {
            try
            {
                List<Dt_PurchaseOrder> purchaseOrders = BaseDal.Db.Queryable<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == purchaseOrderNo).ToList();
                List<int> purchaseOrderIds = purchaseOrders.Select(x => x.Id).ToList();
                List<Dt_PurchaseOrderDetail> purchaseOrderDetails = BaseDal.Db.Queryable<Dt_PurchaseOrderDetail>()
                .Where(x => purchaseOrderIds.Contains(x.PurchaseOrderId)&& x.MaterielCode == materielCode).ToList();
                List<string> materielSpec = purchaseOrderDetails.Select(x => x.MaterielSpec).ToList();
                return WebResponseContent.Instance.OK(data: materielSpec);
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielCodeInfo.cs
@@ -78,5 +78,11 @@
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "供应商编码")]
        public string SupplierCode { get; set; }
        /// <summary>
        /// ç‰©æ–™è§„æ ¼
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料规格")]
        public string MaterielSpec { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs
@@ -108,5 +108,17 @@
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "状态")]
        public int Status { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "生产日期")]
        public string ProductionDate { get; set; }
        /// <summary>
        /// æœ‰æ•ˆæœŸ
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "有效期")]
        public string EffectiveDate { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs
@@ -55,6 +55,11 @@
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// åº“存物料长度GM/PP
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "库存物料长度")]
        public int StockLength { get; set; }
        /// <summary>
        /// åº“存明细
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs
@@ -142,11 +142,32 @@
        [SugarColumn(IsNullable = true, ColumnDescription = "任务组")]
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
        [ImporterHeader(Name = "任务物料长度")]
        [ExporterHeader(DisplayName = "任务物料长度")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务物料长度")]
        public int TaskLength { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [ImporterHeader(Name = "备注")]
        [ExporterHeader(DisplayName = "备注")]
        [SugarColumn(IsNullable = true, Length = 255, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [ImporterHeader(Name = "物料编号")]
        [ExporterHeader(DisplayName = "物料编号")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode { get; set; }
        /// <summary>
        /// ç‰©æ–™æ•°é‡
        /// </summary>
        [ImporterHeader(Name = "物料数量")]
        [ExporterHeader(DisplayName = "物料数量")]
        [SugarColumn(IsNullable = true, Length = 20, ColumnDescription = "物料数量")]
        public float Quantity { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs
@@ -52,7 +52,10 @@
                    OriginalQuantity = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).Sum(x => x.StockQuantity),
                    Status = taskNum == null ? OutLockStockStatusEnum.已分配.ObjToInt() : OutLockStockStatusEnum.出库中.ObjToInt(),
                    StockId = item.Id,
                    TaskNum = taskNum
                    TaskNum = taskNum,
                    ProductionDate = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).FirstOrDefault()?.ProductionDate,
                    EffectiveDate = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).FirstOrDefault()?.EffectiveDate
                };
                outStockLockInfos.Add(outStockLockInfo);
            }
@@ -80,6 +83,8 @@
                TaskNum = taskNum,
                OrderQuantity = outboundOrderDetail.OrderQuantity,
                Unit = outboundOrderDetail.Unit,
                ProductionDate = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).FirstOrDefault()?.ProductionDate,
                EffectiveDate = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).FirstOrDefault()?.EffectiveDate
            };
            return outStockLockInfo;
@@ -111,7 +116,10 @@
                StockId = outStock.Id,
                TaskNum = taskNum,
                OrderQuantity = mesOutboundOrder.OrderQuantity,
                Unit = mesOutboundOrder.Unit
                Unit = mesOutboundOrder.Unit,
                ProductionDate = outStock.Details.Where(x => x.MaterielCode == mesOutboundOrder.MaterialCode).FirstOrDefault()?.ProductionDate,
                EffectiveDate = outStock.Details.Where(x => x.MaterielCode == mesOutboundOrder.MaterialCode).FirstOrDefault()?.EffectiveDate
            };
            return outStockLockInfo;
@@ -146,7 +154,9 @@
                    StockId = item.Id,
                    TaskNum = taskNum,
                    OrderQuantity = mesPPCutOutboundOrderDetail.OrderQuantity,
                    Unit = mesPPCutOutboundOrderDetail.Unit
                    Unit = mesPPCutOutboundOrderDetail.Unit,
                    ProductionDate = item.Details.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).FirstOrDefault()?.ProductionDate,
                    EffectiveDate = item.Details.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).FirstOrDefault()?.EffectiveDate
                };
                outStockLockInfos.Add(outStockLockInfo);
            }
@@ -173,7 +183,9 @@
                StockId = outStock.Id,
                TaskNum = taskNum,
                OrderQuantity = mesPPOutboundOrder.OrderQuantity,
                Unit = mesPPOutboundOrder.Unit
                Unit = mesPPOutboundOrder.Unit,
                ProductionDate = outStock.Details.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).FirstOrDefault()?.ProductionDate,
                EffectiveDate = outStock.Details.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).FirstOrDefault()?.EffectiveDate
            };
            return outStockLockInfo;
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs
@@ -173,7 +173,9 @@
                    StockId = stockInfo.Id,
                    TaskNum = 0,
                    OrderQuantity = outboundOrderDetail.OrderQuantity,
                    Unit = outboundOrderDetail.Unit
                    Unit = outboundOrderDetail.Unit,
                    ProductionDate = stockInfoDetail.ProductionDate,
                    EffectiveDate = stockInfoDetail.EffectiveDate
                };
                #region ä¿®æ”¹å‡ºåº“单
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesProductService.cs
@@ -20,6 +20,7 @@
using System.Text.RegularExpressions;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Core.CodeConfigEnum;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
namespace WIDESEA_TaskInfoService
{
@@ -162,7 +163,9 @@
                    TaskType = TaskTypeEnum.InProduct.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId,
                    PalletType = proStockInfo.PalletType
                    PalletType = proStockInfo.PalletType,
                    MaterielCode = proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).FirstOrDefault()?.ProductCode,
                    Quantity = (float)proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).Sum(x => x.StockPcsQty)
                };
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -866,7 +866,9 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                    MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
                    Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
                };
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -206,7 +206,9 @@
                    TaskType = TaskTypeEnum.OutAllocate.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                    MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
                    Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
                };
                _unitOfWorkManage.BeginTran();
                BaseDal.AddData(newTask);
@@ -374,6 +376,7 @@
                });
                //更新任务状态
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                FeedBackWCSTaskCompleted(taskNum);
                _unitOfWorkManage.BeginTran();
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
@@ -672,6 +675,7 @@
                }
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                FeedBackWCSTaskCompleted(taskNum);
                _unitOfWorkManage.BeginTran();
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandPickOutbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandOutbound.ObjToInt())
@@ -687,6 +691,10 @@
                    {
                        x.Status = StockStatusEmun.出库完成.ObjToInt();
                    });
                    if (stockInfo.StockLength>0)
                    {
                        stockInfo.StockLength = 0;
                    }
                    _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                    _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                }
@@ -706,7 +714,6 @@
                int beforeStatus = locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs
@@ -4,6 +4,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OtherEnum;
@@ -110,5 +111,29 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// å›žè°ƒwcs手动完成任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent FeedBackWCSTaskCompleted(int taskNum)
        {
            try
            {
                Dt_ApiInfo? url = _apiInfoRepository.QueryData(x => x.ApiCode == APIEnum.FeedBackWCSTaskCompleted.ToString()).First();
                string? apiAddress = url.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                {
                    return WebResponseContent.Instance.Error($"{taskNum},未找到WCS任务完成接口,请检查接口配置");
                }
                string responseStr = HttpHelper.Get(apiAddress + "?taskNum=" + taskNum);
                WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? WebResponseContent.Instance.Error("未找到任务完成返回值");
                return content;
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -88,7 +88,9 @@
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = stockInfo.WarehouseId,
                        PalletType = stockInfo.PalletType
                        PalletType = stockInfo.PalletType,
                        MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
                        Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
                    };
                    //获取是否存在入库单
                    Dt_InboundOrder? inboundOrder =  null;
@@ -278,7 +280,7 @@
        /// <param name="roadwayNo"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode)
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode,string materielBoxCode = "")
        {
            try
            {
@@ -293,7 +295,72 @@
                {
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                if (!string.IsNullOrEmpty(materielBoxCode))
                {
                    _unitOfWorkManage.BeginTran();
                    WebResponseContent responseGroup = _inboundOrderService.MaterielPPorGM(materielBoxCode);
                    if (!responseGroup.Status)
                    {
                        return WebResponseContent.Instance.Error($"{responseGroup.Message}");
                    }
                    Dt_StockInfo stockInfoPPorGM = responseGroup.Data as Dt_StockInfo ?? null;
                    if (stockInfoPPorGM==null)
                    {
                        return WebResponseContent.Instance.Error($"组盘数据转换失败");
                    }
                    Dt_LocationInfo? locationInfoPPorGM = _basicService.LocationInfoService.AssignLocation(roadwayNo, stockInfoPPorGM.PalletType, stockInfoPPorGM.WarehouseId);
                    if (locationInfoPPorGM == null)
                    {
                        return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
                    }
                    Dt_Task newTaskPPorGM = new Dt_Task()
                    {
                        CurrentAddress = stationCode,
                        Grade = 0,
                        NextAddress = locationInfoPPorGM.LocationCode,
                        PalletCode = stockInfoPPorGM.PalletCode,
                        Roadway = roadwayNo,
                        SourceAddress = stationCode,
                        TargetAddress = locationInfoPPorGM.LocationCode,
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = stockInfoPPorGM.WarehouseId,
                        PalletType = stockInfoPPorGM.PalletType,
                        TaskLength= stockInfoPPorGM.StockLength
                    };
                    //获取是否存在入库单
                    Dt_InboundOrder? inboundOrderPPorGM = null;
                    if (stockInfoPPorGM != null && stockInfoPPorGM.Details.Count > 0)
                    {
                        string? orderNo = stockInfoPPorGM.Details.FirstOrDefault()?.OrderNo ?? "";
                        inboundOrderPPorGM = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
                    }
                    if (inboundOrderPPorGM != null)
                    {
                        if (inboundOrderPPorGM.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
                        {
                            newTaskPPorGM.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
                        }
                        else if (inboundOrderPPorGM.OrderType == InOrderTypeEnum.Return.ObjToInt())
                        {
                            newTaskPPorGM.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
                        }
                    }
                    stockInfoPPorGM.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                    LocationStatusEnum lastStatusPPorGM = (LocationStatusEnum)locationInfoPPorGM.LocationStatus;
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfoPPorGM, lastStatusPPorGM, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoPPorGM, newTaskPPorGM.PalletType, LocationStatusEnum.Lock, newTaskPPorGM.WarehouseId);
                    int taskIdPPorGM = BaseDal.AddData(newTaskPPorGM);
                    newTaskPPorGM.TaskId = taskIdPPorGM;
                    _stockRepository.StockInfoRepository.Db.InsertNav(stockInfoPPorGM).Include(x => x.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    WMSTaskDTO wMSTaskDTOPPorGM = _mapper.Map<WMSTaskDTO>(newTaskPPorGM);
                    PushTasksToWCS(new List<Dt_Task> { newTaskPPorGM });
                    return WebResponseContent.Instance.OK(data: wMSTaskDTOPPorGM);
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
@@ -326,7 +393,7 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
                //获取是否存在入库单
@@ -434,7 +501,7 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
@@ -533,7 +600,7 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
@@ -761,7 +828,9 @@
                    TaskType = TaskTypeEnum.InProductBack.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = warePoint.WarehouseId,
                    PalletType = proStockInfo.PalletType
                    PalletType = proStockInfo.PalletType,
                    MaterielCode = proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).FirstOrDefault()?.ProductCode,
                    Quantity = (float)proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).Sum(x => x.StockPcsQty)
                };
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -486,7 +486,9 @@
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            GroupId= groupId
                            GroupId= groupId,
                            MaterielCode = stockInfo.proStockInfoDetails.Where(x => x.ProStockId == stockInfo.Id).FirstOrDefault()?.ProductCode,
                            Quantity = (float)stockInfo.proStockInfoDetails.Where(x => x.ProStockId == stockInfo.Id).Sum(x=> x.StockPcsQty)
                        };
                        tasks.Add(task);
                    }
@@ -525,7 +527,13 @@
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            MaterielCode = stockInfo.Details.Where(x =>x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
                            Quantity =(float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
                        };
                        if (stockInfo.StockLength>0)
                        {
                            task.TaskLength = stockInfo.StockLength;
                        }
                        tasks.Add(task);
                    }
                }
@@ -770,7 +778,9 @@
                                StockId = x.Id,
                                TaskNum = 0,
                                OrderQuantity = OrderDetail.OrderQuantity,
                                Unit = OrderDetail.Unit
                                Unit = OrderDetail.Unit,
                                ProductionDate = v.ProductionDate,
                                EffectiveDate = v.EffectiveDate
                            };
                            outStockLockInfos.Add(outStockLockInfo);
                        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Reloaction.cs
@@ -149,6 +149,7 @@
                    return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                }
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                FeedBackWCSTaskCompleted(task.TaskNum);
                _unitOfWorkManage.BeginTran();
                stockInfo.LocationCode = locationInfoEnd.LocationCode;
                stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/PurchaseOrderDetailController.cs
@@ -34,5 +34,11 @@
        {
            return Service.GetOrderQuantity(purchaseOrderNo);
        }
        //获取物料规格
        [HttpPost, HttpGet, Route("GetOrderMaterielSpec"), AllowAnonymous]
        public WebResponseContent GetOrderMaterielSpec(string purchaseOrderNo, string materielCode)
        {
            return Service.GetOrderMaterielSpec(purchaseOrderNo, materielCode);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -75,9 +75,9 @@
        /// <param name="palletCode"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("DeviceRequestInboundTask"), AllowAnonymous]
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode)
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode,string materielBoxCode = "")
        {
            return Service.DeviceRequestInboundTask(stationCode, roadwayNo, palletCode);
            return Service.DeviceRequestInboundTask(stationCode, roadwayNo, palletCode, materielBoxCode);
        }
        /// <summary>
ÏîÄ¿×ÊÁÏ/24KH244 ÉîÛÚÃÀÈð°² »´°²ÌØ´´Á¢Ìå¿âÏîÄ¿µç¿ØÈí¼þ¿ª·¢¡¢²âÊÔ¼°Î¬»¤·þÎñ-¼¼ÊõЭÒé-2024.11.21.pdf
Binary files differ