83df727c07ac502ae0c82eafad89a3e98d6db34c..3665d6ab60f25c79cc0eba2ea754b310c37992c0
2025-11-11 admin
首页
3665d6 对比 | 目录
2025-11-11 admin
首页库存和仓库
daf065 对比 | 目录
2025-11-11 admin
首页库存和仓库接口
07cafb 对比 | 目录
10个文件已修改
1193 ■■■■■ 已修改文件
HTML/.vscode/settings.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/js/public.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/home/console2.html 682 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/js/public.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/DataDto/MateDataStockDto.cs 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockServer.cs 246 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockServer.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Startup.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/appsettings.json 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/.vscode/settings.json
@@ -1,3 +1,4 @@
{
    "liveServer.settings.port": 5503
    "liveServer.settings.port": 5503,
    "editor.wordWrap": "on"
}
HTML/js/public.js
@@ -1,12 +1,18 @@
//var IP = "http://47.104.149.73:1991";//接口IP
// var IP = "http://172.16.71.101:8082/";//接口IP
//var IP = "http://172.16.71.101:8082/";//接口IP
//var IP = "http://localhost:13243/api";
//var IP = "http://localhost:50515/api";  //本地
var IP="https://localhost:44363/api";
// var IP = "http://localhost:44318/api";
//var IP = "http://localhost:50515/api";//本地
//var IP = "http://localhost:44318/api";
//var IP = "http://192.168.1.6:8017";
//var IP = "http://192.168.1.226:8086";  
// var IP = "http://192.168.62.200:8888/api";  //bkl服务器
//var IP = "http://192.168.62.200:8888/api";//bkl服务器
//运行
//var IP="https://localhost:44363/api";
//本地发布
var IP="http://localhost:8034/api";
var pageCnt = 15;
var pageLimits = [10, 15, 20, 30, 50, 70, 100];
HTML/views/home/console2.html
@@ -2,30 +2,30 @@
<html>
<head>
    <meta charset="utf-8">
    <title>layuiAdmin 控制台主页一</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
    <style type="text/css">
        html,
        body {
            height: 100%;
        }
    <meta charset="utf-8">
    <title>layuiAdmin 控制台主页一</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
    <style type="text/css">
        html,
        body {
            height: 100%;
        }
        .ceshi {
            display: flex;
            justify-content: space-around;
        }
        .ceshi {
            display: flex;
            justify-content: space-around;
        }
        .acls {
            display: inline-block;
            width: 125px;
            height: 60px;
        }
        .acls {
            display: inline-block;
            width: 125px;
            height: 60px;
        }
        .water-ball {
            position: relative;
@@ -40,7 +40,8 @@
        .wave {
            position: absolute;
            bottom: 0;
            left: -50%; /* 调整波浪的起始位置 */
            left: -50%;
            /* 调整波浪的起始位置 */
            width: 200%;
            height: 200%;
            background: #00bcd4;
@@ -63,7 +64,8 @@
            font-size: 12px;
            color: #00796b;
            font-weight: bold;
            margin-bottom: 5px; /* 调整文字和百分数之间的间距 */
            margin-bottom: 5px;
            /* 调整文字和百分数之间的间距 */
        }
        .percentage {
@@ -75,17 +77,21 @@
        .gradient-line {
            margin-top: 30px;
            width: 80%;
            height: 2px; /* 线条的高度 */
            background: linear-gradient(to right,
                #74f2e57f, /* 左边浅色 */
                #03d5c0, /* 中间深色 */
                #74f2e57f); /* 右边浅色 */
            height: 2px;
            /* 线条的高度 */
            background: linear-gradient(to right,
                    #74f2e57f,
                    /* 左边浅色 */
                    #03d5c0,
                    /* 中间深色 */
                    #74f2e57f);
            /* 右边浅色 */
            opacity: 0.5;
        }
        .cuboid_group{
        .cuboid_group {
            display: flex;
            justify-content: center;
            align-items: center;
@@ -96,11 +102,14 @@
        }
        .cuboid {
            width: 200px; /* 长方体的宽度 */
            height: 100px; /* 长方体的高度 */
            width: 200px;
            /* 长方体的宽度 */
            height: 100px;
            /* 长方体的高度 */
            position: relative;
            transform-style: preserve-3d;
            transform: rotateX(-25deg) rotateY(45deg); /* 初始旋转角度 */
            transform: rotateX(-25deg) rotateY(45deg);
            /* 初始旋转角度 */
        }
        .cuboid .face {
@@ -113,7 +122,8 @@
            background-color: rgba(0, 123, 255, 0.8);
            border: 2px solid #007bff;
            box-sizing: border-box;
            overflow: hidden; /* 隐藏超出部分 */
            overflow: hidden;
            /* 隐藏超出部分 */
            opacity: 0.6;
        }
@@ -121,43 +131,53 @@
        .cuboid .front {
            width: 100px;
            height: 50px;
            transform: translateZ(25px); /* 向前移动 */
            border-radius: 5px; /* 圆角 */
            transform: translateZ(25px);
            /* 向前移动 */
            border-radius: 5px;
            /* 圆角 */
        }
        /* 后面 */
        .cuboid .back {
            width: 100px;
            height: 50px;
            transform: rotateY(180deg) translateZ(25px); /* 向后移动 */
            border-radius: 5px; /* 圆角 */
            transform: rotateY(180deg) translateZ(25px);
            /* 向后移动 */
            border-radius: 5px;
            /* 圆角 */
        }
        /* 右面 */
        .cuboid .right {
            width: 50px;
            height: 50px;
            transform: rotateY(90deg) translateZ(75px); /* 向右移动 */
            border-radius: 5px; /* 圆角 */
            transform: rotateY(90deg) translateZ(75px);
            /* 向右移动 */
            border-radius: 5px;
            /* 圆角 */
        }
        /* 左面 */
        .cuboid .left {
            width: 50px;
            height: 50px;
            transform: rotateY(-90deg) translateZ(25px); /* 向左移动 */
            transform: rotateY(-90deg) translateZ(25px);
            /* 向左移动 */
            display: flex;
            flex-wrap: wrap;
            justify-content: space-around;
            align-content: space-around;
            background-color: rgba(0, 123, 255, 0.8);
            border-radius: 5px; /* 圆角 */
            border-radius: 5px;
            /* 圆角 */
        }
        /* 窗户样式 */
        .cuboid .left .window {
            width: 16px; /* 窗户宽度 */
            height: 16px; /* 窗户高度 */
            width: 16px;
            /* 窗户宽度 */
            height: 16px;
            /* 窗户高度 */
            background-color: yellow;
        }
@@ -165,71 +185,84 @@
        .cuboid .top {
            width: 100px;
            height: 50px;
            transform: rotateX(90deg) translateZ(25px); /* 向上移动 */
            border-radius: 5px; /* 圆角 */
            transform: rotateX(90deg) translateZ(25px);
            /* 向上移动 */
            border-radius: 5px;
            /* 圆角 */
        }
        /* 底面 */
        .cuboid .bottom {
            width: 100px;
            height: 50px;
            transform: rotateX(-90deg) translateZ(25px); /* 向下移动 */
            border-radius: 5px; /* 圆角 */
            transform: rotateX(-90deg) translateZ(25px);
            /* 向下移动 */
            border-radius: 5px;
            /* 圆角 */
        }
        /* 去掉表格的边框线 */
        .layui-table {
            border: none;
        }
        .layui-table th, .layui-table td {
        .layui-table th,
        .layui-table td {
            border: none;
        }
        /* 去掉表头的下边框 */
        .layui-table thead tr {
            border-bottom: none;
        }
        /* 去掉表格行的下边框 */
        .layui-table tbody tr {
            border-bottom: none;
        }
    </style>
    </style>
</head>
<body>
    <!-- background: radial-gradient(circle,#bce2aa, #6ce6da); -->
    <div class="layui-fluid" style="padding: 10px;height: 97%;">
        <div class="layui-row layui-col-space15" style="height: 100%;">
    <div class="layui-fluid" style="padding: 10px;height: 97%;">
        <div class="layui-row layui-col-space15" style="height: 100%;">
            <!-- 左 -->
            <div class="layui-col-md4" style="height: 100%;margin-top: 10px;">
                <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;">
            <div class="layui-col-md4" style="height: 100%;margin-top: 10px;">
                <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;">
                    <div style="width: 100%;height: 23.33%;">
                        <div class="layui-card-header">
                            <img src="../../img/console/xiexian.png" style="height: 20px;">
                            系统监控
                        </div>
                        <div class="layui-card-body" style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; ">
                            <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                        <div class="layui-card-body"
                            style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; ">
                            <div class="mokuan"
                                style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                                <img src="../../img/console/zaixianyonghu.png" style="width: 30px;">
                                <label style="height: 35px;line-height: 35px;">在线用户数</label>
                                <label style="font-size: 32px;color: #009688;">108</label>
                                <label style="font-size: 32px;color: #009688;">106</label>
                            </div>
                            <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <div class="mokuan"
                                style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                                <img src="../../img/console/PDA.png" style="width: 30px;">
                                <label style="height: 35px;line-height: 35px;">接入PDA数</label>
                                <label style="font-size: 32px;color: #009688;">108</label>
                                <label style="font-size: 32px;color: #009688;">107</label>
                            </div>
                            <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <div class="mokuan"
                                style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                                <img src="../../img/console/pc.png" style="width: 30px;">
                                <label style="height: 35px;line-height: 35px;">接入PC数</label>
                                <label style="font-size: 32px;color: #009688;">108</label>
                                <label style="font-size: 32px;color: #009688;">108</label>
                            </div>
                            <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <div class="mokuan"
                                style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                                <img src="../../img/console/dayinji.png" style="width: 30px;">
                                <label style="height: 35px;line-height: 35px;">接入打印机数</label>
                                <label style="font-size: 32px;color: #009688;">108</label>
                                <label style="font-size: 32px;color: #009688;">109</label>
                            </div>
                        </div>
                        </div>
                    </div>
                    <div style="width: 100%;height: 38.33%;">
                        <div class="layui-card-header">
@@ -237,70 +270,63 @@
                            库存物料类型分布
                        </div>
                        <div class="layui-card-body" style="padding: 0;height: 100%;">
                            <div id="zhuOrder" style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;">
                            <div id="zhuOrder"
                                style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;">
                            </div>
                        </div>
                    </div>
                        </div>
                    </div>
                    <div style="width: 100%;height: 38.33%;">
                        <div class="layui-card-header">
                            <img src="../../img/console/xiexian.png" style="height: 20px;">
                            库存质量状态分布
                        </div>
                        <div class="layui-card-body" style="padding: 0;height: 90%;">
                            <div id="yuanOrder" style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;">
                            <div id="yuanOrder"
                                style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;">
                            </div>
                        </div>
                    </div>
                </div>
            </div>
                        </div>
                    </div>
                </div>
            </div>
            <!-- 中 -->
            <div class="layui-col-md4" style="height: 100%;margin-top: 10px;">
                <div style="width: 100%;height: 15%;">
                    <div class="layui-card-body" style="padding-top: 0px; height: 100%;display: flex; justify-content: space-between;">
                        <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <label style="height: 50px;line-height: 50px;font-size: 36px;color: #009688;font-weight: 600;">5</label>
                            <label style="font-size: 20px;">库区总数</label>
                    <div class="layui-card-body"
                        style="padding-top: 0px; height: 100%;display: flex; justify-content: space-between;">
                        <div class="mokuan"
                            style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <label id="wareHouseNum"
                                style="height: 50px;line-height: 50px;font-size: 36px;color: #009688;font-weight: 600;"></label>
                            <label style="font-size: 20px;">库区总数</label>
                        </div>
                        <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <label style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;">2270</label>
                            <label style="font-size: 20px;">库位总数</label>
                        <div class="mokuan"
                            style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <label id="stockTotal"
                                style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;"></label>
                            <label style="font-size: 20px;">库位总数</label>
                        </div>
                        <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <label style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;">108</label>
                            <label style="font-size: 20px;">已使用库位</label>
                        <div class="mokuan"
                            style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;">
                            <label id="useStock"
                                style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;"></label>
                            <label style="font-size: 20px;">已使用库位</label>
                        </div>
                        <div class="mokuan"style="display: flex;justify-content: center;align-items: center;height: 100px;margin: 0;">
                        <div class="mokuan"
                            style="display: flex;justify-content: center;align-items: center;height: 100px;margin: 0;">
                            <div class="water-ball">
                                <div class="wave"></div>
                                <div class="text-container">
                                    <div class="label">总利用率</div>
                                    <div class="percentage">50%</div>
                                    <div class="percentage" id="allUseRate"></div>
                                </div>
                            </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div style="width: 100%;height: 85%;display: flex;  align-items: center;flex-direction: column;">
                    <div class="gradient-line"></div>
                    <div style="width: 300px;height: 120px;box-shadow: 0px 0px 10px 1px #009688; border-radius:15px;margin-top: 30px;">
                        <div class="layui-card-header">
                            <img src="../../img/console/xiexian.png" style="height: 20px;">
                            原辅料仓库,常温库区
                        </div>
                        <div class="layui-card-body" style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; ">
                            <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;">
                                <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">1008</label>
                                <label style="font-size: 18px;">库位总数</label>
                            </div>
                            <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;">
                                <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">270</label>
                                <label style="font-size: 18px;">已使用</label>
                            </div>
                        </div>
                    </div>
                    <div id="warehouseInfo"></div>
                    <!-- <div style="width: auto;height: 220px;display: grid;align-items: center; justify-content: center; grid-template-columns: repeat(3, 1fr);  gap: 10px;margin-top: 30px;">
                        <div class="cuboid_group">
@@ -380,19 +406,20 @@
                        </div>
                        
                    </div> -->
                </div>
                </div>
            </div>
            <!-- 右 -->
            <div class="layui-col-md4" style="height: 100%;margin-top: 10px;">
                <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;">
                    <div style="width: 100%;height: 33.33%;">
            <!-- 右 -->
            <div class="layui-col-md4" style="height: 100%;margin-top: 10px;">
                <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;">
                    <div style="width: 100%;height: 33.33%;">
                        <div class="layui-card-header">
                            <img src="../../img/console/xiexian.png" style="height: 20px;">
                            近一月热度物料
                        </div>
                        <div class="layui-card-body" style="padding: 0;height: 90%;width: 90%;margin-left: 5%;">
                            <table id="LAY-app-content-list" lay-filter="LAY-app-content-list"border="0" cellpadding="0" cellspacing="0"></table>
                        </div>
                            <table id="LAY-app-content-list" lay-filter="LAY-app-content-list" border="0"
                                cellpadding="0" cellspacing="0"></table>
                        </div>
                    </div>
                    <div style="width: 100%;height: 33.33%;">
                        <div class="layui-card-header">
@@ -401,22 +428,23 @@
                        </div>
                        <div class="layui-card-body" style="padding: 0;height: 90%;width: 90%;margin-left: 5%;">
                            <table id="LAY-app-content-list2" lay-filter="LAY-app-content-list2"></table>
                        </div>
                    </div>
                        </div>
                    </div>
                    <div style="width: 100%;height: 33.33%;">
                        <div class="layui-card-header">
                            <img src="../../img/console/xiexian.png" style="height: 20px;">
                            月度出入库趋势
                        </div>
                        <div class="layui-card-body" style="padding: 0;height: 90%;">
                            <div id="xianOrder" style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;">
                            <div id="xianOrder"
                                style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;">
                            </div>
                        </div>
                    </div>
                </div>
            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </div>
    <script src="../../layuiadmin/layui/layui.js?t=1"></script>
    <script src="../../layuiadmin/layui/layui.js?t=1"></script>
@@ -430,7 +458,7 @@
        }).extend({
            index: 'lib/index', //主入口模块
        });
        // 直接使用全局的 echarts
        var echarts = window.echarts;
@@ -441,140 +469,188 @@
                laypage = layui.laypage,
                layer = layui.layer
            //库存物料类型分布(柱状)
            this.chartLine = echarts.init(document.getElementById("zhuOrder"));
            option = {
                xAxis: {
                    type: 'category',
                    data: ['成品', '原料', '外包材', '内包材', '中间品', '耗材'],
                    axisLine: { show: false }, // 隐藏 x 轴线
                    axisTick: { show: false }, // 隐藏 x 轴刻度线
                },
                yAxis: {
                    type: 'value'
                },
                grid: {
                    top:'5%',
                    containLabel: true
                },
                series: [
                    {
                        data: [
                            {
                                value: 120,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                        { offset: 0, color: '#37A2FF' },
                                        { offset: 1, color: '#9EE7FF' }
                                    ]),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            },
                            {
                                value: 200,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                        { offset: 0, color: '#FF9F7F' },
                                        { offset: 1, color: '#FFD97F' }
                                    ]),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            },
                            {
                                value: 150,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                        { offset: 0, color: '#73F0A0' },
                                        { offset: 1, color: '#B8F7D4' }
                                    ]),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            },
                            {
                                value: 80,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                        { offset: 0, color: '#FF6B6B' },
                                        { offset: 1, color: '#FFA8A8' }
                                    ]),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            },
                            {
                                value: 70,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                        { offset: 0, color: '#A28DFF' },
                                        { offset: 1, color: '#D5C7FF' }
                                    ]),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            },
                            {
                                value: 110,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                        { offset: 0, color: '#FFD700' },
                                        { offset: 1, color: '#FFFACD' }
                                    ]),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            }
                        ],
                        type: 'bar',
                        barWidth: '30%',
                        showBackground: true,
                        backgroundStyle: {
                            color: 'rgba(180, 180, 180, 0.2)',
                            borderRadius: [25, 25, 0, 0]
                        }
                    }
                ]
            };
            this.chartLine.setOption(option);
            //库存质量状态分布(饼状)
            this.chartYuan = echarts.init(document.getElementById("yuanOrder"));
            var option2;
            option2 = {
                tooltip: {
                    trigger: 'item'
                },
                legend: {
                    top: '5%',
                    left: 'center'
                },
                series: [
                {
                    name: '数量',
                    type: 'pie',
                    radius: ['40%', '70%'],
                    avoidLabelOverlap: false,
                    itemStyle: {
                        borderRadius: 10,
                        borderColor: '#fff',
                        borderWidth: 2
                    },
                    label: {
                        show: true, // 显示标签
                        position: 'outside', // 标签位置在饼图外部
                        formatter: '{b}: {c} ({d}%)' // 标签格式,显示名称、值和百分比
                    },
                    labelLine: {
                        show: true, // 显示引导线
                        length: 20, // 第一段引导线的长度
                        length2: 30 // 第二段引导线的长度
                    },
                    data: [
                        { value: 1048, name: '合格' },
                        { value: 735, name: '不合格' },
                        { value: 580, name: '待验证' }
                    ]
                }]
            //库存物料类型分布(柱状)
            refreshGoodsTypeFb();
            function refreshGoodsTypeFb() {
                var param = {};
                sendData(IP + "/Statistical/GetGoodsTypeFb", param, 'get', function (res) {
                    if (res.code == 0) { //成功
                        this.chartLine = echarts.init(document.getElementById("zhuOrder"));
                        var goodsType = [];
                        var seriesData = [];
                        // 定义颜色渐变数组
                        var colorGradients = [
                            [
                                { offset: 0, color: '#37A2FF' },
                                { offset: 1, color: '#9EE7FF' }
                            ],
                            [
                                { offset: 0, color: '#FF9F7F' },
                                { offset: 1, color: '#FFD97F' }
                            ],
                            [
                                { offset: 0, color: '#73F0A0' },
                                { offset: 1, color: '#B8F7D4' }
                            ],
                            [
                                { offset: 0, color: '#A28DFF' },
                                { offset: 1, color: '#D5C7FF' }
                            ],
                            [
                                { offset: 0, color: '#FFD700' },
                                { offset: 1, color: '#FFFACD' }
                            ]
                        ];
                        //正确遍历数组并处理数据
                        res.data.forEach(function (item, index) {
                            goodsType.push(item.TypeName);
                            //动态创建数据项,避免硬编码
                            var dataItem = {
                                value: item.TypeNum,
                                itemStyle: {
                                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1,
                                        colorGradients[index % colorGradients.length] // 循环使用颜色
                                    ),
                                    borderRadius: [15, 15, 0, 0]
                                }
                            };
                            seriesData.push(dataItem);
                        });
                        var option = {
                            title: {
                                //text: '库存物料类型分布',
                                left: 'center',
                                textStyle: {
                                    fontSize: 16,
                                    fontWeight: 'bold'
                                }
                            },
                            tooltip: {
                                trigger: 'axis',
                                axisPointer: {
                                    type: 'shadow'
                                },
                                formatter: function (params) {
                                    var data = params[0];
                                    return data.name + ': ' + data.value;
                                }
                            },
                            xAxis: {
                                type: 'category',
                                data: goodsType,
                                axisLine: { show: false },
                                axisTick: { show: false },
                                axisLabel: {
                                    interval: 0,
                                    rotate: 0 // 如果分类名太长可以设置旋转
                                }
                            },
                            yAxis: {
                                type: 'value',
                                name: '数量'
                            },
                            grid: {
                                top: '15%',
                                left: '3%',
                                right: '4%',
                                bottom: '3%',
                                containLabel: true
                            },
                            series: [
                                {
                                    data: seriesData,
                                    type: 'bar',
                                    barWidth: '30%',
                                    showBackground: true,
                                    backgroundStyle: {
                                        color: 'rgba(180, 180, 180, 0.2)',
                                        borderRadius: [25, 25, 0, 0]
                                    },
                                    label: {
                                        show: true,
                                        position: 'top',
                                        formatter: '{c}'
                                    }
                                }
                            ]
                        };
                        this.chartLine.setOption(option);
                    }
                    else { //不成功
                        layer.msg('获取总量列表信息失败!', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function () { });
                    }
                });
            };
            this.chartYuan.setOption(option2);
            //库存质量状态分布(饼状)
            refreshQualityStatusFb();
            function refreshQualityStatusFb() {
                var param = {};
                sendData(IP + "/Statistical/GetQualityStatusFb", param, 'get', function (res) {
                    if (res.code == 0) { //成功
                        //库存质量状态分布(饼状)
                        this.chartYuan = echarts.init(document.getElementById("yuanOrder"));
                        var option2 = {
                            tooltip: {
                                trigger: 'item'
                            },
                            legend: {
                                top: '5%',
                                left: 'center'
                            },
                            series: [{
                                name: '数量',
                                type: 'pie',
                                radius: ['40%', '75%'],
                                avoidLabelOverlap: false,
                                itemStyle: {
                                    borderRadius: 10,
                                    borderColor: '#fff',
                                    borderWidth: 2
                                },
                                label: {
                                    show: true, // 显示标签
                                    position: 'outside', // 标签位置在饼图外部
                                    formatter: '{b}: {c} ({d}%)' // 标签格式,显示名称、值和百分比
                                },
                                labelLine: {
                                    show: true, // 显示引导线
                                    length: 20, // 第一段引导线的长度
                                    length2: 30 // 第二段引导线的长度
                                },
                                data: res.data.map(function (item) {
                                    return {
                                        name: item.TypeName,
                                        value: item.TypeNum
                                    };
                                })
                            }]
                        };
                        this.chartYuan.setOption(option2);
                    }
                    else { //不成功
                        layer.msg('获取总量列表信息失败!', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function () { });
                    }
                });
            };
            //获取月度出入库趋势(折线)
            this.chartXian = echarts.init(document.getElementById("xianOrder"));
@@ -591,9 +667,9 @@
                    data: ['入库', '出库']
                },
                grid: {
                    top: '15%',
                    left:'5%',
                    bottom:'15%',
                    top: '15%',
                    left: '5%',
                    bottom: '15%',
                    containLabel: true
                },
                toolbox: {
@@ -627,11 +703,77 @@
                ]
            };
            this.chartXian.setOption(option3);
            //仓库状况总
            refreshWarehouseState();
            function refreshWarehouseState() {
                var param = {
                };
                sendData(IP + "/Statistical/GetWareHouseState", param, 'get', function (res) {
                    if (res.code == 0) { //成功
                        $("#wareHouseNum").append(res.data.WarehouseNum);
                        $("#stockTotal").append(res.data.StockAllNum);
                        $("#useStock").append(res.data.StockUseNum);
                        $("#allUseRate").append(res.data.StockUseRate);
                        setPercentage(parseFloat(res.data.StockUseRate.replace('%', '')));
                    }
                    else { //不成功
                        layer.msg('获取总量列表信息失败!', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function () { });
                    }
                });
            }
            //仓库详情
            refreshWarehouseInfo();
            function refreshWarehouseInfo() {
                var param = {
                };
                sendData(IP + "/Statistical/GetWareHouseStateInfo", param, 'get', function (res) {
                    if (res.code == 0) { //成功
                        var html = '';
                        res.data.forEach(function (item) {
                            html += `<div style="width: 300px;height: 120px;box-shadow: 0px 0px 10px 1px #009688; border-radius:15px;margin-top: 40px;">
                        <div class="layui-card-header"> <img src="../../img/console/xiexian.png" style="height: 20px;">${item.WarehouseName}</div>
                        <div class="layui-card-body"
                            style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; ">
                            <div class="mokuan"
                                style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;">
                                <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">${item.StockAllNum}</label>
                                <label style="font-size: 18px;">库位总数</label>
                            </div>
                            <div class="mokuan"
                                style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;">
                                <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">${item.StockUseNum}</label>
                                <label style="font-size: 18px;">已使用</label>
                            </div>
                        </div>
                    </div>`;
                        })
                        $('#warehouseInfo').html(html);
                    }
                    else { //不成功
                        layer.msg('获取总量列表信息失败!', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function () { });
                    }
                });
            }
            //近一月热度物料
            refreshTable();
            function refreshTable() {
                infoOptions = {
                infoOptions = {
                    elem: '#LAY-app-content-list',
                    height: 'full-600',
                    id: 'LAY-app-content-list',
@@ -669,7 +811,7 @@
                        }, function () { });
                    }
                });
            }
            }
            //安全库存预警
@@ -684,19 +826,19 @@
                    limits: pageLimits,
                    cellMinWidth: 60, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                    even: true,
                    cols:[[
                        {field: '',title: '序号',type:'numbers',fixed: 'left', "disabled": true},
                        {field: 'SkuNo', title: '物料编码', align: 'center'},
                        {field: 'SkuName', title: '物料名称', align: 'center'},
                        {title: '批次', field: 'LotNo', align: 'center'},
                        {field: 'ResidueQty', title: '剩余数量', align: 'center'},
                    ]]
                    cols: [[
                        { field: '', title: '序号', type: 'numbers', fixed: 'left', "disabled": true },
                        { field: 'SkuNo', title: '物料编码', align: 'center' },
                        { field: 'SkuName', title: '物料名称', align: 'center' },
                        { title: '批次', field: 'LotNo', align: 'center' },
                        { field: 'ResidueQty', title: '剩余数量', align: 'center' },
                    ]]
                };
                var param = {
                };
                sendData(IP + "/Statistical/GetInventoryWarning", param, 'get', function(res) {
                sendData(IP + "/Statistical/GetInventoryWarning", param, 'get', function (res) {
                    if (res.code == 0) { //成功
                        var list = res.data;
                        $.extend(infoOptions2, {
@@ -710,20 +852,20 @@
                        layer.msg('获取低库存物料信息失败!', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function() {});
                        }, function () { });
                    }
                });
            }
            }
            // 设置初始百分比
            setPercentage(50);
            // setPercentage(50);
            function setPercentage(percent) {
                const wave = $('.wave');
                const percentageText = $('.percentage');
                const waterBallHeight = $('.water-ball').height();
                // 计算波浪的高度(百分比越高,波浪越低)
                const waveHeight =(100 - percent) / 100 * waterBallHeight;
                const waveHeight = (100 - percent) / 100 * waterBallHeight;
                // 设置波浪的高度
                wave.css('top', waveHeight + 'px');
Pda/js/public.js
@@ -1,12 +1,18 @@
//  var IP = "http://47.104.149.73:1991";//接口IP
// var IP = "https://localhost:44368";
//var IP = "http://47.104.149.73:1991";//接口IP
//var IP = "https://localhost:44368";
//var IP = "http://localhost:13243/api";
//var IP = "http://localhost:50515/api";
var IP = "https://localhost:44363/api";
//var IP = "http://192.168.1.2:8017/";
// var IP = "http://192.168.10.112/WmsService/";
// var IP = "http://192.168.1.226:8086";
// var IP = "http://192.168.62.200:8888/api";
//var IP = "http://192.168.10.112/WmsService/";
//var IP = "http://192.168.1.226:8086";
//var IP = "http://192.168.62.200:8888/api";
//运行
//var IP = "https://localhost:44363/api";
//本地发布
var IP = "http://localhost:8034/api";
jQuery.support.cors = true;
function sendData(url, data, type, callbackFun) {
    // callbackFun("{}");
Wms/Model/ModelDto/DataDto/MateDataStockDto.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Text;
namespace Model.ModelDto.DataDto
@@ -80,27 +81,27 @@
        /// 储位地址
        /// </summary>
        public string LocatNo { get; set; }
        /// <summary>
        /// 托盘号
        /// </summary>
        public string PalletNo { get; set; }
        /// <summary>
        /// 生产时间
        /// </summary>
        public DateTime ProductionTime { get; set; }
        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime ExpirationTime { get; set; }
        /// <summary>
        /// 状态
        /// </summary>
        public string Status { get; set; }
        /// <summary>
        /// 检验标记
        /// </summary>
@@ -110,17 +111,17 @@
        /// 零托标记
        /// </summary>
        public string BitPalletMark { get; set; }
        /// <summary>
        /// 质量状态
        /// </summary>
        public string InspectStatus { get; set; }
        /// <summary>
        /// 是否裹包
        /// </summary>
        public string IsBale { get; set; }
        /// <summary>
        /// 是否打带
        /// </summary>
@@ -153,7 +154,7 @@
        public string AreaName { get; set; }
        public string AreaNo { get; set; }
        public string LocatNo { get; set; }
        public int Id { get; set; }
        /// <summary>
@@ -268,4 +269,70 @@
    }
    /// <summary>
    /// 仓库库位使用dto
    /// </summary>
    public class WarehouseUseDto
    {
        /// <summary>
        /// 仓库名称
        /// </summary>
        public string WarehouseName { get; set; } = "";
        /// <summary>
        /// 库位总数
        /// </summary>
        public string StockAllNum { get; set; }
        /// <summary>
        /// 库位使用数
        /// </summary>
        public string StockUseNum { get; set; }
    }
    /// <summary>
    /// 仓库概况dto
    /// </summary>
    public class WarehouseStateDto : WarehouseUseDto
    {
        /// <summary>
        /// 库区总数
        /// </summary>
        public string WarehouseNum { get; set; }
        /// <summary>
        /// 总利用率
        /// </summary>
        public string StockUseRate { get; set; }
    }
    /// <summary>
    /// 类型的名称数量比例dto
    /// </summary>
    public class IdNameNumRateDto
    {
        /// <summary>
        /// 类型id
        /// </summary>
        public string TypeId { get; set; }
        /// <summary>
        /// 类型名称
        /// </summary>
        public string TypeName { get; set; }
        /// <summary>
        /// 类型数量
        /// </summary>
        public double TypeNum { get; set; }
        /// <summary>
        /// 类型比例
        /// </summary>
        public string TypeRate { get; set; } = "0%";
    }
}
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -1,8 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Net.WebSockets;
using System.Runtime.Intrinsics.X86;
using System.Security.Claims;
using System.Text;
@@ -14,6 +16,7 @@
using Model.ModelVm.SysVm;
using MySqlConnector;
using SqlSugar;
using Talk.Extensions;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
using WMS.Entity.BllQualityEntity;
@@ -28,9 +31,152 @@
    public class StockServer : DbHelper<DataStock>, IStockServer
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public StockServer() : base(Db)
        {
        }
        /// <summary>
        /// 获取库存物料类型分布
        /// </summary>
        /// <returns></returns>
        public IEnumerable<IdNameNumRateDto> GetGoodsTypeFb()
        {
            string stockNumSql = $@"select a.Type,sum(b.num) as num
    from SysMaterials a
    inner join (select SkuNo,sum(Qty) as num from DataStockDetail where IsDel='0' group by SkuNo) b on b.SkuNo=a.SkuNo
    where a.IsDel='0'
    group by a.Type";
            DataTable stockNumDt = Db.Ado.GetDataTable(stockNumSql);
            var stockNumIE = stockNumDt.Rows.Cast<DataRow>().Select(e => new
            {
                typeName = e["Type"] + "",
                num = e["num"] + ""
            });
            //物料类型
            string goodsTypeSql = $@"select DictNo,DictName,0.00 as num
    from SysDictionary
    where IsDel='0' and ParentNo='MaterialType'
    order by Id";
            DataTable goodsTypeDt = Db.Ado.GetDataTable(goodsTypeSql);
            IEnumerable<IdNameNumRateDto> result = goodsTypeDt.Rows.Cast<DataRow>().Select(e => new IdNameNumRateDto
            {
                TypeId = e["DictNo"] + "",
                TypeName = e["DictName"] + "",
                TypeNum = Convert.ToDouble((stockNumIE.FirstOrDefault(f => f.typeName == e["DictNo"] + "") == null) ? "0.00" : stockNumIE.First(f => f.typeName == e["DictNo"] + "").num),
            });
            return result;
        }
        /// <summary>
        /// 获取库存质量状态分布
        /// </summary>
        /// <returns></returns>
        public IEnumerable<IdNameNumRateDto> GetQualityStatusFb()
        {
            string stockNumSql = $@"select InspectStatus,sum(Qty) as num
    from DataStockDetail
    where IsDel='0' and InspectStatus is not null
    group by InspectStatus";
            DataTable stockNumDt = Db.Ado.GetDataTable(stockNumSql);
            object totalObj = stockNumDt.Compute("sum(num)", "");
            var stockNumIE = stockNumDt.Rows.Cast<DataRow>().Select(e => new
            {
                typeName = e["InspectStatus"] + "",
                num = e["num"] + ""
            });
            //物料类型
            string inspectStatusSql = $@"select DictNo,DictName,0.00 as num,'0%' as rate
    from SysDictionary
    where IsDel='0' and ParentNo='InspectStatus'
    order by Id";
            DataTable goodsTypeDt = Db.Ado.GetDataTable(inspectStatusSql);
            foreach (DataRow dr in goodsTypeDt.Rows)
            {
                var stockNum = stockNumIE.FirstOrDefault(e => e.typeName == dr["DictNo"] + "");
                if (stockNum != null)
                {
                    dr["num"] = stockNum.num;
                    dr["rate"] = (stockNum.num.ToDouble() / Convert.ToDouble(totalObj) * 100.00).ToString("0.00") + "%";
                }
            }
            IEnumerable<IdNameNumRateDto> result = goodsTypeDt.Rows.Cast<DataRow>().Select(e => new IdNameNumRateDto
            {
                TypeId = e["DictNo"] + "",
                TypeName = e["DictName"] + "",
                TypeNum = Convert.ToDouble(e["num"]),
                TypeRate = e["rate"] + ""
            });
            return result;
        }
        /// <summary>
        /// 获取仓库状况总
        /// </summary>
        /// <returns></returns>
        public WarehouseStateDto GetWareHouseState()
        {
            //库区总数
            string houseNumSql = $@"select count(Id) as num
    from SysWareHouse
    where IsDel='0'";
            int houseNum = Db.Ado.GetInt(houseNumSql);
            //库位总数
            string stockNumSql = $@"select count(Id) as num
    from SysStorageLocat
    where IsDel='0'";
            int stockNum = Db.Ado.GetInt(stockNumSql);
            //已使用库位
            string stockUseNumSql = $@"select count(Id) as num
    from SysStorageLocat
    where IsDel='0' and Status='1'";
            int stockUseNum = Db.Ado.GetInt(stockUseNumSql);
            WarehouseStateDto result = new WarehouseStateDto()
            {
                WarehouseNum = houseNum + "",
                StockAllNum = stockNum + "",
                StockUseNum = stockUseNum + "",
                StockUseRate = ((double)stockUseNum / stockNum * 100.00).ToString("0.00") + "%"
            };
            return result;
        }
        /// <summary>
        /// 获取仓库详情
        /// </summary>
        /// <returns></returns>
        public IEnumerable<WarehouseUseDto> GetWareHouseStateInfo()
        {
            string stockUseSql = $@"select a.Id,a.WareHouseNo,a.WareHouseName,b.num as stockNum,c.num as useNum
    from SysWareHouse a
    left join (select WareHouseNo,count(Id) as num from SysStorageLocat where IsDel='0' group by WareHouseNo) b on b.WareHouseNo=a.WareHouseNo
    left join (select WareHouseNo,count(Id) as num from SysStorageLocat where IsDel='0' and Status='1' group by WareHouseNo) c on c.WareHouseNo=a.WareHouseNo
    where a.IsDel='0'
    order by a.WareHouseNo";
            DataTable stockUseDt = Db.Ado.GetDataTable(stockUseSql);
            IEnumerable<WarehouseUseDto> result = stockUseDt.Rows.Cast<DataRow>().Select(e => new WarehouseUseDto
            {
                WarehouseName = e["WareHouseName"] + "",
                StockAllNum = e["stockNum"] + "",
                StockUseNum = e["useNum"] + ""
            });
            return result;
        }
@@ -50,7 +196,7 @@
        /// <param name="wareHouseNo">所属仓库</param>
        /// <param name="areaNo">所属区域</param>
        /// <returns></returns>
        public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo,
        public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo,
            string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo)
        {
            Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
@@ -70,53 +216,53 @@
            var data = Db.Queryable<DataStockDetail>().Where(item);
            List<MateDataStockDto> data2;
            switch (selectType)
            switch (selectType)
            {
                // 按物料统计
                case "0":
                     data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
                            SkuName = a.SkuName, //物料名称
                            Standard = a.Standard, //规格
                            //LotNo = a.LotNo, //批次
                            //LotText = a.LotText, //批次描述
                            //OwnerNo = a.OwnerNo, //货主编码
                            //OwnerName = a.OwnerName, //货主名称
                            Status = status, //库存状态
                            InspectStatus = inspectStatus, //质检状态
                            Qty =  SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                            LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                        }).ToListAsync();
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard })
                       .Select(a => new MateDataStockDto()
                       {
                           SkuNo = a.SkuNo, //物料编码
                           SkuName = a.SkuName, //物料名称
                           Standard = a.Standard, //规格
                                                  //LotNo = a.LotNo, //批次
                                                  //LotText = a.LotText, //批次描述
                                                  //OwnerNo = a.OwnerNo, //货主编码
                                                  //OwnerName = a.OwnerName, //货主名称
                           Status = status, //库存状态
                           InspectStatus = inspectStatus, //质检状态
                           Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                           LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                           FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                           InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                       }).ToListAsync();
                    break;
                // 按批次统计
                case "1":
                     data2 = await data.GroupBy(a => new { a.LotNo, a.LotText, a.SkuNo, a.SkuName, a.Standard })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
                            SkuName = a.SkuName, //物料名称
                            Standard = a.Standard, //规格
                            LotNo = a.LotNo, //批次
                            LotText = a.LotText, //批次描述
                            //OwnerNo = a.OwnerNo, //货主编码
                            //OwnerName = a.OwnerName, //货主名称
                            Status = status, //库存状态
                            InspectStatus = inspectStatus, //质检状态
                            Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                            LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                        }).ToListAsync();
                    data2 = await data.GroupBy(a => new { a.LotNo, a.LotText, a.SkuNo, a.SkuName, a.Standard })
                       .Select(a => new MateDataStockDto()
                       {
                           SkuNo = a.SkuNo, //物料编码
                           SkuName = a.SkuName, //物料名称
                           Standard = a.Standard, //规格
                           LotNo = a.LotNo, //批次
                           LotText = a.LotText, //批次描述
                                                //OwnerNo = a.OwnerNo, //货主编码
                                                //OwnerName = a.OwnerName, //货主名称
                           Status = status, //库存状态
                           InspectStatus = inspectStatus, //质检状态
                           Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                           LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                           FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                           InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                       }).ToListAsync();
                    break;
                // 按质检状态统计
                case "2":
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard,a.InspectStatus})
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.InspectStatus })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
@@ -133,7 +279,7 @@
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty),
                        }).ToListAsync();
                    break;
                    break;
                // 按货主统计
                case "3":
@@ -154,11 +300,11 @@
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty),
                        }).ToListAsync();
                     break;
                    break;
                // 默认统计(物料 批次 质检 库存状态 货主)
                default:
                    data2 = await data.GroupBy(a => new {  a.SkuNo, a.SkuName, a.Standard ,a.LotNo, a.LotText, a.OwnerNo, a.OwnerName , a.InspectStatus })
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.LotNo, a.LotText, a.OwnerNo, a.OwnerName, a.InspectStatus })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
@@ -348,9 +494,9 @@
                .GroupBy(a => new { a.LotNo, a.SkuNo, a.SkuName })
                .Select(a => new TotalRecordDto()
                {
                    LotNo=a.LotNo,
                    SkuNo=a.SkuNo,
                    SkuName=a.SkuName,
                    LotNo = a.LotNo,
                    SkuNo = a.SkuNo,
                    SkuName = a.SkuName,
                    RQty = SqlFunc.AggregateSumNoNull(a.Qty),
                    RFactQty = (decimal)SqlFunc.AggregateSum(a.FactQty),
                    RCompleteQty = (decimal)SqlFunc.AggregateSum(a.CompleteQty),
@@ -435,22 +581,22 @@
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <returns></returns>
        public List<TotalRecordDto> GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo,string startTime, string endTime)
        public List<TotalRecordDto> GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo, string startTime, string endTime)
        {
            // 获取入库单明细信息
            var asnList = Db.Queryable<BllPalletBind,BllArrivalNoticeDetail>
                ((tb1,tb2)=>new JoinQueryInfos(
            var asnList = Db.Queryable<BllPalletBind, BllArrivalNoticeDetail>
                ((tb1, tb2) => new JoinQueryInfos(
                 JoinType.Left, tb1.ASNDetailNo == tb2.Id
                ))
                .Where((tb1,tb2) => tb1.IsDel == "0" && tb2.IsDel == "0")
                .Where((tb1, tb2) => tb1.IsDel == "0" && tb2.IsDel == "0")
                .WhereIF(!string.IsNullOrWhiteSpace(startTime), tb1 => tb1.CompleteTime >= Convert.ToDateTime(startTime))
                .WhereIF(!string.IsNullOrWhiteSpace(endTime), tb1 => tb1.CompleteTime <= Convert.ToDateTime(endTime).AddDays(1))
                .WhereIF(!string.IsNullOrEmpty(palletNo), tb1 => tb1.PalletNo.Contains(palletNo))
                .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1,tb2) => tb2.SkuNo.Contains(skuNo))
                .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1, tb2) => tb2.SkuNo.Contains(skuNo))
                .WhereIF(!string.IsNullOrEmpty(skuName), (tb1, tb2) => tb2.SkuName.Contains(skuName))
                .WhereIF(!string.IsNullOrEmpty(lotNo), (tb1, tb2) => tb2.LotNo.Contains(lotNo))
                //.GroupBy((tb1,tb2) => new { tb2.LotNo, tb2.SkuNo, tb2.SkuName })
                .Select((tb1,tb2) => new TotalRecordDto()
                .Select((tb1, tb2) => new TotalRecordDto()
                {
                    ASNNo = tb2.ASNNo,
                    LotNo = tb1.LotNo,
@@ -463,7 +609,7 @@
                    CompleteTime = tb2.CreateTime,
                    LotText = tb1.LotText,
                    SupplierLot = tb2.SupplierLot,
                    SONo = "",
                    CTaskNo = "",
                    CCreateTime = null,
Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -10,6 +10,34 @@
{
    public interface IStockServer
    {
        /// <summary>
        /// 获取库存物料类型分布
        /// </summary>
        /// <returns></returns>
        IEnumerable<IdNameNumRateDto> GetGoodsTypeFb();
        /// <summary>
        /// 获取库存质量状态分布
        /// </summary>
        /// <returns></returns>
        IEnumerable<IdNameNumRateDto> GetQualityStatusFb();
        /// <summary>
        /// 获取仓库状况总
        /// </summary>
        /// <returns></returns>
        WarehouseStateDto GetWareHouseState();
        /// <summary>
        /// 获取仓库状况详情
        /// </summary>
        /// <returns></returns>
        IEnumerable<WarehouseUseDto> GetWareHouseStateInfo();
        #region 库存明细
        /// <summary>
@@ -26,7 +54,7 @@
        /// <param name="wareHouseNo">所属仓库</param>
        /// <param name="areaNo">所属区域</param>
        /// <returns></returns>
        Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo,
        Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo,
            string status, string inspectStatus, string wareHouseNo, string areaNo);
        /// <summary>
@@ -40,7 +68,7 @@
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        List<StockDetailDto> GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo,
        List<StockDetailDto> GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo,
            string palletNo, string status, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTime);
        #endregion
Wms/Wms/Controllers/StatisticalController.cs
@@ -25,6 +25,8 @@
        private readonly IStockDetailServer _stockDetail; //统计报表
        private readonly IDataBoxInfoServer _dataBoxInfo; //导出
        private readonly IStockInfoServer _stockInfo; //库存信息
        /// <summary>
        /// 构造函数
        /// </summary>
@@ -39,6 +41,76 @@
            _dataBoxInfo = dataBoxInfo;
            _stockInfo = stockInfo; //库存信息
        }
        /// <summary>
        /// 获取库存物料类型分布
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetGoodsTypeFb()
        {
            IEnumerable<IdNameNumRateDto> dtoIE = _stock.GetGoodsTypeFb();
            return Ok(new
            {
                data = dtoIE,
                code = 0,
                msg = "获取仓库详情成功"
            });
        }
        /// <summary>
        /// 获取库存质量状态分布
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetQualityStatusFb()
        {
            IEnumerable<IdNameNumRateDto> dtoIE = _stock.GetQualityStatusFb();
            return Ok(new
            {
                data = dtoIE,
                code = 0,
                msg = "获取仓库详情成功"
            });
        }
        /// <summary>
        /// 获取仓库状况总
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetWareHouseState()
        {
            WarehouseStateDto dto = _stock.GetWareHouseState();
            return Ok(new
            {
                data = dto,
                code = 0,
                msg = "获取仓库概况成功"
            });
        }
        /// <summary>
        /// 获取仓库状况详情
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetWareHouseStateInfo()
        {
            IEnumerable<WarehouseUseDto> dtoIE = _stock.GetWareHouseStateInfo();
            return Ok(new
            {
                data = dtoIE,
                code = 0,
                msg = "获取仓库详情成功"
            });
        }
        #region 库存明细
@@ -109,13 +181,13 @@
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBindList(string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status,
            string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus, string ownerNo, string ownerName,
            string startTime, string endTIme,string WareHouseNo,string AreaNo)
        public IActionResult GetBindList(string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status,
            string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus, string ownerNo, string ownerName,
            string startTime, string endTIme, string WareHouseNo, string AreaNo)
        {
            try
            {
                List<StockDetailDto> boxInfoList = _stockDetail.GetBindList(skuNo, skuName, palletNo, lotNo, boxNo, status, inspectMark,
                List<StockDetailDto> boxInfoList = _stockDetail.GetBindList(skuNo, skuName, palletNo, lotNo, boxNo, status, inspectMark,
                    bitPalletMark, bitBoxMark, inspectStatus, ownerNo, ownerName, startTime, endTIme, WareHouseNo, AreaNo);
                return Ok(new { data = boxInfoList, code = 0, msg = "获取托盘明细成功" });
            }
@@ -175,7 +247,7 @@
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBoxInfo(string id, string skuNo, string skuName, string palletNo, string lotNo,
        public IActionResult GetBoxInfo(string id, string skuNo, string skuName, string palletNo, string lotNo,
            string boxNo, string status, string inspectMark, string bitBoxMark, string inspectStatus, string WareHouseNo, string AreaNo)
        {
            try
Wms/Wms/Startup.cs
@@ -152,16 +152,16 @@
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            //if (env.IsDevelopment())
            //{
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApiDemo v1");
                    c.RoutePrefix = string.Empty;
                });
            }
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApiDemo v1");
                c.RoutePrefix = string.Empty;
            });
            //}
            //全局返回规范
            //app.UseApiResponse();//弃用 改用Filter [ServiceFilter(typeof(ApiResponseActionFilter))]
Wms/Wms/appsettings.json
@@ -15,7 +15,9 @@
    //"ConnectionString": "Server=192.168.62.200;Database=WMS_JC34;User ID=sa;Password=sql2019;Integrated Security=False;"
    //"ConnectionString": "Server=.;Database=WMS_JC09;User ID=sa;Password=sql2019;Integrated Security=False;"
    //"ConnectionString": "Data Source=DESKTOP-0EJDG95\\MSSQLSERVER1;Initial Catalog=WMS_V01;Integrated Security=True;"
    "ConnectionString": "Server=.\\MSSQLSERVER2019;Database=WMS_JC34;User ID=sa;Password=admin2023@;Integrated Security=False;"
    //"ConnectionString": "Server=.\\MSSQLSERVER2019;Database=WMS_JC34;User ID=sa;Password=admin2023@;Integrated Security=False;",
    //本地地址
    "ConnectionString": "Server=localhost;Database=WMS_JC34;User ID=sa;Password=root1234;Integrated Security=False;"
  },
  "JWTConfig": {
    "Issuer": "WYY", //Token      
@@ -25,7 +27,8 @@
  },
  "ApiUrlConfig": {
    "ErpHost": "http://172.16.68.156:50000", //erpIP
    "WcsHost": "http://10.26.254.34:5005", //wcsIPhttp://localhost:57061/
    //"WcsHost": "http://10.26.254.34:5005", //wcsIPhttp://localhost:57061/
    "WcsHost": "http://localhost:9034", //wcsIPhttp://localhost:57061/
    "BoxHost": "http://10.110.24.30:8081", //boxIP
    "LimesHost": "http://10.110.24.30:8081", //LimesIP
@@ -51,7 +54,9 @@
  },
  "Quartz": {
    "dbProviderName": "SqlServer",
    "ConnectionString": "Server=.\\MSSQLSERVER2019;Database=QRTZ;User ID=sa;Password=admin2023@;Integrated Security=False;"
    //"ConnectionString": "Server=.\\MSSQLSERVER2019;Database=QRTZ;User ID=sa;Password=admin2023@;Integrated Security=False;"
    //本地地址
    "ConnectionString": "Server=localhost;Database=WMS_JC34QRTZ;User ID=sa;Password=root1234;Integrated Security=False;"
    //"connectionString": "Server=192.168.62.200;Database=WMS_JC34QRTZ;User ID=sa;Password=sql2019;Integrated Security=False;"
    //"connectionString": "Server=10.26.200.29;Database=WMS_JC34QRTZ;User ID=sa;Password=boxline@2016;Integrated Security=False;"
  }