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

212 lines
8.5 KiB
C#

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 Npgsql;
using SqlSugar;
using Tnb.BasicData.Entities;
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.Entity;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
[OverideVisualDev(ModuleConsts.MODULE_WMSOUTINSTOCKDETAIL_ID)]
public class WmsOutinStockDetailService : BaseWareHouseService, IWmsOutinStockDetailService
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
public WmsOutinStockDetailService(
ISqlSugarRepository<WmsCarryH> repository,
IUserManager userManager,
IBillRullService billRullService,
IRunService runService,
IVisualDevService visualDevService)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_billRullService = billRullService;
_runService = runService;
_visualDevService = visualDevService;
}
/// <summary>
/// 根据任务单获取出入库类型
/// </summary>
string GetOutinStockTypeByTask(string task_type, string biz_type)
{
//if (biz_type == WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID)
// return "";
string type = "";
switch (task_type)
{
case WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID:
{
type = "入库";
break;
}
case WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID:
{
type = "转移";
break;
}
}
return type;
}
/// <summary>
/// 根据任务单获取操作员
/// </summary>
string GetUserIdByTask()
{
string create_id = WmsWareHouseConst.AdministratorUserId;
return create_id;
}
/// <summary>
/// 插入出入库明细记录
/// </summary>
/// <param name="input"></param>
/// <param name="dbConn"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[NonAction]
public async Task AddOutinStockDetail(AddOutinStockDetailInput input, ISqlSugarClient dbConn = null)
{
var db = _db;
if (dbConn != null)
db = dbConn;
try
{
if (string.IsNullOrEmpty(input.disTask.carry_id))
{
return;
}
await _s_taskExecuteSemaphore_AddOutinStockDetail.WaitAsync();
string type = GetOutinStockTypeByTask(input.disTask.task_type, input.disTask.biz_type);
if (string.IsNullOrEmpty(type))
{
return;
}
List<WmsCarryCode> wmsCarryCodes = await db.Queryable<WmsCarryCode>().Where(r => r.carry_id == input.disTask.carry_id).ToListAsync();
//await db.Ado.BeginTranAsync();
WmsOutinStockDetail wmsOutinStockDetail = new WmsOutinStockDetail();
wmsOutinStockDetail.warehouse_id = input.warehouse_id;
wmsOutinStockDetail.carry_id = input.disTask.carry_id;
wmsOutinStockDetail.carry_code = input.disTask.carry_code;
wmsOutinStockDetail.create_id = GetUserIdByTask();
wmsOutinStockDetail.startlocation_id = input.disTask.startlocation_id;
wmsOutinStockDetail.startlocation_code = input.disTask.startlocation_code;
wmsOutinStockDetail.endlocation_id = input.disTask.endlocation_id;
wmsOutinStockDetail.endlocation_code = input.disTask.endlocation_code;
wmsOutinStockDetail.act_start_date = input.disTask.act_start_date;
wmsOutinStockDetail.act_end_date = input.disTask.act_end_date;
wmsOutinStockDetail.pretask_code = input.disTask.pretask_code;
wmsOutinStockDetail.distask_code = input.disTask.bill_code;
wmsOutinStockDetail.type = type;
List<BasMaterial> mats = await db.Queryable<BasMaterial>().Where(r => wmsCarryCodes.Select(x => x.material_id).Distinct().Contains(r.id)).ToListAsync();
List<WmsOutinStockCode> wmsOutinStockCodes = new List<WmsOutinStockCode>();
foreach (var itGroup in wmsCarryCodes.GroupBy(g => new { g.warehouse_id, g.location_id, g.material_id, g.code_batch }))
{
dynamic key = itGroup.Key;
List<WmsCarryCode> curCarryCodes = itGroup.ToList().FindAll(x => x.warehouse_id == itGroup.Key.warehouse_id && x.location_id == itGroup.Key.location_id
&& x.material_id == itGroup.Key.material_id && x.code_batch == itGroup.Key.code_batch);
decimal start_qty = db.Queryable<WmsCarryCode>().Where(r => r.warehouse_id == itGroup.Key.warehouse_id
&& r.code_batch == itGroup.Key.code_batch).Sum(r => r.codeqty);
curCarryCodes.ForEach(x =>
{
WmsOutinStockCode wmsOutinStockCode = new WmsOutinStockCode();
BasMaterial mat = mats.Where(r => r.id == x.material_id).First();
wmsOutinStockCode.bill_d_id = wmsOutinStockDetail.id;
wmsOutinStockCode.barcode = x.barcode;
wmsOutinStockCode.material_id = mat.id;
wmsOutinStockCode.material_code = mat.code;
wmsOutinStockCode.material_specification = mat.material_specification;
wmsOutinStockCode.code_batch = x.code_batch;
wmsOutinStockCode.codeqty = x.codeqty;
wmsOutinStockCode.start_qty = start_qty;
if (type == "入库")
wmsOutinStockCode.end_qty = start_qty + x.codeqty;
else if (type == "出库")
wmsOutinStockCode.end_qty = start_qty - x.codeqty;
wmsOutinStockCode.container_no = mat.container_no;
wmsOutinStockCode.unit_id = mat.unit_id;
wmsOutinStockCodes.Add(wmsOutinStockCode);
});
}
int rows = await db.Insertable(wmsOutinStockDetail).ExecuteCommandAsync();
if (rows == 0)
{
throw new Exception($"插入入库明细失败!");
}
rows = await db.Insertable(wmsOutinStockCodes).ExecuteCommandAsync();
if (rows == 0)
{
throw new Exception($"插入入库明细条码失败!");
}
await db.Ado.CommitTranAsync();
}
catch (PostgresException ex)
{
////await db.Ado.RollbackTranAsync();
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"插入入库明细失败 {ex.Message}", 500);
}
catch (Exception ex)
{
//await db.Ado.RollbackTranAsync();
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"插入入库明细失败 {ex.Message}", 500);
}
finally
{
_s_taskExecuteSemaphore_AddOutinStockDetail.Release();
}
}
}
}