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);
}
}
}