Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2024-08-16 16:56:49 +08:00
17 changed files with 1141 additions and 55 deletions

View File

@@ -96,6 +96,8 @@ namespace Tnb.ProductionMgr
// 原材料仓内转移
private static Timer? YCLInternalTransfertimer;
// 原材料仓内转移
private static Timer? elevatorTimer;
public SemaphoreSlim s_taskCheckGet = new(1);
public SemaphoreSlim s_taskScan = new(1);
@@ -1907,10 +1909,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
{
try
{
await _wareHouseService._s_GenTaskExecute.WaitAsync();
List<WmsDistaskH> elevatorTasks = db_ElevatorTaskExceptionHandle.Queryable<WmsDistaskH>()
.Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date == null && r.act_end_date == null).ToList();
.Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date == null && r.act_end_date == null
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToList();
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复的电梯任务{elevatorTasks.Count}条 {string.Join(',', elevatorTasks.Select(x => x.bill_code))}");
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复/执行的电梯任务{elevatorTasks.Count}条 {string.Join(',', elevatorTasks.Select(x => x.bill_code))}");
if (elevatorTasks?.Count > 0)
@@ -1927,10 +1931,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
// 三、四号梯发货带两托货
string[] doubleCarryRunElevators =
{
"Elevator3","Elevator4"
};
"Elevator3","Elevator4"
};
if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1)
{
LoggerElevatorTask.Information($"【GenTaskExecute】判断为三四号梯任务");
LoggerElevatorTask.Information($"【GenTaskExecute】现在有{group.Count()}托货");
// 电梯内放置两托货呼叫电梯下
if (group.Count() == 2)
{
@@ -1939,6 +1945,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
wmsDistaskHs[0].device_id = e.device_id;
wmsDistaskHs[1].device_id = e.device_id;
}
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯");
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
}
// 一托货
@@ -1963,23 +1970,28 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
}
else
{
LoggerElevatorTask.Information($"【GenTaskExecute】判断为非三四号梯任务");
if (e != null)
{
wmsDistaskHs[0].device_id = e.device_id;
}
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯");
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
}
}
}
}
catch (Exception ex)
{
LoggerFloor2RackDelivery.LogError($"【ElevatorTaskExceptionHandle】{ex.Message}");
LoggerFloor2RackDelivery.LogError($"【ElevatorTaskExceptionHandle】{ex.StackTrace}");
}
finally
{
_wareHouseService._s_GenTaskExecute.Release();
}
}
@@ -2606,15 +2618,14 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
// 停用
//PackOutstockServicetimer = new Timer(PackOutstockService, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
ElevatorTaskExceptionHandleThread = new Thread(ElevatorTaskExceptionHandle);
ElevatorTaskExceptionHandleThread.Start();
Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
YCLInternalTransfertimer = new Timer(YCLInternalTransfer, null, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(185));
elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20));
return Task.CompletedTask;
}
@@ -2647,6 +2658,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
ElevatorTaskExceptionHandleThread.Abort();
F2KTPsupplementtimer?.Dispose();
YCLInternalTransfertimer?.Dispose();
elevatorTimer?.Dispose();
}
#region

View File

@@ -128,6 +128,19 @@ public class ModuleConsts
/// 模块标识-出入库流水记录 todo
/// </summary>
public const string MODULE_WMSOUTINSTOCKDETAIL_ID = "MODULE_WMSOUTINSTOCKDETAIL_ID";
/// <summary>
/// 模块标识-调拨出库单(成品) todo
/// </summary>
public const string MODULE_WmsTransferInstock_ID = "MODULE_WmsTransferInstock_ID";
/// <summary>
/// 模块标识-调拨出库单(原材料) todo
/// </summary>
public const string MODULE_WmsRawmatTransferoutstock_ID = "MODULE_WmsRawmatTransferoutstock_ID";
/// <summary>
/// 模块标识-物料签收记录 todo
/// </summary>
public const string MODULE_WmsMaterialSignH_ID = "MODULE_WmsMaterialSignH_ID";
/// <summary>
/// 模块标识-人工空载具入库 todo
/// </summary>

View File

@@ -23,6 +23,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
/// </summary>
public string? biller { get; set; }
/// <summary>
/// 出库仓库
/// </summary>
public string? warehouse_outstock { get; set; }
/// <summary>
/// 入库组织编号
/// </summary>

View File

@@ -0,0 +1,82 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 物料签收记录子表
/// </summary>
[SugarTable("wms_material_sign_d")]
public partial class WmsMaterialSignD : BaseEntity<string>
{
public WmsMaterialSignD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 主表id
/// </summary>
public string? bill_id { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 条码
/// </summary>
public string? barcode { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string? material_name { get; set; }
/// <summary>
/// 规格型号
/// </summary>
public string? material_specification { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 条码数量
/// </summary>
public string? qty { get; set; }
/// <summary>
/// 签收数量
/// </summary>
public string? sign_qty { get; set; }
}

View File

@@ -0,0 +1,57 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// wms物料签收记录
/// </summary>
[SugarTable("wms_material_sign_h")]
public partial class WmsMaterialSignH : BaseEntity<string>
{
public WmsMaterialSignH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 载具id
/// </summary>
public string? carry_id { get; set; }
/// <summary>
/// 载具编码
/// </summary>
public string? carry_code { get; set; }
/// <summary>
/// 签收业务
/// </summary>
public string? business { get; set; }
/// <summary>
/// 回库预任务
/// </summary>
public string? pretask_code { get; set; }
}

View File

@@ -0,0 +1,92 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 原材料调拨出库表子表
/// </summary>
[SugarTable("wms_rawmat_transferoutstock_d")]
public partial class WmsRawmatTransferoutstockD : BaseEntity<string>
{
public WmsRawmatTransferoutstockD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 主表id
/// </summary>
public string? bill_id { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string? matcode_id { get; set; }
/// <summary>
/// 物料编号
/// </summary>
public string? matcode { get; set; }
/// <summary>
/// 物料描述
/// </summary>
public string? matspecification { get; set; }
/// <summary>
/// 单位
/// </summary>
public string? unit { get; set; }
/// <summary>
/// 出库数量
/// </summary>
public decimal? qty { get; set; }
/// <summary>
/// 实出数量
/// </summary>
public decimal? actual_qty { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 出库仓库
/// </summary>
public string? warehouse_code { get; set; }
}

View File

@@ -0,0 +1,117 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 原材料调拨出库
/// </summary>
[SugarTable("wms_rawmat_transferoutstock_h")]
public partial class WmsRawmatTransferoutstockH : BaseEntity<string>
{
public WmsRawmatTransferoutstockH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 原材料调拨出库单号
/// </summary>
public string? bill_code { get; set; }
/// <summary>
/// 联系人
/// </summary>
public string? contact_person { get; set; }
/// <summary>
/// 电话
/// </summary>
public string? tel { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public string? time_stamp { get; set; }
/// <summary>
/// 单据类型
/// </summary>
public string? document_type { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 部门编码
/// </summary>
public string? dept_code { get; set; }
/// <summary>
/// 业务员编码
/// </summary>
public string? biller { get; set; }
/// <summary>
/// 下发状态
/// </summary>
public string? issuance_status { get; set; }
/// <summary>
/// 出库类型
/// </summary>
public string? outstock_type { get; set; }
/// <summary>
/// 交易类型BIP
/// </summary>
public string? transaction_type { get; set; }
/// <summary>
/// 出库仓库
/// </summary>
public string? warehouse_code { get; set; }
}

View File

@@ -0,0 +1,137 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 成品调拨出库子表
/// </summary>
[SugarTable("wms_transfer_outstock_d")]
public partial class WmsTransferOutstockD : BaseEntity<string>
{
public WmsTransferOutstockD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 出库单ID
/// </summary>
public string? bill_id { get; set; }
/// <summary>
/// 执行状态
/// </summary>
public string? status { get; set; }
/// <summary>
/// 物品ID
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物品代码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 主单位
/// </summary>
public string? unit_id { get; set; }
/// <summary>
/// 单位代码
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 出库需求数量
/// </summary>
public decimal? pr_qty { get; set; }
/// <summary>
/// 已下发数量
/// </summary>
public decimal? xf_qty { get; set; }
/// <summary>
/// 实际出库数量
/// </summary>
public decimal? qty { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 规格
/// </summary>
public string? material_specification { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 批号
/// </summary>
public string? pi_code { get; set; }
/// <summary>
/// 物料描述
/// </summary>
public string? material_desc { get; set; }
/// <summary>
/// 灭菌批号
/// </summary>
public string? miepi_code { get; set; }
/// <summary>
/// 辅单位
/// </summary>
public string? fuunit_id { get; set; }
/// <summary>
/// 型号
/// </summary>
public string? model { get; set; }
/// <summary>
/// 辅数量
/// </summary>
public string? fu_qty { get; set; }
/// <summary>
/// 出库仓库
/// </summary>
public string? warehouse_code { get; set; }
}

View File

@@ -0,0 +1,102 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 成品调拨出库主表
/// </summary>
[SugarTable("wms_transfer_outstock_h")]
public partial class WmsTransferOutstockH : BaseEntity<string>
{
public WmsTransferOutstockH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 审核员
/// </summary>
public string? auditor_id { get; set; }
/// <summary>
/// 审核状态
/// </summary>
public int? audit_status { get; set; }
/// <summary>
/// 出库单号
/// </summary>
public string? bill_code { get; set; }
/// <summary>
/// 出库单创建日期
/// </summary>
public DateTime? bill_date { get; set; }
/// <summary>
/// 单据状态
/// </summary>
public string? status { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 出库类型
/// </summary>
public string? outstock_type { get; set; }
/// <summary>
/// 下发状态
/// </summary>
public string? issuance_status { get; set; }
/// <summary>
/// 交易类型BIP
/// </summary>
public string? transaction_type { get; set; }
/// <summary>
/// 出库仓库
/// </summary>
public string? warehouse_code { get; set; }
}

View File

@@ -32,6 +32,8 @@ namespace Tnb.WarehouseMgr.Interfaces
/// </summary>
SemaphoreSlim s_taskExecuteSemaphore_F2ZCCOutstock { get; }
SemaphoreSlim _s_GenTaskExecute { get; }
/// <summary>
/// 入库策略
/// </summary>

View File

@@ -66,6 +66,7 @@ namespace Tnb.WarehouseMgr
protected static Dictionary<string, int> _s_eleUseStatusDic;
public static SemaphoreSlim s_GenTaskExecute = new(1);
protected IEventPublisher? EventPublisher { set; get; }
protected static string _LoggerFileName = "";

View File

@@ -394,8 +394,15 @@ namespace Tnb.WarehouseMgr
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
}
// 3 4号梯只要电梯是当前楼层开门状态就能进
bool canEnter = false;
if (devName == "Elevator3" || devName == "Elevator4")
{
canEnter = true;
}
if (sysStatus == (int)EnumSysStatus. && runStatus == (int)EnumRunStatus.
&& doorStatus == (int)EnumDoorStatus. && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.)
&& doorStatus == (int)EnumDoorStatus. && (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus. || canEnter))
{
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
{
@@ -732,15 +739,39 @@ namespace Tnb.WarehouseMgr
Logger.Information($"【TaskCallback】 根据任务单查找电梯结果 {JsonConvert.SerializeObject(elevator)}");
if (!elevator?.device_id.IsNullOrEmpty() ?? false)
{
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
{
is_use = (int)EnumElevatorUseStatus.,
use_tasks = ""
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.;
// 根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("")
var devName = s_elevatorMap[elevator.device_id]?.ToString();
Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程 {devName} 变更为空闲 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
// 3 4号梯需要两托货都取出才能变更为空闲
if (devName == "Elevator3" || devName == "Elevator4")
{
string number = devName.Replace("Elevator", "");
List<WmsDistaskH> elevatorTasks = _db.Queryable<WmsDistaskH>()
.Where(r => r.startlocation_code.Contains($"DT-1-{number}") && r.endlocation_code.Contains($"RC") && r.act_start_date == null && r.act_end_date == null
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToList();
Logger.Information($"【TaskCallback】{devName.Match(@"\d+")}#梯 仍有未取货任务{elevatorTasks}条 {string.Join(',', elevatorTasks.Select(r => r.bill_code))}");
if (elevatorTasks.Count == 0)
{
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
{
is_use = (int)EnumElevatorUseStatus.,
use_tasks = ""
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.;
Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程 {devName} 变更为空闲 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
}
}
else
{
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
{
is_use = (int)EnumElevatorUseStatus.,
use_tasks = ""
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.;
Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程 {devName} 变更为空闲 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
}
int doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
Logger.Information($"【TaskCallback】 设备:{devName},门状态:{doorStatus.ToEnum<EnumDoorStatus>().ToString()}");
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.
@@ -829,6 +860,25 @@ namespace Tnb.WarehouseMgr
use_tasks = ""
})
.Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync();
if (input.elevator_code == "Elevator3" || input.elevator_code == "Elevator4")
{
// 成品出库解锁电梯
string number = input.elevator_code.Replace("Elevator", "");
List<WmsDistaskH> elevatorTasks = _db.Queryable<WmsDistaskH>()
.Where(r => r.startlocation_code.Contains($"DT-3-{number}") && r.endlocation_code.Contains($"DT-1-{number}") && r.act_start_date == null && r.act_end_date == null
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToList();
foreach (var item in elevatorTasks)
{
item.status = WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID;
}
int row = await _db.Updateable(elevatorTasks).ExecuteCommandAsync();
Logger.Information($"【WmsElevatorUnlock】操作电梯{input.elevator_code}重置电梯任务{row}条 {string.Join(',', elevatorTasks.Select(r => r.bill_code))}");
}
s_eleUseStatusDic[wmsElevatorH.elevator_id] = (int)EnumElevatorUseStatus.;
}
catch (Exception ex)

View File

@@ -1,4 +1,5 @@
using System.Text;
using System.Collections.Generic;
using System.Text;
using Aop.Api.Domain;
using JNPF.Common.Enums;
using JNPF.DependencyInjection;
@@ -979,6 +980,13 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
}
BasWarehouse warehouse_outstock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == input.warehouse_outstock).FirstAsync();
if (warehouse_outstock == null)
{
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!");
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{input.warehouse_outstock}的档案记录!");
}
try
{
await db.Ado.BeginTranAsync();
@@ -1036,6 +1044,27 @@ namespace Tnb.WarehouseMgr
await db.Insertable(wmsTransferOrderDs).ExecuteCommandAsync();
if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID)
{
WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = new WmsRawmatTransferoutstockH();
List<WmsRawmatTransferoutstockD> wmsRawmatTransferoutstockD = new List <WmsRawmatTransferoutstockD>();
await db.Insertable(wmsRawmatTransferoutstockH).ExecuteCommandAsync();
await db.Insertable(wmsRawmatTransferoutstockD).ExecuteCommandAsync();
}
else if(warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CP_ID)
{
WmsTransferInstockH wmsTransferInstockH = new WmsTransferInstockH();
List<WmsTransferInstockD> wmsTransferInstockD = new List<WmsTransferInstockD>();
await db.Insertable(wmsTransferInstockH).ExecuteCommandAsync();
await db.Insertable(wmsTransferInstockD).ExecuteCommandAsync();
}
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【TransferOrder】成功生成单据:{Code}");

View File

@@ -93,7 +93,11 @@ namespace Tnb.WarehouseMgr
public Func<string, int, Task> AddUnExecuteTask { get; set; }
public SemaphoreSlim _s_GenTaskExecute
{
get { return s_GenTaskExecute; }
}
public SemaphoreSlim s_taskExecuteSemaphore_YCLInstock
{
get { return _s_taskExecuteSemaphore_YCLInstock; }
@@ -1615,49 +1619,55 @@ namespace Tnb.WarehouseMgr
var e = await FindElevatorFromPars(q);
Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
// 三、四号梯发货带两托货
// 三、四号梯发货带两托货进定时任务
string[] doubleCarryRunElevators = new string[2]
{
"Elevator3","Elevator4"
};
if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1)
{
// 电梯内放置两托货呼叫电梯下
if (group.Count() == 2)
{
if (e != null)
{
wmsDistaskHs[0].device_id = e.device_id;
wmsDistaskHs[1].device_id = e.device_id;
}
_ = ExecuteTargetFloorTask(wmsDistaskHs);
}
// 一托货
else if (group.Count() == 1)
{
// 如果当前电梯没有执行中的任务 则呼叫电梯下
//Logger.Information($"【GenTaskExecute】判断为三四号梯任务");
//Logger.Information($"【GenTaskExecute】现在有{group.Count()}托货");
//// 电梯内放置两托货呼叫电梯下
//if (group.Count() == 2)
//{
// if (e != null)
// {
// wmsDistaskHs[0].device_id = e.device_id;
// wmsDistaskHs[1].device_id = e.device_id;
// }
// Logger.Information($"【GenTaskExecute】呼叫电梯");
// _ = ExecuteTargetFloorTask(wmsDistaskHs);
//}
//// 一托货
//else if (group.Count() == 1)
//{
// // 如果当前电梯没有执行中的任务 则呼叫电梯下
if (_db.Queryable<WmsDistaskH>().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0)
{
if (e != null)
{
wmsDistaskHs[0].device_id = e.device_id;
}
_ = ExecuteTargetFloorTask(wmsDistaskHs);
}
}
else
{
Logger.LogError($"电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托");
}
// if (_db.Queryable<WmsDistaskH>().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID
// && r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0)
// {
// Logger.Information($"【GenTaskExecute】判断为三四号梯任务 没有执行中的任务 呼叫电梯");
// if (e != null)
// {
// wmsDistaskHs[0].device_id = e.device_id;
// }
// _ = ExecuteTargetFloorTask(wmsDistaskHs);
// }
//}
//else
//{
// Logger.LogError($"电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托");
//}
}
else
{
Logger.Information($"【GenTaskExecute】判断为非三四号梯任务");
if (e != null)
{
wmsDistaskHs[0].device_id = e.device_id;
}
Logger.Information($"【GenTaskExecute】呼叫电梯");
_ = ExecuteTargetFloorTask(wmsDistaskHs);
}
}
@@ -2511,14 +2521,16 @@ namespace Tnb.WarehouseMgr
});
}
WmsCarryCode carryCode = new()
List<WmsCarryCode> carrycodes = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == carry.id).ToList();
carrycodes.ForEach(r =>
{
warehouse_id = locWhIdMap.ContainsKey(endLocId) ? locWhIdMap[endLocId].ToString() : "",
location_id = multiList[i].endlocation_id,
location_code = multiList[i].endlocation_code
};
r.warehouse_id = locWhIdMap.ContainsKey(endLocId) ? locWhIdMap[endLocId].ToString() : "";
r.location_id = multiList[i].endlocation_id;
r.location_code = multiList[i].endlocation_code;
carryCodeIts.Add(r);
});
carryIts.Add(carry);
carryCodeIts.Add(carryCode);
BasLocation loc = new()
{
@@ -2544,7 +2556,7 @@ 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 }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
_ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).ExecuteCommandAsync();
//更新库位信息,使用状态为 使用,锁定状态为未锁定
_ = await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync();
Logger.Information($"【TaskComplate】 更新库位 {JsonConvert.SerializeObject(locIts)}");

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aop.Api.Domain;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.FriendlyException;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 调拨出库单(原材料)
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WmsMaterialSignH_ID)]
public class WmsMaterialSignHService : BaseWareHouseService
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWmsPDAScanInStockService _wmsPDAScanInStock;
public WmsMaterialSignHService(
ISqlSugarRepository<WmsCarryH> repository,
IUserManager userManager,
IBillRullService billRullService,
IRunService runService,
IVisualDevService visualDevService,
IWmsPDAScanInStockService wmsPDAScanInStock)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_billRullService = billRullService;
_runService = runService;
_visualDevService = visualDevService;
_wmsPDAScanInStock = wmsPDAScanInStock;
}
}
}

View File

@@ -0,0 +1,159 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aop.Api.Domain;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.FriendlyException;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 调拨出库单(原材料)
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WmsRawmatTransferoutstock_ID)]
public class WmsRawmatTransferoutstockService : BaseWareHouseService
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWmsPDAScanInStockService _wmsPDAScanInStock;
public WmsRawmatTransferoutstockService(
ISqlSugarRepository<WmsCarryH> repository,
IUserManager userManager,
IBillRullService billRullService,
IRunService runService,
IVisualDevService visualDevService,
IWmsPDAScanInStockService wmsPDAScanInStock)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_billRullService = billRullService;
_runService = runService;
_visualDevService = visualDevService;
_wmsPDAScanInStock = wmsPDAScanInStock;
}
/// <summary>
/// 人工扫码入库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost]
public async Task ArtificialInstock(ArtificialInstockInput input)
{
try
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
await _db.Ado.BeginTranAsync();
BasLocation startlocationn = await _db.Queryable<BasLocation>().Where(r => r.location_code == input.startlocation_code).FirstAsync();
if (startlocationn == null)
{
throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}不存在", 500);
}
if (startlocationn.is_lock == 1)
{
throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}已锁定", 500);
}
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).FirstAsync();
if (wmsCarryH == null)
{
throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}不存在", 500);
}
if (wmsCarryH.is_lock == 1)
{
throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}已锁定", 500);
}
if (wmsCarryH.carry_status != "1")
{
throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}未绑定物料", 500);
}
BasLocation carrryLoc = await _db.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
if (carrryLoc != null && carrryLoc.is_type == "0")
{
throw new Exception($"托盘{wmsCarryH.carry_code}在存储库位中,不能绑定!");
}
switch (input.warehouse_id)
{
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
{
var WmsCarryCode = _db.Queryable<WmsCarryCode>().Where(it => it.carry_id == wmsCarryH.id).OrderByDescending(it => it.id).First();
if (WmsCarryCode != null)
{
VisualDevModelDataCrInput input2 = new VisualDevModelDataCrInput();
input2.data = new Dictionary<string, object>();
input2.data.Add("barcode", input.carry_code);
input2.data.Add("codeqty", WmsCarryCode.codeqty);//条码数量
input2.data.Add("material_code", WmsCarryCode.material_code);
input2.data.Add("extras", input.startlocation_code);//location_code
input2.data.Add("warehouse_id", "1");//TEST
input2.data.Add("bill_code", "");//采购收货单号
input2.data.Add("code_batch", WmsCarryCode.code_batch!);//批次
input2.data.Add("material_specification", WmsCarryCode.material_specification!);//规格型号
input2.data.Add("container_no", WmsCarryCode.container_no!);//箱号
input2.data.Add("material_id", WmsCarryCode.material_id);
input2.data.Add("物料条码", WmsCarryCode.barcode);
input2.data.Add("id", null);
_wmsPDAScanInStock.ScanInStockByRedis(input2, _db).Wait();
WmsArtificialInstock wmsArtificialInstock = new WmsArtificialInstock();
wmsArtificialInstock.carry_id = wmsCarryH.id;
wmsArtificialInstock.carry_code = wmsCarryH.carry_code;
wmsArtificialInstock.org_id = input.org;
wmsArtificialInstock.create_id = input.create_id;
wmsArtificialInstock.create_time = DateTime.Now;
wmsArtificialInstock.location_id = startlocationn.id;
wmsArtificialInstock.location_code = startlocationn.location_code;
wmsArtificialInstock.warehouse_id = input.warehouse_id;
await _db.Insertable(wmsArtificialInstock).ExecuteCommandAsync();
}
else
{
throw new AppFriendlyException($"【ArtificialInstock】载具 {input.carry_code} 未绑定物料条码!", 500);
}
break;
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
Logger.LogError($"【ArtificialInstock】 {ex.Message}");
Logger.LogError($"【ArtificialInstock】 {ex.StackTrace}");
await _db.Ado.RollbackTranAsync();
throw new AppFriendlyException($"【ArtificialInstock】人工扫码入库失败 {ex.Message}", 500);
}
}
}
}

View File

@@ -0,0 +1,159 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aop.Api.Domain;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.FriendlyException;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 调拨出库单(成品)
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WmsTransferInstock_ID)]
public class WmsTransferInstockService : BaseWareHouseService
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWmsPDAScanInStockService _wmsPDAScanInStock;
public WmsTransferInstockService(
ISqlSugarRepository<WmsCarryH> repository,
IUserManager userManager,
IBillRullService billRullService,
IRunService runService,
IVisualDevService visualDevService,
IWmsPDAScanInStockService wmsPDAScanInStock)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_billRullService = billRullService;
_runService = runService;
_visualDevService = visualDevService;
_wmsPDAScanInStock = wmsPDAScanInStock;
}
/// <summary>
/// 人工扫码入库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost]
public async Task ArtificialInstock(ArtificialInstockInput input)
{
try
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
await _db.Ado.BeginTranAsync();
BasLocation startlocationn = await _db.Queryable<BasLocation>().Where(r => r.location_code == input.startlocation_code).FirstAsync();
if (startlocationn == null)
{
throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}不存在", 500);
}
if (startlocationn.is_lock == 1)
{
throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}已锁定", 500);
}
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).FirstAsync();
if (wmsCarryH == null)
{
throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}不存在", 500);
}
if (wmsCarryH.is_lock == 1)
{
throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}已锁定", 500);
}
if (wmsCarryH.carry_status != "1")
{
throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}未绑定物料", 500);
}
BasLocation carrryLoc = await _db.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
if (carrryLoc != null && carrryLoc.is_type == "0")
{
throw new Exception($"托盘{wmsCarryH.carry_code}在存储库位中,不能绑定!");
}
switch (input.warehouse_id)
{
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
{
var WmsCarryCode = _db.Queryable<WmsCarryCode>().Where(it => it.carry_id == wmsCarryH.id).OrderByDescending(it => it.id).First();
if (WmsCarryCode != null)
{
VisualDevModelDataCrInput input2 = new VisualDevModelDataCrInput();
input2.data = new Dictionary<string, object>();
input2.data.Add("barcode", input.carry_code);
input2.data.Add("codeqty", WmsCarryCode.codeqty);//条码数量
input2.data.Add("material_code", WmsCarryCode.material_code);
input2.data.Add("extras", input.startlocation_code);//location_code
input2.data.Add("warehouse_id", "1");//TEST
input2.data.Add("bill_code", "");//采购收货单号
input2.data.Add("code_batch", WmsCarryCode.code_batch!);//批次
input2.data.Add("material_specification", WmsCarryCode.material_specification!);//规格型号
input2.data.Add("container_no", WmsCarryCode.container_no!);//箱号
input2.data.Add("material_id", WmsCarryCode.material_id);
input2.data.Add("物料条码", WmsCarryCode.barcode);
input2.data.Add("id", null);
_wmsPDAScanInStock.ScanInStockByRedis(input2, _db).Wait();
WmsArtificialInstock wmsArtificialInstock = new WmsArtificialInstock();
wmsArtificialInstock.carry_id = wmsCarryH.id;
wmsArtificialInstock.carry_code = wmsCarryH.carry_code;
wmsArtificialInstock.org_id = input.org;
wmsArtificialInstock.create_id = input.create_id;
wmsArtificialInstock.create_time = DateTime.Now;
wmsArtificialInstock.location_id = startlocationn.id;
wmsArtificialInstock.location_code = startlocationn.location_code;
wmsArtificialInstock.warehouse_id = input.warehouse_id;
await _db.Insertable(wmsArtificialInstock).ExecuteCommandAsync();
}
else
{
throw new AppFriendlyException($"【ArtificialInstock】载具 {input.carry_code} 未绑定物料条码!", 500);
}
break;
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
Logger.LogError($"【ArtificialInstock】 {ex.Message}");
Logger.LogError($"【ArtificialInstock】 {ex.StackTrace}");
await _db.Ado.RollbackTranAsync();
throw new AppFriendlyException($"【ArtificialInstock】人工扫码入库失败 {ex.Message}", 500);
}
}
}
}