601cdc345ba6181aa8455a4964fe433e71c875de..ee4806a4b2ec94ec63b4cb9b58447d9863baebe5
2025-03-27 wxw
修改问题
ee4806 对比 | 目录
2025-03-27 wxw
修改问题
287133 对比 | 目录
2025-03-11 wxw
Merge branch 'wxw'
7631b0 对比 | 目录
2025-03-11 wxw
修改问题
8cd6bb 对比 | 目录
2025-03-10 DESKTOP-9BNTV8O
修改问题
c0da7e 对比 | 目录
2025-03-10 DESKTOP-9BNTV8O
修改问题
137bb1 对比 | 目录
2025-03-10 wxw
修改问题
bce24b 对比 | 目录
2025-03-07 wxw
修改问题
88604f 对比 | 目录
2025-03-06 wxw
修改问题
d3a16b 对比 | 目录
2025-03-06 wxw
修改问题
52af69 对比 | 目录
2025-02-11 wxw
去掉入库单和出库单验证
415e71 对比 | 目录
2025-02-06 wxw
修改问题
c5d492 对比 | 目录
2025-01-19 DESKTOP-9BNTV8O
修改问题
8dbe5e 对比 | 目录
2024-12-31 DESKTOP-9BNTV8O
修改问题
a41be6 对比 | 目录
2024-12-30 DESKTOP-9BNTV8O
修改问题
2bcd2e 对比 | 目录
2024-12-28 wxw
修改问题
6cd2a2 对比 | 目录
2024-12-26 wxw
修改问题
d7f5e3 对比 | 目录
2024-12-25 DESKTOP-9BNTV8O
修改问题
20a792 对比 | 目录
2024-12-24 DESKTOP-9BNTV8O
修改问题
2fd828 对比 | 目录
2024-12-23 wxw
修改问题
bdb2bf 对比 | 目录
2024-12-19 wxw
修改问题
78279b 对比 | 目录
2024-12-16 DESKTOP-9BNTV8O
修改问题
66b1b9 对比 | 目录
2024-12-15 wxw
修改问题
ba48b2 对比 | 目录
2024-12-14 DESKTOP-9BNTV8O
修改问题
e8dff3 对比 | 目录
2024-12-14 DESKTOP-9BNTV8O
修改问题
ef48a7 对比 | 目录
2024-12-14 wxw
修改问题
41c5a1 对比 | 目录
2024-12-14 DESKTOP-9BNTV8O
修改问题
92e2c3 对比 | 目录
2024-12-14 DESKTOP-9BNTV8O
修改问题
64c5bb 对比 | 目录
2024-12-14 wxw
修改问题
c798f9 对比 | 目录
2024-12-13 DESKTOP-9BNTV8O
修改问题
6c3738 对比 | 目录
2024-12-13 wxw
修改问题
66d600 对比 | 目录
2024-12-13 DESKTOP-9BNTV8O
Merge branch 'master' of http://47.95.120.53:8083/r/JC23WMS-2
c77b53 对比 | 目录
2024-12-13 DESKTOP-9BNTV8O
修改问题
e867f0 对比 | 目录
2024-12-13 wxw
修改问题
ef97dd 对比 | 目录
2024-12-11 wxw
修改问题
0651ef 对比 | 目录
2024-07-07 Administrator
修改问题
csc
22f39e 对比 | 目录
2024-07-04 Administrator
Merge branch 'wxw'
eccda2 对比 | 目录
2024-07-04 Administrator
修改问题
527f22 对比 | 目录
2024-07-04 zhaowc
增加出库合格判断
zwc
6ed99b 对比 | 目录
2024-07-03 Administrator
修改问题
ea4fe1 对比 | 目录
2024-07-02 Administrator
修改问题
1c5add 对比 | 目录
2024-06-30 Administrator
修改问题
dfd6f9 对比 | 目录
2024-06-28 Administrator
修改问题
8db847 对比 | 目录
2024-06-25 Administrator
Merge branch 'wxw'
c161ac 对比 | 目录
2024-06-25 Administrator
修改问题
65a82f 对比 | 目录
2024-06-25 zhaowc
接口联调后修改
17ac8f 对比 | 目录
2024-06-25 zhaowc
Merge branch 'zwc'
d50dd4 对比 | 目录
2024-06-25 zhaowc
任务下发修改
8feab7 对比 | 目录
2024-06-25 Administrator
修改问题
8dbd0c 对比 | 目录
2024-06-25 Administrator
Merge branch 'wxw'
65dac0 对比 | 目录
3个文件已添加
59个文件已修改
5784 ■■■■ 已修改文件
HTML/js/public.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/ASNSetting/ArrivalLogTask.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/ASNSetting/ArrivalNotice.html 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/ASNSetting/ArrivalNoticeDetail.html 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/CRLogTask.html 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/Login.html 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/QualityControl/QualityInformation.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/QualityControl/QualityInformationFrom.html 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportNotice.html 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportNoticeAddFrom.html 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportSelectSkuFrom.html 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/BoxInfor.html 248 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/PalletAddFrom.html 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/Area.html 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/AreaAddFrom.html 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/AreaFrom.html 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/Locate.html 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/LocateFrom.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/Pallets.html 225 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/WareHouseSetting/PalletsPrintFrom.html 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/index.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/web.config 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/AsnModels.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/HttpModel.cs 530 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/RCSModel.cs 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/TaskModel.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/DataDto/StockDetailDto.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/LogDto/TaskDto.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/SysDto/AreaDto.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelDto/SysDto/LocatDto.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelVm/SysVm/AreaVm.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelVm/SysVm/LocateVm.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelVm/SysVm/PalletVm.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllQualityServer/QualityInspectServer.cs 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 327 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllTransServer/NoticeServer.cs 562 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllTransServer/RcsServer.cs 1623 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockDetailServer.cs 251 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/LogServer/TaskServer.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/SysServer/PalletsServer.cs 164 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/SysServer/StorageAreaServer.cs 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/SysServer/StorageLocatServer.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.DAL/Common.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/DataEntity/DataStockDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/LogEntity/LogTask.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/SysEntity/SysStorageArea.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllQualityServer/IQualityInspectServer.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllTransServer/INoticeServer.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllTransServer/IRcsServer.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockDetailServer.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/ISysServer/IPalletsServer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/ISysServer/IStorageAreaServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllCheckController.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllQualityController.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllSoController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 483 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/SysController.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/UpApiController.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Tools/ApiUrlConfig.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/appsettings.json 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/js/public.js
@@ -1,7 +1,8 @@
//var IP = "http://47.104.149.73:1991";//接口IP
// var IP = "http://172.16.71.101:8082/";//接口IP
//var IP = "http://localhost:13243/api";
var IP = "http://localhost:50515/api";  //本地
//var IP = "http://localhost:50515/api";  //本地
var IP = "http://172.16.105.10:8086/api";
// var IP = "http://localhost:44318/api";
//var IP = "http://192.168.1.6:8017";
//var IP = "http://192.168.1.226:8086";  
HTML/views/ASNSetting/ArrivalLogTask.html
@@ -97,10 +97,10 @@
                            lay-filter="LAY-app-contlist-shenqing">
                            <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>申请储位
                        </button> -->
                        <button class="layui-btn layui-btn-sm layuiadmin-btn-list shenqingClass" lay-submit
                        <!-- <button class="layui-btn layui-btn-sm layuiadmin-btn-list shenqingClass" lay-submit
                        lay-filter="LAY-app-contlist-shenqing" id="add">
                            <i class="layui-icon layui-icon-add layuiadmin-button-btn"></i>申请储位
                        </button>
                        </button> -->
                    </div>
                </div>
            </div>
@@ -277,7 +277,7 @@
                     {field: 'TaskNo',title: '任务号',width: 170,align: 'center',fixed: 'left', "disabled": true}, 
                     {field: 'Type',title: '任务类型',width: 95,align: 'center',templet: '#templetType'}, 
                     {field: 'IsSuccess',title: '是否下发成功',width: 120,align: 'center',templet: '#templetIsSuccess'}, 
                     {field: 'PalletNo',title: '托盘号',width: 110,align: 'center'},
                     {field: 'PalletNo',title: '桶号',width: 110,align: 'center'},
                     {field: 'StartLocat',title: '起始位置',width: 100,align: 'center'}, 
                     {field: 'EndLocat',title: '目标位置',width: 100,align: 'center'}, 
                     {field: 'Status',title: '状态',width: 95,align: 'center',templet: '#templetStatus'}, 
HTML/views/ASNSetting/ArrivalNotice.html
@@ -73,7 +73,7 @@
                                class="layui-input">
                        </div>
                    </div>
                    <div class="layui-inline">
                    <!-- <div class="layui-inline">
                        <label class="layui-form-label">物料编码</label>
                        <div class="layui-input-inline">
                            <input type="text" id="SkuNo" name="SkuNo" placeholder="物料编码" autocomplete="off"
@@ -86,7 +86,7 @@
                            <input type="text" id="SkuName" name="SkuName" placeholder="物料名称" autocomplete="off"
                                class="layui-input">
                        </div>
                    </div>
                    </div> -->
                    <!-- <div  class="layui-inline">
                        <label  class="layui-form-label">单据类型</label>
                        <div class="layui-input-inline">
@@ -117,13 +117,13 @@
                            </select>
                        </div>
                    </div> -->
                    <div class="layui-inline">
                    <!-- <div class="layui-inline">
                        <label class="layui-form-label" style="width: 90px;">上游系统单号</label>
                        <div class="layui-input-inline">
                            <input type="text" id="OrderCode" name="OrderCode" placeholder="上游系统单号"
                                autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    </div> -->
                    <!-- <div class="layui-inline">
                        <label class="layui-form-label">客户名称</label>
                        <div class="layui-input-inline">
@@ -309,11 +309,11 @@
                    </div>
                    <!-- #endregion -->
                    <!-- <script type="text/html" id="toolbarDemo">
                    <script type="text/html" id="toolbarDemo">
                        <button style="margin-right: 5px;" class="layui-btn layui-btn-sm layuiadmin-btn-list addClass" lay-event="add" >
                            <i class="layui-icon">&#xe654;</i>添加
                        </button>
                    </script> -->
                    </script>
 
                    <script type="text/html" id="toolbarDemoList">
                        {{# function GetBtn2(d){ 
@@ -322,11 +322,7 @@
                                if(d.Status == "0"){ 
                                    html = `<a class="layui-btn layui-btn-danger layui-btn-xs delClass" lay-event="del"> 
                                        <i class="layui-icon layui-icon-delete"></i>删除</a>`; 
                                }
                                if((d.AsnType =="1" || d.AsnType == "4" || d.AsnType == "5" || d.AsnType == "6") && d.IsPasteCode == "1" && (d.Status == "0" || d.Status == "1")){
                                    html += `<a class="layui-btn layui-btn-normal layui-btn-xs addLabelClass" lay-event="Addlabel">
                                        <i class="layui-icon layui-icon-edit"></i>生成标签</a>`;
                                }
                                }
                                
                                return html;
                            } 
@@ -546,18 +542,18 @@
                        {field: 'CompleteTime',title: '完成时间',align: 'center', width: 160,templet: '#templetCompleteTime2'},
                        {field: 'IsSampling',title: '是否取样',align: 'center',width: 90,templet: '#templetIsSampling'},
                        {field: 'InspectStatus',title: '质检状态',align: 'center',width: 90,templet: '#templetInspectStatus'},
                        {field: 'UnitName',title: '计量单位',align: 'center',width: 90},
                        //{field: 'UnitName',title: '计量单位',align: 'center',width: 90},
                        // {field: 'Price',title: '单价',align: 'center',width: 65},
                        // {field: 'Money',title: '金额',align: 'center',width: 65},
                        {field: 'LotText',title: '批次描述',align: 'center',width: 120},
                        {field: 'PackagName',title: '包装名称',align: 'center',width: 110,},
                        {field: 'IsBale',title: '是否裹包',align: 'center',width: 150},
                        {field: 'IsBelt',title: '是否打带',align: 'center',width: 150},
                        {field: 'UDF1',title: '自定义列1',align: 'center',width: 140},
                        {field: 'UDF2',title: '自定义列2',align: 'center',width: 140},
                        {field: 'UDF3',title: '自定义列3',align: 'center',width: 140},
                        {field: 'UDF4',title: '自定义列4',align: 'center',width: 140},
                        {field: 'UDF5',title: '自定义列5',align: 'center',width: 140,templet:'#templetUDF5'},
                        // {field: 'PackagName',title: '包装名称',align: 'center',width: 110,},
                        // {field: 'IsBale',title: '是否裹包',align: 'center',width: 150},
                        // {field: 'IsBelt',title: '是否打带',align: 'center',width: 150},
                        // {field: 'UDF1',title: '自定义列1',align: 'center',width: 140},
                        // {field: 'UDF2',title: '自定义列2',align: 'center',width: 140},
                        // {field: 'UDF3',title: '自定义列3',align: 'center',width: 140},
                        // {field: 'UDF4',title: '自定义列4',align: 'center',width: 140},
                        // {field: 'UDF5',title: '自定义列5',align: 'center',width: 140,templet:'#templetUDF5'},
                        {field: 'CreateUserName',title: '创建人',align: 'center',width: 100},
                        {field: 'CreateTime',title: '创建时间',align: 'center',width: 160,templet: '#templetCreateTime2'},
                        {field: 'UpdateUserName',title: '修改人',align: 'center',width: 150,},
HTML/views/ASNSetting/ArrivalNoticeDetail.html
@@ -60,25 +60,13 @@
            <div class="layui-input-inline">
                <select name="Type" id="Type" lay-filter="Type" lay-search>
                    <!-- JC23 -->
                    <option value="0">成品入库</option>
                    <option value="1">采购入库</option>
                    <option value="4">车间余料退回入库</option>
                    <option value="5">其它入库</option>
                    <option value="6">代储入库</option>
                    <!-- <option value=""></option> -->
                    <!-- JC24 -->
                    <!-- <option value="0" selected>成品入库</option>
                    <option value="1">采购入库</option>
                    <option value="2">中间品入库</option> -->
                    <!-- <option value="3">退货入库</option> -->
                    <!-- <option value="0">成品入库</option> -->
                    <!-- <option value="1">原料入库</option> -->
                    <!-- <option value="4">车间余料退回入库</option>
                    <option value="6">代储入库</option> -->
                    <!-- <option value=""></option> -->
                    <option value="5">其它入库</option>
                    <option value="6">代储入库</option>
                    <option value="7">寄存入库</option> -->
                    <!-- JC08 -->
                    <!-- <option value="0">成品入库</option>
                    <option value="1">原料入库</option>
                    <option value="2">退货入库</option> -->
                </select>
            </div>
@@ -133,7 +121,7 @@
                            {{# function GetBtn1(d){
                                    var html = ''; 
                                    var TypeValue = $("#Type").val();
                                    if(TypeValue=='1' || TypeValue=='5' || TypeValue=='6' || TypeValue=='7'){
                                    if(TypeValue=='6' || TypeValue=='7'){
                                        if(d.LotNo==null || d.LotNo==undefined || d.LotNo==''){
                                            html+= '<input type="text" class="input-dis" value="" disabled>';
                                        }else{
@@ -209,7 +197,7 @@
                { field: 'Id', title: '入库单明细ID', width: 120, align: 'center', fixed: 'left', hide: true, "disabled": true },
                { field: 'SkuNo', title: '物料编码', minWidth: 100, align: 'center', fixed: 'left', "disabled": true },
                { field: 'SkuName', title: '物料名称', minWidth: 180, align: 'center', fixed: 'left', "disabled": true },
                { field: 'LotNo', title: '批次号', align: 'center', edit: 'text', minWidth: 130, fixed: 'left', templet: '#templetLotNo', "disabled": true },
                { field: 'LotNo', title: '批次号', align: 'center', edit: 'text', minWidth: 130, fixed: 'left', templet: '#templetLotNo' },
                { field: 'SupplierLot', title: '供货批次', width: 130, edit: 'text', event: 'setSign', fixed: 'left', "disabled": true },
                { field: 'Qty', title: '数量', align: 'center', width: 80, edit: 'number', event: 'dataNumber', fixed: 'left', "disabled": true },
                { field: 'UnitName', title: '计量单位', align: 'center', width: 70 },
@@ -327,8 +315,8 @@
            }
            else {
                // 添加的时候移除‘采购入库’项
                $('select[lay-filter="Type"]').find('option[value="1"]').remove();
                form.render('select'); // 更新layui的select渲染
                //$('select[lay-filter="Type"]').find('option[value="1"]').remove();
                //form.render('select'); // 更新layui的select渲染
            }
@@ -531,9 +519,7 @@
                                break;
                            case "1": //采购入库
                            case "5": //其它入库
                                TypeNum = 1;
                                console.log(TypeNum)
                                break;
                            case "0": //成品入库
                            case "2": //中间品入库
                            case "4": //车间余料入库
HTML/views/HouseWithinSetting/CRLogTask.html
@@ -305,7 +305,12 @@
                        templet: '#IsSuccessButton',
                    }, {
                        field: 'PalletNo',
                        title: '托盘号',
                        title: '桶号',
                        width: 110,
                        align: 'center',
                    }, {
                        field: 'LotNo',
                        title: '批次号',
                        width: 110,
                        align: 'center',
                    }, {
@@ -646,10 +651,7 @@
                        var param = {
                            taskNo: data.TaskNo
                        };
                        var postUrl="/BllCheck/CancelCheckTask"
                        if(data.OrderType=='3'){
                            postUrl='/BllCheck/CancelMoveTask'
                        }
                        var postUrl='/DownApi/CancelAgvTaskWms'
                        sendData(IP + postUrl, param, 'post', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
@@ -676,10 +678,7 @@
                        var param = {
                            taskNo: data.TaskNo,
                        };
                        var postUrl="/BllCheck/FinishCheckTask"
                        if(data.OrderType=='3'){
                            postUrl='/BllCheck/FinishMoveTask'
                        }
                        var postUrl='/DownApi/FinshAgvTaskWms'
                        sendData(IP + postUrl, param, 'post', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
@@ -706,7 +705,7 @@
                        var param = {
                            taskNo: data.TaskNo
                        };
                        sendData(IP + "/DownApi/AgainSendCheckTask", param, 'get', function (res) {
                        sendData(IP + "/DownApi/SendAgvTaskWms", param, 'post', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
                                layer.msg(res.msg, {
HTML/views/Login.html
@@ -3,9 +3,9 @@
<head>
    <meta charset="utf-8">
    <title>博柯莱·仓储管理系统</title>
    <meta name="keywords" content="博柯莱·仓储管理系统">
    <meta name="description" content="博柯莱·仓储管理系统">
    <title>博柯莱·AGV转运系统</title>
    <meta name="keywords" content="博柯莱·AGV转运系统">
    <meta name="description" content="博柯莱·AGV转运系统">
    <!-- <link rel="shortcut icon" type="image/ico" href="../img/河北博柯莱-logo01.png" /> -->
    <!-- <link rel="bookmark" type="image/ico" href="../img/favicon.ico" /> -->
    <link href="../layuiadmin/layui/css/layui.css" rel="stylesheet" />
@@ -20,17 +20,17 @@
<body>
    <div class="elight-product-box animated fadeInUp">
        <h2>博柯莱·仓储管理系统</h2>
        <!-- <h2>博柯莱·转运系统</h2>
        <ul class="product-desc">
            <li>“博柯莱·仓储管理系统”简称“WMS系统”,WMS是智能仓库管理系统(Warehouse Management System) 的缩写。</li>
            <li>WMS系统是一个实时的、完善的企业级仓储信息管理系统。</li>
            <li>它能够按照运作的业务规则和运算法则,通过入库、出库、移库和拣选等功能,综合批次管理、物料对应、库存盘点、质量管理和即时库存管理等功能的运用,对信息、资源、行为和存货进行完美的管理,使其能最大程度的满足有效产出和精确性的要求。
            </li>
            <li>它通过条码扫描、流水跟踪、任务跟踪等方式有效控制并跟踪仓储业务的全过程,提高仓储物流配送效率,减少仓库作业对人员经验的依赖性。</li>
        </ul>
        </ul> -->
    </div>
    <div class="elight-login-box animated fadeInRight">
        <div class="elight-login-header">博柯莱·仓储管理系统</div>
        <div class="elight-login-header">博柯莱·AGV转运系统</div>
        <div class="elight-login-body">
            <form class="layui-form">
                <div class="layui-form-item">
HTML/views/QualityControl/QualityInformation.html
@@ -36,7 +36,7 @@
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width: 60px;">批次号</label>
                            <div class="layui-input-inline">
                                <input type="text" id="LotNo" name="LotNo" placeholder="请输入物料名称" autocomplete="off" class="layui-input">
                                <input type="text" id="LotNo" name="LotNo" placeholder="请输入批次号" autocomplete="off" class="layui-input">
                            </div>
                        </div>
                        <!-- 物料号 -->
@@ -363,7 +363,7 @@
                                    InspectNo: field.InspectNo,        
                                    //ASNNo: field.ASNNo,        
                                    LotNo: field.LotNo,
                                    SkuNo: field.SkuNo,
                                    //SkuNo: field.SkuNo,
                                    IsQualified: field.IsQualified,
                                };
                                if(doing)
HTML/views/QualityControl/QualityInformationFrom.html
@@ -22,18 +22,26 @@
                    <input type="text" name="ASNNo" placeholder="请输入入库单号" autocomplete="off" class="layui-input">
                </div>
            </div> -->
            <div class="layui-form-item">
            <!-- <div class="layui-form-item">
                <label class="layui-form-label">批次号</label>
                <div class="layui-input-block" style="width: 70%;">
                    <input type="text" name="LotNo" placeholder="请输入批次号" lay-verify="required" autocomplete="off" class="layui-input">
                </div>
            </div>
            </div> -->
            <div class="layui-form-item">
                <label class="layui-form-label">批次号</label>
                <div class="layui-input-block" style="width: 70%;">
                    <select name="LotNo" id="LotNo" lay-filter="LotNo" lay-verify="">
                        <option value=""></option>
                    </select>
                </div>
            </div>
            <!-- <div class="layui-form-item">
                <label class="layui-form-label">物料号</label>
                <div class="layui-input-block" style="width: 70%;">
                    <input type="text" name="SkuNo" placeholder="请输入物料号" lay-verify="required" autocomplete="off" class="layui-input">
                </div>
            </div>
            </div> -->
            <div class="layui-form-item">
                    <label class="layui-form-label">审核状态</label>
                    <div class="layui-input-block" style="width: 70%;">
@@ -72,6 +80,23 @@
                    if (r != null) return unescape(r[2]);
                    return null;
                }
                //获取批次下拉框信息
                sendData(IP + "/BllQuality/GetLotNoList", {}, 'get', function(res) {
                    if (res.code == 0) { //成功
                    for (var i = 0; i < res.data.length; i++) {
                        $("#LotNo").append('<option value =' + res.data[i].LotNo + '>' + res.data[i].LotNo + '</option>');
                    }
                    form.render('select');
                    } else { //不成功
                        layer.msg(res.msg, {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function() {});
                    }
                });
        </script>
    </body>
</html>
HTML/views/SOSetting/ExportNotice.html
@@ -326,51 +326,14 @@
                <script type="text/html" id="table-content-list">
                        {{# function GetBtn1(d){
                                var html = ''; 
                                if(d.IsWave == '0'){
                                    if(d.Status == '0' || d.Status == '1' ){
                                        if(d.Type != "8" && d.Type != "2") {
                                            html += `<a class="layui-btn layui-btn-normal layui-btn-xs zifenClass" lay-event="auto">
                                                <i class="layui-icon layui-icon-ok"></i>自动分配
                                            </a>`;
                                        }
                                    }
                                if(d.IsWave == '0'){
                                    if(d.Status == '0' && d.Origin == 'WMS'){
                                        html += `<a class="layui-btn layui-btn-normal layui-btn-xs uptClass" lay-event="edit">
                                                    <i class="layui-icon layui-icon-edit"></i>编辑
                                                </a>
                                                <a class="layui-btn layui-btn-danger layui-btn-xs delClass" lay-event="delete">
                                        html += `<a class="layui-btn layui-btn-danger layui-btn-xs delClass" lay-event="delete">
                                                    <i class="layui-icon layui-icon-delete"></i>删除
                                                </a>`;
                                    }
                                    if(d.Status == '1' || d.Status == '2'){
                                        html += `<a class="layui-btn layui-btn-danger layui-btn-xs qufenClass" lay-event="cancel">
                                                    <i class="layui-icon layui-icon-delete"></i>取消分配
                                                </a>`;
                                    }
                                    if(d.Type == "1" && (d.Status == '2' || d.Status == '3')){
                                        html += `<a class="layui-btn layui-btn-normal layui-btn-xs outClass" lay-event="beiLiaoOutKu">
                                            <i class="layui-icon layui-icon-ok"></i>备料
                                        </a>`;
                                    }
                                    if( d.Status == '2' || d.Status == '3'){
                                        html += `<a class="layui-btn layui-btn-normal layui-btn-xs outClass" lay-event="outKu">
                                                    <i class="layui-icon layui-icon-ok"></i>出库
                                                </a>`;
                                    }
                                }
                                if( d.Status == '4'){
                                    html += `<a class="layui-btn layui-btn-normal layui-btn-xs guanClass" lay-event="finish">
                                                <i class="layui-icon layui-icon-ok"></i>关单
                                            </a>`;
                                }
                                if( d.Status == '5'){
                                    html += `<a class="layui-btn layui-btn-normal layui-btn-xs checkClass" lay-event="check">
                                        <i class="layui-icon layui-icon-ok"></i>复核
                                    </a>`;
                                }
                                html += `<a class="layui-btn layui-btn-normal layui-btn-xs shangClass" lay-event="xml">
                                    <i class="layui-icon layui-icon-ok"></i>XML
                                </a>`;
                                html += `<a class="layui-btn layui-btn-normal layui-btn-xs editDemoClass" lay-event="editDemo">
                                    <i class="layui-icon layui-icon-edit"></i>备注</a>`;
                                return html;
@@ -472,12 +435,12 @@
            var TotalColsArr = [[
                { field: '', title: '序号', type: 'numbers', width: 50, align: 'center', fixed: 'left', "disabled": true },
                { field: 'SONo', title: '出库单号', align: 'center', fixed: 'left', width: 165, "disabled": true },
                { field: 'Type', title: '单据类型', align: 'center', templet: '#templetType' },
                //{ field: 'Type', title: '单据类型', align: 'center', templet: '#templetType' },
                { field: 'Status', title: '执行状态', align: 'center', templet: '#templetStatus' },
                // { field: 'LogisticsName', title: '承运商', align: 'center' },
                // { field: 'CustomerName', title: '客户名称', align: 'center' },
                { field: 'LotNo', title: '批次号', align: 'center' },
                { field: 'LotNoText', title: '批次描述', align: 'center' },
                //{ field: 'LotNo', title: '批次号', align: 'center' },
                //{ field: 'LotNoText', title: '批次描述', align: 'center' },
                //{ field: 'IsDespatch', title: '是否发运', align: 'center', templet: '#templetIsDespatch' },
                //{ field: 'SupplierLot', title: '供货批次', align: 'center' },
                { field: 'Origin', title: '来源', align: 'center' },
@@ -758,7 +721,7 @@
                { field: 'SONo', title: '出库单号', align: 'center', fixed: 'left', width: 165 },
                { field: 'SkuNo', title: '物料编码', align: 'center'},
                { field: 'SkuName', title: '物料名称', align: 'center'},
                { field: 'Standard', title: '物料规格', align: 'center'},
                //{ field: 'Standard', title: '物料规格', align: 'center'},
                { field: 'LotNo', title: '批次号', align: 'center'},
                { field: 'Qty', title: '计划数量', align: 'center'},
                //{ field: 'AllotQty', title: '分配数量', align: 'center', width: 100 },
@@ -771,7 +734,7 @@
                //{ field: 'SupplierLot', title: '供货批次', align: 'center', width: 120 },
                //{ field: 'Price', title: '单价', align: 'center', width: 80 },
                //{ field: 'Money', title: '总金额', align: 'center', width: 90 },
                { field: 'caozuo', title: '操作', fixed: 'right', width: 100, align: 'left', toolbar: '#table-content-list2', "disabled": true }
                //{ field: 'caozuo', title: '操作', fixed: 'right', width: 100, align: 'left', toolbar: '#table-content-list2', "disabled": true }
            ]];
            var DetailColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(DetailColsArr)))//将表头数据进行url编码
            //#endregion
HTML/views/SOSetting/ExportNoticeAddFrom.html
@@ -34,36 +34,16 @@
                        <select name="Type" id="Type" lay-filter="Type" lay-verify="required" lay-search>
                            <!-- <option value=""></option> -->
                            <!-- 23 -->
                            <option value="0">成品出库</option>
                            <option value="1">领料出库</option>
                            <option value="2">抽检出库</option>
                            <option value="4">不合格品出库</option>
                            <option value="6">代储出库</option>
                            <option value="7">其他出库</option>
                            <!-- 24 -->
                            <!-- <option value="0">成品出库</option>
                            <option value="1">领料出库</option>
                            <option value="2">抽检出库</option>
                            <option value="3">物料取样出库</option>
                            <option value="4">不合格品出库</option>
                            <option value="5">中间品出库</option>
                            <option value="6">代储出库</option>
                            <option value="7">其他出库</option>
                            <option value="8">寄存出库</option> -->
                            <!-- 09 -->
                            <!-- <option value="0">标准销售出库</option>
                            <option value="1">非标销售出库</option>
                            <option value="2">标准调拨出库</option>
                            <option value="3">非标调拨出库</option> -->
                            <!-- 08 -->
                            <!-- <option value="0">成品出库</option>
                            <option value="1">原辅料出库</option>
                            <option value="2">不合格品出库</option>
                            <option value="3">取样出库</option> -->
                            <option value="6">代储出库</option> -->
                            <option value="7">其他出库</option>
                        </select>
                    </div>
                </div>
                <div class="layui-inline">
                <!-- <div class="layui-inline">
                    <label class="layui-form-label" id="CustomerNamep">客户名称</label>
                    <div class="layui-input-inline">
                        <select name="CustomerNo" id="CustomerNo" lay-search>
@@ -78,7 +58,7 @@
                            <option value=""></option>
                        </select>
                    </div>
                </div>
                </div> -->
                <div class="layui-inline">
                    <div style="padding-bottom: 2px;margin-left: 15px;">
                        <button class="layui-btn layui-btn-sm layuiadmin-btn-list" data-type="add">添加明细</button>
@@ -172,27 +152,31 @@
                    limits: pageLimits,
                    cellMinWidth: 60, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                    cols: [
                        [{
                            field: 'SkuNo',
                            title: '物品编码',
                            align: 'center',
                            fixed: 'left',
                            width:140,
                        }, {
                            field: 'SkuName',
                            title: '物品名称',
                            align: 'center',
                            fixed: 'left',
                        }, {
                        [
                        //     {
                        //     field: 'SkuNo',
                        //     title: '物品编码',
                        //     align: 'center',
                        //     fixed: 'left',
                        //     width:140,
                        // }, {
                        //     field: 'SkuName',
                        //     title: '物品名称',
                        //     align: 'center',
                        //     fixed: 'left',
                        // },
                        {
                            field: 'LotNo',
                            title: '批次',
                            align: 'center', 
                            minWidth:140,
                        }, {
                            field: 'Standard',
                            title: '物品规格',
                            align: 'center',
                        }, {
                        },
                        // {
                        //     field: 'Standard',
                        //     title: '物品规格',
                        //     align: 'center',
                        // },
                        {
                            field: 'Qty',
                            title: '库存数量',  
                            align: 'center',
@@ -413,20 +397,20 @@
                            isrun = 0;
                            return;
                        }
                        if (infoOptions.data[i].ExQty > infoOptions.data[i].Qty) {
                            layer.msg("出库数量不能大于库存数量!", {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                            isrun = 0;
                            return;
                        }
                        // if (infoOptions.data[i].ExQty > infoOptions.data[i].Qty) {
                        //     layer.msg("出库数量不能大于库存数量!", {
                        //         icon: 2,
                        //         time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        //     }, function() {});
                        //     isrun = 0;
                        //     return;
                        // }
                        var item = {
                            SkuNo: infoOptions.data[i].SkuNo,
                            //SkuNo: infoOptions.data[i].SkuNo,
                            LotNo: infoOptions.data[i].LotNo,
                            Qty: parseInt(infoOptions.data[i].ExQty),
                            IsBale:infoOptions.data[i].IsBale,
                            IsBelt:infoOptions.data[i].IsBelt,
                            //IsBale:infoOptions.data[i].IsBale,
                            //IsBelt:infoOptions.data[i].IsBelt,
                        };
                        DataList.push(item); //属性
                    }
HTML/views/SOSetting/ExportSelectSkuFrom.html
@@ -99,28 +99,31 @@
                                type: 'radio',
                                width: 50,
                                fixed: 'left'
                            }, {
                                field: 'SkuNo',
                                title: '物品编码',
                                width: 100,
                                align: 'center',
                                fixed: 'left'
                            }, {
                                field: 'SkuName',
                                title: '物品名称',
                                align: 'center',
                                width: 250,
                            }, {
                            },
                            //  {
                            //     field: 'SkuNo',
                            //     title: '物品编码',
                            //     width: 100,
                            //     align: 'center',
                            //     fixed: 'left'
                            // }, {
                            //     field: 'SkuName',
                            //     title: '物品名称',
                            //     align: 'center',
                            //     width: 250,
                            // },
                            {
                                field: 'LotNo',
                                align: 'center',
                                title: '批次',
                                width: 100
                            }, {
                                field: 'Standard',
                                title: '物品规格',
                                align: 'center',
                                minWidth: 100
                            }, {
                                title: '批次'
                            },
                            //  {
                            //     field: 'Standard',
                            //     title: '物品规格',
                            //     align: 'center',
                            //     minWidth: 100
                            // },
                            {
                                field: 'Qty',
                                title: '库存数量',
                                width: 100,
HTML/views/StatisticalReport/BoxInfor.html
@@ -32,7 +32,7 @@
            <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 zongdan" >
                        <!-- <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;">
                                <input type="text" id="SkuNo"  name="SkuNo" placeholder="物料编码" autocomplete="off" class="layui-input">
@@ -43,11 +43,33 @@
                            <div class="layui-input-inline" style="width: 170px; margin-right: 0px;">
                                <input type="text" id="SkuName"  name="SkuName" placeholder="物料名称" autocomplete="off" class="layui-input">
                            </div>
                        </div> -->
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width: 60px;">所属仓库</label>
                            <div class="layui-input-inline">
                                <select name="WareHouseNo" id="WareHouseNo" lay-filter="getWareHouseNo" lay-search>
                                    <option value=""></option>
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width: 60px;">所属区域</label>
                            <div class="layui-input-inline">
                                <select name="AreaNo" id="AreaNo" lay-filter="getAreaNo" lay-search>
                                    <option value=""></option>
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline zongdan" >
                            <label class="layui-form-label" style="width: 60px;">托盘号</label>
                            <label class="layui-form-label" style="width: 60px;">储位地址</label>
                            <div class="layui-input-inline" style="width: 170px; margin-right: 0px;">
                                <input type="text" id="PalletNo"  name="PalletNo" placeholder="托盘号" autocomplete="off" class="layui-input">
                                <input type="text" id="LocatNo"  name="LocatNo" placeholder="储位地址" autocomplete="off" class="layui-input">
                            </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;">
                                <input type="text" id="PalletNo"  name="PalletNo" placeholder="桶号" autocomplete="off" class="layui-input">
                            </div>
                        </div>
                        <!-- <div class="layui-inline mingxi">
@@ -124,19 +146,19 @@
                                </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;">
                                <select name="InspectStatus" id="InspectStatus" lay-filter="InspectStatus"
                                    lay-search>
                                    <option value=""></option>
                                    <option value="0">待质检</option><!-- 待检验 -->
                                    <option value="1">检验合格</option><!-- 合格品 -->
                                    <option value="2">不合格</option><!-- 不合格 -->
                                    <option value="3">放置期</option><!-- 不合格 -->
                                    <option value="0">待质检</option>
                                    <option value="1">检验合格</option>
                                    <option value="2">不合格</option>
                                    <option value="3">放置期</option>
                                </select>
                            </div>
                        </div>
                        </div> -->
                        <!-- <div class="layui-inline zhijian">
                            <label class="layui-form-label" style="width: 60px;">开始时间</label>
@@ -157,10 +179,10 @@
                            <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
                            <!-- <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>
                            </button>  -->
                        </div>
                    </div>
                </div>
@@ -191,6 +213,55 @@
                            <p>是</p>
                        {{# } }}
                    </script>
                    <script type="text/html" id="InspectPalletStatus">
                        {{# function GetBtn11(d){
                            var html = ``;
                            if(d.PalletStatus=='0'){
                                html = `净桶`;
                            } else if(d.PalletStatus=='1') {
                                html = `预混`;
                            } else if(d.PalletStatus=='2') {
                                html = `半成品`;
                            }else if(d.PalletStatus=='3') {
                                html = `脏桶`;
                            }
                            return html;
                        }
                    }}
                    {{ GetBtn11(d) }}
                    </script>
                    <script type="text/html" id="InspectStatus1">
                        {{#  if(d.InspectStatus == '0') { }}
                            <p>待检验</p>
                        {{#  } else if(d.InspectStatus == '1'){ }}
                            <p>检验合格</p>
                        {{#  } else if(d.InspectStatus == '2'){ }}
                            <p>不合格</p>
                        {{#  } else if(d.InspectStatus == '4') { }}
                            <p>放置期</p>
                        {{#  } }}
                    </script>
                    <script type="text/html" id="TempletStatus">
                        {{#  if(d.Status=='0'){ }}
                            <button class="layui-btn layui-btn-radius layui-btn-danger layui-btn-xs">待分配</button>
                        {{#  } else if(d.Status == '1') { }}
                            <button class="layui-btn layui-btn-radius layui-btn-xs">部分分配</button>
                        {{#  } else if(d.Status == '2') { }}
                            <button class="layui-btn layui-btn-radius layui-btn-xs">已分配</button>
                        {{#  } else if(d.Status == '3') { }}
                            <button class="layui-btn layui-btn-radius layui-btn-xs">盘点锁定</button>
                        {{#  } else if(d.Status == '4') { }}
                            <button class="layui-btn layui-btn-radius layui-btn-xs">移库锁定</button>
                        {{#  } else if(d.Status == '5') { }}
                            <button class="layui-btn layui-btn-radius layui-btn-xs layui-btn-danger">异常锁定</button>
                        {{#  } }}
                    </script>
                    <script type="text/html" id="toolbarDemo">
                        <!-- <button class="layui-btn layuiadmin-btn-list layui-btn-sm  addClass" lay-event="add">
                            <i class="layui-icon">&#xe654;</i>添加
                        </button> -->
                    </script>
                </div>
            </div>
        </div>
@@ -320,10 +391,11 @@
                var TotalColsArr = [[
                    {field: '',title: '序号',type:'numbers',align: 'center',fixed: 'left', "disabled": true},
                    {field: 'WareHouseName', title: '所属仓库', align: 'center'},
                    {field: 'RoadwayName', title: '所属巷道', align: 'center'},
                    //{field: 'RoadwayName', title: '所属巷道', align: 'center'},
                    {field: 'AreaName', title: '所属区域', align: 'center'},
                    {field: 'LocatNo', title: '储位地址', align: 'center'},
                    {field: 'PalletNo', title: '托盘号', align: 'center'},
                    {field: 'PalletNo', title: '桶号', align: 'center'},
                    {field: 'PalletStatus', title: '桶状态', align: 'center', templet: '#InspectPalletStatus'},
                    {field: 'SkuNo', title: '物料编码', align: 'center'},
                    {field: 'SkuName', title: '物料名称', align: 'center'},
                    //{field: 'OwnerNo',title: '货主编码',align: 'center'},
@@ -333,16 +405,19 @@
                    {field: 'LotNo', title: '批次号', align: 'center'},
                    {field: 'LotText', title: '批次描述', align: 'center'},
                    //{field: 'SupplierLot', title: '供货批次', align: 'center'},
                    {field: 'Status', title: '分配状态', align: 'center', templet: '#TempletStatus'},
                    {field: 'Qty', title: '数量', align: 'center'},
                    {field: 'LockQty', title: '锁定数量', align: 'center',},
                    {field: 'FrozenQty', title: '冻结数量', align: 'center'},
                    {field: 'InspectStatus', title: '质检状态', align: 'center', templet: '#InspectStatus1'},
                    {field: 'UDF1', title: '所属设备编码', align: 'center'},
                    //{field: 'InspectMark', title: '抽检标记', align: 'center', templet: '#InspectMarkStatus'},
                    //{field: 'BitPalletMark', title: '零托标记', align: 'center', templet: '#BitPalletMarkStatus'},
                ]];
                var TotalColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码
                //#endregion
                //获取托盘明细
                function refreshTable(SkuNo,SkuName,PalletNo,LotNo,BoxNo,Status,InspectMark,BitPalletMark,BitBoxMark,InspectStatus,OwnerNo,OwnerName,StartTime,EndTime) {
                function refreshTable(WareHouseName,AreaName,LocatNo,PalletNo,LotNo) {
                    //#region 自定义表头
                    var colsJson
                    var param1={
@@ -366,6 +441,8 @@
                            limit: pageCnt,
                            limits: pageLimits,
                            even: true,
                            toolbar: '#toolbarDemo',
                            defaultToolbar: [''], //'print', 'exports'
                            cellMinWidth: 80, //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                            done: function(){
                                //自定义列宽
@@ -375,20 +452,12 @@
                        };
                        var param = {
                            SkuNo:SkuNo, //物料号
                            SkuName:SkuName, //物料名称
                            wareHouseName:WareHouseName,
                            areaName:AreaName,
                            locatNo:LocatNo,
                            palletNo:PalletNo, //托盘号
                            LotNo:LotNo, //批次号
                            BoxNo:BoxNo, //箱码
                            Status:Status, //箱支状态
                            InspectMark:InspectMark, //检验标记
                            BitPalletMark:BitPalletMark, //零托标记
                            BitBoxMark:BitBoxMark, //零箱标记
                            InspectStatus:InspectStatus, //质量状态
                            OwnerNo:OwnerNo, //货主编码
                            OwnerName:OwnerName, //货主名称
                            StartTime:StartTime, //开始时间
                            EndTime:EndTime, //结束时间
                        };
                        sendData(IP + "/Statistical/GetBindList", param, 'get', function(res) { 
                            console.log(res)                       
@@ -411,29 +480,120 @@
                        });
                    });
                    //#endregion                    
                }
                }
                //头工具栏事件
                table.on('toolbar(LAY-app-content-list)', function (obj) {
                    var checkStatus = table.checkStatus(obj.config.id);
                    if (obj.event == "add") {
                        layer.open({
                            type: 2,
                            title: '添加托盘库存明细',
                            content: 'PalletAddFrom.html',
                            maxmin: true,
                            area: ['530px', '530px'],
                            btn: ['确定', '取消'],
                            yes: function(index, layero) {
                                var iframeWindow = window['layui-layer-iframe' + index],
                                    submitID = 'layuiadmin-app-form-submit',
                                    submit = layero.find('iframe').contents().find('#' + submitID);
                                //监听提交
                                iframeWindow.layui.form.on('submit(' + submitID + ')', function(data) {
                                    var field = data.field; //获取提交的字段
                                    //提交 Ajax 成功后,静态更新表格中的数据
                                    var param = {
                                        PalletNo:field.PalletNo,//托盘码
                                        WareHouseNo: field.WareHouseNo, //所属仓库
                                        AreaNo: field.AreaNo, //所属区域
                                        LocatNo:field.LocatNo,//所属储位
                                        PalletStatus: field.PalletStatus, //托盘类别
                                        SkuNo:field.SkuNo,
                                        SkuName:field.SkuName,
                                        LotNo:field.LotNo
                                    };
                                    if(doing){
                                        doing = false;
                                        sendData(IP + "/Statistical/InsertStockDetail", param, 'post',function(res) {
                                            console.log(res);
                                            if (res.code == 0) { //成功
                                                layer.msg(res.msg, {
                                                    icon: 1,
                                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                                }, function() {
                                                    layer.close(index); //关闭弹层
                                                    refreshTable("","","","","","","","","","","","","","");
                                                    doing = true;
                                                });
                                            }
                                            else
                                            { //不成功
                                                layer.msg(res.msg, {
                                                    icon: 2,
                                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                                }, function() {doing = true;});
                                            }
                                        });
                                    }
                                });
                                submit.trigger('click');
                            }
                        });
                    }
                });
                //获取仓库下拉框信息
                sendData(IP + "/Sys/GetWarehouseDic", {}, 'get', function(res) {
                    if (res.code == 0) { //成功
                    for (var i = 0; i < res.data.length; i++) {
                        $("#WareHouseNo").append('<option value =' + res.data[i].WareHouseNo + '>' + res.data[i].WareHouseNo + '-' +
                            res.data[i].WareHouseName + '</option>');
                    }
                    form.render('select');
                    } else { //不成功
                        layer.msg(res.msg, {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function() {});
                    }
                });
                getAR("");
                form.on('select(getWareHouseNo)', function(data) {
                    getAR(data.value);
                });
                function getAR(val) {
                    //获取 区域下拉框
                    sendData(IP + "/Sys/GetStorageAreaByHouseNo?wareHouseNo="+val, {}, 'get', function(res) {
                        $("#AreaNo").empty();
                        $("#AreaNo").append('<option value =""></option>');
                        if (res.code == 0) { //成功
                            for (var i = 0; i < res.data.length; i++) {
                                $("#AreaNo").append('<option value =' + res.data[i].AreaNo + '>' + res.data[i].AreaNo + '-' +
                                    res.data[i].AreaName + '</option>');
                            }
                            form.render('select');
                        } else { //不成功
                            layer.msg('获取区域信息失败', {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {
                                //回调
                                form.render('select');
                            });
                        }
                    });
                };
                //监听搜索
                form.on('submit(LAY-app-contlist-search)', function(data) {
                    var SkuNo = $("#SkuNo").val();
                    var SkuName = $("#SkuName").val();
                    var LotNo = $("#LotNo").val();
                    var WareHouseName = $("#WareHouseNo").val();
                    var AreaName = $("#AreaNo").val();
                    var LocatNo = $("#LocatNo").val();
                    var PalletNo = $("#PalletNo").val();
                    var LotNo = $("#LotNo").val();
                    var BoxNo = $("#BoxNo").val();
                    var Status = $("#Status").val();
                    var InspectMark = $("#InspectMark").val();
                    var BitPalletMark = $("#BitPalletMark").val();
                    var BitBoxMark = $("#BitBoxMark").val();
                    var InspectStatus = $("#InspectStatus").val();
                    var OwnerNo = $("#OwnerNo").val();
                    var OwnerName = $("#OwnerName").val();
                    var StartTime = $("#StartTime").val();
                    var EndTime = $("#EndTime").val();
                    refreshTable(SkuNo,SkuName,PalletNo,LotNo,BoxNo,Status,InspectMark,BitPalletMark,BitBoxMark,InspectStatus,OwnerNo,OwnerName,StartTime,EndTime);
                    refreshTable(WareHouseName,AreaName,LocatNo,PalletNo,LotNo);
                    
                });
HTML/views/StatisticalReport/PalletAddFrom.html
New file
@@ -0,0 +1,175 @@
<!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>
        <div class="layui-form" lay-filter="layuiadmin-app-form-list" id="layuiadmin-app-form-list" style="padding: 20px 30px 0 0;">
            <div class="layui-form-item">
                <label class="layui-form-label">托盘号</label>
                <div class="layui-input-block">
                    <input type="text" name="PalletNo" lay-verify="required"  placeholder="请输入托盘号" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">所属仓库</label>
                <div class="layui-input-block">
                    <select name="WareHouseNo" id="WareHouseNo" lay-verify="required" lay-search lay-filter="SelectWareHouseNo">
                        <option value=""></option>
                    </select>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">所属区域</label>
                <div class="layui-input-block">
                    <select name="AreaNo" id="AreaNo" lay-verify="required" lay-search lay-filter="SelectAreaNo">
                        <option value=""></option>
                    </select>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">所属储位</label>
                <div class="layui-input-block">
                    <select name="LocatNo" id="LocatNo" lay-verify="required" lay-search >
                        <option value=""></option>
                    </select>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">托盘状态</label>
                <div class="layui-input-block">
                    <select name="PalletStatus" id="PalletStatus" lay-verify="required" 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-form-item">
                <label class="layui-form-label">物料编码</label>
                <div class="layui-input-block">
                    <input type="text" name="SkuNo" lay-verify=""  placeholder="请输入物料编码" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">物料名称</label>
                <div class="layui-input-block">
                    <input type="text" name="SkuName" lay-verify=""  placeholder="请输入物料名称" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">批次号</label>
                <div class="layui-input-block">
                    <input type="text" name="LotNo" lay-verify=""  placeholder="请输入批次号" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item layui-hide">
                <input type="button" lay-submit lay-filter="layuiadmin-app-form-submit" id="layuiadmin-app-form-submit" value="确认添加">
                <input type="button" lay-submit lay-filter="layuiadmin-app-form-edit" id="layuiadmin-app-form-edit" value="确认编辑">
            </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>
                layui.config({
                    base: '../../layuiadmin/' //静态资源所在路径
                }).extend({
                    index: 'lib/index' //主入口模块
                }).use(['index', 'form', 'layer'], function() {
                    var $ = layui.$,
                        form = layui.form,
                        layer = layui.layer;
                //获取仓库
                sendData(IP + "/Sys/GetWarehouseDic", {}, 'get', function(res) {
                    if (res.code == 0) { //成功
                        // $("#RoadwayNo").empty();
                        for (var i = 0; i < res.data.length; i++) {
                            $("#WareHouseNo").append('<option value =' + res.data[i].WareHouseNo + '>' + res.data[i].WareHouseNo + '-' +
                            res.data[i].WareHouseName + '</option>');
                        }
                        // $("select[name='WareHouseNo']").val(val);
                        form.render('select');
                    } else { //不成功
                        layer.msg(res.msg, {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function() {});
                    }
                });
                //获取所属区域
                form.on('select(SelectWareHouseNo)', function (data) {
                    var WareHouseNo=$("#WareHouseNo").val();
                    if(WareHouseNo==''){
                        return;
                    }
                    sendData(IP + "/Sys/GetStorageAreaByHouseNo?wareHouseNo="+WareHouseNo, {}, 'get', function(res) {
                        if (res.code == 0) { //成功
                            $("#AreaNo").empty();//清空上一个查询下拉值
                            for (var i = 0; i < res.data.length; i++) {
                                $("#AreaNo").append('<option value =' + res.data[i].AreaNo + '>' +
                                    res.data[i].AreaName + '</option>');
                            }
                            form.render('select');
                            getLocatList();
                        } else { //不成功
                            layer.msg(res.msg, {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                        }
                    });
                });
                //获取储位
                form.on('select(SelectAreaNo)', function (data) {
                    getLocatList();
                });
                function getLocatList(){
                    var AreaNo=$("#AreaNo").val();
                    if(AreaNo==''){
                        return;
                    }
                    sendData(IP + "/Sys/GetStorageLocatList", {AreaNo:AreaNo}, 'post', function(res) {
                        if (res.code == 0) { //成功
                            $("#LocatNo").empty();//清空上一个查询下拉值
                            for (var i = 0; i < res.data.length; i++) {
                                $("#LocatNo").append('<option value =' + res.data[i].LocatNo + '>' +
                                    res.data[i].LocatNo + '</option>');
                            }
                            form.render('select');
                        } else { //不成功
                            layer.msg(res.msg, {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                        }
                    });
                }
                //获取浏览器参数
                function getQueryString(name) {
                    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
                    var r = window.location.search.substr(1).match(reg);
                    if (r != null) return unescape(r[2]);
                    return null;
                }
                })
            </script>
    </body>
</html>
HTML/views/WareHouseSetting/Area.html
@@ -43,10 +43,11 @@
                            <div class="layui-input-inline" >
                                <select name="Type" id="Type" lay-filter="Type" lay-search>
                                    <option value=""></option>
                                    <option value="1">成品区</option>
                                    <option value="2">原料区</option>
                                    <option value="3">包材区</option>
                                    <option value="4">空托区</option>
                                    <option value="0">净桶区</option>
                                    <option value="1">预混区</option>
                                    <option value="2">半成品区</option>
                                    <option value="3">脏桶区</option>
                                    <option value="4">设备区</option>
                                </select>
                            </div>
                        </div>
@@ -197,7 +198,7 @@
                            },{
                                field: 'WareHouseName',
                                title: '所属仓库',
                                width: 120,
                                width: 160,
                                align: 'center',
                                templet: function(d) {
@@ -213,6 +214,11 @@
                            }, {
                                field: 'AreaName',
                                title: '区域名称', 
                                align: 'center'
                            }, {
                                field: 'DeviceCode',
                                title: '设备编码',
                                align: 'center'
                                
                            }, {
@@ -309,8 +315,9 @@
                                        console.log(field)
                                        //提交 Ajax 成功后,静态更新表格中的数据
                                        var param = {
                                            // AreaNo: field.AreaNo, //区域编码
                                            AreaNo: field.AreaNo, //区域编码
                                            AreaName: field.AreaName, //区域名称
                                            DeviceCode:field.DeviceCode,//设备编码
                                            WareHouseNo: field.WareHouseNo, //所属仓库
                                            Status: field.Status, //是否启用 0
                                            Priority: parseInt(field.Priority), //优先级
@@ -408,7 +415,7 @@
                                title: '区域管理信息',
                                content: 'AreaFrom.html?id=' +  cusId,
                                maxmin: true,
                                area: ['445px', '340px'],
                                area: ['445px', '380px'],
                                btn: ['确定', '取消'],
                                yes: function(index, layero){
                                  var iframeWindow = window['layui-layer-iframe'+ index]
@@ -425,6 +432,7 @@
                                        Priority: parseInt(field.Priority),
                                        Type:field.Type,
                                        Temperature:field.Temperature,  
                                        DeviceCode:field.DeviceCode
                                    };
                                    sendData(IP + "/Sys/EditStorageArea", param, 'post', function(res) {
                                        console.log(res);
HTML/views/WareHouseSetting/AreaAddFrom.html
@@ -10,16 +10,22 @@
    </head>
    <body>
        <div class="layui-form" lay-filter="layuiadmin-app-form-list" id="layuiadmin-app-form-list" style="padding: 20px 30px 0 0;">
            <!-- <div class="layui-form-item">
            <div class="layui-form-item">
                <label class="layui-form-label">区域编码</label>
                <div class="layui-input-block">
                    <input type="text" name="AreaNo" lay-verify="required"  placeholder="请输入区域编码" autocomplete="off" class="layui-input">
                </div>
            </div> -->
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">区域名称</label>
                <div class="layui-input-block">
                    <input type="text" name="AreaName" lay-verify="required"  placeholder="请输入区域名称" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">设备编码</label>
                <div class="layui-input-block">
                    <input type="text" name="DeviceCode"  placeholder="请输入设备编码" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
@@ -57,10 +63,11 @@
                <div class="layui-input-block">
                    <select name="Type" id="Type" lay-verify="required" lay-search lay-filter="SelectType">
                        <option value=""></option>
                        <option value="1">成品区</option>
                        <option value="2">原料区</option>
                        <option value="3">包材区</option>
                        <option value="4">空托区</option>
                        <option value="0">净桶区</option>
                        <option value="1">预混区</option>
                        <option value="2">半成品区</option>
                        <option value="3">脏桶区</option>
                        <option value="4">设备区</option>
                    </select>
                </div>
            </div>
HTML/views/WareHouseSetting/AreaFrom.html
@@ -33,10 +33,11 @@
                <div class="layui-input-block">
                    <select name="Type" id="Type" lay-verify="required" lay-search>
                        <option value=""></option>
                        <option value="1">成品区</option>
                        <option value="2">原料区</option>
                        <option value="3">包材区</option>
                        <option value="4">空托区</option>
                        <option value="0">净桶区</option>
                        <option value="1">预混区</option>
                        <option value="2">半成品区</option>
                        <option value="3">脏桶区</option>
                        <option value="4">设备区</option>
                    </select>
                </div>
            </div>
@@ -46,6 +47,12 @@
                    <select name="Temperature" id="Temperature" lay-search>
                        <option value=""></option>
                    </select>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">设备编码</label>
                <div class="layui-input-block">
                    <input type="text" name="DeviceCode"  placeholder="请输入设备编码" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item layui-hide">
@@ -83,6 +90,7 @@
                                $("input[name='AreaName']").val(res.data.AreaName);
                                $("select[name='Priority']").val(res.data.Priority);
                                $("select[name='Type']").val(res.data.Type);
                                $("input[name='DeviceCode']").val(res.data.DeviceCode);
                                     
                                GetTemp(res.data.Temperature);
                                form.render();
HTML/views/WareHouseSetting/Locate.html
@@ -344,7 +344,7 @@
                            field: 'AreaName',
                            title: '所属区域',
                            align: 'center',
                            width: 130,
                            width: 180,
                            templet: function(d) {
                                return d.AreaNo + '-' + d.AreaName;
@@ -353,6 +353,7 @@
                            field: 'LocatNo',
                            title: '储位编码',
                            align: 'center',
                            width: 160,
                        }, {
                            field: 'StatusName',
                            title: '储位状态',
@@ -362,28 +363,42 @@
                            field: 'FlagName',
                            title: '储位标识',
                            align: 'center',
                            width: 90,
                            width: 110,
                        }, {
                            field: 'Row',
                            title: '排',
                            title: '组',
                            align: 'center',
                            width: 70,
                            width: 90,
                        }, {
                            field: 'Column',
                            title: '列',
                            title: '位置',
                            align: 'center',
                            width: 70,
                        }, {
                            field: 'Layer',
                            title: '层',
                            align: 'center',
                            width: 70,
                        }, {
                            field: 'Depth',
                            title: '深度',
                            align: 'center',
                            width: 70,
                            width: 90,
                        }, 
                        {
                            field: 'AisleOne',
                            title: '通道口1',
                            align: 'center',
                            width: 160,
                        },
                        {
                            field: 'AisleTwo',
                            title: '通道口2',
                            align: 'center',
                            width: 160,
                        },
                        // {
                        //     field: 'Layer',
                        //     title: '层',
                        //     align: 'center',
                        //     width: 70,
                        // },
                        // {
                        //     field: 'Depth',
                        //     title: '深度',
                        //     align: 'center',
                        //     width: 70,
                        // },
                        // {
                        //     field: 'Height',
                        //     title: '高度',
@@ -403,7 +418,6 @@
                        {
                            title: '操作',
                            fixed: 'right',
                            width: 120,
                            align: 'center',
                            toolbar: '#table-content-list'
                        }
HTML/views/WareHouseSetting/LocateFrom.html
@@ -65,7 +65,7 @@
            <div class="layui-form-item">
                <label class="layui-form-label">所属区域</label>
                <div class="layui-input-inline">
                    <select name="AreaNo" id="AreaNo" lay-filter="getAreaNo" lay-search>
                    <select name="AreaNo" id="AreaNo" lay-filter="getAreaNo" lay-search disabled="">
                        <option value=""></option>
                    </select>
                </div>
HTML/views/WareHouseSetting/Pallets.html
@@ -29,7 +29,7 @@
                <div class="layui-form layui-card-header layuiadmin-card-header-auto" style="border-bottom:1px solid #CCC" id="top">
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width: 70px;">托盘条码:</label>
                            <label class="layui-form-label" style="width: 70px;">桶条码:</label>
                            <div class="layui-input-inline">
                                <input type="text" id="PalletNo" name="PalletNo" placeholder="托盘条码" autocomplete="off" class="layui-input">
                            </div>
@@ -145,11 +145,11 @@
                            fixed: 'left'
                        }, {
                            field: 'PalletNo',
                            title: '托盘条码',
                            title: '桶号',
                            align: 'center',
                        }, {
                            field: 'Status',
                            title: '条码状态',
                            title: '桶状态',
                            align: 'center',
                            templet:function(d){
                                switch (d.Status) {
@@ -179,13 +179,15 @@
                            templet:function(d){
                                return formatDate(d.LastUse);
                            }
                        }, {
                            title: '操作',
                            fixed: 'right',
                            width: 220,
                            align: 'center',
                            toolbar: '#table-content-list'
                        }]
                        }
                        // , {
                        //     title: '操作',
                        //     fixed: 'right',
                        //     width: 220,
                        //     align: 'center',
                        //     toolbar: '#table-content-list'
                        // }
                    ]
                    ],
                });
                //监听搜索
@@ -220,15 +222,13 @@
                        }, function() {});
                    }
                });
                
                var    active = {
                    add: function() {
                        layer.open({
                            type: 2,
                            title: '打印托盘条码',
                            title: '添加桶号',
                            content: 'PalletsPrintFrom.html',
                            maxmin: true,
                            area: ['600px', '300px'],
@@ -242,31 +242,30 @@
                                    var field = data.field; //获取提交的字段
                                    console.log(field);
                                    if (isTrue = true) {
                                        isTrue = false;
                                        var html = "";
                                        var xun = 0;
                                        document.getElementById('print').innerHTML="";
                                        for(var i=0;i<field.GroupCount;i++){
                                            for(var j=0;j<field.SameCount;j++){
                                                html ="<div class=\"layui-form\" lay-filter=\"layuiadmin-app-form-list\" id=\"print\" style=\"width: 50%; text-align: center;padding-top: 10%;margin-left: 0%;\">\n"+
                                                "<div class=\"layui-form-item\">\n"+
                                                "<div class=\"layui-inline\">\n"+
                                                "<div class=\"\">\n"+
                                                "<img  id=\"imgBar\" width=\"245px\" height=\"120px\"/></div>\n"+
                                                "</div>\n"+
                                                "</div>\n"+
                                                "</div>\n"+
                                                "<div style=\"page-break-after: always;\"></div>\n"+
                                                "</div>" ;
                                                document.getElementById('print').innerHTML+=html;
                                                document.getElementById('imgBar').id="imgBar"+xun;
                                                xun+=1
                                        isTrue = false;
                                        var param = {
                                            PalletNo:field.StockCode,
                                            LocatNo:field.LocatNo,
                                            DeviceCode:field.DeviceCode
                                        };
                                        synData(IP + "/Sys/AddPallets", param, 'post', function(res) {
                                            console.log(res);
                                            if (res.code == 0) { //成功
                                                layer.msg("添加成功", {
                                                    icon: 1,
                                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                                }, function() {
                                                    layer.close(index);
                                                });
                                            } else{
                                                layer.msg(res.msg, {
                                                    icon: 2,
                                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                                }, function() {});
                                            }
                                        }
                                        GetimgBar(field.StockCode,field.GroupCount,field.SameCount);
                                        layer.close(index);
                                        });
                                    }    
                                });  
                                submit.trigger('click');
@@ -282,162 +281,30 @@
                    var type = $(this).data('type');
                    active[type] ? active[type].call(this) : '';
                });
                //获取添加条形码
                function GetimgBar(StockCode,GroupCount,SameCount){
                    var param = {
                        PalletNo:StockCode,
                        GroupCount: parseInt(GroupCount),
                        SameCount:parseInt(SameCount),
                    };
                    console.log(param);
                    synData(IP + "/Sys/GetImgBar", param, 'post', function(res) {
                        console.log(res);
                        if (res.code == 0) { //成功
                            for(var i=0;i<res.data.length;i++){
                                $("#"+"imgBar"+i).attr("src", res.data[i]);
                            }
                            AddPallets(StockCode,GroupCount);
                        } else { //不成功
                            layer.msg(res.msg, {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                        }
                    });
                };
                //添加条形码
                function AddPallets(StockCode,GroupCount){
                function AddPallets(StockCode,LocatNo){
                    //提交 Ajax 成功后,静态更新表格中的数据
                    var param = {
                        GroupCount:parseInt(GroupCount),
                        PalletNo:StockCode,
                        LocatNo:LocatNo
                    };
                    synData(IP + "/Sys/AddPallets", param, 'post', function(res) {
                        console.log(res);
                        if (res.code == 0) { //成功
                            $("#print").print();
                        } else if(res.code == 1){
                            layer.msg(res.msg, {
                            layer.msg("添加成功", {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                        } else { //不成功
                            layer.msg(res.statusText, {
                        } else{
                            layer.msg(res.msg, {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                        }
                    });
                };
                //获取补打条形码
                function GetimgBar1(StockCode,GroupCount,SameCount){
                    var param = {
                        PalletNo:StockCode,
                        GroupCount:parseInt(GroupCount),
                        SameCount:parseInt(SameCount),
                    };
                    synData(IP + "/Sys/GetImgBarReprint", param, 'post', function(res) {
                        console.log(res);
                        if (res.code == 0) { //成功
                            var ok=false;
                            for(var i=0;i<res.data.length;i++){
                                $("#"+"imgBar"+i).attr("src", res.data[i]);
                                if(i==(res.data.length-1)){
                                    ok=true;
                                }
                            }
                            if(ok){
                                $("#print").print();
                            }
                        } else { //不成功
                            layer.msg(res.msg, {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function() {});
                        }
                    })
                };
                table.on('tool(LAY-app-content-list)', function(obj) {
                    var data = obj.data;
                    if (obj.event === 'edit') {
                        layer.open({
                            type: 2,
                            title: '托盘时间线',
                            content: 'PalletsTimeLine.html?PalletNo=' +  data.PalletNo,
                            maxmin: true,
                            area: ['700px', '650px'],
                            btn: ['确定', '取消'],
                            yes: function(index, layero){
                                layer.close(index); //关闭弹层
                            }
                        });
                    }
                    if (obj.event === 'print') {
                        PalletNo = data.PalletNo;
                        layer.open({
                            type: 2,
                            title: '打印托盘条码',
                            content: 'PalletsPrintFrom.html?PalletNo='+PalletNo,
                            maxmin: true,
                            area: ['600px', '300px'],
                            btn: ['确定', '取消'],
                            yes: function(index, layero){
                                var iframeWindow = window['layui-layer-iframe'+ index]
                                ,submitID = 'layuiadmin-app-form-submit'
                                ,submit = layero.find('iframe').contents().find('#'+ submitID);
                                //监听提交
                                iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
                                    var field = data.field; //获取提交的字段
                                    console.log(field);
                                    var html = "";
                                    var xun = 0;
                                    var isOk = false;
                                    document.getElementById('print').innerHTML="";
                                    for(var i=0;i<parseInt(field.GroupCount);i++){
                                        for(var j=0;j<parseInt(field.SameCount);j++){
                                            html ="<div class=\"layui-form\" lay-filter=\"layuiadmin-app-form-list\" id=\"print\" style=\"width: 50%; text-align: center;padding-top: 10%;margin-left: 0%;\">\n"+
                                                "<div class=\"layui-form-item\">\n"+
                                                "<div class=\"layui-inline\">\n"+
                                                "<div class=\"\">\n"+
                                                "<img  id=\"imgBar\" width=\"245px\" height=\"120px\" /></div>\n"+
                                                "</div>\n"+
                                                "</div>\n"+
                                                "</div>\n"+
                                                "<div style=\"page-break-after: always;\"></div>\n"+
                                                "</div>" ;
                                                document.getElementById('print').innerHTML+=html;
                                                document.getElementById('imgBar').id="imgBar"+xun;
                                                xun+=1
                                        }
                                        if(i==(parseInt(field.GroupCount)-1)){
                                            isOk= true;
                                        }
                                    }
                                    if(isOk){
                                        GetimgBar1(field.StockCode,field.GroupCount,field.SameCount);
                                    }
                                });
                              submit.trigger('click');
                            },
                            end:function(){
                                location.reload();
                                return false;
                            }
                        });
                    }
                });
                };
                
            });
        </script>
HTML/views/WareHouseSetting/PalletsPrintFrom.html
@@ -12,27 +12,22 @@
        <div class="layui-form" lay-filter="layuiadmin-app-form-list" id="layuiadmin-app-form-list" style="padding: 20px 30px 0 0;">
            <div class="layui-form-item">
                <label class="layui-form-label" style="width: 70px;">托盘条码:</label>
                <label class="layui-form-label">桶号</label>
                <div class="layui-input-block">
                    <input type="text" name="StockCode" placeholder="请输入托盘条码" lay-verify="required" autocomplete="off" disabled="disabled" class="layui-input">
                    <input type="text" name="StockCode" placeholder="请输入桶号" lay-verify="required" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">储位地址</label>
                <div class="layui-input-block">
                    <input type="text" name="LocatNo" placeholder="请输入储位地址" lay-verify="required" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label" style="width: 70px;">每组个数:</label>
                <label class="layui-form-label">所属接料设备</label>
                <div class="layui-input-block">
                    <input type="number" name="SameCount" placeholder="请输入每组个数" lay-verify="required" autocomplete="off" class="layui-input">
                    <input type="text" name="DeviceCode" placeholder="请输入所属接料设备" lay-verify="" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label" style="width: 70px;">打印组数:</label>
                <div class="layui-input-block">
                    <input type="number" name="GroupCount" placeholder="请输入打印组数" lay-verify="required" autocomplete="off" class="layui-input">
                </div>
                <!-- <div class="layui-input-inline" >
                    <input type="checkbox" name="ImportGoodsStatus" id="ImportGoodsStatus" lay-skin="switch" lay-text="启用打印机|禁用打印机"  >
                    <input type="checkbox" name="ImportGoodsStatus" id="ImportGoodsStatus" lay-skin="switch" lay-text="连续打印|非连续打印"  >
                </div> -->
            </div>
            <div class="layui-form-item layui-hide">
                <input type="button" lay-submit lay-filter="layuiadmin-app-form-submit" id="layuiadmin-app-form-submit" value="确认添加">
@@ -54,21 +49,7 @@
                    form = layui.form,
                    layer = layui.layer;
                    
                var PalletNo = getQueryString('PalletNo');
                console.log(PalletNo);
                sendData(IP + "/Sys/GetPalletsNo", {PalletNo:PalletNo}, 'post', function(res) {
                    console.log(res);
                    if (res.code == 0) { //成功
                        //页面赋值
                        $("input[name='StockCode']").val(res.data);
                        $("input[name='StockCode']").attr('disabled', 'true');
                    } else { //不成功
                        layer.msg(res.msg, {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function() {});
                    }
                });
                    
                //获取浏览器参数
                function getQueryString(name) {
HTML/views/index.html
@@ -2,7 +2,7 @@
<html>
    <head>
        <meta charset="utf-8">
        <title>仓储管理系统</title>
        <title>AGV转运系统</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">
@@ -66,7 +66,7 @@
                <div class="layui-side layui-side-menu" id="leftmenu">
                    <div class="layui-side-scroll">
                        <div class="layui-logo" lay-href="home/console.html" style="background-color: #FFFFFF;">
                            <span>博柯莱·仓储管理系统</span>
                            <span>博柯莱·AGV转运系统</span>
                        </div>
                        <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" lay-filter="layadmin-system-side-menu">
                            
HTML/web.config
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="Login.html" />
            </files>
        </defaultDocument>
        <security>
            <requestFiltering>
                <requestLimits maxQueryString="2097151"/>
            </requestFiltering>
        </security>
        <httpRedirect enabled="true" destination="/views" childOnly="true" />
    </system.webServer>
</configuration>
Wms/Model/InterFaceModel/AsnModels.cs
@@ -29,6 +29,11 @@
        public string Origin { get; set; }
        /// <summary>
        /// 创建人
        /// </summary>
        public string CreateUser { get; set; }
        /// <summary>
        /// 单据明细
        /// </summary>
        public List<AsnDetail> AsnDetails { get; set; }
Wms/Model/InterFaceModel/HttpModel.cs
@@ -324,4 +324,534 @@
        public string RequestUser { get; set; }
    }
    #endregion
    #region AGV接口实体类
    /// <summary>
    /// 生成任务单
    /// </summary>
    public class AgvSchedulingTask
    {
        /// <summary>
        /// 请求编号,每个请求都要一个唯一编号同一个请求重复提交 使用同一编号
        /// 是否必填:是
        /// </summary>
        public string reqCode { get; set; }
        /// <summary>
        /// 请求时间
        /// 格式: “yyyy-MM-ddHH: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 端配置的主任务类型编号一致。
        /// 内置任务类型:
        /// 厂内货架搬运: 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>
        /// 容器数量
        /// 是否必填:否
        /// </summary>
        public string ctnrNum { 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 List<PositionCodePath> 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>
        /// 物料类型
        /// 是否必填:否
        /// </summary>
        public string materialType { 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>
        /// 设备类型
        /// 是否必填:否
        /// </summary>
        public string agvType { get; set; }
        /// <summary>
        /// 区域
        /// 是否必填:否
        /// </summary>
        public string positionSelStrategy { get; set; }
        /// <summary>
        /// 自定义字段.JSON 格式
        /// 是否必填:否
        /// </summary>
        public string data { get; set; }
        /// <summary>
        /// 目标储位地址(23项目)
        /// </summary>
        public string userCallCode { get; set; }
    }
    public class PositionCodePath
    {
        public string positionCode { get; set; }
        public string type { 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 reqTime { get; set; }
        /// <summary>
        /// 地码 X 坐标(mm):任务完成时有值
        /// 是否必填:否
        /// </summary>
        public double cooX { get; set; }
        /// <summary>
        /// 地码 Y 坐标(mm):任务完成时有值
        /// 是否必填:否
        /// </summary>
        public double 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 podCode { 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; }
    }
    /// <summary>
    /// AGV申请空托盘垛入库
    /// </summary>
    public class AGVNullPalletRuKu
    {
        public string PalletNo { get; set; }
        public decimal Qty { get; set; }
        public string PutInLocation { get; set; }
    }
    /// <summary>
    /// agv请求接口应答
    /// </summary>
    public class AgvResultModel
    {
        public string code { get; set; }
        public string message { get; set; }
        public string data { get; set; }
        public string reqCode { get; set; }
    }
    #endregion
}
Wms/Model/InterFaceModel/RCSModel.cs
@@ -7,96 +7,6 @@
    public class RCSModel
    {
        /// <summary>
        /// 生成RCS任务单 任务下发接口信息
        /// </summary>
        public class genAgvSchedulingTaskReq
        {
            /// <summary>
            /// 请求编号,每个请求都要一个唯一编号,同一个请求重复提交,使用同一编号
            /// 必填
            /// </summary>
            public string reqCode { get; set; }
            /// <summary>
            /// 请求时间 yyyy-MM-dd HH:mm:ss CMS系统生成
            /// </summary>
            public string reqTime { get; set; }
            /// <summary>
            /// 客户端编号
            /// </summary>
            public string clientCode { get; set; }
            /// <summary>
            /// 令牌号
            /// </summary>
            public string tokenCode { get; set; }
            /// <summary>
            /// 任务类型,根据配置的任务模板号填写
            /// 必填
            /// </summary>
            public string taskTyp { get; set; }
            public string scenetTyp { get; set; }
            /// <summary>
            /// 容器类型
            /// </summary>
            public string ctnrTyp { get; set; }
            /// <summary>
            /// 容器编号
            /// </summary>
            public string ctnrCode { get; set; }
            /// <summary>
            /// 工作位
            /// </summary>
            public string wbCode { get; set; }
            /// <summary>
            /// 位置路径 途经点--起点和终点
            /// 必须
            /// </summary>
            public List<PositionCodePath> positionCodePath { get; set; }
            /// <summary>
            /// 货架编号
            /// </summary>
            public string podCode { get; set; }
            /// <summary>
            /// 货架方向
            /// </summary>
            public string podDir { get; set; }
            /// <summary>
            /// 货架类型
            /// </summary>
            public string podTyp { get; set; }
            /// <summary>
            /// 物料批次或货架上的物料唯一编码
            /// </summary>
            public string materialLot { get; set; }
            /// <summary>
            /// 优先级
            /// </summary>
            public string priorit { get; set; }
            /// <summary>
            /// 任务单号
            /// </summary>
            public string taskCode { get; set; }
            /// <summary>
            /// AGV编号
            /// </summary>
            public string agvCode { get; set; }
            /// <summary>
            /// 自定义字段
            /// </summary>
            public List<data> data { get; set; }
        }
        public class PositionCodePath
        {
            public string positionCode { get; set; }
            public string type { get; set; }
        }
        public class data
        {
            public string materialLot { get; set; }
            public string materialCode { get; set; }
        }
        /// <summary>
        /// RCS任务返回
        /// </summary>
        public class genAgvSchedulingTaskRep
@@ -114,5 +24,59 @@
            public string data { get; set; }
        }
        public class Pallnetmsg
        {
            /// <summary>
            /// 设备编码
            /// </summary>
            public string Location { get; set; }
            /// <summary>
            /// 任务类型  0:叫净桶  1:叫料桶(混料) 2:叫料桶(下料) 3:叫脏桶
            /// </summary>
            public string Type { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
            public string LotNo { get; set; }
            public string PalletNo { get; set; }
        }
        public class AgvTask
        {
            public string taskCode { get; set; }
            public string taskType { get; set; }
            public string startPos { get; set; }
            public string endPos { get; set; }
            public string agvCode { get; set; }
        }
        public class ReMes
        {
            public string Success { get; set; }
            public string Result { get; set; }
            public string Message { get; set; }
        }
        public class TaskDetial
        {
            public string Taskno { get; set; }
            public string Startport { get; set; }
            public string Endport { get; set; }
            public string Pallno { get; set; }
            /// <summary>
            /// 任务类型
            /// 0:申请储位
            /// 1:叫桶
            /// 2:同车间平层搬运
            /// </summary>
            public string Crtype { get; set; }
            /// <summary>
            /// 车间编码
            /// </summary>
            public string WareHouseNo { get; set; }
        }
    }
}
Wms/Model/InterFaceModel/TaskModel.cs
New file
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Model.InterFaceModel
{
    public class TaskModel
    {
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { get; set; }
        /// <summary>
        /// 状态
        /// </summary>
        public string Status { get; set; }
    }
}
Wms/Model/ModelDto/DataDto/StockDetailDto.cs
@@ -136,6 +136,12 @@
        public string Status { get; set; }
        /// <summary>
        /// 托盘状态
        /// Default:0:净桶 1:预混 2:半成品 3:脏桶
        /// </summary>
        public string PalletStatus { get; set; }
        /// <summary>
        /// 检验标记
        /// </summary>           
        public string InspectMark { get; set; }
@@ -209,5 +215,10 @@
        /// 储位深度
        /// </summary>
        public int Dept { get; set; }
        /// <summary>
        /// 所属设备编码
        /// </summary>
        public string UDF1 { get; set; }
    }
}
Wms/Model/ModelDto/LogDto/TaskDto.cs
@@ -98,6 +98,11 @@
        public string Type { get; set; }
        /// <summary>
        /// Desc:批次号
        /// </summary>
        public string LotNo { get; set; }
        /// <summary>
        /// Desc:取消时间
        /// Default:
        /// Nullable:True
Wms/Model/ModelDto/SysDto/AreaDto.cs
@@ -52,6 +52,10 @@
        /// </summary> 
        public string TempName { get; set; }
        /// <summary>
        /// 设备编码
        /// </summary>
        public string DeviceCode { get; set; }
        /// <summary>
        /// 创建日期
        /// </summary>
        public DateTime CreateTime { get; set; }
Wms/Model/ModelDto/SysDto/LocatDto.cs
@@ -130,6 +130,17 @@
        /// Nullable:True
        /// </summary>           
        public string TempName { get; set; }
        /// <summary>
        /// 通道口1
        /// </summary>
        public string AisleOne { get; set; }
        /// <summary>
        /// 通道口2
        /// </summary>
        public string AisleTwo { get; set; }
        /// <summary>
        /// 创建日期
        /// </summary>
Wms/Model/ModelVm/SysVm/AreaVm.cs
@@ -35,7 +35,11 @@
        /// 存储环境
        /// </summary>
        public string Temperature { get; set; }
        /// <summary>
        /// 设备编码
        /// </summary>
        public string DeviceCode { get; set; }
    }
    /// <summary>
    /// 修改区域状态model
Wms/Model/ModelVm/SysVm/LocateVm.cs
@@ -17,7 +17,8 @@
        public int Row { get; set; }
        public int Col { get; set; }
        public int Layer { get; set; }
        public string Depth { get; set; }
        public int Depth { get; set; }
        public int AisleNum { get; set; }
    }
    /// <summary>
    /// 修改储位集合model
Wms/Model/ModelVm/SysVm/PalletVm.cs
@@ -26,7 +26,18 @@
        /// 组数
        /// </summary>
        public int GroupCount { get; set; }
        /// <summary>
        /// 桶号
        /// </summary>
        public string PalletNo { get; set; }
        /// <summary>
        /// 储位地址
        /// </summary>
        public string LocatNo { get; set; }
        /// <summary>
        /// 设备编码
        /// </summary>
        public string DeviceCode { get; set; }
    }
    
}
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -277,7 +277,7 @@
            string sqlString = string.Empty;
            string sqlDetailStr = string.Empty;
            //0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料入库 5:其它入库 6:代储入库 7:寄存入库
            var TypeLot = "1, 5, 6, 7"; //批次可为空单据类型
            var TypeLot = "1, 6, 7"; //批次可为空单据类型
            try
            {
@@ -325,7 +325,7 @@
                        }
                        //判断是否为采购入库单据或车间余料退回入库
                        // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库
                        if (model.Type == "1" || model.Type == "5" || model.Type == "6" || model.Type == "7")
                        if (model.Type == "6" || model.Type == "7")//model.Type == "1" ||
                        {
                            if (!string.IsNullOrWhiteSpace(detailModel.LotNo))
                            {
@@ -357,7 +357,7 @@
                                detailModel.LotNo = maxLotNo;
                            }
                        }
                        if (model.Type == "0" || model.Type == "2" || model.Type == "3" || model.Type == "4")
                        if (model.Type == "0" || model.Type == "2" || model.Type == "3" || model.Type == "4" || model.Type == "5")
                        {
                            if (string.IsNullOrWhiteSpace(detailModel.LotNo))
                            {
Wms/WMS.BLL/BllQualityServer/QualityInspectServer.cs
@@ -95,98 +95,38 @@
            {
                throw new Exception("质检号不可为空,请核查!");
            }
            //验证物料号是否为空
            if (string.IsNullOrEmpty(model.SkuNo))
            {
                throw new Exception("物料号不可为空,请核查!");
            }
            //获取物料信息
            var sku = Db.Queryable<SysMaterials>().First(a => a.IsDel == "0" && a.SkuNo == model.SkuNo);
            if (sku == null)
            {
                throw new Exception("物料信息为空,请核查!");
            }
            //验证批次号是否为空
            if (string.IsNullOrEmpty(model.LotNo))
            {
                throw new Exception("批次号不可为空,请核查!");
            }
            //int isTui = 0;
            //验证入库单号是否为空
            if (!string.IsNullOrEmpty(model.ASNNo))
            {
                //查询是否为退货入库单据
                var Arrival = Db.Queryable<BllArrivalNotice>().First(a => a.IsDel == "0" && a.ASNNo == model.ASNNo && a.Type == "3");
                if (Arrival == null)
                {
                    throw new Exception("只有入库单据为退货入库单可输入 入库单号,请核查!");
                }
                //获取入库单明细
                var ArrivalDetail = Db.Queryable<BllArrivalNoticeDetail>().First(a => a.IsDel == "0" && a.ASNNo == model.ASNNo && a.LotNo.Contains(model.LotNo) && a.SkuNo == model.SkuNo);
                if (ArrivalDetail == null)
                {
                    throw new Exception("输入的批次或物料信息与入库单据不符,请核查!");
                }
                //isTui = 1;
            }
            //查找质检信息中是否存在同批次质检录入记录
            //BllQualityInspect quality = Db.Queryable<BllQualityInspect>().First(m => m.IsDel == "0" && m.SkuNo == model.SkuNo && m.LotNo == model.LotNo);
            //if (quality != null)
            //{
                ////判断是否为退货入库单
                //if (isTui == 1)
                //{
                //    if (quality.ASNNo == model.ASNNo)
                //    {
                //        throw new Exception("当前退货入库单已创建质检信息,请勿重复创建!");
                //    }
                //}
            //    throw new Exception("当前物料和批次已进行质检,请核查!");
            //}
            ////查找同批次 同单据 入库单信息、
            //BllArrivalNoticeDetail arrivalDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.ASNNo == model.ASNNo && m.LotNo == model.LotNo);
            model.Origin = "WMS"; //来源
            model.CreateTime = Db.GetDate(); //创建日期
            model.SkuNo = sku.SkuNo; //物料号
            model.SkuName = sku.SkuName; //物料名称
            model.SkuNo = ""; //物料号
            model.SkuName = ""; //物料名称
            model.PassQty = 0; //合格数量
            model.FailQty = 0; //不合格数量
            model.Standard = sku.Standard; //规格
            //model.SupplierLot = arrivalDetail.SupplierLot; //供货批次
            model.Standard = ""; //规格
            //查找库存明细信息
            List<DataStockDetail> detail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.SkuNo == model.SkuNo && m.LotNo == model.LotNo).ToList();
            List<DataStockDetail> detail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.LotNo == model.LotNo).ToList();
            foreach (var item in detail)
            {
                List<BllBoxInfo> box = Db.Queryable<BllBoxInfo>().Where(a => a.IsDel == "0" && a.SkuNo == model.SkuNo && a.LotNo == model.LotNo).ToList();
                //判断合格状态是否合格
                if (model.IsQualified == "1")
                {
                    //合格 相同批次库存信息全部改为合格状态 且合格数量增加为同批次同单号该物料全部数量之和
                    //合格
                    model.PassQty += item.Qty;
                    //修改库存明细合格状态
                    item.InspectStatus = "1"; //1合格
                    //foreach (var b1 in box)
                    //{
                    //    b1.InspectMark = "1"; //1合格
                    //}
                }
                else //不合格
                {
                    //不合格 相同批次、入库单库存信息全部改为不合格物料 且不合格数量增加为同批次同单号该物料全部数量之和
                    //不合格
                    model.FailQty += item.Qty;
                    item.InspectStatus = "2"; //2不合格
                    //foreach (var b1 in box)
                    //{
                    //    b1.InspectMark = "2"; //2不合格
                    //}
                }
                Db.Updateable(box).ExecuteCommand();
                Db.Updateable(item).ExecuteCommand();
            }
            var isquality = Db.Insertable(model).ExecuteCommand();
@@ -194,6 +134,23 @@
            return isquality;
        }
        /// <summary>
        /// 获取库存批次号集合
        /// </summary>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<DataStockDetail> GetLotNoList()
        {
            try
            {
                var _list = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && !string.IsNullOrEmpty(w.LotNo)).ToList();
                return _list;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
    }
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -959,10 +959,11 @@
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                    //.And(it => it.WareHouseNo == wareHouseNo)
                    .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus))
                    .And(m => skuStrList.Contains(m.SkuNo))
                    //.And(m => skuStrList.Contains(m.SkuNo))
                    .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主
                    .AndIF(!string.IsNullOrWhiteSpace(msg), it => (it.SkuNo.Contains(msg) || it.SkuName.Contains(msg) || it.LotNo.Contains(msg)))
                    .And(it => (it.Qty - it.LockQty - it.FrozenQty) > 0)
                    //.And(it => (it.Qty - it.LockQty - it.FrozenQty) > 0)
                    .And(it=>!string.IsNullOrEmpty(it.LotNo))
                    .And(it => (it.Status == "0" || it.Status == "1"))
                    .ToExpression();//注意 这一句 不能少
                //库存明细
@@ -983,42 +984,42 @@
                }).ToList();
                //库存总表
                var stock = stockRst.GetAllAsync().Select(it => new ExStockInfoDto
                {
                    SkuNo = it.SkuNo,
                    SkuName = it.SkuName,
                    LotNo = it.LotNo,
                    Standard = it.Standard,
                    //Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty,
                    Qty = it.Qty - it.LockQty - it.FrozenQty,
                //var stock = stockRst.GetAllAsync().Select(it => new ExStockInfoDto
                //{
                //    SkuNo = it.SkuNo,
                //    SkuName = it.SkuName,
                //    LotNo = it.LotNo,
                //    Standard = it.Standard,
                //    //Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty,
                //    Qty = it.Qty - it.LockQty - it.FrozenQty,
                }).ToList();
                //}).ToList();
                foreach (var l in stockDetail.ToArray())
                {
                    var fq = stock.Where(s => s.SkuNo == l.SkuNo);
                    if (!string.IsNullOrWhiteSpace(l.LotNo))
                    {
                        fq = fq.Where(s => s.LotNo == l.LotNo);
                    }
                    else
                    {
                        fq = fq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                    }
                    var f = fq.FirstOrDefault();
                    if (f == null)
                    {
                        throw new Exception("库存信息错误,请核实");
                    }
                    if (f.Qty != null && f.Qty.Value < l.Qty)
                    {
                        l.Qty = f.Qty.Value;
                    }
                    if (l.Qty <= 0)
                    {
                        stockDetail.Remove(l);
                    }
                }
                //foreach (var l in stockDetail.ToArray())
                //{
                //    var fq = stock.Where(s => s.SkuNo == l.SkuNo);
                //    if (!string.IsNullOrWhiteSpace(l.LotNo))
                //    {
                //        fq = fq.Where(s => s.LotNo == l.LotNo);
                //    }
                //    else
                //    {
                //        fq = fq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                //    }
                //    var f = fq.FirstOrDefault();
                //    if (f == null)
                //    {
                //        throw new Exception("库存信息错误,请核实");
                //    }
                //    if (f.Qty != null && f.Qty.Value < l.Qty)
                //    {
                //        l.Qty = f.Qty.Value;
                //    }
                //    if (l.Qty <= 0)
                //    {
                //        stockDetail.Remove(l);
                //    }
                //}
                return stockDetail;
@@ -1037,14 +1038,7 @@
                if (model == null || model.Detail.Count == 0)
                {
                    throw new Exception("参数异常");
                }
                var skuNos = model.Detail.Select(a => a.SkuNo).Distinct().ToList();
                //根据物料号获取物料信息、库存明细中获取批次描述供货批次等
                var skuList = Db.Queryable<SysMaterials>().Where(a => skuNos.Contains(a.SkuNo) && a.IsDel == "0").ToList();
                var stockList = Db.Queryable<DataStock>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                //var palletList = contextDb.Queryable<DataStockDetail>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                //客户信息
                var customer = Db.Queryable<SysCustomer>().Where(m => m.IsDel == "0" && m.CustomerNo == model.CustomerNo).ToList();
                }
                var billNo = "";
                var bl = true;
                do
@@ -1055,111 +1049,58 @@
                    bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no);
                } while (bl);
                Db.BeginTran();//开启事务
                try
                {
                    var list = new List<BllExportNoticeDetail>();
                    //添加出库单
                    foreach (var d in model.Detail)
                    foreach (var item in model.Detail)
                    {
                        if (d.Qty < 1)
                        if (item.Qty < 1)
                        {
                            throw new Exception("出库数量必须大于0");
                        }
                        var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo);
                        if (sku == null)
                        if (string.IsNullOrWhiteSpace(item.LotNo))
                        {
                            throw new Exception($"物料信息中未查询到出库物料信息:{d.SkuNo}");
                            throw new Exception("批次不可为空!");
                        }
                        //0:成品出库、1:领料出库、2:抽检出库、4:不合格品出库、6:代储出库、7:其他出库、 ///3:物料取样出库、5:中间品出库、8:寄存出库
                        if (model.Type == "0" || model.Type == "2" || model.Type == "4" || model.Type == "7")
                        var soNoticeDetail = Db.Queryable<BllExportNoticeDetail>().First(w => w.IsDel == "0" && w.LotNo == item.LotNo);
                        if (soNoticeDetail != null)
                        {
                            if (string.IsNullOrWhiteSpace(d.LotNo))
                            var soNotice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNoticeDetail.SONo && (w.Status == "0" || w.Status == "1" || w.Status == "2" || w.Status == "3"));
                            if (soNotice != null)
                            {
                                throw new Exception("批次不可为空!");
                            }
                        }
                        if (model.Type == "1")
                        {
                            if (list.Count(m=>m.SkuNo == d.SkuNo)>=2)
                            {
                                throw new Exception("领料出库单同单据同物料不允许超过3个批次混批出库");
                            }
                        }
                        else
                        {
                            if (list.Count(m => m.SkuNo == d.SkuNo) >= 1)
                            {
                                throw new Exception("出库单同单据同物料不允许超过2个批次混批出库");
                                throw new Exception($"该批次有未完成的出库单,批次号:{soNoticeDetail.LotNo}!");
                            }
                        }
                        //库存
                        List<DataStock> stocks;
                        var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LotNo == item.LotNo);
                        decimal q1 = 0;
                        Dictionary<int, decimal> dic = new Dictionary<int, decimal>();
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
                        {
                            stocks = stockList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList();
                        }
                        else
                        {
                            stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                        }
                        if (stocks.Count < 1)
                        {
                            throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}");
                        }
                        //判断数量
                        var qty = stocks.First().Qty - stocks.First().LockQty - stocks.First().FrozenQty;
                        if (d.Qty > qty)
                        {
                            throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足");
                        }
                        var item = new BllExportNoticeDetail()
                        var noticeDetail = new BllExportNoticeDetail()
                        {
                            SONo = billNo,
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            LotNo = d.LotNo,
                            SkuNo = stockDetail.SkuNo,
                            SkuName = stockDetail.SkuName,
                            Standard = stockDetail.Standard,
                            LotNo = stockDetail.LotNo,
                            LotText = "",
                            Status = "0",
                            Qty = d.Qty,
                            Qty = item.Qty,
                            AllotQty = 0,
                            FactQty = 0,
                            CompleteQty = 0,
                            PackagNo = sku.PackagNo,
                            Price = sku.Price,
                            Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
                            IsBale = d.IsBale,
                            IsBelt = d.IsBelt,
                            SupplierLot = stocks.First().SupplierLot,
                            IsWave = "0",
                            WaveNo = "",
                            //PackagNo = sku.PackagNo,
                            //Price = sku.Price,
                            //Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
                            //IsBale = d.IsBale,
                            //IsBelt = d.IsBelt,
                            //SupplierLot = stocks.First().SupplierLot,
                            //IsWave = "0",
                            //WaveNo = "",
                            CreateUser = userId,
                        };
                        list.Add(item);
                        stocks.First().LockQty += d.Qty;//锁定数量
                        var i = Db.Updateable(stocks.First()).UpdateColumns(it => new { it.LockQty })
                            .ExecuteCommand();
                        //foreach (var s in dic)
                        //{
                        //    var st = stockList.First(m => m.Id == s.Key);
                        //    st.LockQty += s.Value;//锁定数量
                        //    var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty })
                        //        .ExecuteCommand();
                        //}
                        list.Add(noticeDetail);
                    }
                    var notice = new BllExportNotice()
                    {
@@ -1167,8 +1108,8 @@
                        Type = model.Type,
                        Status = "0",
                        Origin = "WMS",
                        CustomerNo = model.CustomerNo,
                        CustomerName = customer.FirstOrDefault() == null ? "" : customer.First().CustomerName,
                        //CustomerNo = model.CustomerNo,
                        //CustomerName = customer.FirstOrDefault() == null ? "" : customer.First().CustomerName,
                        LogisticsId = model.LogisticsId,
                        IsWave = "0",
                        WaveNo = "",
@@ -1674,37 +1615,16 @@
                    throw new Exception("参数异常,请检查状态是否未等待执行或来源是否是WMS");
                }
                //总库存信息
                var stockList = Db.Queryable<DataStock>().ToList();
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == notice.SONo).ToList();
                Db.BeginTran();//开启事务
                try
                {
                    foreach (var d in noticeDetail)
                    foreach (var item in noticeDetail)
                    {
                        //总库存
                        var sq = stockList.Where(s => s.SkuNo == d.SkuNo);
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
                        {
                            sq = sq.Where(s => s.LotNo == d.LotNo);
                        }
                        else
                        {
                            sq = sq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                        }
                        var fd = sq.FirstOrDefault();
                        if (fd == null)
                        {
                            throw new Exception($"未找到物料{d.SkuNo}、批次{d.LotNo} 的库存信息");
                        }
                        fd.LockQty -= d.Qty;
                        d.IsDel = "1";
                        d.UpdateUser = userId;
                        d.UpdateTime = DateTime.Now;
                        Db.Updateable(d).ExecuteCommand();
                        Db.Updateable(fd).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                        item.IsDel = "1";
                    }
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    //删除出库单
                    notice.IsDel = "1";
                    notice.UpdateUser = userId;
@@ -4078,38 +3998,30 @@
                    {
                        throw new Exception("未查询到任务信息");
                    }
                    //获取对应库位信息
                    var startlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                    if (startlocat == null)
                    if (task.OrderType == "0" || task.OrderType == "3")//入库或移库
                    {
                        throw new Exception("未查询到储位信息");
                    }
                    startlocat.Status = "0";//修改分配信息状态
                    //获取储位信息
                    var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                    //获取移库任d务对应目标储位信息
                    SysStorageLocat endlocat = new SysStorageLocat();
                    if (task.Type == "2")
                    {
                        endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.EndLocat);
                        //获取目标库位信息
                        var endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.LocatNo == task.EndLocat);
                        if (endlocat == null)
                        {
                            throw new Exception("未查询到目标储位信息");
                        }
                    }
                    if (locat == null)
                    {
                        Db.RollbackTran();
                        throw new Exception("未查询到储位信息,请核实!");
                    }
                    locat.Status = "1"; //有物品
                    Db.Updateable(locat).ExecuteCommand();
                    if (endlocat != null)
                    {
                        endlocat.Status = "0"; //空储位 0
                        endlocat.Status = "0";//空储位
                        //修改目标储位状态
                        Db.Updateable(endlocat).ExecuteCommand();
                    }
                    if (task.OrderType == "1" || task.OrderType == "3")//出库或移库
                    {
                        //获取起始库位信息
                        var startlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.LocatNo == task.StartLocat);
                        if (startlocat == null)
                        {
                            throw new Exception("未查询到起始储位信息");
                        }
                        startlocat.Status = "1";//有物品
                        //修改起始储位状态
                        Db.Updateable(startlocat).ExecuteCommand();
                    }
                    //修改任务 
                    task.IsSuccess = 1;
                    task.IsSend = 0;
@@ -4118,75 +4030,6 @@
                    task.Status = "4";
                    task.CancelDate = DateTime.Now;
                    Db.Updateable(task).ExecuteCommand();
                    //出库分配信息
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.TaskNo == taskNo).ToList();
                    foreach (var item in allot)
                    {
                        item.Status = "0";//修改分配信息状态
                        item.TaskNo = "";
                        var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo);
                        if (noticeDetail == null)
                        {
                            throw new Exception("未查询到出库单明细信息");
                        }
                        noticeDetail.FactQty -= item.Qty; //修改出库单明细的下架数量
                        Db.Updateable(noticeDetail).ExecuteCommand();
                        if (noticeDetail.FactQty == 0)
                        {
                            var noticeDetail2 = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo && m.Id != noticeDetail.Id).ToList();
                            var num = noticeDetail2.Count(m => m.FactQty > 0);
                            //判断出库单的所有明细是否都为0;如果为0变更出库单状态为已分配
                            if (num == 0)
                            {
                                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == item.SONo);
                                notice.Status = "2";
                                Db.Updateable(notice).ExecuteCommand();
                            }
                        }
                    }
                    //判断是否存在分配信息
                    if (allot == null)
                    {
                        //获取库存明细
                        var stockDetail = Db.Queryable<DataStockDetail>().First(a => a.IsDel == "0" && a.PalletNo == task.PalletNo);
                        //获取库存
                        var datastock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo);
                        //获取储位信息
                        var locate = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == stockDetail.LocatNo);
                        //判断是否为空托盘
                        if (stockDetail.SkuNo == "100099")
                        {
                            //修改库存明细
                            stockDetail.LockQty -= stockDetail.Qty; //锁定数量
                            stockDetail.Status = "0"; //库存状态 0:待分配
                            //修改库存总表
                            datastock.LockQty -= (int)stockDetail.Qty; //锁定数量
                            //修改储位状态
                            locate.Status = "1"; //储位状态 1:有物品
                            Db.Updateable(stockDetail).ExecuteCommand();
                            Db.Updateable(datastock).ExecuteCommand();
                            Db.Updateable(locate).ExecuteCommand();
                        }
                        else
                        {
                            //修改储位状态
                            locate.Status = "1"; //储位状态 1:有物品
                            Db.Updateable(locate).ExecuteCommand();
                        }
                    }
                    else
                    {
                        Db.Updateable(allot).ExecuteCommand();
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "取消", $"点击取消按钮、取消了任务号为:{taskNo}的任务", (int)userId);
Wms/WMS.BLL/BllTransServer/NoticeServer.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
@@ -15,6 +16,7 @@
using WMS.Entity.LogEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IBllTransServer;
using static Model.InterFaceModel.RCSModel;
namespace WMS.BLL.BllTransServer
{
@@ -29,7 +31,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ErpModel CreateAsn(AsnInfo model)
        public ErpModel CreateAsnWork(AsnInfo model)
        {
            try
            {
@@ -55,7 +57,7 @@
                    Origin = string.IsNullOrEmpty(model.Origin) ? "MES" : model.Origin,
                    CustomerNo = model.Customer,
                    CustomerName = "",
                    OrderCode = model.OrderCode,
                    OrderCode = model.OrderCode
                };
                // 入库明细表信息
@@ -127,7 +129,7 @@
        /// <param name="TaskNo"></param>
        /// <param name="Status"></param>
        /// <returns></returns>
        public ErpModel FinishTask(string TaskNo,string Status)
        public ErpModel RCSFinishTask(string TaskNo,string Status)
        {
            try
            {
@@ -163,31 +165,17 @@
                    resultModel.Success = 0;
                    resultModel.Message = "成功";
                    //提交事务
                    Db.CommitTran();
                    return resultModel;
                }
                switch (taskInfo.OrderType)
                {
                    #region 入库完成
                    case "0":
                        //入库单明细信息
                        var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(w => w.Id == taskInfo.NoticeDetailNo);
                        if (noticeDetail == null)
                        {
                            resultModel.Message = "该任务对应的入库单明细不存在!";
                            return resultModel;
                        }
                        //入库单信息
                        var notice = Db.Queryable<BllArrivalNotice>().First(w => w.ASNNo == noticeDetail.ASNNo);
                        if (notice == null)
                        {
                            resultModel.Message = "该任务对应的入库单不存在!";
                            return resultModel;
                        }
                        if (notice.Status == "3" || notice.Status == "4")
                        {
                            resultModel.Message = "该任务对应的入库单已执行完成!";
                            return resultModel;
                        }
                        //目标储位信息
                        var locatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
                        if (locatInfo == null)
@@ -195,51 +183,13 @@
                            resultModel.Message = "目标储位信息不存在!";
                            return resultModel;
                        }
                        //库存明细
                        var sd1 = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo);
                        if (sd1 == null)
                        {
                            sd1 = new DataStockDetail()
                            {
                                LotNo = noticeDetail.LotNo,
                                LotText = noticeDetail.LotText,
                                SupplierLot = noticeDetail.SupplierLot,
                                SkuNo = noticeDetail.SkuNo,
                                SkuName = noticeDetail.SkuName,
                                Standard = noticeDetail.Standard,
                                Qty = 1,
                                LockQty = 0,
                                FrozenQty = 0,
                                InspectQty = 0,
                                ASNNo = noticeDetail.ASNNo,
                                ASNDetailNo = noticeDetail.Id,
                                WareHouseNo = locatInfo.WareHouseNo,//所属仓库
                                RoadwayNo = locatInfo.RoadwayNo,//所属巷道
                                AreaNo = locatInfo.AreaNo,//所属区域
                                LocatNo = locatInfo.LocatNo,//储位地址
                                PalletNo = taskInfo.PalletNo,
                                PalletNo2 = "",
                                PalletNo3 = "",
                                PalletTags = "0",
                                CompleteTime = comTime,
                                ProductionTime = null,
                                ExpirationTime = null,
                                Status = "0",
                                InspectMark = "0",
                                InspectStatus = "0",//待检验
                                BitPalletMark = "0",
                                PackagNo = "",
                                IsBale = "0",
                                IsBelt = "0",
                                PalletStatus = "1",
                                IsDel = "0",
                                CreateUser = 0,
                                CreateTime = comTime
                            };
                            //插入库存明细
                            Db.Insertable(sd1).ExecuteCommand();
                            resultModel.Message = $"该桶对应的库存信息不存在,桶号:{taskInfo.PalletNo}!";
                            return resultModel;
                        }
                        else
                        {
@@ -247,140 +197,154 @@
                            sd1.LockQty = 0;
                            sd1.FrozenQty = 0;
                            sd1.InspectQty = 0;
                            sd1.ASNNo = noticeDetail.ASNNo;
                            sd1.ASNDetailNo = noticeDetail.Id;
                            sd1.WareHouseNo = locatInfo.WareHouseNo;//所属仓库
                            sd1.RoadwayNo = locatInfo.RoadwayNo;//所属巷道
                            sd1.AreaNo = locatInfo.AreaNo;//所属区域
                            sd1.LocatNo = locatInfo.LocatNo;//储位地址
                            sd1.CompleteTime = comTime;
                            sd1.InspectStatus = "0";//待检验
                            sd1.PalletStatus = "1";//预混
                            sd1.PalletStatus = "2";//半成品
                            //修改库存明细
                            Db.Updateable(sd1).ExecuteCommand();
                        }
                        noticeDetail.CompleteQty += 1;//完成数量
                        noticeDetail.Status = "1";//0:等待执行 1:正在执行 2:执行完成
                        if (noticeDetail.CompleteQty >= noticeDetail.Qty)
                        {
                            noticeDetail.Status = "2";
                            noticeDetail.CompleteTime = comTime;
                        }
                        noticeDetail.UpdateUser = 0;
                        noticeDetail.UpdateTime = comTime;
                        //更新入库单明细
                        Db.Updateable(noticeDetail).ExecuteCommand();
                        notice.UpdateUser = 0;
                        notice.UpdateTime = comTime;
                        if (notice.Status == "0")
                        {
                            notice.Status = "1";
                        }
                        var asnDetailNum = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2");
                        if (asnDetailNum == 0)
                        {
                            notice.Status = "2";
                            notice.CompleteTime = comTime;//完成时间
                        }
                        //更新入库单
                        Db.Updateable(notice).ExecuteCommand();
                        locatInfo.Status = "1";//有物品
                        //更新储位状态
                        Db.Updateable(locatInfo).ExecuteCommand();
                        #region 质检请验
                        var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo && m.SupplierLot == noticeDetail.SupplierLot);
                        if (qualityRequest == null)
                        //入库单明细信息
                        var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(w => w.Id == taskInfo.NoticeDetailNo);
                        if (noticeDetail != null)
                        {
                            //质检请验单信息
                            string qcNo = new Common().GetMaxNo("QC");
                            qualityRequest = new BllQualityInspectionRequest();
                            qualityRequest.QcNo = qcNo;
                            qualityRequest.Status = "0";
                            qualityRequest.SkuNo = noticeDetail.SkuNo;
                            qualityRequest.SkuName = noticeDetail.SkuName;
                            qualityRequest.LotNo = noticeDetail.LotNo;
                            qualityRequest.SupplierLot = noticeDetail.SupplierLot;
                            qualityRequest.Qty = noticeDetail.Qty;
                            qualityRequest.SamplingQty = 0;
                            qualityRequest.ASNNo = noticeDetail.ASNNo;
                            qualityRequest.CreateUser = 0;
                            qualityRequest.CreateTime = comTime;
                            // 记录任务日志
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask()
                            //入库单信息
                            var notice = Db.Queryable<BllArrivalNotice>().First(w => w.ASNNo == noticeDetail.ASNNo);
                            if (notice == null)
                            {
                                TaskNo = taskNo,
                                Sender = "WMS",
                                Receiver = "Limes",
                                IsSuccess = 0,//是否下发成功 0失败 1成功
                                StartLocat = "",//起始位置
                                PalletNo = "",//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
                                IsFinish = 1,//是否可完成
                                Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "5",//0 入库单 1 出库单  2 盘点单  3 移库单 4 取样出库单 5 其他
                                EndLocat = "",//目标位置
                                Type = "3",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Msg = "请验任务"
                            };
                            // 插入任务日志
                            Db.Insertable(exTask).ExecuteCommand();
                            // 调用Limes接口发起请验
                            var sendModel = new SendLimesModel()
                            {
                                QcNo = qualityRequest.QcNo,
                                SkuNo = qualityRequest.SkuNo,
                                Qty = qualityRequest.Qty.ToString(),
                                LotNo = qualityRequest.LotNo,
                                SupplierLot = qualityRequest.SupplierLot,
                                RequestUser = "",                       // 请验人
                            };
                            var jsonData = JsonConvert.SerializeObject(sendModel);
                            string response = "";
                            try
                            {
                                var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                                //response = HttpHelper.DoPost(url, jsonData, "上传Limes系统发起请验", "Limes");
                                var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                                ////解析返回数据
                                //var limesModel = JsonConvert.DeserializeObject<LimesModel>(response);
                                List<string> list1 = new List<string>();
                                list1.Add(taskNo);
                                //if (limesModel.Success == 0)
                                //{
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list1, time1, time2);
                                // 更新请验单信息
                                qualityRequest.Status = "1";
                                qualityRequest.SamplingQty = 10;//decimal.Parse(limesModel.SamplingQty);
                                qualityRequest.RequestUser = 0;
                                qualityRequest.RequestTime = DateTime.Now;
                                qualityRequest.UpdateTime = DateTime.Now;
                                qualityRequest.UpdateUser = 0;
                                //添加质检请验单
                                Db.Insertable(qualityRequest).ExecuteCommand();
                                //}
                                //if (limesModel.Success == -1)
                                //{
                                //    new TaskServer().EditTaskIssueNo(list1, time1, time2,limesModel.Message);
                                //    throw new Exception(limesModel.Message);
                                //}
                                resultModel.Message = "该任务对应的入库单不存在!";
                                return resultModel;
                            }
                            catch (Exception ex)
                            if (notice.Status == "3" || notice.Status == "4")
                            {
                                throw new Exception(ex.Message);
                                resultModel.Message = "该任务对应的入库单已执行完成!";
                                return resultModel;
                            }
                            noticeDetail.CompleteQty += 1;//完成数量
                            noticeDetail.Status = "1";//0:等待执行 1:正在执行 2:执行完成
                            if (noticeDetail.CompleteQty >= noticeDetail.Qty)
                            {
                                noticeDetail.Status = "2";
                                noticeDetail.CompleteTime = comTime;
                            }
                            noticeDetail.UpdateUser = 0;
                            noticeDetail.UpdateTime = comTime;
                            //更新入库单明细
                            Db.Updateable(noticeDetail).ExecuteCommand();
                            notice.UpdateUser = 0;
                            notice.UpdateTime = comTime;
                            if (notice.Status == "0")
                            {
                                notice.Status = "1";
                            }
                            var asnDetailNum = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2");
                            if (asnDetailNum == 0)
                            {
                                notice.Status = "2";
                                notice.CompleteTime = comTime;//完成时间
                            }
                            //更新入库单
                            Db.Updateable(notice).ExecuteCommand();
                        }
                        #region 质检请验,去掉MES
                        //var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo && m.SupplierLot == noticeDetail.SupplierLot);
                        //if (qualityRequest == null)
                        //{
                        //    //质检请验单信息
                        //    string qcNo = new Common().GetMaxNo("QC");
                        //    qualityRequest = new BllQualityInspectionRequest();
                        //    qualityRequest.QcNo = qcNo;
                        //    qualityRequest.Status = "0";
                        //    qualityRequest.SkuNo = noticeDetail.SkuNo;
                        //    qualityRequest.SkuName = noticeDetail.SkuName;
                        //    qualityRequest.LotNo = noticeDetail.LotNo;
                        //    qualityRequest.SupplierLot = noticeDetail.SupplierLot;
                        //    qualityRequest.Qty = noticeDetail.Qty;
                        //    qualityRequest.SamplingQty = 0;
                        //    qualityRequest.ASNNo = noticeDetail.ASNNo;
                        //    qualityRequest.CreateUser = 0;
                        //    qualityRequest.CreateTime = comTime;
                        //    // 记录任务日志
                        //    var taskNo = new Common().GetMaxNo("TK");
                        //    var exTask = new LogTask()
                        //    {
                        //        TaskNo = taskNo,
                        //        Sender = "WMS",
                        //        Receiver = "Limes",
                        //        IsSuccess = 0,//是否下发成功 0失败 1成功
                        //        StartLocat = "",//起始位置
                        //        PalletNo = "",//托盘码
                        //        IsSend = 1,//是否可再次下发
                        //        IsCancel = 1,//是否可取消
                        //        IsFinish = 1,//是否可完成
                        //        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        //        OrderType = "5",//0 入库单 1 出库单  2 盘点单  3 移库单 4 取样出库单 5 其他
                        //        EndLocat = "",//目标位置
                        //        Type = "3",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        //        Msg = "请验任务"
                        //    };
                        //    // 插入任务日志
                        //    Db.Insertable(exTask).ExecuteCommand();
                        //    // 调用Limes接口发起请验
                        //    var sendModel = new SendLimesModel()
                        //    {
                        //        QcNo = qualityRequest.QcNo,
                        //        SkuNo = qualityRequest.SkuNo,
                        //        Qty = qualityRequest.Qty.ToString(),
                        //        LotNo = qualityRequest.LotNo,
                        //        SupplierLot = qualityRequest.SupplierLot,
                        //        RequestUser = "",                       // 请验人
                        //    };
                        //    var jsonData = JsonConvert.SerializeObject(sendModel);
                        //    string response = "";
                        //    try
                        //    {
                        //        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //        //response = HttpHelper.DoPost(url, jsonData, "上传Limes系统发起请验", "Limes");
                        //        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //        ////解析返回数据
                        //        //var limesModel = JsonConvert.DeserializeObject<LimesModel>(response);
                        //        List<string> list1 = new List<string>();
                        //        list1.Add(taskNo);
                        //        //if (limesModel.Success == 0)
                        //        //{
                        //        //更改任务的发送返回时间//
                        //        new TaskServer().EditTaskIssueOk(list1, time1, time2);
                        //        // 更新请验单信息
                        //        qualityRequest.Status = "1";
                        //        qualityRequest.SamplingQty = 10;//decimal.Parse(limesModel.SamplingQty);
                        //        qualityRequest.RequestUser = 0;
                        //        qualityRequest.RequestTime = DateTime.Now;
                        //        qualityRequest.UpdateTime = DateTime.Now;
                        //        qualityRequest.UpdateUser = 0;
                        //        //添加质检请验单
                        //        Db.Insertable(qualityRequest).ExecuteCommand();
                        //        //}
                        //        //if (limesModel.Success == -1)
                        //        //{
                        //        //    new TaskServer().EditTaskIssueNo(list1, time1, time2,limesModel.Message);
                        //        //    throw new Exception(limesModel.Message);
                        //        //}
                        //    }
                        //    catch (Exception ex)
                        //    {
                        //        throw new Exception(ex.Message);
                        //    }
                        //}
                        #endregion
                        break;
@@ -388,37 +352,12 @@
                    #region 出库完成
                    case "1":
                        //出库单明细信息
                        var exNoticeDetail = Db.Queryable<BllExportNoticeDetail>().First(w => w.Id == taskInfo.NoticeDetailNo);
                        if (exNoticeDetail == null)
                        {
                            resultModel.Message = "该任务对应的出库单明细不存在!";
                            return resultModel;
                        }
                        //出库单信息
                        var exNotice = Db.Queryable<BllExportNotice>().First(w => w.SONo == exNoticeDetail.SONo);
                        if (exNotice == null)
                        {
                            resultModel.Message = "该任务对应的出库单不存在!";
                            return resultModel;
                        }
                        if (exNotice.Status == "4" || exNotice.Status == "5")
                        {
                            resultModel.Message = "该任务对应的出库单已执行完成!";
                            return resultModel;
                        }
                        //起始储位信息
                        var startLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0");
                        if (startLocatInfo == null)
                        {
                            resultModel.Message = "起始储位信息不存在!";
                            return resultModel;
                        }
                        //目标储位信息
                        var endLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
                        if (endLocatInfo == null)
                        {
                            resultModel.Message = "目标储位信息不存在!";
                            return resultModel;
                        }
                        //库存明细
@@ -428,34 +367,16 @@
                            resultModel.Message = "库存信息不存在!";
                            return resultModel;
                        }
                        //修改出库单明细拣货数量
                        exNoticeDetail.CompleteQty += sd2.Qty;
                        Db.Updateable(exNoticeDetail).ExecuteCommand();
                        exNotice.UpdateUser = 0;
                        exNotice.UpdateTime = comTime;
                        if (exNotice.Status == "0" || exNotice.Status == "1" || exNotice.Status == "2")
                        {
                            exNotice.Status = "3";//更改为正在执行
                        }
                        var num = Db.Queryable<BllExportNoticeDetail>().Count(m => m.IsDel == "0" && m.SONo == exNoticeDetail.SONo && m.CompleteQty < m.Qty);
                        if (num <= 0)
                        {
                            exNotice.Status = "4"; //更改为执行完成
                        }
                        //修改出库单信息
                        Db.Updateable(exNotice).ExecuteCommand();
                        sd2.Qty = 0;
                        sd2.LockQty = 0;
                        sd2.FrozenQty = 0;
                        sd2.InspectQty = 0;
                        sd2.ASNNo = "";
                        sd2.ASNDetailNo = null;
                        sd2.WareHouseNo = endLocatInfo.WareHouseNo;//所属仓库
                        sd2.RoadwayNo = endLocatInfo.RoadwayNo;//所属巷道
                        sd2.AreaNo = endLocatInfo.AreaNo;//所属区域
                        sd2.LocatNo = endLocatInfo.LocatNo;//储位地址
                        sd2.WareHouseNo = "";//所属仓库
                        sd2.RoadwayNo = "";//所属巷道
                        sd2.AreaNo = "";//所属区域
                        sd2.LocatNo = "";//储位地址
                        sd2.CompleteTime = comTime;
                        //修改库存明细
                        Db.Updateable(sd2).ExecuteCommand();
@@ -463,12 +384,168 @@
                        startLocatInfo.Status = "0";//空储位
                        //修改起始储位状态
                        Db.Updateable(startLocatInfo).ExecuteCommand();
                        //出库单明细信息
                        var exNoticeDetail = Db.Queryable<BllExportNoticeDetail>().First(w => w.Id == taskInfo.NoticeDetailNo);
                        if (exNoticeDetail != null)
                        {
                            //出库单信息
                            var exNotice = Db.Queryable<BllExportNotice>().First(w => w.SONo == exNoticeDetail.SONo);
                            if (exNotice == null)
                            {
                                resultModel.Message = "该任务对应的出库单不存在!";
                                return resultModel;
                            }
                            if (exNotice.Status == "4" || exNotice.Status == "5")
                            {
                                resultModel.Message = "该任务对应的出库单已执行完成!";
                                return resultModel;
                            }
                            exNotice.UpdateUser = 0;
                            exNotice.UpdateTime = comTime;
                            if (exNotice.Status == "0" || exNotice.Status == "1" || exNotice.Status == "2")
                            {
                                exNotice.Status = "3";//更改为正在执行
                            }
                            var num = Db.Queryable<BllExportNoticeDetail>().Count(m => m.IsDel == "0" && m.SONo == exNoticeDetail.SONo && m.CompleteQty < m.Qty);
                            if (num <= 0)
                            {
                                exNotice.Status = "4"; //更改为执行完成
                            }
                            //修改出库单信息
                            Db.Updateable(exNotice).ExecuteCommand();
                        endLocatInfo.Status = "1";//空储位
                        //修改目标储位状态
                        Db.Updateable(endLocatInfo).ExecuteCommand();
                            //修改出库单明细拣货数量
                            exNoticeDetail.CompleteQty += sd2.Qty;
                            Db.Updateable(exNoticeDetail).ExecuteCommand();
                        }
                        break;
                    #endregion
                    #region 移库完成
                    case "3":
                        //库存明细
                        var sd3 = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo);
                        if (sd3 == null)
                        {
                            resultModel.Message = "库存信息不存在!";
                            return resultModel;
                        }
                        if (taskInfo.Type == "0")//入库任务
                        {
                            //目标储位信息
                            var endLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
                            if (endLocatInfo2 == null)
                            {
                                resultModel.Message = "目标储位信息不存在!";
                                return resultModel;
                            }
                            endLocatInfo2.Status = "1";//有物品
                            //修改目标储位状态
                            Db.Updateable(endLocatInfo2).ExecuteCommand();
                            sd3.WareHouseNo = endLocatInfo2.WareHouseNo;//所属仓库
                            sd3.RoadwayNo = endLocatInfo2.RoadwayNo;//所属巷道
                            sd3.AreaNo = endLocatInfo2.AreaNo;//所属区域
                            sd3.LocatNo = endLocatInfo2.LocatNo;//储位地址
                            if (endLocatInfo2.AreaNo.Contains("01"))//净桶区
                            {
                                sd3.PalletStatus = "0";
                            }
                            else if (endLocatInfo2.AreaNo.Contains("02"))//预混区
                            {
                                sd3.PalletStatus = "1";
                            }
                            else if (endLocatInfo2.AreaNo.Contains("03"))//半成品区
                            {
                                sd3.PalletStatus = "2";
                            }
                            else if (endLocatInfo2.AreaNo.Contains("04"))//脏桶区
                            {
                                sd3.PalletStatus = "3";
                                sd3.LotNo = "";//批次
                                sd3.SkuNo = "";
                                sd3.SkuName = "";
                                sd3.InspectStatus = "0";//待检验
                            }
                        }
                        else if (taskInfo.Type == "1")//出库任务
                        {
                            //起始储位信息
                            var startLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0");
                            if (startLocatInfo2 == null)
                            {
                                resultModel.Message = "起始储位信息不存在!";
                                return resultModel;
                            }
                            startLocatInfo2.Status = "0";//空储位
                            //修改起始储位状态
                            Db.Updateable(startLocatInfo2).ExecuteCommand();
                            sd3.WareHouseNo = "";//所属仓库
                            sd3.RoadwayNo = "";//所属巷道
                            sd3.AreaNo = "";//所属区域
                            sd3.LocatNo = "";//储位地址
                        }
                        else if (taskInfo.Type == "2")//移库任务
                        {
                            //起始储位信息
                            var startLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0");
                            if (startLocatInfo2 == null)
                            {
                                resultModel.Message = "起始储位信息不存在!";
                                return resultModel;
                            }
                            startLocatInfo2.Status = "0";//空储位
                            //修改起始储位状态
                            Db.Updateable(startLocatInfo2).ExecuteCommand();
                            //目标储位信息
                            var endLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
                            if (endLocatInfo2 == null)
                            {
                                resultModel.Message = "目标储位信息不存在!";
                                return resultModel;
                            }
                            endLocatInfo2.Status = "1";//有物品
                            //修改目标储位状态
                            Db.Updateable(endLocatInfo2).ExecuteCommand();
                            sd3.WareHouseNo = endLocatInfo2.WareHouseNo;//所属仓库
                            sd3.RoadwayNo = endLocatInfo2.RoadwayNo;//所属巷道
                            sd3.AreaNo = endLocatInfo2.AreaNo;//所属区域
                            sd3.LocatNo = endLocatInfo2.LocatNo;//储位地址
                            sd3.Status = "0";
                            if (endLocatInfo2.AreaNo.Contains("01"))//洁净区
                            {
                                sd3.PalletStatus = "0";
                                sd3.Status = "0";
                            }
                            else if (endLocatInfo2.AreaNo.Contains("02"))//预混区
                            {
                                sd3.PalletStatus = "1";
                            }
                            else if (endLocatInfo2.AreaNo.Contains("03"))//半成品区
                            {
                                sd3.PalletStatus = "2";
                            }
                            else if (endLocatInfo2.AreaNo.Contains("04"))//脏桶区
                            {
                                sd3.PalletStatus = "3";
                                sd3.LotNo = "";//批次
                                sd3.SkuNo = "";
                                sd3.SkuName = "";
                                sd3.InspectStatus = "0";//待检验
                            }
                        }
                        //修改库存明细
                        Db.Updateable(sd3).ExecuteCommand();
                        #region 去掉MES
                        //回传桶状态给MES
                        //BackPalletStatus(taskInfo.PalletNo, sd3.PalletStatus);
                        #endregion
                        break;
                    #endregion
                }
                taskInfo.Status = "2";//执行完成
@@ -491,11 +568,36 @@
        }
        /// <summary>
        /// 回传桶状态给MES
        /// </summary>
        /// <param name="PalletNo">桶号</param>
        /// <param name="Status">0:净桶 1:预混 2:半成品 3:脏桶</param>
        /// <param name="url"></param>
        public void BackPalletStatus(string PalletNo, string Status,string url="")
        {
            try
            {
                var obj = new
                {
                    PalletNo = PalletNo,
                    Status = Status
                };
                string jsonReq = JsonConvert.SerializeObject(obj);
                var response = HttpHelper.DoPost(url, jsonReq, "回传MES桶状态", "MES").ToString();
                var result = JsonConvert.DeserializeObject<ReMes>(response);//解析返回数据
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 下发出库单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public SoResInfo ErpAddExportNotice(SoInfo model)
        public SoResInfo CreateSoWork(SoInfo model)
        {
            try
            {
Wms/WMS.BLL/BllTransServer/RcsServer.cs
@@ -1,257 +1,851 @@
using Microsoft.IdentityModel.Protocols;
using Model.InterFaceModel;
using Model.ModelDto;
using Model.ModelDto.DataDto;
using Model.ModelDto.LogDto;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
using WMS.Entity.BllSoEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.LogEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IBllTransServer;
using static Model.InterFaceModel.RCSModel;
using static System.Collections.Specialized.BitVector32;
namespace WMS.BLL.BllTransServer
{
    public class RcsServer
    public class RcsServer:IRcsServer
    {
        private readonly object RcsLock = new object();
        private static readonly SqlSugarScope Db = DataContext.Db;
        /// <summary>
        /// RCS叫桶(净桶和脏桶)
        ///  RCS叫桶
        /// </summary>
        /// <param name="warehouseno">库区</param>
        /// <param name="type">叫料类型</param>
        /// <returns></returns>
        public void GetPalletNo(string warehouseno, string type, out string palletno, out string locatno)
        /// <param name="model"></param>
        /// <param name="url"></param>
        /// <param name="taskNo"></param>
        /// <exception cref="Exception"></exception>
        public void GetPalletNo(Pallnetmsg model, string url, out string taskNo)
        {
            var sql = "select LocatNo,palletno from SysStorageLocat where status = '1'";
            SysStorageLocat pallet = new SysStorageLocat();
            try
            lock (RcsLock)
            {
                switch (type)
                try
                {
                    case "0"://叫净桶
                        sql += $"and WareHouseNo = 'A01' and WareHouseNo = '{warehouseno}' order by updatetime desc";
                        pallet = Db.Ado.SqlQuery<SysStorageLocat>(sql).FirstOrDefault();
                        if (pallet == null)
                        {
                            throw new Exception("暂无净桶可分配");
                        }
                        break;
                    case "3"://叫脏桶
                        sql += $"and WareHouseNo = 'A04' and WareHouseNo = '{warehouseno}' order by updatetime desc";
                        pallet = Db.Ado.SqlQuery<SysStorageLocat>(sql).FirstOrDefault();
                        if (pallet == null)
                        {
                            throw new Exception("暂无脏桶可分配");
                        }
                        break;
                    string taskMsg = "";
                    if (string.IsNullOrEmpty(model.Location))
                    {
                        throw new Exception("设备编码不可为空");
                    }
                    //通过设备号查找到所属设备(区域)
                    var deviceInfo = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.DeviceCode.Contains(model.Location));
                    if (deviceInfo == null)
                    {
                        throw new Exception("设备信息不存在");
                    }
                    var houseNo = deviceInfo.WareHouseNo;//叫桶设备所属车间编号
                    //叫桶设备所在储位信息(目标储位)
                    var endLoction = new SysStorageLocat();
                    var urlMes = "";//回传MES的接口地址
                    var noticeNo = "0";//出入库单据明细ID
                    //所有待分配的桶
                    var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.Status == "0");
                    //分配桶信息
                    var pallet = new DataStockDetail();
                    //开始事务
                    Db.BeginTran();
                    //判断叫料设备是否是A区的混料设备03,该设备是接料混料一体机,AGV叫桶应该叫净桶接料
                    if (houseNo == "M03" && model.Location == "125" && model.Type == "1")
                    {
                        model.Type = "0";
                    }
                    string agvMsg = string.Empty;
                    switch (model.Type)
                    {
                        case "0"://接料设备叫净桶
                            {
                                //叫桶目标储位地址信息
                                endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);
                                if (endLoction == null)
                                {
                                    throw new Exception("叫桶设备目标储位信息不存在");
                                }
                                //查找到该车间净桶区
                                List<string> areaNoList = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "0" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
                                //查找净桶
                                if (houseNo == "M03")//大单体车间净桶是绑定接料设备的
                                {
                                    pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "0" && w.Status == "0"
                                && areaNoList.Contains(w.AreaNo) && w.UDF1 == deviceInfo.DeviceCode).OrderBy(o => o.UpdateTime).First();
                                }
                                else
                                {
                                    pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "0" && w.Status == "0"
                                && areaNoList.Contains(w.AreaNo)).OrderBy(o => o.UpdateTime).First();
                                }
                                if (pallet == null)
                                {
                                    throw new Exception("暂无净桶可分配");
                                }
                                //分配桶后判断该桶外侧储位是否需要移库
                                bool yikuResult = YikuTask(pallet.PalletNo, url);
                                if (!yikuResult)
                                {
                                    throw new Exception("移库失败");
                                }
                                pallet.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
                                                    //更新桶库存明细
                                Db.Updateable(pallet).ExecuteCommand();
                                taskMsg = "设备叫净桶任务";
                            }
                            break;
                        case "1"://混料设备叫料桶(混料)
                            {
                                //叫桶目标储位地址信息
                                endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);
                                if (endLoction == null)
                                {
                                    throw new Exception("叫桶设备目标储位信息不存在");
                                }
                                //判断是否有批次号
                                if (string.IsNullOrWhiteSpace(model.LotNo))
                                {
                                    throw new Exception("批次号为空!");
                                }
                                //查找到该车间预混区
                                List<string> areaNoList2 = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "1" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
                                //查找库存中是否有可用的此批次的混料桶
                                pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "1" && w.Status == "0" && w.LotNo == model.LotNo
                                && areaNoList2.Contains(w.AreaNo)).OrderBy(o => o.UpdateTime).First();
                                if (pallet == null)
                                {
                                    throw new Exception("暂无混料桶可分配");
                                }
                                //分配桶后判断该桶外侧储位是否需要移库
                                bool yikuResult = YikuTask(pallet.PalletNo, url);
                                if (!yikuResult)
                                {
                                    throw new Exception("移库失败");
                                }
                                pallet.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
                                                    //更新桶库存明细
                                Db.Updateable(pallet).ExecuteCommand();
                                taskMsg = "设备叫料桶混料任务";
                            }
                            break;
                        case "2"://下料设备叫料桶(下料)
                            {
                                if (houseNo == "M04")//除了喷干车间下料口都是2个储位(投料储位、投完料储位)
                                {
                                    //叫桶目标储位地址信息
                                    endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);
                                }
                                else
                                {
                                    //叫桶目标储位地址信息
                                    endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);// Column=1 投料储位,Column=2 投完料储位
                                }
                                if (endLoction == null)
                                {
                                    throw new Exception("叫桶设备目标储位信息不存在");
                                }
                                //判断是否有批次号
                                if (string.IsNullOrWhiteSpace(model.LotNo))
                                {
                                    throw new Exception("批次号为空!");
                                }
                                //查找是否有此批次出库单明细
                                /*var soNoticeDetail = Db.Queryable<BllExportNoticeDetail>().Where(w => w.IsDel == "0" && w.LotNo == model.LotNo).OrderBy(o => o.CreateTime).First();
                                if (soNoticeDetail == null)
                                {
                                    throw new Exception("该批次没有对应的出库单明细");
                                }
                                noticeNo = soNoticeDetail.Id.ToString();
                                //出库总单
                                var soNotice = Db.Queryable<BllExportNotice>().Where(w => w.IsDel == "0" && w.SONo == soNoticeDetail.SONo).First();
                                if (soNotice == null)
                                {
                                    throw new Exception("该批次没有对应的出库单");
                                }
                                soNotice.Status = "3";//正在执行
                                soNotice.UpdateTime = DateTime.Now;
                                //更新出库单
                                Db.Updateable(soNotice).ExecuteCommand();*/
                                //查找到该车间半成品区
                                List<string> areaNoList3 = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "2" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
                                //查找库存中是否有此批次的合格下料桶
                                pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "2" && w.Status == "0" && w.LotNo == model.LotNo && w.InspectStatus == "1"
                                && areaNoList3.Contains(w.AreaNo)).OrderBy(o => o.UpdateTime).First();
                                if (pallet == null)
                                {
                                    throw new Exception("暂无下料桶可分配");
                                }
                                //分配桶后判断该桶外侧储位是否需要移库
                                bool yikuResult = YikuTask(pallet.PalletNo, url);
                                if (!yikuResult)
                                {
                                    throw new Exception("移库失败");
                                }
                                pallet.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
                                                    //更新桶库存明细
                                Db.Updateable(pallet).ExecuteCommand();
                                taskMsg = "设备叫料桶下料任务";
                            }
                            break;
                        case "3"://清洗设备叫脏桶
                            {
                                //叫桶目标储位地址信息
                                endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);// Column=1 清洗储位,Column=2 清洗完料储位
                                if (endLoction == null)
                                {
                                    throw new Exception("叫桶设备目标储位信息不存在");
                                }
                                //查找到该车间脏桶区
                                List<string> areaNoList4 = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "3" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
                                List<DataStockDetail> palletList = new List<DataStockDetail>();
                                if (houseNo == "M01")
                                {
                                    palletList = Db.Queryable<DataStockDetail>()
                                         .LeftJoin<SysStorageLocat>((d, l) => d.LocatNo == l.LocatNo)
                                        .Where(d => d.WareHouseNo == houseNo && d.PalletStatus == "3" && d.Status == "0" && areaNoList4.Contains(d.AreaNo))
                                        .OrderBy((d, l) => l.Row)
                                        .OrderBy((d, l) => l.Column)
                                        .ToList();
                                }
                                else
                                {
                                    palletList = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "3" && w.Status == "0"
                                    && areaNoList4.Contains(w.AreaNo)).OrderBy(o => o.UpdateTime).ToList();
                                }
                                if (palletList.Count <= 0)
                                {
                                    throw new Exception("暂无脏桶可分配");
                                }
                                taskMsg = "设备叫脏桶任务";
                                //遍历库存脏桶,返回MES验证
                                foreach (var item in palletList)
                                {
                                    #region 去掉MES
                                    //string jsonReq = JsonConvert.SerializeObject(item.PalletNo);
                                    //var response = HttpHelper.DoPost(urlMes, jsonReq, "回传MES脏桶编号", "RCS").ToString();
                                    //var obj = JsonConvert.DeserializeObject<ReMes>(response);//解析返回数据
                                    //if (obj.Success == "0")
                                    //{
                                    //    if (obj.Result != "1")//不可清洗,将脏桶冻结
                                    //    {
                                    //        item.Status = "5";//异常冻结
                                    //        //修改该桶库存状态
                                    //        Db.Updateable(item).ExecuteCommand();
                                    //        continue;
                                    //    }
                                    //    //下发小车任务
                                    //    var task2 = new TaskDetial
                                    //    {
                                    //        Startport = item.LocatNo,
                                    //        Endport = model.Location,
                                    //        Pallno = item.PalletNo,
                                    //        Type = model.Type,
                                    //        Crtype = "1",
                                    //        Noticedetailno = int.Parse(noticeno),
                                    //    };
                                    //    CreateLotTask(task2);
                                    //    return;
                                    //}
                                    //else
                                    //{
                                    //    throw new Exception("回传MES净桶编号失败!");
                                    //}
                                    #endregion
                                    item.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
                                                      //更新桶库存明细
                                    Db.Updateable(item).ExecuteCommand();
                                    //起始储位地址信息
                                    var startLoction2 = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == item.LocatNo);
                                    if (startLoction2 == null)
                                    {
                                        throw new Exception($"起始目标储位信息不存在,桶号:{item.LocatNo}");
                                    }
                                    taskNo = new Common().GetMaxNo("TN");//任务号
                                    var logTaskEntry2 = new LogTask
                                    {
                                        TaskNo = taskNo,
                                        Sender = "WMS",
                                        Receiver = "RCS",
                                        //IsSuccess = 1, //是否下发成功 0失败 1成功
                                        SendDate = DateTime.Now,  //发送时间
                                                                  //BackDate = DateTime.Now,  //返回时间
                                        StartLocat = item.LocatNo,//起始位置
                                        EndLocat = endLoction.LocatNo,//目标位置
                                        PalletNo = item.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        OrderType = "3",//单据类型 0 入库 1 出库 3 移库
                                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                        NoticeDetailNo = int.Parse(noticeNo),
                                        Msg = taskMsg, //关键信息
                                        LotNo = item.LotNo//批次号
                                    };
                                    //组织下发小车任务信息
                                    var task2 = new TaskDetial
                                    {
                                        Taskno = taskNo,//任务号
                                        Startport = item.LocatNo,
                                        Endport = model.Location,//endLoction.LocatNo,
                                        Pallno = item.PalletNo,
                                        Crtype = "1",//叫桶
                                        WareHouseNo = houseNo
                                    };
                                    //给下车下发任务
                                    logTaskEntry2.SendDate = DateTime.Now;//发送时间
                                    var agvResult2 = CreateTaskForAgv(task2, url, out agvMsg);
                                    if (agvResult2)//成功
                                    {
                                        //请求成功修改任务表相应字段状态
                                        logTaskEntry2.IsSuccess = 1;
                                        logTaskEntry2.IsSend = 0;
                                        //logTaskEntry2.IsCancel = 0;
                                        logTaskEntry2.BackDate = DateTime.Now;
                                        logTaskEntry2.Status = "1";
                                        Db.Insertable(logTaskEntry2).ExecuteCommand();
                                        startLoction2.Status = "3";//出库中
                                        Db.Updateable(startLoction2).ExecuteCommand();
                                        endLoction.Status = "2";//入库中
                                        Db.Updateable(endLoction).ExecuteCommand();
                                    }
                                    else//失败
                                    {
                                        logTaskEntry2.IsSuccess = 0;
                                        logTaskEntry2.Information = agvMsg;
                                        Db.Insertable(logTaskEntry2).ExecuteCommand();
                                    }
                                    //提交事务
                                    Db.CommitTran();
                                    return;
                                }
                            }
                            break;
                        default:
                            throw new Exception("任务类型无效");
                    }
                    //起始储位地址信息
                    var startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == pallet.LocatNo);
                    if (startLoction == null)
                    {
                        throw new Exception($"起始目标储位信息不存在,桶号:{pallet.LocatNo}");
                    }
                    taskNo = new Common().GetMaxNo("TN");//任务号
                                                         //任务信息
                    var logTaskEntry = new LogTask
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "RCS",
                        //IsSuccess = 1, //是否下发成功 0失败 1成功
                        SendDate = DateTime.Now,  //发送时间
                                                  //BackDate = DateTime.Now,  //返回时间
                        StartLocat = pallet.LocatNo,//起始位置
                        EndLocat = endLoction.LocatNo,//目标位置
                        PalletNo = pallet.PalletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        OrderType = "3",//单据类型 0 入库 1 出库 3移库
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        NoticeDetailNo = int.Parse(noticeNo),
                        Msg = taskMsg, //关键信息
                        LotNo = pallet.LotNo//批次号
                    };
                    //组织下发小车任务信息
                    var task = new TaskDetial
                    {
                        Taskno = taskNo,//任务号
                        Startport = pallet.LocatNo,//起始位置
                        Endport = model.Location,//endLoction.LocatNo,//目标位置
                        Pallno = pallet.PalletNo,//桶号
                        Crtype = "1",//叫桶
                        WareHouseNo = houseNo//车间编码
                    };
                    //给下车下发任务
                    logTaskEntry.SendDate = DateTime.Now;//发送时间
                    var agvResult = CreateTaskForAgv(task, url, out agvMsg);
                    if (agvResult)//成功
                    {
                        //请求成功修改任务表相应字段状态
                        logTaskEntry.IsSuccess = 1;
                        logTaskEntry.IsSend = 0;
                        //logTaskEntry.IsCancel = 0;
                        logTaskEntry.BackDate = DateTime.Now;
                        logTaskEntry.Status = "1";//正在执行
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        startLoction.Status = "3";//出库中
                        Db.Updateable(startLoction).ExecuteCommand();
                        endLoction.Status = "2";//入库中
                        Db.Updateable(endLoction).ExecuteCommand();
                    }
                    else//失败
                    {
                        logTaskEntry.IsSuccess = 0;
                        logTaskEntry.Information = agvMsg;
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                    }
                    //提交事务
                    Db.CommitTran();
                }
                palletno = pallet.PalletNo;
                locatno = pallet.LocatNo;
            }
            catch (Exception)
            {
                throw;
            }
        }
        /// <summary>
        /// RCS叫桶(混料桶和下料桶)
        /// </summary>
        /// <param name="warehouseno">库区</param>
        /// <param name="type">叫料类型</param>
        /// <param name="lotno">叫料批次</param>
        /// <returns></returns>
        public void GetPalletNo(string warehouseno, string type, string lotno, out string palletno, out string locatno)
        {
            var sql = "";
            var pallet = "";
            DataStockDetail SoMes = new DataStockDetail();
            try
            {
                switch (type)
                catch (Exception ex)
                {
                    case "1"://叫料桶(混料)
                        BllArrivalNoticeDetail ArriveMes = new BllArrivalNoticeDetail();
                        //判断该批次是否有对应入库单
                        sql += $"select * from BllArrivalNoticeDetail where LotNo =  '{lotno}' order by CreateTime desc";
                        ArriveMes = Db.Ado.SqlQuery<BllArrivalNoticeDetail>(sql).FirstOrDefault();
                        if (ArriveMes == null)
                        {
                            throw new Exception("该批次没有对应的入库单");
                        }
                        //查找库存中是否有可用的此批次的混料桶
                        sql = $"select LocatNo,palletno from DataStockDetail " +
                            $"left join SysStorageLocat b on a.LocatNo = b.LocatNo " +
                            $"where a.LotNo =  '{lotno}'and a.WareHouseNo = '{warehouseno}' and b.status = '1' " +
                            $"order by CompleteTime desc";
                        SoMes = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault();
                        if (pallet == null)
                        {
                            throw new Exception("暂无混料桶可分配");
                        }
                        break;
                    case "2"://叫料桶(下料)
                        //查找库存中是否有此批次的下料桶
                        sql = $"select LocatNo,palletno from DataStockDetail" +
                            $"left join SysStorageLocat b on a.LocatNo = b.LocatNo " +
                            $"where a.LotNo =  '{lotno}'and a.WareHouseNo = '{warehouseno}' and b.status = '1'" +
                            $" order by CompleteTime desc";
                        SoMes = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault();
                        if (pallet == null)
                        {
                            throw new Exception("暂无下料桶可分配");
                        }
                        break;
                    //回滚事务
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
                palletno = SoMes.PalletNo;
                locatno = SoMes.LocatNo;
            }
            catch (Exception)
            {
                throw;
            }
        }
        /// <summary>
        /// 申请储位
        /// </summary>
        /// <param name="model"></param>
        /// <param name="url"></param>
        /// <param name="taskNo"></param>
        /// <exception cref="Exception"></exception>
        public void ApplyLocatNo(Pallnetmsg model, string url, out string taskNo)
        {
            lock (RcsLock)
            {
                try
                {
                    string taskMsg = "";
                    //通过设备号查找到所属设备(区域)
                    var deviceInfo = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.DeviceCode.Contains(model.Location));
                    if (deviceInfo == null)
                    {
                        throw new Exception("设备信息不存在");
                    }
                    //申请储位设备所在车间编号
                    var houseNo = deviceInfo.WareHouseNo;
                    //设备所在储位信息(起始储位)
                    var deviceLocatInfo = new SysStorageLocat();
                    //出入库单据明细ID
                    var noticeno = "0";
                    //目标储位信息
                    var loction = new SysStorageLocat();
                    //桶库存信息
                    var palletInfo = new DataStockDetail();
                    //开启事务
                    Db.BeginTran();
                    switch (model.Type)
                    {
                        case "3"://清洗设备申请储位(净桶申请储位)
                            {
                                //设备放桶储位信息(原始叫桶目标储位)
                                var deviceLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);// Column=1 清洗储位,Column=2 清洗完料储位
                                if (deviceLocatInfo2 == null)
                                {
                                    throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
                                }
                                //查找桶库存信息
                                palletInfo = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.WareHouseNo == deviceLocatInfo2.WareHouseNo && w.AreaNo == deviceLocatInfo2.AreaNo && w.LocatNo == deviceLocatInfo2.LocatNo).OrderBy(o => o.UpdateTime).First();
                                if (palletInfo == null)
                                {
                                    throw new Exception($"未查询到该设备上桶的库存信息");
                                }
                                //查找该桶有没有正在执行的任务
                                var tasking = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "1" && w.PalletNo == palletInfo.PalletNo);
                                if (tasking != null)
                                {
                                    throw new Exception($"该桶有正在执行的任务,PalletNo:{palletInfo.PalletNo}");
                                }
                                //设备所在储位信息(起始储位)
                                deviceLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 2);// Column=1 清洗储位,Column=2 清洗完料储位
                                if (deviceLocatInfo == null)
                                {
                                    throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
                                }
                                //查找到该车间净桶区;
                                loction = GetLocatModel(houseNo, "0");
                                if (loction == null)
                                {
                                    throw new Exception("该车间净桶区暂无空余储位");
                                }
                                taskMsg = "清洗设备(净桶)申请储位任务";
                            }
                            break;
                        case "0"://接料设备申请储位(预混料桶申请储位)
                            {
                                //设备所在储位信息(起始储位)
                                deviceLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                                if (deviceLocatInfo == null)
                                {
                                    throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
                                }
                                //判断是否有批次号
                                if (string.IsNullOrWhiteSpace(model.LotNo))
                                {
                                    throw new Exception("批次号为空!");
                                }
                                //查找桶库存信息
                                palletInfo = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.WareHouseNo == deviceLocatInfo.WareHouseNo && w.AreaNo == deviceLocatInfo.AreaNo && w.LocatNo == deviceLocatInfo.LocatNo).OrderBy(o => o.UpdateTime).First();
                                if (palletInfo == null)
                                {
                                    throw new Exception($"未查询到该设备上桶的库存信息");
                                }
                                palletInfo.LotNo = model.LotNo;//批次号
                                //更新桶库存信息
                                Db.Updateable(palletInfo).ExecuteCommand();
                                //查找该桶有没有正在执行的任务
                                var tasking = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "1" && w.PalletNo == palletInfo.PalletNo);
                                if (tasking != null)
                                {
                                    throw new Exception($"该桶有正在执行的任务,PalletNo:{palletInfo.PalletNo}");
                                }
                                //查找到该车间预混区
                                loction = GetLocatModel(houseNo, "1");
                                if (loction == null)
                                {
                                    throw new Exception("该车间预混区暂无空余储位");
                                }
                                taskMsg = "接料设备(预混料桶)申请储位任务";
                            }
                            break;
                        case "1"://混料设备申请储位(半成品桶申请储位)
                            {
                                //设备所在储位信息(起始储位)
                                deviceLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                                if (deviceLocatInfo == null)
                                {
                                    throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
                                }
                                //查找桶库存信息
                                palletInfo = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.WareHouseNo == deviceLocatInfo.WareHouseNo && w.AreaNo == deviceLocatInfo.AreaNo && w.LocatNo == deviceLocatInfo.LocatNo).OrderBy(o => o.UpdateTime).First();
                                if (palletInfo == null)
                                {
                                    throw new Exception($"未查询到该设备上桶的库存信息");
                                }
                                //查找该桶有没有正在执行的任务
                                var tasking = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "1" && w.PalletNo == palletInfo.PalletNo);
                                if (tasking != null)
                                {
                                    throw new Exception($"该桶有正在执行的任务,PalletNo:{palletInfo.PalletNo}");
                                }
                                //判断是否有批次号
                                if (string.IsNullOrWhiteSpace(model.LotNo))
                                {
                                    throw new Exception("批次号为空!");
                                }
                                //大单体车间有个接料混料一体机,这里判断批次为空就再维护下批次
                                if (string.IsNullOrEmpty(palletInfo.LotNo))
                                {
                                    palletInfo.LotNo = model.LotNo;
                                    //更新桶库存信息
                                    Db.Updateable(palletInfo).ExecuteCommand();
                                }
                                //校验此批次是否有入库单
                                /*var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().Where(w => w.IsDel == "0" && w.Status == "0" && w.LotNo == model.LotNo).OrderByDescending(o => o.CreateTime).First();
                                if (noticeDetail == null)
                                {
                                    throw new Exception("该批次没有对应的入库单明细");
                                }
                                noticeno = noticeDetail.Id.ToString();
                                //入库总单
                                var notice = Db.Queryable<BllArrivalNotice>().Where(w => w.IsDel == "0" && w.ASNNo == noticeDetail.ASNNo).First();
                                if (notice == null)
                                {
                                    throw new Exception("该批次没有对应的入库单");
                                }
                                notice.Status = "1";//正在执行
                                //更新入库单状态
                                Db.Updateable(notice).ExecuteCommand();*/
                                //查找到该车间半成品区
                                loction = GetLocatModel(houseNo, "2");
                                if (loction == null)
                                {
                                    throw new Exception("该车间半成品区暂无空余储位");
                                }
                                taskMsg = "接料设备(混料桶)申请储位任务";
                            }
                            break;
                        case "2"://下料设备申请储位(脏桶申请储位)
                            {
                                //设备放桶储位信息(原始叫桶目标储位)
                                var deviceLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);// Column=1 投料储位,Column=2 投完料储位
                                if (deviceLocatInfo2 == null)
                                {
                                    throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
                                }
                                //查找桶库存信息
                                palletInfo = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.WareHouseNo == deviceLocatInfo2.WareHouseNo && w.AreaNo == deviceLocatInfo2.AreaNo && w.LocatNo == deviceLocatInfo2.LocatNo).OrderBy(o => o.UpdateTime).First();
                                if (palletInfo == null)
                                {
                                    throw new Exception($"未查询到该设备上桶的库存信息");
                                }
                                //查找该桶有没有正在执行的任务
                                var tasking = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "1" && w.PalletNo == palletInfo.PalletNo);
                                if (tasking != null)
                                {
                                    throw new Exception($"该桶有正在执行的任务,PalletNo:{palletInfo.PalletNo}");
                                }
                                if (houseNo == "M04")//除了喷干车间下料口都是2个储位(投料储位、投完料储位)
                                {
                                    //设备所在储位信息(起始储位)
                                    deviceLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 1);
                                }
                                else
                                {
                                    //设备所在储位信息(起始储位)
                                    deviceLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo && w.Column == 2);//Column=1 投料储位,Column=2 投完料储位
                                }
                                if (deviceLocatInfo == null)
                                {
                                    throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
                                }
                                //查找到该车间脏桶区
                                loction = GetLocatModel(houseNo, "3");
                                if (loction == null)
                                {
                                    throw new Exception("该车间脏桶区暂无空余储位");
                                }
                                taskMsg = "下料设备(脏桶)申请储位任务";
                            }
                            break;
                    }
                    taskNo = new Common().GetMaxNo("TN");//任务号
                                                         //任务信息
                    var logTaskEntry = new LogTask
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "RCS",
                        //IsSuccess = 1, //是否下发成功 0失败 1成功
                        SendDate = DateTime.Now,  //发送时间
                                                  //BackDate = DateTime.Now,  //返回时间
                        StartLocat = deviceLocatInfo.LocatNo,//起始位置
                        EndLocat = loction.LocatNo,//目标位置
                        PalletNo = palletInfo.PalletNo,//桶号
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "0",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        OrderType = "3",//单据类型 0 入库 1 出库 3 移库
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        NoticeDetailNo = int.Parse(noticeno),
                        Msg = taskMsg, //关键信息
                        LotNo = palletInfo.LotNo//批次号
                    };
                    var task = new TaskDetial
                    {
                        Taskno = taskNo,//任务号
                        Startport = model.Location,//deviceLocatInfo.LocatNo,//起始位置
                        Endport = loction.LocatNo,//目标位置
                        Pallno = palletInfo.PalletNo,
                        Crtype = "0",//入库
                        WareHouseNo = houseNo
                    };
                    string agvMsg = string.Empty;
                    //给下车下发任务
                    logTaskEntry.SendDate = DateTime.Now;//发送时间
                    var agvResult = CreateTaskForAgv(task, url, out agvMsg);
                    if (agvResult)//成功
                    {
                        //请求成功修改任务表相应字段状态
                        logTaskEntry.IsSuccess = 1;
                        logTaskEntry.IsSend = 0;
                        //logTaskEntry.IsCancel = 0;
                        logTaskEntry.BackDate = DateTime.Now;
                        logTaskEntry.Status = "1";//正在执行
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        deviceLocatInfo.Status = "3";//出库中
                        Db.Updateable(deviceLocatInfo).ExecuteCommand();
                        loction.Status = "2";//入库中
                        Db.Updateable(loction).ExecuteCommand();
                    }
                    else//失败
                    {
                        logTaskEntry.IsSuccess = 0;
                        logTaskEntry.Information = agvMsg;
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                    }
                    //提交事务
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    //回滚事务
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
        }
        /// <summary>
        /// 获取空储位
        /// </summary>
        /// <param name="houseNo">车间编号</param>
        /// <param name="Type">类别 0:净桶区 1:预混区 2:半成品区 3:脏桶区</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        private SysStorageLocat GetLocatModel(string houseNo,string type)
        {
            try
            {
                //通过类别查找车间区域
                List<string> areaNoList = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == type && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
                //查找储位
                var loctionModel = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.WareHouseNo == houseNo && areaNoList.Contains(w.AreaNo))
                    .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                //if (loctionModel == null)
                //{
                //    throw new Exception("该车间净桶区暂无空余储位");
                //}
                return loctionModel;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// MES下发将净桶改为脏桶并拉到脏桶区
        /// </summary>
        /// <param name="PalletNo"></param>
        /// <returns></returns>
        public void ApplyLocatNo(string palletno, string type, out string locatno)
        public void ChangePalletStatus(string PalletNo,string url)
        {
            var sql = $"select LocatNo from SysStorageLocat where status = '0'";
            SysStorageLocat loction = new SysStorageLocat();
            try
            {
                switch (type)
                var detail = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == PalletNo && w.PalletStatus == "0");
                if (detail == null)
                {
                    case "0"://净桶申请储位
                        sql += $"and WareHouseNo = 'A01'";
                        loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault();
                        if (loction == null)
                        {
                            throw new Exception("库内暂无空余净桶储位");
                        }
                        break;
                    case "1"://混料桶申请储位
                        sql += $"and WareHouseNo = 'A02'";
                        loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault();
                        if (loction == null)
                        {
                            throw new Exception("库内暂无空余混料桶储位");
                        }
                        break;
                    case "2"://半成品桶申请储位
                        sql += $"and WareHouseNo = 'A03'";
                        loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault();
                        if (loction == null)
                        {
                            throw new Exception("库内暂无空余半成品桶储位");
                        }
                        break;
                    case "3"://脏桶申请储位
                        sql += $"and WareHouseNo = 'A04'";
                        loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault();
                        if (loction == null)
                        {
                            throw new Exception("库内暂无空余脏桶储位");
                        }
                        break;
                    throw new Exception($"库存中不存在桶号为:{PalletNo}的库存!");
                }
                locatno = loction.PalletNo;
            }
            catch (Exception)
            {
                //起始目标储位信息
                var statrtLocat = Db.Queryable<SysStorageLocat>().First(w => w.WareHouseNo == detail.WareHouseNo && w.AreaNo == detail.AreaNo && w.LocatNo == detail.LocatNo);
                if (statrtLocat == null)
                {
                    throw new Exception($"该桶所在的储位信息不存在!");
                }
                //开启事务
                Db.BeginTran();
                throw;
                //查找是否有空余脏桶位
                var endLocat = Db.Queryable<SysStorageLocat>().First(w => w.WareHouseNo == detail.WareHouseNo && w.AreaNo.Contains("04") && w.Status == "0" && w.Flag=="0");
                if (endLocat == null)
                {
                    detail.Status = "5";//异常锁定
                    detail.PalletStatus = "3";//脏桶
                    //修改库存状态
                    Db.Updateable(detail).ExecuteCommand();
                }
                else
                {
                    //生成调度小车净桶去脏桶区任务
                    var ztask = new TaskDetial
                    {
                        Startport = detail.LocatNo,
                        Endport = endLocat.LocatNo,
                        Pallno = PalletNo,
                        Crtype = "2",
                    };
                    string taskNo = "";
                    string agvMsg = string.Empty;
                    CreateTaskForAgv(ztask, url, out agvMsg);
                    statrtLocat.Status = "3";//出库中
                    //修改起始储位状态
                    Db.Updateable(statrtLocat).ExecuteCommand();
                    detail.Status = "5";//异常锁定
                    detail.PalletStatus = "3";//脏桶
                    //修改库存状态
                    Db.Updateable(detail).ExecuteCommand();
                }
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw ex;
            }
        }
        /// <summary>
        /// RCS生成任务
        /// MES下发清洗锁定脏桶
        /// </summary>
        /// <param name="taskCode"></param>
        /// <param name="taskType"></param>
        /// <param name="startPos">起始位置</param>
        /// <param name="endPos">目的位置</param>
        /// <param name="agvCode"></param>
        /// <param name="url">RCS地址</param>
        /// <returns></returns>
        public string genAgvSchedulingTask(string taskCode, string taskType, string startPos, string endPos, string agvCode,string url, ref genAgvSchedulingTaskRep cbrep)
        /// <param name="pallnetmsg"></param>
        public void CleanPallet(Pallnetmsg pallnetmsg,string url)
        {
            try
            {
                PositionCodePath pcd1 = new PositionCodePath()
                var detail = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == pallnetmsg.PalletNo && w.PalletStatus == "3");
                if (detail == null)
                {
                    positionCode = startPos.ToString(),
                    type = "00",
                };
                PositionCodePath pcd2 = new PositionCodePath()
                {
                    positionCode = endPos.ToString(),
                    type = "00",
                };
                List<PositionCodePath> lst = new List<PositionCodePath>();
                lst.Add(pcd1);
                lst.Add(pcd2);
                genAgvSchedulingTaskReq cbreq = new genAgvSchedulingTaskReq()
                {
                    reqCode = taskCode.ToString(),
                    taskCode = taskCode.ToString(),
                    taskTyp = taskType,
                    positionCodePath = lst,
                    podCode = "",
                    agvCode = agvCode,
                    ctnrTyp = "1",
                    //ctnrCode="2",
                };
                if (startPos == "50")
                {
                    cbreq.ctnrTyp = "4";
                    throw new Exception($"库存中不存在桶号为:{pallnetmsg.PalletNo}的库存!");
                }
                cbrep = genAgvSchedulingTask(cbreq,url);
                return cbrep.code;
            }
            catch (Exception ex) { throw ex; }
        }
        /// <summary>
        /// 生成任务单
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        private genAgvSchedulingTaskRep genAgvSchedulingTask(genAgvSchedulingTaskReq req,string url)
        {
            genAgvSchedulingTaskRep rep = new genAgvSchedulingTaskRep()
            {
                code = "-1",
                message = "生产任务单失败"
            };
            if (req == null)
            {
                return rep;
            }
            try
            {
                string jsonReq = JsonConvert.SerializeObject(req);
                string jsonRep = HttpHelper.DoPost(url + "/genAgvSchedulingTask", jsonReq,"小车任务下发","RCS");
                jsonRep = jsonRep.TrimStart('\"');
                jsonRep = jsonRep.TrimEnd('\"');
                jsonRep = jsonRep.Replace("\\", "");
                rep = JsonConvert.DeserializeObject<genAgvSchedulingTaskRep>(jsonRep);
                return rep;
                //下发小车任务
                var task = new TaskDetial
                {
                    Startport = detail.LocatNo,
                    Endport = pallnetmsg.Location,
                    Pallno = detail.PalletNo,
                    Crtype = "1",
                };
                string taskNo = "";
                string agvMsg = string.Empty;
                CreateTaskForAgv(task, url, out agvMsg);
            }
            catch (Exception ex)
            {
@@ -259,25 +853,634 @@
            }
        }
        /// <summary>
        /// 任务完成
        /// </summary>
        /// <param name="TaskNo"></param>
        /// <param name="Status"></param>
        /// <exception cref="Exception"></exception>
        public void RCSFinishTask(string taskNo, string status, string comeFrom, int userId = 0)
        {
            try
            {
                #region 条件判断
                var resultModel = new ErpModel() { Success = -1, Message = "" };
                if (string.IsNullOrEmpty(taskNo))
                {
                    throw new Exception("任务号不可为空");
                }
                //任务信息
                var taskInfo = Db.Queryable<LogTask>().First(w => w.TaskNo == taskNo);
                if (taskInfo == null)
                {
                    throw new Exception($"任务号为:{taskNo}的任务不存在!");
                }
                if (taskInfo.Status != "1" && comeFrom != "WMS")
                {
                    throw new Exception($"任务号为:{taskNo}的任务状态异常");
                }
                #endregion
                //开启事务
                Db.BeginTran();
                var comTime = DateTime.Now;
                if (status == "0")
                {
                    taskInfo.Status = "3";//异常结束
                    //修改任务状态
                    Db.Updateable(taskInfo).ExecuteCommand();
                    resultModel.Success = 0;
                    resultModel.Message = "成功";
                    //提交事务
                    Db.CommitTran();
                    return;
                }
                //库存明细
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo);
                if (stockDetail == null)
                {
                    throw new Exception($"桶库存信息不存在");
                }
                //起始储位信息
                var startLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0");
                if (startLocatInfo == null)
                {
                    throw new Exception($"起始储位信息不存在");
                }
                startLocatInfo.Status = "0";//空储位
                //修改起始储位状态
                Db.Updateable(startLocatInfo).ExecuteCommand();
                //目标储位信息
                var endLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
                if (endLocatInfo == null)
                {
                    throw new Exception($"目标储位信息不存在");
                }
                endLocatInfo.Status = "1";//有物品
                //修改目标储位状态
                Db.Updateable(endLocatInfo).ExecuteCommand();
                //目标储位所属区域
                var endAreaInfo = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.WareHouseNo == endLocatInfo.WareHouseNo && w.AreaNo == endLocatInfo.AreaNo);
                if (endAreaInfo == null)
                {
                    throw new Exception($"目标储位所属区域信息不存在");
                }
                stockDetail.WareHouseNo = endLocatInfo.WareHouseNo;//所属仓库
                stockDetail.RoadwayNo = endLocatInfo.RoadwayNo;//所属巷道
                stockDetail.AreaNo = endLocatInfo.AreaNo;//所属区域
                stockDetail.LocatNo = endLocatInfo.LocatNo;//储位地址
                stockDetail.UpdateTime = DateTime.Now;//更新时间
                if (endAreaInfo.Type == "0")//洁净区
                {
                    stockDetail.PalletStatus = "0";
                    stockDetail.Status = "0";//待分配
                }
                else if (endAreaInfo.Type == "1")//预混区
                {
                    stockDetail.PalletStatus = "1";
                    stockDetail.Status = "0";//待分配
                }
                else if (endAreaInfo.Type == "2")//半成品区
                {
                    stockDetail.PalletStatus = "2";
                    stockDetail.Status = "0";//待分配
                }
                else if (endAreaInfo.Type == "3")//脏桶区
                {
                    stockDetail.PalletStatus = "3";
                    stockDetail.LotNo = "";//批次
                    stockDetail.SkuNo = "";
                    stockDetail.SkuName = "";
                    stockDetail.Status = "0";//待分配
                    stockDetail.InspectStatus = "0";//待检验
                }
                //修改库存明细
                Db.Updateable(stockDetail).ExecuteCommand();
                //入库任务,处理入库单
                if (taskInfo.Type == "0" && taskInfo.NoticeDetailNo != 0)
                {
                    //入库单明细
                    var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(w => w.IsDel == "0" && w.Id == taskInfo.NoticeDetailNo);
                    if (noticeDetail != null)
                    {
                        noticeDetail.CompleteQty += 1;//完成数量
                        if (noticeDetail.CompleteQty >= noticeDetail.Qty)
                        {
                            noticeDetail.CompleteTime = DateTime.Now;//完成时间
                            //入库单
                            var notice = Db.Queryable<BllArrivalNotice>().First(w => w.IsDel == "0" && w.ASNNo == noticeDetail.ASNNo);
                            var noticeDetailList = Db.Queryable<BllArrivalNoticeDetail>().Where(w => w.IsDel == "0" && w.CompleteQty < w.Qty && w.Id != noticeDetail.Id).ToList();
                            if (noticeDetailList.Count <= 0)
                            {
                                notice.Status = "2";//执行完成
                                notice.UpdateTime = DateTime.Now;
                                notice.CompleteTime = DateTime.Now;
                                //修改入库单状态
                                Db.Updateable(notice).ExecuteCommand();
                            }
                        }
                        //修改入库单明细
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                }
                //出库任务,处理出库单
                if (taskInfo.Type == "1" && taskInfo.NoticeDetailNo != 0)//入库
                {
                    var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(w => w.IsDel == "0" && w.Id==taskInfo.NoticeDetailNo);
                    if (noticeDetail != null)
                    {
                        noticeDetail.CompleteQty += 1;//完成数量
                        if (noticeDetail.CompleteQty >= noticeDetail.Qty)
                        {
                            var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == noticeDetail.SONo);
                            var noticeDetailList = Db.Queryable<BllExportNoticeDetail>().Where(w => w.IsDel == "0" && w.CompleteQty < w.Qty && w.Id != noticeDetail.Id).ToList();
                            if (noticeDetailList.Count <= 0)
                            {
                                notice.Status = "4";//执行完成
                                notice.UpdateTime = DateTime.Now;
                                notice.CompleteTime = DateTime.Now;
                                //修改入库单状态
                                Db.Updateable(notice).ExecuteCommand();
                            }
                        }
                        //修改入库单明细
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                }
                #region 去掉MES
                //回传桶状态给MES
                //BackPalletStatus(taskInfo.PalletNo, sd3.PalletStatus);
                #endregion
                taskInfo.Status = "2";//执行完成
                taskInfo.IsSend = 0;
                taskInfo.IsCancel = 0;
                taskInfo.IsFinish = 0;
                taskInfo.FinishDate = DateTime.Now;//完成时间
                //修改任务状态
                Db.Updateable(taskInfo).ExecuteCommand();
                if (comeFrom == "WMS")
                {
                    //添加操作日志记录
                    var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskInfo.TaskNo, "完成", $"点击完成按钮、任务号为:{taskInfo.TaskNo}的任务", userId);
                }
                //提交事务
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 手动取消任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void CancelTask(string taskNo, int userId)
        {
            try
            {
                //开启事务
                Db.BeginTran();
                //任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception("未查询到任务信息");
                }
                //if (task.Status != "0")
                //{
                //    throw new Exception("只有等待执行的任务才可取消");
                //}
                //修改任务
                task.IsSuccess = 0;
                task.IsSend = 0;
                task.IsCancel = 0;
                task.IsFinish = 0;
                task.Status = "4";//已取消
                task.CancelDate = DateTime.Now;
                Db.Updateable(task).ExecuteCommand();
                //修改起始储位信息
                var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.LocatNo == task.StartLocat);
                if (locat == null)
                {
                    throw new Exception("未查询到起始位置储位信息,请核实!");
                }
                locat.Status = "1"; //有物品
                Db.Updateable(locat).ExecuteCommand();
                //修改目标储位信息
                var locatEnd = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.LocatNo == task.EndLocat);
                if (locatEnd == null)
                {
                    throw new Exception("未查询到目标位置储位信息,请核实!");
                }
                locatEnd.Status = "0"; //空储位
                Db.Updateable(locatEnd).ExecuteCommand();
                if (task.Type == "1")//出库任务
                {
                    //修改库存明细
                    var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == task.PalletNo && w.Status == "2");
                    if (stockDetail == null)
                    {
                        throw new Exception("未查询到该桶库存信息,请检查!");
                    }
                    stockDetail.Status = "0";//待分配
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskNo, "取消", $"点击取消按钮、取消了任务号为:{taskNo}的任务", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 手动下发任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void DownTask(string taskNo, int userId,string url)
        {
            try
            {
                //开启事务
                Db.BeginTran();
                //任务信息
                var logTaskEntry = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (logTaskEntry == null)
                {
                    throw new Exception("未查询到任务信息");
                }
                if (logTaskEntry.Status != "0")
                {
                    throw new Exception("只有等待执行的任务才可手动下发");
                }
                //查找该桶有没有正在执行的任务
                var tasking = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "1" && w.PalletNo == logTaskEntry.PalletNo);
                if (tasking != null)
                {
                    throw new Exception($"该桶有正在执行的任务");
                }
                //起始储位信息
                var startLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == logTaskEntry.StartLocat);
                if (startLocatInfo == null)
                {
                    throw new Exception($"未查询到起始储位信息");
                }
                if (startLocatInfo.Status != "1")
                {
                    throw new Exception($"起始储位状态异常");
                }
                //目标储位信息
                var endLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == logTaskEntry.EndLocat);
                if (endLocatInfo == null)
                {
                    throw new Exception($"未查询到目标储位信息");
                }
                if (endLocatInfo.Status != "0")
                {
                    throw new Exception($"目标储位状态异常");
                }
                //组织给小车下发任务信息
                var task = new TaskDetial
                {
                    Taskno = taskNo,//任务号
                    Startport = logTaskEntry.StartLocat,
                    Endport = logTaskEntry.EndLocat,
                    Pallno = logTaskEntry.PalletNo,
                    Crtype = logTaskEntry.Type,
                };
                string agvMsg = string.Empty;
                //给下车下发任务
                logTaskEntry.SendDate = DateTime.Now;//发送时间
                var agvResult = CreateTaskForAgv(task, url, out agvMsg);
                if (agvResult)//成功
                {
                    //请求成功修改任务表相应字段状态
                    logTaskEntry.IsSuccess = 1;
                    logTaskEntry.IsSend = 0;
                    logTaskEntry.IsCancel = 0;
                    logTaskEntry.BackDate = DateTime.Now;
                    logTaskEntry.Status = "1";//正在执行
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                    startLocatInfo.Status = "3";//出库中
                    Db.Updateable(startLocatInfo).ExecuteCommand();
                    endLocatInfo.Status = "2";//入库中
                    Db.Updateable(endLocatInfo).ExecuteCommand();
                }
                else//失败
                {
                    logTaskEntry.IsSuccess = 0;
                    logTaskEntry.Information = agvMsg;
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                }
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskNo, "下发", $"点击下发按钮、任务号为:{taskNo}的任务", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 生成任务单到LogTask
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public void CreateLotTask(string startport,string endport,string type,string tasktype)
        public bool CreateTaskForAgv(TaskDetial taskDetial, string url, out string agvMsg, string priority=null)
        {
            bool result = false;
            #region 呼叫小车代码
            List<PositionCodePath> pahtList = new List<PositionCodePath>();
            //起始位置
            PositionCodePath path1 = new PositionCodePath();
            path1.positionCode = taskDetial.Startport;
            if (taskDetial.Crtype == "1")//叫桶(桶出库)
            {
                path1.type = "05";
            }
            else if (taskDetial.Crtype == "0")//申请储位(桶入库)
            {
                path1.type = "00";
            }
            else//同车间平层搬运
            {
                path1.type = "05";
            }
            pahtList.Add(path1);
            //目标位置
            PositionCodePath path2 = new PositionCodePath();
            path2.positionCode = taskDetial.Endport;
            if (taskDetial.Crtype == "1")//叫桶(桶出库)
            {
                path2.type = "00";
            }
            else if (taskDetial.Crtype == "1")//申请储位(桶入库)
            {
                path2.type = "05";
            }
            else //同车间平层搬运
            {
                path2.type = "05";
            }
            pahtList.Add(path2);
            //下车任务单
            AgvSchedulingTask agvTask = new AgvSchedulingTask();
            agvTask.reqCode = taskDetial.Taskno;//请求编号
            agvTask.taskCode = taskDetial.Taskno;//任务号
            agvTask.ctnrCode = taskDetial.Pallno;//桶号
            agvTask.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//请求时间
            agvTask.wbCode = "";
            agvTask.positionCodePath = pahtList;//小车路径
            agvTask.podCode = "";
            agvTask.userCallCode = "";//taskDetial.Endport;//目标位置
            agvTask.priority = priority;//优先级
            //判断容器类型
            if (taskDetial.WareHouseNo == "M04")//喷干车间
            {
                agvTask.ctnrTyp = "2";// 1:桶 2:桶(小) 3:托盘
            }
            else
            {
                agvTask.ctnrTyp = "1";// 1:桶 2:桶(小) 3:托盘
            }
            //判断任务类型
            if (taskDetial.Crtype == "1")//叫桶(桶出库)
            {
                agvTask.taskTyp = "Z3";//任务类型 线边到托盘收集器 Z1, 托盘垛申请入库 Z2
            }
            else if (taskDetial.Crtype == "0")//申请储位(桶入库)
            {
                agvTask.taskTyp = "Z4";//任务类型 线边到托盘收集器 Z1, 托盘垛申请入库 Z2
            }
            else//同车间平层搬运
            {
                agvTask.taskTyp = "Z5";
            }
            // 正式运行程序放开
            var jsonData = JsonConvert.SerializeObject(agvTask);
            string response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
            //解析返回数据
            var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
            if (agvModel.Code == "0")
            {
                result = true;//给下车下发任务成功
                agvMsg = "";
            }
            else
            {
                string logMsg = "";
                if (taskDetial.Crtype == "1")//叫桶(桶出库)
                {
                    logMsg = "申请叫桶";
                }
                else if (taskDetial.Crtype == "0")//申请储位(桶入库)
                {
                    logMsg = "申请储位";
                }
                var logStr = $@".\log\AGV\AGV{logMsg}" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"AGV{logMsg}异常:( {agvModel.Message} ),", logStr);
                agvMsg = agvModel.Message;
            }
            return result;
            #endregion
        }
        /// <summary>
        /// 分配桶后判断该桶外侧储位是否需要移库
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        private bool YikuTask(string palletNo,string url)
        {
            try
            {
                //分配桶的库存信息
                var palletInfo = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (palletInfo == null)
                {
                    throw new Exception("未查询到分配桶的库存信息");
                }
                //判断分配的桶有没有正在执行的任务(移库中)
                var taskIng= Db.Queryable<LogTask>().First(w => w.IsDel == "0" && (w.Status == "0" || w.Status == "1") && w.PalletNo == palletNo);
                if (taskIng != null)
                {
                    throw new Exception("分配的桶有正在执行的任务,请稍后再试");
                }
                //分配桶的储位信息
                var locatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletInfo.LocatNo);
                if (locatInfo == null)
                {
                    throw new Exception("未查询到分配桶所在的储位信息");
                }
                //判断该储位是否是内侧储位
                if (!string.IsNullOrEmpty(locatInfo.AisleOne))
                {
                    //判断外侧储位是否有桶
                    var palletInfoYi = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == locatInfo.AisleOne);
                    if (palletInfoYi != null)
                    {
                        //判断要移库的桶是否被分配
                        if (palletInfoYi.Status != "0")
                        {
                            throw new Exception("要移库的桶已被分配,请稍后再试");
                        }
                        //判断要移库的桶是否有正在执行的任务
                        var taskInfo = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && (w.Status == "0" || w.Status == "1") && w.PalletNo == palletInfoYi.PalletNo);
                        if (taskInfo != null)
                        {
                            throw new Exception("要移库的桶有正在执行的任务,请稍后再试");
                        }
                        #region#给要移库的桶分配新储位
                        var locatInfoNew = new SysStorageLocat();
                        //优先分配内侧储位
                        var locatListNei = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && !string.IsNullOrEmpty(w.AisleOne) && w.WareHouseNo == palletInfoYi.WareHouseNo && w.AreaNo == palletInfoYi.AreaNo).ToList();
                        foreach (var item in locatListNei)
                        {
                            //判断该内侧储位的外侧储位是否有桶
                            var detailWai = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == item.AisleOne);
                            if (detailWai != null)
                            {
                                continue;
                            }
                            locatInfoNew = item;
                            break;
                        }
                        if (locatInfoNew == null)
                        {
                            //没有内侧储位,再查找外侧储位
                            var locatListWai = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && string.IsNullOrEmpty(w.AisleOne) && w.WareHouseNo == palletInfoYi.WareHouseNo && w.AreaNo == palletInfoYi.AreaNo).OrderBy(o => o.Row).ToList();
                            foreach (var item in locatListWai)
                            {
                                //判断该储位的内侧储位是否有正在执行的任务
                                var locatItemNei = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.AisleOne == item.LocatNo);
                                if (locatItemNei != null && locatItemNei.Status != "0")
                                {
                                    continue;
                                }
                                locatInfoNew = item;
                                break;
                            }
                        }
                        if (locatInfoNew == null)
                        {
                            throw new Exception("没有空余的空储位进行移库");
                        }
                        #endregion
                        //给下车下发移库任务
                        var taskNo = new Common().GetMaxNo("TN");//任务号
                        //任务信息
                        var logTaskEntry = new LogTask
                        {
                            TaskNo = taskNo,
                            Sender = "WMS",
                            Receiver = "RCS",
                            //IsSuccess = 1, //是否下发成功 0失败 1成功
                            SendDate = DateTime.Now,  //发送时间
                            //BackDate = DateTime.Now,  //返回时间
                            StartLocat = palletInfoYi.LocatNo,//起始位置
                            EndLocat = locatInfoNew.LocatNo,//目标位置
                            PalletNo = palletInfoYi.PalletNo,//托盘码
                            IsSend = 1,//是否可再次下发
                            IsCancel = 1,//是否可取消
                            IsFinish = 1,//是否可完成
                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                            OrderType = "3",//单据类型 0 入库 1 出库 3移库
                            Status = "0",//任务状态0:等待执行1正在执行2执行完成
                            NoticeDetailNo = 0,
                            Msg = $"将桶{palletInfoYi.PalletNo}从{palletInfoYi.LocatNo}移到{locatInfoNew.LocatNo}", //关键信息
                            LotNo = ""//批次号
                        };
                        //组织下发小车任务信息
                        var task = new TaskDetial
                        {
                            Taskno = taskNo,//任务号
                            Startport = palletInfoYi.LocatNo,//起始位置
                            Endport = locatInfoNew.LocatNo,//endLoction.LocatNo,//目标位置
                            Pallno = palletInfoYi.PalletNo,//桶号
                            Crtype = "1",//叫桶
                            WareHouseNo = palletInfoYi.WareHouseNo//车间编码
                        };
                        string agvMsg = string.Empty;
                        //给下车下发任务
                        logTaskEntry.SendDate = DateTime.Now;//发送时间
                        var agvResult = CreateTaskForAgv(task, url, out agvMsg, "70");
                        if (agvResult)//成功
                        {
                            //请求成功修改任务表相应字段状态
                            logTaskEntry.IsSuccess = 1;
                            logTaskEntry.IsSend = 0;
                            //logTaskEntry.IsCancel = 0;
                            logTaskEntry.BackDate = DateTime.Now;
                            logTaskEntry.Status = "1";//正在执行
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            locatInfo.Status = "5";//移出中
                            Db.Updateable(locatInfo).ExecuteCommand();
                            locatInfoNew.Status = "4";//移入中
                            Db.Updateable(locatInfoNew).ExecuteCommand();
                        }
                        else//失败
                        {
                            logTaskEntry.IsSuccess = 0;
                            logTaskEntry.Information = agvMsg;
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{palletInfoYi.PalletNo}");
                        }
                    }
                }
                return true;
            }
            catch (Exception)
            catch (Exception e)
            {
                throw;
                throw new Exception(e.Message);
            }
        }
    }
}
Wms/WMS.BLL/DataServer/StockDetailServer.cs
@@ -9,6 +9,7 @@
using WMS.Entity.BllQualityEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IDataServer;
namespace WMS.BLL.DataServer
@@ -37,146 +38,47 @@
        /// <param name="bitBoxMark">零箱标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        public List<StockDetailDto> 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 List<StockDetailDto> GetBindList(string wareHouseName, string areaName, string locatNo, string palletNo, string lotNo)
        {
            string str = "select detail.*,house.WareHouseNo + '-' + house.WareHouseName as WareHouseName,roadway.RoadwayNo + '-' + roadway.RoadwayName as RoadwayName,area.AreaNo + '-' + area.AreaName as AreaName from DataStockDetail detail left join SysStorageRoadway roadway on detail.RoadwayNo = roadway.RoadwayNo left join SysWareHouse house on detail.WareHouseNo = house.WareHouseNo left join SysStorageArea area on detail.AreaNo = area.AreaNo where detail.IsDel = @isdel";
            //判断物料号是否为空
            if (!string.IsNullOrEmpty(skuNo))
            string str = $@"select
                                detail.*,
                                house.WareHouseNo + '-' + house.WareHouseName as WareHouseName,
                                roadway.RoadwayNo + '-' + roadway.RoadwayName as RoadwayName,
                                area.AreaNo + '-' + area.AreaName as AreaName
                            from DataStockDetail detail
                            left join SysStorageRoadway roadway on detail.RoadwayNo = roadway.RoadwayNo
                            left join SysWareHouse house on detail.WareHouseNo = house.WareHouseNo
                            left join SysStorageArea area on detail.AreaNo = area.AreaNo
                            where detail.IsDel = '0'";
            //判断所属仓库是否为空
            if (!string.IsNullOrEmpty(wareHouseName))
            {
                str += " and detail.SkuNo like @skuno";
                str += $" and (house.WareHouseNo like '%{wareHouseName}%' or house.WareHouseName like '%{wareHouseName}%')";
            }
            //判断物料名称是否为空
            if (!string.IsNullOrEmpty(skuName))
            //判断所属区域是否为空
            if (!string.IsNullOrEmpty(areaName))
            {
                str += " and detail.SkuName like @skuname";
                str += $" and (area.AreaNo like '%{areaName}%' or area.AreaName like '%{areaName}%')";
            }
            //判断所属储位是否为空
            if (!string.IsNullOrEmpty(locatNo))
            {
                str += $" and detail.LocatNo like '%{locatNo}%'";
            }
            //判断托盘号是否为空
            if (!string.IsNullOrEmpty(palletNo))
            {
                str += " and detail.PalletNo like @palletno";
                str += $" and detail.PalletNo like '%{palletNo}%'";
            }
            //判断批次是否为空
            if (!string.IsNullOrEmpty(lotNo))
            {
                str += " and detail.LotNo like @lotno";
                str += $" and detail.LotNo like  '%{lotNo}%'";
            }
            //判断零托标记是否为空
            if (!string.IsNullOrEmpty(bitPalletMark))
            {
                str += " and detail.BitPalletMark = @bitpalletmark";
            }
            //判断货主编码是否为空
            if (!string.IsNullOrEmpty(ownerNo))
            {
                str += " and detail.OwnerNo like @ownerNo";
            }
            //判断货主名称是否为空
            if (!string.IsNullOrEmpty(ownerName))
            {
                str += " and detail.OwnerName like @ownerName";
            }
            if (!string.IsNullOrEmpty(startTime))
            {
                str += $" and detail.CompleteTime >= '{startTime}'";
            }
            if (!string.IsNullOrEmpty(endTime))
            {
                endTime = Convert.ToDateTime(endTime).AddDays(1).ToString();
                str += $" and detail.CompleteTime < '{endTime}'";
            }
            int i = 0;
            //在箱码明细中获取相应数据
            string boxstr = "select StockDetailId from DataBoxInfo Where IsDel = @isdel";
            //判断箱码是否为空
            if (!string.IsNullOrEmpty(boxNo))
            {
                boxstr += " and BoxNo like @boxno";
                i = 1;
            }
            //判断箱支状态是否为空
            if (!string.IsNullOrEmpty(status))
            {
                boxstr += " and Status = @status";
                i = 1;
            }
            //判断检验标记是否为空
            if (!string.IsNullOrEmpty(inspectMark))
            {
                boxstr += " and InspectMark = @inspectmark";
                str += " and detail.InspectMark = @inspectmark";
                i = 1;
            }
            //判断零箱标记是否为空
            if (!string.IsNullOrEmpty(bitBoxMark))
            {
                boxstr += " and BitBoxMark = @bitboxmark";
                i = 1;
            }
            //判断质量状态是否为空
            if (!string.IsNullOrEmpty(inspectStatus))
            {
                boxstr += " and InspectStatus = @inspectstatus";
                str += " and detail.InspectStatus = @inspectstatus";
                i = 1;
            }
            //将箱码数据进行排序
            boxstr += " order by StockDetailId";
            //查出箱码明细中信息
            List<int> stockDetailId = Db.Ado.SqlQuery<int>(boxstr, new
            {
                isdel = "0", //是否删除
                boxno = "%" + boxNo + "%", //箱码
                status, //箱支状态
                inspectmark = inspectMark, //检验标记
                bitboxmark = bitBoxMark, //零箱标记
                inspectstatus = inspectStatus //质量状态
            });
            //去重
            // List<int> newArr = null;
            string arr = "";
            //判断是否有查箱码信息
            if (i == 1)
            {
                if (stockDetailId.Count > 0)
                {
                    //去重
                    arr += stockDetailId[0].ToString();
                    for (int a = 1; a < stockDetailId.Count; a++)
                    {
                        if (stockDetailId[a] != stockDetailId[a - 1])
                        {
                            arr += ',' + stockDetailId[a].ToString();
                        }
                    }
                }
                if (!string.IsNullOrEmpty(arr))
                {
                    str += $" and Id in ({arr})";
                }
                else
                {
                    str += " and Id = ''";
                }
            }
            //排序
            str += " order by PalletNo,SkuNo,LotNo";
            List<StockDetailDto> boxInforList = Db.Ado.SqlQuery<StockDetailDto>(str, new
            {
                isdel = "0", //是否删除
                skuno = "%" + skuNo + "%", //物料号
                skuname = "%" + skuName + "%", //物料名称
                palletno = "%" + palletNo + "%", //托盘
                lotno = "%" + lotNo + "%", //批次号
                bitpalletmark = bitPalletMark, //零托标记
                inspectmark = inspectMark, //检验标记
                inspectstatus = inspectStatus, //质量状态
                ownerNo = "%" + ownerNo + "%", //货主编码
                ownerName = "%" + ownerName + "%" //货主名称
                //stockdetailid = "(" + arr + ")" //库存明细id
            });
            str += " order by PalletNo";
            List<StockDetailDto> boxInforList = Db.Ado.SqlQuery<StockDetailDto>(str).ToList();
            return boxInforList;
        }
@@ -403,5 +305,102 @@
            }
        }
        #endregion
        #region 二楼业务
        /// <summary>
        /// 添加托盘库存明细
        /// </summary>
        public void InsertStockDetail(string PalletNo,string WareHouseNo,string AreaNo,string LocatNo, string PalletStatus, string SkuNo, string SkuName, string LotNo, int userId)
        {
            try
            {
                if (string.IsNullOrEmpty(PalletNo))
                {
                    throw new Exception("托盘号不能为空!");
                }
                if (string.IsNullOrEmpty(WareHouseNo))
                {
                    throw new Exception("所属仓库不能为空!");
                }
                if (string.IsNullOrEmpty(AreaNo))
                {
                    throw new Exception("所属区域不能为空!");
                }
                if (string.IsNullOrEmpty(LocatNo))
                {
                    throw new Exception("储位地址不能为空!");
                }
                if (string.IsNullOrEmpty(PalletStatus))
                {
                    throw new Exception("托盘状态不能为空!");
                }
                var palletInfo = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == PalletNo);
                if (palletInfo != null)
                {
                    throw new Exception($"库存中已有编号为:{PalletNo}的明细,请勿重复添加!");
                }
                //目标储位信息
                var locatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == LocatNo && w.Status == "0" && w.IsDel == "0");
                if (locatInfo == null)
                {
                    throw new Exception("储位地址不存在!");
                }
                Db.BeginTran();
                var comTime = DateTime.Now;
                var model = new DataStockDetail()
                {
                    Qty = 0,
                    LockQty = 0,
                    FrozenQty = 0,
                    InspectQty = 0,
                    WareHouseNo = WareHouseNo,//所属仓库
                    RoadwayNo = "",//所属巷道
                    AreaNo = AreaNo,//所属区域
                    LocatNo = LocatNo,//储位地址
                    PalletNo = PalletNo,
                    PalletNo2 = "",
                    PalletNo3 = "",
                    PalletTags = "0",
                    CompleteTime = comTime,
                    ProductionTime = null,
                    ExpirationTime = null,
                    Status = "0",
                    InspectMark = "0",
                    InspectStatus = "0",//待检验
                    BitPalletMark = "0",
                    PackagNo = "",
                    IsBale = "0",
                    IsBelt = "0",
                    SkuNo = SkuNo,
                    SkuName = SkuName,
                    LotNo = LotNo,
                    PalletStatus = PalletStatus,
                    IsDel = "0",
                    CreateUser = userId,
                    CreateTime = comTime
                };
                //插入库存明细
                Db.Insertable(model).ExecuteCommand();
                locatInfo.Status = "1";//有物品
                //修改目标储位状态
                Db.Updateable(locatInfo).ExecuteCommand();
                Db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #endregion
    }
}
Wms/WMS.BLL/LogServer/TaskServer.cs
@@ -37,8 +37,8 @@
                    .ToExpression();//注意 这一句 不能少
                var total = 0;
                var data = GetAllWhereAsync(item)
                    .LeftJoin<SysUserInfor>((a,b)=>a.CreateUser == b.Id).
                    Select((a,b) => new TaskDto()
                    .LeftJoin<SysUserInfor>((a, b) => a.CreateUser == b.Id).
                    Select((a, b) => new TaskDto()
                    {
                        Id = a.Id,
                        TaskNo = a.TaskNo,
@@ -60,14 +60,16 @@
                        Type = a.Type,
                        OrderType = a.OrderType,
                        LotNo = a.LotNo,
                        CancelDate = a.CancelDate,
                        FinishDate = a.FinishDate,
                        CreateUserName =b.RealName,
                        CreateUserName = b.RealName,
                        CreateTime = a.CreateTime
                    })
                    .OrderByDescending(a => a.TaskNo)
                    .ToOffsetPage(page,limit,ref total);
                    .ToOffsetPage(page, limit, ref total);
                count = total;
                return data.OrderByDescending(m=>m.TaskNo).ToList();
Wms/WMS.BLL/SysServer/PalletsServer.cs
@@ -5,11 +5,13 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Model.InterFaceModel;
using Model.ModelDto.LogDto;
using Model.ModelDto.SysDto;
using SqlSugar;
using WMS.BLL.LogServer;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.ILogServer;
using WMS.IBLL.ISysServer;
@@ -111,62 +113,134 @@
            }
        }
        public async Task<bool> AddPallets(int groupCount, int userId)
        /// <summary>
        /// 添加桶信息并增加库存
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="locatNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void AddPallets(string palletNo,string locatNo, string deviceCode, int userId)
        {
            var db = DataContext.Db;
            try
            {
                var db = DataContext.Db;
                if (groupCount <= 0)
            {
                if (string.IsNullOrEmpty(palletNo))
                {
                    throw new Exception("组数需大于0");
                    throw new Exception("请输入桶号");
                }
                var pallNo = db.Queryable<SysPallets>().Max(m => m.PalletNo);
                var str = pallNo.Substring(3, 5);
                string remove = pallNo.Substring(0, 3);
                int sibelius = Convert.ToInt16(str);
                var num = 0;
                for (int i = 0; i < groupCount; i++)
                if (string.IsNullOrEmpty(locatNo))
                {
                    sibelius += 1;
                    if (sibelius>99999)
                    {
                        throw new Exception("托盘码位数已达上线");
                    }
                    string code = remove + Convert.ToString(sibelius).PadLeft(5, '0');
                    if (db.Queryable<SysPallets>().Count(m=>m.PalletNo == code)>=1)
                    {
                        continue;
                    }
                    var item = new SysPallets
                    {
                        PalletNo = code,
                        Status = "0",
                        Type = "0",
                        CreateUser = userId
                    };
                    Thread.Sleep(100);
                    num += db.Insertable(item).ExecuteCommand();
                    if (num > 0)
                    {
                        if (groupCount > 1)
                        {
                            await _operation.InsertOperation("仓库设置", "条码管理", item.PalletNo, "批量添加", "批量添加托盘信息 托盘号:" + item.PalletNo, userId);
                        }
                        else
                        {
                            await _operation.InsertOperation("仓库设置", "条码管理", item.PalletNo, "添加", "添加托盘信息 托盘号:" + item.PalletNo, userId);
                        }
                    }
                    throw new Exception("请输入储位地址");
                }
                var palletModel = db.Queryable<SysPallets>().First(w => w.PalletNo == palletNo && w.IsDel == "0");
                if (palletModel != null)
                {
                    throw new Exception("该桶号已存在");
                }
                var locatModel= db.Queryable<SysStorageLocat>().First(w => w.LocatNo == locatNo && w.IsDel == "0");
                if (locatModel == null)
                {
                    throw new Exception("储位地址不存在");
                }
                if (locatModel.Status != "0")
                {
                    throw new Exception("该储位地址非空闲状态");
                }
                var areaModel = db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.AreaNo == locatModel.AreaNo);
                if (areaModel == null)
                {
                    throw new Exception("储位地址所属区域不存在");
                }
                if (!areaModel.AreaName.Contains("净桶"))
                {
                    throw new Exception("新添加的桶只能绑定净桶区");
                }
                if (!string.IsNullOrEmpty(deviceCode))
                {
                    var areaInfo = db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.DeviceCode.Contains(deviceCode));
                    if (areaInfo == null)
                    {
                        throw new Exception("未查到设备所属区域信息");
                    }
                    //125设备是接料和混料一体机
                    if (deviceCode != "125")
                    {
                        if (!areaInfo.AreaName.Contains("接料设备"))
                        {
                            throw new Exception("只能绑定接料设备");
                        }
                        if (areaInfo.WareHouseNo != "M03")
                        {
                            throw new Exception("只有大单体车间才能绑定设备");
                        }
                    }
                }
                //开启事务
                db.BeginTran();
                return num > 0;
                palletModel = new SysPallets();
                palletModel.PalletNo = palletNo;
                palletModel.Type = "0";
                palletModel.Status = "0";
                palletModel.CreateUser = userId;
                //添加桶
                db.Insertable(palletModel).ExecuteCommand();
                var comTime = DateTime.Now;
                var model = new DataStockDetail()
                {
                    ASNNo = "",
                    Qty = 0,
                    LockQty = 0,
                    FrozenQty = 0,
                    InspectQty = 0,
                    WareHouseNo = locatModel.WareHouseNo,//所属仓库
                    RoadwayNo = "",//所属巷道
                    AreaNo = locatModel.AreaNo,//所属区域
                    LocatNo = locatModel.LocatNo,//储位地址
                    PalletNo = palletNo,
                    PalletNo2 = "",
                    PalletNo3 = "",
                    PalletTags = "0",
                    CompleteTime = comTime,
                    ProductionTime = null,
                    ExpirationTime = null,
                    Status = "0",
                    InspectMark = "0",
                    InspectStatus = "0",//待检验
                    BitPalletMark = "0",
                    PackagNo = "",
                    IsBale = "0",
                    IsBelt = "0",
                    SkuNo = "",
                    SkuName = "",
                    LotNo = "",
                    PalletStatus = "0",//净桶
                    UDF1 = deviceCode,
                    IsDel = "0",
                    CreateUser = userId,
                    CreateTime = comTime,
                    UpdateTime=comTime,
                };
                //插入库存明细
                db.Insertable(model).ExecuteCommand();
                //更新储位状态
                locatModel.Status = "1";//有物品
                db.Updateable(locatModel).ExecuteCommand();
                //提交事务
                db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
Wms/WMS.BLL/SysServer/StorageAreaServer.cs
@@ -69,11 +69,12 @@
                    TypeName = GetTypeName(m.Type),//类别名称
                    Temp = m.Temperature,
                    TempName = m.TemperatureInfo == null ? "" : m.TemperatureInfo.DictName,
                    DeviceCode=m.DeviceCode,
                    CreateTime = m.CreateTime,
                    CreateUserName = m.CreateUserInfo == null ? "" : m.CreateUserInfo.RealName,
                    UpdateTime = m.UpdateTime,
                    UpdateUserName = m.UpdateUserInfo == null ? "" : m.UpdateUserInfo.RealName
                }).ToList();
                }).OrderBy(w=>w.WareHouseNo).OrderBy(w => w.AreaNo).ToList();
            }
            catch (Exception e)
            {
@@ -147,35 +148,20 @@
        {
            try
            {
                string str = "";
                //判断所属仓库是否为立体库
                if (model.WareHouseNo != "W01")
                string str = "";
                var area = Db.Queryable<SysStorageArea>().First(a => a.IsDel == "0" && a.AreaNo == model.AreaNo);
                if (area != null)
                {
                    str = "-1:所属仓库不为立体库,请重新选择!";
                    return str;
                    throw new Exception("当前区域编码对应的区域已存在");
                }
                //获取立体库最大编码
                //var area = Db.Queryable<SysStorageArea>().Max(a => a.Id)(a => a.IsDel == "0" && a.WareHouseNo == "W01");
                var area = Db.Queryable<SysStorageArea>().Where(a => a.IsDel == "0" && a.WareHouseNo == "W01").OrderByDescending(a=>a.CreateTime).First();
                //验证是否存在立体库第一条区域信息
                if (area == null)
                if (!string.IsNullOrEmpty(model.DeviceCode))
                {
                    model.AreaNo = "A01";
                }
                else
                {
                    var arr = area.AreaNo.Split("A");
                    int a = int.Parse(arr[1]) + 1;
                    //判断是否小于10
                    if (a < 10)
                    var area2 = Db.Queryable<SysStorageArea>().First(a => a.IsDel == "0" && a.DeviceCode == model.AreaNo);
                    if (area2 != null)
                    {
                        model.AreaNo = "A0" + (int.Parse(arr[1]) + 1).ToString();
                        throw new Exception("当前设备编码对应的区域已存在");
                    }
                    else
                    {
                        model.AreaNo = "A" + (int.Parse(arr[1]) + 1).ToString();
                    }
                }
                Db.BeginTran();
@@ -184,6 +170,7 @@
                {
                    AreaNo = model.AreaNo, //区域编码
                    AreaName = model.AreaName, //区域名称
                    DeviceCode=model.DeviceCode,//设备编码
                    WareHouseNo = model.WareHouseNo, //所属仓库
                    RoadwayNo = null, //所属巷道
                    Status = model.Status, //是否启用
@@ -220,16 +207,24 @@
        /// <param name="temp">存储环境</param>
        /// <param name="userId">操作人</param>
        /// <returns>是否成功</returns>
        public bool EditStorageArea(int id, string name, int priority, string type, string temp, int userId)
        public bool EditStorageArea(int id, string name, int priority, string type, string temp,string deviceCode, int userId)
        {
            try
            {
                //判断除当前id信息以外是否含有编号和名称
                var bol = AreaRst.GetAllAsync()
                    .Any(m => m.Id != id && m.AreaName == name.Trim());
                if (bol)
                //var bol = AreaRst.GetAllAsync()
                //    .Any(m => m.Id != id && m.AreaName == name.Trim());
                //if (bol)
                //{
                //    throw new Exception("当前区域号或区域名称已存在");
                //}
                if (!string.IsNullOrEmpty(deviceCode))
                {
                    throw new Exception("当前区域号或区域名称已存在");
                    var bol2 = AreaRst.GetAllAsync().Any(m => m.Id != id && m.DeviceCode == deviceCode.Trim());
                    if (bol2)
                    {
                        throw new Exception("当前设备编码对应的区域已存在");
                    }
                }
                var area = AreaRst.GetOneById(id);
@@ -242,6 +237,7 @@
                area.Priority = priority;
                area.Type = type;
                area.Temperature = temp;
                area.DeviceCode = deviceCode;
                area.UpdateUser = userId;
                area.UpdateTime = DateTime.Now;
                var num = AreaRst.Edit(area);
@@ -314,17 +310,20 @@
                var str = "";
                switch (code)
                {
                    case "0":
                        str = "净桶区";
                        break;
                    case "1":
                        str = "成品区";
                        str = "预混区";
                        break;
                    case "2":
                        str = "原料区";
                        str = "半成品区";
                        break;
                    case "3":
                        str = "包材区";
                        str = "脏桶区";
                        break;
                    case "4":
                        str = "空托区";
                        str = "设备区";
                        break;
                    default:
                        str = "";
Wms/WMS.BLL/SysServer/StorageLocatServer.cs
@@ -87,6 +87,8 @@
                    Layer = m.Layer,
                    Height = m.Height,
                    Weight = m.Weight,
                    AisleOne=m.AisleOne,
                    AisleTwo=m.AisleTwo,
                    TempName = m.TemperatureInfo == null ? "" : m.TemperatureInfo.DictName,
                    CreateTime = m.CreateTime,
                    CreateUserName = m.CreateUserInfo == null ? "" : m.CreateUserInfo.UserName,
@@ -233,33 +235,48 @@
            try
            {
                var q = 0;
                // 排(组)循环
                for (int i = 1; i <= model.Row; i++)
                List<SysStorageLocat> _list = new List<SysStorageLocat>();
                // 列循环
                for (int z = 1; z <= model.Col; z++)
                {
                    // 列循环
                    for (int z = 1; z <= model.Col; z++)
                    var locatInfo = new SysStorageLocat()
                    {
                        q += await LocatRst.AddAsync(new SysStorageLocat()
                        {
                            // 区域+排+列+层
                            LocatNo = model.AreaNo + i.ToString().PadLeft(2, '0') + z.ToString().PadLeft(2, '0') + "01",
                            WareHouseNo = model.HouseNo,
                            RoadwayNo = "",
                            AreaNo = model.AreaNo,
                            Status = "0",
                            AisleOne = "1",
                            AisleTwo = "",
                            Flag = "0",
                            Depth = z.ToString(),
                            Row = i,
                            Column = z,
                            Layer = 1,
                            CreateUser = userId
                        }); ;
                    }
                        // 区域+排+列+深度
                        LocatNo = model.AreaNo + model.Row.ToString().PadLeft(3, '0') + z.ToString().PadLeft(2, '0'),
                        WareHouseNo = model.HouseNo,
                        RoadwayNo = "",
                        AreaNo = model.AreaNo,
                        Status = "0",
                        AisleOne = "",
                        AisleTwo = "",
                        Flag = "0",
                        Depth = "1",
                        Row = model.Row,
                        Column = z,
                        Layer = 1,
                        CreateUser = userId
                    };
                    _list.Add(locatInfo);
                }
                return q;
                foreach (var item in _list)
                {
                    if (model.AisleNum > 0)
                    {
                        if (item.LocatNo != _list[0].LocatNo)
                        {
                            item.AisleOne = _list[0].LocatNo;
                        }
                        if (model.AisleNum > 1)
                        {
                            if (item.LocatNo != _list[model.Col-1].LocatNo)
                            {
                                item.AisleTwo = _list[model.Col - 1].LocatNo;
                            }
                        }
                    }
                    await LocatRst.AddAsync(item);
                }
                return _list.Count;
            }
            catch (Exception e)
            {
@@ -872,6 +889,6 @@
        }
        #endregion
        #endregion
    }
}
Wms/WMS.DAL/Common.cs
@@ -232,9 +232,9 @@
                    var list = DataContext.Db.Queryable<BllStockCheck>().Where(m => m.CRNo.StartsWith("CR")).ToList();
                    orderNo = list.Select(a => a.CRNo).Max();
                }
                else if (codeFlag == InOutFlag.TK.ToString())//任务
                else if (codeFlag == InOutFlag.TN.ToString())//任务
                {
                    var list = DataContext.Db.Queryable<LogTask>().Where(m => m.TaskNo.StartsWith("TK")).ToList();
                    var list = DataContext.Db.Queryable<LogTask>().Where(m => m.TaskNo.StartsWith("TN")).ToList();
                    orderNo = list.Max(m=>m.TaskNo);
                }
                else if (codeFlag == InOutFlag.EX.ToString())//异常
@@ -478,7 +478,8 @@
        /// 任务
        /// </summary>
        [Description("任务")]
        TK,
        TN,
        /// <summary>
        /// 异常号 
        /// </summary>
Wms/WMS.Entity/DataEntity/DataStockDetail.cs
@@ -276,5 +276,9 @@
        /// </summary>           
        public string Demo { get; set; }
        /// <summary>
        /// 设备编码
        /// </summary>
        public string UDF1 { get; set; }
    }
}
Wms/WMS.Entity/LogEntity/LogTask.cs
@@ -175,5 +175,11 @@
        /// </summary>           
        public string FinishIsPick { get; set; }
        /// <summary>
        /// Desc:批次号
        /// Default:
        /// Nullable:True
        /// </summary>
        public string LotNo { get; set; }
    }
}
Wms/WMS.Entity/SysEntity/SysStorageArea.cs
@@ -48,7 +48,7 @@
        /// </summary> 
        public int Priority { get; set; }
        /// <summary>
        /// 类别 1:存储区 2:周转区 3:检验区 4 拣货区 等  or 1 原料区 2 包材区 3 成品区 4:空托区
        /// 类别 0:净桶区 1:预混区 2:半成品区 3:脏桶区
        /// Default:
        /// Nullable:False
        /// </summary> 
@@ -59,6 +59,10 @@
        /// Nullable:True
        /// </summary> 
        public string Temperature { get; set; }
        /// <summary>
        /// 设备编码
        /// </summary>
        public string DeviceCode { get; set; }
        [Navigate(NavigateType.OneToOne, nameof(WareHouseNo),nameof(SysWareHouse.WareHouseNo))]
Wms/WMS.IBLL/IBllQualityServer/IQualityInspectServer.cs
@@ -4,6 +4,7 @@
using System.Text;
using Model.ModelDto.BllQualityDto;
using WMS.Entity.BllQualityEntity;
using WMS.Entity.DataEntity;
namespace WMS.IBLL.IBllQualityServer
{
@@ -25,6 +26,11 @@
        /// <returns></returns>
        int InsertQuality(BllQualityInspect model);
        /// <summary>
        /// 获取库存批次号集合
        /// </summary>
        /// <returns></returns>
        public List<DataStockDetail> GetLotNoList();
        #endregion
    }
}
Wms/WMS.IBLL/IBllTransServer/INoticeServer.cs
@@ -12,21 +12,21 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ErpModel CreateAsn(AsnInfo model);
        public ErpModel CreateAsnWork(AsnInfo model);
        /// <summary>
        /// 任务完成
        /// 任务完成反馈
        /// </summary>
        /// <param name="TaskNo"></param>
        /// <param name="Status"></param>
        /// <returns></returns>
        public ErpModel FinishTask(string TaskNo, string Status);
        public ErpModel RCSFinishTask(string TaskNo, string Status);
        /// <summary>
        /// 下发出库单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public SoResInfo ErpAddExportNotice(SoInfo model);
        public SoResInfo CreateSoWork(SoInfo model);
    }
}
Wms/WMS.IBLL/IBllTransServer/IRcsServer.cs
@@ -1,10 +1,62 @@
using System;
using Model.InterFaceModel;
using System;
using System.Collections.Generic;
using System.Text;
using static Model.InterFaceModel.RCSModel;
namespace WMS.IBLL.IBllTransServer
{
    class IRcsServer
    public interface IRcsServer
    {
        /// <summary>
        /// RCS叫桶
        /// </summary>
        /// <param name="warehouseno">库区</param>
        /// <param name="type">叫料类型</param>
        /// <returns></returns>
        public void GetPalletNo(Pallnetmsg pallnetmsg, string url, out string taskNo);
        /// <summary>
        /// 将净桶改为脏桶并拉到脏桶区
        /// </summary>
        /// <param name="PalletNo"></param>
        /// <returns></returns>
        public void ChangePalletStatus(string PalletNo, string url);
        /// <summary>
        /// MES下发清洗锁定脏桶
        /// </summary>
        /// <param name="pallnetmsg"></param>
        public void CleanPallet(Pallnetmsg pallnetmsg, string url);
        /// <summary>
        /// 申请储位
        /// </summary>
        /// <param name="PalletNo"></param>
        /// <returns></returns>
        public void ApplyLocatNo(Pallnetmsg pallnetmsg, string url ,out string taskNo);
        /// <summary>
        /// RCS反馈任务完成
        /// </summary>
        /// <param name="TaskNo"></param>
        /// <param name="Status"></param>
        void RCSFinishTask(string taskNo, string status, string comeFrom, int userId = 0);
        /// <summary>
        /// 手动取消任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        void CancelTask(string taskNo, int userId);
        /// <summary>
        /// 手动下发任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        void DownTask(string taskNo, int userId, string url);
    }
}
Wms/WMS.IBLL/IDataServer/IStockDetailServer.cs
@@ -23,7 +23,7 @@
        /// <param name="bitBoxMark">零箱标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        List<StockDetailDto> 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);
        List<StockDetailDto> GetBindList(string wareHouseName, string areaName, string locatNo, string palletNo, string lotNo);
        /// <summary>
        /// 导出托盘明细
@@ -40,5 +40,10 @@
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        List<DataStockDetail> GetBindListDaoChu(string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus);
        /// <summary>
        /// 添加托盘库存明细
        /// </summary>
        public void InsertStockDetail(string PalletNo, string WareHouseNo, string AreaNo, string LocatNo, string PalletStatus, string SkuNo, string SkuName, string LotNo, int userId);
    }
}
Wms/WMS.IBLL/ISysServer/IPalletsServer.cs
@@ -28,11 +28,11 @@
        /// <returns></returns>
        string GetPalletsNo(string palletNo);
        /// <summary>
        /// 添加托盘表信息
        /// 添加桶信息并增加库存
        /// </summary>
        /// <param name="groupCount">组数</param>
        /// <param name="userId">操作人</param>
        /// <returns></returns>
        Task<bool> AddPallets(int groupCount,int userId);
        void AddPallets(string palletNo, string locatNo,string deviceCode, int userId);
    }
}
Wms/WMS.IBLL/ISysServer/IStorageAreaServer.cs
@@ -60,7 +60,7 @@
        /// <param name="temp">存储环境</param>
        /// <param name="userId">操作人</param>
        /// <returns>是否成功</returns>
        bool EditStorageArea(int id,string name, int priority, string type, string temp, int userId);
        bool EditStorageArea(int id,string name, int priority, string type, string temp, string deviceCode, int userId);
        /// <summary>
        /// 修改区域状态
Wms/Wms/Controllers/BllCheckController.cs
@@ -16,6 +16,7 @@
using Model.ModelVm.BllSoVm;
using Wms.Tools;
using System.Collections;
using WMS.IBLL.IBllTransServer;
namespace Wms.Controllers
{
@@ -34,6 +35,8 @@
        private readonly IWarehouseOutsidePalletsServer _stockPallet; //库外托盘
        private readonly IStockFreectSetve _freect; //解冻\冻结
        private readonly IRcsServer _rcsserver;//RCS相关任务
        /// <summary>
        /// 构造函数
        /// </summary>
@@ -43,7 +46,7 @@
        /// <param name="logSvc">库内操作日志Svc</param>
        /// <param name="stockPallet">库外托盘</param>
        /// <param name="freect">解冻\冻结</param>
        public BllCheckController(IOptions<ApiUrlConfig> setting, IStockCheckServer stockCheckSvc, IStockCheckLogServer stockCheckLogSvc, ITaskServer taskSvc, IOperationCRServer logSvc, IWarehouseOutsidePalletsServer stockPallet, IStockFreectSetve freect)
        public BllCheckController(IOptions<ApiUrlConfig> setting, IStockCheckServer stockCheckSvc, IStockCheckLogServer stockCheckLogSvc, ITaskServer taskSvc, IOperationCRServer logSvc, IWarehouseOutsidePalletsServer stockPallet, IStockFreectSetve freect, IRcsServer rcsserver)
        {
            _config = setting.Value;
            _stockCheckSvc = stockCheckSvc;
@@ -52,6 +55,7 @@
            _logSvc = logSvc;
            _stockPallet = stockPallet;
            _freect = freect;
            _rcsserver = rcsserver;
        }
        #region 盘点单据
@@ -493,7 +497,7 @@
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                _stockCheckSvc.CancelMoveTask(model.taskNo, int.Parse(userId));
                _rcsserver.CancelTask(model.taskNo, int.Parse(userId));
                return Ok(new { code = 0, msg = "成功取消任务", data = "" });
            }
Wms/Wms/Controllers/BllQualityController.cs
@@ -293,5 +293,25 @@
            }
        }
        #endregion
        /// <summary>
        /// 获取库存批次号集合
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetLotNoList()
        {
            try
            {
                var bolls = _qualityServer.GetLotNoList();
                return Ok(new { code = 0, msg = "批次号集合", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
    }
}
Wms/Wms/Controllers/BllSoController.cs
@@ -724,7 +724,7 @@
        {
            try
            {
                var type = new List<string>(){"1","4"};
                var type = new List<string>(){"1","3","4"};
                var bolls = _taskSvc.GetTaskList( type, model.Type,model.Status,model.TaskNo,model.IsSuccess,model.PalletNo,model.Msg,model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "出库任务信息", data = bolls });
Wms/Wms/Controllers/DownApiController.cs
@@ -16,6 +16,11 @@
using WMS.Entity.BllTaskEntity;
using WMS.IBLL.IBllTaskServer;
using Model.ModelVm.BllTaskVm;
using static Model.InterFaceModel.RCSModel;
using WMS.IBLL.IBllTransServer;
using Microsoft.Extensions.Logging;
using ZXing.QrCode.Internal;
using Model.ModelVm.BllCheckVm;
namespace Wms.Controllers
{
@@ -33,7 +38,9 @@
        private readonly ITaskServer _taskSvc;//任务Svc
        private readonly IBllTaskSyncServer _taskSyncSvc;//任务同步Svc
        private readonly IWaveMageServer _waveSvc;//任务同步Svc
        public DownApiController(IOptions<ApiUrlConfig> setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IBllTaskSyncServer taskSyncSvc, IWaveMageServer waveSvc)
        private readonly IRcsServer _rcsserver;//RCS相关任务
        private readonly INoticeServer _noticeSvc;//二楼单据相关
        public DownApiController(IOptions<ApiUrlConfig> setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IBllTaskSyncServer taskSyncSvc, IWaveMageServer waveSvc, IRcsServer rcsserver, INoticeServer noticeSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
@@ -42,6 +49,8 @@
            _taskSvc = taskSvc;
            _taskSyncSvc = taskSyncSvc;
            _waveSvc = waveSvc;
            _rcsserver = rcsserver;
            _noticeSvc = noticeSvc;
        }
        #region WMS接口 调用下游系统接口 
@@ -641,5 +650,477 @@
        #endregion
        #region 二楼业务
        /// <summary>
        /// RCS叫桶
        /// </summary>
        /// <param name="pallmsg"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetPalletNo(Pallnetmsg pallmsg)
        {
            var logStr = $@".\log\AGV\AGV申请叫桶" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(pallmsg);
                LogFile.SaveLogToFile($"AGV申请叫桶-请求报文:( {jsonData} ),", logStr);
                if (string.IsNullOrWhiteSpace(pallmsg.Location))
                {
                    resultModel = new AgvResultModel { code = "1", message = "叫料位置为空!", data = "", reqCode = "" };
                    var jsonData3 = JsonConvert.SerializeObject(resultModel);
                    LogFile.SaveLogToFile($"AGV申请叫桶-返回报文:( {jsonData3} ),", logStr);
                    return Ok(resultModel);
                }
                if (string.IsNullOrWhiteSpace(pallmsg.Type))
                {
                    resultModel = new AgvResultModel { code = "1", message = "任务类型为空!", data = "", reqCode = "" };
                    var jsonData4 = JsonConvert.SerializeObject(resultModel);
                    LogFile.SaveLogToFile($"AGV申请叫桶-返回报文:( {jsonData4} ),", logStr);
                    return Ok(resultModel);
                }
                string taskNo = "";
                //具体处理方法
                _rcsserver.GetPalletNo(pallmsg, _config.AgvHost + _config.GenAgvSchedulingTask, out taskNo);
                resultModel = new AgvResultModel { code = "0", message = "叫桶成功!", data = taskNo, reqCode = "" };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV申请叫桶-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"AGV申请叫桶异常:( {e.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = e.Message, data = "", reqCode = "" };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV申请叫桶-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
        }
        /// <summary>
        /// RCS申请储位
        /// </summary>
        /// <param name="pallmsg"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ApplyLocatNo(Pallnetmsg pallmsg)
        {
            var logStr = $@".\log\AGV\AGV申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(pallmsg);
                LogFile.SaveLogToFile($"AGV申请储位-请求报文:( {jsonData} ),", logStr);
                if (string.IsNullOrWhiteSpace(pallmsg.Location))
                {
                    resultModel = new AgvResultModel { code = "1", message = "申请位置为空!", data = "", reqCode = "" };
                    var jsonData3 = JsonConvert.SerializeObject(resultModel);
                    LogFile.SaveLogToFile($"AGV申请储位-返回报文:( {jsonData3} ),", logStr);
                    return Ok(resultModel);
                }
                if (string.IsNullOrWhiteSpace(pallmsg.Type))
                {
                    resultModel = new AgvResultModel { code = "1", message = "任务类型为空!", data = "", reqCode = "" };
                    var jsonData3 = JsonConvert.SerializeObject(resultModel);
                    LogFile.SaveLogToFile($"AGV申请储位-返回报文:( {jsonData3} ),", logStr);
                    return Ok(resultModel);
                }
                //if (string.IsNullOrWhiteSpace(pallmsg.PalletNo))
                //{
                //    resultModel = new AgvResultModel { code = "1", message = "申请桶号为空!", data = "", reqCode = "" };
                //    var jsonData3 = JsonConvert.SerializeObject(resultModel);
                //    LogFile.SaveLogToFile($"AGV申请储位-返回报文:( {jsonData3} ),", logStr);
                //    return Ok(resultModel);
                //}
                string taskNo = "";
                //具体处理方法
                _rcsserver.ApplyLocatNo(pallmsg, _config.AgvHost + _config.GenAgvSchedulingTask, out taskNo);
                resultModel = new AgvResultModel { code = "0", message = "申请储位成功!", data = taskNo, reqCode = "" };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV申请储位-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"AGV申请储位异常:( {e.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = e.Message, data = "", reqCode = "" };
                var jsonData3 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV申请储位-返回报文:( {jsonData3} ),", logStr);
                return Ok(resultModel);
            }
        }
        /// <summary>
        /// 将净桶改为脏桶并拉到脏桶区
        /// </summary>
        /// <param name="pallmsg"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ChangePalletStatus(Pallnetmsg pallmsg)
        {
            var result = new ErpModel { Success = -1, Message = "", };
            try
            {
                if (string.IsNullOrWhiteSpace(pallmsg.PalletNo))
                {
                    result.Message = "桶编号不能为空!";
                    return Ok(result);
                }
                _rcsserver.ChangePalletStatus(pallmsg.PalletNo, _config.AgvHost + _config.GenAgvSchedulingTask);
                result.Success = 0;
                result.Message = "操作成功!";
                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }
        /// <summary>
        /// MES下发清洗锁定脏桶
        /// </summary>
        /// <param name="pallmsg"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CleanPallet(Pallnetmsg pallmsg)
        {
            var result = new ErpModel { Success = -1, Message = "", };
            try
            {
                if (string.IsNullOrWhiteSpace(pallmsg.Location))
                {
                    result.Message = "叫料位置为空!";
                    return Ok(result);
                }
                if (string.IsNullOrWhiteSpace(pallmsg.PalletNo))
                {
                    result.Message = "桶号为空!";
                    return Ok(result);
                }
                _rcsserver.CleanPallet(pallmsg, _config.AgvHost + _config.GenAgvSchedulingTask);
                result.Success = 0;
                result.Message = "叫桶成功!";
                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }
        /// <summary>
        /// 入库单据下发
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        //[Authorize]
        [HttpPost]
        public IActionResult CreateAsnWork(AsnInfo model)
        {
            var result = new ErpModel { Success = -1, Message = "" };
            try
            {
                /*var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }*/
                result = _noticeSvc.CreateAsnWork(model);
                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }
        #region Agv任务完成反馈
        /// <summary>
        /// 任务开始
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult start(AgvTaskDto model)
        {
            //记录log
            var logStr = $@".\log\AGV\任务执行通知" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务开始-请求报文:( {jsonData} ),", logStr);
                //具体处理方法
                resultModel = new AgvResultModel { code = "0", message = "成功", reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务开始-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception ex)
            {
                LogFile.SaveLogToFile($"AGV任务执行通知-任务开始-异常:( {ex.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = ex.Message, reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务开始-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
        }
        /// <summary>
        /// 走出储位
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult outbin(AgvTaskDto model)
        {
            //记录log
            var logStr = $@".\log\AGV\任务执行通知" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"AGV任务执行通知-走出储位-请求报文:( {jsonData} ),", logStr);
                //具体处理方法
                resultModel = new AgvResultModel { code = "0", message = "成功", reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-走出储位-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception ex)
            {
                LogFile.SaveLogToFile($"AGV任务执行通知-走出储位-异常:( {ex.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = ex.Message, reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-走出储位-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
        }
        /// <summary>
        /// 任务结束
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult end(AgvTaskDto model)
        {
            //记录log
            var logStr = $@".\log\AGV\任务执行通知" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务结束-请求报文:( {jsonData} ),", logStr);
                //具体处理方法
                _rcsserver.RCSFinishTask(model.taskCode, "1", "AGV");
                resultModel = new AgvResultModel { code = "0", message = "成功", reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务结束-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception ex)
            {
                LogFile.SaveLogToFile($"AGV任务执行通知-任务结束-异常:( {ex.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = ex.Message, reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务结束-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
        }
        /// <summary>
        /// 任务单取消
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult cancel(AgvTaskDto model)
        {
            //记录log
            var logStr = $@".\log\AGV\任务执行通知" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务单取消-请求报文:( {jsonData} ),", logStr);
                //具体处理方法
                resultModel = new AgvResultModel { code = "0", message = "成功", reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务单取消-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception ex)
            {
                LogFile.SaveLogToFile($"AGV任务执行通知-任务单取消-异常:( {ex.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = ex.Message, reqCode = model.reqCode };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"AGV任务执行通知-任务单取消-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
        }
        #endregion
        /// <summary>
        /// 出库单据下发
        /// </summary>
        /// <param name="model">出库单信息</param>
        /// <returns></returns>
        //[Authorize]
        [HttpPost]
        public IActionResult CreateSoWork(SoInfo model)
        {
            try
            {
                /*var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }*/
                SoResInfo result = _noticeSvc.CreateSoWork(model);
                return Ok(result);
            }
            catch (Exception e)
            {
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }
        /// <summary>
        /// 手动下发小车任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult SendAgvTaskWms(CheckTaskVm model)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                _rcsserver.DownTask(model.taskNo, int.Parse(userId), _config.AgvHost + _config.GenAgvSchedulingTask);
                return Ok(new { code = 0, msg = "重新下发已完成", data = "" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        /// <summary>
        /// 手动完成小车任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinshAgvTaskWms(CheckTaskVm model)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                //具体处理方法
                _rcsserver.RCSFinishTask(model.taskNo, "1", "WMS");
                return Ok(new { code = 0, msg = "重新下发已完成", data = "" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        /// <summary>
        /// 手动取消AGV移库任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CancelAgvTaskWms(CheckTaskVm model)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                _rcsserver.CancelTask(model.taskNo, int.Parse(userId));
                return Ok(new { code = 0, msg = "成功取消任务", data = "" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        #endregion
    }
}
Wms/Wms/Controllers/StatisticalController.cs
@@ -98,11 +98,11 @@
        /// <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 wareHouseName,string areaName,string locatNo,string palletNo, string lotNo)
        {
            try
            {
                List<StockDetailDto> boxInfoList = _stockDetail.GetBindList(skuNo, skuName, palletNo, lotNo, boxNo, status, inspectMark, bitPalletMark, bitBoxMark, inspectStatus, ownerNo, ownerName, startTime, endTIme);
                List<StockDetailDto> boxInfoList = _stockDetail.GetBindList(wareHouseName,areaName,locatNo,palletNo, lotNo);
                return Ok(new { data = boxInfoList, code = 0, msg = "获取托盘明细成功" });
            }
            catch (Exception e)
@@ -434,5 +434,39 @@
        }
        #endregion
        #region 二楼业务
        /// <summary>
        /// 添加托盘库存明细
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult InsertStockDetail(StockDetailDto model)
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    throw new Exception("未获取到用户信息");
                }
                _stockDetail.InsertStockDetail(model.PalletNo, model.WareHouseNo, model.AreaNo, model.LocatNo, model.PalletStatus, model.SkuNo, model.SkuName, model.LotNo, int.Parse(userId));
                return Ok(new { code = 0, count = 0, msg = "添加成功", data = "" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        #endregion
    }
}
Wms/Wms/Controllers/SysController.cs
@@ -810,7 +810,7 @@
                {
                    return Ok(new { code = 1, msg = "为获取到当前操作人信息" });
                }
                var bolls = _areaSvc.EditStorageArea(model.Id, model.AreaName, model.Priority, model.Type, model.Temperature, int.Parse(userId));
                var bolls = _areaSvc.EditStorageArea(model.Id, model.AreaName, model.Priority, model.Type, model.Temperature, model.DeviceCode, int.Parse(userId));
                if (bolls)
                {
                    SysStorageArea area = _areaSvc.GetStorageArea(model.Id);
@@ -1089,7 +1089,7 @@
                    //{
                    //    return Ok(new { code = 400, ErrorMsg = "为获取到当前操作人信息" });
                    //}
                    var bolls = await _locatSvc.AddStorageLocat(model.HouseNo, model.RoadwayNo, model.AreaNo, model.Row, model.Col, model.Layer, model.Depth, 1);
                    var bolls = await _locatSvc.AddStorageLocat(model.HouseNo, model.RoadwayNo, model.AreaNo, model.Row, model.Col, model.Layer, model.Depth.ToString(), 1);
                    if (bolls > 0)
                    {
                        await _operation.InsertOperation("仓库设置", "储位管理", model.RoadwayNo, "添加", "添加储位信息 储位号:" + model.RoadwayNo, 1);
@@ -1312,7 +1312,7 @@
        /// <param name="model">模型</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> AddPallets(AddPalletVm model)
        public IActionResult AddPallets(AddPalletVm model)
        {
            try
            {
@@ -1327,15 +1327,9 @@
                {
                    return Ok(new { code = 1, msg = "为获取到当前操作人信息" });
                }
                var bolls = await _palletSvc.AddPallets(model.GroupCount, int.Parse(userId));
                if (bolls)
                {
                    return Ok(new { code = 0, msg = "添加成功", data = "" });
                }
                else
                {
                    return Ok(new { code = 1, msg = "添加失败", data = "" });
                }
                _palletSvc.AddPallets(model.PalletNo, model.LocatNo, model.DeviceCode, int.Parse(userId));
                return Ok(new { code = 0, msg = "添加成功", data = "" });
            }
            catch (Exception e)
Wms/Wms/Controllers/UpApiController.cs
@@ -14,6 +14,8 @@
using Model.ModelVm.BllCheckVm;
using WMS.DAL;
using Microsoft.AspNetCore.Authorization;
using WMS.IBLL.IBllTransServer;
using static Model.InterFaceModel.RCSModel;
namespace Wms.Controllers
{
@@ -30,13 +32,18 @@
        private readonly IArrivalNoticeServer _arrivalNoticeSvc;
        private readonly IStockCheckServer _stockCheckSvc;//盘点单Svc 
        private readonly IProcurePlanServer _procurePlanSvc;//采购单Svs
        public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc, IProcurePlanServer procurePlanSvc)
        private readonly IRcsServer _rcsserver;//RCS相关任务
        private readonly INoticeServer _noticeSvc;//二楼单据相关
        public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc, IProcurePlanServer procurePlanSvc,IRcsServer rcsserver, INoticeServer noticeSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
            _arrivalNoticeSvc = arrivalNoticeServer;
            _stockCheckSvc = stockCheckSvc;
            _procurePlanSvc = procurePlanSvc;
            _rcsserver = rcsserver;
            _noticeSvc = noticeSvc;
        }
        #endregion
Wms/Wms/Tools/ApiUrlConfig.cs
@@ -20,6 +20,11 @@
        /// </summary>
        public string BoxHost { get; set; }
        /// <summary>
        /// Agv的IP
        /// </summary>
        public string AgvHost { get; set; }
        #region 上游系统
        /// <summary>
@@ -64,6 +69,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
@@ -11,9 +11,13 @@
    //"ConnectionString": "Server=47.95.120.93;Database=WMS_JC09;User ID=sa;password=boxline!@#; Integrated Security=True;",
    //"ConnectionString": "Server=47.95.120.53;Database=WMS_JC09;User ID=sa;Password=boxline!@#;Integrated Security=False;",
    //"ConnectionString": "Server=192.168.62.106;Database=WMS_JC24;User ID=sa;Password=sql2019;Integrated Security=False;",
    "ConnectionString": "Server=192.168.62.200;Database=WMS_JC23-2;User ID=sa;Password=sql2019;Integrated Security=False;"
    //"ConnectionString": "Server=192.168.62.200;Database=WMS_JC23-2;User ID=sa;Password=sql2019;Integrated Security=False;"
    //"ConnectionString": "Server=.;Database=WMS_JC09;User ID=sa;Password=sql2019;Integrated Security=False;"
    //"ConnectionString": "Data Source=DESKTOP-0EJDG95\\MSSQLSERVER1;Initial Catalog=WMS_V01;Integrated Security=True;"
    //"ConnectionString": "Server=.\\MSSQLSERVER2019;Database=WMS_JC23-2;User Id=sa;Password=admin2023@;" // SqlServer 库连接字符串
    //"ConnectionString": "Server=172.16.105.10;Database=WMS_JC23-2;User ID=sa;Password=sql2019;Integrated Security=False;"
    "ConnectionString": "Server=172.16.105.2;Database=WMS_JC23-2;User ID=sa;Password=boxline@2024;Integrated Security=False;"
    //"ConnectionString": "Server=.\\SQLSERVER;Database=WMS_JC23-2;User ID=sa;Password=admin2023@;Integrated Security=False;"
  },
  "JWTConfig": {
    "Issuer": "WYY", //Token������
@@ -25,6 +29,7 @@
    "ErpHost": "http://10.110.24.30:8081", //erpIP
    "WcsHost": "http://localhost:57061", //wcsIPhttp://localhost:57061/
    "BoxHost": "http://10.110.24.30:8081", //boxIP
    "AgvHost": "http://172.15.1.74:8182", //agvIP
    "IssueComApiUrl": "/api/WCSApi/AddTasks", //下发命令(出库、移库)
    "IssueComApiUrl2": "/api/WCSApi/AddTask", //重新下发命令(出库、移库)
@@ -34,7 +39,12 @@
    "DataChangeUrl": "/api/wmsInterface/OutStockTask", //库存变更回传
    "GetBoxUrl": "/api/wmsInterface/OutStockTask", //获取箱码信息
    "EditLocateUrl": "/api/WCSApi/EditLocatStatus" //同步修改储位信息
    "EditLocateUrl": "/api/WCSApi/EditLocatStatus", //同步修改储位信息
    // AGV
    "GenAgvSchedulingTask": "/rcms/services/rest/hikRpcService/genAgvSchedulingTask", //生成任务单接口
    "ContinueTask": "/rcms/services/rest/hikRpcService/continueTask", //继续执行任务接口
    "GenPreScheduleTask": "/rcms/services/rest/hikRpcService/genPreScheduleTask" // 预调度对外接口
  }
}