Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs

514 lines
24 KiB
C#
Raw Permalink 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 Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using Npgsql;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.Common.Utils;
using Tnb.ProductionMgr.Entities.Enums;
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.Entity;
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 = EnumCheckConclusion..ParseToInt().ToString();
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 = EnumCheckConclusion..ParseToInt().ToString();
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, "");
}
/// <summary>
/// 载具绑定物料
/// </summary>
/// <param name="input"></param>
/// <exception cref="ArgumentNullException"></exception>
[HttpPost]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> BindCarryMaterial(BindCarryCodeInput input)
{
try
{
WmsCarryCode wmsCarryCode = input.Adapt<WmsCarryCode>();
wmsCarryCode.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsCarryCode.create_time = DateTime.Now;
wmsCarryCode.carry_id = input.carry_id;
wmsCarryCode.barcode = input.barcode;
wmsCarryCode.codeqty = input.codeqty;
wmsCarryCode.material_id = input.material_id;
wmsCarryCode.material_code = input.material_code;
wmsCarryCode.material_name = input.material_name;
wmsCarryCode.material_specification = input.material_specification;
wmsCarryCode.container_no = input.container_no;
wmsCarryCode.location_id = input.location_id;
wmsCarryCode.location_code = input.location_code;
wmsCarryCode.code_batch = input.code_batch;
wmsCarryCode.unit_id = input.unit_id;
wmsCarryCode.unit_code = input.unit_code;
wmsCarryCode.create_id = input.create_id;
int rows = await _db.Insertable<WmsCarryCode>(wmsCarryCode).ExecuteCommandAsync();
if (rows == 0)
{
throw new Exception($"接收到1个条码 成功绑定的条码数量为0个");
}
await _db.Updateable<WmsCarryH>().SetColumns(r => r.carry_status == ((int)EnumCarryStatus.).ToString()).Where(r => r.id == input.carry_id).ExecuteCommandAsync();
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.id == input.carry_id).FirstAsync();
WmsCarrybindH wmsCarrybindH = new WmsCarrybindH();
wmsCarrybindH.carry_id = input.carry_id;
wmsCarrybindH.carry_code = wmsCarryH.carry_code;
wmsCarrybindH.create_id = input.create_id;
wmsCarrybindH.create_time = DateTime.Now;
wmsCarrybindH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsCarrybindH.location_id = wmsCarryH.location_id;
wmsCarrybindH.location_code = wmsCarryH.location_code;
List<WmsCarrybindCode> wmsCarrybindCodes = new List<WmsCarrybindCode>();
var wmsCarrybindCode = input.Adapt<WmsCarrybindCode>();
wmsCarrybindCode.carrybind_id = wmsCarrybindH.id;
await _db.Insertable(wmsCarrybindH).ExecuteCommandAsync();
await _db.Insertable(wmsCarrybindCode).ExecuteCommandAsync();
return await ToApiResult(HttpStatusCode.OK, "成功");
}
catch (PostgresException ex)
{
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"绑定失败(1.可能是存在已被绑定的条码 2.存在其他与此载具编号相同的载具 3.存在字段传了空值) {ex.Message}", 500);
}
catch (Exception ex)
{
Logger.LogInformation(ex.Message);
Logger.LogInformation(ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
}
/// <summary>
/// 根据载具获取物料
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> MaterialByCarry(MaterialByCarryInput input)
{
try
{
if (string.IsNullOrEmpty(input.carry_code))
{
throw new AppFriendlyException($"【MaterialByCarry】托盘编码不能为空", 500);
}
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).FirstAsync();
if (wmsCarryH == null)
{
throw new AppFriendlyException($"【MaterialByCarry】托盘{input.carry_code}不存在", 500);
}
WmsDistaskH wmsDistaskH = await _db.Queryable<WmsDistaskH>().Where(r => r.carry_id == wmsCarryH.id).OrderByDescending(r => r.id).FirstAsync();
if (wmsDistaskH == null)
{
throw new AppFriendlyException($"【MaterialByCarry】无法找到载具{input.carry_code}的执行任务", 500);
}
if (string.IsNullOrEmpty(wmsDistaskH.biz_type))
{
throw new AppFriendlyException($"【MaterialByCarry】载具{input.carry_code}任务{wmsDistaskH.bill_code}的业务类型异常", 500);
}
List<WmsCarryCode> wmsCarryCodes = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id && r.codeqty > 0).ToList();
switch (wmsDistaskH.biz_type)
{
case WmsWareHouseConst.BIZTYPE_WmsRawmatTransferoutstock_ID:
{
WmsRawmatTransferoutstockC wmsRawmatTransferoutstockC = await _db.Queryable<WmsRawmatTransferoutstockC>()
.Where(r => r.mat_bill_id == wmsDistaskH.source_id && r.carry_id == wmsCarryH.id).FirstAsync();
if (wmsRawmatTransferoutstockC != null)
{
// 返回默认签收数量
if (wmsRawmatTransferoutstockC.sign_qty > 0)
{
List<WmsCarryCode> _wmsCarryCodes = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).ToList();
foreach (WmsCarryCode wmsCarryCode in _wmsCarryCodes)
{
wmsCarryCode.carry_code = wmsCarryH.carry_code;
wmsCarryCode.biz_type = wmsDistaskH.biz_type;
if (wmsCarryCode.codeqty < wmsRawmatTransferoutstockC.sign_qty)
{
wmsCarryCode.sign_qty = wmsCarryCode.codeqty;
wmsRawmatTransferoutstockC.sign_qty -= wmsCarryCode.codeqty;
}
else
{
wmsCarryCode.sign_qty = wmsRawmatTransferoutstockC.sign_qty;
}
}
}
}
break;
}
case WmsWareHouseConst.BIZTYPE_WmsRawmatOutstock_ID:
{
WmsRawmatOutstockC wmsRawmatOutstockC = await _db.Queryable<WmsRawmatOutstockC>()
.Where(r => r.mat_bill_id == wmsDistaskH.source_id && r.carry_id == wmsCarryH.id).FirstAsync();
if (wmsRawmatOutstockC != null)
{
// 返回默认签收数量
if (wmsRawmatOutstockC.sign_qty > 0)
{
List<WmsCarryCode> _wmsCarryCodes = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).ToList();
foreach (WmsCarryCode wmsCarryCode in _wmsCarryCodes)
{
wmsCarryCode.carry_code = wmsCarryH.carry_code;
wmsCarryCode.biz_type = wmsDistaskH.biz_type;
if (wmsCarryCode.codeqty < wmsRawmatOutstockC.sign_qty)
{
wmsCarryCode.sign_qty = wmsCarryCode.codeqty;
wmsRawmatOutstockC.sign_qty -= wmsCarryCode.codeqty;
}
else
{
wmsCarryCode.sign_qty = wmsRawmatOutstockC.sign_qty;
}
}
}
}
break;
}
case WmsWareHouseConst.BIZTYPE_WmsPurchaseReturn_ID:
{
WmsPurchaseReturnC wmsPurchaseReturnC = await _db.Queryable<WmsPurchaseReturnC>()
.Where(r => r.mat_bill_id == wmsDistaskH.source_id && r.carry_id == wmsCarryH.id).FirstAsync();
if (wmsPurchaseReturnC != null)
{
// 返回默认签收数量
if (wmsPurchaseReturnC.sign_qty > 0)
{
List<WmsCarryCode> _wmsCarryCodes = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).ToList();
foreach (WmsCarryCode wmsCarryCode in _wmsCarryCodes)
{
wmsCarryCode.carry_code = wmsCarryH.carry_code;
wmsCarryCode.biz_type = wmsDistaskH.biz_type;
if (wmsCarryCode.codeqty < wmsPurchaseReturnC.sign_qty)
{
wmsCarryCode.sign_qty = wmsCarryCode.codeqty;
wmsPurchaseReturnC.sign_qty -= wmsCarryCode.codeqty;
}
else
{
wmsCarryCode.sign_qty = wmsPurchaseReturnC.sign_qty;
}
}
}
}
break;
}
}
return await ToApiResult(HttpStatusCode.OK, "成功", wmsCarryCodes);
}
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
}
}
}