123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450 |
- using SqlSugar;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using WMS.Core._02Entity;
- using WMS.Core.AppBll;
- using WMS.Info;
- using WMS.Info.Models;
- using WMS.Util;
- namespace WMS.Core.APPBLL
- {
- public class ProductBLL : AppCoreBLL
- {
- public ResInfo StockOutPickSubimit(ProductStockOutRequest request)
- {
- using (var ctx = SysDbCore.GetDbCtx())
- {
- ctx.BeginTran();
- try
- {
- if (string.IsNullOrWhiteSpace(request?.TrayNo) || !request.BoxNos.Any() || !request.OrderLines.Any())
- throw SysExCore.ThrowFailException("参数不能为空");
- //根据托盘码获取出库单号
- var stockOutEntity = ctx.Queryable<BILL_STOCKOUT, BILL_STOCKOUTLINEDETAIL>((ord, detail) => new object[] { JoinType.Inner, ord.F_no == detail.F_pNo })
- .Where((ord, detail) => detail.F_trayNo == request.TrayNo && ord.F_orderStatus != (int)EOrderState.Executed).Select<BILL_STOCKOUT>().First();
- if(stockOutEntity==null)
- throw SysExCore.ThrowFailException("当前托盘已不存在需要出库信息,请同步销售工单后再进行拣选出库!");
- ctx.Updateable<BILL_STOCKOUTLINE>().SetColumns(it => new BILL_STOCKOUTLINE
- {
- F_editTime = DateTime.Now,
- F_editUserNo = LoginUser.UserNo,
- F_actualQty = request.OrderLines.Sum(s => s.F_actualQty)
- }).Where(w => w.F_matNo == request.OrderLines.FirstOrDefault().F_matNo && w.F_pNo == stockOutEntity.F_no).ExecuteCommand();
- var stockOutLineLst = ctx.Queryable<BILL_STOCKOUTLINE>().Where(w => w.F_pNo == stockOutEntity.F_no).ToList();
- if (!stockOutLineLst.Any(a => a.F_actualQty != a.F_planQty))
- {
- ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT
- {
- F_editTime = DateTime.Now,
- F_editUserNo = LoginUser.UserNo,
- F_orderStatus = (int)EOrderState.Executed
- }).Where(w => w.F_no == stockOutEntity.F_no).ExecuteCommand();
- }
- List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
- foreach (var box in request.BoxNos.Distinct())
- {
- var inv = ctx.Queryable<BILL_INVENTORY>().First(f => f.F_trayNo == request.TrayNo && f.F_boxNo == box && f.F_matNo == request.OrderLines.FirstOrDefault().F_matNo);
- var detail = ctx.Queryable<BILL_STOCKOUTLINEDETAIL>().Where(f => f.F_pNo == stockOutEntity.F_no && f.F_trayNo == request.TrayNo && f.F_boxNo == box).First();
- if (inv == null || detail == null)
- continue;
- inv.F_quantity = detail.F_quantity * -1;
- lstInv.Add(inv);
- }
- //更新库存
- UpdateInventory(lstInv, ctx);
- ctx.CommitTran();
- return SysExCore.GetResSucc("出库成功!");
- }
- catch (Exception ex)
- {
- ctx.RollbackTran();
- throw ex;
- }
- finally
- {
- ctx.Dispose();
- }
- }
- }
- public ResInfo Entry(ScanCodeRequest reqData)
- {
- using (var ctx = SysDbCore.GetDbCtx())
- {
- try
- {
- if (string.IsNullOrWhiteSpace(reqData?.LocationNo) || string.IsNullOrWhiteSpace(reqData.TrayNo))
- throw SysExCore.ThrowFailException("参数不能为空");
- ctx.BeginTran();
- //获取当前点位信息
- var location = GetPointInfo(reqData.LocationNo);
- if (location == null)
- throw SysExCore.ThrowFailException("请输入有效的位置码!");
- if (location.F_type != (int)EPointType.CPRKJXK && location.F_type != (int)EPointType.CPCKJXK)
- throw SysExCore.ThrowFailException("请扫描正确的成品入库拣选口!");
- if (location.F_type == (int)EPointType.YCK)//异常口处理逻辑
- {
- var curTask = ctx.Queryable<WMS_TASK>().Where(f => f.F_taskStatus < (int)ETaskStatus.TaskFinish && f.F_trayNo == reqData.TrayNo).First();
- if (curTask == null)
- throw SysExCore.ThrowFailException("当前异常任务找不到对应的入库任务!");
- ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
- {
- F_editTime = DateTime.Now,
- F_editUserNo = LoginUser.UserNo,
- F_posidFrom = reqData.LocationNo,
- F_posidcur = reqData.LocationNo,
- F_taskStatus = (int)ETaskStatus.NotIssued,
- F_posidNext = "1036"
- }).Where(w => w.F_taskNo == curTask.F_taskNo).ExecuteCommand();
- ctx.CommitTran();
- return SysExCore.GetResSucc("异常口任务生成成功");
- }
- var trayLocation = new FxBaseLocationCore().GetLociotnByTrayNo(reqData.TrayNo);
- if (trayLocation != null && trayLocation.F_status != (int)EWareCellState.Empty)
- throw SysExCore.ThrowFailException("当前托盘号已存在货位数据");
- var entryOrder = new BILL_ENTRYORDER
- {
- F_no = SerialNumberProvider.Instance.OrderNumber("wms", "RK"),
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_locationNo = reqData.LocationNo,
- F_orderStatus = (int)EOrderState.New,
- F_orderType = (int)EEntryOrderType.EntryOrderTypeProduct,
- F_trayNo = reqData.TrayNo,
- F_isBonded = reqData.TrayNo.StartsWith("B"),
- F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
- };
- var task = new WMS_TASK
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_trayNo = reqData.TrayNo,
- F_posidNext = GetFreePointInfoByType((int)EPointType.RKDFPHWDW).F_no,
- F_priority = (int)EPriority.NotUrgent,
- F_taskStatus = (int)ETaskStatus.NotIssued,
- F_taskType = (int)ETaskComType.InStock,
- F_orderType = (int)ETaskOrderType.EntryOrderTypeProduct,
- F_posidFrom = reqData.LocationNo,
- F_posidcur = reqData.LocationNo,
- F_EquipmentType = (int)EEquipmentType.Convey,
- F_isBonded = reqData.TrayNo.StartsWith("B"),
-
- };
- task.F_orderNo = entryOrder.F_no;
- if (location.F_type == (int)EPointType.CPCKJXK)
- {
- #region 出库拣选入库
- var invs = ctx.Queryable<BILL_INVENTORY>().Where(i => i.F_trayNo == reqData.TrayNo && i.F_quantity > 0).ToList();
- if (!invs.Any())
- throw SysExCore.ThrowFailException("当前托盘信息为空!");
- entryOrder.F_totalOrderLines = invs.Count();
- invs.ForEach(inv =>
- {
- ctx.Insertable(new BILL_ENTRYORDERLINEDETAIL
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_quantity = inv.F_quantity,
- F_matNo = inv.F_matNo,
- F_matName = inv.F_matName,
- F_matType = (int)EMatType.Product,
- F_pNo = entryOrder.F_no,
- F_trayNo = inv.F_trayNo,
- F_batchNo = inv.F_batchNo,
- F_boxNo = inv.F_boxNo,
- }).ExecuteCommand();
- });
- #endregion
- }
- if (location.F_type == (int)EPointType.CPRKJXK)
- {
- #region 组盘拣选入库
- List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
- var matInfos = ctx.Queryable<FX_wo_mstr, FX_wo_mstr_info>((wo, info) => new object[] { JoinType.Inner, wo.order_code == info.order_code })
- .Where((wo, info) => info.tray_no == reqData.TrayNo && wo.wo_status == 1).Select<FX_wo_mstr_info>().ToList();
- if (!matInfos.Any())
- throw SysExCore.ThrowFailException($"未获取到托盘号{reqData.TrayNo}组盘信息");
- matInfos.ForEach(orderLine =>
- {
- var mat = CacheFacade.GetMatInfo(orderLine.wo_part, EMatType.Product);
- ctx.Insertable(new BILL_ENTRYORDERLINEDETAIL
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_quantity = orderLine.qty,
- F_matNo = orderLine.wo_part,
- F_matName = mat?.F_matName,
- F_matType = (int)EMatType.Product,
- F_pNo = entryOrder.F_no,
- F_boxNo = orderLine.box_code,
- F_trayNo = reqData.TrayNo
- }).ExecuteCommand();
- var matDetail = ctx.Queryable<FX_wo_mstr_info>().Where(c => c.order_code == orderLine.order_code && c.wo_part == orderLine.wo_part).ToList();
- foreach (var item in matDetail)
- {
- lstInv.Add(new BILL_INVENTORY
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_matNo = item.wo_part,
- F_matType = (int)EMatType.Product,
- F_projectNo = mat.F_projectNo,
- F_quantity = item.qty,
- F_unit = mat?.F_unit,
- F_boxNo = item.box_code,
- F_matName = mat?.F_matName,
- F_trayNo = reqData.TrayNo,
- F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo,
- F_isBonded = reqData.TrayNo.StartsWith("B"),
- });
- }
- });
- entryOrder.F_totalOrderLines = matInfos.Count;
- entryOrder.F_relatedOrderNo = string.Join(",", matInfos.Select(s => s.order_code));
- ctx.Updateable<FX_wo_mstr>().SetColumns(it => new FX_wo_mstr()
- {
- edit_Time = DateTime.Now,
- edit_user = LoginUser.UserNo,
- wo_status = 2
- }).Where(w => w.order_code == matInfos.First().order_code).ExecuteCommand();
- //更新库存
- UpdateInventory(lstInv, ctx);
- #endregion
- }
- ctx.Insertable(entryOrder).ExecuteCommand();
- ctx.Insertable(task).ExecuteReturnEntity();
- ctx.CommitTran();
- return SysExCore.GetResSucc("成品入库任务生成成功");
- }
- catch (Exception ex)
- {
- ctx.RollbackTran();
- throw ex;
- }
- }
- }
- /// <summary>
- /// 工单提交验证并获取出库明细
- /// </summary>
- /// <param name="reqData"></param>
- /// <returns></returns>
- public ResInfo WorkOrderSubmit(WorkOrderRequest reqData)
- {
- if (reqData?.workOrders.Count < 1)
- {
- SysExCore.ThrowFailException("请求工单数据不能为空");
- }
- using (var ctx = SysDbCore.GetDbCtx())
- {
- try
- {
- //验证工单
- StringBuilder sb = new StringBuilder();
- sb.Append(@" <dsWorkOrderReceipt>");
- foreach (var item in reqData.workOrders)
- {
- //if (ctx.Queryable<FX_wo_mstr>().Any(c => c.wo_lot == item.wo_lot))
- // throw SysExCore.ThrowFailException($"工单{item.wo_lot}已经验证过!");
- sb.Append("<workOrderReceipt>");
- sb.Append($"<woLot>{item.wo_lot}</woLot>");
- sb.Append($"<lotserialQty>{item.wo_qty_ord}</lotserialQty> ");
- sb.Append($"<lotserial>{item.lotserial}</lotserial>");
- sb.Append($"<location>{item.location}</location>");
- sb.Append(@"</workOrderReceipt>");
- }
- sb.Append(@" </dsWorkOrderReceipt>");
- var res = WebServiceCall.callWebService(SysSetCore.GetSysSet().FxWebServiceUrl, "processQdocMessage", sb.ToString());
- if (res.Contains("<ns1:result>error</ns1:result>"))
- throw SysExCore.ThrowFailException($"工单验证失败!{string.Join(",", new TransferBLL().WebSerciceResponse(res))}");
- //string whereStr = string.Join("','", reqData.workOrders.Select(s => s.wo_lot));
-
- reqData.workOrders.ForEach(order =>
- {
- if (ctx.Queryable<FX_wo_mstr>().Any(a => a.wo_lot == order.wo_lot))
- throw SysExCore.ThrowFailException($"工单{ order.wo_lot}已存在!");
- var fxmat = FxDbCore.GetData<FX_wo_mstr>($"select * from pub.wo_mstr where wo_domain = 'AFCN' and wo_site='SUZ' and wo_lot ='{order.wo_lot}' ");
- fxmat.ForEach(mat =>
- {
- mat.order_code = SerialNumberProvider.Instance.OrderNumber("wms", "ZP");
- mat.add_Time = DateTime.Now;
- mat.add_user = LoginUser.UserNo;
- mat.wo_qty_ord = order.wo_qty_ord;
- mat.wo_qty_comp = 0;
- mat.wo_loc = order.location;
- mat.wo_lotserial = order.lotserial;
- mat.edit_Time = DateTime.Now;
- mat.wo_lot = order.wo_lot;
- var woMat = ctx.Queryable<FX_wo_mstr>().Where(a => a.wo_lot == mat.wo_lot && a.wo_part == mat.wo_part).First();
- if (woMat != null)
- {
- ctx.Updateable<FX_wo_mstr>().SetColumns(it => new FX_wo_mstr
- {
- wo_qty_ord = woMat.wo_qty_ord + order.wo_qty_ord,
- wo_status = 0,
- edit_Time = DateTime.Now,
- edit_user = LoginUser.UserNo,
- }).Where(w => w.order_code == woMat.order_code && w.wo_lot == woMat.wo_lot && w.wo_part == woMat.wo_part).ExecuteCommand();
- }
- else
- {
- ctx.Insertable(fxmat).ExecuteCommand();
- }
- });
- });
- ctx.CommitTran();
- return SysExCore.GetResSucc("验证成功!");
- }
- catch (Exception ex)
- {
- ctx.RollbackTran();
- throw ex;
- }
- }
- }
- /// <summary>
- /// 已验证工单查询
- /// </summary>
- /// <param name="lotNo"></param>
- /// <returns></returns>
- public ResInfo WorkOrderQuery(string lotNo)
- {
- var woEntity = SysDbCore.GetDbCtx().Queryable<FX_wo_mstr>().Where(w => w.wo_lot == lotNo).ToList();
- return SysExCore.GetResSucc(data: woEntity);
- }
- /// <summary>
- /// 根据栈板或箱码获取物料明细
- /// </summary>
- /// <param name="code"></param>
- /// <returns></returns>
- public ResInfo CombByFxCode(string code)
- {
- return null;
- //FxWebReference.interfaceClass interfaceClass = new FxWebReference.interfaceClass();
- ////FxWebReference.interfaceClassPortTypeClient interfaceClass = new FxWebReference.interfaceClassPortTypeClient();
- //var param = new
- //{
- // uuid = Guid.NewGuid().ToString(),
- // condition = new
- // {
- // code = code
- // },
- // dataType = "getBoxOrPalletData"
- //};
- //var res = interfaceClass.GetDataFromMes(param.ToJson());
- //var respEntity = res.ToObject<ProductResponse>();
- //if (respEntity.result != "PASS")
- // throw SysExCore.ThrowFailException(respEntity.message);
- //if (respEntity.responseData?.is_success != true)
- // throw SysExCore.ThrowFailException(respEntity.responseData.message);
- //var wo = SysDbCore.GetDbCtx().Queryable<FX_wo_mstr>().Where(c => c.add_user == LoginUser.UserNo && c.wo_qty_comp < c.wo_qty_ord && c.wo_status < 1 && SqlFunc.ContainsArray(respEntity.responseData.data.Select(S => S.pt_part).ToList(), c.wo_part)).OrderBy(o => o.add_Time).First();
- //if (wo == null)
- // throw SysExCore.ThrowFailException("找到不该物料对应的已验证工单或该托盘数量大于工单计划数量");
- //List<MatInfo> matInfos = new List<MatInfo>();
- //respEntity.responseData.data.ForEach(item =>
- //{
- // var mat = CacheFacade.GetMatInfo(item.pt_part, EMatType.Product);
- // matInfos.Add(new MatInfo
- // {
- // order_code = wo.order_code,
- // boxCode = item.box_code,
- // matNo = item.pt_part,
- // quantity = item.qty,
- // productDate = item.pro_time,
- // matType = (int)EMatType.Product,
- // matName = mat.F_matName,
- // });
- //});
- //return SysExCore.GetResSucc(data: matInfos);
- }
- /// <summary>
- /// 组盘提交
- /// </summary>
- /// <param name="reqData"></param>
- /// <returns></returns>
- public ResInfo CombSubmit(PackTrayRequest reqData)
- {
- if (!reqData.Mats.Any())
- throw SysExCore.ThrowFailException("组盘信息不能为空");
- var trayLocation = new FxBaseLocationCore().GetLociotnByTrayNo(reqData.TrayNo);
- if (trayLocation != null && trayLocation.F_status != (int)EWareCellState.Empty)
- throw SysExCore.ThrowFailException("当前托盘号已存在货位数据");
- using (var ctx = SysDbCore.GetDbCtx())
- {
- try
- {
- ctx.BeginTran();
- List<FX_wo_mstr_info> mstr_Infos = new List<FX_wo_mstr_info>();
- reqData.Mats.ForEach(mat =>
- {
- mstr_Infos.Add(new FX_wo_mstr_info
- {
- pro_time = mat.productDate,
- box_code = mat.boxCode,
- qty = mat.quantity,
- tray_no = reqData.TrayNo,
- order_code = mat.order_code,
- wo_part = mat.matNo,
- wo_part_name = mat.matName,
- });
- var woMat = ctx.Queryable<FX_wo_mstr>().OrderBy(o => o.add_Time).First(c => c.order_code == mat.order_code && c.wo_part == mat.matNo &&
- c.wo_status < 2 && c.wo_qty_ord > c.wo_qty_comp && (c.wo_qty_ord - c.wo_qty_comp) > mat.quantity);
- if(woMat==null)
- throw SysExCore.ThrowFailException($"未匹配到有效验证的工单!");
- if ((woMat.wo_qty_comp + mat.quantity) > woMat.wo_qty_ord)
- throw SysExCore.ThrowFailException($"绑盘数量不能大于工单{woMat.wo_lot}需求数量!");
- woMat.wo_qty_comp += mat.quantity;
- ctx.Updateable<FX_wo_mstr>().SetColumns(it => new FX_wo_mstr()
- {
- wo_qty_comp = woMat.wo_qty_comp
- }).Where(it => it.wo_lot == woMat.wo_lot && it.wo_part == woMat.wo_part).ExecuteCommand();
- if (ctx.Queryable<FX_wo_mstr>().Any(a => a.wo_qty_comp == a.wo_qty_ord && a.order_code == woMat.order_code && a.wo_lot == woMat.wo_lot && a.wo_part == woMat.wo_part))
- {
- ctx.Updateable<FX_wo_mstr>().SetColumns(it => new FX_wo_mstr
- {
- wo_status = 1,
- edit_user = LoginUser.UserNo,
- edit_Time = DateTime.Now
- }).Where(w => w.order_code == woMat.order_code && w.wo_lot == woMat.wo_lot && w.wo_part == woMat.wo_part).ExecuteCommand();
- }
- });
- var retCount = ctx.Insertable(mstr_Infos).ExecuteCommand();
- if (retCount < 1)
- throw SysExCore.ThrowFailException("提交失败");
- ctx.CommitTran();
- }
- catch (Exception)
- {
- ctx.RollbackTran();
- throw;
- }
- return SysExCore.GetResSucc("提交成功");
- }
- }
- /// <summary>
- /// 根据托盘和箱码获取拣选出库明细
- /// </summary>
- /// <param name="reqData"></param>
- /// <returns></returns>
- public ResInfo GetStockOutLineDetail(StockOutScanBoxCodeRequest request)
- {
- if (string.IsNullOrWhiteSpace(request.BoxCode) || string.IsNullOrWhiteSpace(request.TrayNo))
- throw SysExCore.ThrowFailException("托盘码或箱码都不能为空");
- var stockOutLines = SysDbCore.GetDbCtx().Queryable<BILL_STOCKOUTLINE, BILL_STOCKOUTLINEDETAIL>((line, detail) => new object[] { JoinType.Inner, line.F_pNo == detail.F_pNo && line.F_matNo == detail.F_matNo })
- .Where((line, detail) => detail.F_trayNo == request.TrayNo && detail.F_boxNo == request.BoxCode).Select<BILL_STOCKOUTLINE>().ToList();
- return SysExCore.GetResSucc(data: stockOutLines);
- }
- }
- }
|