using System.Runtime.CompilerServices; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Enums; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Logging; using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using Tnb.Common.Utils; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { /// /// 载具服务 /// [OverideVisualDev(ModuleConsts.MODULE_WMSCARRYREPLACE_ID)] public class WmsCarryService : BaseWareHouseService, IWmsCarryService { private readonly ISqlSugarClient _db; private readonly IUserManager _userManager; private readonly IBillRullService _billRullService; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; public WmsCarryService( ISqlSugarRepository repository, IUserManager userManager, IBillRullService billRullService, IRunService runService, IVisualDevService visualDevService) { _db = repository.AsSugarClient(); _userManager = userManager; _billRullService = billRullService; _runService = runService; _visualDevService = visualDevService; OverideFuncs.CreateAsync = ExchangeCarry; } /// /// 根据载具ID获取载具信息 /// /// /// [HttpGet] public async Task GetCarryInfoById([FromRoute] string carryId) { var carryOutPut = await _db.Queryable().Where(it => it.id == carryId).Select().FirstAsync(); if (carryOutPut == null) throw new AppFriendlyException("找不到载具", 500); carryOutPut.carryDetails = await _db.Queryable().Where(it => it.carry_id == carryId).ToListAsync(); carryOutPut.carryCodes = await _db.Queryable().Where(it => it.carry_id == carryId).ToListAsync(); carryOutPut.carryMats = await _db.Queryable().Where(it => it.carry_id == carryId).ToListAsync(); return carryOutPut; } /// /// 更换载具 /// /// /// 输入参数: ///
{ ///
old_carry_id:老载具id ///
new_carry_id:新载具ID ///
} /// /// /// private async Task ExchangeCarry(VisualDevModelDataCrInput input) { var isOk = false; try { await _db.Ado.BeginTranAsync(); var oldCarryId = input.data.ContainsKey("carry_id") ? input.data["carry_id"]?.ToString() : ""; var newCarryId = input.data.ContainsKey("newcarry_id") ? input.data["newcarry_id"]?.ToString() : ""; var oldCarry = await _db.Queryable().FirstAsync(it => it.id == oldCarryId); var newCarry = await _db.Queryable().FirstAsync(it => it.id == newCarryId); if (oldCarry != null && newCarry != null) { ExChangeCarryInput carryInput = new() { old_carry_id = oldCarry.id, new_carry_id = newCarry.id }; isOk = await _updateSubCarry(carryInput); isOk = await _updateSubCarry(carryInput); isOk = await _updateSubCarry(carryInput); newCarry.status = oldCarry.status; newCarry.carry_status = oldCarry.carry_status; newCarry.location_id = oldCarry.location_id; newCarry.location_code = oldCarry.location_code; newCarry.is_lock = oldCarry.is_lock; newCarry.out_status = oldCarry.out_status; newCarry.is_check = oldCarry.is_check; newCarry.bale_num = oldCarry.bale_num; newCarry.collocation_scheme_id = oldCarry.collocation_scheme_id; newCarry.collocation_scheme_code = oldCarry.collocation_scheme_code; newCarry.source_id = oldCarry.source_id; newCarry.source_code = oldCarry.source_code; newCarry.create_id = _userManager.UserId; newCarry.create_time = DateTime.Now; var row = await _db.Updateable(newCarry).ExecuteCommandAsync(); WmsCarryReplaceH wmsCarryReplaceH = oldCarry.Adapt(); wmsCarryReplaceH.id = SnowflakeIdHelper.NextId(); wmsCarryReplaceH.org_id = _userManager.User.OrganizeId; wmsCarryReplaceH.bill_code = await _billRullService.GetBillNumber(WmsCarryConst.WMS_CARRY_REPLACE_ENCODE); wmsCarryReplaceH.carry_id = oldCarry.id; wmsCarryReplaceH.carry_code = oldCarry.carry_code; wmsCarryReplaceH.newcarry_id = newCarry.id; wmsCarryReplaceH.newcarry_code = newCarry.carry_code; wmsCarryReplaceH.create_id = _userManager.UserId; wmsCarryReplaceH.create_time = DateTime.Now; wmsCarryReplaceH.modify_id = null; wmsCarryReplaceH.modify_time = null; row = await _db.Insertable(wmsCarryReplaceH).ExecuteCommandAsync(); row = await await UpdateNullCarry(oldCarry); isOk = (row > 0); if (!isOk) throw Oops.Oh(ErrorCode.COM1001); } else { if (oldCarry == null) { throw new AppFriendlyException("没有可用的旧载具", 500); } if (newCarry == null) { throw new AppFriendlyException("没有可用的新载具", 500); } } await _db.Ado.CommitTranAsync(); } catch (Exception ex) { Log.Error("载具更换失败", ex); await _db.Ado.RollbackTranAsync(); throw; } return isOk; } [NonAction] public async Task> UpdateNullCarry(WmsCarryH carryObj, Func>? updateTask = null) { var row = 1; Task resTask = Task.FromResult(row); try { carryObj.status = 0; carryObj.carry_status = ((int)EnumCarryStatus.空闲).ToString(); carryObj.location_id = null; carryObj.location_code = null; carryObj.out_status = "0"; carryObj.is_check = 1; carryObj.status = 1; carryObj.bale_num = null; carryObj.collocation_scheme_id = null; carryObj.collocation_scheme_code = null; carryObj.source_id = null; carryObj.source_code = null; resTask = updateTask?.Invoke(carryObj) ?? _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync(); //*****删除对应明细表 //删除载具明细 await _db.CopyNew().Deleteable().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync(); //删除载具分拣物料明细 await _db.CopyNew().Deleteable().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync(); //删除载具条码 await _db.CopyNew().Deleteable().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync(); } catch (Exception ex) { row = 0; resTask = Task.FromResult(row); Log.Error("更新空载具出错", ex); throw; } return resTask; } private async Task _updateSubCarry(ExChangeCarryInput input) where T : BaseEntity, IWmsCarryEntity, new() { var row = -1; var items = await _db.Queryable().Where(it => it.carry_id == input.old_carry_id).ToListAsync(); if (items?.Count > 0) { List newItems = DeepCopyHelper.DeepCopyList(items); if (newItems?.Count > 0) { newItems.ForEach(x => { x.id = SnowflakeIdHelper.NextId(); x.carry_id = input.new_carry_id; }); row = await _db.Insertable(newItems).ExecuteCommandAsync(); } if (row > 0) { row = await _db.Deleteable(items).ExecuteCommandAsync(); } } return (row > 0); } } }