二楼转库传任务单

This commit is contained in:
2024-06-25 11:38:11 +08:00
parent ca63ca7eb5
commit abd7576065
9 changed files with 448 additions and 67 deletions

View File

@@ -1337,10 +1337,10 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
BasLocation endLocation = rackEndLocations.First(); BasLocation endLocation = rackEndLocations.First();
// 锁住终点库位 // 锁住终点库位
//await db.Updateable<BasLocation>(r => new BasLocation await db_Floor2timer移走上升降区未生成预任务且满托的料架.Updateable<BasLocation>(r => new BasLocation
//{ {
// is_lock = 1 is_lock = 1
//}).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); }).Where(r => r.id == endLocation.id).ExecuteCommandAsync();
LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}");
@@ -1593,26 +1593,26 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
private async Task<bool> Floor2UpDownMachinecode_SetTag(string tag, string value) private async Task<bool> Floor2UpDownMachinecode_SetTag(string tag, string value)
{ {
string DevName = "东面提升机输送线"; //string DevName = "东面提升机输送线";
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase) //Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
{ //{
["DevName"] = DevName, // ["DevName"] = DevName,
["token"] = _eleCtlCfg.token, // ["token"] = _eleCtlCfg.token,
["TagName"] = tag, // ["TagName"] = tag,
["Value"] = value, // ["Value"] = value,
}; //};
string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); //string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
return result.Contains("Ok"); //return result.Contains("Ok");
//测试 //测试
//string DevName = "东面提升机输送线"; string DevName = "东面提升机输送线";
//JObject valueJson = new JObject(); JObject valueJson = new JObject();
//valueJson["Value"] = value; valueJson["Value"] = value;
//_redisData.SetHash(DevName, tag, valueJson.ToString()); _redisData.SetHash(DevName, tag, valueJson.ToString());
//return true; return true;
} }
#endregion #endregion
@@ -1636,13 +1636,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
//YCLWXDPJInstocktimer = new Timer(YCLWXDPJInstock, null, TimeSpan.Zero, TimeSpan.FromSeconds(100000)); //YCLWXDPJInstocktimer = new Timer(YCLWXDPJInstock, null, TimeSpan.Zero, TimeSpan.FromSeconds(100000));
// 二楼上升降机 // 二楼上升降机
Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(20)); Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
// 二楼料架配送 // 二楼料架配送
Floor2timer送空托到上升降区 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor2timer送空托到上升降区 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
Floor2timer送满托到下升降区 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor2timer送满托到下升降区 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
return Task.CompletedTask; return Task.CompletedTask;
} }

View File

@@ -22,7 +22,15 @@
/// 四楼解析库 /// 四楼解析库
/// </summary> /// </summary>
public const string WAREHOUSE_JXK_ID = "26103367464997"; public const string WAREHOUSE_JXK_ID = "26103367464997";
/// <summary>
/// 缓存仓ID
/// </summary>
public const string WAREHOUSE_HCC_ID = "26103348825381";
/// <summary>
/// 组装线边库
/// </summary>
public const string WAREHOUSE_ZZXBK_ID = "26257716248101";
/// <summary> /// <summary>
/// 出入库单据状态TypeID /// 出入库单据状态TypeID

View File

@@ -25,10 +25,18 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
/// <summary> /// <summary>
/// 来源业务单据id /// 来源业务单据id
/// </summary> /// </summary>
public string require_id { get; set; } public string source_id { get; set; }
/// <summary> /// <summary>
/// 来源业务单据code /// 来源业务单据code
/// </summary> /// </summary>
public string source_code { get; set; }
/// <summary>
/// 需求单据id
/// </summary>
public string require_id { get; set; }
/// <summary>
/// 需求单据code
/// </summary>
public string require_code { get; set; } public string require_code { get; set; }
public string moduleConsts { get; set; } public string moduleConsts { get; set; }

View File

@@ -33,5 +33,12 @@
/// 批次 /// 批次
/// </summary> /// </summary>
public string? code_batch { get; set; } public string? code_batch { get; set; }
/// <summary>
/// 终点库位(缓存仓)
/// </summary>
public string? endlocation_id { get; set; }
} }
} }

View File

@@ -15,6 +15,18 @@
/// </summary> /// </summary>
public string requireId { get; set; } public string requireId { get; set; }
/// <summary> /// <summary>
/// 需求单据code
/// </summary>
public string require_code { get; set; }
/// <summary>
/// 来源单据id
/// </summary>
public string source_id { get; set; }
/// <summary>
/// 来源单据code
/// </summary>
public string source_code { get; set; }
/// <summary>
/// 单据业务类型Id /// 单据业务类型Id
/// </summary> /// </summary>
public string bizTypeId { get; set; } public string bizTypeId { get; set; }

View File

@@ -34,6 +34,13 @@ namespace Tnb.WarehouseMgr.Interfaces
/// <exception cref="AppFriendlyException"></exception> /// <exception cref="AppFriendlyException"></exception>
Task<List<WmsCarryH>> OutStockStrategyYCL([FromQuery] OutStockStrategyQuery input); Task<List<WmsCarryH>> OutStockStrategyYCL([FromQuery] OutStockStrategyQuery input);
/// <summary> /// <summary>
/// 缓存仓出库策略
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
Task<List<WmsCarryH>> OutStockStrategyHCC([FromQuery] OutStockStrategyQuery input);
/// <summary>
/// 中储仓到二楼出库策略 /// 中储仓到二楼出库策略
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="input"></param>

View File

@@ -411,6 +411,52 @@ namespace Tnb.WarehouseMgr
return input.Size > 0 ? items.Take(input.Size).ToList() : items; return input.Size > 0 ? items.Take(input.Size).ToList() : items;
} }
/// <summary>
/// 缓存仓出库策略
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
public async Task<List<WmsCarryH>> OutStockStrategyHCC([FromQuery] OutStockStrategyQuery input)
{
Expressionable<WmsCarryH, WmsCarryCode, BasLocation> whereExprable = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
.And((a, b, c) => a.is_lock == 0 && c.is_lock == 0)
.And((a, b, c) => !string.IsNullOrEmpty(a.location_id))
.And((a, b, c) => c.is_type == ((int)EnumLocationType.).ToString())
.And((a, b, c) => a.out_status == "0")
.And((a, b, c) => c.wh_id == input.warehouse_id)
.AndIF(!string.IsNullOrEmpty(input.material_id), (a, b, c) => b.material_id == input.material_id)
.AndIF(!string.IsNullOrEmpty(input.code_batch), (a, b, c) => b.code_batch == input.code_batch)
.AndIF(!string.IsNullOrEmpty(input.material_specification), (a, b, c) => b.material_specification == input.material_specification)
.AndIF(!string.IsNullOrEmpty(input.container_no), (a, b, c) => b.container_no == input.container_no)
.AndIF(!string.IsNullOrEmpty(input.carrystd_id), (a, b, c) => a.carrystd_id == input.carrystd_id);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> carryStatusFilterExp = !input.material_id.IsNullOrWhiteSpace()
? (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString()
: (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString();
_ = whereExprable.And(carryStatusFilterExp);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> whereExpr = whereExprable.ToExpression();
SqlSugarClient cyDb = _db.CopyNew();
WmsInstockPolicies policy = await cyDb.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用策略", 500);
}
List<WmsCarryH> items = await cyDb.Queryable<WmsCarryH>().LeftJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
.LeftJoin<BasLocation>((a, b, c) => a.location_id == c.id)
.Where(whereExpr)
//.OrderByIF((a,b,c)=>SqlFunc.IsNullOrEmpty())
.OrderBy(policy.policy)
.Select<WmsCarryH>()
.ToListAsync();
items = items.Distinct().ToList();
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}
/// <summary> /// <summary>
/// 1->2出库策略 /// 1->2出库策略
/// </summary> /// </summary>
@@ -948,26 +994,26 @@ namespace Tnb.WarehouseMgr
private async Task<bool> Floor2UpDownMachinecode_SetTag(string tag, string value) private async Task<bool> Floor2UpDownMachinecode_SetTag(string tag, string value)
{ {
string DevName = "东面提升机输送线"; //string DevName = "东面提升机输送线";
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase) //Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
{ //{
["DevName"] = DevName, // ["DevName"] = DevName,
["token"] = _eleCtlCfg.token, // ["token"] = _eleCtlCfg.token,
["TagName"] = tag, // ["TagName"] = tag,
["Value"] = value, // ["Value"] = value,
}; //};
string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); //string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
return result.Contains("Ok"); //return result.Contains("Ok");
// 测试 // 测试
//string DevName = "东面提升机输送线"; string DevName = "东面提升机输送线";
//JObject valueJson = new JObject(); JObject valueJson = new JObject();
//valueJson["Value"] = value; valueJson["Value"] = value;
//_redisData.SetHash(DevName, tag, valueJson.ToString()); _redisData.SetHash(DevName, tag, valueJson.ToString());
//return true; return true;
} }
@@ -2089,11 +2135,16 @@ namespace Tnb.WarehouseMgr
else if (dt.biz_type == "FloorCallMaterial") else if (dt.biz_type == "FloorCallMaterial")
{ {
await _db.Updateable<WmsCarryH>().SetColumns(r => r.work_station == "").Where(r => r.id == dt.carry_id).ExecuteCommandAsync(); await _db.Updateable<WmsCarryH>().SetColumns(r => r.work_station == "").Where(r => r.id == dt.carry_id).ExecuteCommandAsync();
// require_code是任务单
string mo_task_code = dt.require_code;
} }
#endregion #endregion
List<WmsDistaskCode> disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync(); List<WmsDistaskCode> disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync();
WareHouseUpInput upInput = new() { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() }; WareHouseUpInput upInput = new() { bizTypeId = dt.biz_type, requireId = dt.require_id!, require_code = dt.require_code!, source_id = dt.source_id!
, source_code = dt.source_code!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() };
/*if (!_userManager?.LoginType.IsNullOrEmpty() ?? false) /*if (!_userManager?.LoginType.IsNullOrEmpty() ?? false)
{ {
@@ -2856,6 +2907,8 @@ namespace Tnb.WarehouseMgr
carry_code = carry_code, carry_code = carry_code,
area_id = sPoint?.area_id!, area_id = sPoint?.area_id!,
area_code = it.Key, area_code = it.Key,
source_id = input.source_id,
source_code = input.source_code,
require_id = input.require_id, require_id = input.require_id,
require_code = input.require_code, require_code = input.require_code,
create_id = _userManager.UserId, create_id = _userManager.UserId,

View File

@@ -321,6 +321,8 @@ namespace Tnb.WarehouseMgr
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.LogError($"【CarryUnbind】 {ex.Message}");
Logger.LogError($"【CarryUnbind】 {ex.StackTrace}");
await _db.Ado.RollbackTranAsync(); await _db.Ado.RollbackTranAsync();
return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message);
} }

View File

@@ -38,6 +38,7 @@ using Senparc.Weixin.Work.AdvancedAPIs.OaDataOpen;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1.X509;
using Tnb.ProductionMgr.Entities; using Tnb.ProductionMgr.Entities;
using Tnb.BasicData;
namespace Tnb.WarehouseMgr namespace Tnb.WarehouseMgr
{ {
@@ -201,7 +202,56 @@ namespace Tnb.WarehouseMgr
}; };
List<WmsCarryH> items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput); List<WmsCarryH> items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput);
decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id).Sum(r => r.codeqty); decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty);
JObject keyValuePairs = new JObject();
keyValuePairs["realPalletCount"] = items.Count;
keyValuePairs["realInvQty"] = qty;
return await ToApiResult(HttpStatusCode.OK, "成功", keyValuePairs);
}
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
}
/// <summary>
/// 获取物料库存(缓存仓)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> MaterialInventoryHCC(MaterialTransferGetMaterialInventoryInput input)
{
try
{
if (input.palletCount <= 0)
{
throw new AppFriendlyException("料架数必须大于0", 500);
}
if (string.IsNullOrEmpty(input.material_id))
{
throw new AppFriendlyException("物料id不可为空", 500);
}
if (string.IsNullOrEmpty(input.code_batch))
{
throw new AppFriendlyException("批号不可为空", 500);
}
//入库取终点 //出库起点
OutStockStrategyQuery inStockStrategyInput = new()
{
warehouse_id = WmsWareHouseConst.WAREHOUSE_HCC_ID,
material_id = input.material_id,
code_batch = input.code_batch,
Size = input.palletCount
};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategyHCC(inStockStrategyInput);
decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty);
JObject keyValuePairs = new JObject(); JObject keyValuePairs = new JObject();
keyValuePairs["realPalletCount"] = items.Count; keyValuePairs["realPalletCount"] = items.Count;
@@ -257,7 +307,7 @@ namespace Tnb.WarehouseMgr
await _db.Ado.BeginTranAsync(); await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点 //入库取终点 //出库起点
OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, code_batch = wmsMaterialTransferD.code_batch, Size = input.palletCount }; OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, code_batch = input.code_batch, Size = input.palletCount };
List<WmsCarryH> items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput); List<WmsCarryH> items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput);
if (items.Count == 0) if (items.Count == 0)
@@ -265,7 +315,7 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException($@"没有可以出库的载具", 500); throw new AppFriendlyException($@"没有可以出库的载具", 500);
} }
decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id).Sum(r => r.codeqty); decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty);
// 暂定PDA上查询到的物料批次和库存数量与提交时获取的不一致时需要前台重新获取库存接口 // 暂定PDA上查询到的物料批次和库存数量与提交时获取的不一致时需要前台重新获取库存接口
if (input.palletCount != items.Count || input.qty != qty) if (input.palletCount != items.Count || input.qty != qty)
@@ -297,7 +347,7 @@ namespace Tnb.WarehouseMgr
foreach (var wmsCarryH in items) foreach (var wmsCarryH in items)
{ {
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).FirstAsync(); WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).FirstAsync();
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.location_code == wmsCarryH.location_code).FirstAsync(); BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
BasLocation endLocation = null; BasLocation endLocation = null;
// 集中供料区三工位 // 集中供料区三工位
@@ -358,6 +408,157 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功"); return await ToApiResult(HttpStatusCode.OK, "成功");
} }
/// <summary>
/// 按料架下发(缓存仓)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> DistributeHCC(MaterialTransferDistributeInput input)
{
try
{
if (string.IsNullOrEmpty(input.source_id))
{
throw new AppFriendlyException("来源单据id不可为空", 500);
}
if (input.palletCount <= 0)
{
throw new AppFriendlyException("料架数必须大于0", 500);
}
if (input.qty <= 0)
{
throw new AppFriendlyException("数量必须大于0", 500);
}
if (string.IsNullOrEmpty(input.code_batch))
{
throw new AppFriendlyException("批号不可为空", 500);
}
WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable<WmsMaterialTransferD>().FirstAsync(it => it.id == input.source_id);
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable<WmsMaterialTransfer>().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id);
if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty)
{
throw new AppFriendlyException("已下发数量已达到转库数量", 500);
}
OrganizeEntity organizeEntity = _db.Queryable<OrganizeEntity>().Where(r => r.EnCode == wmsMaterialTransferD.station_code).First();
if (organizeEntity == null)
{
Logger.LogWarning($"【CallRackToProductionLine】不存在工位code为{wmsMaterialTransferD.station_code}的工位!");
throw new AppFriendlyException($"不存在工位code为{wmsMaterialTransferD.station_code}的工位!", 500);
}
// 获取产线
OrganizeEntity organizeEntityCX = _db.Queryable<OrganizeEntity>().Where(r => r.Id == organizeEntity.ParentId).First();
if (organizeEntityCX == null)
{
Logger.LogWarning($"【CallRackToProductionLine】基础资料错误工位{organizeEntity.EnCode}的上级产线不存在,请检查!");
throw new AppFriendlyException($"【CallRackToProductionLine】基础资料错误工位{organizeEntity.EnCode}的上级产线不存在,请检查!", 500);
}
if (organizeEntityCX.Category != "workline")
{
Logger.LogWarning($"【CallRackToProductionLine】基础资料错误工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}不属于产线类型,请检查!");
throw new AppFriendlyException($"【CallRackToProductionLine】基础资料错误工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}不属于产线类型,请检查!", 500);
}
// 获取任务单
List<PrdMoTask> organizeEntityCXs = _db.Queryable<PrdMoTask>().Where(r => r.workline_id == organizeEntityCX.Id && r.mo_task_status == DictConst.InProgressEnCode).ToList();
if (organizeEntityCXs.Count > 1)
{
Logger.LogWarning($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!");
throw new AppFriendlyException($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!", 500);
}
if (organizeEntityCXs.Count == 0)
{
Logger.LogWarning($"【CallRackToProductionLine】未找到工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单,请检查!");
throw new AppFriendlyException($"【CallRackToProductionLine】未找到工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单,请检查!", 500);
}
PrdMoTask prdMoTask = organizeEntityCXs.First();
await s_taskExecuteSemaphore.WaitAsync();
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_HCC_ID, material_id = wmsMaterialTransferD.material_id, code_batch = input.code_batch, Size = input.palletCount };
List<WmsCarryH> items = await _wareHouseService.OutStockStrategyHCC(inStockStrategyInput);
if (items.Count == 0)
{
throw new AppFriendlyException($@"没有可以出库的载具", 500);
}
decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty);
// 暂定PDA上查询到的物料批次和库存数量与提交时获取的不一致时需要前台重新获取库存接口
if (input.palletCount != items.Count || input.qty != qty)
{
throw new AppFriendlyException($@"当前实际料架数量为{input.palletCount} 实际库存数量为{qty},与前台数据不一致,请重新获取库存", HttpStatusCode.InternalServerError);
}
if (wmsMaterialTransfer.warehouse_instock != WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
{
throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}入库仓库不是线边库,请检查!", HttpStatusCode.InternalServerError);
}
foreach (var wmsCarryH in items)
{
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).FirstAsync();
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = startLocation.id;
commonCreatePretaskInput.endlocation_id = input.endlocation_id;
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
// 转库单id
commonCreatePretaskInput.source_id = input.source_id;
// 任务单code
commonCreatePretaskInput.require_id = prdMoTask.id;
commonCreatePretaskInput.require_code = prdMoTask.mo_task_code;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.isExcuteMission = false;
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != HttpStatusCode.OK)
{
Logger.LogInformation($@"生成预任务失败");
throw new AppFriendlyException($@"生成预任务失败", 500);
}
}
// 更新子表已下发数量
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yxfqty == r.yxfqty + input.qty).Where(r => r.id == input.source_id).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
Logger.LogError("【Distribute】" + ex.Message);
Logger.LogError("【Distribute】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
_ = s_taskExecuteSemaphore.Release();
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
public override async Task ModifyAsync(WareHouseUpInput input) public override async Task ModifyAsync(WareHouseUpInput input)
{ {
if (input == null) if (input == null)
@@ -372,10 +573,10 @@ namespace Tnb.WarehouseMgr
} }
// 更新已转数量 // 更新已转数量
bool isOk = await _db.Updateable<WmsMaterialTransferD>().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty)}) bool isOk = await _db.Updateable<WmsMaterialTransferD>().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty)})
.Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync(); .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync();
// 如果所有明细已完成 更新主表状态为完成 // 如果所有明细已完成 更新主表状态为完成
WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable<WmsMaterialTransferD>().Where(r => r.id == input.requireId).SingleAsync(); WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable<WmsMaterialTransferD>().Where(r => r.id == input.source_id).SingleAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>() 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();
bool isOk2 = true; bool isOk2 = true;
@@ -384,7 +585,9 @@ namespace Tnb.WarehouseMgr
isOk2 = await _db.Updateable<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) isOk2 = await _db.Updateable<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
.Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync();
} }
// require_code是任务单
string mo_task_code = input.require_code;
if (!isOk || !isOk2) if (!isOk || !isOk2)
{ {
@@ -579,7 +782,7 @@ namespace Tnb.WarehouseMgr
// 获取任务单 // 获取任务单
List<PrdMoTask> organizeEntityCXs = _db.Queryable<PrdMoTask>().Where(r => r.workline_code == organizeEntityCX.EnCode).ToList(); List<PrdMoTask> organizeEntityCXs = _db.Queryable<PrdMoTask>().Where(r => r.workline_id == organizeEntityCX.Id && r.mo_task_status == DictConst.InProgressEnCode).ToList();
if (organizeEntityCXs.Count > 1) if (organizeEntityCXs.Count > 1)
{ {
Logger.LogWarning($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!"); Logger.LogWarning($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!");
@@ -625,6 +828,8 @@ namespace Tnb.WarehouseMgr
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.task_type = ""; commonCreatePretaskInput.task_type = "";
commonCreatePretaskInput.biz_type = "FloorCallMaterial"; commonCreatePretaskInput.biz_type = "FloorCallMaterial";
commonCreatePretaskInput.source_id = "";
commonCreatePretaskInput.require_code = "";
commonCreatePretaskInput.require_id = prdMoTask.id; commonCreatePretaskInput.require_id = prdMoTask.id;
commonCreatePretaskInput.require_code = prdMoTask.mo_task_code; commonCreatePretaskInput.require_code = prdMoTask.mo_task_code;
@@ -716,25 +921,47 @@ namespace Tnb.WarehouseMgr
} }
/// <summary> /// <summary>
/// 从产线呼叫装料架到暂存仓 /// 从产线呼叫装料架到暂存仓/缓存仓
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost, NonUnify, AllowAnonymous] [HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> RackInstock(MaterialTransferRackInstockInput input) public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> RackInstock(MaterialTransferRackInstockInput input)
{
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).FirstAsync();
// 料架到暂存仓
if (wmsCarryH.carrystd_id == "26037267399717")
{
return await RackInstock_到暂存仓(input, wmsCarryH);
}
// 载运小车和载运料架到缓存仓
else if (wmsCarryH.carrystd_id == "26103233723941" || wmsCarryH.carrystd_id == "34995839046677")
{
return await RackInstock_到缓存仓(input, wmsCarryH);
}
else
{
Logger.LogError($"【RackInstock】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!");
return await ToApiResult(HttpStatusCode.InternalServerError, $"【RackInstock】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!");
}
}
async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> RackInstock_到暂存仓(MaterialTransferRackInstockInput input, WmsCarryH wmsCarryH)
{ {
try try
{ {
BasLocation startlocation = _db.Queryable<BasLocation>().Where(r => r.id == input.startlocation_id).First(); BasLocation startlocation = _db.Queryable<BasLocation>().Where(r => r.id == input.startlocation_id).First();
if (startlocation == null) if (startlocation == null)
{ {
Logger.LogWarning($"【RackEmptyInstock】不存在id为{input.startlocation_id}的库位!"); Logger.LogWarning($"【RackInstock】不存在id为{input.startlocation_id}的库位!");
throw new AppFriendlyException($"【RackEmptyInstock】不存在id为{input.startlocation_id}的库位!", 500); throw new AppFriendlyException($"【RackInstock】不存在id为{input.startlocation_id}的库位!", 500);
} }
if (string.IsNullOrEmpty(input.carry_code)) if (string.IsNullOrEmpty(input.carry_code))
{ {
Logger.LogWarning($"【RackEmptyInstock】料架不能为空{input.carry_code}"); Logger.LogWarning($"【RackInstock】料架不能为空{input.carry_code}");
throw new AppFriendlyException($"【RackEmptyInstock】料架不能为空{input.carry_code}", 500); throw new AppFriendlyException($"【RackInstock】料架不能为空{input.carry_code}", 500);
} }
if (input.judgeEmptyCarry) if (input.judgeEmptyCarry)
{ {
@@ -743,8 +970,8 @@ namespace Tnb.WarehouseMgr
.Where((a, b) => input.details.Select(r => r.carry_code).Contains(a.carry_code)).Select((a, b) => b).ToList(); .Where((a, b) => input.details.Select(r => r.carry_code).Contains(a.carry_code)).Select((a, b) => b).ToList();
if (wmsCarryCodes.Count > 0) if (wmsCarryCodes.Count > 0)
{ {
Logger.LogWarning($"【RackEmptyInstock】存在非空料箱不能入库{input.carry_code}"); Logger.LogWarning($"【RackInstock】存在非空料箱不能入库{input.carry_code}");
throw new AppFriendlyException($"【RackEmptyInstock】存在非空料箱不能入库{input.carry_code}", 500); throw new AppFriendlyException($"【RackInstock】存在非空料箱不能入库{input.carry_code}", 500);
} }
} }
@@ -755,16 +982,15 @@ namespace Tnb.WarehouseMgr
if (rackEndLocations.Count() == 0) if (rackEndLocations.Count() == 0)
{ {
Logger.LogWarning($"【RackEmptyInstock】没有可用的终点库位"); Logger.LogWarning($"【RackInstock】没有可用的终点库位");
throw new AppFriendlyException($"【RackEmptyInstock】没有可用的终点库位", 500); throw new AppFriendlyException($"【RackInstock】没有可用的终点库位", 500);
} }
BasLocation endlocation = rackEndLocations.First(); BasLocation endlocation = rackEndLocations.First();
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).FirstAsync();
// 重新绑定料箱到料架 // 重新绑定料箱到料架
// 清空料架 // 清空料架
Logger.LogWarning($"【RackEmptyInstock】清空料架"); Logger.LogWarning($"【RackInstock】清空料架");
List<WmsCarryH> membercarrys = _db.Queryable<WmsCarryH>().Where(r => input.details.Select(r => r.carry_code).Contains(r.carry_code)).ToList(); List<WmsCarryH> membercarrys = _db.Queryable<WmsCarryH>().Where(r => input.details.Select(r => r.carry_code).Contains(r.carry_code)).ToList();
@@ -796,7 +1022,7 @@ namespace Tnb.WarehouseMgr
} }
Logger.LogWarning($"【RackEmptyInstock】开始生成预任务"); Logger.LogWarning($"【RackEmptyInstock】开始生成预任务");
CommonCreatePretaskInput commonCreatePretaskInput = new (); CommonCreatePretaskInput commonCreatePretaskInput = new();
commonCreatePretaskInput.startlocation_id = startlocation.id; commonCreatePretaskInput.startlocation_id = startlocation.id;
commonCreatePretaskInput.endlocation_id = endlocation.id; commonCreatePretaskInput.endlocation_id = endlocation.id;
commonCreatePretaskInput.carry_id = wmsCarryH.id; commonCreatePretaskInput.carry_id = wmsCarryH.id;
@@ -807,7 +1033,7 @@ namespace Tnb.WarehouseMgr
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
{ {
Logger.LogInformation($"【RackEmptyInstock】生成预任务失败 载具 {input.carry_code}"); Logger.LogInformation($"【RackInstock】生成预任务失败 载具 {input.carry_code}");
throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500); throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500);
} }
Logger.LogWarning($"【RackEmptyInstock】生成预任务成功"); Logger.LogWarning($"【RackEmptyInstock】生成预任务成功");
@@ -815,14 +1041,72 @@ namespace Tnb.WarehouseMgr
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.LogError("【RackEmptyInstock】" + ex.Message); Logger.LogError("【RackInstock】" + ex.Message);
Logger.LogError("【RackEmptyInstock】" + ex.StackTrace); Logger.LogError("【RackInstock】" + ex.StackTrace);
await _db.Ado.RollbackTranAsync(); await _db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
} }
return await ToApiResult(HttpStatusCode.OK, "成功"); return await ToApiResult(HttpStatusCode.OK, "成功");
} }
async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> RackInstock_到缓存仓(MaterialTransferRackInstockInput input, WmsCarryH wmsCarryH)
{
try
{
BasLocation startlocation = _db.Queryable<BasLocation>().Where(r => r.id == input.startlocation_id).First();
if (startlocation == null)
{
Logger.LogWarning($"【RackInstock】不存在id为{input.startlocation_id}的库位!");
throw new AppFriendlyException($"【RackInstock】不存在id为{input.startlocation_id}的库位!", 500);
}
if (string.IsNullOrEmpty(input.carry_code))
{
Logger.LogWarning($"【RackInstock】料架不能为空{input.carry_code}");
throw new AppFriendlyException($"【RackInstock】料架不能为空{input.carry_code}", 500);
}
// 找到未占用且未锁定的库位
ISugarQueryable<BasLocation> rackEndLocations =
_db.Queryable<BasLocation>()
.Where(r => r.wh_id == "26103348825381" && r.is_use == "0" && r.is_lock == 0).OrderBy(a => a.id).Take(1);
if (rackEndLocations.Count() == 0)
{
Logger.LogWarning($"【RackInstock】没有可用的终点库位");
throw new AppFriendlyException($"【RackInstock】没有可用的终点库位", 500);
}
BasLocation endlocation = rackEndLocations.First();
await _db.Ado.BeginTranAsync();
Logger.LogWarning($"【RackEmptyInstock】开始生成预任务");
CommonCreatePretaskInput commonCreatePretaskInput = new();
commonCreatePretaskInput.startlocation_id = startlocation.id;
commonCreatePretaskInput.endlocation_id = endlocation.id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = input.carry_code;
commonCreatePretaskInput.task_type = "";
commonCreatePretaskInput.biz_type = "FloorCallMaterial";
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
{
Logger.LogInformation($"【RackInstock】生成预任务失败 载具 {input.carry_code}");
throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500);
}
Logger.LogWarning($"【RackEmptyInstock】生成预任务成功");
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
Logger.LogError("【RackInstock】" + ex.Message);
Logger.LogError("【RackInstock】" + ex.StackTrace);
await _db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
} }
} }