223 lines
10 KiB
C#
223 lines
10 KiB
C#
using System.Linq;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using Aspose.Cells;
|
|
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.Systems.Interfaces.System;
|
|
using JNPF.VisualDev;
|
|
using JNPF.VisualDev.Entitys;
|
|
using JNPF.VisualDev.Interfaces;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.CodeAnalysis;
|
|
using Microsoft.Extensions.Logging;
|
|
using Newtonsoft.Json.Linq;
|
|
using NPOI.POIFS.Storage;
|
|
using SqlSugar;
|
|
using Tnb.BasicData.Entities;
|
|
using Tnb.ProductionMgr.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_WMSPACKOUTSTOCK_ID)]
|
|
[ServiceModule(BizTypeId)]
|
|
public class WmsPackOutstockService : BaseWareHouseService, IWmsPackOutstockService
|
|
{
|
|
private const string BizTypeId = WmsWareHouseConst.BIZTYPE_WMSPACKOUTSTOCK_ID;
|
|
private readonly ISqlSugarClient _db;
|
|
private readonly IRunService _runService;
|
|
private readonly IVisualDevService _visualDevService;
|
|
private readonly IUserManager _userManager;
|
|
private readonly IWareHouseService _wareHouseService;
|
|
private readonly IWmsCarryBindService _wmsCarryBindService;
|
|
private readonly IBillRullService _billRullService;
|
|
public static SemaphoreSlim s_packOutstockSemaphore = new(1);
|
|
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
|
|
public WmsPackOutstockService(
|
|
ISqlSugarRepository<WmsCarryH> repository,
|
|
IRunService runService,
|
|
IVisualDevService visualDevService,
|
|
IWareHouseService wareHouseService,
|
|
IUserManager userManager,
|
|
IWmsCarryBindService wmsCarryBindService,
|
|
IWmsCarryUnbindService wmsCarryUnbindService,
|
|
IBillRullService billRullService)
|
|
{
|
|
_db = repository.AsSugarClient();
|
|
_runService = runService;
|
|
_visualDevService = visualDevService;
|
|
_userManager = userManager;
|
|
_wareHouseService = wareHouseService;
|
|
_wmsCarryBindService = wmsCarryBindService;
|
|
_wmsCarryUnbindService = wmsCarryUnbindService;
|
|
_billRullService = billRullService;
|
|
}
|
|
|
|
public override async Task ModifyAsync(WareHouseUpInput input)
|
|
{
|
|
if (input == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(input));
|
|
}
|
|
|
|
try
|
|
{
|
|
await _db.Updateable<WmsPackOutstockD>().SetColumns(r => r.line_status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).Where(r => r.id == input.wmsDistaskH.require_id).ExecuteCommandAsync();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError("【WmsPackOutStockService ModifyAsync】" + ex.Message);
|
|
Logger.LogError("【WmsPackOutStockService ModifyAsync】" + ex.StackTrace);
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 按托下发
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
/// <exception cref="AppFriendlyException"></exception>
|
|
[HttpPost, NonUnify, AllowAnonymous]
|
|
public async Task<bool> Distribute()
|
|
{
|
|
Logger.LogInformation($"【WmsPackOutstockService-Distribute】 包材出库自动下发");
|
|
try
|
|
{
|
|
OutStockStrategyQuery outStockStrategyInput = new()
|
|
{
|
|
warehouse_id = WmsWareHouseConst.WAREHOUSE_BCK_ID
|
|
};
|
|
List<WmsCarryH> carrys = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
|
|
if (carrys.Count == 0)
|
|
{
|
|
throw new Exception("【WmsPackOutstockService-Distribute】四楼包材库没有可用的托盘");
|
|
}
|
|
|
|
|
|
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_F2BCQ_ID, Size = carrys.Count };
|
|
List<BasLocation> endLocations = await _wareHouseService.BCKF2InStockStrategy(inStockStrategyInput);
|
|
if (endLocations.Count == 0)
|
|
{
|
|
throw new AppFriendlyException("【WmsPackOutstockService-Distribute】没有可用的入库库位", 500);
|
|
}
|
|
|
|
int 可移转托数 = carrys.Count;
|
|
// 如果四楼包材库的可出库托数大于二楼包材库的可入库库位数量,则只入库二楼包材库的可入库库位数量
|
|
if (carrys.Count > endLocations.Count)
|
|
{
|
|
可移转托数 = endLocations.Count;
|
|
}
|
|
|
|
Logger.Information($"【WmsPackOutstockService-Distribute】 四楼包材库的可出库托数为 {carrys.Count} 二楼包材库的可入库库位数量为 {endLocations.Count} 可移转托数为{可移转托数}");
|
|
|
|
// 生成包材出库记录
|
|
|
|
carrys = carrys.Take(可移转托数).ToList();
|
|
|
|
string bill_code = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PACKOUTSTOCK_H_ENCODE);
|
|
|
|
WmsPackOutstockH wmsPackOutstockH = new WmsPackOutstockH();
|
|
List<WmsCarryCode> wmsCarryCodes = _db.Queryable<WmsCarryCode>().Where(r => carrys.Select(r => r.id).Contains(r.carry_id)).ToList();
|
|
|
|
wmsPackOutstockH.org_id = WmsWareHouseConst.AdministratorOrgId;
|
|
wmsPackOutstockH.bill_code = bill_code;
|
|
wmsPackOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_BCK_ID;
|
|
wmsPackOutstockH.create_id = WmsWareHouseConst.AdministratorUserId;
|
|
wmsPackOutstockH.create_time = DateTime.Now;
|
|
|
|
await s_packOutstockSemaphore.WaitAsync();
|
|
await _db.Ado.BeginTranAsync();
|
|
|
|
List<WmsPackOutstockD> wmsPackOutstockDs = new List<WmsPackOutstockD>();
|
|
|
|
await _db.Insertable(wmsPackOutstockH).ExecuteCommandAsync();
|
|
|
|
int locationIndex = 0;
|
|
for (int i = 0; i < 可移转托数; i++)
|
|
{
|
|
WmsCarryH wmsCarryH = carrys[i];
|
|
WmsCarryCode wmsCarryCode = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).First();
|
|
if (wmsCarryCode == null)
|
|
{
|
|
Logger.Information($"【WmsPackOutstockService-Distribute】载具{wmsCarryH.carry_code}没有绑定物料");
|
|
continue;
|
|
}
|
|
WmsPackOutstockD wmsPackOutstockD = new WmsPackOutstockD();
|
|
wmsPackOutstockD.bill_id = wmsPackOutstockH.id;
|
|
wmsPackOutstockD.line_status = WmsWareHouseConst.BILLSTATUS_ON_ID;
|
|
wmsPackOutstockD.material_id = wmsCarryCode.material_id;
|
|
wmsPackOutstockD.material_code = wmsCarryCode.material_code;
|
|
wmsPackOutstockD.material_specification = wmsCarryCode.material_specification;
|
|
wmsPackOutstockD.unit_id = wmsCarryCode.unit_id;
|
|
wmsPackOutstockD.qty = wmsCarryCode.codeqty;
|
|
wmsPackOutstockD.code_batch = wmsCarryCode.code_batch;
|
|
wmsPackOutstockD.carry_id = wmsCarryH.id;
|
|
wmsPackOutstockD.carry_code = wmsCarryH.carry_code;
|
|
wmsPackOutstockD.startlocation_id = wmsCarryH.location_id;
|
|
wmsPackOutstockD.startlocation_code = wmsCarryH.location_code;
|
|
wmsPackOutstockD.endlocation_id = endLocations[locationIndex].id;
|
|
wmsPackOutstockD.endlocation_code = endLocations[locationIndex].location_code;
|
|
locationIndex++;
|
|
|
|
wmsPackOutstockDs.Add(wmsPackOutstockD);
|
|
}
|
|
await _db.Insertable(wmsPackOutstockDs).ExecuteCommandAsync();
|
|
|
|
|
|
foreach (WmsPackOutstockD wmsPackOutstockD in wmsPackOutstockDs)
|
|
{
|
|
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
|
|
commonCreatePretaskInput.startlocation_id = wmsPackOutstockD.startlocation_id;
|
|
commonCreatePretaskInput.endlocation_id = wmsPackOutstockD.endlocation_id;
|
|
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
|
|
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSPACKOUTSTOCK_ID;
|
|
commonCreatePretaskInput.require_id = wmsPackOutstockD.id;
|
|
commonCreatePretaskInput.carry_id = wmsPackOutstockD.carry_id;
|
|
commonCreatePretaskInput.carry_code = wmsPackOutstockD.carry_code;
|
|
commonCreatePretaskInput.isExcuteMission = false;
|
|
|
|
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db);
|
|
|
|
if (res.code != HttpStatusCode.OK)
|
|
{
|
|
Logger.LogInformation($@"生成预任务失败");
|
|
throw new AppFriendlyException($@"生成预任务失败", 500);
|
|
}
|
|
}
|
|
|
|
await _db.Ado.CommitTranAsync();
|
|
Logger.LogInformation($"【Distribute】 包材自动出库下发完成");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _db.Ado.RollbackTranAsync();
|
|
Logger.LogError("【Distribute】 包材出库" + ex.Message);
|
|
Logger.LogError("【Distribute】 包材出库" + ex.StackTrace);
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
_ = s_packOutstockSemaphore.Release();
|
|
InvokeGenPretaskExcute();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
}
|