using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Info; using WMS.Info.Models; namespace WMS.Core.APPBLL { public class CheckBLL : AppCoreBLL { public ResInfo GetCheckLinesByTray(string trayNo) { using (var ctx = SysDbCore.GetDbCtx()) { var line = ctx.Queryable().Where(c => c.F_trayNo == trayNo).ToList(); if (line == null || line.Count < 1) throw SysExCore.ThrowFailException("未匹配到托盘对应的盘点单号!"); var lines = ctx.Queryable().Where(c => c.F_pNo == line.First().F_pNo).ToList(); var statistical = new { checkNo = line.First().F_pNo, checkTotal = lines.Count, checkedTotal = lines.Where(c => c.F_actualQty > 0).Count(), notCheckTotal = lines.Where(c => c.F_actualQty == 0).Count() }; return SysExCore.GetResSucc("查询成功", data: new { sumEntity = statistical, checkList = line }); } } public ResInfo CheckSubmit(CheckSubmitRequest checkRequest) { using (var ctx = SysDbCore.GetDbCtx()) { try { ctx.BeginTran(); var checks = ctx.Queryable((inv, line) => new object[] { JoinType.Inner, inv.F_no == line.F_pNo }) .Where(inv => inv.F_no == checkRequest.CheckNo); if (checks.Count() < 1) throw SysExCore.ThrowFailException("未匹配到有效的盘点数据!"); if (checks.Any((inv, line) => inv.F_checkStatus == (int)ECheckStatus.Checkfinish)) throw SysExCore.ThrowFailException("该盘点单已经完成不能重复盘点!"); if (checks.Any((inv, line) => line.F_quantity != line.F_actualQty && line.F_actualQty != 0)) { ctx.Updateable().SetColumns(it => new BILL_InventoryReport { F_checkStatus = (int)ECheckStatus.Checking, F_editUserNo = LoginUser.UserNo, F_editTime = DateTime.Now }).Where(c => c.F_no == checkRequest.CheckNo); } else { ctx.Updateable().SetColumns(it => new BILL_InventoryReport { F_checkStatus = (int)ECheckStatus.Checkfinish, F_editUserNo = LoginUser.UserNo, F_editTime = DateTime.Now }).Where(c => c.F_no == checkRequest.CheckNo).ExecuteCommand(); } foreach (var item in checkRequest.checkLines) { ctx.Updateable().SetColumns(it => new BILL_InventoryReportLine { F_editTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_actualQty = item.F_actualQty }); var inv = ctx.Queryable().Where(c => c.F_matNo == item.F_matNo && c.F_trayNo == checkRequest.TrayNo).First(); if (inv.F_quantity != item.F_actualQty) { ctx.Updateable().SetColumns(it => new BILL_INVENTORY { F_editTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_quantity = item.F_actualQty }).Where(c => c.F_matNo == inv.F_matNo && c.F_trayNo == inv.F_trayNo).ExecuteCommand(); ctx.Insertable(new BILL_INVENTORYTRANSACTION { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_batchNo = inv.F_batchNo, F_boxNo = inv.F_boxNo, F_matName = inv.F_matName, F_matNo = inv.F_matNo, F_matType = inv.F_matType, F_sourceLockQty = inv.F_lockQty, F_targetLockQty = inv.F_lockQty, F_memo = inv.F_memo, F_projectNo = inv.F_projectNo, F_sourceTrayNo = inv.F_trayNo, F_targetTrayNo = checkRequest.TrayNo, F_warehouseNo = inv.F_warehouseNo, F_UID = inv.F_uid, F_sourceQuantity = inv.F_quantity, F_targetQuantity = item.F_actualQty }).ExecuteCommand(); } ctx.Updateable().SetColumns(it => new BASE_LOCATION { F_editTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_status = (int)EWareCellState.Empty, F_trayNo = string.Empty, F_matHeight = default, F_isBonded = false, }).Where(c => c.F_trayNo == checkRequest.TrayNo).ExecuteCommand(); ; } ctx.CommitTran(); return SysExCore.GetResSucc("盘点成功"); } catch (Exception) { ctx.RollbackTran(); throw; } } } public ResInfo Entry(ScanCodeRequest reqData) { using (var ctx = SysDbCore.GetDbCtx()) { try { if (string.IsNullOrWhiteSpace(reqData?.LocationNo) || string.IsNullOrWhiteSpace(reqData.TrayNo)) throw SysExCore.ThrowFailException("参数不能为空"); var inv = ctx.Queryable().Where(c => c.F_trayNo == reqData.TrayNo).ToList(); if (inv == null) throw SysExCore.ThrowFailException("未找到托盘信息,请扫码正确的托盘码"); ctx.BeginTran(); var task = new WMS_TASK { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_editTime = DateTime.Now, F_trayNo = reqData.TrayNo, F_posidTo = GetFreePointInfoByType((int)EPointType.RKDFPHWDW).F_no, F_priority = (int)EPriority.NotUrgent, F_taskStatus = (int)ETaskStatus.NotExecute, F_taskType = (int)ETaskComType.InStock, F_posidFrom = reqData.LocationNo, F_posidcur = reqData.LocationNo, F_EquipmentType = (int)EEquipmentType.Convey }; 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_totalOrderLines = inv.Count, F_orderType = (int)EEntryOrderType.EntryOrderTypeProduct, F_trayNo = reqData.TrayNo, F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo }; task.F_orderNo = entryOrder.F_no; ctx.Insertable(entryOrder).ExecuteCommand(); inv.ToList().ForEach(orderLine => { task.F_orderType = orderLine.F_matType == (int)EMatType.Mat ? (int)ETaskOrderType.EntryOrderTypeMaterial : orderLine.F_matType == (int)EMatType.Product ? (int)ETaskOrderType.EntryOrderTypeProduct : (int)ETaskOrderType.StockOutOrderTypeTray; ctx.Insertable(new BILL_ENTRYORDERLINEDETAIL { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_quantity = orderLine.F_quantity, F_matNo = orderLine.F_matNo, F_matName = orderLine.F_matName, F_matType = orderLine.F_matType, F_boxNo = orderLine.F_boxNo, F_trayNo = orderLine.F_trayNo, F_pNo = entryOrder.F_no, F_batchNo = orderLine.F_batchNo, F_UID = orderLine.F_uid }).ExecuteCommand(); }); ctx.Insertable(task).ExecuteCommand(); ////更新货位 //var upd = ctx.Updateable().SetColumns(it => new BASE_LOCATION() //{ // F_status = (int)EWareCellState.In, // F_editTime = DateTime.Now, // F_editUserNo = LoginUser.UserNo, // F_trayNo = reqData.TrayNo //}).Where(w => w.F_no == task.F_posidTo).ExecuteCommand(); //if (upd <= 0) // throw SysExCore.ThrowFailException("更新货位状态失败,请重试。"); ctx.CommitTran(); return SysExCore.GetResSucc("盘点入库任务生成成功"); } catch (Exception ex) { ctx.RollbackTran(); throw ex; } } } } }