This commit is contained in:
2024-09-24 17:37:35 +08:00
parent 5f1b6d5c93
commit 16b9c1d41b
6 changed files with 339 additions and 88 deletions

View File

@@ -37,6 +37,7 @@ using Qiniu.Util;
using Senparc.CO2NET.Helpers.Serializers;
using SqlSugar;
using Tnb.BasicData;
using Tnb.WarehouseMgr.Entities.Dto;
//using Swashbuckle.AspNetCore.SwaggerGen;
using Tnb.BasicData.Entities;
@@ -52,7 +53,6 @@ using Tnb.WarehouseMgr;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Configs;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Dto.Queries;
using Tnb.WarehouseMgr.Entities.Entity;
@@ -162,6 +162,8 @@ namespace Tnb.ProductionMgr
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
private readonly IWmsEmptyOutstockService _wmsEmptyOutstockService;
private readonly IWmsPackOutstockService _wmsPackOutstockService;
private readonly IWmsMaterialTransferService _wmsMaterialTransferService;
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
@@ -178,7 +180,8 @@ namespace Tnb.ProductionMgr
#region
public RedisBackGround(StackExRedisHelper redisData, IPrdInstockService prdInstockService, ISqlSugarRepository<RedisReadConfig> repository, IWmsPDAScanInStockService wmsPDAScanInStock
, IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService,
IWmsCarryUnbindService wmsCarryUnbindService, IWmsEmptyOutstockService wmsEmptyOutstockService, IWmsPackOutstockService wmsPackOutstockService)
IWmsCarryUnbindService wmsCarryUnbindService, IWmsEmptyOutstockService wmsEmptyOutstockService, IWmsPackOutstockService wmsPackOutstockService,
IWmsMaterialTransferService wmsMaterialTransferService)
{
_redisData = redisData;
_prdInstockService = prdInstockService;
@@ -191,6 +194,7 @@ namespace Tnb.ProductionMgr
_wmsEmptyOutstockService = wmsEmptyOutstockService;
_wmsCarryUnbindService = wmsCarryUnbindService;
_wmsPackOutstockService = wmsPackOutstockService;
_wmsMaterialTransferService = wmsMaterialTransferService;
db_CheckGettimer = repository.CopyNew();
db_Scantimer = repository.CopyNew();
@@ -2726,16 +2730,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
LoggerWmsMaterialkit.LogInformation($"查找到进行中的任务单:{string.Join(',', prdMoTasks.Select(r => r.mo_task_code))}");
foreach (PrdMoTask prdMoTask in prdMoTasks)
{
List<PrdMoTask> rep_prdMoTasks = prdMoTasks.Where(r => r.workline_id == prdMoTask.workline_id && r.id != prdMoTask.id).ToList();
List<PrdMoTask> rep_prdMoTasks = prdMoTasks.Where(r => r.workstation_id == prdMoTask.workstation_id && r.id != prdMoTask.id).ToList();
if (rep_prdMoTasks.Count() > 0)
{
LoggerWmsMaterialkit.LogWarning($"存在与任务单{prdMoTask.mo_task_code}相同产线的状态为进行中的任务单{string.Join(',', rep_prdMoTasks.Select(r => r.mo_task_code))}");
LoggerWmsMaterialkit.LogWarning($"存在与任务单{prdMoTask.mo_task_code}相同工位的状态为进行中的任务单{string.Join(',', rep_prdMoTasks.Select(r => r.mo_task_code))}");
continue;
}
await db_WmsMaterialkit.Ado.BeginTranAsync();
WmsMaterialkitRecordH wmsMaterialkitRecordH = await db_WmsMaterialkit.Queryable<WmsMaterialkitRecordH>().Where(r => (r.status == WmsWareHouseConst.BILLSTATUS_ADD_ID || r.status == WmsWareHouseConst.BILLSTATUS_ON_ID)
&& r.workline_id == prdMoTask.workline_id).FirstAsync();
&& r.workstation_id == prdMoTask.workstation_id).FirstAsync();
LoggerWmsMaterialkit.LogInformation($"查找任务单{prdMoTask.mo_task_code}的物料配送记录:{JsonConvert.SerializeObject(wmsMaterialkitRecordH)}");
if (wmsMaterialkitRecordH == null || (wmsMaterialkitRecordH != null && prdMoTask.id != wmsMaterialkitRecordH.mo_task_id))
@@ -2765,7 +2769,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
wmsMaterialkitRecordH.material_specification = basMaterial.material_specification;
wmsMaterialkitRecordH.unit_code = prdMoTask.unit_id;
wmsMaterialkitRecordH.qty = prdMoTask.scheduled_qty;
wmsMaterialkitRecordH.workline_id = prdMoTask.workline_id;
wmsMaterialkitRecordH.workstation_id = prdMoTask.workstation_id;
wmsMaterialkitRecordH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
wmsMaterialkitRecordH.times = 0;
wmsMaterialkitRecordH.total_time = 0;
@@ -2823,90 +2827,157 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
if (wmsMaterialkitRecordHs.Count == 0)
return;
Stopwatch stopwatch_inv = new Stopwatch();
stopwatch_inv.Start();
// 暂存仓库存
var zccinventory = await db_WmsMaterialkit.Queryable<WmsCarryH>()
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
.InnerJoin<BasMaterial>((a, b, c, d, e) => d.material_id == e.id)
.Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZCC_ID)
.Select((a, b, c, d, e) => new customInventoryEntity
{
material_id = e.id,
material_code = e.code,
material_name = e.name,
material_specification = e.material_specification,
codeqty = d.codeqty,
unit_code = d.unit_id
}).ToListAsync();
// 正在配送
var inroadinventory = await db_WmsMaterialkit.Queryable<WmsPretaskH>()
.InnerJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
.InnerJoin<WmsCarryCode>((a, b, c) => c.carry_id == b.id)
.InnerJoin<BasMaterial>((a, b, c, d) => d.id == c.material_id)
.Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
&& (a.endlocation_id == WmsWareHouseConst.ZZCSSX111011 || a.endlocation_id == WmsWareHouseConst.ZZCSSX111012))
.Select((a, b, c, d) => new customInventoryEntity
{
material_id = d.id,
material_code = d.code,
material_name = d.name,
material_specification = d.material_specification,
codeqty = c.codeqty,
unit_code = c.unit_id
}).ToListAsync();
// 中储仓库存
var inventory_中储 = await db_WmsMaterialkit.Queryable<WmsCarryH>()
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
.InnerJoin<BasMaterial>((a, b, c, d, e) => d.material_id == e.id)
.Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZC_ID)
.Select((a, b, c, d, e) => new customInventoryEntity
{
material_id = e.id,
material_code = e.code,
material_name = e.name,
material_specification = e.material_specification,
codeqty = d.codeqty,
unit_code = d.unit_id
}).ToListAsync();
List<customInventoryEntity> inventory = new List<customInventoryEntity>();
inventory.AddRange(zccinventory);
inventory.AddRange(inroadinventory);
inventory.GroupBy(g => new { g.material_id, g.material_code, g.material_name, g.material_specification, g.unit_code }).Select(g =>
{
customInventoryEntity newinventory = new customInventoryEntity();
newinventory.material_id = g.Key.material_id;
newinventory.material_code = g.Key.material_code;
newinventory.material_name = g.Key.material_name;
newinventory.material_specification = g.Key.material_specification;
newinventory.unit_code = g.Key.unit_code;
newinventory.codeqty = inventory.Where(r => r.material_id == newinventory.material_id && r.unit_code == newinventory.unit_code).Sum(s => s.codeqty);
return newinventory;
});
stopwatch_inv.Stop();
LoggerWmsMaterialkit.LogInformation($"中储仓与暂存仓库存查询完成,耗时{stopwatch_inv.ElapsedMilliseconds} ms");
List<WmsMaterialTransfer> wmsMaterialTransfers = await db_WmsMaterialkit.Queryable<WmsMaterialTransfer>().Where(r => r.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID
&& r.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID && r.type == WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE).ToListAsync();
// 执行暂存仓库存检查与转库单下发
foreach (WmsMaterialkitRecordH wmsMaterialkitRecord in wmsMaterialkitRecordHs)
{
Stopwatch stopwatch2 = new Stopwatch();
stopwatch2.Start();
await db_WmsMaterialkit.Ado.BeginTranAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = await db_WmsMaterialkit.Queryable<WmsMaterialTransferD>()
.Where(r => wmsMaterialTransfers.Select(x => x.id).Contains(r.bill_id) && r.station_code == wmsMaterialkitRecord.workstation_id).OrderBy(r => r.id).ToListAsync();
List<WmsMaterialkitRecordD> wmsMaterialkitRecordDs = await db_WmsMaterialkit.Queryable<WmsMaterialkitRecordD>()
.Where(r => r.bill_id == wmsMaterialkitRecord.id && r.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID && r.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID).ToListAsync();
foreach (WmsMaterialkitRecordD wmsMaterialkitRecordD in wmsMaterialkitRecordDs)
{
Stopwatch stopwatch2 = new Stopwatch();
stopwatch2.Start();
// 暂存仓库存
var zccinventory = await db_WmsMaterialkit.Queryable<WmsCarryH>()
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
.InnerJoin<BasMaterial>((a, b, c, d, e) => d.material_id == e.id)
.Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZCC_ID && e.id == wmsMaterialkitRecordD.material_id)
.Select((a, b, c, d, e) => new customInventoryEntity
{
material_id = e.id,
material_code = e.code,
material_name = e.name,
material_specification = e.material_specification,
codeqty = d.codeqty,
unit_code = d.unit_id
}).ToListAsync();
// 正在配送
var inroadinventory = await db_WmsMaterialkit.Queryable<WmsPretaskH>()
.InnerJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
.InnerJoin<WmsCarryCode>((a, b, c) => c.carry_id == b.id)
.InnerJoin<BasMaterial>((a, b, c, d) => d.id == c.material_id)
.Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
&& (a.endlocation_id == WmsWareHouseConst.ZZCSSX121009 || a.endlocation_id == WmsWareHouseConst.ZZCSSX121010) && d.id == wmsMaterialkitRecordD.material_id)
.Select((a, b, c, d) => new customInventoryEntity
{
material_id = d.id,
material_code = d.code,
material_name = d.name,
material_specification = d.material_specification,
codeqty = c.codeqty,
unit_code = c.unit_id
}).ToListAsync();
List<customInventoryEntity> inventory = new List<customInventoryEntity>();
inventory.AddRange(zccinventory);
inventory.AddRange(inroadinventory);
await db_WmsMaterialkit.Ado.CommitTranAsync();
stopwatch2.Stop();
LoggerWmsMaterialkit.LogInformation($"物料配送记录{wmsMaterialkitRecord.bill_code}已下发,耗时{stopwatch2.ElapsedMilliseconds} ms");
inventory.GroupBy(g => new { g.material_id, g.material_code, g.material_name, g.material_specification, g.unit_code }).Select(g =>
{
customInventoryEntity newinventory = new customInventoryEntity();
newinventory.material_id = g.Key.material_id;
newinventory.material_code = g.Key.material_code;
newinventory.material_name = g.Key.material_name;
newinventory.material_specification = g.Key.material_specification;
newinventory.unit_code = g.Key.unit_code;
newinventory.codeqty = inventory.Where(r => r.material_id == newinventory.material_id && r.unit_code == newinventory.unit_code).Sum(s => s.codeqty);
return newinventory;
});
// 需要下发的数量
decimal? need_qty = wmsMaterialkitRecordD.plan_qty - wmsMaterialkitRecordD.yxf_qty;
// 查询已有库存 (多工单情况下要考虑库存是否被其它工单预留 暂定)
decimal? exists_qty = inventory.Sum(r => r.codeqty);
need_qty = need_qty - exists_qty;
if (need_qty <= 0)
break;
// 查询转库单
List<WmsMaterialTransferD> _wmsMaterialTransferDs = wmsMaterialTransferDs.Where(r => r.material_id == wmsMaterialkitRecordD.material_id).ToList();
await db_WmsMaterialkit.Ado.BeginTranAsync();
decimal? xf_qty = 0;
foreach (WmsMaterialTransferD _wmsMaterialTransferD in _wmsMaterialTransferDs)
{
if (need_qty <= 0)
break;
// 转库单可以下发的数量
decimal? zkcan_qty = _wmsMaterialTransferD.qty - _wmsMaterialTransferD.yxfqty;
// 可以下发的数量
decimal? can_qty = 0;
// 多余数量切换到下一个转库单
can_qty = zkcan_qty < need_qty ? zkcan_qty : need_qty;
// 查询库存是否有可以下发数量的库存(同批次)
// 中储仓库存
OutStockStrategyQuery outStockStrategyInput = new()
{
warehouse_id = WmsWareHouseConst.WAREHOUSE_ZC_ID,
material_id = _wmsMaterialTransferD.material_id,
code_batch = _wmsMaterialTransferD.code_batch
};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
List<WmsCarryCode> wmsCarryCodes = await db_WmsMaterialkit.Queryable<WmsCarryCode>()
.Where(r => r.material_id == _wmsMaterialTransferD.material_id && r.code_batch == _wmsMaterialTransferD.code_batch).ToListAsync();
decimal? inv_qty = wmsCarryCodes.Sum(r => r.codeqty);
can_qty = inv_qty > can_qty ? can_qty : inv_qty;
LoggerWmsMaterialkit.LogWarning($"转库单id{_wmsMaterialTransferD.bill_id} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库时可出数量为{can_qty}");
if (can_qty <= 0)
{
continue;
}
MaterialTransferDDistributeToZCCInput input = new MaterialTransferDDistributeToZCCInput();
input.source_id = _wmsMaterialTransferD.id;
input.xf_qty = can_qty;
input.dbConn = db_WmsMaterialkit;
WarehouseMgr.Entities.Dto.Outputs.Result result = await _wmsMaterialTransferService.DistributeDetailToZCC(input);
if (result.code.ToString() != "OK")
{
LoggerWmsMaterialkit.LogWarning($"转库单id{_wmsMaterialTransferD.bill_id} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库时数量不匹配!");
continue;
}
xf_qty += can_qty;
need_qty = need_qty - can_qty;
}
stopwatch2.Stop();
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordD>().SetColumns(r => new WmsMaterialkitRecordD
{
yxf_qty = r.yxf_qty + xf_qty,
times = r.times + 1,
total_time = r.total_time + (int)stopwatch2.ElapsedMilliseconds,
status = wmsMaterialkitRecordD.yxf_qty + xf_qty >= r.plan_qty ? WmsWareHouseConst.BILLSTATUS_COMPLETE_ID : WmsWareHouseConst.BILLSTATUS_ON_ID
})
.Where(r => r.id == wmsMaterialkitRecordD.id).ExecuteCommandAsync();
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordH>().SetColumns(r => new WmsMaterialkitRecordH
{
times = r.times + 1,
total_time = r.total_time + (int)stopwatch2.ElapsedMilliseconds
})
.Where(r => r.id == wmsMaterialkitRecordD.bill_id).ExecuteCommandAsync();
await db_WmsMaterialkit.Ado.CommitTranAsync();
LoggerWmsMaterialkit.LogInformation($"物料齐套配送明细id{wmsMaterialkitRecordD.id}已下发,耗时{stopwatch2.ElapsedMilliseconds} ms");
}
List<WmsMaterialkitRecordD> WmsMaterialkitRecordDs = db_WmsMaterialkit.Queryable<WmsMaterialkitRecordD>()
.Where(a => a.bill_id == wmsMaterialkitRecord.id && a.yxf_qty < a.plan_qty).ToList();
if (wmsMaterialTransferDs.Count == 0)
{
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordH>().SetColumns(it => new WmsMaterialkitRecordH { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
.Where(it => it.id == wmsMaterialkitRecord.id).ExecuteCommandHasChangeAsync();
}
LoggerWmsMaterialkit.LogInformation($"物料配送记录{wmsMaterialkitRecord.bill_code}已下发");
}
}
catch (ObjectDisposedException ex)

View File

@@ -0,0 +1,31 @@
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Dto
{
/// <summary>
/// 库房业务更新输入参数
/// </summary>
public class MaterialTransferDDistributeToZCCInput
{
/// <summary>
/// 组织ID
/// </summary>
public string org_id { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string create_id { get; set; }
/// <summary>
/// 来源单据id(转库单子表)
/// </summary>
public string? source_id { get; set; }
/// <summary>
///
/// </summary>
public decimal? xf_qty { get; set; }
public ISqlSugarClient dbConn { get; set; } = null;
}
}

View File

@@ -95,9 +95,9 @@ public partial class WmsMaterialkitRecordH : BaseEntity<string>
public decimal? qty { get; set; }
/// <summary>
/// 产线id
/// 工位id
/// </summary>
public string? workline_id { get; set; }
public string? workstation_id { get; set; }
/// <summary>
/// 状态(开始 执行中 完成)

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Tnb.WarehouseMgr.Entities.Dto;
namespace Tnb.WarehouseMgr.Interfaces
{
public interface IWmsMaterialTransferService
{
/// <summary>
/// 中储仓下发到二楼暂存仓(明细下发)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
Task<Entities.Dto.Outputs.Result> DistributeDetailToZCC(MaterialTransferDDistributeToZCCInput input);
}
}

View File

@@ -596,6 +596,7 @@ namespace Tnb.WarehouseMgr
.Select<WmsCarryH>()
.ToListAsync();
items = items.DistinctBy(r => r.id).ToList();
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}

View File

@@ -53,7 +53,7 @@ namespace Tnb.WarehouseMgr
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSMATERIALTRANSFER_ID)]
[ServiceModule(BizTypeId)]
public class WmsMaterialTransferService : BaseWareHouseService
public class WmsMaterialTransferService : BaseWareHouseService, IWmsMaterialTransferService
{
private const string BizTypeId = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
private readonly ISqlSugarClient _db;
@@ -1027,7 +1027,7 @@ namespace Tnb.WarehouseMgr
if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID)
{
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>()
.Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk <= a.yzqty_rk).ToList();
.Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk < a.yzqty_rk).ToList();
if (wmsMaterialTransferDs.Count == 0)
{
isOk2 = await _db.Updateable<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
@@ -1038,7 +1038,7 @@ namespace Tnb.WarehouseMgr
else
{
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>()
.Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty <= a.qty).ToList();
.Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList();
if (wmsMaterialTransferDs.Count == 0)
{
isOk2 = await _db.Updateable<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
@@ -1436,6 +1436,131 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 中储仓下发到二楼暂存仓(明细下发)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> DistributeDetailToZCC(MaterialTransferDDistributeToZCCInput input)
{
await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
var db = input.dbConn;
if (input.dbConn == null)
db = _db;
Logger.LogInformation($"中储仓下发到二楼暂存仓");
try
{
WmsMaterialTransferD wmsMaterialTransferD = db.Queryable<WmsMaterialTransferD>().Where(r => r.id == input.source_id).First();
if (wmsMaterialTransferD == null)
{
Logger.LogWarning($"不存在id为{input.source_id}的转库单明细!");
throw new AppFriendlyException($"不存在id为{input.source_id}的转库单明细!", 500);
}
if (wmsMaterialTransferD.yxfqty + input.xf_qty > wmsMaterialTransferD.qty)
{
Logger.LogWarning($@"转库单明细{wmsMaterialTransferD.id},下发数量{input.xf_qty}已超过可转库数量{wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty}");
throw new AppFriendlyException($@"转库单明细{wmsMaterialTransferD.id},下发数量{input.xf_qty}已超过可转库数量{wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty}", 500);
}
// 转库单载具子表
List<WmsMaterialTransferCarry> wmsMaterialTransferCarrys = new List<WmsMaterialTransferCarry>();
// 需要转库数量
decimal? needOut = input.xf_qty;
//出库取起点,获取所有符合输入的载具规格的载具
OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new()
{
warehouse_id = "2",
material_id = wmsMaterialTransferD.material_id,
code_batch = wmsMaterialTransferD.code_batch,
needOut = needOut,
material_code = wmsMaterialTransferD.material_code,
endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 }
};
List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
foreach (var item in carrys)
{
WmsCarryH wmsCarryH = item.Item1;
decimal codeqty = item.Item2;
BasLocation endlocation_ssx = item.Item3;
// 转库单载具子表
WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry();
wmsMaterialTransferCarry.bill_id = input.source_id;
wmsMaterialTransferCarry.carry_id = wmsCarryH.id;
wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code;
wmsMaterialTransferCarry.create_id = input.create_id;
wmsMaterialTransferCarry.create_time = DateTime.Now;
wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id;
wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code;
wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id;
wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code;
wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id;
wmsMaterialTransferCarry.qty = codeqty;
wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry);
}
await db.Ado.BeginTranAsync();
WmsMaterialTransfer wmsMaterialTransfer = await db.Queryable<WmsMaterialTransfer>().Where(r => r.id == wmsMaterialTransferD.bill_id).FirstAsync();
await db.Updateable<WmsMaterialTransfer>().SetColumns(r => new WmsMaterialTransfer
{
status = WmsWareHouseConst.BILLSTATUS_ON_ID,
carry_count = wmsMaterialTransferCarrys.Count,
remainbindracknum = wmsMaterialTransferCarrys.Count
}).Where(r => r.id == input.source_id).ExecuteCommandAsync();
Logger.LogInformation($"【DistributeToZCC】更新转库单{wmsMaterialTransfer.bill_code}主表的数据");
await db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync();
Logger.LogInformation($"【DistributeToZCC】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据");
foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys)
{
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id;
commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id;
commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id;
commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code;
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
commonCreatePretaskInput.source_id = wmsMaterialTransferCarry.mat_bill_id;
commonCreatePretaskInput.isExcuteMission = false;
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
{
Logger.LogInformation($"【DistributeToZCC生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}");
throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500);
}
await db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync();
}
Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功");
await db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
await db.Ado.RollbackTranAsync();
Logger.LogError("【DistributeToZCC】" + ex.Message);
Logger.LogError("【DistributeToZCC】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
_s_taskExecuteSemaphore_F1ZCCOutstock.Release();
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 中储仓退料到原材料仓
/// </summary>