| | |
| | | {{# if(d.Environment=='0'){ }} |
| | | <p>常温</p> |
| | | {{# } else if(d.Environment=='1') { }} |
| | | <p>低温</p> |
| | | <p>阴凉</p> |
| | | {{# } else if(d.Environment=='3') { }} |
| | | <p>干燥通风</p> |
| | | {{# } }} |
| | |
| | | <select name="Environment" id="Environment" lay-verify="" lay-verify="" lay-search> |
| | | <option value=""></option> |
| | | <option value="0">常温</option> |
| | | <option value="1">低温</option> |
| | | <option value="1">阴凉</option> |
| | | <!-- <option value="3">干燥通风</option> --> |
| | | </select> |
| | | </div> |
| | |
| | | <option value="4">不合格品出库</option> |
| | | <option value="5">中间品出库</option> |
| | | <option value="6">代储出库</option> |
| | | <option value="7">其他出库</option> |
| | | <option value="7">其它出库</option> |
| | | <option value="8">寄存出库</option> |
| | | <!-- 09 --> |
| | | <!-- <option value="0">标准销售出库</option> |
| | |
| | | </select> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="layui-inline DivCheck"> |
| | | <label class="layui-form-label">拣货方式</label> |
| | | <div class="layui-input-inline " style="width: 220px;"> |
| | | <select name="CheckVlues" id="CheckVlues" lay-filter="CheckVlues" lay-search> |
| | | <option value=""></option> |
| | | <option value="0" selected>暂存区拣货</option> |
| | | <option value="1">出库口拣货</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="layui-inline DivLoadingArea" style="margin-top: 10px;"> |
| | | <label class="layui-form-label">装车口</label> |
| | | <div class="layui-input-inline" style="width: 220px;"> |
| | |
| | | case "6": |
| | | return "代储出库"; |
| | | case "7": |
| | | return "其他出库"; |
| | | return "其它出库"; |
| | | case "8": |
| | | return "寄存出库"; |
| | | default: |
| | |
| | | area: ['1200px', '90%'], |
| | | }); |
| | | }else if(obj.event === 'outKu'){ |
| | | |
| | | $("#UnstackWay").val(0) |
| | | $("#UnstackWay").attr("disabled",false); |
| | | $("#LoadingArea").val('') |
| | | $("#PickingArea").val('') |
| | | $('.DivLoadingArea').show() |
| | | $('.DivLoadingArea').show() |
| | | $('.DivPickingArea2').show() |
| | | |
| | | form.render('select'); |
| | | var param = { |
| | | soNo: SoNo |
| | |
| | | $('.DivPickingArea2').show() |
| | | }else{ |
| | | isNeedUnpack='0' |
| | | $('.DivPickingArea2').hide() |
| | | $('.DivPickingArea2').hide() |
| | | $('.DivCheck').hide() |
| | | } |
| | | if($('#UnstackWay').val()=='1'){ |
| | | $('.DivPickingArea2').show() |
| | | $('.LoadingArea').hide() |
| | | $('.DivCheck').hide() |
| | | |
| | | |
| | | } |
| | | |
| | |
| | | }); |
| | | } |
| | | }); |
| | | $("#CheckVlues").val(0) |
| | | $("#CheckVlues").attr("disabled",false); |
| | | form.render('select'); |
| | | }else{ |
| | | $("#UnstackWay").val(1) |
| | | $("#UnstackWay").attr("disabled",true); |
| | | form.render('select'); |
| | | form.render('select'); |
| | | $("#CheckVlues").val(0) |
| | | $("#CheckVlues").attr("disabled",true); |
| | | form.render('select'); |
| | | |
| | | |
| | | $('.DivLoadingArea').hide() |
| | | |
| | |
| | | btn: ['确定', '取消'], |
| | | yes: function(index, layero) { |
| | | var pa = $('#PickingArea').val(); |
| | | var check = $('#CheckVlues').val(); |
| | | console.log("22222222222222"+check); |
| | | |
| | | console.log(pa) |
| | | if (isChongFu== true) { |
| | | isChongFu= false; |
| | |
| | | isChongFu= true; |
| | | return; |
| | | } |
| | | } |
| | | }else{if($("#PickingArea").val() == '') |
| | | { |
| | | layer.msg("请选择出库口", { |
| | | icon: 2, |
| | | time: 2000 //2秒关闭(如果不配置,默认是3秒) |
| | | }); |
| | | isChongFu= true; |
| | | return; |
| | | }} |
| | | if(isNeedUnpack == 1){ |
| | | console.log($("#PickingArea").val()) |
| | | if($('#UnstackWay').val()=='1'){ |
| | |
| | | soNo: soNo, |
| | | unstackingMode:$('#UnstackWay').val(), |
| | | outMode: pa, |
| | | checkmode:check, |
| | | loadingAddre:$('#LoadingArea').val() |
| | | }; |
| | | console.log(param); |
| | |
| | | var value = data.value; |
| | | if(value==0){ |
| | | $('.DivLoadingArea').show() |
| | | $('.DivCheck').hide() |
| | | if(isNeedUnpack=='0'){ |
| | | $('.DivPickingArea2').hide() |
| | | }else{ |
| | | $('.DivPickingArea2').show() |
| | | } |
| | | }else{ |
| | | }else{ |
| | | console.log("11111111111"); |
| | | |
| | | $('.DivLoadingArea').hide() |
| | | $('.DivPickingArea2').show() |
| | | $('.DivPickingArea2').show() |
| | | |
| | | $('.DivCheck').show() |
| | | |
| | | } |
| | | }); |
| | | |
| | |
| | | <option value="4">不合格品出库</option> |
| | | <option value="5">中间品出库</option> |
| | | <option value="6">代储出库</option> |
| | | <option value="7">其他出库</option> |
| | | <option value="7">其它出库</option> |
| | | <option value="8">寄存出库</option> |
| | | <!-- 09 --> |
| | | <!-- <option value="0">标准销售出库</option> |
| | |
| | | <option value="4">不合格品出库</option> |
| | | <option value="5">中间品出库</option> |
| | | <option value="6">代储出库</option> |
| | | <option value="7">其他出库</option> |
| | | <option value="7">其它出库</option> |
| | | <option value="8">寄存出库</option> |
| | | <!-- 09 --> |
| | | <!-- <option value="0">成品出库</option> |
| | |
| | | {field: 'CQty', title: '出库数量', align: 'center'}, |
| | | {field: 'CAllotQty', title: '分配数量', align: 'center'}, |
| | | {field: 'CFactQty', title: '下架数量', align: 'center'}, |
| | | {field: 'Qty', title: '结存数量', align: 'center'}, |
| | | {field: 'CompleteQty', title: '拣货数量', align: 'center'} |
| | | ]]; |
| | | var TotalColsSysArr=encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码 |
| | |
| | | { field: 'OwnerName', title: '货主名称', align: 'center' }, |
| | | { field: 'Qty', title: '库存数量', align: 'center', totalRow: true }, |
| | | { field: 'LockQty', title: '锁定数量', align: 'center', totalRow: true }, |
| | | { field: 'FrozenQty', title: '冻结数量', align: 'center', totalRow: true } |
| | | { field: 'FrozenQty', title: '冻结数量', align: 'center', totalRow: true }, |
| | | { field: 'InspectStatus', templet: '#buttonTp2', title: '质检状态', width: 90, align: 'center' }, |
| | | { field: 'ProductionTime', title: '生产日期', width: 130, align: 'center' }, |
| | | { field: 'ExpirationTime', title: '有效期至', width: 130, align: 'center' }, |
| | | ]]; |
| | | var TotalColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码 |
| | | //#endregion |
| | |
| | | var DetailColsArr = [[ |
| | | { field: 'PalletNo', title: '托盘号', align: 'center', width: 110, }, |
| | | { field: 'LocatNo', title: '储位地址', align: 'center', width: 100, }, |
| | | { field: 'PLCLocatNo', title: '设备地址', align: 'center', width: 100, }, |
| | | { field: 'WareHouseName', title: '所属仓库', width: 90, align: 'center' }, |
| | | { field: 'RoadwayName', title: '所属巷道', width: 90, align: 'center' }, |
| | | { field: 'AreaName', title: '所属区域', width: 90, align: 'center' }, |
| | |
| | | { field: 'SkuName', title: '物料名称', align: 'center' }, |
| | | { field: 'Standard', title: '物料规格', width: 130, align: 'center' }, |
| | | { field: 'Type', title: '物料类型', width: 130, align: 'center', templet: '#SkuType' }, |
| | | { field: 'ProductionTime', title: '生产日期', width: 130, align: 'center' }, |
| | | { field: 'ExpirationTime', title: '有效期至', width: 130, align: 'center' }, |
| | | { field: 'LotNo', title: '进厂编号', align: 'center' }, |
| | | { field: 'OwnerNo', title: '货主编码', align: 'center' }, |
| | | { field: 'OwnerName', title: '货主名称', align: 'center' }, |
| | |
| | | html += "<br/>物料名称:"+res.data.GoodsInfoList[i].SkuName; |
| | | html += "<br/>批次号: "+res.data.GoodsInfoList[i].LotNo; |
| | | html += "<br/>数量: "+res.data.GoodsInfoList[i].Qty; |
| | | html += "<br/>检验状态:"+res.data.GoodsInfoList[i].InspectStatus; |
| | | } |
| | | html += "</p>" |
| | | } |
| | |
| | | </a> |
| | | </li> |
| | | </ul> |
| | | |
| | | <ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right"> |
| | | |
| | | |
| | | <li class="layui-nav-item layui-hide layui-show-md-inline-block"> |
| | | <!-- <a href="javascript:;"> |
| | | <class="layui-nav-img"> --> |
| | | <a lay-href="set/user/info.html" id="username2">个人信息</a> |
| | | <i class="layui-icon layui-icon-down layui-nav-more"></i></a> |
| | | |
| | | </li> |
| | | |
| | | <li class="layui-nav-item layui-hide-xs" lay-unselect> |
| | | <a href="javascript:;" layadmin-event="theme"> |
| | | <i class="layui-icon layui-icon-theme"></i> |
| | |
| | | $("#token").text($.cookie('token')); |
| | | } |
| | | |
| | | |
| | | $("#username2").html("当前用户:"+localStorage.getItem('keyUserName')); |
| | | |
| | | var lastTime = new Date().getTime(); |
| | | var currentTime = new Date().getTime(); |
| | | var timeOut = 20*60*1000; |
| | |
| | | <input type="checkbox" name="IsZhengTuo" id="IsZhengTuo" lay-skin="switch" lay-text="是|否" |
| | | lay-filter="IsZhengTuo"> |
| | | </div> |
| | | <label class="layui-form-label" lang>是否连续拣货:</label> |
| | | <div class="layui-input-block"> |
| | | <input type="checkbox" name="IsCheckCon" id="IsCheckCon" lay-skin="switch" lay-text="是|否" |
| | | lay-filter="IsCheckCon"> |
| | | </div> |
| | | </div> |
| | | <div id="BoxDIv" class="layout-tab-page"> |
| | | <table class="layout-tab-content" border="" cellspacing="" cellpadding=""> |
| | |
| | | public string LocatNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 设备地址 |
| | | /// </summary> |
| | | public string PLCLocatNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 托盘号 |
| | | /// </summary> |
| | | public string PalletNo { get; set; } |
| | |
| | | public decimal RCompleteQty { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 库存数量 |
| | | /// </summary> |
| | | public decimal Qty { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 出库数量 |
| | | /// </summary> |
| | | public decimal CQty { get; set; } |
| | |
| | | /// 数量 |
| | | /// </summary> |
| | | public decimal? Qty { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 质量状态 |
| | | /// </summary> |
| | | public string InspectStatus { get; set; } |
| | | } |
| | | } |
| | |
| | | } |
| | | if (date.Id == model.CreateUser) |
| | | { |
| | | throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); |
| | | throw new Exception("复核失败,复核人员和创建质检单据人员不能相同!"); |
| | | } |
| | | int isTui = 0; |
| | | //验证入库单号是否为空 |
| | |
| | | #region 下发出库、出库完成、重新下发任务、取消任务、异常处理 |
| | | |
| | | // 下发出库(调用cs接口给他库位地址) |
| | | public List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId, string url, out string str) |
| | | public List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode,string checkmode, string loadingAddre, int userId, string url, out string str) |
| | | { |
| | | try |
| | | { |
| | |
| | | { |
| | | throw new Exception($"未找到{soNo}出库单信息"); |
| | | } |
| | | //更新出库单拣选方式 |
| | | notice.UDF1 = checkmode; |
| | | Db.Updateable(notice).ExecuteCommand(); |
| | | //所有要出库的出库分配信息(未下发的信息和待拣货的信息和部分拣货后回流入库的托盘) |
| | | var list = Db.Queryable<BllExportAllot>().Where(a => a.IsDel == "0" && a.SONo == soNo && (a.Status == "0" || a.Status == "3")).ToList(); |
| | | if (list.Count == 0) //判断是否有需要下发的出库流水 |
| | |
| | | |
| | | positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m => m.LocatNo).First(m => (m.AreaNo == "B01"|| m.AreaNo == "B02"||m.AreaNo == "B04") && m.Status == "0" && m.Flag == "0").LocatNo; |
| | | } |
| | | else if (type1.Type == "0")//成品出库 |
| | | { |
| | | if (type1.UDF1 == "0") //出库到暂存区 |
| | | { |
| | | positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m => m.LocatNo).First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo; |
| | | } |
| | | else |
| | | { |
| | | return; |
| | | } |
| | | } |
| | | else //其他单据类型都存放发货缓存区 |
| | | { |
| | | positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m => m.LocatNo).First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo; |
| | |
| | | |
| | | //库存总量 |
| | | List<MateDataStockDto> StockListDto = new List<MateDataStockDto>(); |
| | | DataStockDetail detail = new DataStockDetail(); |
| | | |
| | | foreach (var item in StockList) |
| | | { |
| | | |
| | | detail = Db.Queryable<DataStockDetail>().First(w => w.SkuNo == item.SkuNo && w.LotNo == item.LotNo && w.IsDel == "0"); |
| | | if (detail != null) |
| | | { |
| | | if (!string.IsNullOrEmpty(detail.ProductionTime.ToString())) |
| | | { |
| | | item.ProductionTime = (DateTime)detail.ProductionTime; |
| | | } |
| | | if (!string.IsNullOrEmpty(detail.ExpirationTime.ToString())) |
| | | { |
| | | item.ExpirationTime = (DateTime)detail.ExpirationTime; |
| | | } |
| | | item.InspectStatus = detail.InspectStatus; |
| | | } |
| | | |
| | | |
| | | |
| | | StockListDto.Add(item); |
| | | ////判断库存总量是否拥有物料 |
| | | //if (StockListDto.Count > 0) |
| | |
| | | categoryNo = categoryNo, //逻辑库区 |
| | | type = type |
| | | }); |
| | | foreach (var item in stockDetailsList) |
| | | { |
| | | if (!string.IsNullOrEmpty(item.LocatNo)) |
| | | { |
| | | if (item.WareHouseNo == "W01") |
| | | { |
| | | item.PLCLocatNo = GetDjAdress(item.LocatNo.Substring(1, 2), item.LocatNo.Substring(0, 2), item.LocatNo.Substring(6, 2)).ToString() + item.LocatNo.Substring(2, 2) + item.LocatNo.Substring(4, 2); |
| | | } |
| | | } |
| | | |
| | | } |
| | | return stockDetailsList; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | /// <summary> |
| | | /// 根据储位排获取跺机对应的地址排03010302 |
| | | /// </summary> |
| | | /// <param name="road">排02</param> |
| | | /// <param name="pai">排03</param> |
| | | /// <param name="dept">深度02</param> |
| | | /// <returns></returns> |
| | | public static int GetDjAdress(string road, string pai, string dept) |
| | | { |
| | | var roadNum = int.Parse(road); |
| | | var paiNum = int.Parse(pai); |
| | | var deptNum = int.Parse(dept); |
| | | |
| | | var paiVal = 0; |
| | | |
| | | // 判断排奇偶数 |
| | | if (paiNum % 2 == 0) |
| | | { |
| | | if (deptNum == 1) |
| | | { |
| | | paiVal = 3; |
| | | } |
| | | else |
| | | { |
| | | paiVal = 4; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (deptNum == 1) |
| | | { |
| | | paiVal = 2; |
| | | |
| | | } |
| | | else |
| | | { |
| | | paiVal = 1; |
| | | |
| | | } |
| | | } |
| | | |
| | | if (paiVal == 0) |
| | | { |
| | | throw new Exception("排转换失败"); |
| | | } |
| | | return paiVal; |
| | | |
| | | } |
| | | |
| | | #region 低库存预警 |
| | | |
| | |
| | | //startTime = startTime, |
| | | //endTime = endTime |
| | | }); |
| | | DataStock stock = new DataStock(); |
| | | stock = Db.Queryable<DataStock>().First(); |
| | | |
| | | //合并数据 |
| | | int a = 0; |
| | | decimal qty = 0; |
| | | foreach (var h in totalHListData) |
| | | { |
| | | if (a >= totalCListData.Count) |
| | |
| | | } |
| | | foreach (var c in totalCListData) |
| | | { |
| | | |
| | | //判断出库是否拥有相同批次 且物料相同 |
| | | if (h.LotNo == c.LotNo) |
| | | { |
| | | if (h.SkuNo == c.SkuNo && h.SkuName == c.SkuName) |
| | | { |
| | | stock = Db.Queryable<DataStock>().First(w=>w.SkuNo == h.SkuNo && w.SkuName == h.SkuName && w.LotNo == h.LotNo && w.IsDel == "0"); |
| | | if (stock != null) |
| | | { |
| | | qty = stock.Qty; |
| | | } |
| | | h.CQty = c.CQty; //出库数量 |
| | | h.CAllotQty = c.CAllotQty; //分配数量 |
| | | h.CFactQty = c.CFactQty; //下架数量 |
| | | h.CompleteQty = c.CompleteQty; //拣货数量 |
| | | //h.SONo = c.SONo; //出库单号 |
| | | h.Qty = qty; //当前库存 |
| | | |
| | | |
| | | a += 1; |
| | | |
| | |
| | | try |
| | | { |
| | | LocateInfoVm model = new LocateInfoVm(); |
| | | string status = ""; |
| | | //储位信息 |
| | | SysStorageLocat storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == locatNo && w.IsDel == "0"); |
| | | if (storageLocat == null) |
| | |
| | | goodsModel.SkuName = item.SkuName; |
| | | goodsModel.LotNo = item.LotNo; |
| | | goodsModel.Qty = item.Qty; |
| | | switch (item.InspectStatus) |
| | | { |
| | | case "0": |
| | | status = "待检验"; |
| | | break; |
| | | case "1": |
| | | status = "合格"; |
| | | break; |
| | | case "2": |
| | | status = "不合格"; |
| | | break; |
| | | } |
| | | goodsModel.InspectStatus = status; |
| | | |
| | | goodsList.Add(goodsModel); |
| | | } |
| | |
| | | goodsModel.SkuName = noticeDetail.SkuName; |
| | | goodsModel.LotNo = noticeDetail.LotNo; |
| | | goodsModel.Qty = noticeDetail.Qty; |
| | | goodsModel.InspectStatus = "待检验"; |
| | | |
| | | goodsList.Add(goodsModel); |
| | | } |
| | |
| | | /// 复核时间 |
| | | /// </summary> |
| | | public DateTime? CheckTime { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 出库拣选方式 0:AGV拉至暂存区拣选,1:出库口拣选 |
| | | /// </summary> |
| | | public string UDF1 { get; set; } |
| | | } |
| | | } |
| | |
| | | /// </summary> |
| | | /// <param name="soNo">出库单号</param> |
| | | /// <param name="outMode">出库口</param> |
| | | /// <param name="checkmode">分拣类型</param> |
| | | /// <param name="userId">操作人</param> |
| | | /// <param name="url">下发出库路径</param> |
| | | /// <param name="str">提示信息</param> |
| | | /// <returns>下发的指令集合</returns> |
| | | List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId,string url,out string str); |
| | | List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode,string checkmode, string loadingAddre, int userId,string url,out string str); |
| | | /// <summary> |
| | | /// wcs返回的成功信号或手动完成(出库成功) |
| | | /// </summary> |
| | |
| | | /// <returns></returns> |
| | | [Authorize] |
| | | [HttpGet] |
| | | public IActionResult IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre) |
| | | public IActionResult IssueOutHouse(string soNo, string unstackingMode, string outMode,string checkmode, string loadingAddre) |
| | | { |
| | | try |
| | | { |
| | |
| | | // return Ok(new { code = 1, msg = "请选择出库口" }); |
| | | //} |
| | | |
| | | var list = _exNoticeSvc.IssueOutHouse(soNo, unstackingMode, outMode, loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str); |
| | | var list = _exNoticeSvc.IssueOutHouse(soNo, unstackingMode, outMode, checkmode, loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str); |
| | | |
| | | return Ok(new { code = 0, msg = str, data = list }); |
| | | |
| | |
| | | using WMS.Entity.Context; |
| | | using WMS.IBLL.ISysServer; |
| | | using Wms.Tools; |
| | | using WMS.IBLL.ILogServer; |
| | | |
| | | |
| | | namespace Wms.Controllers |
| | |
| | | private readonly ILogger<WeatherForecastController> _logger; |
| | | private readonly IUserInforServer _userMan; |
| | | private readonly DataContext Db = new DataContext(); |
| | | private readonly IOperationSysServer _operation; //操作日志 |
| | | |
| | | public WeatherForecastController(ITokenHelper _tokenHelper, ILogger<WeatherForecastController> logger, IUserInforServer userMan) |
| | | public WeatherForecastController(ITokenHelper _tokenHelper, ILogger<WeatherForecastController> logger, IUserInforServer userMan ,IOperationSysServer operation) |
| | | { |
| | | tokenHelper = _tokenHelper; |
| | | _logger = logger; |
| | | _userMan = userMan; |
| | | |
| | | _operation = operation; //操作日志 |
| | | } |
| | | |
| | | [AllowAnonymous] |
| | |
| | | {"LoginName", model.LoginName} |
| | | }; |
| | | var tnToken = tokenHelper.CreateToken(keyValuePairs); |
| | | |
| | | _operation.InsertOperation("操作日志", "操作日志", "", "登陆", "用户登陆:"+ model.LoginName, Convert.ToInt32(userId)); |
| | | |
| | | return Ok(new { code = 200, ToKen = tnToken }); |
| | | } |
| | | else //当前账号被禁用 |