齐套
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
/// 状态(开始 执行中 完成)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user