From 38a8b2931abd72ee04285794aacbea7ed7c49228 Mon Sep 17 00:00:00 2001 From: kazelee <1847801760@qq.com> Date: 星期二, 13 五月 2025 17:06:43 +0800 Subject: [PATCH] 抽检合格回库/不合格移库开发完成 --- Services/MoboxService.cs | 329 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 277 insertions(+), 52 deletions(-) diff --git a/Services/MoboxService.cs b/Services/MoboxService.cs index d2f68a6..8ad85b5 100644 --- a/Services/MoboxService.cs +++ b/Services/MoboxService.cs @@ -1,11 +1,15 @@ 锘縰sing System; +using System.Collections.Generic; +using System.Linq; using HH.WCS.Mobox3.DSZSH.Consts; +using HH.WCS.Mobox3.DSZSH.Helper; using HH.WCS.Mobox3.DSZSH.Helpers; -using HH.WCS.Mobox3.DSZSH.Helpers.Model; using HH.WCS.Mobox3.DSZSH.Models; using Newtonsoft.Json; + +using SqlSugar; using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse; @@ -383,29 +387,168 @@ } } + /// <summary> + /// 鍒涘缓鎶芥鍗�+ /// </summary> + /// <param name="model"></param> + /// <returns></returns> public static SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) { var db = DbHelper.GetDbClient(); try { + // 缁戝畾鎿嶄綔锛氭彃鍏ュ嚭搴撳崟銆佹墍鏈夌殑鍑哄簱鍗曟槑缁�+ using (var tran = db.Ado.UseTran()) { - var order = new TN_Check_Order { - S_CG_ID = model.CgId, - S_ITEM_NAME = model.ItemName, - S_BATCH_NO = model.BatchNo, - N_QTY = model.Qty, - S_END_AREA = model.EndArea, - }; + var order = new TN_Check_Order { + S_NO = model.No, + S_CG_ID = model.CgId, + S_ITEM_NAME = model.ItemName, + S_BATCH_NO = model.BatchNo, + N_COUNT = model.N_QTY, + S_END_AREA = model.EndArea, + }; - if (db.Insertable<TN_Check_Order>(order).ExecuteCommand() > 0) { - return BuildSimpleResult(0, "鎻掑叆鎶芥鍗曟垚鍔燂細" + JsonConvert.SerializeObject(order)); + if (db.Insertable<TN_Check_Order>(order).ExecuteCommand() <= 0) { + tran.RollbackTran(); + return BuildSimpleResult(2, "鐢熸垚 鎶芥鍗�澶辫触锛� + JsonConvert.SerializeObject(order)); + } + + for (int i = 0; i < model.N_QTY; i++) { + var detail = new TN_Check_Detail { + S_NO = model.No, + S_CG_ID = model.CgId, + S_BATCH_NO = model.BatchNo, + S_END_AREA = model.EndArea + }; + + if (db.Insertable<TN_Check_Detail>(detail).ExecuteCommand() <= 0) { + tran.RollbackTran(); + return BuildSimpleResult(3, "鐢熸垚 鎶芥鍗曟槑缁�澶辫触锛� + JsonConvert.SerializeObject(detail)); + } + } + + tran.CommitTran(); } - else { - return BuildSimpleResult(2, "鎻掑叆鎶芥鍗曞け璐ワ細" + JsonConvert.SerializeObject(order)); - } + return BuildSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛锛氬崟鍙�{model.No}"); } catch (Exception ex) { return BuildSimpleEx(ex); } } + + public static SimpleResult QualifiedBack(QualifiedBackInfo model) { + var db = DbHelper.GetDbClient(); + try { + + var cgDetail = db.Queryable<TN_CG_Detail>() + .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode) + .First(); + + if (cgDetail == null) { + return BuildSimpleResult(2, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡"); + } + + cgDetail.N_ITEM_STATE = 0; + cgDetail.S_ITEM_STATE = "鍚堟牸"; + + // TODO 涓嶉渶瑕佽仈绔嬩笁涓〃 + var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container> + ((l, c) => l.S_CODE == c.S_LOC_CODE) + .Where(ExprHelper.LocIsFree) + .Select((l, c) => c) + .First(); + + if (startLocCntrRel == null) { + return BuildSimpleResult(0, "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�); + } + + var endLoc = db.Queryable<TN_Location>() + .Where(ExprHelper.LocBelongsToArea(startLocCntrRel.S_CNTR_TYPE == "鎵樼洏" ? AreaName.婊℃墭瀛樻斁鍖�: + startLocCntrRel.S_CNTR_TYPE == "濂借繍绠� ? AreaName.婊$瀛樻斁鍖�: "")) + .Where(ExprHelper.LocIsFree) + .Where(ExprHelper.LocIsEmpty).First(); + + if (endLoc == null) { + return BuildSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅"); + } + + using (var tran = db.Ado.UseTran()) { + if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => + new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) { + tran.RollbackTran(); + return BuildSimpleResult(4, "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触"); + } + + if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE, + endLoc.S_CODE, TaskName.鎶芥_鍚堟牸鍥炲簱)) { + tran.RollbackTran(); + return BuildSimpleResult(5, "鍒涘缓浠诲姟澶辫触", false); + } + + tran.CommitTran(); + } + return BuildSimpleResult(0, "鐗╂枡鍚堟牸鍥炲簱浠诲姟鍒涘缓鎴愬姛"); + } + catch (Exception ex) { + return BuildSimpleEx(ex); + } + } + public static SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) { + var db = DbHelper.GetDbClient(); + try { + + var cgDetail = db.Queryable<TN_CG_Detail>() + .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode) + .First(); + + if (cgDetail == null) { + return BuildSimpleResult(2, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡"); + } + + cgDetail.N_ITEM_STATE = 2; + cgDetail.S_ITEM_STATE = "涓嶅悎鏍�; + + // TODO 涓嶉渶瑕佽仈绔嬩笁涓〃 + var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container> + ((l, c) => l.S_CODE == c.S_LOC_CODE) + .Where(ExprHelper.LocIsFree) + .Select((l, c) => c) + .First(); + + if (startLocCntrRel == null) { + return BuildSimpleResult(0, "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�); + } + + var endLoc = db.Queryable<TN_Location>() + .Where(l => l.S_AREA_CODE == model.EndArea) + .Where(ExprHelper.LocIsFree) + .Where(ExprHelper.LocIsEmpty).First(); + + if (endLoc == null) { + return BuildSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅"); + } + + using (var tran = db.Ado.UseTran()) { + if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => + new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) { + tran.RollbackTran(); + return BuildSimpleResult(4, "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触"); + } + + if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE, + endLoc.S_CODE, TaskName.鎶芥_涓嶅悎鏍肩Щ搴�) { + tran.RollbackTran(); + return BuildSimpleResult(5, "鍒涘缓浠诲姟澶辫触", false); + } + + tran.CommitTran(); + } + return BuildSimpleResult(0, "鐗╂枡涓嶅悎鏍肩Щ搴撲换鍔″垱寤烘垚鍔�); + } + catch (Exception ex) { + return BuildSimpleEx(ex); + } + } + #endregion #region Mobox 鍔熻兘 @@ -419,40 +562,49 @@ /// <returns></returns> public static SimpleResult FinishedOutbound(FinishedOutboundInfo model) { var db = DbHelper.GetDbClient(); + var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON"); try { - if (string.IsNullOrEmpty(model.No)) { + if (string.IsNullOrEmpty(orderNo)) { return BuildSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖"); } - if (model.OutboundDetails.Count == 0) { - return BuildSimpleResult(2, "鍑哄簱鍗曟槑缁嗘病鏈夐」鐩�); - } - using (var tran = db.Ado.UseTran()) { + + var cgDetailList = SelectCgByTotalQty(model); + + if (cgDetailList.Count == 0) { + return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�); + } + + // NOTE 濡傛灉鍒涘缓order鐨勬椂鍊欏氨鎸囧畾鍏蜂綋鍑哄簱鐗╂枡鐨刢ntr锛岄偅涔堝鏋滃湪鍒涘缓浠诲姟鍓嶏紝杩欎釜鐗╂枡琚敊璇娊妫�簡鎬庝箞鍔�+ foreach (var cgDetail in cgDetailList) { + var detail = new TN_Outbound_Detail { + S_NO = orderNo, + S_ITEM_CODE = cgDetail.S_ITEM_CODE, + S_BATCH_NO = cgDetail.S_BATCH_NO, + S_CNTR_CODE = cgDetail.S_CNTR_CODE, + S_END_AREA = model.EndArea + }; + + if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) { + tran.RollbackTran(); + return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail)); + } + } + var order = new TN_Outbound_Order { - S_NO = model.No, - N_FORCE = model.Forced ? 1 : 0 + S_NO = orderNo, + S_ITEM_CODE = model.ItemCode, + S_BATCH_NO = model.BatchNo, + F_QTY = model.Qty, + F_OUT_QTY = cgDetailList.Sum(a => a.F_QTY), + S_END_AREA = model.EndArea }; if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) { tran.RollbackTran(); - return BuildSimpleResult(3, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order)); - } - - foreach (var detail in model.OutboundDetails) { - var newDetail = new TN_Outbound_Detail { - S_NO = order.S_NO, - S_CG_ID = detail.CgCode, - S_BATCH_NO = detail.PatchNo, - N_QTY = detail.Qty, - N_FORCE = order.N_FORCE, - S_END_AREA = detail.EndArea - }; - if (db.Insertable<TN_Outbound_Detail>(newDetail).ExecuteCommand() <= 0) { - tran.RollbackTran(); - return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail)); - } + return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order)); } tran.CommitTran(); @@ -471,36 +623,52 @@ /// <returns></returns> public static SimpleResult FinishedOutboundForce(FinishedOutboundInfo model) { var db = DbHelper.GetDbClient(); + var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON"); try { - if (string.IsNullOrEmpty(model.No)) { + if (string.IsNullOrEmpty(orderNo)) { return BuildSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖"); } using (var tran = db.Ado.UseTran()) { - var order = new TN_Outbound_Order { - S_NO = model.No, - N_FORCE = model.Forced ? 1 : 0 - }; - if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) { - tran.RollbackTran(); - return BuildSimpleResult(3, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order)); + var cgDetailList = SelectCgByTotalQty(model); + + if (cgDetailList.Count == 0) { + return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�); } - foreach (var detail in model.OutboundDetails) { - var newDetail = new TN_Outbound_Detail { - S_NO = order.S_NO, - S_CG_ID = detail.CgCode, - S_BATCH_NO = detail.PatchNo, - N_QTY = detail.Qty, - N_FORCE = order.N_FORCE + // NOTE 濡傛灉鍒涘缓order鐨勬椂鍊欏氨鎸囧畾鍏蜂綋鍑哄簱鐗╂枡鐨刢ntr锛岄偅涔堝鏋滃湪鍒涘缓浠诲姟鍓嶏紝杩欎釜鐗╂枡琚敊璇娊妫�簡鎬庝箞鍔�+ foreach (var cgDetail in cgDetailList) { + var detail = new TN_Outbound_Detail { + S_NO = orderNo, + S_ITEM_CODE = cgDetail.S_ITEM_CODE, + S_BATCH_NO = cgDetail.S_BATCH_NO, + S_CNTR_CODE = cgDetail.S_CNTR_CODE, + S_END_AREA = model.EndArea }; - if (db.Insertable<TN_Inbound_Order>(order).ExecuteCommand() <= 0) { + + if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) { tran.RollbackTran(); return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail)); } } + + var order = new TN_Outbound_Order { + S_NO = orderNo, + S_ITEM_CODE = model.ItemCode, + S_BATCH_NO = model.BatchNo, + F_QTY = model.Qty, + F_OUT_QTY = cgDetailList.Sum(a => a.F_QTY), + S_END_AREA = model.EndArea + }; + + if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) { + tran.RollbackTran(); + return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order)); + } + + tran.CommitTran(); } return BuildSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�); @@ -510,6 +678,63 @@ } } + public static List<TN_CG_Detail> SelectCgByTotalQty(FinishedOutboundInfo model) { + var db = DbHelper.GetDbClient(); + var result = new List<TN_CG_Detail>(); + var targetNum = model.Qty; + + try { + var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode + && a.F_QTY > targetNum). + OrderBy(a => a.F_QTY, OrderByType.Asc).First(); + if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+ { + result.Add(targetCg); + return result; + } + + // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵 + var sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE) + .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.F_QTY > 0) + .Where((d, c) => c.S_CNTR_TYPE == model.CntrType) + .Where(d => (model.ForcedOut && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸") + || (!model.ForcedOut && (d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸" + || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮"))) + .OrderBy(d => d.F_QTY, OrderByType.Desc) + .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList(); + + if (sortedMaterials.Count == 0)//娌℃湁婊¤冻鏉′欢鐨�+ { + return result; + } + + float countNum = 0; + foreach (var mat in sortedMaterials) { + countNum += mat.F_QTY; + result.Add(mat); + if (countNum >= targetNum) { + break; + } + } + if (result.Sum(a => a.F_QTY) >= targetNum) { + return result; + } + else { + result.Clear(); + return result; + } + } + catch (Exception ex) { + throw ex; + } + } + + private static string GenerateOrderNo(string snType, string prefix) { + var id = SysHelper.GetSerialNumber(snType, prefix); + var date = DateTime.Now.ToString("yyMMdd"); + return $"ON{date}{id.ToString().PadLeft(4, '0')}"; + } + #endregion } -- Gitblit v1.9.1