1
heshaofeng
2025-12-26 c10661bab41e6161449a6dac8eef40bb53feb235
1
已添加5个文件
已修改8个文件
941 ■■■■■ 文件已修改
项目代码/WIDESEA_WMSClient/package-lock.json 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/router/viewGird.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue 415 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/BigGreenService/BigGreenService.csproj 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/IBigBreen/IBigBreenService.csproj 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/IBigBreen/IBigGreenService.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer.sln 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/BigGreen/BigScreenController.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WMSClient/package-lock.json
@@ -3612,11 +3612,6 @@
      "dev": true,
      "optional": true
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.7",
      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
    },
    "@soda/friendly-errors-webpack-plugin": {
      "version": "1.8.0",
      "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927406873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz",
@@ -4391,6 +4386,87 @@
        "webpack-chain": "^6.4.0",
        "webpack-dev-server": "^3.11.0",
        "webpack-merge": "^4.2.2"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
    },
    "@vue/cli-shared-utils": {
@@ -7561,6 +7637,13 @@
        "lodash-unified": "^1.0.2",
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      },
      "dependencies": {
        "@popperjs/core": {
          "version": "npm:@sxzz/popperjs-es@2.11.7",
          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
        }
      }
    },
    "element-ui": {
@@ -15385,87 +15468,6 @@
          "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
          "dev": true
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/router/viewGird.js
@@ -248,8 +248,8 @@
    name: 'takeStockOrderDetail',
    component: () => import('@/views/inbound/takeStockOrderDetail.vue')
  }, {
    path: '/dashboard',
    name: 'dashboard',
    path: '/wms-dashboard',
    name: 'wms-dashboard',
    component: () => import('@/views/charts/wms-dashboard.vue')
  }
]
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue
@@ -1,7 +1,7 @@
<template>
  <div class="wms-dashboard">
    <!-- é¡¶éƒ¨æ ‡é¢˜æ  -->
    <div class="header">
    <!-- <div class="header">
      <h1>WMS仓储可视化图表看板</h1>
      <div class="header-right">
        <span>2025-12-24 16:11:44</span>
@@ -11,36 +11,36 @@
        </el-select>
        <el-button type="primary" style="margin-left: 10px;" @click="refreshCharts">刷新</el-button>
      </div>
    </div>
    </div> -->
    <!-- ç»Ÿè®¡å¡ç‰‡åŒºåŸŸ -->
    <!-- ç»Ÿè®¡å¡ç‰‡åŒºåŸŸ - ç»‘定响应式数据 -->
    <el-row :gutter="20" class="stats-card-row">
      <el-col :span="6">
        <el-card class="stats-card">
          <div class="card-title">总库存(件)</div>
          <div class="card-value">269,225</div>
          <div class="card-change"><el-tag type="success">↑ 2.1% è¾ƒæ˜¨æ—¥</el-tag></div>
          <div class="card-value">{{ formatNumber(bigscreendata.totalStockQuantity) }}</div>
          <!-- <div class="card-change"><el-tag type="success">↑ 2.1% è¾ƒæ˜¨æ—¥</el-tag></div> -->
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card class="stats-card">
          <div class="card-title">待出库订单</div>
          <div class="card-value">425</div>
          <div class="card-change"><el-tag type="warning">↑ 5.3% è¾ƒ1小时前</el-tag></div>
          <div class="card-value">{{ bigscreendata.unOutBoundOrderCount }}</div>
          <!-- <div class="card-change"><el-tag type="warning">↑ 5.3% è¾ƒ1小时前</el-tag></div> -->
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card class="stats-card">
          <div class="card-title">今日作业完成率</div>
          <div class="card-value">93.9%</div>
          <div class="card-change"><el-tag type="success">↑ 1.8% è¾ƒæ˜¨æ—¥</el-tag></div>
          <div class="card-value">{{ bigscreendata.dailyCompletionRate ? `${bigscreendata.dailyCompletionRate}%` : '0%' }}</div>
          <!-- <div class="card-change"><el-tag type="success">↑ 1.8% è¾ƒæ˜¨æ—¥</el-tag></div> -->
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card class="stats-card">
          <div class="card-title">未处理异常</div>
          <div class="card-value">7</div>
          <div class="card-change"><el-tag type="danger">↑ 1 è¾ƒ30分钟前</el-tag></div>
          <div class="card-value">{{ bigscreendata.unhandledExceptionCount || 0 }}</div>
          <!-- <div class="card-change"><el-tag type="danger">↑ 1 è¾ƒ30分钟前</el-tag></div> -->
        </el-card>
      </el-col>
    </el-row>
@@ -49,18 +49,18 @@
    <el-row :gutter="20" class="chart-row">
      <el-col :span="12">
        <el-card class="chart-card">
          <div class="chart-title">库存库位分布(图像化占比)<el-button type="text" class="view-btn">切换视图</el-button></div>
          <div class="chart-title">库存库位分布(图像化占比)</div>
          <div ref="inventoryPieRef" class="chart-container"></div>
        </el-card>
      </el-col>
      <el-col :span="12">
        <el-card class="chart-card">
          <div class="chart-title">近7日出入库趋势(图像化走势)
            <el-button-group class="btn-group">
            <!-- <el-button-group class="btn-group">
              <el-button type="primary" size="small">全部</el-button>
              <el-button type="default" size="small">入库</el-button>
              <el-button type="default" size="small">出库</el-button>
            </el-button-group>
            </el-button-group> -->
          </div>
          <div ref="stockTrendRef" class="chart-container"></div>
        </el-card>
@@ -69,19 +69,13 @@
    <!-- å›¾è¡¨åŒºåŸŸï¼ˆç¬¬äºŒè¡Œï¼‰ -->
    <el-row :gutter="20" class="chart-row">
      <el-col :span="8">
      <el-col :span="12">
        <el-card class="chart-card">
          <div class="chart-title">库位利用率</div>
          <div ref="locationRateRef" class="chart-container"></div>
        </el-card>
      </el-col>
      <el-col :span="8">
        <el-card class="chart-card">
          <div class="chart-title">作业类型分布<el-button type="text" class="view-btn">查看详情</el-button></div>
          <div ref="operationRadarRef" class="chart-container"></div>
        </el-card>
      </el-col>
      <el-col :span="8">
      <el-col :span="12">
        <el-card class="chart-card">
          <div class="chart-title">异常类型统计趋势<el-button type="text" class="view-btn">筛选</el-button></div>
          <div ref="exceptionTrendRef" class="chart-container"></div>
@@ -89,39 +83,9 @@
      </el-col>
    </el-row>
    <!-- è¡¨æ ¼åŒºåŸŸ -->
    <el-row :gutter="20" class="table-row">
      <el-col :span="12">
        <el-card class="table-card">
          <div class="table-title">订单处理进度<el-select v-model="orderType" placeholder="退货入库"
              style="width: 100px; margin-left: 10px;">
              <el-option label="退货入库" value="return"></el-option>
              <el-option label="普通出库" value="normal"></el-option>
            </el-select></div>
          <el-table :data="orderList" border style="width: 100%;">
            <el-table-column prop="orderNo" label="订单号" />
            <el-table-column prop="type" label="类型" />
            <el-table-column prop="priority" label="优先级">
              <template #default="scope">
                <el-tag
                  :type="scope.row.priority === '紧急' ? 'danger' : scope.row.priority === '加急' ? 'warning' : 'success'">
                  {{ scope.row.priority }}
                </el-tag>
              </template>
            </el-table-column>
            <el-table-column prop="progress" label="进度">
              <template #default="scope">
                <el-progress :percentage="scope.row.progress" :color="scope.row.progressColor" />
              </template>
            </el-table-column>
          </el-table>
          <div class="table-pagination">
            <el-button type="text">加载更多订单</el-button>
            <el-pagination layout="prev, pager, next, jumper" :current-page="1" :total="50" />
          </div>
        </el-card>
      </el-col>
      <el-col :span="12">
    <!-- è¡¨æ ¼åŒºåŸŸ - ç»‘定后端作业数据 -->
    <el-row :gutter="20" class="table-row" width="100%">
      <el-col :span="24">
        <el-card class="table-card">
          <div class="table-title">实时作业监控
            <el-button-group class="btn-group">
@@ -131,7 +95,7 @@
              <el-button type="default" size="small">盘点</el-button>
            </el-button-group>
          </div>
          <el-table :data="operationList" border style="width: 100%;">
          <el-table :data="bigscreendata.taskList.length ? bigscreendata.taskList : operationList" border style="width: 100%;">
            <el-table-column prop="opNo" label="作业单号" />
            <el-table-column prop="opType" label="作业类型" />
            <el-table-column prop="operator" label="操作人员" />
@@ -157,18 +121,52 @@
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
import * as echarts from 'echarts';
import http from "@/api/http.js";
// å“åº”式数据
const month = ref('month');
const orderType = ref('return');
// æ¨¡æ‹Ÿæ•°æ®
const orderList = ref([
  { orderNo: 'OD20251224001', type: '普通出库', priority: '紧急', progress: 60, progressColor: '#ff4d4f' },
  { orderNo: 'OD20251224002', type: '退货入库', priority: '普通', progress: 80, progressColor: '#1890ff' },
  { orderNo: 'OD20251224003', type: '调拨订单', priority: '加急', progress: 40, progressColor: '#faad14' },
  { orderNo: 'OD20251224004', type: '普通出库', priority: '常规', progress: 100, progressColor: '#52c41a' }
]);
// åŽç«¯è¿”回数据(响应式)
const bigscreendata = ref({
  totalStockQuantity: 0,
  unOutBoundOrderCount: 0,
  dailyCompletionRate: 0,
  unhandledExceptionCount: 0,
  locationUtilizationRate: 0,
  dailyInOutBoundList: [],
  taskList: [],
  inventoryLocationDist: [], // åº“存库位分布数据
  exceptionTypeTrend: []     // å¼‚常类型趋势数据
});
// æ•°å­—格式化(千分位分隔)
const formatNumber = (num) => {
  if (!num) return '0';
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};
// èŽ·å–åŽç«¯å¤§å±æ•°æ®
const fetchBigGreenData = async () => {
  try {
    // ä¿®æ­£ï¼šä»£ç†å·²é…ç½®ï¼Œç§»é™¤å¤šä½™çš„/api前缀
    const res = await http.get('/api/BigScreen/GetBigGreenData');
    console.log('大屏数据', res);
    // èµ‹å€¼å“åº”式数据(兼容后端统一返回格式)
    bigscreendata.value = res.data || res;
    // æ•°æ®æ›´æ–°åŽåˆ·æ–°å›¾è¡¨
    nextTick(() => {
      refreshCharts();
    });
  } catch (error) {
    console.error('获取大屏数据失败:', error);
    ElMessage.error('数据获取失败,请检查后端接口是否正常'); // æ›¿æ¢ä¸ºElement Plus消息提示
  }
};
console.log('大屏数据111', bigscreendata.value);
// å¤‡ç”¨æ¨¡æ‹Ÿæ•°æ®
const operationList = ref([
  { opNo: 'JW251224001', opType: '入库', operator: '张三', startTime: '15:30:22', status: '处理中' },
  { opNo: 'CK251224002', opType: '出库', operator: '李四', startTime: '15:25:10', status: '已完成' },
@@ -176,29 +174,38 @@
  { opNo: 'SC251224005', opType: '上架', operator: '孙七', startTime: '15:10:18', status: '异常' }
]);
// å›¾è¡¨å®¹å™¨
// å›¾è¡¨å®¹å™¨Ref
const inventoryPieRef = ref(null);
const stockTrendRef = ref(null);
const locationRateRef = ref(null);
const operationRadarRef = ref(null);
const exceptionTrendRef = ref(null);
// å›¾è¡¨å®žä¾‹
// å›¾è¡¨å®žä¾‹ï¼ˆå…¨å±€ç®¡ç†ï¼Œç”¨äºŽé”€æ¯å’Œresize)
let inventoryPieChart = null;
let stockTrendChart = null;
let locationRateChart = null;
let operationRadarChart = null;
let exceptionTrendChart = null;
// åˆå§‹åŒ–库存库位分布饼图
// åˆå§‹åŒ–库存库位分布饼图(关联后端数据)
const initInventoryPie = () => {
  if (!inventoryPieRef.value) return;
  // é”€æ¯æ—§å®žä¾‹ï¼Œé˜²æ­¢å†…存泄漏
  if (inventoryPieChart) {
    inventoryPieChart.dispose();
  }
  inventoryPieChart = echarts.init(inventoryPieRef.value);
  // ä¼˜å…ˆä½¿ç”¨åŽç«¯æ•°æ®ï¼Œæ— æ•°æ®åˆ™ç”¨é»˜è®¤å€¼
  const locationData = bigscreendata.value.inventoryLocationDist.length
    ? bigscreendata.value.inventoryLocationDist
    : [
        { value: 48.7, name: '常温区A区', itemStyle: { color: '#5470c6' } },
        { value: 29.2, name: '冷藏区B区', itemStyle: { color: '#91cc75' } },
        { value: 21.9, name: '保税区C区', itemStyle: { color: '#fac858' } },
        { value: 2.2, name: '残次品区D区', itemStyle: { color: '#ee6666' } }
      ];
  const option = {
    tooltip: {
      trigger: 'item',
@@ -207,7 +214,7 @@
    legend: {
      bottom: 0,
      left: 'center',
      data: ['常温区A区', '冷藏区B区', '保税区C区', '残次品区D区']
      data: locationData.map(item => item.name)
    },
    series: [{
      name: '库存库位分布',
@@ -234,12 +241,7 @@
      labelLine: {
        show: false
      },
      data: [
        { value: 48.7, name: '常温区A区', itemStyle: { color: '#5470c6' } },
        { value: 29.2, name: '冷藏区B区', itemStyle: { color: '#91cc75' } },
        { value: 21.9, name: '保税区C区', itemStyle: { color: '#fac858' } },
        { value: 2.2, name: '残次品区D区', itemStyle: { color: '#ee6666' } }
      ]
      data: locationData
    }]
  };
@@ -247,7 +249,7 @@
  return inventoryPieChart;
};
// åˆå§‹åŒ–è¿‘7日出入库趋势图
// åˆå§‹åŒ–è¿‘7日出入库趋势图(关联后端数据)
const initStockTrend = () => {
  if (!stockTrendRef.value) return;
@@ -256,6 +258,19 @@
  }
  stockTrendChart = echarts.init(stockTrendRef.value);
  // ä¼˜å…ˆä½¿ç”¨åŽç«¯æ•°æ®
  const trendData = bigscreendata.value.dailyInOutBoundList.length
    ? bigscreendata.value.dailyInOutBoundList
    : [
        { date: '12-18', inNum: 10, outNum: 16 },
        { date: '12-19', inNum: 12, outNum: 18 },
        { date: '12-20', inNum: 10, outNum: 14 },
        { date: '12-21', inNum: 12, outNum: 18 },
        { date: '12-22', inNum: 10, outNum: 16 },
        { date: '12-23', inNum: 12, outNum: 18 },
        { date: '12-24', inNum: 12, outNum: 20 }
      ];
  const option = {
    tooltip: {
      trigger: 'axis',
@@ -277,7 +292,7 @@
    xAxis: {
      type: 'category',
      boundaryGap: true,
      data: ['12-18', '12-19', '12-20', '12-21', '12-22', '12-23', '12-24']
      data: trendData.map(item => item.date)
    },
    yAxis: {
      type: 'value',
@@ -289,14 +304,14 @@
        name: '入库量',
        type: 'bar',
        barWidth: '30%',
        data: [10, 12, 10, 12, 10, 12, 12],
        data: trendData.map(item => item.inNum),
        itemStyle: { color: '#52c41a' }
      },
      {
        name: '出库量',
        type: 'bar',
        barWidth: '30%',
        data: [16, 18, 14, 18, 16, 18, 20],
        data: trendData.map(item => item.outNum),
        itemStyle: { color: '#1890ff' }
      }
    ]
@@ -306,161 +321,76 @@
  return stockTrendChart;
};
// åˆå§‹åŒ–库位利用率环形图
// åˆå§‹åŒ–库位利用率环形图(修正:统一实例管理,关联后端数据)
const initLocationRate = () => {
  if (!locationRateRef.value) return;
  // é”€æ¯æ—§å®žä¾‹
  if (locationRateChart) {
    locationRateChart.dispose();
  }
  locationRateChart = echarts.init(locationRateRef.value);
  // ä¼˜å…ˆä½¿ç”¨åŽç«¯æ•°æ®ï¼Œæ— æ•°æ®åˆ™ç”¨é»˜è®¤å€¼
  console.log('库位利用率数据', bigscreendata.value.locationUtilizationRate);
  const utilizationRate = bigscreendata.value.locationUtilizationRate || 86.2;
  const freeRate = 100 - utilizationRate;
  const option = {
    tooltip: {
      formatter: '{a} <br/>{b} : {c}%'
      trigger: 'item',
      formatter: '{b}: {c}%'
    },
    series: [{
      name: '库位利用率',
      type: 'gauge',
      min: 0,
      max: 100,
      splitNumber: 10,
      radius: '90%',
      center: ['50%', '55%'],
      startAngle: 180,
      endAngle: 0,
      progress: {
        show: true,
        width: 20,
        itemStyle: {
          color: '#1890ff'
    legend: {
      bottom: 0,
      left: 'center',
      data: ['已占用库位', '空闲库位'],
      textStyle: { fontSize: 12, color: '#666' }
    },
    graphic: [
      {
        type: 'text',
        left: 'right',
        top: '10%',
        style: {
          text: `${utilizationRate}%`,
          fontSize: 24,
          fontWeight: 'bold',
          fill: '#333'
        }
      },
      axisLine: {
        lineStyle: {
          width: 20,
          color: [[1, 'rgba(200,200,200,0.3)']]
      {
        type: 'text',
        left: 'right',
        top: '25%',
        style: {
          text: '库位利用率',
          fontSize: 14,
          fill: '#666'
        }
      },
      axisTick: {
        distance: -30,
        splitNumber: 5,
        lineStyle: {
          width: 2,
          color: '#999'
        }
      },
      splitLine: {
        distance: -30,
        length: 14,
        lineStyle: {
          width: 3,
          color: '#999'
        }
      },
      axisLabel: {
        distance: -20,
        color: '#999',
        fontSize: 12
      },
      anchor: {
        show: false
      },
      title: {
        show: true,
        offsetCenter: [0, '30%'],
        fontSize: 16,
        fontWeight: 'bold'
      },
      detail: {
        valueAnimation: true,
        formatter: '{value}%',
        fontSize: 20,
        fontWeight: 'bold',
        offsetCenter: [0, '70%']
      },
      data: [{
        value: 86.2,
        name: '库位利用率'
      }]
    }]
      }
    ],
    series: [
      {
        type: 'pie',
        radius: ['50%', '70%'],
        center: ['40%', '50%'],
        avoidLabelOverlap: false,
        label: { show: false },
        labelLine: { show: false },
        data: [
          { value: utilizationRate, name: '已占用库位', itemStyle: { color: '#1890ff' } },
          { value: freeRate, name: '空闲库位', itemStyle: { color: '#e5e9f2' } }
        ]
      }
    ]
  };
  locationRateChart.setOption(option);
  return locationRateChart;
};
// åˆå§‹åŒ–作业类型雷达图
const initOperationRadar = () => {
  if (!operationRadarRef.value) return;
  if (operationRadarChart) {
    operationRadarChart.dispose();
  }
  operationRadarChart = echarts.init(operationRadarRef.value);
  const option = {
    tooltip: {
      trigger: 'item'
    },
    legend: {
      show: false
    },
    radar: {
      indicator: [
        { name: '出库作业', max: 100 },
        { name: '入库作业', max: 100 },
        { name: '调拨作业', max: 100 },
        { name: '盘点作业', max: 100 }
      ],
      shape: 'circle',
      splitNumber: 5,
      axisName: {
        color: '#666'
      },
      splitLine: {
        lineStyle: {
          color: 'rgba(0,0,0,0.1)'
        }
      },
      splitArea: {
        show: true,
        areaStyle: {
          color: ['rgba(255,255,255,0.8)', 'rgba(200,200,200,0.2)']
        }
      }
    },
    series: [{
      name: '作业类型分布',
      type: 'radar',
      symbolSize: 8,
      areaStyle: {
        color: 'rgba(24,144,255,0.3)'
      },
      lineStyle: {
        width: 2
      },
      itemStyle: {
        color: '#1890ff'
      },
      data: [{
        value: [45, 30, 15, 10],
        name: '作业占比',
        label: {
          show: true,
          formatter: function (params) {
            return params.value + '%';
          }
        }
      }]
    }]
  };
  operationRadarChart.setOption(option);
  return operationRadarChart;
};
// åˆå§‹åŒ–异常趋势折线图
// åˆå§‹åŒ–异常类型统计趋势图(关联后端数据)
const initExceptionTrend = () => {
  if (!exceptionTrendRef.value) return;
@@ -469,6 +399,17 @@
  }
  exceptionTrendChart = echarts.init(exceptionTrendRef.value);
  // ä¼˜å…ˆä½¿ç”¨åŽç«¯æ•°æ®
  const exceptionData = bigscreendata.value.exceptionTypeTrend.length
    ? bigscreendata.value.exceptionTypeTrend
    : {
        dates: ['12-18', '12-19', '12-20', '12-21', '12-22', '12-23', '12-24'],
        stockShort: [10, 11, 9, 12, 10, 13, 12],
        orderTimeout: [8, 9, 7, 8, 7, 9, 8],
        locationException: [4, 5, 2, 4, 3, 5, 4],
        checkDiff: [2, 3, 1, 2, 1, 3, 2]
      };
  const option = {
    tooltip: {
      trigger: 'axis',
@@ -490,7 +431,7 @@
    xAxis: {
      type: 'category',
      boundaryGap: false,
      data: ['12-18', '12-19', '12-20', '12-21', '12-22', '12-23', '12-24']
      data: exceptionData.dates
    },
    yAxis: {
      type: 'value',
@@ -503,11 +444,9 @@
        smooth: true,
        symbol: 'circle',
        symbolSize: 8,
        data: [10, 11, 9, 12, 10, 13, 12],
        data: exceptionData.stockShort,
        itemStyle: { color: '#ff4d4f' },
        lineStyle: {
          width: 3
        }
        lineStyle: { width: 3 }
      },
      {
        name: '订单超时',
@@ -515,11 +454,9 @@
        smooth: true,
        symbol: 'circle',
        symbolSize: 8,
        data: [8, 9, 7, 8, 7, 9, 8],
        data: exceptionData.orderTimeout,
        itemStyle: { color: '#faad14' },
        lineStyle: {
          width: 3
        }
        lineStyle: { width: 3 }
      },
      {
        name: '库位异常',
@@ -527,11 +464,9 @@
        smooth: true,
        symbol: 'circle',
        symbolSize: 8,
        data: [4, 5, 2, 4, 3, 5, 4],
        data: exceptionData.locationException,
        itemStyle: { color: '#722ed1' },
        lineStyle: {
          width: 3
        }
        lineStyle: { width: 3 }
      },
      {
        name: '盘点差异',
@@ -539,11 +474,9 @@
        smooth: true,
        symbol: 'circle',
        symbolSize: 8,
        data: [2, 3, 1, 2, 1, 3, 2],
        data: exceptionData.checkDiff,
        itemStyle: { color: '#13c2c2' },
        lineStyle: {
          width: 3
        }
        lineStyle: { width: 3 }
      }
    ]
  };
@@ -552,13 +485,12 @@
  return exceptionTrendChart;
};
// åˆ·æ–°æ‰€æœ‰å›¾è¡¨
// åˆ·æ–°æ‰€æœ‰å›¾è¡¨ï¼ˆç§»é™¤æ— æ•ˆé›·è¾¾å›¾é€»è¾‘)
const refreshCharts = () => {
  const charts = [
    initInventoryPie,
    initStockTrend,
    initLocationRate,
    initOperationRadar,
    initExceptionTrend
  ];
@@ -570,13 +502,12 @@
  });
};
// ç›‘听窗口大小变化
// çª—口大小变化监听
const handleResize = () => {
  const charts = [
    inventoryPieChart,
    stockTrendChart,
    locationRateChart,
    operationRadarChart,
    exceptionTrendChart
  ];
@@ -587,26 +518,26 @@
  });
};
// æŒ‚载后初始化图表
// ç»„件挂载时:先请求数据,再初始化图表
onMounted(() => {
  // å…ˆèŽ·å–åŽç«¯æ•°æ®
  fetchBigGreenData();
  // åˆå§‹åŒ–图表(确保DOM已渲染)
  nextTick(() => {
    initInventoryPie();
    initStockTrend();
    initLocationRate();
    initOperationRadar();
    initExceptionTrend();
    window.addEventListener('resize', handleResize);
  });
});
// ç»„件卸载时清理
// ç»„件卸载时:销毁图表实例,移除事件监听
onUnmounted(() => {
  const charts = [
    inventoryPieChart,
    stockTrendChart,
    locationRateChart,
    operationRadarChart,
    exceptionTrendChart
  ];
@@ -677,7 +608,7 @@
}
.chart-card {
  height: 320px;
  height: 350px;
  padding: 15px;
  display: flex;
  flex-direction: column;
@@ -686,7 +617,7 @@
.chart-container {
  width: 100%;
  height: 100%;
  min-height: 250px;
  min-height: 240px;
  flex: 1;
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,196 @@
using IBigBreenService;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace BigGreenService
{
    public class BigGreenService : IBigGreenService
    {
        private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
        private readonly IRepository<Dt_OutboundOrder> _outBoundOrderRepository;
        private readonly IRepository<Dt_LocationInfo> _locationInfoRepository;
        private readonly IRepository<Dt_OutboundOrderDetail> _outBoundOrderDetailRepository;
        private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository;
        private readonly IRepository<Dt_Task> _taskRepository;
        public BigGreenService(IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_OutboundOrder> outBoundOrderRepository, IRepository<Dt_LocationInfo> locationInfoRepository,IRepository<Dt_OutboundOrderDetail> outBoundOrderDetailRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository,IRepository<Dt_Task> taskRepository)
        {
            _stockInfoDetailRepository = stockInfoDetailRepository;
            _outBoundOrderRepository = outBoundOrderRepository;
            _locationInfoRepository = locationInfoRepository;
            _outBoundOrderDetailRepository = outBoundOrderDetailRepository;
            _inboundOrderDetailRepository = inboundOrderDetailRepository;
            _taskRepository = taskRepository;
        }
        public WebResponseContent GetBigGreenData()
        {
            //计算总库存数量
            var totalStockQuantity = _stockInfoDetailRepository.Db.Queryable<Dt_StockInfoDetail>().Sum(x => (decimal?)x.StockQuantity) ?? 0;
            //计算待出库订单
            var targetStatus = new List<int>
            {
                (int)OutOrderStatusEnum.出库中,
                (int)OutOrderStatusEnum.未开始
            };
            var unOutBound =_outBoundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x =>targetStatus.Contains(x.OrderStatus)).Count();
            //计算库位利用率
            var freeLocation =_locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x=>x.LocationStatus==(int)LocationStatusEnum.Free).Count();
            var inStockLocation =_locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x => x.LocationStatus == (int)LocationStatusEnum.InStock).Count();
            int totalLocation = freeLocation + inStockLocation;
            decimal locationUtilizationRate = totalLocation == 0
                ? 0
                : Math.Round((decimal)inStockLocation / totalLocation, 4);
            // 4. èŽ·å–è¿‘7日每日出入库明细(核心修改:调用上面的方法)
            var dailyInOutBoundList = Get7DaysDailyInOutBound();
            //任务
            List<Dt_Task> tasks = _taskRepository.QueryData();
            var bigGreenData = new BigGreenDataDto
            {
                TotalStockQuantity=totalStockQuantity,
                UnOutBoundOrderCount = unOutBound,
                LocationUtilizationRate = locationUtilizationRate,
                DailyInOutBoundList = dailyInOutBoundList,
                TaskList = tasks
            };
            return WebResponseContent.Instance.OK(data: bigGreenData);
        }
        /// <summary>
        /// èŽ·å–è¿‘7日每日出入库明细
        /// </summary>
        /// <returns>每日出入库明细列表</returns>
        private List<DailyInOutBoundDto> Get7DaysDailyInOutBound()
        {
            // 1. å®šä¹‰æ—¶é—´èŒƒå›´ï¼ˆè¿‘7个自然日)
            DateTime endDate = DateTime.Today;
            DateTime startDate = endDate.AddDays(-6);
            // ç”Ÿæˆè¿‘7日所有日期(确保无缺失,即使某一天无数据也返回0)
            var all7Days = Enumerable.Range(0, 7)
                .Select(i => endDate.AddDays(-i).ToString("MM-dd"))
                .Reverse() // æŒ‰æ—¥æœŸå‡åºæŽ’列(从7天前到今日)
                .ToList();
            // 2. æŸ¥è¯¢æ¯æ—¥å‡ºåº“明细(按日期分组)
            var dailyOutboundList = _outBoundOrderDetailRepository.Db
                .Queryable<Dt_OutboundOrderDetail>()
                .Where(x => x.CreateDate >= startDate
                         && x.CreateDate < endDate.AddDays(1))
                .GroupBy(x => x.CreateDate) // æŒ‰æ—¥æœŸæ ¼å¼åŒ–分组
                .Select(x => new
                {
                    Date = x.CreateDate.ToString( "MM-dd"),
                    DailyOutbound = SqlFunc.AggregateSum((decimal?)x.OverOutQuantity) ?? 0
                })
                .ToList()
                .ToDictionary(k => k.Date, v => v.DailyOutbound); // è½¬ä¸ºå­—典方便匹配
            // 3. æŸ¥è¯¢æ¯æ—¥å…¥åº“明细(按日期分组)
            var dailyInboundList = _inboundOrderDetailRepository.Db
                .Queryable<Dt_InboundOrderDetail>()
                .Where(x => x.CreateDate != null // è¿‡æ»¤ç©ºæ—¥æœŸ
                         && x.CreateDate >= startDate
                         && x.CreateDate < endDate.AddDays(1))
                .GroupBy(x => x.CreateDate).Distinct() // æŒ‰æ—¥æœŸæ ¼å¼åŒ–分组
                .Select(x => new
                {
                    Date = x.CreateDate.ToString("MM-dd"),
                    DailyInbound = SqlFunc.AggregateSum((decimal?)x.OverInQuantity) ?? 0
                })
                .ToList()
                .ToDictionary(k => k.Date, v => v.DailyInbound); // è½¬ä¸ºå­—典方便匹配
            // 4. åˆå¹¶æ¯æ—¥æ•°æ®ï¼ˆç¡®ä¿7天日期完整,无数据补0)
            var dailyInOutBoundList = all7Days.Select(date => new DailyInOutBoundDto
            {
                Date = date,
                DailyOutboundQuantity = dailyOutboundList.ContainsKey(date) ? dailyOutboundList[date] : 0,
                DailyInboundQuantity = dailyInboundList.ContainsKey(date) ? dailyInboundList[date] : 0,
            }).ToList();
            return dailyInOutBoundList;
        }
        /// <summary>
        /// å¤§å±/汇总数据返回DTO(大绿数据汇总)
        /// </summary>
        public class BigGreenDataDto
        {
            /// <summary>
            /// æ€»åº“存数量
            /// </summary>
            public decimal TotalStockQuantity { get; set; }
            /// <summary>
            /// å¾…出库订单数量(出库中+未开始)
            /// </summary>
            public int UnOutBoundOrderCount { get; set; }
            /// <summary>
            /// ç©ºé—²åº“位数量
            /// </summary>
            public int FreeLocationCount { get; set; }
            /// <summary>
            /// å ç”¨åº“位数量(已存库)
            /// </summary>
            public int InStockLocationCount { get; set; }
            /// <summary>
            /// åº“位利用率(小数形式,如0.85对应85%)
            /// </summary>
            public decimal LocationUtilizationRate { get; set; }
            /// <summary>
            /// è¿‘7日每日出入库明细
            /// </summary>
            public List<DailyInOutBoundDto> DailyInOutBoundList { get; set; } = new List<DailyInOutBoundDto>();
            /// <summary>
            /// è¿‘7日净入库量(入库-出库)
            /// </summary>
            public decimal NetStock7Days { get; set; }
            /// <summary>
            /// ä»»åŠ¡åˆ—è¡¨
            /// </summary>
            public List<Dt_Task> TaskList { get; set; } = new List<Dt_Task>();
        }
        /// <summary>
        /// æ¯æ—¥å‡ºå…¥åº“明细DTO
        /// </summary>
        public class DailyInOutBoundDto
        {
            /// <summary>
            /// æ—¥æœŸï¼ˆæ ¼å¼ï¼šyyyy-MM-dd)
            /// </summary>
            public string Date { get; set; }
            /// <summary>
            /// å½“日出库总量
            /// </summary>
            public decimal DailyOutboundQuantity { get; set; }
            /// <summary>
            /// å½“日入库总量
            /// </summary>
            public decimal DailyInboundQuantity { get; set; }
        }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/BigGreenService/BigGreenService.csproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\IBigBreen\IBigBreenService.csproj" />
    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/IBigBreen/IBigBreenService.csproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/IBigBreen/IBigGreenService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
namespace IBigBreenService
{
    public interface IBigGreenService : IDependency
    {
        WebResponseContent GetBigGreenData();
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -4,6 +4,7 @@
using SqlSugar;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
@@ -20,7 +21,7 @@
    public partial class StockInfoService : ServiceBase<Dt_StockInfo, IRepository<Dt_StockInfo>>, IStockInfoService
    {
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IRecordService _recordService;
        public IRepository<Dt_StockInfo> Repository => BaseDal;
        private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
@@ -29,7 +30,7 @@
        private readonly IRepository<Dt_AllocateOrder> _allocateRepository;
        private readonly ILocationInfoService _locationInfoService;
        public StockInfoService(IRepository<Dt_StockInfo> BaseDal, IMapper mapper, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRecordService recordService, ILocationInfoService locationInfoService, IOutboundOrderService outboundOrderService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
        public StockInfoService(IRepository<Dt_StockInfo> BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRecordService recordService, ILocationInfoService locationInfoService, IOutboundOrderService outboundOrderService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
        {
            _mapper = mapper;
            _stockInfoDetailRepository = stockInfoDetailRepository;
@@ -37,6 +38,7 @@
            _locationInfoService = locationInfoService;
            _outboundOrderService = outboundOrderService;
            _allocateRepository = allocateRepository;
            _unitOfWorkManage = unitOfWorkManage;
            //_outboundOrderDetailService = outboundOrderDetailService;
        }
@@ -55,7 +57,34 @@
            return stockInfo;
        }
        public override WebResponseContent DeleteData(object[] keys)
        {
            try
            {
                List<int> stockIds = keys.Select(x => x.ObjToInt()).ToList();
                List<Dt_StockInfo> stockInfos = BaseDal.QueryData(x => stockIds.Contains(x.Id) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt());
                List<string> locationCodes = stockInfos.Select(x => x.LocationCode).Distinct().ToList();
                List<Dt_LocationInfo> locationInfos = _locationInfoService.Repository.QueryData(x => locationCodes.Contains(x.LocationCode) && x.LocationStatus == LocationStatusEnum.Pallet.ObjToInt());
                stockInfos = stockInfos.Where(x => locationInfos.Select(l => l.LocationCode).Contains(x.LocationCode)).ToList();
                _unitOfWorkManage.BeginTran();
                _locationInfoService.UpdateLocationStatus(locationInfos, LocationStatusEnum.Free);
                BaseDal.DeleteAndMoveIntoHty(stockInfos, WIDESEA_Core.Enums.OperateTypeEnum.人工删除);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK("删除成功");
            }
            catch(Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error("删除失败,"+ex.Message);
            }
        }
        public void AddMaterielGroup(Dt_StockInfo stockInfo)
        {
            decimal beforeQuantity = 0;
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer.sln
@@ -76,6 +76,12 @@
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LogLibrary", "LogLibrary\LogLibrary.csproj", "{A7C339A4-CC00-2872-6005-A272626BC5F1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BigGreen", "BigGreen", "{23BE058E-6D08-4075-99BD-8054DC328FFE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBigBreenService", "IBigBreen\IBigBreenService.csproj", "{21939E11-C422-4E19-BDD6-333804F5128C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BigGreenService", "BigGreenService\BigGreenService.csproj", "{2CB630FF-FEB0-46DB-B2A1-88F34DB91725}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
@@ -374,6 +380,30 @@
        {A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|Any CPU.Build.0 = Release|Any CPU
        {A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|x86.ActiveCfg = Release|x86
        {A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|x86.Build.0 = Release|x86
        {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|x86.ActiveCfg = Debug|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|x86.Build.0 = Debug|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|Any CPU.ActiveCfg = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|Any CPU.Build.0 = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|x86.ActiveCfg = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|x86.Build.0 = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Release|Any CPU.Build.0 = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Release|x86.ActiveCfg = Release|Any CPU
        {21939E11-C422-4E19-BDD6-333804F5128C}.Release|x86.Build.0 = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|x86.ActiveCfg = Debug|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|x86.Build.0 = Debug|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|Any CPU.ActiveCfg = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|Any CPU.Build.0 = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|x86.ActiveCfg = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|x86.Build.0 = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|Any CPU.Build.0 = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|x86.ActiveCfg = Release|Any CPU
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|x86.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
@@ -406,6 +436,9 @@
        {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {60DE2920-37C6-4C2B-A053-6B1B2DAF047A}
        {D35E0897-0E66-4E1E-B8DA-28701BE3B2B7} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
        {A6E822A3-5A09-4B18-BEE6-57CC7D7B8BEC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
        {23BE058E-6D08-4075-99BD-8054DC328FFE} = {60DE2920-37C6-4C2B-A053-6B1B2DAF047A}
        {21939E11-C422-4E19-BDD6-333804F5128C} = {23BE058E-6D08-4075-99BD-8054DC328FFE}
        {2CB630FF-FEB0-46DB-B2A1-88F34DB91725} = {23BE058E-6D08-4075-99BD-8054DC328FFE}
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {599A7267-7402-4143-84AE-9B407FC2BB69}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs
@@ -57,5 +57,17 @@
            var lists = Service.GetLocationTypes();
            return WebResponseContent.Instance.OK("", lists);
        }
        [HttpPost, Route("LocationDisableStatus")]
        public WebResponseContent LocationDisableStatus([FromBody]int[] keys)
        {
            return Service.LocationDisableStatus(keys);
        }
        [HttpPost, Route("LocationEnableStatus")]
        public WebResponseContent LocationEnableStatus([FromBody] int[] keys)
        {
            return Service.LocationEnableStatus(keys);
        }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/BigGreen/BigScreenController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
using IBigBreenService;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
namespace WIDESEA_WMSServer.Controllers.BigGreen
{
    [Route("api/BigScreen")]
    [ApiController]
    public class BigScreenController : ControllerBase
    {
        private readonly IBigGreenService _bigGreenService;
        public BigScreenController(IBigGreenService bigGreenService)
        {
            _bigGreenService = bigGreenService;
        }
        [HttpGet, Route("GetBigGreenData"),AllowAnonymous]
        public WebResponseContent GetBigGreenData()
        {
            return _bigGreenService.GetBigGreenData();
        }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Text;
using WIDESEA.QuartzJob;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
namespace WIDESEA_WMSServer
@@ -36,6 +37,12 @@
                    },
                };
                //Console.WriteLine("HostEnvironment"+App.HostEnvironment.IsDevelopment());
                if(App.HostEnvironment.IsDevelopment())
                {
                    return;
                }
                foreach (var item in allQzServices)
                {
                    var ResuleModel = schedulerCenter.AddScheduleJobAsync(item).Result;
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
@@ -55,6 +55,7 @@
    </ItemGroup>
    
    <ItemGroup>
      <ProjectReference Include="..\BigGreenService\BigGreenService.csproj" />
      <ProjectReference Include="..\WIDESEA_AllocateService\WIDESEA_AllocateService.csproj" />
      <ProjectReference Include="..\WIDESEA_BasicService\WIDESEA_BasicService.csproj" />
      <ProjectReference Include="..\WIDESEA_CheckService\WIDESEA_CheckService.csproj" />