添加出入库记录逻辑,采购收货调拨打印、绑定条码更接口变更等

This commit is contained in:
2024-08-12 09:12:56 +08:00
parent 00f01db950
commit cb24d13fff
17 changed files with 688 additions and 25 deletions

View File

@@ -62,6 +62,8 @@ namespace Tnb.WarehouseMgr
public static SemaphoreSlim _s_taskExecuteSemaphore_F4DMJCInstock = new(1);
public static SemaphoreSlim _s_taskExecuteSemaphore_F4DMJCOutstock = new(1);
public static SemaphoreSlim _s_taskExecuteSemaphore_AddOutinStockDetail = new(1);
protected static Dictionary<string, int> _s_eleUseStatusDic;
protected IEventPublisher? EventPublisher { set; get; }

View File

@@ -362,6 +362,18 @@ namespace Tnb.WarehouseMgr
wmsPurchaseOrderD.fk_wms_purchase_order_id = wmsPurchaseOrderH.id;
wmsPurchaseOrderD.matcode = detail.material_code;
wmsPurchaseOrderD.unit = detail.unit_code;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsPurchaseOrderD.unit = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【PurchaseOrder】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsPurchaseOrderD.purchase_quantity = detail.purchase_quantity;
wmsPurchaseOrderD.stock_location = detail.stock_location;
wmsPurchaseOrderD.code_batch = detail.code_batch;
@@ -468,7 +480,18 @@ namespace Tnb.WarehouseMgr
wmsOutsourceOrderD.fk_wms_outsource_order_id = wmsOutsourceOrderH.id;
wmsOutsourceOrderD.matcode = detail.material_code;
wmsOutsourceOrderD.unit = detail.unit_code;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsOutsourceOrderD.unit = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【OutsourceOrder】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsOutsourceOrderD.outsource_quantity = detail.outsource_quantity;
wmsOutsourceOrderD.stock_location = detail.stock_location;
wmsOutsourceOrderD.code_batch = detail.code_batch;
@@ -869,7 +892,18 @@ namespace Tnb.WarehouseMgr
msRawmatTransferinstockD.bill_id = wmsRawmatTransferinstockH.id;
msRawmatTransferinstockD.matcode = detail.material_code;
msRawmatTransferinstockD.unit = detail.unit_code;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
msRawmatTransferinstockD.unit = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
msRawmatTransferinstockD.qty = detail.qty;
msRawmatTransferinstockD.stock_location = detail.stock_location;
msRawmatTransferinstockD.code_batch = detail.code_batch;

View File

@@ -73,6 +73,10 @@ namespace Tnb.WarehouseMgr
private readonly IElevatorControlService _elevatorControlService;
private readonly IWmsCarryBindService _wmsCarryBindService;
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
private readonly IWmsOutinStockDetailService _wmsOutinStockDetailService;
private static readonly Dictionary<string, int> _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase);
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
private static Dictionary<string, object> locMap = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
@@ -86,6 +90,7 @@ namespace Tnb.WarehouseMgr
public static SemaphoreSlim s_taskGenPreTask = new(1);
public static SemaphoreSlim s_GenTaskExecute = new(1);
public Func<string, int, Task> AddUnExecuteTask { get; set; }
@@ -126,7 +131,8 @@ namespace Tnb.WarehouseMgr
IWmsCarryBindService wmsCarryBindService,
IWmsCarryUnbindService wmsCarryUnbindService,
IRunService runService,
IVisualDevService visualDevService
IVisualDevService visualDevService,
IWmsOutinStockDetailService wmsOutinStockDetailService
//IConfiguration configuration
) : base(repository.AsSugarClient())
{
@@ -141,6 +147,7 @@ namespace Tnb.WarehouseMgr
_wmsCarryUnbindService = wmsCarryUnbindService;
_runService = runService;
_visualDevService = visualDevService;
_wmsOutinStockDetailService = wmsOutinStockDetailService;
//_configuration = configuration;
}
@@ -2537,15 +2544,21 @@ namespace Tnb.WarehouseMgr
_ = await _db.Updateable(carryIts).UpdateColumns(it => new { it.is_lock, it.location_id, it.location_code, it.instock_time }).ExecuteCommandAsync();
Logger.Information($"【TaskComplate】 更新载具 {JsonConvert.SerializeObject(carryIts)}");
//更新条码的库位和仓库信息
_ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).ExecuteCommandAsync();
_ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
//更新库位信息,使用状态为 使用,锁定状态为未锁定
_ = await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync();
Logger.Information($"【TaskComplate】 更新库位 {JsonConvert.SerializeObject(locIts)}");
/* var loginType= _userManager?.LoginType ?? "web";
Log.Information($"_userManager.LoginType={loginType}");
*/ //更新业务主表的单据状态
foreach (WmsDistaskH? dt in disTasks)
{
AddOutinStockDetailInput addOutinStockDetailInput = new AddOutinStockDetailInput();
addOutinStockDetailInput.disTask = dt;
addOutinStockDetailInput.warehouse_id = carryCodeIts[0].warehouse_id;
await _wmsOutinStockDetailService.AddOutinStockDetail(addOutinStockDetailInput, _db);
#region todo service中
// 销售出库
if (dt.biz_type == WmsWareHouseConst.BIZTYPE_WMSSALERELEASE_ID)

View File

@@ -1,4 +1,5 @@
using System.Dynamic;
using Aop.Api.Domain;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
@@ -194,6 +195,7 @@ namespace Tnb.WarehouseMgr
WmsCarryCode.id = SnowflakeIdHelper.NextId();
WmsCarryCode.carry_id = carry.id;
WmsCarryCode.is_out = 0;
WmsCarryCode.codeqty = detail.codeqty;
WmsCarryCode.create_id = input.create_id;
WmsCarryCode.create_time = DateTime.Now;
WmsCarryCodes.Add(WmsCarryCode);
@@ -284,7 +286,7 @@ namespace Tnb.WarehouseMgr
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="AppFriendlyException"></exception>
[NonAction]
public async Task<Result> CarryBind(CarryBindInput input, ISqlSugarClient dbConn = null)
public async Task<Entities.Dto.Outputs.Result> CarryBind(CarryBindInput input, ISqlSugarClient dbConn = null)
{
bool isOk = false;

View File

@@ -535,7 +535,7 @@ namespace Tnb.WarehouseMgr
CarryMaterialDetail carryMaterialDetail = new CarryMaterialDetail();
carryMaterialDetail.material_id = wmsMaterialTransferD.material_id;
carryMaterialDetail.material_code = wmsMaterialTransferD.material_code;
carryMaterialDetail.codeqty = wmsCarryH.qty.ToString();
carryMaterialDetail.codeqty = wmsCarryH.qty;
carryMaterialDetail.code_batch = wmsMaterialTransferD.code_batch;
carryMaterialDetail.barcode = wmsCarryHs[index].carry_code;
carryMaterialDetail.unit_id = wmsMaterialTransferD.unit_id;
@@ -1491,7 +1491,7 @@ namespace Tnb.WarehouseMgr
CarryMaterialDetail carryMaterialDetail = new CarryMaterialDetail();
carryMaterialDetail.material_id = wmsMaterialTransferD.material_id;
carryMaterialDetail.material_code = wmsMaterialTransferD.material_code;
carryMaterialDetail.codeqty = input.qty.ToString();
carryMaterialDetail.codeqty = input.qty;
carryMaterialDetail.code_batch = wmsMaterialTransferD.code_batch;
carryMaterialDetail.barcode = wmsCarryH.carry_code;
carryMaterialDetail.unit_id = wmsMaterialTransferD.unit_id;

View File

@@ -0,0 +1,212 @@
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();
}
}
}
}

View File

@@ -87,8 +87,6 @@ namespace Tnb.WarehouseMgr
var blFlag = true;
try
{
await _db.Ado.BeginTranAsync();
WmsInstockH? instock = null;
var purchaseDs = await PurchaseAndSaleUpdate(input);
@@ -330,8 +328,16 @@ namespace Tnb.WarehouseMgr
if (minPacking.HasValue && minPacking.Value > 0)
{
int mod = (int)(WmsPurchaseD.purchase_arriveqty % minPacking.Value);
codeNum = (int)(mod > 0 ? (WmsPurchaseD.purchase_arriveqty / minPacking.Value) + 1 : WmsPurchaseD.purchase_arriveqty / minPacking.Value);
codeNum = input.barcode_qty;
decimal qty = (int)(codeNum * minPacking);
decimal mod = 0;
decimal extra = qty - WmsPurchaseD.purchase_arriveqty;
if (extra > 0 && extra < minPacking)
{
mod = minPacking.Value - extra;
}
for (int j = 0; j < codeNum; j++)
{
@@ -367,11 +373,11 @@ namespace Tnb.WarehouseMgr
}
await _db.Ado.CommitTranAsync();
barcodes.AddRange(wmsTempCodes.Select(p => p.barcode).ToList());
if (barcodes?.Count > 0)
{
var ip= _db.Queryable<BasFactoryConfig>().Where(p=>p.key== "printerip").FirstAsync().Result.value;
base.BarCodePrint(barcodes, 1, ip);
}
//if (barcodes?.Count > 0)
//{
// var ip= _db.Queryable<BasFactoryConfig>().Where(p=>p.key== "printerip").FirstAsync().Result.value;
// base.BarCodePrint(barcodes, 1, ip);
//}
}

View File

@@ -101,8 +101,16 @@ namespace Tnb.WarehouseMgr
if (minPacking.HasValue && minPacking.Value > 0)
{
int mod = (int)(WmsRawmatTransferinstockD.actual_qty % minPacking.Value);
codeNum = (int)(mod > 0 ? (WmsRawmatTransferinstockD.actual_qty / minPacking.Value) + 1 : WmsRawmatTransferinstockD.actual_qty / minPacking.Value);
codeNum = input.barcode_qty;
decimal qty = (int)(codeNum * minPacking);
decimal mod = 0;
decimal extra = (qty - WmsRawmatTransferinstockD.actual_qty).Value;
if (extra > 0 && extra < minPacking)
{
mod = minPacking.Value - extra;
}
for (int j = 0; j < codeNum; j++)
{
@@ -137,11 +145,11 @@ namespace Tnb.WarehouseMgr
}
await _db.Ado.CommitTranAsync();
barcodes.AddRange(wmsTempCodes.Select(p => p.barcode).ToList());
if (barcodes?.Count > 0)
{
var ip = _db.Queryable<BasFactoryConfig>().Where(p => p.key == "printerip").FirstAsync().Result.value;
base.BarCodePrint(barcodes, 1, ip);
}
//if (barcodes?.Count > 0)
//{
// var ip = _db.Queryable<BasFactoryConfig>().Where(p => p.key == "printerip").FirstAsync().Result.value;
// base.BarCodePrint(barcodes, 1, ip);
//}
}

View File

@@ -11,6 +11,7 @@ using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Entities.Enums;
namespace Tnb.WarehouseMgr
@@ -161,5 +162,56 @@ namespace Tnb.WarehouseMgr
};
return PageResult<WmsStockReportH>.SqlSugarPageResult(pagedList);
}
[HttpPost]
public async Task<dynamic> OutinStockDetail(VisualDevModelListQueryInput input)
{
var code_batch = "";
var material_specification = "";
if (!input.queryJson.IsNullOrWhiteSpace())
{
code_batch = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.code_batch));
material_specification = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.material_specification));
}
IEnumerable<dynamic> result = null;
result = await _db.Queryable<WmsOutinStockDetail>()
.InnerJoin<WmsOutinStockCode>((a, b) => a.id == b.bill_d_id)
.InnerJoin<BasWarehouse>((a, b, c) => a.warehouse_id == c.id)
.Select((a,b,c) => new
{
act_start_date = a.act_start_date,
act_end_date = a.act_end_date,
whname = c.whname,
material_id = b.material_id,
material_code = b.material_code,
material_name = b.material_name,
material_specification = b.material_specification,
container_no = b.container_no,
code_batch = b.code_batch,
location_id = a.endlocation_id,
location_code = a.endlocation_code,
unit_id = b.unit_id,
unit_code = b.unit_code,
start_qty = b.start_qty,
end_qty = b.end_qty,
type = a.type
}).ToListAsync();
List<dynamic> pages = result.Skip((input.currentPage - 1) * input.pageSize).Take(input.pageSize).ToList();
SqlSugarPagedList<dynamic> pagedList = new()
{
list = pages,
pagination = new()
{
CurrentPage = input.currentPage,
PageSize = input.pageSize,
Total = result.Count()
}
};
return PageResult<dynamic>.SqlSugarPageResult(pagedList);
}
}
}