chengsc
2024-07-21 e75362cc5d11d900068a26232eb97ebd30203d48
Merge branch 'master' into csc
10个文件已修改
8个文件已添加
1434 ■■■■■ 已修改文件
HTML/js/public.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/layuiadmin/dragMove/dragMove.css 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/layuiadmin/dragMove/dragMove.js 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/StockCheck.html 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/ViewPicture.html 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/images/1920x1080.jpg 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/images/1920x400.jpg 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/images/400x400.jpg 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/images/400x900.jpg 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/InventoryStatistics.html 398 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SystemSettings/PrintModule.html 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/DataDto/MateDataStockDto.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/WaveMageServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockServer.cs 328 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/Logic/AllotSku.cs 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockServer.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/js/public.js
@@ -203,9 +203,9 @@
  var bodyHeight = $("#body").outerHeight();
  var topHeight = $("#top").outerHeight();
  var centerHeight = $("#center").outerHeight();
//   console.log(bodyHeight);
//   console.log(topHeight);
//   console.log(centerHeight);
  console.log(bodyHeight);
  console.log(topHeight);
  console.log(centerHeight);
  var hh = bodyHeight - topHeight-centerHeight - 26 ;//6是body上内边距 
  return hh;
HTML/layuiadmin/dragMove/dragMove.css
New file
@@ -0,0 +1,20 @@
/**
 @ Name:layui.dragMove 图片查看器
 @ Author:FQSong
 @ License:MIT
 */
/* 样式加载完毕的标识 */
html #layuicss-dragMove{display: none; position: absolute; width: 1989px;}
/* 组件样式 */
.dragMove-skin .layui-layer-content {overflow: hidden !important;}
.layui-dragMove {position: relative; width: 100%; height: 100%; display: -webkit-flex; display: flex; flex-direction:column;}
.layui-dragMove .dragMove-img {position: relative; width: 100%; height: 100%; overflow: hidden; -webkit-flex: 1;  flex: 1; background-color:#eee;}
.layui-dragMove .dragMove-img img {position: absolute; left: 0; top: 0; user-select:none; cursor: grab;}
.layui-dragMove .dragMove-btn {width:100%; padding: 10px 0; text-align:center; -webkit-flex: none;  flex: none;}
.layui-dragMove .dragMove-btn .layui-btn {height: 28px; line-height: 28px;}
.layui-icon-loading {position: absolute; left: 50%; top: 50%; display: block; width: 36px; height: 36px; font-size: 36px; line-height: 36px; }
.transitioning {-webkit-transition: -webkit-transform .24s ease-out; transition: transform .24s ease-out;}
HTML/layuiadmin/dragMove/dragMove.js
New file
@@ -0,0 +1,261 @@
/**
 @ Name:layui.dragMove 图片查看器
 @ Author:FQSong
 @ License:MIT
 */
layui.define('layer', function(exports){
  var $ = layui.$
  ,layer = layui.layer
  //字符常量
  ,MOD_NAME = 'dragMove', ELEM = '.layui-dragMove'
  //外部接口
  ,dragMove = {
    index: layui.dragMove ? (layui.dragMove.index + 10000) : 0
    //设置全局项
    ,set: function(options){
      var that = this;
      that.config = $.extend({}, that.config, options);
      return that;
    }
    //事件监听
    ,on: function(events, callback){
      return layui.onevent.call(this, MOD_NAME, events, callback);
    }
  }
  //构造器
  ,Class = function(options){
    var that = this;
    that.index = ++dragMove.index;
    that.config = $.extend({}, that.config, dragMove.config, options);
    that.render();
  };
  //默认配置
  Class.prototype.config = {
    layerArea: ["960px","720px"],
    layerShade: 0.6,
    layerMove: 0,
    maxZoom: 1
  };
  //渲染视图
  Class.prototype.render = function(){
    var that = this
    ,options = that.config
    ,dragMoveView = "<div class='layui-dragMove'>"
    + "<div class='dragMove-img'>"
    +   "<span class='layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop'></span>"
    + "</div>"
    + "<div class='dragMove-btn'>"
    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='default'>默认大小</button>"
    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='real'>实际大小</button>"
    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='zoomin'>放大</button>"
    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='zoomout'>缩小</button>"
    + "</div>"
    + "</div>";
    options.elem = $(options.elem);
    options.elem.on("click","img",function(e){
      let imgObj =  $(this),
      imgSrc = imgObj.attr("src"),
      imgTitle = imgObj.attr("alt") || imgSrc.replace(/(.*\/)*([^.]+).*/ig,"$2");
      layer.open({
        type: 1,
        resize: 0,
        btn: 0,
        skin: "dragMove-skin",
        move: options.layerMove,
        area: options.layerArea,
        shade: options.layerShade,
        title: imgTitle,
        content: dragMoveView,
        success: function(layero){
          var imgbox = layero.find(".dragMove-img");
          options.imgboxWidth = imgbox.innerWidth();
          options.imgboxHeight = imgbox.innerHeight();
          var nImg = new Image();
          nImg.src = imgSrc;
          if (nImg.complete) {
            imgbox.empty().append(nImg);
            that.init(nImg)
          } else {
            nImg.onload = function () {
              imgbox.empty().append(nImg);
              that.init(nImg)
            }
          }
        }
      });
    });
  }
  //
  Class.prototype.init = function(img){
    var that = this
    ,options = that.config;
    let $img = $(img),
    parent = $img.closest(".layui-dragMove"),
    zoomData = {};
    zoomData.img = img;
    zoomData.imgWidth = img.width;
    zoomData.imgHeight = img.height;
    zoomData.zoomSize = Math.min(Math.min(options.imgboxWidth / zoomData.imgWidth, options.imgboxHeight / zoomData.imgHeight), 1);
    zoomData.left = (options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize) / 2;
    zoomData.top = (options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize) / 2;
    zoomData.defaultZoom = zoomData.zoomSize;
    that.zoomData = zoomData;
    $img.css({ "transform-origin": "0 0", "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + zoomData.left + "," + zoomData.top + ")" });
    $img.on("mousedown", function (e) {
      e.preventDefault();
      let currentX = e.clientX,
      currentY = e.clientY;
      $img.removeClass("transitioning").css({"cursor": "grabbing"});
      $(document).on("mousemove", function (even) {
        let moveX = even.clientX - currentX,
        moveY = even.clientY - currentY;
        $img.css({ "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + (zoomData.left + moveX) + "," + (zoomData.top + moveY) + ")" });
      });
      $(document).on("mouseup", function (even) {
        var matrix = $img.css("transform").slice(7, -1).split(','),
        center = that.getCenter(parseFloat(matrix[4]), parseFloat(matrix[5]), zoomData);
        zoomData.left = center.left;
        zoomData.top = center.top;
        $img.addClass("transitioning").css({
          "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + zoomData.left + "," + zoomData.top + ")",
          "cursor": "grab"
        });
        $(document).off("mousemove");
        $(document).off("mouseup");
      });
    });
    parent.on("click", "button", function (e) {
      e.preventDefault();
      var method = $(this).attr("data-method"),
      scaleSize = 0;
      switch (method) {
        case "default":
          scaleSize = zoomData.defaultZoom;
          break;
        case "real":
          scaleSize = 1;
          break;
        case "zoomin":
          scaleSize = zoomData.zoomSize * 1.2;
          scaleSize = scaleSize > options.maxZoom ? options.maxZoom : scaleSize;
          break;
        case "zoomout":
          scaleSize = zoomData.zoomSize / 1.2;
          scaleSize = scaleSize < zoomData.defaultZoom ? zoomData.defaultZoom : scaleSize;
          break;
        default:
          break;
      }
      scaleSize && that.scaleZoom(scaleSize);
    });
    //鼠标滚轮
    parent.on("mousewheel", function (e) {
      e.preventDefault();
      let scaleSize = 0;
      if (e.originalEvent.wheelDelta > 0) {
        scaleSize = zoomData.zoomSize * 1.2;
      } else {
        scaleSize = zoomData.zoomSize / 1.2;
      }
      scaleSize = Math.min(Math.max(scaleSize, zoomData.defaultZoom),options.maxZoom);
      that.scaleZoom(scaleSize);
    });
    $img.on("transitionend webkitTransitionend", function () {
      $(this).removeClass("transitioning")
    });
  };
  Class.prototype.scaleZoom = function(index){
    var that = this
    ,options = that.config
    ,zoomData = that.zoomData;
    zoomData.left = zoomData.left - zoomData.imgWidth * (index - zoomData.zoomSize) / 2;
    zoomData.top = zoomData.top -  zoomData.imgHeight * (index - zoomData.zoomSize) / 2;
    zoomData.zoomSize = index;
    var center = that.getCenter(zoomData.left,zoomData.top,zoomData);
    zoomData.left = center.left;
    zoomData.top = center.top;
    $(zoomData.img).addClass("transitioning").css({
      "transform":"matrix("+ zoomData.zoomSize +",0,0," + zoomData.zoomSize +","+zoomData.left+","+zoomData.top+")"
    });
  };
  Class.prototype.getCenter = function(x,y,zoomData){
    var that = this
    ,options = that.config
    ,zoomData = that.zoomData;
    let newleft,newtop;
    newleft = (function(){
      var left;
      if(zoomData.imgWidth * zoomData.zoomSize < options.imgboxWidth){
        left = (options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize) / 2;
      }else{
        left = Math.max(Math.min(0,x), options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize);
      }
      return left;
    })();
    newtop = (function(){
      var top;
      if(zoomData.imgHeight * zoomData.zoomSize < options.imgboxHeight){
        top = (options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize) / 2;
      }else{
        top = Math.max(Math.min(0, y), options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize);
      }
      return top;
    })();
    return {left:newleft,top:newtop}
  };
  Class.prototype.decimal = function(num){
    var result = parseFloat(num);
    if (isNaN(result)) {
      return false;
    }
    result = Math.round(num * 100) / 100;
    return result;
  };
  //核心入口
  dragMove.render = function(options){
    var ins = new Class(options);
    return ins;
  };
  //加载组件所需样式
  layui.link(layui.cache.base + 'dragMove/dragMove.css', function(){
    //样式加载完毕的回调
  }, MOD_NAME);
  exports(MOD_NAME, dragMove);
});
HTML/views/HouseWithinSetting/StockCheck.html
@@ -188,7 +188,20 @@
                        }}
                         
                    </script>
                <script type="text/html" id="table-content-list2">
                        {{#
                                var html = '';
                                if(d.Status >= 1){
                                    html += `<a class="layui-btn layui-btn-danger layui-btn-xs delClass" lay-event="viewPicture">
                                                <i class="layui-icon layui-icon-ok"></i>查看图片
                                            </a>`;
                                }
                                return html;
                        }}
                    </script>
                <script type="text/html" id="toolbarDemo">
                        <button class="layui-btn layuiadmin-btn-list layui-btn-sm  addClass" lay-event="add">
@@ -401,6 +414,7 @@
                    { field: 'CreateTime', title: '创建时间', align: 'center', width: 160, templet: '#CreateTimeButton', },
                    { field: 'UpdateUserName', title: '修改人', align: 'center', width: 120, hide: true },
                    { field: 'UpdateTime', title: '修改时间', align: 'center', width: 160, hide: true, templet: '#UpdateTimeButton', },
                    { field: 'caozuo', title: '操作', fixed: 'right', align: 'center', toolbar: '#table-content-list2', width: 100 }
                ]];
            var TotalColsSysArrm = encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArrm)))//将表头数据进行url编码
            refreshTable();
@@ -783,7 +797,7 @@
                        }
                    });
                } else if (obj.event === 'vision') {
                    layer.confirm('确定视觉盘点', function () {
                        if (isChongFu == true) {
                            isChongFu = false;
@@ -860,7 +874,24 @@
                    });
                }
            });
            table.on('tool(LAY-app-content-list2)', function (obj) {
                var data = obj.data;
                if (obj.event === 'viewPicture') {//查看图片
                    debugger;
                    layer.open({
                        type: 2,
                        title: '查看图片',
                        content: 'ViewPicture.html',
                        maxmin: true,
                        area: ['100%', '100%'],
                        success: function (layero, index) {
                            var body = layer.getChildFrame('body', index);
                            body.find('#CrNo').val(data.CrNo);
                            body.find('#PalletNo').val(data.PalletNo);
                        }
                    });
                }
            });
            var $ = layui.$,
                active = {
                    customCols: function () {
HTML/views/HouseWithinSetting/ViewPicture.html
New file
@@ -0,0 +1,104 @@
<!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">
</head>
<body>
    <input type="hidden" id="CrNo" name="CrNo">
    <input type="hidden" id="PalletNo" name="PalletNo">
    <div class="layui-bg-gray" style="padding: 16px;" id="imgDragmove">
        <div class="layui-row layui-col-space15">
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100101箱</div>
              <div class="layui-card-body">
                <img src="images/1920x1080.jpg" height="200" width="100%" alt="0100101箱">
              </div>
            </div>
          </div>
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100102箱</div>
              <div class="layui-card-body">
                <img src="images/1920x400.jpg" height="200" width="100%" alt="0100102箱">
              </div>
            </div>
          </div>
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100103箱</div>
              <div class="layui-card-body">
                <img src="images/400x400.jpg" height="200" width="100%" alt="0100103箱">
              </div>
            </div>
          </div>
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100104箱</div>
              <div class="layui-card-body">
                <img src="images/400x400.jpg" height="200" width="100%" alt="0100104箱">
              </div>
            </div>
          </div>
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100105箱</div>
              <div class="layui-card-body">
                <img src="images/400x400.jpg" height="200" width="100%" alt="0100105箱">
              </div>
            </div>
          </div>
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100106箱</div>
              <div class="layui-card-body">
                <img src="images/400x400.jpg" height="200" width="100%" alt="0100106箱">
              </div>
            </div>
          </div>
          <div class="layui-col-md2">
            <div class="layui-card">
              <div class="layui-card-header">0100107箱</div>
              <div class="layui-card-body">
                <img src="images/400x400.jpg" height="200" width="100%" alt="0100107箱">
              </div>
            </div>
          </div>
        </div>
      </div>
    <script src="../../layuiadmin/layui/layui.js"></script>
    <script src="../../js/jquery-3.5.1.min.js"></script>
    <script src="../../js/jquery.cookie.js"></script>
    <script src="../../js/public.js"></script>
    <script>
        layui.config({
            base: '../../layuiadmin/' //静态资源所在路径
        }).extend({
            index: 'lib/index', //主入口模块
            dragMove: 'dragMove/dragMove'
        }).use(['dragMove'], function () {
            var $ = layui.$;
            var dragMove = layui.dragMove;
            //执行示例
            dragMove.render({
                elem: "#imgDragmove", //指向图片的父容器
                layerArea: ["960px", "720px"], //弹窗的宽高,同layer的area,默认["960px","720px"]
                layerShade: 0.6, //遮罩的透明度,同layer的shade,默认0.6
                layerMove: false, //触发拖动的元素,同layer的move,这里默认禁止,可设置为'.layui-layer-title'
                maxZoom: 1 //图片能放大的最大倍数,默认1倍
            });
        })
    </script>
</body>
</html>
HTML/views/HouseWithinSetting/images/1920x1080.jpg
HTML/views/HouseWithinSetting/images/1920x400.jpg
HTML/views/HouseWithinSetting/images/400x400.jpg
HTML/views/HouseWithinSetting/images/400x900.jpg
HTML/views/StatisticalReport/InventoryStatistics.html
@@ -36,6 +36,18 @@
            <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" style="width: 60px;">查询类型</label>
                        <div class="layui-input-inline" style="width: 170px; margin-right: 0px;">
                            <select name="SelectType" id="SelectType" lay-filter="SelectType" lay-search>
                                <option value="">正常</option>
                                <option value="0">物料信息</option>
                                <option value="1">批次信息</option>
                                <option value="2">质检信息</option>
                                <option value="3">货主信息</option>
                            </select>
                        </div>
                    </div>
                    <div class="layui-inline zongdan">
                        <label class="layui-form-label" style="width: 60px;">物料编码</label>
                        <div class="layui-input-inline" style="width: 170px; margin-right: 0px;">
@@ -71,7 +83,7 @@
                                class="layui-input">
                        </div>
                    </div>
                    <div class="layui-inline mingxi">
                    <!-- <div class="layui-inline mingxi">
                        <label class="layui-form-label" style="width: 60px;">储位地址</label>
                        <div class="layui-input-inline" style="width: 170px; margin-right: 0px;">
                            <input type="text" id="LocatNo" name="LocatNo" placeholder="储位地址" autocomplete="off"
@@ -84,7 +96,7 @@
                            <input type="text" id="PalletNo" name="PalletNo" placeholder="托盘号" autocomplete="off"
                                class="layui-input">
                        </div>
                    </div>
                    </div> -->
                    
                    <div class="layui-inline ">
                        <label class="layui-form-label" style="width: 60px;">库存状态</label>
@@ -123,7 +135,7 @@
                            </select>
                        </div>
                    </div>
                    <div class="layui-inline zhijian">
                    <!-- <div class="layui-inline zhijian">
                        <label class="layui-form-label" style="width: 60px;">开始时间</label>
                        <div class="layui-input-inline" style="width: 170px; margin-right: 0px;">
                            <input type="text" autocomplete="off" id="StartTime" class="layui-input"
@@ -136,7 +148,7 @@
                            <input type="text" autocomplete="off" id="EndTime" class="layui-input"
                                placeholder="结束时间">
                        </div>
                    </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">
@@ -151,19 +163,15 @@
                </div>
            </div>
            <div id="center"></div>
            <div class="layui-card-body">
                <div style="position: relative;">
                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
                        <ul class="layui-tab-title" id="tab">
                            <li class="layui-this">库存总量</li>
                            <li>库存明细</li>
                        </ul>
                        <div id="center"></div>
                        <!-- <div id="center">
                        </div> -->
                        <div class="layui-tab-content">
                            <div class="layui-tab-item layui-show">
                            <!-- <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 自定义表头 -->
@@ -174,29 +182,6 @@
                                    </div>
                                    <!-- #endregion -->
                                </div>
                            </div>
                            <div class="layui-tab-item">
                                <div class="position-relative"><!-- class="position-relative" --><!-- 自定义表头加上 -->
                                    <table id="LAY-app-content-list2" lay-filter="LAY-app-content-list2"></table>
                                    <!-- #region 自定义表头 -->
                                    <div class="headerSetIcon">
                                        <button class="layui-btn layui-btn-primary layui-btn-sm" data-type="customCols2">
                                            <i class="layui-icon">&#xe610;</i>
                                        </button>
                                    </div>
                                    <!-- #endregion -->
                                    <!-- #region 自定义表头 -->
                                    <script type="text/html" id="templetCompleteTime">
                                        {{# function GetBtn(d){
                                                return formatDate(d.CompleteTime);
                                            }
                                        }}
                                        {{ GetBtn(d) }}
                                    </script>
                                    <!-- #endregion -->
                                </div>
                            </div>
                        </div>
                    </div>
@@ -258,7 +243,7 @@
            element = layui.element;
            laydate = layui.laydate;
            var h1 = GetTableTabHeight();
            var h1 = GetTableHeight();
            laydate.render({
                elem: '#StartTime',
@@ -296,7 +281,7 @@
            var $ = layui.$;
            var yemianid = 0;
            refreshTable("", "","","","");
            refreshTable("", "", "", "", "", "", "", "");
            // 表单需要的变量
            var infoOptions;
@@ -361,14 +346,17 @@
                        {field: 'LotText',title: '批次描述',align: 'center'},
                        {field: 'OwnerNo',title: '货主编码',align: 'center'},
                        {field: 'OwnerName',title: '货主名称',align: 'center'}, 
                        {field: 'Status',title: '库存状态',align: 'center',templet: '#buttonTpl'},
                        {field: 'InspectStatus',title: '质检状态',align: 'center',templet: '#buttonTp2'},
                        {field: 'Qty',title: '库存数量',align: 'center',totalRow: true}, 
                        {field: 'LockQty',title: '锁定数量',align: 'center',totalRow: true}, 
                        {field: 'FrozenQty',title: '冻结数量',align: 'center',totalRow: true}
                        {field: 'FrozenQty',title: '冻结数量',align: 'center',totalRow: true},
                        {field: 'InspectQty',title: '可抽检数量',align: 'center',totalRow: true},
                    ]];
            var TotalColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码
            //#endregion
            //获取总量信息
            function refreshTable(SkuNo,SkuName,OwnerNo,OwnerName,LotNo) {
            function refreshTable(SelectType,SkuNo,SkuName,OwnerNo,OwnerName,LotNo,Status,InspectStatus) {
                //#region 自定义表头
                var colsJson
                var param1={
@@ -401,11 +389,14 @@
                        cols:colsJson
                    };
                    var param = {
                        SelectType:SelectType, //查询类型
                        SkuNo:SkuNo, //物料号
                        SkuName:SkuName, //物料名称
                        OwnerNo:OwnerNo, //货主编码
                        OwnerName:OwnerName, //货主名称
                        LotNo:LotNo, //批次号
                        Status:Status, //库存状态 = $("#Status").val();
                        InspectStatus:InspectStatus, //质检状态 = $("#InspectStatus").val();
                    };
                    sendData(IP + "/Statistical/GetInventoryList", param, 'get', function (res) {
                        console.log(res)
@@ -428,319 +419,47 @@
                    });
                });
                //#endregion
            }
            // 表单需要的变量
            var infoOptions2;
            //#region 原始非自定义列
            //infoOptions2 = {
            //    elem: '#LAY-app-content-list2',
            //    height: 'full-206',
            //    id: 'LAY-app-content-list2',
            //    page: true,
            //    limit: pageCnt,
            //    limits: pageLimits,
            //    even: true,
            //    cellMinWidth: 80, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
            //    cols:
            //        [[
            //            {
            //                field: 'PalletNo',
            //                title: '托盘号',
            //                align: 'center',
            //                width: 110,
            //            }, {
            //                field: 'LocatNo',
            //                title: '储位地址',
            //                align: 'center',
            //                width: 100,
            //            }, {
            //                field: 'RoadwayName',
            //                title: '所属巷道',
            //                width: 90,
            //                align: 'center',
            //            }, {
            //                field: 'WareHouseName',
            //                title: '所属仓库',
            //                width: 90,
            //                align: 'center',
            //            }, {
            //                field: 'SkuNo',
            //                title: '物料编码',
            //                width: 100,
            //                align: 'center',
            //            }, {
            //                field: 'SkuName',
            //                title: '物料名称',
            //                align: 'center',
            //            }, {
            //                field: 'Standard',
            //                title: '物料规格',
            //                width: 130,
            //                align: 'center',
            //            }, {
            //                field: 'LotNo',
            //                title: '批次号',
            //                align: 'center',
            //            }, {
            //                field: 'Qty',
            //                title: '库存数量',
            //                width: 110,
            //                align: 'center',
            //            }, {
            //                field: 'LockQty',
            //                title: '锁定数量',
            //                width: 110,
            //                align: 'center',
            //            },
            //            {
            //                field: 'Status',
            //                templet: '#buttonTpl',
            //                title: '库存状态',
            //                width: 90,
            //                align: 'center',
            //            }, {
            //                field: 'InspectStatus',
            //                templet: '#buttonTp2',
            //                title: '质检状态',
            //                width: 90,
            //                align: 'center',
            //            },
            //            {
            //                field: 'CompleteTime',
            //                title: '入库时间',
            //                align: 'center',
            //                width: 150,
            //                templet: function (d) {
            //                    return formatDate(d.CompleteTime);
            //                },
            //            },
            //        ]]
            //};
            //#endregion
            //获取明细信息
            //#region 自定义表头
            var DetailColsArr = [[
                        {field: 'PalletNo',title: '托盘号',align: 'center',width: 110,},
                        {field: 'LocatNo',title: '储位地址',align: 'center',width: 100,},
                        {field: 'WareHouseName',title: '所属仓库',width: 90,align: 'center'},
                        {field: 'RoadwayName',title: '所属巷道',width: 90,align: 'center'},
                        {field: 'AreaName',title: '所属区域',width: 90,align: 'center'},
                        {field: 'SkuNo',title: '物料编码',width: 100,align: 'center'},
                        {field: 'SkuName',title: '物料名称',align: 'center'},
                        {field: 'Standard',title: '物料规格',width: 130,align: 'center'},
                        {field: 'LotNo',title: '批次号',align: 'center'},
                        {field: 'OwnerNo',title: '货主编码',align: 'center'},
                        {field: 'OwnerName',title: '货主名称',align: 'center'},
                        {field: 'SupplierNo',title: '供应商编码',align: 'center'},
                        {field: 'SupplierName',title: '供应商名称',align: 'center'},
                        {field: 'Qty',title: '库存数量',width: 110,align: 'center'},
                        {field: 'LockQty',title: '锁定数量',width: 110,align: 'center'},
                        {field: 'Status',templet: '#buttonTpl',title: '库存状态',width: 90,align: 'center'},
                        {field: 'InspectStatus',templet: '#buttonTp2',title: '质检状态',width: 90,align: 'center'},
                        {field: 'CompleteTime',title: '入库时间',align: 'center',width: 150,templet: '#templetCompleteTime'},
                    ]];
            var DetailColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(DetailColsArr)))//将表头数据进行url编码
            //#endregion
            function refreshTable2(SkuNo,SkuName,OwnerNo,OwnerName,LotNo,LocatNo,PalletNo,Status,InspectStatus,StartTime,EndTime) {
                //#region 自定义表头
                var colsJson2
                var param1={
                    Href:'Statistical/GetInventoryList1'
                };
                sendData(IP + "/Sys/GetTableColsByUserId", param1, 'post', function(res) {
                    if (res.code == 0){
                        if(res.data=='' || res.data==undefined || res.data==null){
                            colsJson2=DetailColsArr
                        }else{
                            colsJson2= eval(res.data);
                        }
                    }else{
                            colsJson2=DetailColsArr
                    }
                    infoOptions2 = {
                        elem: '#LAY-app-content-list2',
                        height: h1,
                        id: 'LAY-app-content-list2',
                        page: true,
                        limit: pageCnt,
                        limits: pageLimits,
                        even: true,
                        cellMinWidth: 80, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                        done: function(){
                            //自定义列宽
                            SetTableColW('LAY-app-content-list2','Statistical/GetInventoryList1',DetailColsSysArr);
                        },
                        cols:colsJson2
                    };
                    var param = {
                        SkuNo:SkuNo, //物料号
                        SkuName:SkuName, //物料名称
                        OwnerNo:OwnerNo, //货主编码
                        OwnerName:OwnerName, //货主名称
                        LotNo:LotNo, //批次号
                        LocatNo:LocatNo,//储位地址
                        PalletNo:PalletNo, //托盘号
                        Status:Status,//库存状态
                        InspectStatus:InspectStatus, //质检状态
                        StartTime:StartTime,//开始时间
                        EndTime:EndTime, //结束时间
                    };
                    sendData(IP + "/Statistical/GetInventoryList1", param, 'get', function (res) {
                        if (res.code == 0) //成功
                        {
                            var list = res.data;
                            $.extend(infoOptions2, {
                                data: list
                            });
                            infoOptions2.page = {
                                curr: 1
                            }
                            tableIns2 = table.render(infoOptions2);
                        }
                        else //不成功
                        {
                            layer.msg('获取明细列表信息失败!', {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function () { });
                        }
                    })
                });
                //#endregion
            }
            }
            
            //var url = IP + "/Statistical/GetInventoryList1";
            //接受全局变量
            let quanSkuNo = '';
            let quanLotNo='';
            //监听搜索
            form.on('submit(LAY-app-contlist-search)', function (data) {
                var SelectType = $("#SelectType").val();
                var SkuNo = $("#SkuNo").val();
                var SkuName = $("#SkuName").val();
                var LotNo = $("#LotNo").val();
                var LocatNo = $("#LocatNo").val();
                var PalletNo = $("#PalletNo").val();
                var OwnerNo = $("#OwnerNo").val();
                var OwnerName = $("#OwnerName").val();
                var Status = $("#Status").val();
                var InspectStatus = $("#InspectStatus").val();
                var StartTime = $("#StartTime").val();
                var EndTime = $("#EndTime").val();
                if (yemianid == 0) {
                    console.log("总单");
                    refreshTable(SkuNo, SkuName,OwnerNo,OwnerName,LotNo);
                } else if (yemianid == 1) {
                    //quanSkuNo = quanSkuNo;
                    //quanLotNo='';
                    console.log("明细");
                    console.log(SkuNo,SkuName,OwnerNo,OwnerName,LotNo,LocatNo,PalletNo,Status,InspectStatus,StartTime,EndTime)
                    refreshTable2(quanSkuNo,SkuName,OwnerNo,OwnerName,quanLotNo,LocatNo,PalletNo,Status,InspectStatus,StartTime,EndTime);
                }
                refreshTable(SelectType,SkuNo, SkuName,OwnerNo,OwnerName,LotNo,Status,InspectStatus);
            });
            //触发行双击事件
            table.on('rowDouble(LAY-app-content-list)', function (obj) {
                $(".layui-tab-title>li").attr("class", "");
                $('.layui-tab-title>li').eq(1).attr('class', 'layui-this');
                $('.layui-tab-content .layui-tab-item').attr('class', 'layui-tab-item')
                $('.layui-tab-content .layui-tab-item').eq(1).attr('class', 'layui-tab-item layui-show')
                console.log(obj);
                quanSkuNo = obj.data.SkuNo;
                quanLotNo=obj.data.lotNo;
                refreshTable2(obj.data.SkuNo,obj.data.SkuName,obj.data.OwnerNo,obj.data.OwnerName,obj.data.LotNo,obj.data.LocatNo,obj.data.PalletNo,obj.data.Status,obj.data.InspectStatus,obj.data.StartTime,obj.data.EndTime);
                yemianid = 1;
            });
            //监听Tab切换,以改变地址hash值
            element.on('tab(docDemoTabBrief)', function (data) {
                var SkuNo = $("#SkuNo").val();
                var SkuName = $("#SkuName").val();
                var LotNo = $("#LotNo").val();
                var LocatNo = $("#LocatNo").val();
                var PalletNo = $("#PalletNo").val();
                var OwnerNo = $("#OwnerNo").val();
                var OwnerName = $("#OwnerName").val();
                var Status = $("#Status").val();
                var InspectStatus = $("#InspectStatus").val();
                console.log(data.index);
                yemianid = data.index
                if (yemianid == 0) {
                    console.log("总单");
                    refreshTable(SkuNo, SkuName,OwnerNo,OwnerName,LotNo);
                } else if (yemianid == 1) {
                    console.log("明细");
                    refreshTable2(SkuNo,SkuName,OwnerNo,OwnerName,LotNo,LocatNo,PalletNo,Status,InspectStatus,StartTime,EndTime);
                }
            });
            form.on('submit(daochu)', function () {
                layer.confirm('确定导出当前数据吗?', function (index) {
                    if (yemianid == 0) {
                        console.log("总单");
                        var param = {
                            SkuNo: $("#SkuNo").val(),
                            SkuName: $("#SkuName").val(),
                        };
                        sendData(IP + "/Statistical/GetInventoryListDaoChu", param, 'get', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
                                var list = res.data;
                                table.exportFile(tableIns.config.id, list, 'xls', "库存信息" + getNowTime(),); //data 为该实例中的任意数量的数据
                                layer.msg('导出成功!', {
                                    icon: 1,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () {
                    var param = {
                        SkuNo: $("#SkuNo").val(),
                        SkuName: $("#SkuName").val(),
                    };
                    sendData(IP + "/Statistical/GetInventoryListDaoChu", param, 'get', function (res) {
                        console.log(res);
                        if (res.code == 0) { //成功
                            var list = res.data;
                            table.exportFile(tableIns.config.id, list, 'xls', "库存信息" + getNowTime(),); //data 为该实例中的任意数量的数据
                            layer.msg('导出成功!', {
                                icon: 1,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function () {
                                });
                            });
                            } else { //不成功
                                layer.msg('获取信息失败!', {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () { });
                            }
                        });
                    } else if (yemianid == 1) {
                        console.log("明细");
                        var SkuNo = $("#SkuNo").val();
                        if (SkuNo == '') {
                            SkuNo = quanSkuNo;
                        } else { //不成功
                            layer.msg('获取信息失败!', {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function () { });
                        }
                        var param = {
                            SkuNo: SkuNo,
                            SkuName: $("#SkuName").val(),
                            LotNo: $("#LotNo").val(),
                            LocatNo: $("#LocatNo").val(),
                            PalletNo: $("#PalletNo").val(),
                            Status: $("#Status").val(),
                            InspectStatus: $("#InspectStatus").val(),
                            IsSamolingTray: $("#IsSamolingTray").val(),
                            StartTime: $("#StartTime").val(),
                            EndTime: $("#EndTime").val(),
                        };
                        sendData(IP + "/Statistical/GetInventoryList1DaoChu", param, 'get', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
                                var list = res.data;
                                table.exportFile(tableIns2.config.id, list, 'xls', "库存明细信息" + getNowTime(),); //data 为该实例中的任意数量的数据
                                layer.msg('导出成功!', {
                                    icon: 1,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () {
                                });
                            } else { //不成功
                                layer.msg('获取信息失败!', {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () { });
                            }
                        });
                    }
                    });
                });
@@ -757,18 +476,7 @@
                        resize: false,
                        area: ['970px', '650px']
                    });
                },
                customCols2: function(){
                    layer.open({
                        type: 2,
                        title: '自定义列',
                        content: '../SystemSettings/HeaderSetting.html?Href=Statistical/GetInventoryList1&ColsSysArr='+DetailColsSysArr,
                        maxmin: false,
                        resize: false,
                        area: ['970px', '650px']
                    });
                }
            };
            $('.layui-btn').on('click', function() {
                var type = $(this).data('type');
HTML/views/SystemSettings/PrintModule.html
New file
@@ -0,0 +1,153 @@
<!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" type="text/css" href="../../js/HiPrint/css/hiprint.css?t=' + Math.random() + '" />
    <link rel="stylesheet" type="text/css" href="../../js/HiPrint/css/print-lock.css" />
    <link rel="stylesheet" media="print" href="../../js/HiPrint/css/print-lock.css" />
    <!-- <link rel="stylesheet" type="text/css" href="../../js/HiPrint/css/bootstrap.min.css" > -->
    <style>
        .layui-form-label {
            padding: 5px 1px;
            text-align: center;
        }
        div {
            font-size: inherit;
        }
    </style>
</head>
<body>
    <div class="layui-card">
        <input type="hidden" id="printData" name="printData">
        <input type="hidden" id="printType" name="printType">
        <div class="row">
            <!--左侧div-->
            <div class="layui-col-xs2" style="padding-right:0px;max-height:250mm;">
                <div class="small-printElement-types hiprintEpContainer">
                </div>
            </div>
            <!--打印部分-->
            <div class="layui-col-xs6" style="margin-right: 50px;margin-left: 30px;">
                <!--打印头部分-->
                <div class="hiprint-toolbar" style="margin-top:15px;">
                    <ul>
                        <li><a class="hiprint-toolbar-item"><input type="number" id="customWidth"
                                    style="width: 50px;height: 19px;border: 0px;" placeholder="宽/mm" /></a></li>
                        <li><a class="hiprint-toolbar-item"><input type="number" id="customHeight"
                                    style="width: 50px;height: 19px;border: 0px;" placeholder="高/mm" /></a></li>
                        <li><a class="hiprint-tizee-btn" onclick="clearTemplate()">清空</a></li>
                        <!-- <li> <a class="btn hiprint-toolbar-item "
                                style="color: #fff;background-color: #d9534f;border-color: #d43f3a;"
                                id="preview">快速预览</a> </li> -->
                        <li> <a id="directPrint" class="btn hiprint-toolbar-item "
                                style="color: #fff;background-color: #d9534f; border-color: #d43f3a;">打印</a>
                        </li>
                        <!-- <li>
                            <a class="btn hiprint-toolbar-item"
                                style="color: #fff;background-color: #d9534f; border-color: #d43f3a;"
                                id="A4_getJson_toTextarea" onclick="BtnSubmit_Click()">保存</a>
                        </li> -->
                    </ul>
                    <div style="clear:both;"></div>
                </div>
                <!--打印主体部分-->
                <div id="hiprint-printTemplate" class="hiprint-printTemplate" style="margin-top:20px;">
                </div>
                <textarea class="form-control" rows="10" id="A4_textarea_json" style="display: none;"></textarea>
            </div>
            <!--右侧div-->
            <div class="layui-col-xs2" style="margin-left: 6%;max-height:260mm; overflow-y: scroll;">
                <div id="PrintElementOptionSetting" style="margin-top: 10px;"></div>
            </div>
        </div>
    </div>
    <script src="../../js/jquery-3.5.1.min.js"></script>
    <script src="../../js/jquery.cookie.js"></script>
    <script src="../../js/hiprint/content/bootstrap.min.js"></script>
    <script src="../../js/HiPrint/polyfill.min.js"></script>
    <script src="../../js/HiPrint/plugins/jquery.minicolors.min.js"></script>
    <script src="../../js/HiPrint/plugins/JsBarcode.all.min.js"></script>
    <script src="../../js/HiPrint/plugins/qrcode.js"></script>
    <script src="../../js/HiPrint/hiprint.bundle.js"></script>
    <script src="../../js/HiPrint/plugins/jquery.hiwprint.js"></script>
    <!-- <script src="../../js/HiPrint/plugins/socket.io.js"></script> -->
    <script src="../../js/HiPrint/plugins/config-etype-provider.js"></script>
    <script src="../../js/HiPrint/plugins/jspdf/canvas2image.js"></script>
    <script src="../../js/HiPrint/plugins/jspdf/canvg.min.js"></script>
    <script src="../../js/HiPrint/plugins/jspdf/html2canvas.min.js"></script>
    <script src="../../js/HiPrint/plugins/jspdf/jspdf.min.js"></script>
    <script src="../../js/HiPrint/plugins/print-data-list.js"></script>
    <script src="../../js/HiPrint/hiprint.config.js"></script>
    <script src="../../layuiadmin/layui/layui.js"></script>
    <script src="../../js/public.js"></script>
    <script>
        var configPrintJson;
        var datalist = [];
        //初始化打印插件渲染
        $(".hiprintEpContainer").html(""); //清除div内容
        var hiprintTemplate;
        // var JsonData = JSON.parse('{"panels":[{"index":0,"height":50,"width":50,"paperHeader":0,"paperFooter":141.73228346456693,"printElements":[{"tid":"configModule.SkuName","options":{"left":9,"top":12,"height":9.75,"width":120}},{"tid":"configModule.SkuNo","options":{"left":9,"top":37.5,"height":78,"width":120,"textType":"qrcode"}}],"paperNumberLeft":178.5,"paperNumberTop":123}]}')
        var JsonData = {};
        setTimeout(function () {
            var printType = $("#printType").val();
            datalist = getPrintDataList()(printType);
            synData(IP + "/sys/GetDefaultPrintTemplate?Type=" + printType, {}, 'get', function (res) {
                if (res.code == 0) { //成功
                    hiprint.init({
                        providers: [new configElementTypeProvider()]
                    });
                    //设置左侧拖拽事件
                    hiprint.PrintElementTypeManager.build('.hiprintEpContainer', 'testModule');
                    JsonData = JSON.parse(res.data.PositionJson);
                    $("#customWidth").val(JsonData.panels[0].width);
                    $("#customHeight").val(JsonData.panels[0].height);
                    hiprintTemplate = new hiprint.PrintTemplate({
                        template: JsonData,//模板JSON
                        settingContainer: '#PrintElementOptionSetting',
                        paginationContainer: '.hiprint-printPagination'
                    });
                    //打印设计
                    hiprintTemplate.design('#hiprint-printTemplate');
                    //打印
                    //这里获取上级页面的printData数据打印
                    // var printData = deepClone(parent.printData);
                    var printData = JSON.parse($("#printData").val());
                    hiprintTemplate.print(printData, '打印');
                    parent.layer.closeAll();
                }
                else //不成功
                {
                    layer.msg(res.msg, {
                        icon: 2,
                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                    }, function () { parent.layer.closeAll(); });
                }
            });
        }, 100);
        $('#directPrint').click(function () {
            hiprintTemplate.print(printData);
        });
    </script>
</body>
</html>
Wms/Model/ModelDto/DataDto/MateDataStockDto.cs
@@ -38,17 +38,23 @@
        /// <summary>
        /// 数量
        /// </summary>
        public string Qty { get; set; }
        public decimal? Qty { get; set; }
        /// <summary>
        /// 锁定数量
        /// </summary>
        public string LockQty { get; set; }
        public decimal? LockQty { get; set; }
        /// <summary>
        /// 冻结数量
        /// </summary>
        public string FrozenQty { get; set; }
        public decimal? FrozenQty { get; set; }
        /// <summary>
        /// 可抽检数量
        /// </summary>
        public decimal? InspectQty { get; set; }
        /// <summary>
        /// 剩余数量
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -4380,7 +4380,7 @@
                var exAllotList = new List<BllExportAllot>();
                var assign = new AllotSku();
                var specialSku = new List<string>();//特殊物料集合,无需托盘上全部分配的
                var specialSku = new List<string>();//特殊物料集合, 无需托盘上全部分配的
                Db.BeginTran();
                try
                {
@@ -4458,7 +4458,7 @@
                        }
                        else
                        {
                            qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic);
                            qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic, detail.LotNo, detail.IsMixBox);
                        }
                        
                        foreach (var sc in stockQtyDic)
Wms/WMS.BLL/BllSoServer/WaveMageServer.cs
@@ -480,7 +480,7 @@
                        Dictionary<string, int> zxQtyDic = new Dictionary<string, int>();//托出整箱数
                        //分配货物
                        //assign.AllocatePallets(stocks, pNum, bNum, needQty, stockQtyDic, zxQtyDic);
                        var qty = assign.AllotPallets(stockDetail, decimal.Parse(needQty.ToString()), pNum, bNum, stockQtyDic);
                        var qty = assign.AllotPallets(stockDetail, decimal.Parse(needQty.ToString()), pNum, bNum, stockQtyDic, detail.LotNo, detail.IsMixBox);
                       
                        foreach (var sc in stockQtyDic)
                        {
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -5,9 +5,12 @@
using System.Runtime.Intrinsics.X86;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Model.ModelDto;
using Model.ModelDto.DataDto;
using Model.ModelDto.SysDto;
using Model.ModelVm.DataVm;
using Model.ModelVm.SysVm;
using SqlSugar;
using WMS.DAL;
using WMS.Entity.Context;
@@ -31,92 +34,255 @@
        /// <summary>
        /// 查询库存总量
        /// </summary>
        /// <param name="selectType">查询类型 0:物料信息 1:批次信息 2:质检信息 3:货主信息</param>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="ownerNo">货主编码</param>
        /// <param name="ownerName">货主名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        public List<MateDataStockDto> GetDataStockList(string skuNo, string skuName, string ownerNo, string ownerName, string lotNo)
        public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus)
        {
            string str = "select stock.SkuNo,stock.SkuName,stock.LotNo,stock.LotText,stock.Standard,stock.Qty," +
                "stock.LockQty,stock.FrozenQty,stock.OwnerNo,stock.OwnerName,(mate.Weight * stock.Qty) WeightSum " +
                "from DataStock stock " +
                "left join SysMaterials mate on stock.SkuNo = mate.SkuNo " +
                "Where stock.IsDel = @isdel and mate.IsDel = 0 ";
            //判断物料编码是否为空
            if (!string.IsNullOrEmpty(skuNo))
            List<MateDataStockDto> modUser = new List<MateDataStockDto>();
            if (string.IsNullOrEmpty(selectType))
            {
                str += " and stock.SkuNo like @skuno";
            }
            //判断物料名称是否为空
            if (!string.IsNullOrEmpty(skuName))
            {
                str += " and stock.SkuName like @skuname";
            }
            //判断货主编码是否为空
            if (!string.IsNullOrEmpty(ownerNo))
            {
                str += " and stock.OwnerNo like @ownerNo";
            }
            //判断货主名称是否为空
            if (!string.IsNullOrEmpty(ownerName))
            {
                str += " and stock.OwnerName like @ownerName";
            }
            //判断货主名称是否为空
            if (!string.IsNullOrEmpty(lotNo))
            {
                str += " and stock.LotNo like @lotNo";
            }
            //排序
            str += " order by stock.SkuNo";
            List<MateDataStockDto> StockList = Db.Ado.SqlQuery<MateDataStockDto>(str, new
            {
                isdel = "0", //是否删除
                skuno = "%" + skuNo + "%", //物料编码
                skuname = "%" + skuName + "%", //物料名称
                ownerNo = "%" + ownerNo + "%", //货主编码
                ownerName = "%" + ownerName + "%", //货主名称
                lotNo = "%" + lotNo + "%", //批次号
            });
                modUser = await Db.Queryable<DataStock>()
                            .WhereIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo == skuNo)
                            .WhereIF(!string.IsNullOrEmpty(skuName), a => a.SkuName == skuName)
                            .WhereIF(!string.IsNullOrEmpty(ownerNo), a => a.OwnerNo == ownerNo)
                            .WhereIF(!string.IsNullOrEmpty(ownerName), a => a.OwnerName == ownerName)
                            .WhereIF(!string.IsNullOrEmpty(lotNo), a => a.LotNo == lotNo)
                            .Where(a => a.IsDel == "0")
                            .Select(a => new MateDataStockDto()
                            {
                                SkuNo = a.SkuNo, //物料编码
                                SkuName = a.SkuName, //物料名称
                                Standard = a.Standard, //规格
                                LotNo = a.LotNo, //批次
                                LotText = a.LotText, //批次描述
                                OwnerNo = a.OwnerNo, //货主编码
                                OwnerName = a.OwnerName, //货主名称
                                Status = status, //库存状态
                                InspectStatus = inspectStatus, //质检状态
                                Qty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.Qty), //库存数量
                                //Qty = SqlFunc.AggregateSum(b.Qty), //库存数量
                                LockQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.LockQty), //锁定数量
                                FrozenQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.FrozenQty), //冻结数量
                                InspectQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.InspectQty), //可抽检数量
                            }).ToListAsync();
            //库存总量
            List<MateDataStockDto> StockListDto = new List<MateDataStockDto>();
            foreach (var item in StockList)
            {
                StockListDto.Add(item);
                ////判断库存总量是否拥有物料
                //if (StockListDto.Count > 0)
                //{
                //    int i = 0;
                //    //foreach循环库存总量
                //    foreach (var dto in StockListDto)
                //    {
                //        //判断物料和批次是否相同
                //        if (dto.SkuNo == item.SkuNo && dto.LotNo == item.LotNo)
                //        {
                //            dto.Qty =  (Convert.ToDecimal(dto.Qty) + Convert.ToDecimal(item.Qty)).ToString();
                //            dto.FrozenQty = (Convert.ToDecimal(dto.FrozenQty) + Convert.ToDecimal(item.FrozenQty)).ToString();
                //            dto.LockQty = (Convert.ToDecimal(dto.LockQty) + Convert.ToDecimal(item.LockQty)).ToString();
                //            dto.ResidueQty= (Convert.ToDecimal(dto.ResidueQty) + Convert.ToDecimal(item.ResidueQty)).ToString();
                //            break;
                //        }
                //        i += 1;
                //        //判断已有相同物料
                //        if (i == StockListDto.Count)
                //        {
                //            StockListDto.Add(item);
                //            break;
                //        }
                //    }
                //}
                //else
                //{
                //    StockListDto.Add(item);
                //    continue;
                //}
                return modUser;
            }
            else
            {
                var selectList = new List<DataStockDetail>();
                switch (selectType)
                {
                    case "0": // 物料信息
                        modUser = await Db.Queryable<DataStock>()
                            .Where(a => a.IsDel == "0")
                            .GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard })
                            .Select(a => new MateDataStockDto()
                            {
                                SkuNo = a.SkuNo, //物料编码
                                SkuName = a.SkuName, //物料名称
                                Standard = a.Standard, //规格
                                Qty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.SkuNo == a.SkuNo)
                                    .Sum(s => s.Qty), //库存数量
                                LockQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.SkuNo == a.SkuNo)
                                    .Sum(s => s.LockQty), //锁定数量
                                FrozenQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.SkuNo == a.SkuNo)
                                    .Sum(s => s.FrozenQty), //冻结数量
                                InspectQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.SkuNo == a.SkuNo)
                                    .Sum(s => s.InspectQty), //可抽检数量
                            })
                            .ToListAsync();
            return StockListDto;
                        return modUser;
                    case "1": // 批次信息
                        modUser = await Db.Queryable<DataStock>()
                            .Where(a => a.IsDel == "0")
                            .GroupBy(a => new { a.LotNo, a.LotText })
                            .Select(a => new MateDataStockDto()
                            {
                                LotNo = a.LotNo, //批次
                                LotText = a.LotText, //批次描述
                                Qty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.Qty), //库存数量
                                LockQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.LockQty), //锁定数量
                                FrozenQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.FrozenQty), //冻结数量
                                InspectQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.LotNo == a.LotNo)
                                    .Sum(s => s.InspectQty), //可抽检数量
                            })
                            .ToListAsync();
                        return modUser;
                    case "2": // 质检信息
                        modUser = await Db.Queryable<DataStock>()
                            .LeftJoin<DataStockDetail>((a, b) => a.LotNo == b.LotNo)
                           .WhereIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo == skuNo)
                           .WhereIF(!string.IsNullOrEmpty(skuName), a => a.SkuName == skuName)
                           .WhereIF(!string.IsNullOrEmpty(ownerNo), a => a.OwnerNo == ownerNo)
                           .WhereIF(!string.IsNullOrEmpty(ownerName), a => a.OwnerName == ownerName)
                           .WhereIF(!string.IsNullOrEmpty(lotNo), a => a.LotNo == lotNo)
                           .WhereIF(!string.IsNullOrEmpty(status), (a, b) => b.Status == status)
                           .WhereIF(!string.IsNullOrEmpty(inspectStatus), (a, b) => b.InspectStatus == inspectStatus)
                           .Where(a => a.IsDel == "0")
                           .GroupBy((a, b) => b.InspectStatus)
                           .Select((a, b) => new MateDataStockDto()
                           {
                               InspectStatus = b.InspectStatus, //质检状态
                               Qty = SqlFunc.AggregateSum(b.Qty), //库存数量
                               LockQty = SqlFunc.AggregateSum(b.LockQty), //锁定数量
                               FrozenQty = SqlFunc.AggregateSum(b.FrozenQty), //冻结数量
                               InspectQty = SqlFunc.AggregateSum(b.InspectQty), //可抽检数量
                           })
                           .ToListAsync();
                        return modUser;
                    case "3": // 货主信息
                        modUser = await Db.Queryable<DataStock>()
                            .Where(a => a.IsDel == "0")
                            .GroupBy(a => new { a.OwnerNo, a.OwnerName })
                            .Select(a => new MateDataStockDto()
                            {
                                OwnerNo = a.OwnerNo, //货主编码
                                OwnerName = a.OwnerName, //货主名称
                                Qty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.OwnerNo == a.OwnerNo)
                                    .Sum(s => s.Qty), //库存数量
                                LockQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.OwnerNo == a.OwnerNo)
                                    .Sum(s => s.LockQty), //锁定数量
                                FrozenQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.OwnerNo == a.OwnerNo)
                                    .Sum(s => s.FrozenQty), //冻结数量
                                InspectQty = SqlFunc.Subqueryable<DataStockDetail>()
                                    .WhereIF(!string.IsNullOrEmpty(skuNo), s => s.SkuNo == skuNo)
                                    .WhereIF(!string.IsNullOrEmpty(skuName), s => s.SkuName == skuName)
                                    .WhereIF(!string.IsNullOrEmpty(ownerNo), s => s.OwnerNo == ownerNo)
                                    .WhereIF(!string.IsNullOrEmpty(ownerName), s => s.OwnerName == ownerName)
                                    .WhereIF(!string.IsNullOrEmpty(lotNo), s => s.LotNo == lotNo)
                                    .WhereIF(!string.IsNullOrEmpty(status), s => s.Status == status)
                                    .WhereIF(!string.IsNullOrEmpty(inspectStatus), s => s.InspectStatus == inspectStatus)
                                    .Where(s => s.IsDel == "0" && s.OwnerNo == a.OwnerNo)
                                    .Sum(s => s.InspectQty), //可抽检数量
                            })
                            .ToListAsync();
                        return modUser;
                    default:
                        break;
                }
                return modUser;
            }
        }
        /// <summary>
@@ -837,9 +1003,9 @@
                        //判断物料是否相同
                        if (dto.SkuNo == item.SkuNo)
                        {
                            dto.Qty = (Convert.ToInt32(dto.Qty) + Convert.ToInt32(item.Qty)).ToString();
                            dto.FrozenQty = (Convert.ToInt32(dto.FrozenQty) + Convert.ToInt32(item.FrozenQty)).ToString();
                            dto.LockQty = (Convert.ToInt32(dto.LockQty) + Convert.ToInt32(item.LockQty)).ToString();
                            dto.Qty = Convert.ToInt32(dto.Qty) + Convert.ToInt32(item.Qty);
                            dto.FrozenQty = Convert.ToInt32(dto.FrozenQty) + Convert.ToInt32(item.FrozenQty);
                            dto.LockQty = Convert.ToInt32(dto.LockQty) + Convert.ToInt32(item.LockQty);
                            dto.ResidueQty = (Convert.ToInt32(dto.ResidueQty) + Convert.ToInt32(item.ResidueQty)).ToString();
                            break;
                        }
Wms/WMS.BLL/Logic/AllotSku.cs
@@ -20,8 +20,10 @@
        /// <param name="fullPalletQty">满托数量</param>
        /// <param name="fullBoxQty">满箱数量</param>
        /// <param name="stockQtyDic">托出库物品数 key:库存托盘表的ID、val:托盘上的数量</param>
        /// <param name="lotNo">批次</param>
        /// <param name="isMixBox">是否接受拼箱 0:否  1:是</param>
        /// <returns></returns>
        public decimal AllotPallets(List<DataStockDetail> palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, decimal> stockQtyDic)
        public decimal AllotPallets(List<DataStockDetail> palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, decimal> stockQtyDic,string lotNo,string isMixBox)
        {
            //优先先进先出(快过期的先出)
            //优先零箱、零托(出完零箱出整箱)
@@ -84,8 +86,6 @@
                {
                    var ztNum = needQty / fullPalletQty;//需要整托数
                    var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//整托
                    var sps = list.Where(s => s.Qty < fullPalletQty).ToList();//散托(有可能是被锁定了数量的) 
@@ -96,7 +96,14 @@
                                                                                                                          //散托
                        foreach (var s in st)
                        {
                            var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString());
                            decimal otherLotQty = 0;//混箱中其他批次数量
                            //不接受拼箱
                            if (isMixBox == "0")
                            {
                                //查找出混箱集合
                                otherLotQty = GetMixBoxQty(s.Id, lotNo);
                            }
                            var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty - otherLotQty).ToString());
                            if (needQty - qty < detailQty)
                            {
                                var num = needQty - qty;
@@ -119,7 +126,14 @@
                            var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//所有未使用的托盘(未被分配的)
                            foreach (var ss in zt)
                            {
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                                decimal otherLotQty = 0;//混箱中其他批次数量
                                //不接受拼箱
                                if (isMixBox == "0")
                                {
                                    //查找出混箱集合
                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
                                }
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                if (needQty - qty < detailQty)
                                {
                                    var num = needQty - qty;
@@ -135,10 +149,7 @@
                                    break;
                                }
                            }
                        }
                    }
                    else if (allotSet == 1)//优先整托(分配合适的整托数量)
                    {
@@ -153,7 +164,14 @@
                            var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//所有未使用的托盘(未被分配的)
                            foreach (var ss in zt)
                            {
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                                decimal otherLotQty = 0;//混箱中其他批次数量
                                //不接受拼箱
                                if (isMixBox == "0")
                                {
                                    //查找出混箱集合
                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
                                }
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                if (needQty - qty < detailQty)
                                {
                                    break;
@@ -174,7 +192,14 @@
                            foreach (var ss in zt)
                            {
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                                decimal otherLotQty = 0;//混箱中其他批次数量
                                //不接受拼箱
                                if (isMixBox == "0")
                                {
                                    //查找出混箱集合
                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
                                }
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                if (needQty - qty < detailQty)
                                {
                                    var num = needQty - qty;
@@ -197,7 +222,14 @@
                            var zt = zps.Where(s => !sIds.Contains(s.Id)).OrderBy(s => s.ExpirationTime).ThenBy(m => m.Qty - m.LockQty - m.FrozenQty).ToList();//所有未使用(未被分配的)
                            foreach (var ss in zt)
                            {
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                                decimal otherLotQty = 0;//混箱中其他批次数量
                                //不接受拼箱
                                if (isMixBox == "0")
                                {
                                    //查找出混箱集合
                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
                                }
                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                if (needQty - qty < detailQty)
                                {
                                    var num = needQty - qty;
@@ -213,7 +245,6 @@
                                }
                            }
                        }
                    }
                }
                
@@ -230,6 +261,28 @@
            }
        }
        /// <summary>
        /// 查找出混箱中其他批次总数量
        /// </summary>
        /// <param name="stockDetailId"></param>
        /// <param name="lotNo"></param>
        /// <returns></returns>
        private decimal GetMixBoxQty(int stockDetailId,string lotNo)
        {
            var contextDb = DataContext.Db;
            //查找出混箱集合
            List<string> mixBoxList = contextDb.Queryable<DataBoxInfo>()
                .Where(w => w.IsDel == "0" && w.StockDetailId == stockDetailId)
                .GroupBy(g => g.LotNo)
                .Having(h => SqlFunc.AggregateCount(h.LotNo) > 1)
                .Select(s => s.BoxNo).ToList();
            decimal otherLotQty = contextDb.Queryable<DataBoxInfo>()
                .Where(w => w.IsDel == "0" && w.StockDetailId == stockDetailId && mixBoxList.Contains(w.BoxNo) && w.LotNo != lotNo)
                .Sum(s => s.Qty);
            return otherLotQty;
        }
        /// <summary>
        /// JC23领料出库分配货物(分配托盘上全部物料,防止四楼不同投料口分配同一托盘物料冲突)
Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
@@ -14,10 +15,16 @@
        /// <summary>
        /// 查询库存总量
        /// </summary>
        /// <param name="selectType">查询类型</param>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="ownerNo">货主编码</param>
        /// <param name="ownerName">货主名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        List<MateDataStockDto> GetDataStockList(string skuNo, string skuName, string ownerNo, string ownerName, string lotNo);
        Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus);
        /// <summary>
        /// 获取库存明细
Wms/Wms/Controllers/StatisticalController.cs
@@ -6,6 +6,7 @@
using WMS.Entity.DataEntity;
using WMS.IBLL.IDataServer;
using System.Security.Claims;
using System.Threading.Tasks;
namespace Wms.Controllers
{
@@ -40,13 +41,19 @@
        /// <summary>
        /// 获取库存总量
        /// </summary>
        /// <param name="skuNo"></param>
        /// <param name="skuName"></param>
        /// <param name="selectType">查询类型</param>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="ownerNo">货主编码</param>
        /// <param name="ownerName">货主名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryList(string skuNo, string skuName, string ownerNo, string ownerName, string lotNo)
        public async Task<IActionResult> GetInventoryList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus)
        {
            List<MateDataStockDto> StockList = _stock.GetDataStockList(skuNo, skuName, ownerNo, ownerName, lotNo);
            List<MateDataStockDto> StockList = await _stock.GetDataStockList(selectType, skuNo, skuName, ownerNo, ownerName, lotNo, status, inspectStatus);
            return Ok(new
            {
                data = StockList,
@@ -68,9 +75,9 @@
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus, string ownerNo, string ownerName,string startTime,string endTime)
        public IActionResult GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTime)
        {
            List<StockDetailDto> stockDetailsList = _stock.GetInventoryList1(skuNo, skuName, lotNo, locatNo, palletNo, status, inspectStatus, ownerNo, ownerName, startTime,endTime);
            List<StockDetailDto> stockDetailsList = _stock.GetInventoryList1(skuNo, skuName, lotNo, locatNo, palletNo, status, inspectStatus, ownerNo, ownerName, startTime, endTime);
            return Ok(new
            {
                data = stockDetailsList,
@@ -98,7 +105,7 @@
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBindList(string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus, string ownerNo, string ownerName,string startTime,string endTIme)
        public IActionResult GetBindList(string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTIme)
        {
            try
            {
@@ -341,7 +348,7 @@
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus,string startTime,string endTime)
        public IActionResult GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus, string startTime, string endTime)
        {
            List<StockDetailDto> stockDetailsList = _stock.GetInventoryList1DaoChu(skuNo, skuName, lotNo, locatNo, palletNo, status, inspectStatus, startTime, endTime);
            return Ok(new