修改增加或修改时计算折件数量,增加JC23、JC24数据库,降库存信息代码增加到JC23。
16个文件已修改
4个文件已添加
2495 ■■■■■ 已修改文件
HTML/views/HouseWithinSetting/CRLogTask.html 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportLogTask.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/PeriodicReport.html 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/HttpModel.cs 485 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelVm/DataVm/DataStockInfoVM.cs 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockInfoServer.cs 623 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/DataEntity/DataStockInfo.cs 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockInfoServer.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllSoController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 127 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/PdaCrController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/DailyTaskService.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Startup.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Tools/ApiUrlConfig.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/appsettings.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/CRLogTask.html
@@ -644,7 +644,8 @@
                if (obj.event === 'cancel') {
                    layer.confirm('确定取消选中的出库任务?', function (index) {
                        var param = {
                            taskNo: data.TaskNo
                            taskNo: data.TaskNo,
                            receiver: data.Receiver
                        };
                        var postUrl="/BllCheck/CancelCheckTask"
                        if(data.OrderType=='3'){
@@ -704,7 +705,8 @@
                } else if (obj.event === 'send') {
                    layer.confirm('确定要下发选中的出库任务?', function (index) {
                        var param = {
                            taskNo: data.TaskNo
                            taskNo: data.TaskNo,
                            receiver:data.Receiver
                        };
                        sendData(IP + "/DownApi/AgainSendCheckTask", param, 'get', function (res) {
                            console.log(res);
HTML/views/SOSetting/ExportLogTask.html
@@ -611,7 +611,8 @@
                    layer.confirm('确定要下发选中的出库任务?', function (index) {
                        
                        var param = {
                            taskNo: data.TaskNo
                            taskNo: data.TaskNo,
                            receiver: data.Receiver
                        };
                        console.log(param)
                        sendData(IP + "/DownApi/AgainSendSoTask", param, 'get', function (res) {
HTML/views/StatisticalReport/PeriodicReport.html
@@ -0,0 +1,341 @@
<!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">
                            <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 -->
                                        <script type="text/html" id="SituationButton">
                                            {{#  if(d.IsQualified=='0'){ }}
                                                <p>满足</p>
                                            {{#  } else if(d.IsQualified=='1'){ }}
                                                <p>不满足</p>
                                            {{#  } }}
                                        </script>
                                        <script type="text/html" id="CreateTimeButton">
                                            {{# console.log(d.CreateTime);
                                                    return formatDate(d.CreateTime);
                                            }}
                                        </script>
                                        <script type="text/html" id="UpdateTimeButton">
                                            {{# console.log(d.CreateTime);
                                                    return formatDate(d.CreateTime);
                                            }}
                                        </script>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </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 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 h1 = GetTableTabHeight();
                refreshTable("",);
                //获取出入库总量
                function refreshTable(StartTime,EndTime) {
                    //#region 自定义表头
                    var colsJson
                    var param1={
                        Href:'Statistical/GetDataStockInfo'
                    };
                    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/GetDataStockInfo',TotalColsSysArr);
                            },
                            cols:colsJson
                        };
                        var param = {
                            StartTime:$("#StartTime").val(),
                        };
                        sendData(IP + "/Statistical/GetDataStockInfo", 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: 'Unit', title: '单位', align: 'center'},
                    {field: 'LastMonthQty', title: '上月结存数量', align: 'center'},
                    {field: 'LastMonthFoldedQty', title: '上月结存折件', align: 'center'},
                    {field: 'ArrDayQty', title: '入库日数量', align: 'center'},
                    {field: 'ArrDayFoldedQty', title: '入库日折件', align: 'center'},
                    {field: 'ArrMonthQty', title: '入库月数量', align: 'center'},
                    {field: 'ArrMonthFoldedQty', title: '入库月折件', align: 'center'},
                    {field: 'ArrYearQty', title: '入库年数量', align: 'center'},
                    {field: 'ArrYearFoldedQty', title: '入库年折件', align: 'center'},
                    {field: 'SoDayQty', title: '出库日数量', align: 'center'},
                    {field: 'SoDayFoldedQty', title: '出库日折件', align: 'center'},
                    {field: 'SoMonthQty', title: '出库月数量', align: 'center'},
                    {field: 'SoMonthFoldedQty', title: '出库月折件', align: 'center'},
                    {field: 'SoYearQty', title: '出库年数量', align: 'center'},
                    {field: 'SoYearFoldedQty', title: '出库年折件', align: 'center'},
                    {field: 'MonthQty', title: '当月结存数量', align: 'center'},
                    {field: 'MonthFoldedQty', title: '当月结存折件', align: 'center'},
                    {field: 'DepositQty', title: '寄存数量', align: 'center'},
                    {field: 'Qty', title: '本月库存数量', align: 'center'},
                    {field: 'SecurityQty', title: '安全库存', align: 'center'},
                    {field: 'Situation', title: '安全库存情况', align: 'center' , templet: '#SituationButton',},
                    {field: 'CreateTime', title: '创建日期', align: 'center' , templet: '#CreateTimeButton',},
                    {field: 'UpdateTime', title: '更新日期', align: 'center', templet: '#UpdateTimeButton',},
                ]];
                var TotalColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码
                //#endregion
                //监听搜索
                form.on('submit(LAY-app-contlist-search)', function(data) {
                    var StartTime = $("#StartTime").val();
                        refreshTable(StartTime);
                });
                form.on('submit(daochu)', function () {
                    layer.confirm('确定导出当前数据吗?', function(index) {
                        var param = {
                            StartTime:$("#StartTime").val(),
                        };
                        sendData(IP + "/Statistical/GetDataStockInfo", 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+'"'
                                    }
                                });
                                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 () { });
                            }
                        });
                    });
                });
                //#region 自定义表头
                //自定义表头
                active = {
                    customCols: function(){
                        layer.open({
                            type: 2,
                            title: '自定义列',
                            content: '../SystemSettings/HeaderSetting.html?Href=Statistical/GetDataStockInfo&ColsSysArr='+TotalColsSysArr,
                            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/InterFaceModel/HttpModel.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Reflection.Emit;
using System.Text;
namespace Model.InterFaceModel
@@ -93,7 +94,7 @@
        /// <summary>
        /// //2,任务完成,3,取消, 
        /// </summary>
        public string TaskStatus { get; set; }
        public string TaskStatus { get; set; }
        /// <summary>
        /// 0:入库、1:出库、2:移库
        /// </summary>
@@ -101,4 +102,486 @@
    }
    /// <summary>
    /// 生成任务单
    /// </summary>
    public class AgvSchedulingTask
    {
        /// <summary>
        /// 请求编号,每个请求都要一个唯一编号同一个请求重复提交 使用同一编号
        /// 是否必填:是
        /// </summary>
        public string ReqCode { get; set; }
        /// <summary>
        /// 请求时间戳
        /// 格式: “yyyy-MM-ddHH:mm:ss”
        /// 是否必填:否
        /// </summary>
        public string EeqTime { get; set; }
        /// <summary>
        /// 客户端编号,如 PDA,HCWMS 等。
        /// 是否必填:否
        /// </summary>
        public string ClientCode { get; set; }
        /// <summary>
        /// 令牌号, 由调度系统颁发。
        /// 是否必填:否
        /// </summary>
        public string TokenCode { get; set; }
        /// <summary>
        /// 任务类型,与在 RCS-2000 端配置的主任务类型编号一致。
        /// 内置任务类型:
        /// 厂内货架搬运: F01
        /// 厂内货架空满交换: F02
        /// 辊筒搬运接驳:F03
        /// 厂内货架出库 AGV 待命:F04
        /// 旋转货架: F05
        /// 厂内电梯任务: F06
        /// 以下为叉车专用任务类型
        /// 高位货架到工作台: F11
        /// 工作台到高位货架: F12
        /// 巷道到工作台: F13
        /// 工作台到巷道: F14
        /// 高位货架到工作台(接驳) : F15
        /// 工作台到高位货架(接驳) : F16
        /// 巷道到工作台(接驳) : F17
        /// 工作台到巷道(接驳) : F18
        /// 叉车电梯主任务: F20
        /// 是否必填:是
        /// </summary>
        public string TaskTyp { get; set; }
        /// <summary>
        /// 容器类型(叉车/CTU 专用)
        /// 叉车项目必传
        /// 是否必填:否
        /// </summary>
        public string CtnrTyp { get; set; }
        /// <summary>
        /// 容器编号(叉车/CTU 专用)
        /// 是否必填:否
        /// </summary>
        public string CtnrCode { get; set; }
        /// <summary>
        /// 任务模式
        /// 0-普通 move
        /// 1-出库 move
        /// 2-入库 move
        /// 3-移库 move
        /// 说明:
        /// 1>任务模板中也可以配置模式,如果接口传了则优先使用接口传入的值
        /// 2>出库 move 模式不能被打断,普通move和入库move可以被打断。出库 move 执行后必须执行入库move 或者移库 move,若后续未带move 标识,则系统不会执行,会将任务挂起。
        /// 是否必填:否
        /// </summary>
        public string TaskMode { get; set; }
        /// <summary>
        /// 工作位,一般为机台或工作台位置,与 RCS-2000 端配置的位置名称一致, 工作位名称为字母\数字\或组合, 不超过 32 位。
        /// 是否必填:否
        /// </summary>
        public string WbCode { get; set; }
        /// <summary>
        /// 位置路径:AGV 关键路径位置集合,与任务类型中模板配置的位置路径一一对应。待现场地图部署、配置完成后可获取。
        /// positionCode:位置编号, 单个编号不超过 64 位
        /// type:位置类型说明:
        /// 00 表示:位置编号
        /// 01 表示:物料批次号
        /// 02 表示:策略编号(含多个区域)
        /// 如:第一个区域放不下, 可以放第二个区域
        /// 03 表示:货架编号,通过货架编号找到货架所在位置
        /// 04 表示:区域编号,在区域中查找可用位置
        /// 05 表示:仓位编号(叉车/CTU 专用)
        /// 06 表示:巷道编号
        /// 07 表示:容器编号
        /// 08 表示:巷道策略
        /// 09 表示:巷道区域
        /// 10 表示:巷道仓位
        /// 11 表示:输送线(机台)编号
        /// 12 表示:CTU 工作台(梳齿工作站)编号
        /// 13 表示:搬运巷道指定货架出库
        /// 是否必填:否
        /// </summary>
        public Object[] PositionCodePath { get; set; }
        /// <summary>
        /// 货架编号,不指定货架可以为空
        /// 是否必填:否
        /// </summary>
        public string PodCode { get; set; }
        /// <summary>
        /// 别对应地图的任务完成时有值
        /// 左: 180
        /// 右: 0
        /// 上: 90
        /// 下: -90
        /// 不指定方向可以为空;如果终点不是工作台或工作台未配置方向则作为终点方向塞入子任务报文,如果工作台配有方向则两者做差结果作为终点方向塞入子任务报文
        /// 是否必填:否
        /// </summary>
        public string PodDir { get; set; }
        /// <summary>
        /// 货架类型, 传空时表示随机找个货架
        /// 找空货架传参方式如下:
        /// -1: 代表不关心货架类型, 找到空货架即可.
        /// -2: 代表从工作位获取关联货架类型, 如果未配置, 只找空货架.货架类型编号: 只找该货架类型的空货架
        /// 是否必填:否
        /// </summary>
        public string PodTyp { get; set; }
        /// <summary>
        /// 物料批次或货架上的物料唯一编码,生成任务单时,货架与物料直接绑定时使用. (通过同时传 podCode 和materialLot来绑定或通过wbCode 找到位置上的货架和materialLot 来绑定)巷道任务通过该字段传入特征值
        /// 是否必填:否
        /// </summary>
        public string MaterialLot { get; set; }
        /// <summary>
        /// 优先级,从(1~127)级,最大优先级最高。为空时,采用任务模板的优先级。
        /// 是否必填:否
        /// </summary>
        public string Priority { get; set; }
        /// <summary>
        /// 任务单号,选填, 不填系统自动生成,UUID 小于等于 64 位
        /// 是否必填:否
        /// </summary>
        public string TaskCode { get; set; }
        /// <summary>
        /// AGV 编号,填写表示指定某一编号的 AGV 执行该任务
        /// 是否必填:否
        /// </summary>
        public string AgvCode { get; set; }
        /// <summary>
        /// 组编号
        /// CTU 场景下用于按组出库,同组任务优先拼车。 如业务需要任务组间或组内按顺序出库,则需调用料箱顺序出库(CTU)接口。潜伏式场景下,通过组号来管理顺序出库的顺序,组号小的优先出库。
        /// 是否必填:否
        /// </summary>
        public string GroupId { get; set; }
        /// <summary>
        /// 自定义字段.JSON 格式
        /// 是否必填:否
        /// </summary>
        public string Data { get; set; }
    }
    /// <summary>
    /// 继续执行任务
    /// </summary>
    public class AgvContinueTask
    {
        /// <summary>
        /// 请求编号,每个请求都要一个唯一编号, 同一个请求重复提交, 使用同一编号。
        /// 是否必填:是
        /// </summary>
        public string ReqCode { get; set; }
        /// <summary>
        /// 请求时间截
        /// 格式: “yyyy-MM-dd HH:mm:ss”。
        /// 是否必填:否
        /// </summary>
        public string ReqTime { get; set; }
        /// <summary>
        /// 客户端编号,如 PDA,HCWMS 等。
        /// 是否必填:否
        /// </summary>
        public string ClientCode { get; set; }
        /// <summary>
        /// 令牌号, 由调度系统颁发。
        /// 是否必填:否
        /// </summary>
        public string TokenCode { get; set; }
        /// <summary>
        /// 工作位,与 RCS-2000 端配置的位置名称一致
        /// 是否必填:否
        /// </summary>
        public string WbCode { get; set; }
        /// <summary>
        /// 货架号,采用货架号触发的方式。
        /// 是否必填:否
        /// </summary>
        public string PodCode { get; set; }
        /// <summary>
        /// AGV 编号,采用 AGV 编号触发的方式。
        /// 是否必填:否
        /// </summary>
        public string AgvCode { get; set; }
        /// <summary>
        /// 任务单号,选填, 不填系统自动生成,必须为 64 位 UUID
        /// 是否必填:否
        /// </summary>
        public string TaskCode { get; set; }
        /// <summary>
        /// 下一个子任务的序列,指定第几个子任务开始执行,校验子任务执行是否正确。不填默认执行下一个子任务。
        /// 是否必填:否
        /// </summary>
        public string TaskSeq { get; set; }
        /// <summary>
        /// 下一个位置信息,在任务类型中配置外部设置时需要传入,否则不需要设置。待现场地图部署、配置完成后可获取
        /// 是否必填:否
        /// </summary>
        public string NextPositionCode { get; set; }
    }
    /// <summary>
    /// 取消任务
    /// </summary>
    public class AgvCancelTask
    {
        /// <summary>
        /// 请求编号,每个请求都要一个唯一编号, 同一个请求重复提交, 使用同一编号。
        /// 是否必填:是
        /// </summary>
        public string ReqCode { get; set; }
        /// <summary>
        /// 请求时间截
        /// 格式: “yyyy-MM-dd HH:mm:ss”。
        /// 是否必填:否
        /// </summary>
        public string ReqTime { get; set; }
        /// <summary>
        /// 客户端编号,如 PDA,HCWMS 等。
        /// 是否必填:否
        /// </summary>
        public string ClientCode { get; set; }
        /// <summary>
        /// 令牌号, 由调度系统颁发。 由RCS-2000 告知上层系统
        /// 是否必填:否
        /// </summary>
        public string TokenCode { get; set; }
        /// <summary>
        /// 取消类型
        /// 0 表示:取消后货架直接放地上
        /// 1 表示:AGV 仍然背着货架, 根据回库区域执行回库指令, 只有潜伏车和 CTU 车支持。
        /// 若不传值,默认的取消模式为 0
        /// 是否必填:否
        /// </summary>
        public string ForceCancel { get; set; }
        /// <summary>
        /// forcecancel=1 时有意义,回库区域编号,如果为空,采用货架配置的库区。
        /// 是否必填:否
        /// </summary>
        public string MatterArea { get; set; }
        /// <summary>
        /// 取消该 AGV 正在执行的任务单
        /// 是否必填:否
        /// </summary>
        public string AgvCode { get; set; }
        /// <summary>
        /// 任务单编号, 取消该任务单
        /// 是否必填:否
        /// </summary>
        public string TaskCode { get; set; }
    }
    /// <summary>
    /// 任务完成通知参数
    /// </summary>
    public class AgvTaskDto
    {
        /// <summary>
        /// 请求编号,每个请求都要一个唯一编号
        /// 同一个请求重复提交 使用同一编号
        /// 是否必填:是
        /// </summary>
        public string ReqCode { get; set; }
        /// <summary>
        /// 请求时间戳
        /// 格式: “yyyy-MM-ddHH:mm:ss”
        /// 是否必填:是
        /// </summary>
        public string EeqTime { get; set; }
        /// <summary>
        /// 地码 X 坐标(mm):任务完成时有值
        /// 是否必填:否
        /// </summary>
        public int CooX { get; set; }
        /// <summary>
        /// 地码 Y 坐标(mm):任务完成时有值
        /// 是否必填:否
        /// </summary>
        public int CooY { get; set; }
        /// <summary>
        /// 当前位置编号
        /// 任务开始:该位置为任务起点
        /// 走出储位:该位置为任务起点
        /// 任务单取消:该位置为工作位编号
        /// 任务结束:该位置为任务终点
        /// 取放申请:取放料箱的点
        /// 是否必填:是
        /// </summary>
        public string CurrentPositionCode { get; set; }
        /// <summary>
        /// 自定义字段,不超过 2000 个字符
        /// 是否必填:否
        /// </summary>
        public string Data { get; set; }
        /// <summary>
        /// 地图编号
        /// 是否必填:否
        /// </summary>
        public string MapCode { get; set; }
        /// <summary>
        /// 地码编号:任务完成时有值
        /// 是否必填:否
        /// </summary>
        public string MapDataCode { get; set; }
        /// <summary>
        /// 仓位编号:叉车与 CTU 任务时有值
        /// 是否必填:否
        /// </summary>
        public string StgBinCode { get; set; }
        /// <summary>
        /// 方法名, 可使用任务类型做为方法名
        /// 由 RCS-2000 任务模板配置后并告知上层系统
        /// 默认使用方式:
        /// start : 任务开始
        /// outbin : 走出储位
        /// end : 任务结束
        /// cancel : 任务单取消
        /// apply:CTU 料箱取放申请
        /// 是否必填:是
        /// </summary>
        public string Method { get; set; }
        /// <summary>
        /// 货架编号:背货架时有值
        /// 是否必填:否
        /// </summary>
        public string PdCode { get; set; }
        /// <summary>
        /// 别对应地图的任务完成时有值
        /// 左: 180
        /// 右: 0
        /// 上: 90
        /// 下: -90
        /// 是否必填:否
        /// </summary>
        public string PodDir { get; set; }
        /// <summary>
        /// 物料编号
        /// 是否必填:否
        /// </summary>
        public string MaterialLot { get; set; }
        /// <summary>
        /// AGV 编号(同 agvCode )
        /// 是否必填:否
        /// </summary>
        public string RobotCode { get; set; }
        /// <summary>
        /// 当前任务单号
        /// 是否必填:是
        /// </summary>
        public string TaskCode { get; set; }
        /// <summary>
        /// 工作位,与 RCS-2000 端配置的位置名称一致。任务完成时有值,与生成任务单接口中的 wbCode 一致
        /// 是否必填:否
        /// </summary>
        public string WbCode { get; set; }
        /// <summary>
        /// 容器编号
        /// 是否必填:否
        /// </summary>
        public string CtnrCode { get; set; }
        /// <summary>
        /// 容器类型
        /// 是否必填:否
        /// </summary>
        public string CtnrType { get; set; }
        /// <summary>
        /// 巷道编号
        /// 是否必填:否
        /// </summary>
        public string RoadWayCode { get; set; }
        /// <summary>
        /// 巷道内顺序号
        /// 巷道尾是 0,到巷道头依次递增 1
        /// 是否必填:否
        /// </summary>
        public string Seq { get; set; }
        /// <summary>
        /// 设备编号,如梳齿式工作站、输送线等,一般使用于 CTU 场景。系统根据仓位定位到关联的设备编号。
        /// 是否必填:否
        /// </summary>
        public string EqpCode { get; set; }
    }
    /// <summary>
    /// WMS回应AGV信息
    /// </summary>
    public class OutCommanAgvDto
    {
        /// <summary>
        /// 返回码
        /// 0:成功
        /// 1:参数相关的错误
        /// 6:重复发送,上层系统不需要重发
        /// 99:其他未知错误,调用失败后,可以重试
        /// 100: 该任务不存在,上层系统不需重发,需要人工介入处理
        /// 是否必填:是
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 返回消息
        /// 是否必填:是
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// 请求编号
        /// 是否必填:是
        /// </summary>
        public string ReqCode { get; set; }
        /// <summary>
        /// 返回的数据结构
        /// 是否必填:否
        /// </summary>
        public string Data { get; set; }
    }
}
Wms/Model/ModelVm/DataVm/DataStockInfoVM.cs
@@ -9,6 +9,166 @@
        public int Id { 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:True
        /// </summary>
        public string Standard { get; set; }
        /// <summary>
        /// Desc:单位
        /// Default:
        /// Nullable:True
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// Desc:上月结存-库存数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal LastMonthQty { get; set; }
        /// <summary>
        /// Desc:上月结存-库存折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal LastMonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:入库数量-当日数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrDayQty { get; set; }
        /// <summary>
        /// Desc:入库数量-当日折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrDayFoldedQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本月数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrMonthQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本月折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrMonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本年数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrYearQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本年折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrYearFoldedQty { get; set; }
        /// <summary>
        /// Desc:出库数量-当日数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoDayQty { get; set; }
        /// <summary>
        /// Desc:出库数量-当日折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoDayFoldedQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本月数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoMonthQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本月折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoMonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本年数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoYearQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本年折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoYearFoldedQty { get; set; }
        /// <summary>
        /// Desc:当月结存-累计数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal MonthQty { get; set; }
        /// <summary>
        /// Desc:当月结存-累计折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal MonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:寄存数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal DepositQty { get; set; }
        /// <summary>
        /// Desc:本月库存数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal Qty { get; set; }
        /// <summary>
        /// Desc:安全库存
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SecurityQty { get; set; }
        /// <summary>
        /// Desc:安全库存情况
        /// Default:
        /// Nullable:True
        /// </summary>
        public string Situation { get; set; }
        /// <summary>
        /// 创建日期
        /// </summary>
        public DateTime CreateTime { get; set; } = DateTime.Now;
@@ -32,131 +192,5 @@
        /// 更新人
        /// </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 decimal ArrivalQty { get; set; }
        /// <summary>
        /// Desc:入库数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal YearArrivalQty { get; set; }
        /// <summary>
        /// Desc:出库数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal ExportQty { get; set; }
        /// <summary>
        /// Desc:出库数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal YearExportQty { get; set; }
        /// <summary>
        /// Desc:结存数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal BalanceQty { get; set; }
        /// <summary>
        /// Desc:期出数量
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal ExpectedQty { get; set; }
        /// <summary>
        /// Desc:结存数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal YearBalanceQty { get; set; }
        /// <summary>
        /// Desc:期出数量(月)
        /// Default:
        /// Nullable:False
        /// </summary>
        public decimal 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/BllPdaServer/PdaCrServer.cs
@@ -2,9 +2,12 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model.InterFaceModel;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.PdaDto;
using Newtonsoft.Json;
using SqlSugar;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
@@ -776,7 +779,7 @@
                var storageArea = new List<SysStorageArea>();
                if (string.IsNullOrEmpty(palletNo))
                {
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o=>o.AreaNo).ToList();
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                }
                else
                {
@@ -798,7 +801,7 @@
                    {
                        throw new Exception("储位信息不存在,请检查!");
                    }
                    if (storageLocat.AreaNo.Contains("B0"))
                    {
                        storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B0") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
@@ -807,7 +810,7 @@
                    {
                        storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B1") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                    }
                }
                }
                return storageArea;
            }
            catch (Exception ex)
@@ -880,7 +883,7 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="ruku"></param>
        public void AgvTransport(string palletNo, string areaNo, string ruku, int userId)
        public void AgvTransport(string palletNo, string areaNo, string ruku, int userId, string url)
        {
            if (string.IsNullOrEmpty(palletNo))
            {
@@ -893,7 +896,7 @@
            if (!string.IsNullOrEmpty(areaNo) && !string.IsNullOrEmpty(ruku))
            {
                throw new Exception("目标区域和入库口不能同时选择!");
            }
            }
            try
            {
                string EndLocat = string.Empty;//目标位置                
@@ -902,7 +905,7 @@
                if (log != null)
                {
                    throw new Exception("该托盘已有小车等待执行或正在执行的任务!");
                }
                }
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (stockDetail == null)
                {
@@ -915,7 +918,7 @@
                    {
                        throw new Exception("所选区域信息不存在,请检查!");
                    }
                    EndLocat = GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo,palletNo);
                    EndLocat = GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo);
                }
                else
                {
@@ -950,7 +953,7 @@
                        throw new Exception("目标储位信息不存在,请检查!");
                    }
                }
                //开启事务
                Db.BeginTran();
@@ -995,15 +998,63 @@
                {
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                }
                }
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                //提交事务
                Db.CommitTran();
                #region 呼叫小车代码
                List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                AgvSchedulingTask agvTask = new AgvSchedulingTask();
                agvTask.ReqCode = taskNo;
                agvTask.TaskTyp = "F01";
                agvTask.WbCode = "";
                agvTask.PositionCodePath = null;
                agvTask.PodCode = "-1";
                agvTaskList.Add(agvTask);
                var IsTrue = false;
                while (IsTrue == true)
                {
                    // 正式运行程序放开
                    string str = "";
                    var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                    var jsonData = JsonConvert.SerializeObject(agvTaskList);
                    string response = "";
                    try
                    {
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            IsTrue = true;
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                            throw new Exception(agvModel.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                #endregion
                //提交事务
                Db.CommitTran();
            }
            catch (Exception ex)
            {
@@ -1018,7 +1069,7 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        public void AgvTransport2(string soNo,string palletNo, string areaNo, int userId)
        public void AgvTransport2(string soNo, string palletNo, string areaNo, int userId, string url)
        {
            if (string.IsNullOrEmpty(soNo))
            {
@@ -1032,6 +1083,8 @@
            {
                //开启事务
                Db.BeginTran();
                List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                //出库单信息
                var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNo);
                if (notice == null)
@@ -1054,7 +1107,7 @@
                    string sqlStr = $"select * from DataStockDetail where PalletNo in (select PalletNo from BllExportAllot where IsDel='0' and SONo='{soNo}')";
                    stockDetailList = Db.Ado.SqlQuery<DataStockDetail>(sqlStr).ToList();
                }
                if (stockDetailList.Count<=0)
                if (stockDetailList.Count <= 0)
                {
                    throw new Exception("托盘明细不存在,请检查!");
                }
@@ -1067,7 +1120,7 @@
                foreach (var item in stockDetailList)
                {
                    //任务信息
                    var logInfo = log.First(w =>w.PalletNo == item.PalletNo);
                    var logInfo = log.First(w => w.PalletNo == item.PalletNo);
                    if (logInfo != null)
                    {
                        throw new Exception($"托盘号:{item.PalletNo}已有小车等待执行或正在执行的任务!");
@@ -1130,6 +1183,15 @@
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                    AgvSchedulingTask agvTask = new AgvSchedulingTask();
                    agvTask.ReqCode = taskNo;
                    agvTask.TaskTyp = "F01";
                    agvTask.WbCode = "";
                    agvTask.PositionCodePath = null;
                    agvTask.PodCode = "-1";
                    agvTaskList.Add(agvTask);
                    //修改库存明细信息
                    item.Status = "4";//移库锁定
                    item.LockQty = item.Qty;//锁定库存数量
@@ -1157,12 +1219,51 @@
                    //添加操作日志记录
                    var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                }
                //提交事务
                Db.CommitTran();
                #region 呼叫小车代码
                var IsTrue = false;
                while (IsTrue == true)
                {
                    // 正式运行程序放开
                    string str = "";
                    var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                    var jsonData = JsonConvert.SerializeObject(agvTaskList);
                    string response = "";
                    try
                    {
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运取货命令", "AGV");
                        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            IsTrue = true;
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                            throw new Exception(agvModel.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                #endregion
                //提交事务
                Db.CommitTran();
            }
            catch (Exception ex)
            {
@@ -1177,16 +1278,16 @@
        /// <param name="skuNo"></param>
        /// <param name="lotNo"></param>
        /// <returns></returns>
        private string GetLocat(string areaNo,string skuNo,string lotNo,string palletNo,string hasLocatNoList="")
        private string GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
        {
            try
            {
                string endLocat = string.Empty;//目标储位
                //当然区域所有储位信息
                                               //当然区域所有储位信息
                var storageLocatList = Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToList();
                //同区域同批次物料的储位信息
                List<string> locatList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.SkuNo == skuNo && w.LotNo == lotNo && w.WareHouseNo == "W02" && w.AreaNo == areaNo && w.PalletNo != palletNo)
                    .OrderByDescending(o=>o.LocatNo).Select(s=>s.LocatNo).Distinct().ToList();
                    .OrderByDescending(o => o.LocatNo).Select(s => s.LocatNo).Distinct().ToList();
                foreach (var item in locatList)
                {
                    var locatInfo = storageLocatList.Where(w => w.LocatNo == item).First();
@@ -1201,7 +1302,7 @@
                if (string.IsNullOrEmpty(endLocat))
                {
                    var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0" && !hasLocatNoList.Contains(w.LocatNo))
                                .OrderByDescending(m => m.Layer).OrderByDescending(m=>m.Column).OrderByDescending(m=> m.Row).First();
                                .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First();
                    if (locatInfo3 != null)
                    {
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -139,8 +139,8 @@
                        }
                        else
                        {
                            stocks = stockList.Where(m=> m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
                            stocks = stockList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
                            foreach (var demo in stocks)
                            {
                                if (q1 >= d.Qty)
@@ -148,7 +148,7 @@
                                    continue;
                                }
                                var q2 = demo.Qty - demo.LockQty - demo.FrozenQty;
                                if (q2 > d.Qty - q1)
                                {
                                    q1 += d.Qty - q1;
@@ -157,9 +157,9 @@
                                else
                                {
                                    q1 += q2;
                                    dic.Add(demo.Id,q2);
                                    dic.Add(demo.Id, q2);
                                }
                            }
                            if (d.Qty >= q1)
                            {
@@ -185,7 +185,7 @@
                                throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足");
                            }
                        }
                        foreach (var s in dic)
                        {
                            var st = stockList.First(a => a.Id == s.Key);
@@ -214,12 +214,12 @@
                                CreateUser = 0,
                            };
                            list.Add(item);
                            st.LockQty += s.Value;//锁定数量
                            var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty })
                                .ExecuteCommand();
                        }
                    }
                    var notice = new BllExportNotice()
                    {
@@ -462,7 +462,7 @@
                    throw new Exception("未查到对应出库类型的物料");
                }
                if (type!="8")
                if (type != "8")
                {
                    skuList = skuList.Where(m => m != "100088").ToList();
                }
@@ -645,7 +645,7 @@
                            //}
                            //if (d.Qty >= q1)
                            //{
                                stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                            stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                            //    if (stocks.Count == 0)
                            //    {
                            //        throw new Exception($"总库存中出库物料信息:{d.SkuNo}库存数量不足");
@@ -667,7 +667,7 @@
                            //    throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足");
                            //}
                        }
                        var item = new BllExportNoticeDetail()
                        {
                            SONo = billNo,
@@ -694,7 +694,7 @@
                        };
                        list.Add(item);
                        stocks.First().LockQty += d.Qty;//锁定数量
                        var i = Db.Updateable(stocks.First()).UpdateColumns(it => new { it.LockQty })
                            .ExecuteCommand();
@@ -2177,7 +2177,7 @@
                            //var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            //////解析返回数据 
                            //var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                            var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                            //if (wcsModel.StatusCode == 0)
                            //{
                            //    //更改任务的发送返回时间//
@@ -2455,7 +2455,7 @@
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        public OutCommandDto AgainSendSoTask(string taskNo, string Receiver, int userId, string url)
        {
            try
            {
@@ -2506,22 +2506,42 @@
                {
                    //程序正式发布后放开
                    var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    var response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                    var response = HttpHelper.DoPost(url, jsonData, Receiver == "WCS" ? "下发给WCS出库命令" : "下发给AGV出库命令", "WCS");
                    var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    ////解析返回数据
                    var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                    if (wcsModel.StatusCode == 0)
                    if (Receiver == "WCS")
                    {
                        //更改任务的发送返回时间//
                        new TaskServer().EditTaskIssueOk(list, time1, time2);
                        ////解析返回数据
                        var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                        if (wcsModel.StatusCode == 0)
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list, time1, time2);
                        }
                        if (wcsModel.StatusCode == -1)
                        {
                            new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg);
                            throw new Exception($"wcs返回状态异常:{wcsModel.Msg}");
                        }
                    }
                    if (wcsModel.StatusCode == -1)
                    else if (Receiver == "AGV")
                    {
                        new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg);
                        throw new Exception($"wcs返回状态异常:{wcsModel.Msg}");
                        ////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list, time1, time2);
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list, time1, time2, agvModel.Message);
                            throw new Exception($"agv返回状态异常:{agvModel.Message}");
                        }
                    }
                }
                catch (Exception ex)
                {
@@ -2854,11 +2874,11 @@
                            throw new Exception("库存不足,无可出库库存");
                        }
                        //0:成品出库、1:领料出库、2:抽检出库、3:物料取样出库、4:不合格品出库、5:中间品出库、6:代储出库、7:其他出库、8:寄存出库
                        if (notice.Type == "0" || notice.Type == "1" )//成品、原辅料出库
                        if (notice.Type == "0" || notice.Type == "1")//成品、原辅料出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList();
                        }
                        else if (notice.Type == "3" )//取样出库
                        else if (notice.Type == "3")//取样出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "0").ToList();
                        }
@@ -2869,7 +2889,7 @@
                        else if (notice.Type == "4")//不合格出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList();
                        }
                        }
                        #region 包装信息
@@ -2905,8 +2925,8 @@
                                bNum = Convert.ToInt32(pack.L1Num);
                            }
                        }
                        //if (pNum == 0)
                        //{
                        //    throw new Exception("未查询到物料包装托箱关系信息");
@@ -3125,7 +3145,7 @@
                        //    {
                        //        d.LotNo = "";
                        //    }
                        //}
                    }
                    notice.Status = "0";
@@ -3345,7 +3365,7 @@
                        bl.Qty += st.Qty;
                        Db.Updateable(bl).ExecuteCommand();
                    }
                    //库存明细
                    stock.LockQty += st.Qty;
                    stock.Status = stock.LockQty == stock.Qty ? "2" : "1";
Wms/WMS.BLL/DataServer/StockInfoServer.cs
New file
@@ -0,0 +1,623 @@
using Dm;
using Microsoft.IdentityModel.Tokens;
using Model.ModelVm.DataVm;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WMS.DAL;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IDataServer;
namespace WMS.BLL.DataServer
{
    public class StockInfoServer : DbHelper<DataStockInfo>, IStockInfoServer
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public StockInfoServer() : base(Db)
        {
        }
        /// <summary>
        /// 每日凌晨自动执行当前方法
        /// 添加库存总表到库存信息
        /// </summary>
        /// <returns></returns>
        public string ByDayInsertStock()
        {
            try
            {
                string arr = "";
                //获取今日时间与昨日时间
                var data1 = DateTime.Now.ToString("yyyy-MM-dd");
                var data2 = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");
                //获取当前库存总表信息
                var stock = Db.Queryable<DataStock>().Where(a => a.IsDel == "0").ToList();
                //以及前一天的库存信息
                var info = Db.Queryable<DataStockInfo>().Where(a => a.IsDel == "0" && a.CreateTime.Year == DateTime.Parse(data2).Year && a.CreateTime.Month == DateTime.Parse(data2).Month && a.CreateTime.Day == DateTime.Parse(data2).Day).ToList();
                //获取物料信息
                var sku = Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0").ToList();
                //获取单位信息
                var unit = Db.Queryable<SysUnit>().Where(a => a.IsDel == "0").ToList();
                Db.BeginTran();
                List<DataStockInfo> list = new List<DataStockInfo>();
                //验证是否存在前一天的库存信息
                if (info.Count <= 0)
                {
                    //根据库存总表添加对应库存信息
                    foreach (var item in stock)
                    {
                        //获取对应单位信息
                        var unitNo = sku.Where(a => a.IsDel == "0" && a.SkuNo == item.SkuNo).Select(a => a.UnitNo).ToString();
                        var unitName = unit.Where(a => a.IsDel == "0" && a.UnitNo == unitNo).Select(a => a.UnitName).ToString();
                        var Folded = item.Standard.Split("*");
                        int count = 0;
                        var sum = 0m;
                        //获取对应折件数量
                        foreach (var item1 in Folded)
                        {
                            if (count == 0)
                            {
                                if (item1.Contains(unitName))
                                {
                                    count = 1;
                                    sum = Convert.ToDecimal(item1);
                                }
                            }
                            if (count == 1)
                            {
                                sum *= Convert.ToDecimal(item1);
                            }
                        }
                        DataStockInfo data = new DataStockInfo()
                        {
                            SkuNo = item.SkuNo,
                            SkuName = item.SkuName,
                            Standard = item.Standard,
                            Unit = unitName,
                            LastMonthQty = 0, //上月结存-库存数量
                            LastMonthFoldedQty = 0, //上月结存-折件数量
                            ArrDayQty = item.Qty, //入库数量-当日数量
                            ArrDayFoldedQty = item.Qty / sum, //入库数量-当日折件数量
                            ArrMonthQty = item.Qty, //入库数量-当月数量
                            ArrMonthFoldedQty = item.Qty / sum, //入库数量-当月折件数量
                            ArrYearQty = item.Qty, //入库数量-本年数量
                            ArrYearFoldedQty = item.Qty / sum, //入库数量-本年折件数量
                            SoDayQty = 0, //出库数量-当日数量
                            SoDayFoldedQty = 0, //出库数量-当日折件数量
                            SoMonthQty = 0, //出库数量-当月数量
                            SoMonthFoldedQty = 0, //出库数量-当月折件数量
                            SoYearQty = 0, //出库数量-本年数量
                            SoYearFoldedQty = 0, //出库数量-本年折件数量
                            MonthQty = item.Qty, //当月数量-累计数量
                            MonthFoldedQty = item.Qty / sum, //当月数量-累计折件数量
                            DepositQty = 0,
                            Qty = item.Qty,
                            SecurityQty = sku[0].LowInventory, //暂用低库存
                            Situation = item.Qty < sku[0].LowInventory ? "1" : "0",
                            IsDel = "0",
                            CreateTime = DateTime.Now,
                            CreateUser = 0,
                            UpdateTime = null,
                            UpdateUser = null,
                        };
                        list.Add(data);
                    }
                }
                else
                {
                    //验证今日是一号还是其它
                    if (DateTime.Parse(data2).Day == 1)
                    {
                        //验证月份是否为1月
                        if (DateTime.Parse(data2).Month == 1)
                        {
                            //1月
                            //1月需要重新计算所有
                            foreach (var item in info)
                            {
                                var Folded = item.Standard.Split("*");
                                int count = 0;
                                var sum = 0m;
                                //获取对应折件数量
                                foreach (var item1 in Folded)
                                {
                                    if (count == 0)
                                    {
                                        if (item1.Contains(item.Unit))
                                        {
                                            count = 1;
                                            sum = Convert.ToDecimal(item1);
                                        }
                                    }
                                    if (count == 1)
                                    {
                                        sum *= Convert.ToDecimal(item1);
                                    }
                                }
                                DataStockInfo data = new DataStockInfo()
                                {
                                    SkuNo = item.SkuNo,
                                    SkuName = item.SkuName,
                                    Standard = item.Standard,
                                    Unit = item.Unit,
                                    LastMonthQty = item.Qty, //上月结存-库存数量
                                    LastMonthFoldedQty = item.Qty / sum, //上月结存-折件数量
                                    ArrDayQty = 0, //入库数量-当日数量
                                    ArrDayFoldedQty = 0, //入库数量-当日折件数量
                                    ArrMonthQty = 0, //入库数量-当月数量
                                    ArrMonthFoldedQty = 0, //入库数量-当月折件数量
                                    ArrYearQty = 0, //入库数量-本年数量
                                    ArrYearFoldedQty = 0, //入库数量-本年折件数量
                                    SoDayQty = 0, //出库数量-当日数量
                                    SoDayFoldedQty = 0, //出库数量-当日折件数量
                                    SoMonthQty = 0, //出库数量-当月数量
                                    SoMonthFoldedQty = 0, //出库数量-当月折件数量
                                    SoYearQty = 0, //出库数量-本年数量
                                    SoYearFoldedQty = 0, //出库数量-本年折件数量
                                    MonthQty = 0, //当月数量-累计数量
                                    MonthFoldedQty = 0, //当月数量-累计折件数量
                                    DepositQty = item.DepositQty,
                                    Qty = item.Qty,
                                    SecurityQty = item.SecurityQty,
                                    Situation = item.Qty < item.SecurityQty ? "1" : "0",
                                    IsDel = "0",
                                    CreateTime = DateTime.Now,
                                    CreateUser = 0,
                                    UpdateTime = null,
                                    UpdateUser = null,
                                };
                                list.Add(data);
                            }
                        }
                        else if (DateTime.Parse(data2).Month != 1)
                        {
                            //1号
                            //1号需要重新计算当月与上月、当日
                            foreach (var item in info)
                            {
                                var Folded = item.Standard.Split("*");
                                int count = 0;
                                var sum = 0m;
                                //获取对应折件数量
                                foreach (var item1 in Folded)
                                {
                                    if (count == 0)
                                    {
                                        if (item1.Contains(item.Unit))
                                        {
                                            count = 1;
                                            sum = Convert.ToDecimal(item1);
                                        }
                                    }
                                    if (count == 1)
                                    {
                                        sum *= Convert.ToDecimal(item1);
                                    }
                                }
                                DataStockInfo data = new DataStockInfo()
                                {
                                    SkuNo = item.SkuNo,
                                    SkuName = item.SkuName,
                                    Standard = item.Standard,
                                    Unit = item.Unit,
                                    LastMonthQty = item.Qty, //上月结存-库存数量
                                    LastMonthFoldedQty = item.Qty / sum, //上月结存-折件数量
                                    ArrDayQty = 0, //入库数量-当日数量
                                    ArrDayFoldedQty = 0, //入库数量-当日折件数量
                                    ArrMonthQty = 0, //入库数量-当月数量
                                    ArrMonthFoldedQty = 0, //入库数量-当月折件数量
                                    ArrYearQty = item.ArrYearQty, //入库数量-本年数量
                                    ArrYearFoldedQty = item.ArrYearQty / sum, //入库数量-本年折件数量
                                    SoDayQty = 0, //出库数量-当日数量
                                    SoDayFoldedQty = 0, //出库数量-当日折件数量
                                    SoMonthQty = 0, //出库数量-当月数量
                                    SoMonthFoldedQty = 0, //出库数量-当月折件数量
                                    SoYearQty = item.SoYearQty, //出库数量-本年数量
                                    SoYearFoldedQty = item.SoYearQty / sum, //出库数量-本年折件数量
                                    MonthQty = item.Qty, //当月数量-累计数量
                                    MonthFoldedQty = item.Qty / sum, //当月数量-累计折件数量
                                    DepositQty = item.DepositQty,
                                    Qty = item.Qty,
                                    SecurityQty = item.SecurityQty,
                                    Situation = item.Qty < item.SecurityQty ? "1" : "0",
                                    IsDel = "0",
                                    CreateTime = DateTime.Now,
                                    CreateUser = 0,
                                    UpdateTime = null,
                                    UpdateUser = null,
                                };
                                list.Add(data);
                            }
                        }
                        #region 注释例子
                        ////1号
                        ////1号需要重新计算当月与上月、当日
                        //foreach (var item in info)
                        //{
                        //    DataStockInfo data = new DataStockInfo()
                        //    {
                        //        SkuNo = item.SkuNo,
                        //        SkuName = item.SkuName,
                        //        Standard = item.Standard,
                        //        Unit = item.Unit,
                        //        LastMonthQty = item.Qty,
                        //        ArrDayQty = 0,
                        //        ArrMonthQty = 0,
                        //        ArrYearQty = item.ArrYearQty,
                        //        SoDayQty = 0,
                        //        SoMonthQty = 0,
                        //        SoYearQty = item.SoYearQty,
                        //        MonthQty = item.Qty,
                        //        DepositQty = item.DepositQty,
                        //        Qty = item.Qty,
                        //        SecurityQty = item.SecurityQty,
                        //        Situation = item.Qty >= item.SecurityQty ? "0" : "1",
                        //        IsDel = "0",
                        //        CreateTime = DateTime.Now,
                        //        CreateUser = 0,
                        //        UpdateTime = null,
                        //        UpdateUser = null,
                        //    };
                        //    list.Add(data);
                        //}
                        #endregion
                    }
                    else
                    {
                        //其它
                        //需要计算当日
                        foreach (var item in info)
                        {
                            var Folded = item.Standard.Split("*");
                            int count = 0;
                            var sum = 0m;
                            //获取对应折件数量
                            foreach (var item1 in Folded)
                            {
                                if (count == 0)
                                {
                                    if (item1.Contains(item.Unit))
                                    {
                                        count = 1;
                                        sum = Convert.ToDecimal(item1);
                                    }
                                }
                                if (count == 1)
                                {
                                    sum *= Convert.ToDecimal(item1);
                                }
                            }
                            DataStockInfo data = new DataStockInfo()
                            {
                                SkuNo = item.SkuNo,
                                SkuName = item.SkuName,
                                Standard = item.Standard,
                                Unit = item.Unit,
                                LastMonthQty = item.LastMonthQty, //上月结存-库存数量
                                LastMonthFoldedQty = item.LastMonthQty / sum, //上月结存-折件数量
                                ArrDayQty = 0, //入库数量-当日数量
                                ArrDayFoldedQty = 0, //入库数量-当日折件数量
                                ArrMonthQty = item.ArrMonthQty, //入库数量-当月数量
                                ArrMonthFoldedQty = item.ArrMonthQty / sum, //入库数量-当月折件数量
                                ArrYearQty = item.ArrYearQty, //入库数量-本年数量
                                ArrYearFoldedQty = item.ArrYearQty / sum, //入库数量-本年折件数量
                                SoDayQty = 0, //出库数量-当日数量
                                SoDayFoldedQty = 0, //出库数量-当日折件数量
                                SoMonthQty = item.SoMonthQty, //出库数量-当月数量
                                SoMonthFoldedQty = item.SoMonthQty / sum, //出库数量-当月折件数量
                                SoYearQty = item.SoYearQty, //出库数量-本年数量
                                SoYearFoldedQty = item.SoYearQty / sum, //出库数量-本年折件数量
                                MonthQty = item.MonthQty, //当月数量-累计数量
                                MonthFoldedQty = item.MonthQty / sum, //当月数量-累计折件数量
                                DepositQty = item.DepositQty,
                                Qty = item.Qty,
                                SecurityQty = item.SecurityQty,
                                Situation = item.Qty < item.SecurityQty ? "1" : "0",
                                FoldedQty = item.FoldedQty,
                                IsDel = "0",
                                CreateTime = DateTime.Now,
                                CreateUser = 0,
                                UpdateTime = null,
                                UpdateUser = null,
                            };
                            list.Add(data);
                        }
                    }
                }
                //添加库存信息
                Db.Insertable<DataStockInfo>(list).ExecuteCommand();
                Db.CommitTran();
                return arr;
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw ex;
            }
        }
        /// <summary>
        /// 获取对应天数信息
        /// </summary>
        /// <param name="StartDate"></param>
        /// <returns></returns>
        public List<DataStockInfoVM> GetDataStockInfo(string StartDate)
        {
            try
            {
                var list = Db.Queryable<DataStockInfo>().Where(a => a.IsDel == "0").ToList();
                //验证是否存在选中时间 不存在则赋值今日时间
                if (string.IsNullOrEmpty(StartDate))
                {
                    StartDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ff");
                }
                //根据时间获取对应日期的库存信息
                if (!string.IsNullOrEmpty(StartDate))
                {
                    list = list.Where(a => a.CreateTime.Year == DateTime.Parse(StartDate).Year && a.CreateTime.Month == DateTime.Parse(StartDate).Month && a.CreateTime.Day == DateTime.Parse(StartDate).Day).ToList();
                }
                List<DataStockInfoVM> list1 = new List<DataStockInfoVM>();
                foreach (var item in list)
                {
                    DataStockInfoVM info = new DataStockInfoVM()
                    {
                        SkuNo = item.SkuNo, //物料编码
                        SkuName = item.SkuName, //物料名称
                        Standard = item.Standard, //规格
                        Unit = item.Unit, //单位
                        LastMonthQty = item.LastMonthQty, //上月结存-库存数量
                        LastMonthFoldedQty = item.LastMonthFoldedQty, //上月结存-折件数量
                        ArrDayQty = item.ArrDayQty, //入库数量-当日数量
                        ArrDayFoldedQty = item.ArrDayFoldedQty, //入库数量-当日折件数量
                        ArrMonthQty = item.ArrMonthQty, //入库数量-当月数量
                        ArrMonthFoldedQty = item.ArrMonthFoldedQty, //入库数量-当月折件数量
                        ArrYearQty = item.ArrYearQty, //入库数量-本年数量
                        ArrYearFoldedQty = item.ArrYearFoldedQty, //入库数量-本年折件数量
                        SoDayQty = item.SoDayQty, //出库数量-当日数量
                        SoDayFoldedQty = item.SoDayFoldedQty, //出库数量-当日折件数量
                        SoMonthQty = item.SoMonthQty, //出库数量-当月数量
                        SoMonthFoldedQty = item.SoMonthFoldedQty, //出库数量-当月折件数量
                        SoYearQty = item.SoYearQty, //出库数量-本年数量
                        SoYearFoldedQty = item.SoYearFoldedQty, //出库数量-本年折件数量
                        MonthQty = item.MonthQty, //当月数量-累计数量
                        MonthFoldedQty = item.MonthFoldedQty, //当月数量-累计折件数量
                        DepositQty = item.DepositQty, //寄存数量
                        Qty = item.Qty, //本月库存数量
                        SecurityQty = item.SecurityQty, //安全库存
                        Situation = item.Situation, //安全库存情况
                        IsDel = item.IsDel, //是否删除
                        CreateTime = item.CreateTime, //创建时间
                        CreateUser = item.CreateUser, //创建人
                        UpdateTime = item.UpdateTime, //更新时间
                        UpdateUser = item.UpdateUser, //更新人
                    };
                    list1.Add(info);
                }
                return list1;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 根据出入库新增或修改信息
        /// </summary>
        /// <param name="type">类型 0:入库 1:出库</param>
        /// <param name="qty">入库或出库数量</param>
        /// <param name="isDeposit">是否寄存 0:是 1:否</param>
        /// <param name="skuNo">物料编码</param>
        /// <returns></returns>
        public bool AddOrUptStockInfo(string type, decimal qty, string isDeposit, string skuNo)
        {
            try
            {
                int a = 0;
                bool isTrue = false;
                //获取今日时间
                string date = DateTime.Now.ToString("yyyy-MM-dd");
                //根据物料信息获取今日库存信息
                var list = Db.Queryable<DataStockInfo>().First(a => a.IsDel == "0" && a.SkuNo == skuNo && a.CreateTime.Year == DateTime.Parse(date).Year && a.CreateTime.Month == DateTime.Parse(date).Month && a.CreateTime.Day == DateTime.Parse(date).Day);
                Db.BeginTran();
                //验证是否存在库存信息
                if (list == null)
                {
                    //根据物料编码获取物料信息
                    var sku = Db.Queryable<SysMaterials>().First(a => a.IsDel == "0" && a.SkuNo == skuNo);
                    //根据物料信息获取单位信息
                    var unit = Db.Queryable<SysUnit>().First(a => a.IsDel == "0" && a.UnitNo == sku.UnitNo);
                    //获取对应折件数量
                    var Folded = sku.Standard.Split("*");
                    int count = 0;
                    var sum = 0m;
                    foreach (var item1 in Folded)
                    {
                        if (count == 0)
                        {
                            if (item1.Contains(unit.UnitName))
                            {
                                count = 1;
                                sum = Convert.ToDecimal(item1);
                            }
                        }
                        if (count == 1)
                        {
                            sum *= Convert.ToDecimal(item1);
                        }
                    }
                    DataStockInfo info = new DataStockInfo()
                    {
                        SkuNo = sku.SkuNo,
                        SkuName = sku.SkuName,
                        Standard = sku.Standard,
                        Unit = unit.UnitName,
                        LastMonthQty = 0,
                        ArrDayQty = 0,
                        ArrMonthQty = 0,
                        ArrYearQty = 0,
                        SoDayQty = 0,
                        SoMonthQty = 0,
                        SoYearQty = 0,
                        MonthQty = 0,
                        DepositQty = 0,
                        Qty = 0,
                        SecurityQty = sku.LowInventory,
                        Situation = qty < sku.LowInventory ? "1" : "0",
                        IsDel = "0",
                        CreateTime = DateTime.Now,
                        CreateUser = 0,
                        UpdateTime = null,
                        UpdateUser = null,
                    };
                    if (type == "0") //入库
                    {
                        //编辑对应库存信息
                        info.ArrDayQty += qty; //当日入库数量
                        info.ArrDayFoldedQty += qty; //当日入库数量-折件
                        info.ArrMonthQty += qty; //当月入库数量
                        info.ArrMonthFoldedQty += qty; //当月入库数量-折件
                        info.ArrYearQty += qty; //今年入库数量
                        info.ArrYearFoldedQty += qty; //今年入库数量-折件
                        info.MonthQty += qty; //当月结存
                        info.MonthFoldedQty += qty; //当月结存-折件
                        if (isDeposit == "0")
                        {
                            //验证是否为寄存数量
                            info.DepositQty += qty; //寄存数量
                        }
                        info.Qty = info.MonthQty + info.DepositQty; //本月库存数量
                    }
                    else if (type == "1") //出库
                    {
                        //编辑对应库存信息
                        info.SoDayQty += qty; //当日出库数量
                        info.ArrDayFoldedQty += qty; //当日入库数量-折件
                        info.ArrMonthQty += qty; //当月入库数量
                        info.ArrMonthFoldedQty += qty; //当月入库数量-折件
                        info.ArrYearQty += qty; //今年入库数量
                        info.ArrYearFoldedQty += qty; //今年入库数量-折件
                        info.MonthQty += qty; //当月结存
                        info.MonthFoldedQty += qty; //当月结存-折件
                        if (isDeposit == "0")
                        {
                            //验证是否为寄存数量
                            info.DepositQty -= qty; //寄存数量
                        }
                        info.Qty = info.MonthQty + info.DepositQty; //本月库存数量
                    }
                    //新增库存信息
                    a = Db.Insertable(info).ExecuteCommand();
                }
                else
                {
                    if (type == "0") //入库
                    {
                        //编辑对应库存信息
                        list.ArrDayQty += qty; //当日出库数量
                        list.ArrDayFoldedQty += qty; //当日入库数量-折件
                        list.ArrMonthQty += qty; //当月入库数量
                        list.ArrMonthFoldedQty += qty; //当月入库数量-折件
                        list.ArrYearQty += qty; //今年入库数量
                        list.ArrYearFoldedQty += qty; //今年入库数量-折件
                        list.MonthQty += qty; //当月结存
                        list.MonthFoldedQty += qty; //当月结存-折件
                        if (isDeposit == "0")
                        {
                            //验证是否为寄存数量
                            list.DepositQty += qty; //寄存数量
                        }
                        list.Qty = list.MonthQty + list.DepositQty; //本月库存数量
                        list.Situation = list.Qty < list.SecurityQty ? "1" : "0"; //安全库存情况
                    }
                    else if (type == "1") //出库
                    {
                        //编辑对应库存信息
                        list.SoDayQty += qty; //当日出库数量
                        list.ArrDayFoldedQty += qty; //当日入库数量-折件
                        list.ArrMonthQty += qty; //当月入库数量
                        list.ArrMonthFoldedQty += qty; //当月入库数量-折件
                        list.ArrYearQty += qty; //今年入库数量
                        list.ArrYearFoldedQty += qty; //今年入库数量-折件
                        list.MonthQty += qty; //当月结存
                        list.MonthFoldedQty += qty; //当月结存-折件
                        if (isDeposit == "0")
                        {
                            //验证是否为寄存数量
                            list.DepositQty -= qty; //寄存数量
                        }
                        list.Qty = list.MonthQty + list.DepositQty; //本月库存数量
                        list.Situation = list.Qty < list.SecurityQty ? "1" : "0"; //安全库存情况
                    }
                    a = Db.Updateable(list).ExecuteCommand();
                }
                Db.CommitTran();
                if (a == 1)
                {
                    isTrue = true;
                }
                return isTrue;
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw ex;
            }
        }
    }
}
Wms/WMS.Entity/DataEntity/DataStockInfo.cs
New file
@@ -0,0 +1,182 @@
using Microsoft.IdentityModel.Tokens;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;
namespace WMS.Entity.DataEntity
{
    ///<summary>
    ///库存记录表
    ///</summary>
    [SugarTable("DataStock")]
    public class DataStockInfo : BaseEntity
    {
        /// <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:True
        /// </summary>
        public string Standard { get; set; }
        /// <summary>
        /// Desc:单位
        /// Default:
        /// Nullable:True
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// Desc:上月结存-库存数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal LastMonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:上月结存-折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal LastMonthQty { get; set; }
        /// <summary>
        /// Desc:入库数量-当日数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrDayQty { get; set; }
        /// <summary>
        /// Desc:入库数量-当日折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrDayFoldedQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本月数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrMonthQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本月折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrMonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本年数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrYearQty { get; set; }
        /// <summary>
        /// Desc:入库数量-本年折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal ArrYearFoldedQty { get; set; }
        /// <summary>
        /// Desc:出库数量-当日数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoDayQty { get; set; }
        /// <summary>
        /// Desc:出库数量-当日折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoDayFoldedQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本月数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoMonthQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本月折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoMonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本年数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoYearQty { get; set; }
        /// <summary>
        /// Desc:出库数量-本年折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SoYearFoldedQty { get; set; }
        /// <summary>
        /// Desc:当月结存-累计数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal MonthQty { get; set; }
        /// <summary>
        /// Desc:当月结存-累计折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal MonthFoldedQty { get; set; }
        /// <summary>
        /// Desc:寄存数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal DepositQty { get; set; }
        /// <summary>
        /// Desc:本月库存数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal Qty { get; set; }
        /// <summary>
        /// Desc:安全库存
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal SecurityQty { get; set; }
        /// <summary>
        /// Desc:安全库存情况
        /// Default:
        /// Nullable:True
        /// </summary>
        public string Situation { get; set; }
        /// <summary>
        /// Desc:折件数量
        /// Default:
        /// Nullable:True
        /// </summary>
        public decimal FoldedQty { get; set; }
    }
}
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs
@@ -149,7 +149,7 @@
        /// <param name="userId">操作人</param> 
        /// <param name="url">下发路径</param> 
        /// <returns></returns>
        OutCommandDto AgainSendSoTask(string taskNo, int userId,string url);
        OutCommandDto AgainSendSoTask(string taskNo, string Receiver, int userId,string url);
        /// <summary>
        /// 手动取消出库任务
        /// </summary>
Wms/WMS.IBLL/IDataServer/IStockInfoServer.cs
New file
@@ -0,0 +1,35 @@
using Model.ModelVm.DataVm;
using System;
using System.Collections.Generic;
using System.Text;
using WMS.Entity.DataEntity;
namespace WMS.IBLL.IDataServer
{
    public interface IStockInfoServer
    {
        /// <summary>
        /// 每日凌晨自动执行当前方法
        /// 添加库存总表到库存信息
        /// </summary>
        /// <returns></returns>
        string ByDayInsertStock();
        /// <summary>
        /// 获取对应天数信息
        /// </summary>
        /// <param name="StartDate"></param>
        /// <returns></returns>
        List<DataStockInfoVM> GetDataStockInfo(string StartDate);
        /// <summary>
        /// 根据出入库新增或修改信息
        /// </summary>
        /// <param name="type">类型 0:入库 1:出库</param>
        /// <param name="qty">入库或出库数量</param>
        /// <param name="isDeposit">是否寄存 0:是 1:否</param>
        /// <param name="skuNo">物料编码</param>
        /// <returns></returns>
        bool AddOrUptStockInfo(string type, decimal qty, string isDeposit, string skuNo);
    }
}
Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
@@ -129,7 +129,7 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="ruku"></param>
        void AgvTransport(string palletNo, string areaNo, string ruku, int userId);
        void AgvTransport(string palletNo, string areaNo, string ruku, int userId,string url);
        /// <summary>
        ///  agv转运呼叫小车取货
        /// </summary>
@@ -137,7 +137,7 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        void AgvTransport2(string soNo, string palletNo, string areaNo, int userId);
        void AgvTransport2(string soNo, string palletNo, string areaNo, int userId, string url);
        #endregion
    }
}
Wms/Wms/Controllers/BllSoController.cs
@@ -726,7 +726,7 @@
        /// <param name="taskNo">任务号</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult AgainSendSoTask(string taskNo)
        public IActionResult AgainSendSoTask(string taskNo, string Receiver)
        {
            try
            {
@@ -741,7 +741,7 @@
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                _exNoticeSvc.AgainSendSoTask(taskNo, int.Parse(userId),"");
                _exNoticeSvc.AgainSendSoTask(taskNo,Receiver, int.Parse(userId),"");
                return Ok(new { code = 0, msg = "成功下发任务", data = "" });
Wms/Wms/Controllers/DownApiController.cs
@@ -13,6 +13,7 @@
using WMS.IBLL.IBllSoServer;
using WMS.IBLL.ILogServer;
using Wms.Tools;
using System.Collections.Generic;
namespace Wms.Controllers
{
@@ -49,7 +50,7 @@
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        public IActionResult IssueOutHouse(string soNo,string unstackingMode, string outMode,string loadingAddre)
        public IActionResult IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre)
        {
            try
            {
@@ -70,10 +71,10 @@
                //    return Ok(new { code = 1, msg = "请选择出库口" });
                //}
                var list = _exNoticeSvc.IssueOutHouse(soNo,unstackingMode, outMode,loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl,out string str);
                return Ok(new { code = 0, msg = str , data = list });
                var list = _exNoticeSvc.IssueOutHouse(soNo, unstackingMode, outMode, loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                return Ok(new { code = 0, msg = str, data = list });
            }
            catch (Exception e)
            {
@@ -87,7 +88,7 @@
        /// <param name="taskNo"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult AgainSendSoTask(string taskNo)
        public IActionResult AgainSendSoTask(string taskNo,string Receiver)
        {
            try
            {
@@ -102,8 +103,20 @@
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var list = _exNoticeSvc.AgainSendSoTask(taskNo, int.Parse(userId),_config.WcsHost + _config.IssueComApiUrl2);
                //var list = _exNoticeSvc.AgainSendSoTask(taskNo, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl2);
                OutCommandDto list = new OutCommandDto();
                if (Receiver == "WCS")
                {
                    //需判断AGV或WCS的出库任务
                    //wcs
                    list = _exNoticeSvc.AgainSendSoTask(taskNo, Receiver, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl2);
                }
                else if(Receiver == "AGV")
                {
                    //agv
                    list = _exNoticeSvc.AgainSendSoTask(taskNo, Receiver, int.Parse(userId), _config.WcsHost + _config.ContinueTask);
                }
                return Ok(new { code = 0, msg = "重新下发已完成", data = list });
@@ -122,7 +135,7 @@
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        public IActionResult CheckOutHouse(string crNo,string outMode)
        public IActionResult CheckOutHouse(string crNo, string outMode)
        {
            try
            {
@@ -138,7 +151,7 @@
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var list = _crCheckSvc.CheckOutHouse(crNo, outMode,int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                var list = _crCheckSvc.CheckOutHouse(crNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                return Ok(new { code = 0, msg = str, data = list });
@@ -194,19 +207,19 @@
        public IActionResult RequestRoadWay(RequestLocate model)
        {
            var logStr = "";
            logStr = $@".\log\WCS\WCS申请巷道" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"WCS申请巷道:( {jsonData} ),", logStr);
                var list = _asnPalletBindSvc.RequestRoadWay(model.PalletNo, model.HouseNo );
                var list = _asnPalletBindSvc.RequestRoadWay(model.PalletNo, model.HouseNo);
                LogFile.SaveLogToFile($"WCS申请巷道返回:( {JsonConvert.SerializeObject(list)} ),", logStr);
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8),
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8),
                    "申请巷道", $"申请巷道托盘号:{model.PalletNo.Substring(0, 8)}的成功信息", 2);
                return Ok(new { Success = 0, Message = "申请储位成功", TaskList = list });
@@ -214,7 +227,7 @@
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"WCS申请巷道返回:( {e.Message} ),", logStr);
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8),
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8),
                    "申请巷道", $"申请巷道托盘号:{model.PalletNo.Substring(0, 8)}的失败信息", 2);
                return Ok(new ErpModel { Success = -1, Message = e.Message });
@@ -253,7 +266,7 @@
            {
                logStr = $@".\log\WCS\WCS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            }
            try
            {
                if (model.PalletNo.Length == 9)
@@ -268,11 +281,11 @@
                }
                string pallet = model.PalletNo.Substring(0, 8);
                var list = _asnPalletBindSvc.RequestLocation(pallet, model.HouseNo,model.RoadwayNo);
                var list = _asnPalletBindSvc.RequestLocation(pallet, model.HouseNo, model.RoadwayNo);
                if (model.PalletNo.Length == 9)
                {
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0, 8)}的成功信息",2);// int.Parse(userId)
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0, 8)}的成功信息", 2);// int.Parse(userId)
                    LogFile.SaveLogToFile($"WMS申请储位成功:( {JsonConvert.SerializeObject(list)} ),", logStr);
                }
                else if (model.PalletNo.Length == 8)
@@ -281,7 +294,7 @@
                }
                if (model.PalletNo.Length == 9)
                {
                }
                return Ok(new { Success = 0, Message = "申请储位成功", TaskList = list });
@@ -290,14 +303,14 @@
            {
                if (model.PalletNo.Length == 9)
                {
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0,8)}的失败信息", 2);//int.Parse(userId)
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0, 8)}的失败信息", 2);//int.Parse(userId)
                    LogFile.SaveLogToFile($"WMS申请储位失败返回:( {e.Message} ),", logStr);
                }
                else if(model.PalletNo.Length == 8)
                else if (model.PalletNo.Length == 8)
                {
                    LogFile.SaveLogToFile($"WCS申请储位返回:( {e.Message} ),", logStr);
                }
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }
@@ -328,14 +341,14 @@
                    case "0"://入库完成任务
                        if (model.TaskType == "0")//0:入库 1:出库 2:移库
                        {
                            _asnPalletBindSvc.ArrivalSuccess(model.TaskNo,0);
                            _asnPalletBindSvc.ArrivalSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "入库完成" });
                        }
                        break;
                    case "1"://出库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _exNoticeSvc.ExportSuccess(model.TaskNo,0);
                            _exNoticeSvc.ExportSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "出库完成" });
                        }
                        else if (model.TaskType == "2")
@@ -362,8 +375,8 @@
                            //填写移库完成代码
                        }
                        break;
                    default :
                        return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" });
                    default:
                        return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" });
                }
                return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" });
            }
@@ -379,7 +392,7 @@
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult EmptyException(ReceiveWcsSignal model)
        public IActionResult EmptyException(ReceiveWcsSignal model)
        {
            var logStr = $@".\log\WCS\异常反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
@@ -390,7 +403,7 @@
                var bl = _exNoticeSvc.EmptyException(model);
                LogFile.SaveLogToFile($"空取异常:(执行结果成功),", logStr);
                return Ok(new { Success = 0, Message = ""});
                return Ok(new { Success = 0, Message = "" });
            }
            catch (Exception e)
            {
@@ -404,7 +417,7 @@
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FullException(ReceiveWcsSignal model)
        public IActionResult FullException(ReceiveWcsSignal model)
        {
            var logStr = $@".\log\WCS\异常反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
@@ -476,6 +489,58 @@
        //车间叫料
        #region AGV
        /// <summary>
        ///  任务执行通知接口
        ///  AGV 执行回调的方法,包含任务开始,走出储位,任务完成及任务取消。
        ///  取消通知为任务单,其他通知为单个任务组或子任务。注意:是否通知需要在任务模板配置
        /// </summary>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        [HttpPost]
        public IActionResult AgvCallback(AgvContinueTask model)
        {
            try
            {
                //记录log
                var logStr = $@".\log\AGV\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"AGV任务反馈执行通知:( {jsonData} ),", logStr);
                //接收时间
                var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var orderType = _taskSvc.GetTaskOrderType(model.TaskCode);// 判断单据类型入出移
                var taskType = _taskSvc.GetTaskType(model.TaskCode);//根据任务号获取任务类型
                switch (orderType)
                {
                    case "0"://入库任务执行
                    case "1"://出库任务执行
                    case "2"://盘库任务执行
                    case "3"://移库任务执行
                        return Ok(new OutCommanAgvDto { Code = "0", Message = "成功", ReqCode = model.ReqCode });
                    default:
                        return Ok(new OutCommanAgvDto { Code = "1", Message = "失败", ReqCode = model.ReqCode });
                }
            }
            catch (Exception ex)
            {
                return Ok(new WcsModel
                {
                    StatusCode = -1,
                    Msg = ex.Message
                });
            }
        }
        #endregion
        #endregion
Wms/Wms/Controllers/PdaCrController.cs
@@ -10,6 +10,8 @@
using WMS.IBLL.IPdaServer;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using Wms.Tools;
using Microsoft.Extensions.Options;
namespace Wms.Controllers
{
@@ -19,10 +21,11 @@
    public class PdaCrController : ControllerBase
    {
        private readonly IPdaCrServer _pdaCrSvc;
        public PdaCrController(IPdaCrServer pdaCrSvc)
        private readonly ApiUrlConfig _config; //接口交互路径
        public PdaCrController(IPdaCrServer pdaCrSvc, IOptions<ApiUrlConfig> setting)
        {
            _pdaCrSvc = pdaCrSvc;
            _config = setting.Value;
        }
        #region 盘点
@@ -360,7 +363,7 @@
                }
                var uId = int.Parse(userId);
                _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, uId);
                _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, uId, _config.WcsHost + _config.GenAgvSchedulingTask);
                return Ok(new { data = "", code = 0, msg = "成功" });
            }
@@ -392,7 +395,7 @@
                }
                var uId = int.Parse(userId);
                _pdaCrSvc.AgvTransport2(model.SoNo,model.PalletNo, model.AreaNo, uId);
                _pdaCrSvc.AgvTransport2(model.SoNo,model.PalletNo, model.AreaNo, uId, _config.WcsHost + _config.GenAgvSchedulingTask);
                return Ok(new { data = "", code = 0, msg = "成功" });
            }
Wms/Wms/Controllers/StatisticalController.cs
@@ -16,19 +16,22 @@
        /// 依赖注入
        /// </summary>
        private readonly IStockServer _stock; //统计报表
        private readonly IStockDetailServer _stockDetail; //统计报表
        private readonly IStockDetailServer _stockDetail; //库存箱码明细
        private readonly IDataBoxInfoServer _dataBoxInfo; //导出
        private readonly IStockInfoServer _stockInfo; //库存信息
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="stock">统计报表</param>
        /// <param name="stockDetail">库存箱码明细</param>
        /// <param name="dataBoxInfo">导出</param>
        public StatisticalController(IStockServer stock, IStockDetailServer stockDetail, IDataBoxInfoServer dataBoxInfo)
        /// <param name="stockInfo">库存信息</param>
        public StatisticalController(IStockServer stock, IStockDetailServer stockDetail, IDataBoxInfoServer dataBoxInfo, IStockInfoServer stockInfo)
        {
            _stock = stock; //统计报表
            _stockDetail = stockDetail;
            _dataBoxInfo = dataBoxInfo;
            _stockDetail = stockDetail; //库存箱码明细
            _dataBoxInfo = dataBoxInfo; //导出
            _stockInfo = stockInfo; //库存信息
        }
        #region 库存明细
@@ -406,5 +409,29 @@
        }
        #endregion
        #region 库存信息
        /// <summary>
        /// 根据时间获取显示库存信息
        /// </summary>
        /// <param name="StartTime"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetDataStockInfo(string StartTime)
        {
            try
            {
                var list = _stockInfo.GetDataStockInfo(StartTime);
                return Ok(new { code = 0, count = list.Count, data = list, msg = "获取库存信息成功" });
            }
            catch (Exception ex)
            {
                return Ok(new { code = 1, count = 0, msg = ex.Message });
            }
        }
        #endregion
    }
}
Wms/Wms/DailyTaskService.cs
New file
@@ -0,0 +1,100 @@
using Microsoft.Extensions.Hosting;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Utility.Tools;
using WMS.BLL.DataServer;
using WMS.IBLL.IDataServer;
namespace Wms
{
    public class DailyTaskService : IHostedService, IDisposable
    {
        private Timer _periodicReport;
        private IStockInfoServer _stock;
        public DailyTaskService(IStockInfoServer stock)
        {
            _stock = stock;
        }
        //创建定时任务
        public Task StartAsync(CancellationToken cancellationToken)
        {
            #region 每天0点执行
            //计算距离下一个 0 点的时间间隔
            DateTime now = DateTime.Now;
            DateTime nextZeroHour = now.AddDays(1).Date;
            TimeSpan delay = nextZeroHour - now;
            //创建定时器,并设置回调函数
            _periodicReport = new Timer(PeriodicReport, null, delay, TimeSpan.FromDays(1));
            return Task.CompletedTask;
            #endregion
            #region 2分钟执行1次
            /*// 计算距离下一个 2 分钟的时间间隔
            TimeSpan delay = TimeSpan.FromMinutes(2);
            // 创建定时器,并设置回调函数
            _timer = new Timer(ExecuteDailyTask, null, delay, TimeSpan.FromMinutes(2));
            return Task.CompletedTask;*/
            #endregion
        }
        /// <summary>
        /// 在应用程序关闭时被调用,用于执行清理操作和释放资源。在 ASP.NET Core 应用程序中,
        /// 当主机关闭时,StopAsync 方法会被调用来停止后台服务,以确保服务能够正确地停止并释放它所占用的资源,比如关闭定时器、释放数据库连接等。
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            // 停止定时器
            _periodicReport?.Change(Timeout.Infinite, 0);
            return Task.CompletedTask;
        }
        //定时执行周期报表
        private void PeriodicReport(object state)
        {
            try
            {
                var arr = _stock.ByDayInsertStock();
                var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"WMS定时任务执行异常:{arr},", logStr);
                //释放资源
                _periodicReport?.Dispose();
            }
            catch (Exception ex)
            {
                var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"WMS定时任务执行异常:{DateTime.Now}:( {ex.Message} ),", logStr);
            }
        }
        /// <summary>
        /// 在服务结束运行时,定时器得到正确地清理和释放
        /// </summary>
        public void Dispose()
        {
            try
            {
                var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"测试是否自动释放:{DateTime.Now}", logStr);
                //释放资源
                _periodicReport?.Dispose();
            }
            catch (Exception ex)
            {
                var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"测试是否自动释放异常:{DateTime.Now}:( {ex.Message} ),", logStr);
            }
        }
    }
}
Wms/Wms/Startup.cs
@@ -28,6 +28,9 @@
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //调用定时任务
            services.AddHostedService<DailyTaskService>();
            services.AddControllers()
                .AddJsonOptions(options =>
                    {
Wms/Wms/Tools/ApiUrlConfig.cs
@@ -43,7 +43,7 @@
        public string GetBoxUrl { get; set; }
        #endregion
        #region 下游系统
        /// <summary>
@@ -59,6 +59,25 @@
        public string GetLog1 { get; set; }
        public string GetLog2 { get; set; }
        #region AGV
        /// <summary>
        /// 生成任务单接口
        /// </summary>
        public string GenAgvSchedulingTask { get; set; }
        /// <summary>
        /// 继续执行任务接口
        /// </summary>
        public string ContinueTask { get; set; }
        /// <summary>
        /// 预调度对外接口
        /// </summary>
        public string GenPreScheduleTask { get; set; }
        #endregion
        #endregion
    }
Wms/Wms/appsettings.json
@@ -34,12 +34,14 @@
    "AsnFinishUrl": "/api/wmsInterface/OutStockTask", //入库订单关闭
    "SoFinishUrl": "/api/wmsInterface/OutStockTask", //出库订单关闭
    "DataChangeUrl": "/api/wmsInterface/OutStockTask", //库存变更回传
    "GetBoxUrl": "/api/wmsInterface/OutStockTask" //获取箱码信息
    "GetBoxUrl": "/api/wmsInterface/OutStockTask", //获取箱码信息
    // 赋码
    // AGV
    "GenAgvSchedulingTask": "http://IP:PORT/rcms/services/rest/hikRpcService/genAgvSchedulingTask", //生成任务单接口
    "ContinueTask": "http://IP:PORT/rcms/services/rest/hikRpcService/continueTask", //继续执行任务接口
    "GenPreScheduleTask": "http://IP:PORT/rcms/services/rest/hikRpcService/genPreScheduleTask" // 预调度对外接口
  }
}