From 9c8d50022cd60b6c553c472eeb76eddf312e6a45 Mon Sep 17 00:00:00 2001 From: majian <780924089@qq.com> Date: Fri, 19 Jul 2024 15:11:53 +0800 Subject: [PATCH 1/2] =?UTF-8?q?8=E7=BA=BF=E5=85=A5=E4=B8=AD=E5=82=A8?= =?UTF-8?q?=E4=BB=93=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Consts/WmsWareHouseConst.cs | 4 + .../MaterialTransferDistributeYCL2ZCCInput.cs | 41 +++ .../Entity/WmsMaterialTransferD.cs | 9 + .../Tnb.WarehouseMgr/WareHouseService.cs | 6 +- .../WmsMaterialTransferService.cs | 302 +++++++++++++----- 5 files changed, 275 insertions(+), 87 deletions(-) create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index cafef67d..61f3b426 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -470,6 +470,10 @@ /// public const string ZZCSSX111012 = "32609251845653"; /// + /// 一楼中储仓入库工位 + /// + public const string ZZCSSX011008 = "32609223625237"; + /// /// 料箱id /// public const string LIAOXIANGID = "26037262680357"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs new file mode 100644 index 00000000..72524f7f --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs @@ -0,0 +1,41 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class MaterialTransferDistributeYCL2ZCCInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 来源单据id + /// + public string? source_id { get; set; } + + /// + /// 载具 + /// + public List? details { get; set; } + + } + + public class MaterialTransferDistributeYCL2ZCCDetailInput + { + /// + /// 载具编码 + /// + public string? carry_code { get; set; } + + /// + /// 物料数量 + /// + public decimal qty { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs index ccfcfe42..687d5519 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs @@ -80,6 +80,15 @@ public partial class WmsMaterialTransferD : BaseEntity /// public decimal? yzqty { get; set; } + /// + /// 已下发数量(入库) + /// + public decimal? yxfqty_rk { get; set; } + + /// + /// 已转数量(入库) + /// + public decimal? yzqty_rk { get; set; } /// /// 主表ID diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 4a265303..7b7e8877 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -2296,7 +2296,7 @@ namespace Tnb.WarehouseMgr WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.id == carry.id).FirstAsync(); // 同步料架下的载具位置 - if (wmsCarryH.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID) + if (wmsCarryH != null && wmsCarryH.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID) { List carrys = _db.Queryable() .InnerJoin((a, b) => a.membercarry_id == b.id).Where((a, b) => a.carry_id == carry.id).Select((a, b) => b).ToList(); @@ -3119,7 +3119,7 @@ namespace Tnb.WarehouseMgr List wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == rackid).ToList(); int move_num = 6; - string[] endlocations = new string[2] { WmsWareHouseConst.ZZCSSX111011, WmsWareHouseConst.ZZCSSX111012 }; + string[] startlocations = new string[2] { WmsWareHouseConst.ZZCSSX111011, WmsWareHouseConst.ZZCSSX111012 }; BasLocation startLocation = null; int index = 0; @@ -3139,7 +3139,7 @@ namespace Tnb.WarehouseMgr // 每6个重新获取一次起点 if (index % move_num == 0) { - startLocation = await _db.Queryable().Where(r => endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + startLocation = await _db.Queryable().Where(r => startlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); } BasLocation endLocation = endLocations[0]; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 5ebb027f..69f0f1db 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -66,6 +66,7 @@ namespace Tnb.WarehouseMgr private readonly IWmsCarryQueryService _wmsCarryQueryService; public static SemaphoreSlim s_taskDistributeToZCC = new(1); + public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1); public WmsMaterialTransferService( ISqlSugarRepository repository, @@ -292,7 +293,7 @@ namespace Tnb.WarehouseMgr /// - /// 按托下发 + /// 按托下发(到集中供料或外协) /// /// /// @@ -322,12 +323,12 @@ namespace Tnb.WarehouseMgr WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); - if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty) + await s_taskExecuteSemaphore.WaitAsync(); + if (wmsMaterialTransferD.yxfqty >= wmsMaterialTransferD.qty) { throw new AppFriendlyException("已下发数量已达到转库数量", 500); } - await s_taskExecuteSemaphore.WaitAsync(); await _db.Ado.BeginTranAsync(); //入库取终点 //出库起点 @@ -432,6 +433,120 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// PDA操作(8线到中储仓) + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeYCL2ZCC(MaterialTransferDistributeYCL2ZCCInput input) + { + try + { + if (string.IsNullOrEmpty(input.source_id)) + { + throw new AppFriendlyException("来源单据id不可为空", 500); + } + if (input.details.Count == 0) + { + throw new AppFriendlyException("请先扫描料箱", 500); + } + + input.details.ForEach(r => + { + if (string.IsNullOrEmpty(r.carry_code)) + { + throw new AppFriendlyException($"料箱编码不能为空", 500); + } + if (r.qty <= 0) + { + throw new AppFriendlyException($"料箱{r.carry_code}的数量必须大于0", 500); + } + }); + + await s_taskDistributeYCL2ZCC.WaitAsync(); + WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); + WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); + + if (wmsMaterialTransferD.yxfqty_rk >= wmsMaterialTransferD.qty) + { + throw new AppFriendlyException("已下发数量已达到转库数量", 500); + } + + decimal qty = input.details.Sum(r => r.qty); + if (qty > wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty_rk) + { + throw new AppFriendlyException($"下发数量{qty}已超过可下发数量{wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty_rk}", 500); + } + + await _db.Ado.BeginTranAsync(); + //入库取终点 //出库起点 + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_ZC_ID, Size = input.details.Count }; + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); + if (endLocations.Count == 0) + { + Logger.LogWarning("没有可用的入库库位"); + throw new AppFriendlyException("没有可用的入库库位", 500); + } + + if (input.details.Count > endLocations.Count) + { + throw new AppFriendlyException("可用的入库库位数量少于扫描的料箱数量", 500); + } + + int index = 0; + + List wmsCarryHs = await _db.Queryable().Where(r => input.details.Select(x => x.carry_code).Contains(r.carry_code)).ToListAsync(); + + foreach (var wmsCarryH in input.details) + { + BasLocation startLocation = await _db.Queryable().Where(r => r.id == WmsWareHouseConst.ZZCSSX011008).FirstAsync(); + + BasLocation endLocation = endLocations[index]; + + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = startLocation.id; + commonCreatePretaskInput.endlocation_id = endLocation.id; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + commonCreatePretaskInput.source_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryHs[index].id; + commonCreatePretaskInput.carry_code = wmsCarryHs[index].carry_code; + commonCreatePretaskInput.isExcuteMission = false; + + Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); + + if (res.code != HttpStatusCode.OK) + { + Logger.LogInformation($@"生成预任务失败"); + throw new AppFriendlyException($@"生成预任务失败", 500); + } + + index++; + } + + // 更新子表已下发数量 + await _db.Updateable().SetColumns(r => r.yxfqty_rk == r.yxfqty_rk + qty).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【Distribute】" + ex.Message); + Logger.LogError("【Distribute】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + _ = s_taskDistributeYCL2ZCC.Release(); + InvokeGenPretaskExcute(); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + /// /// 按料架下发(缓存仓) /// @@ -770,7 +885,6 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } - public override async Task ModifyAsync(WareHouseUpInput input) { if (input == null) @@ -788,10 +902,21 @@ namespace Tnb.WarehouseMgr } await _db.Ado.BeginTranAsync(); - // 更新已转数量 - bool isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty) }) - .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); - + bool isOk = false; + // 入库回写入库数量字段 + if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) + { + // 更新已转数量(入库) + isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty_rk = it.yzqty_rk + wmsCarryCodes.Sum(r => r.codeqty) }) + .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); + } + else + { + // 更新已转数量 + isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty) }) + .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); + } + // 如果所有明细已完成 更新主表状态为完成 WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.source_id).SingleAsync(); List wmsMaterialTransferDs = _db.Queryable() @@ -814,87 +939,96 @@ namespace Tnb.WarehouseMgr if (input.area_code == "E") await sign(input); - - WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); - List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x=>x.id).ToListAsync(); - DictionaryDataEntity unitData = await _db.Queryable() - .LeftJoin((x, y) => x.Id == y.DictionaryTypeId) - .Where((x, y) => x.EnCode == DictConst.MeasurementUnit && y.EnCode == wmsMaterialTransferd.unit_id) - .Select((x,y)=>y) - .FirstAsync(); - List ids = new List(); - ids.Add(wmsMaterialTransfer.create_id); - ids.Add(WmsWareHouseConst.AdministratorOrgId); - ids.Add(wmsMaterialTransfer.warehouse_outstock); - ids.Add(wmsMaterialTransfer.warehouse_instock); - ids.Add(wmsMaterialTransferd.material_id); - if (unitData != null) + // 其它入库 + if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) { - ids.Add(unitData.Id); + } - List erpExtendFields = await _db.Queryable().Where(x=>ids.Contains(x.table_id)).ToListAsync(); - - ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (wmsMaterialTransfer.org_id ?? WmsWareHouseConst.AdministratorOrgId)); - string erpCreateId = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.create_id)?.user_id ?? ""; - - List> requestData = new List>(); - Dictionary erpRequestData = new Dictionary(); - string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - erpRequestData.Add("billmaker",erpCreateId); - erpRequestData.Add("cdptid","1001A1100000000JRLI1");// 先写死 - erpRequestData.Add("cdptvid","0001A11000000007GGO8");// 先写死 - erpRequestData.Add("corpoid",erpOrg.corpoid); - erpRequestData.Add("corpvid",erpOrg.corpoid); - erpRequestData.Add("cothercalbodyoid",erpOrg.pk_org); - erpRequestData.Add("cotherwhid",erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.warehouse_instock)?.cotherwhid ?? ""); - erpRequestData.Add("creationtime",nowStr); - erpRequestData.Add("creator",erpCreateId); - erpRequestData.Add("ctrantypeid","0001H11000000000D31W"); - erpRequestData.Add("cwarehouseid",erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? ""); - erpRequestData.Add("dbilldate",nowStr); - erpRequestData.Add("dmakedate",nowStr); - erpRequestData.Add("ntotalnum",wmsCarryCodes.Sum(r => r.codeqty)); - erpRequestData.Add("pk_group",erpOrg.pk_group); - erpRequestData.Add("pk_org",erpOrg.pk_org); - erpRequestData.Add("pk_org_v",erpOrg.pk_org_v); - erpRequestData.Add("vbillcode",wmsMaterialTransfer.bill_code); - erpRequestData.Add("vtrantypecode","4I-01");//其他出库 先写死 - List> erpRequestDataDetails = new List>(); - erpRequestDataDetails.Add(new Dictionary() + // 其它出库 { - ["cbodytranstypecode"] = "4I-01", - ["cbodywarehouseid"] = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? "", - ["cmaterialoid"] = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransferd.material_id)?.cmaterialoid ?? "", - ["cmaterialvid"] = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransferd.material_id)?.cmaterialvid ?? "", - ["corpoid"] = erpOrg.corpoid, - ["corpvid"] = erpOrg.corpvid, - ["crowno"] = wmsMaterialTransferd.lineno, - ["csourcebillbid"] = wmsMaterialTransferd.erp_line_pk, - ["csourcebillhid"] = wmsMaterialTransfer.erp_pk, - ["cunitid"] = erpExtendFields.Find(x=>x.table_id==unitData.Id)?.cunitid ?? "", - ["cvendorid"] = "", - ["cvendorvid"] = "", - ["dbizdate"] = nowStr, - ["nnum"] = wmsCarryCodes.Sum(r => r.codeqty), - ["nshouldnum"] = wmsMaterialTransferd.qty, - ["pk_group"] = erpOrg.pk_group, - ["pk_org"] = erpOrg.pk_org, - ["pk_org_v"] = erpOrg.pk_org_v, - ["vbatchcode"] = wmsMaterialTransferd.code_batch, - }); - erpRequestData.Add("dtls",erpRequestDataDetails); - requestData.Add(erpRequestData); + WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); + List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync(); + DictionaryDataEntity unitData = await _db.Queryable() + .LeftJoin((x, y) => x.Id == y.DictionaryTypeId) + .Where((x, y) => x.EnCode == DictConst.MeasurementUnit && y.EnCode == wmsMaterialTransferd.unit_id) + .Select((x, y) => y) + .FirstAsync(); + List ids = new List(); + ids.Add(wmsMaterialTransfer.create_id); + ids.Add(WmsWareHouseConst.AdministratorOrgId); + ids.Add(wmsMaterialTransfer.warehouse_outstock); + ids.Add(wmsMaterialTransfer.warehouse_instock); + ids.Add(wmsMaterialTransferd.material_id); + if (unitData != null) + { + ids.Add(unitData.Id); + } + List erpExtendFields = await _db.Queryable().Where(x => ids.Contains(x.table_id)).ToListAsync(); - ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord(); - thirdWebapiRecord.id = SnowflakeIdHelper.NextId(); - thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; - thirdWebapiRecord.name = "其它出库"; - thirdWebapiRecord.method = "POST"; - thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN+"uapws/rest/generalout/save"; - thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData); - thirdWebapiRecord.create_time = DateTime.Now; + ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (wmsMaterialTransfer.org_id ?? WmsWareHouseConst.AdministratorOrgId)); + string erpCreateId = erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.create_id)?.user_id ?? ""; - await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); + List> requestData = new List>(); + Dictionary erpRequestData = new Dictionary(); + string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + erpRequestData.Add("billmaker", erpCreateId); + erpRequestData.Add("cdptid", "1001A1100000000JRLI1");// 先写死 + erpRequestData.Add("cdptvid", "0001A11000000007GGO8");// 先写死 + erpRequestData.Add("corpoid", erpOrg.corpoid); + erpRequestData.Add("corpvid", erpOrg.corpoid); + erpRequestData.Add("cothercalbodyoid", erpOrg.pk_org); + erpRequestData.Add("cotherwhid", erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.warehouse_instock)?.cotherwhid ?? ""); + erpRequestData.Add("creationtime", nowStr); + erpRequestData.Add("creator", erpCreateId); + erpRequestData.Add("ctrantypeid", "0001H11000000000D31W"); + erpRequestData.Add("cwarehouseid", erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? ""); + erpRequestData.Add("dbilldate", nowStr); + erpRequestData.Add("dmakedate", nowStr); + erpRequestData.Add("ntotalnum", wmsCarryCodes.Sum(r => r.codeqty)); + erpRequestData.Add("pk_group", erpOrg.pk_group); + erpRequestData.Add("pk_org", erpOrg.pk_org); + erpRequestData.Add("pk_org_v", erpOrg.pk_org_v); + erpRequestData.Add("vbillcode", wmsMaterialTransfer.bill_code); + erpRequestData.Add("vtrantypecode", "4I-01");//其他出库 先写死 + List> erpRequestDataDetails = new List>(); + erpRequestDataDetails.Add(new Dictionary() + { + ["cbodytranstypecode"] = "4I-01", + ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? "", + ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == wmsMaterialTransferd.material_id)?.cmaterialoid ?? "", + ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == wmsMaterialTransferd.material_id)?.cmaterialvid ?? "", + ["corpoid"] = erpOrg.corpoid, + ["corpvid"] = erpOrg.corpvid, + ["crowno"] = wmsMaterialTransferd.lineno, + ["csourcebillbid"] = wmsMaterialTransferd.erp_line_pk, + ["csourcebillhid"] = wmsMaterialTransfer.erp_pk, + ["cunitid"] = erpExtendFields.Find(x => x.table_id == unitData.Id)?.cunitid ?? "", + ["cvendorid"] = "", + ["cvendorvid"] = "", + ["dbizdate"] = nowStr, + ["nnum"] = wmsCarryCodes.Sum(r => r.codeqty), + ["nshouldnum"] = wmsMaterialTransferd.qty, + ["pk_group"] = erpOrg.pk_group, + ["pk_org"] = erpOrg.pk_org, + ["pk_org_v"] = erpOrg.pk_org_v, + ["vbatchcode"] = wmsMaterialTransferd.code_batch, + }); + erpRequestData.Add("dtls", erpRequestDataDetails); + requestData.Add(erpRequestData); + + ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord(); + thirdWebapiRecord.id = SnowflakeIdHelper.NextId(); + thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; + thirdWebapiRecord.name = "其它出库"; + thirdWebapiRecord.method = "POST"; + thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/generalout/save"; + thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData); + thirdWebapiRecord.create_time = DateTime.Now; + + await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); + } + + await _db.Ado.CommitTranAsync(); } From 401d921f49c45b5b5fa3cb2f650e8aa157f70719 Mon Sep 17 00:00:00 2001 From: majian <780924089@qq.com> Date: Mon, 22 Jul 2024 10:59:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BA=8C=E6=A5=BC=E7=A9=BA=E6=89=98?= =?UTF-8?q?=E5=88=B0=E7=A0=81=E5=9E=9B=E7=BA=BF=EF=BC=8C=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tnb.ProductionMgr/RedisBackGround.cs | 181 ++++++++++++++++-- .../Consts/WmsWareHouseConst.cs | 12 ++ .../OutStockStrategyZCC2Floor2Query.cs | 4 + .../Tnb.WarehouseMgr/WareHouseService.cs | 4 +- .../WmsCarryStockReportService.cs | 16 +- .../WmsMaterialTransferService.cs | 158 ++++++++++++++- 6 files changed, 334 insertions(+), 41 deletions(-) diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 2ee09157..1b8a9a6d 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -90,6 +90,9 @@ namespace Tnb.ProductionMgr private static Timer? PackOutstockServicetimer; // 检查到电梯任务异常断开后处理 private Thread? ElevatorTaskExceptionHandleThread; + // 二楼空托盘自动补充到线边 + private static Timer? F2KTPsupplementtimer; + public SemaphoreSlim s_taskCheckGet = new(1); public SemaphoreSlim s_taskScan = new(1); @@ -106,6 +109,7 @@ namespace Tnb.ProductionMgr public SemaphoreSlim s_taskFloor4DMJ2MJXService = new(1); public SemaphoreSlim s_taskFloor4MJX2MJCService = new(1); public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1); + public SemaphoreSlim s_taskF2KTPsupplement = new(1); private StackExRedisHelper _redisData; private readonly IPrdInstockService _prdInstockService; @@ -127,7 +131,8 @@ namespace Tnb.ProductionMgr private ISqlSugarClient db_Floor4MJX2MJC; private ISqlSugarClient db_Floor4DMC2CPK; private ISqlSugarClient db_ElevatorTaskExceptionHandle; - + private ISqlSugarClient db_F2KTPsupplement; + private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; private readonly IUserManager _userManager; @@ -183,6 +188,7 @@ namespace Tnb.ProductionMgr db_Floor4MJX2MJC = repository.CopyNew(); db_Floor4DMC2CPK = repository.CopyNew(); db_ElevatorTaskExceptionHandle = repository.CopyNew(); + db_F2KTPsupplement = repository.CopyNew(); } #endregion @@ -1922,13 +1928,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线"); LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线"); - if (true) - { - return; - } - Dictionary putdic = new Dictionary(); - putdic.Add("SLD1", new string[] { "设备名", "信号" }); + putdic.Add("MJQ-FAN01", new string[] { "4楼上料输送西区", "上料工位1请求送盘" }); + putdic.Add("MJQ-FAN02", new string[] { "4楼上料输送西区", "上料工位2请求送盘" }); + putdic.Add("MJQ-FAN03", new string[] { "4楼上料输送西区", "上料工位3请求送盘" }); + putdic.Add("MJQ-FAN04", new string[] { "4楼上料输送西区", "上料工位4请求送盘" }); //Dictionary putdic = new Dictionary(); //List endLocations = db_Floor4DMJ2MJX.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_DMJC_ID @@ -1958,7 +1962,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (items.Count < 1) { - LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的空载具"); + LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的载具"); break; } BasLocation endlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.location_code == key).FirstAsync(); @@ -2027,13 +2031,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); - if (true) - { - return; - } - Dictionary getdic = new Dictionary(); - getdic.Add("SLD1", new string[] { "设备名", "信号", "条码信号" }); + getdic.Add("MJQ-QU02", new string[] { "4下上料输送西区", "下料工位2请求取盘", "下料工位2条码" }); + getdic.Add("MJQ-QU01", new string[] { "4下上料输送西区", "下料工位1请求取盘", "下料工位1条码" }); //List startLocations = db_Floor4MJX2MJC.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_MJC_ID //&& r.is_type == ((int)EnumLocationType.分拣库位).ToString() && r.is_lock == 0).ToList(); @@ -2051,7 +2051,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA bool result = await GetBoolTag(strs[0], strs[1]); if (result) { - LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 上料点 {key} {strs[1]}采集到 {result}"); + LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[1]}采集到 {result}"); InStockStrategyQuery inStockStrategyInput = new() { @@ -2070,7 +2070,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.location_code == key).FirstAsync(); BasLocation endlocation = items[0]; - string carry_code = ""; + string carry_code = await GetStringTag(strs[0], strs[2]); + LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[2]}采集到 {carry_code}"); WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable().Where(r => r.carry_code == carry_code).FirstAsync(); //锁定起点库位 @@ -2160,7 +2161,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (wmsFloor4StewingConfig == null) { - LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)"); + LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)"); return; } int hours = 168; @@ -2187,7 +2188,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await db_Floor4DMC2CPK.Ado.BeginTranAsync(); - BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + BasLocation startlocation = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); InStockStrategyQuery inStockStrategyInput = new() { @@ -2253,6 +2254,107 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + /// + /// 二楼空托盘自动补充到线边 + /// + /// + private async void F2KTPsupplement(object? args) + { + if (s_taskF2KTPsupplement.CurrentCount == 0) + return; + await s_taskF2KTPsupplement.WaitAsync(); + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + try + { + Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行二楼空托盘自动补充到线边"); + LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行二楼空托盘自动补充到线边"); + + Dictionary putdic = new Dictionary(); + putdic.Add("ZZ-01-01", new string[] { "外包装箱码垛线", "WBZX_x1_AGV_fan" }); + putdic.Add("ZZ-02-01", new string[] { "外包装箱码垛线", "WBZX_x2_AGV_fan" }); + + foreach (var key in putdic.Keys) + { + await db_F2KTPsupplement.Ado.BeginTranAsync(); + var strs = putdic.Where(p => p.Key == key).First().Value; + bool result = await GetBoolTag(strs[0], strs[1]); + if (result) + { + + LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 上料点 {key} {strs[1]}采集到 {result}"); + + OutStockStrategyQuery outStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_F2KTQ_ID, + Size = 1 + }; + List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); + + if (items.Count < 1) + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 没有可以出库的空载具"); + break; + } + BasLocation endlocation = await db_F2KTPsupplement.Queryable().Where(r => r.location_code == key).FirstAsync(); + + if (endlocation.is_use == "1") + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已占用"); + continue; + } + if (endlocation.is_lock == 1) + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已锁定"); + continue; + } + + WmsCarryH wmsCarryH = items[0]; + + //锁定起点库位 + await db_F2KTPsupplement.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == wmsCarryH.location_id).ExecuteCommandAsync(); + //锁定终点库位 + await db_F2KTPsupplement.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync(); + + bool result_createPretask = await createPretask(wmsCarryH.location_id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerF2KTPsupplement, db_F2KTPsupplement); + if (!result_createPretask) + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败"); + throw new Exception($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败"); + } + LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成成功"); + + } + await db_F2KTPsupplement.Ado.CommitTranAsync(); + } + _ = _wareHouseService.GenTaskExecute(); + } + catch (ObjectDisposedException ex) + { + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.Message}"); + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.StackTrace}"); + if (ex.Source == "Npgsql") + db_F2KTPsupplement = _repository.AsSugarClient().CopyNew(); + } + catch (Exception ex) + { + Console.WriteLine("【二楼空托盘自动补充到线边】" + ex.Message); + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.Message}"); + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.StackTrace}"); + // 数据库连接断开时会报错 + try { await db_F2KTPsupplement.Ado.RollbackTranAsync(); } catch { }; + } + finally + { + s_taskF2KTPsupplement.Release(); + if (!db_F2KTPsupplement.Ado.Transaction.IsNull()) + try { await db_F2KTPsupplement.Ado.CommitTranAsync(); } catch { }; + _wareHouseService.GenTaskExecute(); + stopwatch.Stop(); + Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束二楼空托盘自动补充到线边 {stopwatch.ElapsedMilliseconds} ms"); + LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束二楼空托盘自动补充到线边 {stopwatch.ElapsedMilliseconds} ms"); + } + } #endregion public Task StartAsync(CancellationToken cancellationToken) @@ -2287,10 +2389,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA ElevatorTaskExceptionHandleThread = new Thread(ElevatorTaskExceptionHandle); ElevatorTaskExceptionHandleThread.Start(); - //Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - //Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - //Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); return Task.CompletedTask; } @@ -2321,6 +2424,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Floor4MJX2MJCtimer?.Dispose(); Floor4DMC2CPKtimer?.Dispose(); ElevatorTaskExceptionHandleThread.Abort(); + F2KTPsupplementtimer?.Dispose(); + } #region 日志 @@ -2710,6 +2815,40 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return _LoggerFloor4DMC2CPK; } } + + protected string _LoggerF2KTPsupplementFileName = ""; + protected ILogger _LoggerF2KTPsupplement; + protected ILogger LoggerF2KTPsupplement + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/custom二楼空托盘补充{DateTime.Now:yyyyMMdd}.log"; + if (_LoggerF2KTPsupplementFileName != newFileName) + { + ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts => + { + + //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; + cfgOpts.MessageFormat = (logMsg) => + { + var logLevel = s_logLevelMap[logMsg.LogLevel]; + var sb = new StringBuilder(); + _ = sb.Append($"[{logLevel}] "); + _ = sb.Append($"{logMsg.LogName} "); + _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} "); + _ = sb.Append($"#{logMsg.EventId.Id} "); + _ = sb.Append(logMsg.Message + " "); + _ = sb.Append(logMsg.Exception?.ToString()); + return sb.ToString(); + }; + + })); + _LoggerF2KTPsupplement = loggerFactory.CreateLogger(this.GetType()); + _LoggerF2KTPsupplementFileName = newFileName; + } + return _LoggerF2KTPsupplement; + } + } #endregion } } \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 61f3b426..2f04548c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -472,8 +472,20 @@ /// /// 一楼中储仓入库工位 /// + public const string ZZCSSX021007 = "32609215284757"; + /// + /// 一楼中储仓入库工位 + /// public const string ZZCSSX011008 = "32609223625237"; /// + /// 一楼中储仓入库工位 + /// + public const string ZZCSSX121009 = "32609229889045"; + /// + /// 一楼中储仓入库工位 + /// + public const string ZZCSSX121010 = "32609238573589"; + /// /// 料箱id /// public const string LIAOXIANGID = "26037262680357"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs index 540f2b1c..943c39eb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs @@ -49,6 +49,10 @@ /// /// public string? material_code { get; set; } + /// + /// + /// + public string[] endlocations { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 7b7e8877..fd0770c7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -586,7 +586,7 @@ namespace Tnb.WarehouseMgr List>? carrys = new List>(); // 6个下发一条任务链 - int move_num = 6; int endlocation_index = 0; string[] endlocations = new string[2] { "32609229889045", "32609238573589" }; + int move_num = 6; int endlocation_index = 0; BasLocation endlocation_ssx = null; for (int i = 0; i < itemsASC.Count; i++) @@ -602,7 +602,7 @@ namespace Tnb.WarehouseMgr // 每6个重新获取一次终点 if (i % move_num == 0) { - endlocation_ssx = await _db.Queryable().Where(r => endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + endlocation_ssx = await _db.Queryable().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); } // 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs index ff4e2079..2b12868d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs @@ -38,13 +38,13 @@ namespace Tnb.WarehouseMgr public async Task CarryStock(CarryStockInput input) { var warehouse_id = ""; - var carry_id = ""; - var material_id = ""; + var carry_code = ""; + var material_code = ""; if (!input.queryJson.IsNullOrWhiteSpace()) { warehouse_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.warehouse_id)); - carry_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_id)); - material_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_id)); + carry_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_code)); + material_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_code)); } @@ -58,8 +58,8 @@ namespace Tnb.WarehouseMgr .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" && ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code))) .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) - .WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d) => b.id == carry_id) - .WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f) => f.id == material_id) + .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => f.code.Contains(material_code)) .OrderByDescending((a, b, c, d, e, f) => b.carry_code) .Select((a, b, c, d, e, f) => new WmsCarryStockReport { @@ -97,8 +97,8 @@ namespace Tnb.WarehouseMgr .InnerJoin((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id) .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" && b.carry_status != "0" && b.carry_status != "6") .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) - .WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d, e) => b.id == carry_id || e.membercarry_id == carry_id) - .WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f, g) => g.id == material_id) + .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code)|| h.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code)) .Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport { warehouse_name = c.whname, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 69f0f1db..cf72a161 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -67,6 +67,8 @@ namespace Tnb.WarehouseMgr public static SemaphoreSlim s_taskDistributeToZCC = new(1); public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1); + public static SemaphoreSlim s_taskDistributeZCCToYCL = new(1); + public WmsMaterialTransferService( ISqlSugarRepository repository, @@ -291,7 +293,6 @@ namespace Tnb.WarehouseMgr } } - /// /// 按托下发(到集中供料或外协) /// @@ -439,7 +440,7 @@ namespace Tnb.WarehouseMgr /// /// [HttpPost, NonUnify, AllowAnonymous] - public async Task DistributeYCL2ZCC(MaterialTransferDistributeYCL2ZCCInput input) + public async Task DistributeYCLToZCC(MaterialTransferDistributeYCL2ZCCInput input) { try { @@ -936,6 +937,8 @@ namespace Tnb.WarehouseMgr throw Oops.Oh(ErrorCode.COM1001); } + await _db.Ado.CommitTranAsync(); + if (input.area_code == "E") await sign(input); @@ -945,6 +948,7 @@ namespace Tnb.WarehouseMgr } // 其它出库 + else { WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync(); @@ -1027,16 +1031,12 @@ namespace Tnb.WarehouseMgr await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); } - - - - await _db.Ado.CommitTranAsync(); } catch(Exception ex) { Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.Message); Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.StackTrace); - await _db.Ado.RollbackTranAsync(); + //await _db.Ado.RollbackTranAsync(); } } @@ -1100,11 +1100,11 @@ namespace Tnb.WarehouseMgr material_id = wmsMaterialTransferD.material_id, code_batch = wmsMaterialTransferD.code_batch, needOut = needOut, - material_code = wmsMaterialTransferD.material_code - + material_code = wmsMaterialTransferD.material_code, + endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 } }; - List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); + List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); foreach (var item in carrys) { @@ -1183,6 +1183,144 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// 中储仓退料到原材料仓 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input) + { + s_taskDistributeZCCToYCL.Wait(); + + try + { + WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable().Where(r => r.id == input.source_id).First(); + if (wmsMaterialTransfer == null) + { + Logger.LogWarning($"不存在id为{input.source_id}的转库单!"); + throw new AppFriendlyException($"不存在id为{input.source_id}的转库单!", 500); + } + if (wmsMaterialTransfer.status != WmsWareHouseConst.BILLSTATUS_ADD_ID) + { + Logger.LogWarning($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓退料到原材料仓任务!"); + throw new AppFriendlyException($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓退料到原材料仓任务!", 500); + } + + List wmsMaterialTransferds = _db.Queryable().Where(r => r.bill_id == input.source_id).ToList(); + + var wmsMaterialTransferdsDistinct = wmsMaterialTransferds.Select(r => new + { + material_id = r.material_id, + code_batch = r.code_batch, + }).Distinct(); + if (wmsMaterialTransferdsDistinct.Count() < wmsMaterialTransferds.Count) + { + Logger.LogWarning($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!", 500); + } + + // 转库单载具子表 + List wmsMaterialTransferCarrys = new List(); + + foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds) + { + // 需要转库数量 + decimal? needOut = wmsMaterialTransferD.qty; + + //出库取起点,获取所有符合输入的载具规格的载具 + OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new() + { + warehouse_id = "2", + material_id = wmsMaterialTransferD.material_id, + code_batch = wmsMaterialTransferD.code_batch, + needOut = needOut, + material_code = wmsMaterialTransferD.material_code, + endlocations = new string[] {WmsWareHouseConst.ZZCSSX021007 } + }; + List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); + + + foreach (var item in carrys) + { + WmsCarryH wmsCarryH = item.Item1; + decimal codeqty = item.Item2; + BasLocation endlocation_ssx = item.Item3; + + // 转库单载具子表 + WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry(); + wmsMaterialTransferCarry.bill_id = input.source_id; + wmsMaterialTransferCarry.carry_id = wmsCarryH.id; + wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code; + wmsMaterialTransferCarry.create_id = input.create_id; + wmsMaterialTransferCarry.create_time = DateTime.Now; + wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id; + wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code; + wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id; + wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code; + wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id; + wmsMaterialTransferCarry.qty = codeqty; + wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry); + } + } + + await _db.Ado.BeginTranAsync(); + + await _db.Updateable().SetColumns(r => new WmsMaterialTransfer + { + status = WmsWareHouseConst.BILLSTATUS_ON_ID, + carry_count = wmsMaterialTransferCarrys.Count, + remainbindracknum = wmsMaterialTransferCarrys.Count + }).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeZCCToYCL】更新转库单{wmsMaterialTransfer.bill_code}主表的数据"); + + await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeZCCToYCL】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据"); + + foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys) + { + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id; + commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id; + commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id; + commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + commonCreatePretaskInput.source_id = wmsMaterialTransferCarry.mat_bill_id; + commonCreatePretaskInput.isExcuteMission = false; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【DistributeZCCToYCL生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500); + } + + await _db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync(); + } + Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功"); + + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【DistributeZCCToYCL】" + ex.Message); + Logger.LogError("【DistributeZCCToYCL】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + s_taskDistributeZCCToYCL.Release(); + InvokeGenPretaskExcute(); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + + /// /// 从暂存仓呼叫料架到产线 ///