From 8177d05cd27cbb3482144152c1ccc339c75dcd25 Mon Sep 17 00:00:00 2001 From: majian <780924089@qq.com> Date: Thu, 27 Jun 2024 11:15:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E9=80=80=E6=96=99=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/WmsPrdReturnD.cs | 72 ++++ .../Entity/WmsPrdReturnH.cs | 67 +++ .../Tnb.ProductionMgr/PrdFeedingService.cs | 6 +- .../Tnb.ProductionMgr/RedisBackGround.cs | 7 +- .../Consts/ModuleConsts.cs | 3 + .../Consts/WmsWareHouseConst.cs | 8 +- .../Dto/Inputs/PrdReturnInput.cs | 32 ++ .../IWmsCarryBindService.cs | 2 - .../IWmsCarryUnbindService.cs | 15 + .../IWmsPrdReturnService.cs | 14 + .../Tnb.WarehouseMgr/DeviceProviderService.cs | 24 +- .../Tnb.WarehouseMgr/WareHouseService.cs | 5 +- .../Tnb.WarehouseMgr/WmsCarryBindService.cs | 111 +---- .../Tnb.WarehouseMgr/WmsCarryUnbindService.cs | 120 +++++- .../WmsMaterialTransferService.cs | 75 ++-- .../WmsPDACarryBindService.cs | 5 +- .../Tnb.WarehouseMgr/WmsPrdReturnService.cs | 381 ++++++++++++++++++ 17 files changed, 788 insertions(+), 159 deletions(-) create mode 100644 ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnD.cs create mode 100644 ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnH.cs create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PrdReturnInput.cs create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsPrdReturnService.cs create mode 100644 WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnD.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnD.cs new file mode 100644 index 00000000..72ae739a --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnD.cs @@ -0,0 +1,72 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// wms生产退料单明细 +/// +[SugarTable("wms_prd_return_d")] +public partial class WmsPrdReturnD : BaseEntity +{ + public WmsPrdReturnD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 生产退料单id + /// + public string? bill_id { get; set; } + + /// + /// 物料 + /// + public string? material_id { get; set; } + + /// + /// 物料编码 + /// + public string? material_code { get; set; } + + /// + /// 物料名称 + /// + public string? material_name { get; set; } + + /// + /// 数量 + /// + public decimal? qty { get; set; } + + /// + /// 已退料数量 + /// + public decimal? ytqty { get; set; } + + /// + /// 单位 + /// + public string? unit_id { get; set; } + +} diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnH.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnH.cs new file mode 100644 index 00000000..65a73231 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/WmsPrdReturnH.cs @@ -0,0 +1,67 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// wms生产退料单 +/// +[SugarTable("wms_prd_return_h")] +public partial class WmsPrdReturnH : BaseEntity +{ + public WmsPrdReturnH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 载具 + /// + public string? carry_id { get; set; } + + /// + /// 载具编码 + /// + public string? carry_code { get; set; } + + /// + /// 载具规格 + /// + public string? carrystd_id { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 入库仓库 + /// + public string? warehouse_id { get; set; } + + /// + /// 生产退料单号 + /// + public string? bill_code { get; set; } + + /// + /// 单据状态 + /// + public string? status { get; set; } + +} diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs index 7f04e793..0ddde12e 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs @@ -15,6 +15,7 @@ using Tnb.EquipMgr.Entities; using Tnb.ProductionMgr.Entities; using Tnb.ProductionMgr.Entities.Dto; using Tnb.ProductionMgr.Interfaces; +using Tnb.WarehouseMgr; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Interfaces; @@ -34,6 +35,7 @@ namespace Tnb.ProductionMgr private readonly IBillRullService _billRullService; private readonly IDictionaryDataService _dictionaryDataService; private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly IWmsCarryUnbindService _wmsCarryUnbindService; // private readonly WmsSignForDeliveryService _wmsSignForDeliveryService; @@ -45,6 +47,7 @@ namespace Tnb.ProductionMgr // WmsSignForDeliveryService wmsSignForDeliveryService, IDictionaryDataService dictionaryDataService, IWmsCarryBindService wmsCarryBindService, + IWmsCarryUnbindService wmsCarryUnbindService, IUserManager userManager ) { @@ -55,6 +58,7 @@ namespace Tnb.ProductionMgr _dictionaryDataService = dictionaryDataService; _billRullService = billRullService; _wmsCarryBindService = wmsCarryBindService; + _wmsCarryUnbindService = wmsCarryUnbindService; } @@ -457,7 +461,7 @@ namespace Tnb.ProductionMgr _ = await db.Insertable(prdFeedingH).ExecuteCommandAsync(); _ = await db.Insertable(list).ExecuteCommandAsync(); - _wmsCarryBindService.CarryCodeUnbind(new CarryCodeUnbindInput() + _wmsCarryUnbindService.CarryCodeUnbind(new CarryCodeUnbindInput() { carry_id = carry.id }); diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 6546c700..5e8fb7db 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -106,6 +106,7 @@ namespace Tnb.ProductionMgr private readonly IBillRullService _billRullService; private readonly IWareHouseService _wareHouseService; private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly IWmsCarryUnbindService _wmsCarryUnbindService; private readonly IWmsEmptyOutstockService _wmsEmptyOutstockService; private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); @@ -114,7 +115,8 @@ namespace Tnb.ProductionMgr #region 构造函数 public RedisBackGround(StackExRedisHelper redisData, IPrdInstockService prdInstockService, ISqlSugarRepository repository, IWmsPDAScanInStockService wmsPDAScanInStock - , IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService, IWmsEmptyOutstockService wmsEmptyOutstockService) + , IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService, + IWmsCarryUnbindService wmsCarryUnbindService, IWmsEmptyOutstockService wmsEmptyOutstockService) { _redisData = redisData; _prdInstockService = prdInstockService; @@ -125,6 +127,7 @@ namespace Tnb.ProductionMgr _wareHouseService = wareHouseService; _wmsCarryBindService = wmsCarryBindService; _wmsEmptyOutstockService = wmsEmptyOutstockService; + _wmsCarryUnbindService = wmsCarryUnbindService; db_CheckGettimer = repository.CopyNew(); db_Scantimer = repository.CopyNew(); @@ -1456,7 +1459,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA carryBindInput.carry_code = wmsMechanicalArmH.rackcode; carryBindInput.source_code = wmsMechanicalArmH.outbill; - await _wmsCarryBindService.CarryUnbind(carryBindInput); + await _wmsCarryUnbindService.CarryUnbind(carryBindInput); // 锁住终点库位 await db_Floor2timer移走下升降区未生成预任务且空托的料架.Updateable(r => new BasLocation diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index 2bd672f1..0486c45f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs @@ -103,6 +103,9 @@ public class ModuleConsts /// 模块标识-载具解绑 public const string MODULE_WMSCARRYUNBIND_ID = "26106270092325"; /// + /// 模块标识-生产退料单 todo + public const string MODULE_WMSPRDRETURN_ID = "MODULE_WMSPRDRETURN_ID"; + /// /// 模块标识-载具绑定 /// public const string MODULE_WMSCARRYBIND_ID = "26105163614501"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 15065e3a..e21c5c76 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -224,14 +224,18 @@ /// public const string BIZTYPE_WMSDELIVERY_ID = "26585291847957"; /// - /// 预任务生成业务类型-销售出库下发 + /// 预任务生成业务类型-销售出库 /// public const string BIZTYPE_WMSSALERELEASE_ID = "25104446664213"; /// - /// 预任务生成业务类型-原材料转库单下发 todo + /// 预任务生成业务类型-原材料转库单 todo /// public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "34354738929685"; /// + /// 预任务生成业务类型-生产退料单 todo + /// + public const string BIZTYPE_PRDRETURN_ID = "BIZTYPE_PRDRETURN_ID"; + /// /// 预任务生成业务类型-载具绑定 /// public const string BIZTYPE_WMSCARRYBIND_ID = "27118595509525"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PrdReturnInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PrdReturnInput.cs new file mode 100644 index 00000000..86b1812f --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PrdReturnInput.cs @@ -0,0 +1,32 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class PrdReturnInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 料架号 + /// + public string? carry_code { get; set; } + + /// + /// 起始库位 + /// + public string? startlocation_id { get; set; } + + /// + /// 生产退料单id + /// + public string source_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs index 6bbbf338..66161ecd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs @@ -12,7 +12,5 @@ namespace Tnb.WarehouseMgr.Interfaces Task CarryBind(VisualDevModelDataCrInput input); Task CarryBind(CarryBindInput input); - Task CarryUnbind(CarryBindInput input); - Task CarryCodeUnbind(CarryCodeUnbindInput input); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs new file mode 100644 index 00000000..7892d91d --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs @@ -0,0 +1,15 @@ +using JNPF.Common.Dtos.VisualDev; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Dto.Outputs; + +namespace Tnb.WarehouseMgr.Interfaces +{ + /// + /// 载具绑定服务接口 + /// + public interface IWmsCarryUnbindService + { + Task CarryUnbind(CarryBindInput input); + Task CarryCodeUnbind(CarryCodeUnbindInput input); + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsPrdReturnService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsPrdReturnService.cs new file mode 100644 index 00000000..be81ed7d --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsPrdReturnService.cs @@ -0,0 +1,14 @@ +using JNPF.Common.Dtos.VisualDev; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Dto.Outputs; + +namespace Tnb.WarehouseMgr.Interfaces +{ + /// + /// 载具绑定服务接口 + /// + public interface IWmsPrdReturnService + { + + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 438918aa..3b1fec2e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -19,6 +19,7 @@ using Newtonsoft.Json; using Org.BouncyCastle.Crypto.Agreement; using Senparc.CO2NET.Cache; using SqlSugar; +using Tnb.BasicData.Entities; using Tnb.Common.Extension; using Tnb.EquipMgr.Entities; using Tnb.WarehouseMgr.Entities; @@ -399,11 +400,9 @@ namespace Tnb.WarehouseMgr { Logger.Information("开始处理WCS上传的取消任务"); - - int row = await _db.Updateable().SetColumns(r => new WmsDistaskH { - agreement = "WCS上传取消(CANCELLED)信号 取消时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + agreement = "WCS上传取消(CANCELLED)信号", status = WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID }).Where(P => P.bill_code.Contains(input.taskChainCode)).ExecuteCommandAsync(); if (row > 0) @@ -420,11 +419,24 @@ namespace Tnb.WarehouseMgr await WmsElevatorUnlock(wmsElevatorUnlockInput); Logger.Information($"WCS取消任务{wmsDistaskH.bill_code},自动解占用电梯{wmsDistaskH.device_id}"); } + else + { + // 排除电梯任务 其他任务取消时自动解锁终点库位 + int unlockRow = await _db.Updateable().SetColumns(r => r.is_lock == 0).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync(); + if (unlockRow > 0) + { + Logger.Information($"成功解锁库位{wmsDistaskH.endlocation_code}"); + } + else + { + Logger.Information($"未成功解锁库位{wmsDistaskH.endlocation_code}"); + } + } } await _db.Updateable().SetColumns(r => new WmsPretaskH { - note = "WCS上传取消(CANCELLED)信号 取消时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + note = "WCS上传取消(CANCELLED)信号", status = WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID }).Where(P => wmsDistaskHCodes.Contains(P.bill_code)).ExecuteCommandAsync(); Logger.Information("成功处理WCS上传的取消任务"); @@ -441,7 +453,7 @@ namespace Tnb.WarehouseMgr Logger.Information("开始处理WCS上传的失败任务"); int row = await _db.Updateable().SetColumns(r => new WmsDistaskH { - agreement = "WCS上传失败(FAILURE)信号 失败时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + agreement = "WCS上传失败(FAILURE)信号", status = WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID }).Where(P => P.bill_code.Contains(input.taskChainCode)).ExecuteCommandAsync(); if (row > 0) @@ -450,7 +462,7 @@ namespace Tnb.WarehouseMgr await _db.Updateable().SetColumns(r => new WmsPretaskH { - note = "WCS上传失败(FAILURE)信号 取消时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + note = "WCS上传失败(FAILURE)信号", status = WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID }).Where(P => wmsDistaskHCodes.Contains(P.bill_code)).ExecuteCommandAsync(); Logger.Information("成功处理WCS上传的失败任务"); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 5c2b10a9..1079447b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -67,6 +67,7 @@ namespace Tnb.WarehouseMgr private readonly ICacheManager _cacheManager; private readonly IElevatorControlService _elevatorControlService; private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly IWmsCarryUnbindService _wmsCarryUnbindService; private static readonly Dictionary _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase); private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private static Dictionary locMap = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -86,6 +87,7 @@ namespace Tnb.WarehouseMgr public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, StackExRedisHelper redisData, IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService, IWmsCarryBindService wmsCarryBindService, + IWmsCarryUnbindService wmsCarryUnbindService, IRunService runService, IVisualDevService visualDevService //IConfiguration configuration @@ -99,6 +101,7 @@ namespace Tnb.WarehouseMgr _elevatorControlService = elevatorControlService; _redisData = redisData; _wmsCarryBindService = wmsCarryBindService; + _wmsCarryUnbindService = wmsCarryUnbindService; _runService = runService; _visualDevService = visualDevService; //_configuration = configuration; @@ -2133,7 +2136,7 @@ namespace Tnb.WarehouseMgr CarryCodeUnbindInput carryCodeUnbindInput = new CarryCodeUnbindInput(); carryCodeUnbindInput.carry_id = dt.carry_id; - await _wmsCarryBindService.CarryCodeUnbind(carryCodeUnbindInput); + await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput); } } // 成品调拨入库 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index 70351ca4..33ff504f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -266,116 +266,7 @@ namespace Tnb.WarehouseMgr return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); } - /// - /// 解绑定料箱到料架 - /// - /// - /// - /// - /// - [NonAction] - public async Task CarryUnbind(CarryBindInput input) - { - bool isOk = false; - try - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); - if (carry != null) - { - int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); - isOk = row > 0; - - if (!isOk) - { - throw Oops.Oh(ErrorCode.COM1001); - } - - - // 插入子载具绑定记录 - VisualDevModelDataCrInput visualDevModelCrInput = new() { data = new Dictionary() }; - visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_id)] = input.carry_id; - visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_code)] = input.carry_code; - visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_id)] = input.membercarry_id; - visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_code)] = input.membercarry_code; - visualDevModelCrInput.data[nameof(WmsCarrybindH.type)] = 0; - visualDevModelCrInput.data[nameof(WmsCarrybindH.carrystd_id)] = carry.carrystd_id; - if (!string.IsNullOrEmpty(input.create_id)) - visualDevModelCrInput.data[nameof(WmsCarrybindH.create_id)] = input.create_id; - - visualDevModelCrInput.data[nameof(WmsCarrybindH.create_time)] = DateTime.Now; - visualDevModelCrInput.data[nameof(WmsCarrybindH.loc)] = 1; - VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYUNBIND_ID, true); - await _runService.Create(templateEntity, visualDevModelCrInput); - - await _db.Ado.CommitTranAsync(); - } - else - { - if (carry == null) - { - throw new AppFriendlyException("没有可用的主载具", 500); - } - } - } - catch (Exception ex) - { - Logger.LogError($"【CarryUnbind】 {ex.Message}"); - Logger.LogError($"【CarryUnbind】 {ex.StackTrace}"); - await _db.Ado.RollbackTranAsync(); - return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); - } - - return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); - } - - /// - /// - /// - /// - /// - /// - /// - [NonAction] - public async Task CarryCodeUnbind(CarryCodeUnbindInput input) - { - bool isOk = false; - try - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); - if (carry != null) - { - int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); - isOk = row > 0; - - if (!isOk) - { - throw Oops.Oh(ErrorCode.COM1001); - } - } - else - { - if (carry == null) - { - throw new AppFriendlyException("没有可用的主载具", 500); - } - } - } - catch (Exception ex) - { - return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); - } - return Task.FromResult(true); - } + /* public override async Task ModifyAsync(WareHouseUpInput input) { if (input == null) throw new ArgumentNullException(nameof(input)); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs index 34923f99..2f779bf1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs @@ -6,8 +6,12 @@ using JNPF.FriendlyException; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; using SqlSugar; using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -17,25 +21,22 @@ namespace Tnb.WarehouseMgr /// 载具解绑 /// [OverideVisualDev(ModuleConsts.MODULE_WMSCARRYUNBIND_ID)] - public class WmsCarryUnbindService : BaseWareHouseService + public class WmsCarryUnbindService : BaseWareHouseService, IWmsCarryUnbindService { private readonly ISqlSugarClient _db; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly IUserManager _userManager; - private readonly IWareHouseService _wareHouseService; public WmsCarryUnbindService( ISqlSugarRepository repository, IRunService runService, IVisualDevService visualDevService, - IWareHouseService wareHouseService, IUserManager userManager) { _db = repository.AsSugarClient(); _runService = runService; _visualDevService = visualDevService; _userManager = userManager; - _wareHouseService = wareHouseService; OverideFuncs.CreateAsync = CarryUnbind; } private async Task CarryUnbind(VisualDevModelDataCrInput input) @@ -119,5 +120,116 @@ namespace Tnb.WarehouseMgr var isOk = await _db.Updateable().SetColumns(it => new WmsCarryReplaceH { status = input.bizTypeId }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1001); }*/ + + /// + /// 解绑定料箱到料架 + /// + /// + /// + /// + /// + [NonAction] + public async Task CarryUnbind(CarryBindInput input) + { + bool isOk = false; + try + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + if (carry != null) + { + int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); + isOk = row > 0; + + if (!isOk) + { + throw Oops.Oh(ErrorCode.COM1001); + } + + + // 插入子载具绑定记录 + VisualDevModelDataCrInput visualDevModelCrInput = new() { data = new Dictionary() }; + visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_id)] = input.carry_id; + visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_code)] = input.carry_code; + visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_id)] = input.membercarry_id; + visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_code)] = input.membercarry_code; + visualDevModelCrInput.data[nameof(WmsCarrybindH.type)] = 0; + visualDevModelCrInput.data[nameof(WmsCarrybindH.carrystd_id)] = carry.carrystd_id; + if (!string.IsNullOrEmpty(input.create_id)) + visualDevModelCrInput.data[nameof(WmsCarrybindH.create_id)] = input.create_id; + + visualDevModelCrInput.data[nameof(WmsCarrybindH.create_time)] = DateTime.Now; + visualDevModelCrInput.data[nameof(WmsCarrybindH.loc)] = 1; + VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYUNBIND_ID, true); + await _runService.Create(templateEntity, visualDevModelCrInput); + + await _db.Ado.CommitTranAsync(); + } + else + { + if (carry == null) + { + throw new AppFriendlyException("没有可用的主载具", 500); + } + } + } + catch (Exception ex) + { + Logger.LogError($"【CarryUnbind】 {ex.Message}"); + Logger.LogError($"【CarryUnbind】 {ex.StackTrace}"); + await _db.Ado.RollbackTranAsync(); + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); + } + + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); + } + + /// + /// + /// + /// + /// + /// + /// + [NonAction] + public async Task CarryCodeUnbind(CarryCodeUnbindInput input) + { + bool isOk = false; + try + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + if (carry != null) + { + int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); + isOk = row > 0; + + if (!isOk) + { + throw Oops.Oh(ErrorCode.COM1001); + } + } + else + { + if (carry == null) + { + throw new AppFriendlyException("没有可用的主载具", 500); + } + } + } + catch (Exception ex) + { + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); + } + return Task.FromResult(true); + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index d7831dee..a1bad1c1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -49,7 +49,7 @@ namespace Tnb.WarehouseMgr [ServiceModule(BizTypeId)] public class WmsMaterialTransferService : BaseWareHouseService { - private const string BizTypeId = "34354738929685"; + private const string BizTypeId = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; private readonly ISqlSugarClient _db; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; @@ -57,6 +57,7 @@ namespace Tnb.WarehouseMgr private readonly IBillRullService _billRullService; private readonly IUserManager _userManager; private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly IWmsCarryUnbindService _wmsCarryUnbindService; public static SemaphoreSlim s_taskDistributeToZCC = new(1); @@ -67,7 +68,8 @@ namespace Tnb.WarehouseMgr IWareHouseService wareHouseService, IUserManager userManager, IBillRullService billRullService, - IEventPublisher eventPublisher, + IEventPublisher eventPublisher, + IWmsCarryUnbindService wmsCarryUnbindService, IWmsCarryBindService wmsCarryBindService) { _db = repository.AsSugarClient(); @@ -77,6 +79,7 @@ namespace Tnb.WarehouseMgr _userManager = userManager; _billRullService = billRullService; _wmsCarryBindService = wmsCarryBindService; + _wmsCarryUnbindService = wmsCarryUnbindService; OverideFuncs.GetListAsync = GetList; } @@ -565,33 +568,45 @@ namespace Tnb.WarehouseMgr { throw new ArgumentNullException(nameof(input)); } - List wmsCarryCodes = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]).ToListAsync(); - if (wmsCarryCodes.Count == 0) + + try { - Logger.LogWarning($"【ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); - return; + List wmsCarryCodes = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]).ToListAsync(); + if (wmsCarryCodes.Count == 0) + { + Logger.LogWarning($"【WmsMaterialTransferService ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); + return; + } + 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(); + + // 如果所有明细已完成 更新主表状态为完成 + WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.source_id).SingleAsync(); + List wmsMaterialTransferDs = _db.Queryable() + .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList(); + bool isOk2 = true; + if (wmsMaterialTransferDs.Count == 0) + { + isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) + .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); + } + + // require_code是任务单 + //string mo_task_code = input.require_code; + + if (!isOk || !isOk2) + { + throw Oops.Oh(ErrorCode.COM1001); + } + await _db.Ado.CommitTranAsync(); } - // 更新已转数量 - 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(); - - // 如果所有明细已完成 更新主表状态为完成 - WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.source_id).SingleAsync(); - List wmsMaterialTransferDs = _db.Queryable() - .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList(); - bool isOk2 = true; - if (wmsMaterialTransferDs.Count == 0) + catch(Exception ex) { - isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) - .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); - } - - // require_code是任务单 - //string mo_task_code = input.require_code; - - if (!isOk || !isOk2) - { - throw Oops.Oh(ErrorCode.COM1001); + Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.Message); + Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.StackTrace); + await _db.Ado.RollbackTranAsync(); } } @@ -999,7 +1014,7 @@ namespace Tnb.WarehouseMgr CarryBindInput carryBindInput = new(); carryBindInput.carry_id = wmsCarryH.id; carryBindInput.carry_code = wmsCarryH.carry_code; - var resCarryUnbind = await _wmsCarryBindService.CarryUnbind(carryBindInput); + var resCarryUnbind = await _wmsCarryUnbindService.CarryUnbind(carryBindInput); if (resCarryUnbind.code != JNPF.Common.Enums.HttpStatusCode.OK) { throw new AppFriendlyException($"解除绑定料箱到料架失败 载具 {input.carry_code}", 500); @@ -1021,7 +1036,7 @@ namespace Tnb.WarehouseMgr } } - Logger.LogWarning($"【RackEmptyInstock】开始生成预任务"); + Logger.LogWarning($"【RackInstock】开始生成预任务"); CommonCreatePretaskInput commonCreatePretaskInput = new(); commonCreatePretaskInput.startlocation_id = startlocation.id; commonCreatePretaskInput.endlocation_id = endlocation.id; @@ -1080,7 +1095,7 @@ namespace Tnb.WarehouseMgr await _db.Ado.BeginTranAsync(); - Logger.LogWarning($"【RackEmptyInstock】开始生成预任务"); + Logger.LogWarning($"【RackInstock】开始生成预任务"); CommonCreatePretaskInput commonCreatePretaskInput = new(); commonCreatePretaskInput.startlocation_id = startlocation.id; commonCreatePretaskInput.endlocation_id = endlocation.id; @@ -1095,7 +1110,7 @@ namespace Tnb.WarehouseMgr Logger.LogInformation($"【RackInstock】生成预任务失败 载具 {input.carry_code}"); throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500); } - Logger.LogWarning($"【RackEmptyInstock】生成预任务成功"); + Logger.LogWarning($"【RackInstock】生成预任务成功"); await _db.Ado.CommitTranAsync(); } catch (Exception ex) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs index 0ba19ac5..ab216e5d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs @@ -35,6 +35,7 @@ namespace Tnb.WarehouseMgr private readonly IBillRullService _billRullService; private readonly IWareHouseService _wareHouseService; private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly IWmsCarryUnbindService _wmsCarryUnbindService; private readonly IWmsCarryService _wmsCarryService; @@ -47,6 +48,7 @@ namespace Tnb.WarehouseMgr IWareHouseService wareHouseService, IBillRullService billRullService, IWmsCarryBindService wmsCarryBindService, + IWmsCarryUnbindService wmsCarryUnbindService, IWmsCarryService wmsCarryService) { _db = repository.AsSugarClient(); @@ -56,6 +58,7 @@ namespace Tnb.WarehouseMgr _billRullService = billRullService; _wareHouseService = wareHouseService; _wmsCarryBindService = wmsCarryBindService; + _wmsCarryUnbindService = wmsCarryUnbindService; _wmsCarryService = wmsCarryService; OverideFuncs.CreateAsync = PDACarryBind; } @@ -401,7 +404,7 @@ namespace Tnb.WarehouseMgr WmsCarryH wmsCarryH = _db.Queryable().Where(r => r.location_id == input.location_id).First(); CarryCodeUnbindInput carryCodeUnbindInput = new CarryCodeUnbindInput(); carryCodeUnbindInput.carry_id = wmsCarryH.id; - await _wmsCarryBindService.CarryCodeUnbind(carryCodeUnbindInput); + await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput); await _db.Ado.CommitTranAsync(); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs new file mode 100644 index 00000000..a1d69bb7 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs @@ -0,0 +1,381 @@ +using System.Security.Cryptography.X509Certificates; +using JNPF.Common.Core.Manager; +using JNPF.Common.Dtos.VisualDev; +using JNPF.Common.Enums; +using JNPF.Common.Security; +using JNPF.FriendlyException; +using JNPF.VisualDev; +using JNPF.VisualDev.Entitys; +using JNPF.VisualDev.Interfaces; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using NPOI.POIFS.Storage; +using SqlSugar; +using Tnb.BasicData.Entities; +using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Attributes; +using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Dto.Outputs; +using Tnb.WarehouseMgr.Entities.Entity; +using Tnb.WarehouseMgr.Entities.Enums; +using Tnb.WarehouseMgr.Interfaces; + +namespace Tnb.WarehouseMgr +{ + /// + /// 载具解绑 + /// + [OverideVisualDev(ModuleConsts.MODULE_WMSPRDRETURN_ID)] + [ServiceModule(BizTypeId)] + public class WmsPrdReturnService : BaseWareHouseService, IWmsPrdReturnService + { + private const string BizTypeId = WmsWareHouseConst.BIZTYPE_PRDRETURN_ID; + private readonly ISqlSugarClient _db; + private readonly IRunService _runService; + private readonly IVisualDevService _visualDevService; + private readonly IUserManager _userManager; + private readonly IWareHouseService _wareHouseService; + public WmsPrdReturnService( + ISqlSugarRepository repository, + IRunService runService, + IVisualDevService visualDevService, + IWareHouseService wareHouseService, + IUserManager userManager) + { + _db = repository.AsSugarClient(); + _runService = runService; + _visualDevService = visualDevService; + _userManager = userManager; + _wareHouseService = wareHouseService; + } + + /// + /// 从产线呼叫装料架到暂存仓/缓存仓 + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task PrdReturn(PrdReturnInput input) + { + WmsPrdReturnH wmsPrdReturnH = await _db.Queryable().Where(r => r.id == input.source_id).FirstAsync(); + if (wmsPrdReturnH == null) + { + Logger.LogWarning($"【PrdReturn】不存在id为{input.source_id}的生产退料单!"); + throw new AppFriendlyException($"【PrdReturn】不存在id为{input.startlocation_id}的生产退料单!", 500); + } + if (wmsPrdReturnH.status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID) + { + Logger.LogWarning($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已完成!"); + throw new AppFriendlyException($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已完成!", 500); + } + if (wmsPrdReturnH.status == WmsWareHouseConst.BILLSTATUS_CANCEL_ID) + { + Logger.LogWarning($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已取消!"); + throw new AppFriendlyException($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已取消!", 500); + } + + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); + + // 料架到暂存仓 + if (wmsCarryH.carrystd_id == "26037267399717") + { + return await Return_到暂存仓(input, wmsCarryH, wmsPrdReturnH); + } + // 载运小车和载运料架到缓存仓 + else if (wmsCarryH.carrystd_id == "26103233723941" || wmsCarryH.carrystd_id == "34995839046677") + { + return await Return_到缓存仓(input, wmsCarryH, wmsPrdReturnH); + } + else + { + Logger.LogError($"【PrdReturn】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"【PrdReturn】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!"); + } + } + + + async Task Return_到暂存仓(PrdReturnInput input, WmsCarryH wmsCarryH, WmsPrdReturnH wmsPrdReturnH) + { + try + { + BasLocation startlocation = _db.Queryable().Where(r => r.id == input.startlocation_id).First(); + if (startlocation == null) + { + Logger.LogWarning($"【PrdReturn】不存在id为{input.startlocation_id}的库位!"); + throw new AppFriendlyException($"【PrdReturn】不存在id为{input.startlocation_id}的库位!", 500); + } + if (string.IsNullOrEmpty(input.carry_code)) + { + Logger.LogWarning($"【PrdReturn】料架不能为空!{input.carry_code}"); + throw new AppFriendlyException($"【PrdReturn】料架不能为空!{input.carry_code}!", 500); + } + + // 找到未占用且未锁定的库位 + ISugarQueryable rackEndLocations = + _db.Queryable() + .Where(r => r.wh_id == "33780009364245" && r.is_use == "0" && r.is_lock == 0 && r.is_type == "0").OrderBy(a => a.id).Take(1); + + if (rackEndLocations.Count() == 0) + { + Logger.LogWarning($"【PrdReturn】没有可用的终点库位"); + throw new AppFriendlyException($"【PrdReturn】没有可用的终点库位!", 500); + } + + BasLocation endlocation = rackEndLocations.First(); + + var memberCarryCodes = _db.Queryable() + .InnerJoin((a, b) => a.membercarry_id == b.id) + .InnerJoin((a, b, c) => b.id == c.carry_id) + .Where((a, b, c) => a.carry_id == wmsCarryH.id).Select((a, b, c) => new + { + carry_code = b.carry_code, + barcode = c.barcode, + material_id = c.material_id, + material_code = c.material_code, + }).ToList(); + + List matIds = memberCarryCodes.Select(r => r.material_id).Distinct().ToList(); + + // 匹配生产退料单明细的物料种类 + List existsMatIds = _db.Queryable().Where(r => r.bill_id == input.source_id).Select(r => r.material_id).Distinct().ToList(); + List notExistsMatIds = matIds.Where(r => !existsMatIds.Contains(r)).ToList(); + + if (notExistsMatIds.Count() > 0) + { + var existsMat = memberCarryCodes.Where(r => notExistsMatIds.Contains(r.material_id)).Select(r => new + { + carry_code = r.carry_code, + barcode = r.barcode, + }); + + string msg = ""; + foreach (var row in existsMat) + { + msg += $",料箱{row.carry_code} 条码{row.barcode}"; + } + Logger.LogWarning($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查! {msg.Trim(',')}"); + throw new AppFriendlyException($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查!{msg.Trim(',')}", 500); + } + + WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First(); + if (wmsPretaskH != null) + { + Logger.LogWarning($"【CallRackToProductionLine】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); + throw new AppFriendlyException($"此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!", 500); + } + + await _db.Ado.BeginTranAsync(); + + Logger.LogWarning($"【PrdReturn】开始生成预任务"); + CommonCreatePretaskInput commonCreatePretaskInput = new(); + commonCreatePretaskInput.startlocation_id = startlocation.id; + commonCreatePretaskInput.endlocation_id = endlocation.id; + commonCreatePretaskInput.source_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = input.carry_code; + commonCreatePretaskInput.task_type = ""; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_PRDRETURN_ID; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【PrdReturn】生成预任务失败 载具 {input.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500); + } + Logger.LogWarning($"【PrdReturn】生成预任务成功"); + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + Logger.LogError("【PrdReturn】" + ex.Message); + Logger.LogError("【PrdReturn】" + ex.StackTrace); + await _db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + async Task Return_到缓存仓(PrdReturnInput input, WmsCarryH wmsCarryH, WmsPrdReturnH wmsPrdReturnH) + { + try + { + BasLocation startlocation = _db.Queryable().Where(r => r.id == input.startlocation_id).First(); + if (startlocation == null) + { + Logger.LogWarning($"【PrdReturn】不存在id为{input.startlocation_id}的库位!"); + throw new AppFriendlyException($"【PrdReturn】不存在id为{input.startlocation_id}的库位!", 500); + } + if (string.IsNullOrEmpty(input.carry_code)) + { + Logger.LogWarning($"【PrdReturn】料架不能为空!{input.carry_code}"); + throw new AppFriendlyException($"【PrdReturn】料架不能为空!{input.carry_code}!", 500); + } + + // 找到未占用且未锁定的库位 + ISugarQueryable rackEndLocations = + _db.Queryable() + .Where(r => r.wh_id == "26103348825381" && r.is_use == "0" && r.is_lock == 0 && r.is_type == "0").OrderBy(a => a.id).Take(1); + + if (rackEndLocations.Count() == 0) + { + Logger.LogWarning($"【PrdReturn】没有可用的终点库位"); + throw new AppFriendlyException($"【PrdReturn】没有可用的终点库位!", 500); + } + + BasLocation endlocation = rackEndLocations.First(); + + var memberCarryCodes = _db.Queryable() + .InnerJoin((a, b) => a.id == b.carry_id) + .Where((a, b) => a.id == wmsCarryH.id).Select((a, b) => new + { + carry_code = a.carry_code, + barcode = b.barcode, + material_id = b.material_id, + material_code = b.material_code, + }).ToList(); + + List matIds = memberCarryCodes.Select(r => r.material_id).Distinct().ToList(); + + // 匹配生产退料单明细的物料种类 + List existsMatIds = _db.Queryable().Where(r => r.bill_id == input.source_id).Select(r => r.material_id).Distinct().ToList(); + List notExistsMatIds = matIds.Where(r => !existsMatIds.Contains(r)).ToList(); + + if (notExistsMatIds.Count() > 0) + { + var existsMat = memberCarryCodes.Where(r => notExistsMatIds.Contains(r.material_id)).Select(r => new + { + carry_code = r.carry_code, + barcode = r.barcode, + }); + + string msg = ""; + foreach (var row in existsMat) + { + msg += $",料箱{row.carry_code} 条码{row.barcode}"; + } + Logger.LogWarning($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查! {msg.Trim(',')}"); + throw new AppFriendlyException($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查!{msg.Trim(',')}", 500); + } + + WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First(); + if (wmsPretaskH != null) + { + Logger.LogWarning($"【CallRackToProductionLine】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); + throw new AppFriendlyException($"此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!", 500); + } + + await _db.Ado.BeginTranAsync(); + + Logger.LogWarning($"【PrdReturn】开始生成预任务"); + CommonCreatePretaskInput commonCreatePretaskInput = new(); + commonCreatePretaskInput.startlocation_id = startlocation.id; + commonCreatePretaskInput.endlocation_id = endlocation.id; + commonCreatePretaskInput.source_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = input.carry_code; + commonCreatePretaskInput.task_type = ""; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_PRDRETURN_ID; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【PrdReturn】生成预任务失败 载具 {input.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500); + } + Logger.LogWarning($"【PrdReturn】生成预任务成功"); + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + Logger.LogError("【PrdReturn】" + ex.Message); + Logger.LogError("【PrdReturn】" + ex.StackTrace); + await _db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + public override async Task ModifyAsync(WareHouseUpInput input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + try + { + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.id == input.carryIds[0]).FirstAsync(); + + List wmsCarryCodes = null; + // 料架到暂存仓 + if (wmsCarryH.carrystd_id == "26037267399717") + { + wmsCarryCodes = _db.Queryable() + .InnerJoin((a, b) => a.membercarry_id == b.id) + .InnerJoin((a, b, c) => b.id == c.carry_id) + .Where((a, b, c) => a.carry_id == wmsCarryH.id).Select((a, b, c) => c).ToList(); + } + // 载运小车和载运料架到缓存仓 + else if (wmsCarryH.carrystd_id == "26103233723941" || wmsCarryH.carrystd_id == "34995839046677") + { + + wmsCarryCodes = _db.Queryable() + .InnerJoin((a, b) => a.id == b.carry_id) + .Where((a, b) => a.id == wmsCarryH.id).Select((a, b) => b).ToList(); + } + else + { + Logger.LogError($"【WmsPrdReturnService ModifyAsync】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!"); + return; + } + + if (wmsCarryCodes.Count == 0) + { + Logger.LogWarning($"【WmsPrdReturnService ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); + return; + } + + await _db.Ado.BeginTranAsync(); + // 更新已转数量 + List wmsPrdReturnDs = _db.Queryable().Where(r => r.bill_id == input.source_id).ToList(); + foreach (WmsPrdReturnD wmsPrdReturnD in wmsPrdReturnDs) + { + decimal qty = wmsCarryCodes.Where(r => r.material_id == wmsPrdReturnD.material_id).Sum(r => r.codeqty); + wmsPrdReturnD.ytqty = wmsPrdReturnD.ytqty + qty; + } + + + bool isOk = await _db.Updateable(wmsPrdReturnDs).UpdateColumns(r => r.ytqty).ExecuteCommandAsync() > 0; + + // 如果所有明细已完成 更新主表状态为完成 + wmsPrdReturnDs = _db.Queryable() + .Where(a => a.bill_id == input.source_id && a.ytqty < a.qty).ToList(); + bool isOk2 = true; + if (wmsPrdReturnDs.Count == 0) + { + isOk2 = await _db.Updateable().SetColumns(it => new WmsPrdReturnH { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) + .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); + } + + // require_code是任务单 + //string mo_task_code = input.require_code; + + if (!isOk || !isOk2) + { + throw Oops.Oh(ErrorCode.COM1001); + } + await _db.Ado.CommitTranAsync(); + } + catch(Exception ex) + { + Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.Message); + Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.StackTrace); + await _db.Ado.RollbackTranAsync(); + } + + } + } +}