using System; using System.Collections.Generic; using System.Linq; using HH.WCS.Mobox3.RiDong.dto; using HH.WCS.Mobox3.RiDong.generalMethod; using HH.WCS.Mobox3.RiDong.models; using HH.WCS.Mobox3.RiDong.util; namespace HH.WCS.Mobox3.RiDong.apiMethod; /// /// 出库流程方法类 /// public abstract class OutWareHouseService { /// /// 创建出库单 /// public static void CreateOutboundOrderFromMaterialOut(List materialOuts) { List outboundOrders = new List(); // 创建出库单 foreach (var materialOut in materialOuts) { // 查询物料表 var tnMaterial = AdoSqlMethod.QueryFirst(p => p.S_ITEM_CODE == materialOut.S_INT_PRODUCT_CODE); // 物料表为空 if (tnMaterial is null) { if (materialOut.S_ITEM_EMPTY != "物料不存在") { materialOut.S_ITEM_EMPTY = "物料不存在"; AdoSqlMethod.UpdateFirst(materialOut, p => new { p.S_ITEM_EMPTY }); } } else { if (outboundOrders.Count > 0 && outboundOrders.Count(p => p.S_NO == materialOut.S_TRAN_SUB_SEQ) > 0) { if (tnMaterial.ISAUTO == "Y") { materialOut.S_TRANSACTION += "-001"; } else { materialOut.S_TRANSACTION += "-002"; } var outboundOrder = outboundOrders.First(p => p.S_NO == materialOut.S_TRANSACTION); outboundOrder.Details.Add(new OutboundDetail() { S_OO_NO = outboundOrder.S_NO, S_SERIAL_NO = outboundOrder.S_NO, N_ROW_NO = materialOut.S_ORDER_LINE, S_BATCH_NO = materialOut.S_LOT, F_QTY = materialOut.S_LOR_QUANTITYOT, S_ITEM_CODE = materialOut.S_INT_PRODUCT_CODE, S_IDENTIFICATION = "MO", S_ITEM_NAME = tnMaterial.S_ITEM_NAME, S_BS_NO = materialOut.S_SO }); materialOut.S_CREATE_OK = 1; } else { // 创建出库单主表数据 OutboundOrder outboundOrder = new OutboundOrder(); if (tnMaterial.ISAUTO == "Y") { outboundOrder.ISAUTO = "Y"; materialOut.S_TRANSACTION += "-001"; } else { outboundOrder.ISAUTO = "N"; materialOut.S_TRANSACTION += "-002"; } outboundOrder.S_NO = materialOut.S_TRANSACTION; outboundOrder.Details = new List(); outboundOrder.Details.Add(new OutboundDetail() { S_OO_NO = outboundOrder.S_NO, S_SERIAL_NO = outboundOrder.S_NO, N_ROW_NO = materialOut.S_ORDER_LINE, S_BATCH_NO = materialOut.S_LOT, F_QTY = materialOut.S_LOR_QUANTITYOT, S_ITEM_CODE = materialOut.S_INT_PRODUCT_CODE, S_IDENTIFICATION = "MO", S_ITEM_NAME = tnMaterial.S_ITEM_NAME, S_BS_NO = materialOut.S_SO }); materialOut.S_CREATE_OK = 1; outboundOrders.Add(outboundOrder); } } } var querySqlSugarClient = AdoSqlMethod.QuerySqlSugarClient(); try { querySqlSugarClient.BeginTran(); AdoSqlMethod.AddOutboundOrderAndDetailsListTran(querySqlSugarClient, outboundOrders); AdoSqlMethod.UpdateListTran(querySqlSugarClient, materialOuts, p => new { p.S_CREATE_OK }); querySqlSugarClient.CommitTran(); } catch (Exception e) { Console.WriteLine(e); querySqlSugarClient.RollbackTran(); } } /// /// 创建出库单 /// public static void CreateOutboundOrderFromDoOut(List doOuts) { List outboundOrders = new List(); // 创建出库单 foreach (var doOut in doOuts) { // 查询物料表 var tnMaterial = AdoSqlMethod.QueryFirst(p => p.S_ITEM_CODE == doOut.S_INT_PRODUCT_CODE); if (tnMaterial == null) { if (doOut.S_ITEM_EMPTY != "物料不存在") { doOut.S_ITEM_EMPTY = "物料不存在"; AdoSqlMethod.UpdateFirst(doOut, p => new { p.S_ITEM_EMPTY }); } } else { if (tnMaterial.ISAUTO == "Y") { doOut.S_TRANSACTION += "-001"; } else { doOut.S_TRANSACTION += "-002"; } if (outboundOrders.Count > 0 && outboundOrders.Count(p => p.S_NO == doOut.S_TRANSACTION) > 0) { var outboundOrder = outboundOrders.First(p => p.S_NO == doOut.S_TRANSACTION); outboundOrder.Details.Add(new OutboundDetail { S_OO_NO = outboundOrder.S_NO, S_SERIAL_NO = outboundOrder.S_NO, N_ROW_NO = doOut.S_ORDER_LINE, S_BATCH_NO = doOut.S_LOT, F_QTY = doOut.S_LOR_QUANTITYOT, S_ITEM_CODE = doOut.S_INT_PRODUCT_CODE, S_IDENTIFICATION = "DO", S_ITEM_NAME = tnMaterial.S_ITEM_NAME, S_BS_NO = doOut.S_SO }); doOut.S_CREATE_OK = 1; } else { // 创建出库单主表数据 OutboundOrder outboundOrder = new OutboundOrder(); if (tnMaterial.ISAUTO == "Y") { outboundOrder.ISAUTO = "Y"; doOut.S_TRANSACTION += "-001"; } else { outboundOrder.ISAUTO = "N"; doOut.S_TRANSACTION += "-002"; } outboundOrder.S_NO = doOut.S_TRANSACTION; outboundOrder.Details = new List(); outboundOrder.Details.Add(new OutboundDetail() { S_OO_NO = outboundOrder.S_NO, S_SERIAL_NO = outboundOrder.S_NO, N_ROW_NO = doOut.S_ORDER_LINE, S_BATCH_NO = doOut.S_LOT, F_QTY = doOut.S_LOR_QUANTITYOT, S_ITEM_CODE = doOut.S_INT_PRODUCT_CODE, S_IDENTIFICATION = "DO", S_ITEM_NAME = tnMaterial.S_ITEM_NAME, S_BS_NO = doOut.S_SO, }); doOut.S_CREATE_OK = 1; outboundOrders.Add(outboundOrder); } } } var querySqlSugarClient = AdoSqlMethod.QuerySqlSugarClient(); try { querySqlSugarClient.BeginTran(); AdoSqlMethod.AddOutboundOrderAndDetailsListTran(querySqlSugarClient, outboundOrders); AdoSqlMethod.UpdateListTran(querySqlSugarClient, doOuts, p => new { p.S_CREATE_OK }); querySqlSugarClient.CommitTran(); } catch (Exception e) { Console.WriteLine(e); querySqlSugarClient.RollbackTran(); } } /// /// 结果确定 /// /// /// public static ApiModel.SimpleResult ResultDetermination(ResultDeterminationDto input) { var result = new ApiModel.SimpleResult(); var container = AdoSqlMethod.QueryFirst(p => p.S_CODE == input.cntrCode); // 判断托盘在容器表中是存在 if (container != null) { // 托盘存在,将托盘变更为可用状态 container.C_ENABLE = 'Y'; // 找到所有的容器货品明细数据 var cntrItemDetails = AdoSqlMethod.QueryList(p => p.S_CNTR_CODE == input.cntrCode); if (cntrItemDetails.Count > 0) { // 容器货品明细数据存在 foreach (var cntrItemDetail in cntrItemDetails) { cntrItemDetail.F_QTY -= cntrItemDetail.F_ALLOC_QTY; cntrItemDetail.F_ALLOC_QTY = 0; // 如果当前容器货品明细数据为0 if (cntrItemDetail.F_QTY == 0) { // 删除容器货品明细 AdoSqlMethod.DeleteFirst(cntrItemDetail); container.N_DETAIL_COUNT -= 1; } else { AdoSqlMethod.UpdateFirst(cntrItemDetail, p => new { p.F_QTY, p.F_ALLOC_QTY }); } } // 找到对应的配盘明细数据 var distributionCntrDetails = AdoSqlMethod .QueryList(p => input.ids.Contains(p.S_ID)); if (distributionCntrDetails.Count > 0) { var moBoxInputDto = new MoBoxInputDto(); moBoxInputDto.op_type = 4; var moBoxInputDto2 = new MoBoxInputDto(); moBoxInputDto2.op_type = 7; foreach (var distribution in distributionCntrDetails) { distribution.IS_SORTING = "Y"; distribution.F_ACC_P_QTY = distribution.F_QTY; var moBoxInputDetailDto = new MoBoxInputDetailDto(); moBoxInputDetailDto.item_code = distribution.S_ITEM_CODE; moBoxInputDetailDto.item_name = distribution.S_ITEM_NAME; moBoxInputDetailDto.qty = Convert.ToInt32(distribution.F_QTY); moBoxInputDetailDto.wh_code = Settings.WHCode; moBoxInputDetailDto.area_code = Settings.AreaCode; var moBoxInputDetailDto2 = new MoBoxInputDetailDto(); moBoxInputDetailDto2.item_code = distribution.S_ITEM_CODE; moBoxInputDetailDto2.item_name = distribution.S_ITEM_NAME; moBoxInputDetailDto2.qty = Convert.ToInt32(distribution.F_QTY); moBoxInputDetailDto2.area_code = Settings.AreaCode; moBoxInputDetailDto2.wh_code = Settings.WHCode; moBoxInputDto.item_info.Add(moBoxInputDetailDto); moBoxInputDto2.item_info.Add(moBoxInputDetailDto2); } // 调用第三方接口 ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto); ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto2); AdoSqlMethod.UpdateList(distributionCntrDetails, p => new { p.IS_SORTING, p.F_ACC_P_QTY }); var tnDistributionCntr = AdoSqlMethod.QueryFirst(p => distributionCntrDetails[0].S_DC_NO == p.S_DC_NO); if (tnDistributionCntr != null) { // 根据主表找到所有的配盘子表数据 var tnDistributionCntrDetails = AdoSqlMethod.QueryList(p => p.S_DC_NO == tnDistributionCntr.S_DC_NO); // 配盘明细完成的数量和总数量一致,出库单完成 if (tnDistributionCntrDetails.Count(p => p.IS_SORTING == "Y") == tnDistributionCntrDetails.Count) { tnDistributionCntr.N_B_STATE = 6; tnDistributionCntr.S_B_STATE = "完成"; AdoSqlMethod.UpdateFirst(tnDistributionCntr, p => new { p.N_B_STATE, p.S_B_STATE }); var tnDistributionCntrs = AdoSqlMethod.QueryList(p => p.S_BS_NO == tnDistributionCntr.S_BS_NO); if (tnDistributionCntrs.Count(p => p.N_B_STATE == 6) == tnDistributionCntrs.Count) { var outboundOrder = AdoSqlMethod.QueryFirst(p => p.S_NO == tnDistributionCntr.S_BS_NO); outboundOrder.N_B_STATE = 4; AdoSqlMethod.UpdateFirst(outboundOrder, p => new { p.N_B_STATE }); } } } AdoSqlMethod.UpdateFirst(container, p => new { p.C_ENABLE, p.N_DETAIL_COUNT }); } else { result.resultCode = -1; result.resultMsg = $"当前容器{input.cntrCode}的配盘单明细数据不存在"; } } else { result.resultCode = -1; result.resultMsg = $"当前容器{input.cntrCode}的容器货品明细数据不存在"; } } else { result.resultCode = -1; result.resultMsg = $"当前容器{input.cntrCode}不存在"; } return result; } /// /// 指引出库结果确定 /// /// public static ApiModel.SimpleResult ResultDeterminationGuideOut(Task task) { var result = new ApiModel.SimpleResult(); // 找到所有的容器货品明细数据 var cntrItemDetails = AdoSqlMethod.QueryList(p => p.S_CNTR_CODE == task.S_CNTR_CODE); if (cntrItemDetails.Count > 0) { var moBoxInputDto = new MoBoxInputDto(); moBoxInputDto.op_type = 4; var moBoxInputDto2 = new MoBoxInputDto(); moBoxInputDto2.op_type = 7; foreach (var distribution in cntrItemDetails) { var moBoxInputDetailDto = new MoBoxInputDetailDto(); moBoxInputDetailDto.item_code = distribution.S_ITEM_CODE; moBoxInputDetailDto.item_name = distribution.S_ITEM_NAME; moBoxInputDetailDto.qty = Convert.ToInt32(distribution.F_QTY); moBoxInputDetailDto.wh_code = Settings.WHCode; moBoxInputDetailDto.area_code = Settings.AreaCode; var moBoxInputDetailDto2 = new MoBoxInputDetailDto(); moBoxInputDetailDto2.item_code = distribution.S_ITEM_CODE; moBoxInputDetailDto2.item_name = distribution.S_ITEM_NAME; moBoxInputDetailDto2.qty = Convert.ToInt32(distribution.F_QTY); moBoxInputDetailDto2.area_code = Settings.AreaCode; moBoxInputDetailDto2.wh_code = Settings.WHCode; moBoxInputDto.item_info.Add(moBoxInputDetailDto); moBoxInputDto2.item_info.Add(moBoxInputDetailDto2); } // 调用第三方接口 ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto); ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto2); } return result; } /// /// 指引出库 /// /// public static ApiModel.SimpleResult GuideOut(OperationDto input) { var result = new ApiModel.SimpleResult(); // 1.查询容器货位表 var locCntrRel = AdoSqlMethod.QueryFirst(p => p.S_CNTR_CODE == input.cntrCode); if (locCntrRel == null) { result.resultCode = -1; result.resultMsg = "该容器的容器货位不存在"; return result; } // 2. 确定起点 input.startLocation = locCntrRel.S_LOC_CODE; input.taskType = 5; // 3.调用创建任务的接口 return SynthesizeService.AddOperation(input); } }