Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs
qianjiawei 130e696699 bug
2024-02-05 10:33:52 +08:00

303 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Text;
using System.Text.RegularExpressions;
using JNPF.Common.Contracts;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.Logging;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Authorization;
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.Inputs;
using Tnb.WarehouseMgr.Entities.Dto.Outputs;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 载具服务
/// </summary>
[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<WmsCarryH> repository,
IUserManager userManager,
IBillRullService billRullService,
IRunService runService,
IVisualDevService visualDevService)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_billRullService = billRullService;
_runService = runService;
_visualDevService = visualDevService;
OverideFuncs.CreateAsync = ExchangeCarry;
}
/// <summary>
/// 根据载具ID获取载具信息
/// </summary>
/// <param name="carryId"></param>
/// <returns></returns>
[HttpGet]
public async Task<dynamic> GetCarryInfoById([FromRoute] string carryId)
{
CarryInfoOutput carryOutPut = await _db.Queryable<WmsCarryH>().Where(it => it.id == carryId).Select<CarryInfoOutput>().FirstAsync();
if (carryOutPut == null)
{
throw new AppFriendlyException("找不到载具", 500);
}
carryOutPut.carryDetails = await _db.Queryable<WmsCarryD>().Where(it => it.carry_id == carryId).ToListAsync();
carryOutPut.carryCodes = await _db.Queryable<WmsCarryCode>().Where(it => it.carry_id == carryId).ToListAsync();
carryOutPut.carryMats = await _db.Queryable<WmsCarryMat>().Where(it => it.carry_id == carryId).ToListAsync();
return carryOutPut;
}
[HttpGet]
public async Task<dynamic> GetCarryInfoByCode([FromRoute] string carrycode)
{
var carryOutPut = await _db.Queryable<WmsCarryH>().Where(it => it.carry_code == carrycode).FirstAsync();
return carryOutPut;
}
/// <summary>
/// 更换载具
/// </summary>
/// <param name="input">
/// 输入参数:
/// <br/>{
/// <br/> old_carry_id:老载具id
/// <br/> new_carry_id新载具ID
/// <br/>}
/// </param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
private async Task<dynamic> ExchangeCarry(VisualDevModelDataCrInput input)
{
bool isOk = false;
try
{
await _db.Ado.BeginTranAsync();
string? oldCarryId = input.data.ContainsKey("carry_id") ? input.data["carry_id"]?.ToString() : "";
string? newCarryId = input.data.ContainsKey("newcarry_id") ? input.data["newcarry_id"]?.ToString() : "";
WmsCarryH? oldCarry = await _db.Queryable<WmsCarryH>().FirstAsync(it => it.id == oldCarryId);
WmsCarryH? newCarry = await _db.Queryable<WmsCarryH>().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<WmsCarryD>(carryInput);
isOk = await _updateSubCarry<WmsCarryMat>(carryInput);
isOk = await _updateSubCarry<WmsCarryCode>(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;
int row = await _db.Updateable(newCarry).ExecuteCommandAsync();
WmsCarryReplaceH wmsCarryReplaceH = oldCarry.Adapt<WmsCarryReplaceH>();
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<Task<int>> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>>? updateTask = null)
{
int row = 1;
Task<int> 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<WmsCarryD>().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync();
//删除载具分拣物料明细
_ = await _db.CopyNew().Deleteable<WmsCarryMat>().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync();
//删除载具条码
_ = await _db.CopyNew().Deleteable<WmsCarryCode>().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<bool> _updateSubCarry<T>(ExChangeCarryInput input) where T : BaseEntity<string>, IWmsCarryEntity, new()
{
int row = -1;
List<T> items = await _db.Queryable<T>().Where(it => it.carry_id == input.old_carry_id).ToListAsync();
if (items?.Count > 0)
{
List<T> newItems = DeepCopyHelper<T>.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;
}
/// <summary>
/// 载具批量新增
/// </summary>
/// <param name="input">
///
/// </param>
/// <returns></returns>
[HttpPost, AllowAnonymous]
public async Task<dynamic> BatchAdd(CarryBatchAddInput input)
{
int r = 0, num = 0;
//var nonZeroPattern = @"[1-9]+";
var nonZeroPattern = @"\d+";
var code = input.carry_code.Match(@"\D+");
if (input.carry_code.IsMatch(@"\d+"))
{
num = input.carry_code.Match(nonZeroPattern).ParseToInt();
}
var carrys = await _db.Queryable<WmsCarryH>().Where(it => it.carry_code.Contains(code)).ToListAsync();
if (carrys?.Count < 1)
{
num = Math.Max(num, 1);
}
else
{
var lastCarry = carrys?.OrderByDescending(o => o.carry_code).FirstOrDefault() ?? default;
num = lastCarry?.carry_code.Match(nonZeroPattern).ParseToInt() ?? -1;
num = num + 1;
}
var batchCarrys = new List<WmsCarryH>(input.quantity);
for (var i = 1; i <= input.quantity; i++)
{
if (i != 1)
{
num += 1;
}
var sb = new StringBuilder();
sb.Append(code);
sb.Append(num.ToString().PadLeft(5, '0'));
var carryCode = sb.ToString();
WmsCarryH carry = input.Adapt<WmsCarryH>();
carry.id = SnowflakeIdHelper.NextId();
carry.carry_name = carryCode;
carry.carry_code = carryCode;
carry.is_check = 1;
carry.status = 1;
carry.create_id = "25398501929509";
carry.create_time = DateTime.Now;
batchCarrys.Add(carry);
}
r = await _db.Insertable(batchCarrys).ExecuteCommandAsync();
return r;
}
/// <summary>
/// 条码打印
/// </summary>
/// <param name="barCodes"></param>
/// <returns></returns>
[HttpPost]
public new void BarCodePrint(CarryBarCodeInput input)
{
if (input.barCodes == null || input.barCodes.Count < 1) throw new ArgumentNullException(nameof(input.barCodes));
input.barCodes = input.barCodes.OrderBy(o => o).ToList();
base.BarCodePrint(input.barCodes, input.copies,"");
}
}
}