增加年度报表页面,修改年度报表自适应代码,编写后台获取单据总表与明细方法。
4个文件已添加
3个文件已修改
1313 ■■■■■ 已修改文件
HTML/views/StatisticalReport/PeriodicReport.html 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/PeriodicReportYear.html 701 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/DataDto/AssSoDateStockInfoDto.cs 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelVm/DataVm/DataStockInfoVM.cs 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockServer.cs 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockServer.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/PeriodicReport.html
HTML/views/StatisticalReport/PeriodicReportYear.html
New file
@@ -0,0 +1,701 @@
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>年度报表</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">
        <link rel="stylesheet" href="../../css/public.css" media="all">
        <style type="text/css">
            .layui-form-item .layui-inline {
                margin-bottom: 1px;
                margin-right: 1px;
            }
        </style>
        <script>
            // 这里是需要在页面渲染之前执行的代码
            document.addEventListener("DOMContentLoaded", function() {
                //获取table默认显示数
                pageCntFirst();
                //判断是否开启table列表列宽调整功能。
                GetIsSetColW();
            });
          </script>
    </head>
    <body id="body">
        <div class="layui-fluid" style="padding-bottom: 0;">
            <div class="layui-card">
                <div class="layui-form layui-card-header layuiadmin-card-header-auto" id="top">
                    <div class="layui-form-item" style="margin-bottom: 0px;">
                        <div class="layui-inline">
                            <label class="layui-form-label">开始日期</label>
                            <div class="layui-input-inline">
                                <input type="text" autocomplete="off" name="StartTime" id="StartTime" class="layui-input"
                                    placeholder="开始日期">
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">结束日期</label>
                            <div class="layui-input-inline">
                                <input type="text" autocomplete="off" name="EndTime" id="EndTime" class="layui-input"
                                    placeholder="结束日期">
                            </div>
                        </div>
                        <div class="layui-inline sousuo">
                            <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-submit lay-filter="LAY-app-contlist-search">
                                <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>搜索
                            </button>
                            <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-submit
                                lay-filter="daochu">
                                <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>导出
                            </button>
                        </div>
                    </div>
                </div>
                <div id="center"></div>
                <div class="layui-card-body">
                    <div style="position: relative;">
                        <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
                            <ul class="layui-tab-title" id="tab">
                                <li  class="layui-this">总表</li>
                                <li >明细</li>
                            </ul>
                            <div id="center">
                            </div>
                            <div class="layui-tab-content">
                                <!-- 单据总表 -->
                                <div class="layui-tab-item layui-show">
                                    <div class="position-relative"><!-- class="position-relative" --><!-- 自定义表头加上 -->
                                        <table id="LAY-app-content-list" lay-filter="LAY-app-content-list"></table>
                                        <!-- #region 自定义表头 -->
                                        <div class="headerSetIcon">
                                            <button class="layui-btn layui-btn-primary layui-btn-sm" data-type="customCols">
                                                <i class="layui-icon">&#xe610;</i>
                                            </button>
                                        </div>
                                        <!-- #endregion -->
                                    </div>
                                </div>
                                <!-- 单据明细 -->
                                <div class="layui-tab-item">
                                    <div class="position-relative"><!-- class="position-relative" --><!-- 自定义表头加上 -->
                                        <table id="LAY-app-content-list2" lay-filter="LAY-app-content-list2"></table>
                                        <!-- #region 自定义表头 -->
                                        <div class="headerSetIcon">
                                            <button class="layui-btn layui-btn-primary layui-btn-sm" data-type="customCols2">
                                                <i class="layui-icon">&#xe610;</i>
                                            </button>
                                        </div>
                                        <!-- #endregion -->
                                        <!-- #region 自定义表头 -->
                                        <!-- 入库重量 -->
                                        <script type="text/html" id="InspectASNWeight">
                                            {{# function GetBtn(d){
                                                    return (d.ASNQty * d.Weight).toFixed(4);
                                                }
                                            }}
                                            {{ GetBtn(d) }}
                                        </script>
                                        <!-- 出库重量 -->
                                        <script type="text/html" id="InspectSOWeight">
                                            {{# function GetBtn1(d){
                                                    return (d.SOQty * d.Weight).toFixed(4);
                                                }
                                            }}
                                            {{ GetBtn1(d) }}
                                        </script>
                                        <!-- 结存重量 -->
                                        <script type="text/html" id="InspectASNSOWeight">
                                            {{# function GetBtn2(d){
                                                    return (d.ASNSOQty * d.Weight).toFixed(4);
                                                }
                                            }}
                                            {{ GetBtn2(d) }}
                                        </script>
                                        <!-- #endregion -->
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <!-- 类型 -->
                    <script type="text/html" id="buttonType">
                        {{# if(d.Type=='0'){ }}
                            <p>原料</p>
                        {{# } else if(d.Type=='1') { }}
                            <p>包材</p>
                        {{# } else if(d.Type=='2') { }}
                            <p>成品</p>
                        {{# } else if(d.Type=='3') { }}
                            <p>耗材</p>
                        {{# } else if(d.Type=='4') { }}
                            <p>中间品</p>
                        {{# } }}
                    </script>
                </div>
            </div>
        </div>
        <script src="../../layuiadmin/layui/layui.js"></script>
        <script src="../../js/public.js"></script>
        <script src="../../js/jquery-3.5.1.min.js"></script>
        <script src="../../js/jquery.cookie.js"></script>
        <script>
            var uid = $.cookie('userId');
            layui.config({
                base: '../../layuiadmin/' //静态资源所在路径
            }).extend({
                index: 'lib/index' //主入口模块
            }).use(['index', 'table', 'laypage', 'layer','element','laydate'], function() {
                var table = layui.table,
                    form = layui.form,
                    laypage = layui.laypage,
                    layer = layui.layer;
                    element = layui.element;
                    laydate = layui.laydate;
                laydate.render({
                    elem: '#StartTime',
                    format: 'yyyy-MM-dd' //可任意组合
                });
                laydate.render({
                    elem: '#EndTime',
                    format: 'yyyy-MM-dd' //可任意组合
                });
                //获取当前时间
                function getNowTime() {
                    var date = new Date();
                    //年 getFullYear():四位数字返回年份
                    var year = date.getFullYear(); //getFullYear()代替getYear()
                    //月 getMonth():0 ~ 11
                    var month = date.getMonth() + 1;
                    //日 getDate():(1 ~ 31)
                    var day = date.getDate();
                    //时 getHours():(0 ~ 23)
                    var hour = date.getHours();
                    //分 getMinutes(): (0 ~ 59)
                    var minute = date.getMinutes();
                    //秒 getSeconds():(0 ~ 59)
                    var second = date.getSeconds();
                    var time = year + addZero(month) + addZero(day) + addZero(hour) + addZero(minute) + addZero(second);
                    return time;
                    //小于10的拼接上0字符串
                };
                function addZero(s) {
                    return s < 10 ? ('0' + s) : s;
                };
                // 表单需要的变量
                var infoOptions;
                var infoOptions2;
                var myDate = new Date();
                // console.log(myDate.getFullYear()+'-'+(myDate.getMonth() + 1)+'-'+myDate.getDate()+' 00:00:00')
                myDate.getFullYear(); //获取完整的年份(4位,1970-????)
                myDate.getMonth(); //获取当前月份(0-11,0代表1月)
                myDate.getDate(); //获取当前日(1-31)
                // 每日初始时间
                var chudate = myDate.getFullYear()+'-'+(myDate.getMonth() + 1)+'-'+myDate.getDate()+' 00:00:00'
                var jiedate = myDate.getFullYear()+'-'+(myDate.getMonth() + 1)+'-'+myDate.getDate()+' 23:59:59'
                var $ = layui.$;
                var yemianid =0;
                var h1 = GetTableTabHeight();
                refreshTable("","");
                //获取出入库总量
                function refreshTable(StartTime,EndTime) {
                    //#region 自定义表头
                    var colsJson
                    var param1={
                        Href:'Statistical/GetAssSoInfo'
                    };
                    sendData(IP + "/Sys/GetTableColsByUserId", param1, 'post', function(res) {
                        if (res.code == 0){
                            if(res.data=='' || res.data==undefined || res.data==null){
                                colsJson=TotalColsArr
                            }else{
                                colsJson= eval(res.data);
                            }
                        }else{
                            colsJson=TotalColsArr
                        }
                        infoOptions = {
                            elem: '#LAY-app-content-list',
                            height: h1,
                            id: 'LAY-app-content-list',
                            page: true,
                            limit: pageCnt,
                            limits: pageLimits,
                            even: true,
                            cellMinWidth: 80, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                            done: function(){
                                //自定义列宽
                                SetTableColW('LAY-app-content-list','Statistical/GetAssSoInfo',TotalColsSysArr);
                            },
                            cols:colsJson
                        };
                        var param = {
                            StartTime:$("#StartTime").val(),
                            EndTime:$("#EndTime").val(),
                        };
                        sendData(IP + "/Statistical/GetAssSoInfo", param, 'get', function(res) {
                            //console.log(res)
                            if (res.code == 0) { //成功
                                var list = res.data;
                                $.extend(infoOptions, {
                                    data: list
                                });
                                infoOptions.page = {
                                    curr: 1
                                }
                                tableIns = table.render(infoOptions);
                            }
                            else { //不成功
                                layer.msg('获取总量列表信息失败!', {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function() {});
                            }
                        });
                    });
                    //#endregion
                }
                //#region 自定义表头
                var TotalColsArr = [[
                    {field: '',title: '序号',type:'numbers',align: 'center',fixed: 'left', "disabled": true},
                    {field: 'SkuNo', title: '物料编码', align: 'center'},
                    {field: 'SkuName', title: '物料名称', align: 'center',},
                    {field: 'Standard', title: '规格', align: 'center',},
                    {field: 'Type', title: '类型', align: 'center',templet: '#buttonType',},
                    {field: 'Demo',title: '备注',align: 'center',width: 200},
                ]];
                var TotalColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码
                //#endregion
                // 表单需要的变量
                /*var infoOptions = {
                    elem: '#LAY-app-content-list',
                    height: 'full-164',
                    id: 'LAY-app-content-list',
                    page: true,
                    limit: pageCnt,
                    limits: pageLimits,
                    even: true,
                    cellMinWidth: 80, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                    cols:
                    [[
                        {
                            title: '序号',
                            type: 'numbers',
                            fixed: 'left'
                        },
                        {
                            field: 'SkuNo',
                            title: '物料编码',
                            align: 'center'
                        },
                        {
                            field: 'SkuName',
                            title: '物料名称',
                            align: 'center',
                        },
                        {
                            field: 'Standard',
                            title: '规格',
                            align: 'center',
                        },
                        {
                            field: 'Type',
                            title: '类型',
                            align: 'center',
                            templet: '#buttonType',
                        },
                        {
                            field: 'Demo',
                            title: '备注',
                            align: 'center',
                            width: 200
                        },
                    ]]
                };*/
                //获取单据明细
                function refreshTable2(SkuNo,StartTime,EndTime) {
                    //#region 自定义表头
                    var colsJson;
                    var param1={
                        Href:'Statistical/GetAssSoInfoDetail'
                    };
                    sendData(IP + "/Sys/GetTableColsByUserId", param1, 'post', function(res) {
                        if (res.code == 0){
                            if(res.data=='' || res.data==undefined || res.data==null){
                                colsJson=DetailColsArr
                            }else{
                                colsJson= eval(res.data);
                            }
                        }else{
                            colsJson=DetailColsArr
                        }
                        infoOptions2 = {
                            elem: '#LAY-app-content-list2',
                            height: h1,
                            id: 'LAY-app-content-list2',
                            page: true,
                            limit: pageCnt,
                            limits: pageLimits,
                            cellMinWidth: 60, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                            done: function(){
                                //自定义列宽
                                SetTableColW('LAY-app-content-list2','Statistical/GetAssSoInfoDetail',DetailColsSysArr);
                            },
                            cols:colsJson
                        };
                        var param = {
                            skuNo:SkuNo,
                            StartTime:StartTime,
                            EndTime:EndTime,
                        }
                        //console.log(param)
                        sendData(IP + "/Statistical/GetAssSoInfoDetail", param, 'get', function(res) {
                            if (res.code == 0) //成功
                            {
                                var list = res.data;
                                $.extend(infoOptions2, {
                                    data: list
                                });
                                infoOptions2.page = {
                                    curr: 1
                                }
                                tableIns2 = table.render(infoOptions2);
                            }
                            else //不成功
                            {
                                layer.msg('获取明细列表信息失败!', {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function() {});
                            }
                        })
                    });
                    //#endregion
                }
                //#region 自定义表头
                var DetailColsArr = [[
                            {field: '',title: '序号',type:'numbers',fixed: 'left',width:65, "disabled": true},
                            {field: 'SkuNo', title: '物料编码', align: 'center', },
                            {field: 'SkuName', title: '物料名称', align: 'center',},
                            {field: 'NoticeDateTime', title: '单据日期', align: 'center',},
                            {field: 'ASNNo', title: '入库单号', align: 'center',},
                            {field: 'SONo', title: '出库单号', align: 'center',},
                            {field: 'NoticeType', title: '统计类别', align: 'center',},
                            {field: 'ASNQty', title: '入库数量', align: 'center',},
                            {field: 'ASNWeight',title: '入库重量(吨)',align: 'center', templet: '#InspectASNWeight'},
                            {field: 'SOQty',title: '出库数量', align: 'center',},
                            {field: 'SOWeight',title: '出库重量(吨)',align: 'center', templet: '#InspectSOWeight' },
                            {field: 'ASNSOQty',title: '结存数量', align: 'center',},
                            {field: 'ASNSOWeight',title: '结存重量(吨)',align: 'center', emplet: '#InspectASNSOWeight'},
                            {field: 'Weight',title: '理论重量',align: 'center',},
                        ]];
                var DetailColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(DetailColsArr)))//将表头数据进行url编码
                //#endregion
                 // 表单需要的变量
                /*var infoOptions2 = {
                    elem: '#LAY-app-content-list2',
                    height: 'full-164',
                    id: 'LAY-app-content-list2',
                    page: true,
                    limit: pageCnt,
                    limits: pageLimits,
                    even: true,
                    cellMinWidth: 80, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                    cols:
                    [[
                        {
                            title: '序号',
                            type: 'numbers',
                            fixed: 'left',
                        },
                        {
                            field: 'SkuNo',
                            title: '物料编码',
                            align: 'center',
                        },
                        {
                            field: 'SkuName',
                            title: '物料名称',
                            align: 'center',
                        },
                        {
                            field: 'NoticeDateTime',
                            title: '单据日期',
                            align: 'center',
                        },
                        {
                            field: 'ASNNo',
                            title: '入库单号',
                            align: 'center',
                        },
                        {
                            field: 'SONo',
                            title: '出库单号',
                            align: 'center',
                        },
                        {
                            field: 'NoticeType',
                            title: '统计类别',
                            align: 'center',
                        },
                        {
                            field: 'ASNQty',
                            title: '入库数量',
                            align: 'center',
                        },
                        {
                            field: 'ASNWeight',
                            title: '入库重量(吨)',
                            align: 'center',
                            templet: function (d) {
                                return (d.ASNQty * d.Weight).toFixed(4);
                            }
                        },
                        {
                            field: 'SOQty',
                            title: '出库数量',
                            align: 'center',
                        },
                        {
                            field: 'SOWeight',
                            title: '出库重量(吨)',
                            align: 'center',
                            templet: function (d) {
                                return (d.SOQty * d.Weight).toFixed(4);
                            }
                        },
                        {
                            field: 'ASNSOQty',
                            title: '结存数量',
                            align: 'center',
                        },
                        {
                            field: 'ASNSOWeight',
                            title: '结存重量(吨)',
                            align: 'center',
                            templet: function (d) {
                                return (d.ASNSOQty * d.Weight).toFixed(4);
                            }
                        },
                        {
                            field: 'Weight',
                            title: '理论重量',
                            align: 'center',
                        },
                    ]]
                };*/
                //var url = IP + "/Statistical/GetInventoryList1";
                //接受全局变量
                let quanjuskuNo = '';
                //监听搜索
                form.on('submit(LAY-app-contlist-search)', function(data) {
                    var EndTime = $("#EndTime").val();
                    var StartTime = $("#StartTime").val();
                    if(yemianid == 0){
                        quanjuskuNo = '';
                        refreshTable(StartTime,EndTime);
                    }else if(yemianid == 1){
                        refreshTable2(quanjuskuNo,StartTime,EndTime);
                    }
                });
                //触发行双击事件
                table.on('rowDouble(LAY-app-content-list)', function(obj) {
                    $(".layui-tab-title>li").attr("class", "");
                    $('.layui-tab-title>li').eq(1).attr('class', 'layui-this');
                    $('.layui-tab-content .layui-tab-item').attr('class', 'layui-tab-item')
                    $('.layui-tab-content .layui-tab-item').eq(1).attr('class', 'layui-tab-item layui-show')
                    //onsole.log(obj.data.SkuNo);
                    quanjuskuNo = obj.data.SkuNo;
                    refreshTable2(quanjuskuNo,$("#StartTime").val(),$("#EndTime").val());
                    yemianid=1;
                });
                //监听Tab切换,以改变地址hash值
                element.on('tab(docDemoTabBrief)', function(data){
                    //console.log(data);
                    yemianid = data.index;
                    if(yemianid == 0){
                        //console.log("总单");
                        refreshTable($("#StartTime").val(),$("#EndTime").val());
                    }else if(yemianid == 1){
                        //console.log("明细");
                        refreshTable2(quanjuskuNo,$("#StartTime").val(),$("#EndTime").val());
                    }
                });
                form.on('submit(daochu)', function () {
                    layer.confirm('确定导出当前数据吗?', function(index) {
                        if(yemianid == 0){
                            //console.log("总单");
                            var param = {
                                // skuNo:SkuNo,
                                StartTime:$("#StartTime").val(),
                                EndTime:$("#EndTime").val(),
                            };
                            sendData(IP + "/Statistical/GetAssSoInfo", param, 'get', function (res) {
                                //console.log(res);
                                if (res.code == 0) { //成功
                                    var list = res.data;
                                    list.forEach(item => {
                                        if (item.SkuName.split(','))
                                        {
                                            item.SkuName = '"'+item.SkuName+'"'
                                        }
                                        switch(item.Type)
                                        {
                                            case '0':
                                                item.Type = "原料"
                                                break;
                                            case '1':
                                                item.Type = "包材"
                                                break;
                                            case '2':
                                                item.Type = "成品"
                                                break;
                                            case '3':
                                                item.Type = "耗材"
                                                break;
                                            case '4':
                                                item.Type = "中间品"
                                                break;
                                            default:
                                                item.Type = ""
                                                break;
                                        }
                                    });
                                    table.exportFile(tableIns.config.id, list,'xls',"年度报表总表"+getNowTime(),); //data 为该实例中的任意数量的数据
                                    layer.msg('导出成功!', {
                                        icon: 1,
                                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function () {
                                    });
                                } else { //不成功
                                    layer.msg('获取信息失败!', {
                                        icon: 2,
                                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function () { });
                                }
                            });
                        }else if(yemianid == 1){
                            //console.log("记录");
                            var param = {
                                skuNo:quanjuskuNo,
                                StartTime:$("#StartTime").val(),
                                EndTime:$("#EndTime").val(),
                            };
                            sendData(IP + "/Statistical/GetAssSoInfoDetail", param, 'get', function (res) {
                                //console.log(res);
                                if (res.code == 0) { //成功
                                    var list = res.data;
                                    list.forEach(item => {
                                        if (item.SkuName.split(','))
                                        {
                                            item.SkuName = '"'+item.SkuName+'"'
                                        }
                                        item.ASNWeight = (item.ASNQty * item.Weight).toFixed(4); // 入库重量
                                        item.SOWeight = (item.SOQty * item.Weight).toFixed(4); // 出库重量
                                        item.ASNSOWeight = (item.ASNSOQty * item.Weight).toFixed(4); // 结存重量
                                    });
                                    table.exportFile(tableIns2.config.id, list,'xls',"年度报表明细"+getNowTime(),); //data 为该实例中的任意数量的数据
                                    layer.msg('导出成功!', {
                                        icon: 1,
                                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function () {
                                    });
                                } else { //不成功
                                    layer.msg('获取信息失败!', {
                                        icon: 2,
                                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function () { });
                                }
                            });
                        }
                    });
                });
                //#region 自定义表头
                //自定义表头
                active = {
                    customCols: function(){
                        layer.open({
                            type: 2,
                            title: '自定义列',
                            content: '../SystemSettings/HeaderSetting.html?Href=Statistical/GetAssSoInfo&ColsSysArr='+TotalColsSysArr,
                            maxmin: false,
                            resize: false,
                            area: ['970px', '650px']
                        });
                    },
                    customCols2: function(){
                        layer.open({
                            type: 2,
                            title: '自定义列',
                            content: '../SystemSettings/HeaderSetting.html?Href=Statistical/GetAssSoInfoDetail&ColsSysArr='+DetailColsSysArr,
                            maxmin: false,
                            resize: false,
                            area: ['970px', '650px']
                        });
                    }
                };
                $('.layui-btn').on('click', function() {
                    var type = $(this).data('type');
                    active[type] ? active[type].call(this) : '';
                });
                //#endregion
            });
        </script>
    </body>
</html>
Wms/Model/ModelDto/DataDto/AssSoDateStockInfoDto.cs
New file
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Model.ModelDto.DataDto
{
    public class AssSoDateStockInfoDto
    {
        /// <summary>
        /// Desc:入库单号
        /// Default:
        /// Nullable:False
        /// </summary>
        public string ASNNo { get; set; }
        /// <summary>
        /// Desc:出库单号
        /// Default:
        /// Nullable:False
        /// </summary>
        public string SONo { get; set; }
        /// <summary>
        /// Desc:物料编码
        /// Default:
        /// Nullable:False
        /// </summary>
        public string SkuNo { get; set; }
        /// <summary>
        /// Desc:物料名称
        /// Default:
        /// Nullable:False
        /// </summary>
        public string SkuName { get; set; }
        /// <summary>
        /// Desc:入库数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int ASNQty { get; set; }
        /// <summary>
        /// Desc:出库数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int SOQty { get; set; }
        /// <summary>
        /// Desc:结存数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int ASNSOQty { get; set; }
        /// <summary>
        /// Desc:单据时间
        /// Default:
        /// Nullable:False
        /// </summary>
        public string NoticeDateTime { get; set; }
        /// <summary>
        /// 月
        /// </summary>
        public string month { get; set; }
        /// <summary>
        /// 统计类型
        /// </summary>
        public string NoticeType { get; set; }
        /// <summary>
        /// 理论重量
        /// </summary>
        public decimal Weight { get; set; }
        public DateTime CreateTime { get; set; }
    }
}
Wms/Model/ModelVm/DataVm/DataStockInfoVM.cs
New file
@@ -0,0 +1,162 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Model.ModelVm.DataVm
{
    public class DataStockInfoVM
    {
        public int Id { get; set; }
        /// <summary>
        /// 创建日期
        /// </summary>
        public DateTime CreateTime { get; set; } = DateTime.Now;
        /// <summary>
        /// 更新日期
        /// </summary>
        public DateTime? UpdateTime { get; set; }
        /// <summary>
        /// 是否删除
        /// </summary>
        public string IsDel { get; set; } = "0";
        /// <summary>
        /// 创建人
        /// </summary>
        public int CreateUser { get; set; }
        /// <summary>
        /// 更新人
        /// </summary>
        public int? UpdateUser { get; set; }
        /// <summary>
        /// Desc:物料编码
        /// Default:
        /// Nullable:True
        /// </summary>
        public string SkuNo { get; set; }
        /// <summary>
        /// Desc:物料名称
        /// Default:
        /// Nullable:True
        /// </summary>
        public string SkuName { get; set; }
        /// <summary>
        /// Desc:规格
        /// Default:
        /// Nullable:True
        /// </summary>
        public string Standard { get; set; }
        /// <summary>
        /// Desc:类型
        /// 0,4:吨袋 1:公斤袋 2:罐装满桶 3:罐装桶 5:母托盘 6,7:子托盘
        /// Default:
        /// Nullable:True
        /// </summary>
        public string Type { get; set; }
        /// <summary>
        /// Desc:入库数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int ArrivalQty { get; set; }
        /// <summary>
        /// Desc:入库数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public int YearArrivalQty { get; set; }
        /// <summary>
        /// Desc:出库数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int ExportQty { get; set; }
        /// <summary>
        /// Desc:出库数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public int YearExportQty { get; set; }
        /// <summary>
        /// Desc:结存数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int BalanceQty { get; set; }
        /// <summary>
        /// Desc:期出数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public int ExpectedQty { get; set; }
        /// <summary>
        /// Desc:结存数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public int YearBalanceQty { get; set; }
        /// <summary>
        /// Desc:期出数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public int YearExpectedQty { get; set; }
        /// <summary>
        /// Desc:批次号
        /// Default:
        /// Nullable:True
        /// </summary>
        public string LotNo { get; set; }
        /// <summary>
        /// Desc:批次描述
        /// Default:
        /// Nullable:True
        /// </summary>
        public string LotText { get; set; }
        /// <summary>
        /// Desc:供货批次
        /// Default:
        /// Nullable:True
        /// </summary>
        public string SupplierLot { get; set; }
        /// <summary>
        /// Desc:所属仓库
        /// Default:
        /// Nullable:True
        /// </summary>
        public string WareHouseNo { get; set; }
        /// <summary>
        /// Desc:所属巷道
        /// Default:
        /// Nullable:True
        /// </summary>
        public string RoadwayNo { get; set; }
        /// <summary>
        /// 重量
        /// </summary>
        public decimal Weight { get; set; }
    }
}
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -7,10 +7,12 @@
using System.Text;
using Model.ModelDto;
using Model.ModelDto.DataDto;
using Model.ModelVm.DataVm;
using SqlSugar;
using WMS.DAL;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IDataServer;
namespace WMS.BLL.DataServer
@@ -456,6 +458,299 @@
        #endregion
        #region 年度报表
        /// <summary>
        /// 获取年报表总表
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        public List<SysMaterials> GetAssSoInfo(string StartTime, string EndTime)
        {
            try
            {
                string str = "select* from SysMaterials where SkuNo in (select a.SkuNo from BllArrivalNoticeDetail a inner join BllExportNoticeDetail b on a.SkuNo = b.SkuNo";
                //判断开始时间是否为空
                if (!string.IsNullOrWhiteSpace(StartTime))
                {
                    str += $" and a.CompleteTime >= '{StartTime}' and b.UpdateTime >= '{StartTime}'";
                }
                //判断结束时间是否为空
                if (!string.IsNullOrWhiteSpace(EndTime))
                {
                    EndTime = (Convert.ToDateTime(EndTime).AddDays(1)).ToString();
                    str += $" and a.CompleteTime < '{EndTime}' and b.UpdateTime < '{EndTime}'";
                }
                str += " group by a.SkuNo,b.SkuNo)";
                var sku = Db.Ado.SqlQuery<SysMaterials>(str);
                return sku;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 获取年报表明细
        /// </summary>
        /// <param name="skuNo"></param>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        public List<AssSoDateStockInfoDto> GetAssSoInfoDetail(string skuNo, string StartTime, string EndTime)
        {
            try
            {
                //用于合并数据
                List<AssSoDateStockInfoDto> infolist = new List<AssSoDateStockInfoDto>();
                //获取开始时间当天的结存数量
                //DataStockInfo stockInfo = new DataStockInfo();
                //获取物料理论重量
                string weightstr = $"select Weight from SysMaterials where SkuNo = '{skuNo}'";
                var weight = Db.Ado.SqlQuerySingle<decimal>(weightstr);
                //判断开始时间是否为空
                if (!string.IsNullOrWhiteSpace(StartTime))
                {
                    //string str = $"select * from DataStockInfo where IsDel = '0' and CONVERT(date,CreateTime) = '{StartTime}'";
                    //获取当天库存信息
                    //stockInfo = Db.Ado.SqlQuerySingle<DataStockInfo>(str);
                }
                //判断结束时间是否为空
                if (!string.IsNullOrWhiteSpace(EndTime))
                {
                    EndTime = (Convert.ToDateTime(EndTime).AddDays(1)).ToString();
                }
                int countjie = 0; //统计结存数量
                ////判断库存信息是否为空
                //if (stockInfo != null)
                //{
                //    countjie = stockInfo.BalanceQty; //统计结存数量
                //}
                //else if (stockInfo == null)
                //{
                    //判断开始时间是否为空
                    if (!string.IsNullOrWhiteSpace(StartTime))
                    {
                        //string StartTimelin = (Convert.ToDateTime(StartTime).AddDays(1)).ToString();
                        //获取出库数量
                        string str = $"select SUM(CompleteQty) as CompleteQtyc from BllExportNoticeDetail where IsDel = '0' and SkuNo = '{skuNo}' and Status != '0'  and CreateTime < '{StartTime}'";
                        string CompleteQtyc = Db.Ado.SqlQuerySingle<string>(str);
                        //获取入库数量
                        str = $"select SUM(CompleteQty) as CompleteQtyr from BllArrivalNoticeDetail where IsDel = '0' and SkuNo = '{skuNo}' and Status != '0' and CreateTime < '{StartTime}'";
                        string CompleteQtyr = Db.Ado.SqlQuerySingle<string>(str);
                        //计算结存数量
                        countjie = int.Parse(CompleteQtyr) - int.Parse(CompleteQtyc);
                    }
                //}
                int yeara = 0; //年入库
                int years = 0; //年出库
                int montha = 0; //月入库
                int months = 0; //月出库
                DateTime createTime = DateTime.Now.AddYears(-1000); //时间
                //获取有多少年
                string yearstr = "select DATEPART(YEAR, CreateTime) SkuName from BllArrivalNoticeDetail where IsDel = '0' and Status = '2' ";
                if (!string.IsNullOrWhiteSpace(StartTime))
                {
                    yearstr += $" and CreateTime >= '{StartTime}'";
                }
                if (!string.IsNullOrWhiteSpace(EndTime))
                {
                    yearstr += $" and CreateTime < '{EndTime}'";
                }
                yearstr += "group by DATEPART(YEAR, CreateTime)";
                var yearlist = Db.Ado.SqlQuery<AssSoDateStockInfoDto>(yearstr);
                if (!string.IsNullOrWhiteSpace(StartTime) && !string.IsNullOrWhiteSpace(EndTime))
                {
                    //判断开始时间年与结束时间年是否相等
                    var startyear = StartTime.Split('-');
                    var endyear = EndTime.Split("-");
                }
                foreach (var yearcount in yearlist)
                {
                    //获取当前物料每年入库单据明细
                    string ruyearstr = $"select ASNNo,SkuNo,SkuName,CompleteQty as ASNQty,0 as ASNSOQty,CONVERT(date,CreateTime) as NoticeDateTime,DATEPART(MONTH,CreateTime) as month,CreateTime from BllArrivalNoticeDetail where IsDel = '0' and Status != '0' and SkuNo = '{skuNo}' and DATEPART(YEAR, CreateTime) = '{yearcount.SkuName}'";
                    //获取当前物料每年出库单据明细
                    string chuyearstr = $"select SONo,SkuNo,SkuName,CompleteQty as SOQty,0 as ASNSOQty,CONVERT(date,CreateTime) as NoticeDateTime,DATEPART(MONTH,CreateTime) as month,CreateTime from BllExportNoticeDetail where IsDel = '0' and Status != '0' and SkuNo = '{skuNo}' and DATEPART(YEAR, CreateTime) = '{yearcount.SkuName}'";
                    if (!string.IsNullOrWhiteSpace(StartTime))
                    {
                        ruyearstr += $" and CreateTime >= '{StartTime}'";
                        chuyearstr += $" and CreateTime >= '{StartTime}'";
                    }
                    if (!string.IsNullOrWhiteSpace(EndTime))
                    {
                        //EndTime = (Convert.ToDateTime(EndTime).AddDays(1)).ToString();
                        ruyearstr += $" and CreateTime < '{EndTime}'";
                        chuyearstr += $" and CreateTime < '{EndTime}'";
                    }
                    ruyearstr += " order by CreateTime";
                    chuyearstr += " order by CreateTime";
                    //每年入库
                    List<AssSoDateStockInfoDto> ruinfolist = Db.Ado.SqlQuery<AssSoDateStockInfoDto>(ruyearstr);
                    //每年出库
                    List<AssSoDateStockInfoDto> chuinfolist = Db.Ado.SqlQuery<AssSoDateStockInfoDto>(chuyearstr);
                    //循环12个月
                    for (int i = 1; i <= 12; i++)
                    {
                        //临时入
                        List<AssSoDateStockInfoDto> linshiru = new List<AssSoDateStockInfoDto>();
                        //临时出
                        List<AssSoDateStockInfoDto> linshichu = new List<AssSoDateStockInfoDto>();
                        if (ruinfolist.Count > 0)
                        {
                            linshiru = ruinfolist.Where(a => a.month == i.ToString()).ToList(); //获取当月入库信息
                        }
                        if (chuinfolist.Count > 0)
                        {
                            linshichu = chuinfolist.Where(a => a.month == i.ToString()).ToList(); //获取当月出库信息
                        }
                        if (linshichu.Count > 0)
                        {
                            foreach (var h in linshichu)
                            {
                                linshiru.Add(h);
                            }
                        }
                        var data = linshiru.OrderBy(a => a.CreateTime).ToList();
                        //判断是否存在当月入库信息
                        if (linshiru.Count > 0)
                        {
                            foreach (var item in data)
                            {
                                item.NoticeDateTime = Convert.ToDateTime(item.NoticeDateTime).ToString("yyyy-MM-dd");
                                //总计结存数量
                                if (item.ASNNo != null)
                                {
                                    //入库
                                    countjie += item.ASNQty;
                                    montha += item.ASNQty; //月入库
                                    yeara += item.ASNQty; //年入库
                                }
                                else if (item.SONo != null)
                                {
                                    //出库
                                    countjie -= item.SOQty;
                                    months += item.SOQty; //月出库
                                    years += item.SOQty; //年出库
                                }
                                item.ASNSOQty = countjie; //结存数量
                                item.Weight = weight; //重量
                                infolist.Add(item);
                                if (createTime < item.CreateTime)
                                {
                                    createTime = item.CreateTime; //时间
                                }
                            }
                        }
                        //判断是否存在当月出库信息
                        //if (linshichu.Count > 0)
                        //{
                        //    //出库
                        //    foreach (var item in linshichu)
                        //    {
                        //        item.NoticeDateTime = Convert.ToDateTime(item.NoticeDateTime).ToString("yyyy-MM-dd");
                        //        countjie -= item.SOQty; //总计结存数量
                        //        item.ASNSOQty = countjie; //结存数量
                        //        item.Weight = weight; //重量
                        //        infolist.Add(item);
                        //        months += item.SOQty; //月出库
                        //        years += item.SOQty; //年出库
                        //        if (createTime < item.CreateTime)
                        //        {
                        //            createTime = item.CreateTime; //时间
                        //        }
                        //    }
                        //}
                        //判断是否有月出入库
                        if (linshiru.Count > 0 || linshichu.Count > 0)
                        {
                            //月信息
                            var addmonthinfo = new AssSoDateStockInfoDto()
                            {
                                ASNNo = "", // 入库单据
                                SONo = "", // 出库单据
                                SkuNo = "", // 物料编码
                                SkuName = "", // 物料名称
                                NoticeType = "本月累计", //统计类别
                                ASNQty = montha, // 入库数量
                                SOQty = months, // 出库数量
                                ASNSOQty = countjie, // 结存数量
                                Weight = weight, // 理论重量
                                NoticeDateTime = yearcount.SkuName + "年" + i + "月", // 单据时间
                                CreateTime = createTime, //时间
                            };
                            infolist.Add(addmonthinfo);
                        }
                        montha = 0; //月入库
                        months = 0; //月出库
                    }
                    //判断是否有年出入库
                    if (ruinfolist.Count > 0 || chuinfolist.Count > 0)
                    {
                        //年信息
                        var addyearinfo = new AssSoDateStockInfoDto()
                        {
                            ASNNo = "", // 入库单据
                            SONo = "", // 出库单据
                            SkuNo = "", // 物料编码
                            SkuName = "", // 物料名称
                            NoticeType = "本年累计", //统计类别
                            ASNQty = yeara, // 入库数量
                            SOQty = years, // 出库数量
                            ASNSOQty = countjie, // 结存数量
                            Weight = weight, // 理论重量
                            NoticeDateTime = yearcount.SkuName + "年", // 单据时间
                            CreateTime = createTime, //时间
                        };
                        infolist.Add(addyearinfo);
                    }
                    yeara = 0; //年入库
                    years = 0; //年出库
                }
                infolist = infolist.OrderBy(x => x.CreateTime).ToList();
                return infolist;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region 导出库存
        /// <summary>
        /// 导出库存总量
Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Text;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
namespace WMS.IBLL.IDataServer
{
@@ -74,6 +75,26 @@
        #endregion
        #region 年度报表
        /// <summary>
        /// 获取年报表
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        List<SysMaterials> GetAssSoInfo(string StartTime, string EndTime);
        /// <summary>
        /// 获取年报表明细
        /// </summary>
        /// <param name="skuNo"></param>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        List<AssSoDateStockInfoDto> GetAssSoInfoDetail(string skuNo, string StartTime, string EndTime);
        #endregion
        #region 导出库存
        /// <summary>
Wms/Wms/Controllers/StatisticalController.cs
@@ -17,13 +17,13 @@
        /// </summary>
        private readonly IStockServer _stock; //统计报表
        private readonly IStockDetailServer _stockDetail; //统计报表
        private readonly IDataBoxInfoServer _dataBoxInfo; //统计报表
        private readonly IDataBoxInfoServer _dataBoxInfo; //导出
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="stock">统计报表</param>
        /// <param name="stockDetail">库存箱码明细</param>
        /// <param name="dataBoxInfo">库存箱码明细</param>
        /// <param name="dataBoxInfo">导出</param>
        public StatisticalController(IStockServer stock, IStockDetailServer stockDetail, IDataBoxInfoServer dataBoxInfo)
        {
            _stock = stock; //统计报表
@@ -261,6 +261,52 @@
        #endregion
        #region 年度报表
        /// <summary>
        /// 获取年报表
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAssSoInfo(string StartTime, string EndTime)
        {
            try
            {
                var skulist = _stock.GetAssSoInfo(StartTime, EndTime);
                return Ok(new { code = 0, count = 0, data = skulist, msg = "获取总量成功" });
            }
            catch (Exception ex)
            {
                return Ok(new { code = 1, count = 0, msg = ex.Message });
            }
        }
        /// <summary>
        /// 获取年报表明细
        /// </summary>
        /// <param name="skuNo"></param>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAssSoInfoDetail(string skuNo, string StartTime, string EndTime)
        {
            try
            {
                var infolist = _stock.GetAssSoInfoDetail(skuNo, StartTime, EndTime);
                return Ok(new { code = 0, count = 0, data = infolist, msg = "获取明细成功" });
            }
            catch (Exception ex)
            {
                return Ok(new { code = 1, count = 0, msg = ex.Message });
            }
        }
        #endregion
        #region 导出
        /// <summary>
        /// 导出库存总量