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

This commit is contained in:
2024-09-14 14:06:43 +08:00
40 changed files with 1930 additions and 499 deletions

View File

@@ -121,7 +121,6 @@ namespace Tnb.ProductionMgr
/// <summary>
/// AGV到电梯任务
/// </summary>
public SemaphoreSlim s_agvElevatortaskDic = new(1);
private StackExRedisHelper _redisData;
@@ -145,7 +144,6 @@ namespace Tnb.ProductionMgr
private ISqlSugarClient db_Floor4DMC2CPK;
private ISqlSugarClient db_F2KTPsupplement;
private ISqlSugarClient db_YCLInternalTransfer;
private ISqlSugarClient db_agvElevatorTaskExceptionHandles;
@@ -204,7 +202,6 @@ namespace Tnb.ProductionMgr
db_Floor4DMC2CPK = repository.CopyNew();
db_F2KTPsupplement = repository.CopyNew();
db_YCLInternalTransfer = repository.CopyNew();
db_agvElevatorTaskExceptionHandles = repository.CopyNew();
List<string> elevatorAreas = repository.CopyNew().Queryable<WmsElevatorH>().Select(r => r.area_code).Distinct().ToList();
foreach (var s_elevatorArea in elevatorAreas)
@@ -2082,254 +2079,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
/// <param name="args"></param>
async void AgvelevatorTimerTaskExceptionHandle(object args)
{
if (s_agvElevatortaskDic.CurrentCount == 0)
return;
var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3outstock").FirstAsync();
if (floor3outstock != null && floor3outstock.value == "0")
return;
await s_agvElevatortaskDic.WaitAsync();
try
{
await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync();
// 获取暂存区需要生成任务的库位
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync();
if (agvElevatorStartLocs.Count > 0)
{
LoggerAgvElevatorTask.Information($"【AgvelevatorTimerTaskExceptionHandle】检查到需要下发到一楼任务的暂存区库位{agvElevatorStartLocs.Count}条 {string.Join(',', agvElevatorStartLocs.Select(x => x.location_code))}");
List<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
{
List<BasLocation> locs = group.ToList();
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
for (int i = 0; i < locs.Count; i++)
{
// 选一楼出货库位
List<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
.OrderBy("location_code").ToListAsync();
if (outLocations.Count == 0)
{
LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位");
continue;
}
BasLocation outLocation = outLocations.FirstOrDefault();
WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().FirstAsync(it => it.location_id == outLocation.id);
// 交替选择缓存区库位
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync();
if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右"))
throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误需要配置值为【3楼发货左】或【3楼发货右】", 500);
BasLocation startloc = null;
// 如果没切换就是当前发货区
string = YCLInnerTransfer.value;
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
{
List<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
.Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
startloc = locations.FirstOrDefault();
#region
// 交替出的时候可能会选不到库位,做特殊处理
if (startloc == null)
{
LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发");
var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
= YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左";
LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货");
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == )
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
.Where((a, b) => b.name == && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
startloc = locations.FirstOrDefault();
// 如果还是选不到
if (startloc == null)
{
throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常");
}
var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
// 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯
if (_floor3FirstSelectElevatorTasknums.value == "2")
{
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯");
}
// 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯
else
{
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯");
string = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货");
// 选择另一个电梯座位首选电梯
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == )
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
// 剩余可放托数
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
}
}
#endregion
}
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().Where(r => r.location_id == startloc.id).ToListAsync();
if (wmsCarryHs.Count > 1)
{
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}");
continue;
}
if (wmsCarryHs.Count == 0)
{
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘");
continue;
}
WmsCarryH wmsCarryH = wmsCarryHs.FirstOrDefault();
WmsElevatorH wmsElevatorH = null;
// 选电梯
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
{
var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync();
floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString();
if (floor3FirstSelectElevatorTasknums.value == "0")
{
// 选择另一个电梯座位首选电梯
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
// 重置为可放两托
floor3FirstSelectElevatorTasknums.value = "2";
}
// 剩余可放托数
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value)
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
}
string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
List<WmsPointH> wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().Where(it => it.status == 1).ToListAsync();
List<WmsPointH> points = new List<WmsPointH>();
// 到电梯
WmsPointH cacheOut_point = wmsPointHs.Where(r => r.location_code == startloc.location_code).First().Copy();
WmsPointH DT_C_point = wmsPointHs.Where(r => r.point_code == $"DT-C-03-0{elevatorSno}").First().Copy();
cacheOut_point.area_code = "FC";
DT_C_point.area_code = "FC";
points.Add(cacheOut_point);
points.Add(DT_C_point);
// 到一楼
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-3-{elevatorSno}").First());
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-1-{elevatorSno}").First());
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-R-01-0{elevatorSno}").First());
points.Add(outPoint);
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
if (points?.Count > 0)
{
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
{
WmsPointH? sPoint = it.FirstOrDefault();
WmsPointH? ePoint = it.LastOrDefault();
WmsPretaskH preTask = new()
{
org_id = WmsWareHouseConst.AdministratorOrgId,
startlocation_id = sPoint?.location_id!,
startlocation_code = sPoint?.location_code!,
endlocation_id = ePoint?.location_id!,
endlocation_code = ePoint?.location_code!,
start_floor = sPoint?.floor.ToString(),
end_floor = ePoint?.floor.ToString(),
startpoint_id = sPoint?.id!,
startpoint_code = sPoint?.point_code!,
endpoint_id = ePoint?.id!,
endpoint_code = ePoint?.point_code!,
bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
biz_type = wmsCarryH.biz_type,
task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID
};
preTask.carry_id = wmsCarryH.id;
preTask.carry_code = wmsCarryH.carry_code;
preTask.area_id = sPoint?.area_id!;
preTask.area_code = it.Key;
// 载具记录 require_id todo
preTask.require_id = wmsCarryH.require_id;
preTask.require_code = "";
preTask.create_id = _userManager.UserId;
preTask.create_time = DateTime.Now;
return preTask;
}).ToList();
bool isOk = await _wareHouseService.GenPreTask(preTasks, null!, db_agvElevatorTaskExceptionHandles);
if (isOk)
{
//查询库位表
BasLocation location = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>().SingleAsync(it => it.id == startloc.id);
{
//载具加锁,增加库位信息
_ = await db_agvElevatorTaskExceptionHandles.Updateable<WmsCarryH>().SetColumns(it => new WmsCarryH
{
carry_status = ((int)EnumCarryStatus.).ToString(),
is_lock = 1,
location_id = startloc.id,
location_code = location.location_code
}).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync();
}
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == ( == "3楼发货左" ? "3楼发货右" : "3楼发货左"))
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
//所有库位加锁
string?[] ids = new[] { startloc.id, preTasks[0].endlocation_id, outLocation.id };
_ = await db_agvElevatorTaskExceptionHandles.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
}
else
{
throw new Exception("预任务生成失败");
}
}
}
}
await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync();
}
}
catch (ObjectDisposedException ex)
{
LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.Message}");
LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.StackTrace}");
if (ex.Source == "Npgsql")
db_agvElevatorTaskExceptionHandles = _repository.AsSugarClient().CopyNew();
}
catch (Exception ex)
{
Console.WriteLine("【AgvelevatorTimerTaskExceptionHandle】" + ex.Message);
LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.Message}");
LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.StackTrace}");
// 数据库连接断开时会报错
try { await db_agvElevatorTaskExceptionHandles.Ado.RollbackTranAsync(); } catch { };
}
finally
{
s_agvElevatortaskDic.Release();
}
await _wareHouseService.AgvelevatorTimerTaskExceptionHandle();
}
#region
@@ -2962,8 +2712,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
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));
agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20));
elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
@@ -3046,39 +2796,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
}
}
protected string _LoggerAgvElevatorTaskFileName = "";
protected ILogger _LoggerAgvElevatorTask;
protected ILogger LoggerAgvElevatorTask
{
get
{
string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/custom{DateTime.Now:yyyyMMdd}AgvElevatorTask.log";
if (_LoggerAgvElevatorTaskFileName != newFileName)
{
ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts =>
{
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
cfgOpts.MessageFormat = (logMsg) =>
{
var logLevel = s_logLevelMap[logMsg.LogLevel];
var sb = new StringBuilder();
_ = sb.Append($"[{logLevel}] ");
_ = sb.Append($"{logMsg.LogName} ");
_ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
_ = sb.Append($"#{logMsg.EventId.Id} ");
_ = sb.Append(logMsg.Message + " ");
_ = sb.Append(logMsg.Exception?.ToString());
return sb.ToString();
};
}));
_LoggerAgvElevatorTask = loggerFactory.CreateLogger(this.GetType());
_LoggerAgvElevatorTaskFileName = newFileName;
}
return _LoggerAgvElevatorTask;
}
}
protected string _LoggerSSXFileName = "";
protected ILogger _LoggerSSX;

View File

@@ -607,7 +607,7 @@
/// 第三方 bip 地址
/// </summary>
// public const string BIP_DOMAIN = "http://192.168.1.11:8087/";//测试地址
public const string BIP_DOMAIN = "http://192.168.0.145:8089/";//正式地址
public const string BIP_DOMAIN = "http://192.168.1.145:8089/";//正式地址
/// <summary>
/// 单位类型id

View File

@@ -72,5 +72,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
/// 子表主键
/// </summary>
public string erp_line_pk { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
}
}

View File

@@ -82,5 +82,9 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
/// 子表主键
/// </summary>
public string erp_line_pk { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
}
}

View File

@@ -106,5 +106,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
/// 子表主键
/// </summary>
public string erp_line_pk { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
}
}

View File

@@ -29,5 +29,10 @@
/// </summary>
public decimal qty { get; set; }
/// <summary>
/// 起点
/// </summary>
public string startlocation_code { get; set; }
}
}

View File

@@ -1,4 +1,6 @@
namespace Tnb.WarehouseMgr.Entities.Dto
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Dto
{
/// <summary>
/// 入库策略输入参数
@@ -34,5 +36,8 @@
// 策略编号
public string PolicyCode { get; set; }
// 策略编号
public ISqlSugarClient dbConn { get; set; } = null;
}
}

View File

@@ -1,4 +1,6 @@
namespace Tnb.WarehouseMgr.Entities.Dto
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Dto
{
public class OutStockStrategyQuery
{
@@ -52,5 +54,8 @@
// 策略编号
public string PolicyCode { get; set; }
// 策略编号
public ISqlSugarClient dbConn { get; set; } = null;
}
}

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
{
public class InventorycheckInput
{
/// <summary>
/// 盘点单号
/// </summary>
public string? erp_bill_code { get; set; }
/// <summary>
/// 部门编码
/// </summary>
public string? dept_code { get; set; }
/// <summary>
/// 业务员编码
/// </summary>
public string? biller { get; set; }
/// <summary>
/// 盘点仓库编码
/// </summary>
public string? warehouse_code { get; set; }
/// <summary>
/// 盘点日期
/// </summary>
public string? check_date { get; set; }
/// <summary>
/// 主表pk
/// </summary>
public string? erp_pk { get; set; }
public List<InventorycheckInputDetail> details { get; set; }
}
public class InventorycheckInputDetail
{
/// <summary>
/// 行号
/// </summary>
public string? lineno { get; set; }
/// <summary>
/// 物品代码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 单位代码
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 采购数量
/// </summary>
public decimal? qty { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 生产日期
/// </summary>
public DateTime? production_date { get; set; }
/// <summary>
/// 子表主键
/// </summary>
public string erp_line_pk { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
}
}

View File

@@ -105,5 +105,9 @@ public partial class WmsElevatorH : BaseEntity<string>
/// 电梯内托数
/// </summary>
public int carry_count { get; set; }
/// <summary>
/// 梯内货位占用情况
/// </summary>
public string? innerpos { get; set; }
}

View File

@@ -0,0 +1,124 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 盘点明细
/// </summary>
[SugarTable("wms_inventorycheck_d")]
public partial class WmsInventorycheckD : BaseEntity<string>
{
public WmsInventorycheckD()
{
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? remark { get; set; }
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { 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>
/// 单位id
/// </summary>
public string? unit_id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 数量
/// </summary>
public decimal? qty { get; set; }
/// <summary>
/// 生产日期
/// </summary>
public DateTime? production_date { get; set; }
/// <summary>
/// erp_line_pk
/// </summary>
public string? erp_line_pk { get; set; }
/// <summary>
/// 行号
/// </summary>
public string? lineno { get; set; }
/// <summary>
/// 实际数量
/// </summary>
public decimal? actual_qty { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
/// <summary>
/// 辅助属性 供应商
/// </summary>
public string auxprop_gys { get; set; }
/// <summary>
/// 辅助属性 小批号
/// </summary>
public string auxprop_xph { get; set; }
}

View File

@@ -0,0 +1,93 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 盘点单
/// </summary>
[SugarTable("wms_inventorycheck_h")]
public partial class WmsInventorycheckH : BaseEntity<string>
{
public WmsInventorycheckH()
{
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>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 盘点单号
/// </summary>
public string? bill_code { get; set; }
/// <summary>
/// 仓库id
/// </summary>
public string? warehouse_id { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string? warehouse_code { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
public string? warehouse_name { get; set; }
/// <summary>
/// 部门编码
/// </summary>
public string? dept_code { get; set; }
/// <summary>
/// 业务员编码
/// </summary>
public string? biller { get; set; }
/// <summary>
/// erp_pk
/// </summary>
public string? erp_pk { get; set; }
/// <summary>
/// erp_bill_code
/// </summary>
public string? erp_bill_code { get; set; }
/// <summary>
/// 盘点日期
/// </summary>
public string? check_date { get; set; }
}

View File

@@ -0,0 +1,67 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 盘点记录
/// </summary>
[SugarTable("wms_inventorycheck_record")]
public partial class WmsInventorycheckRecord : BaseEntity<string>
{
public WmsInventorycheckRecord()
{
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? bill_id { get; set; }
/// <summary>
/// 盘点单明细id
/// </summary>
public string? mat_bill_id { get; set; }
/// <summary>
/// 载具id
/// </summary>
public string? carry_id { get; set; }
/// <summary>
/// 载具编码
/// </summary>
public string? carry_code { get; set; }
/// <summary>
/// 库位id
/// </summary>
public string? location_id { get; set; }
/// <summary>
/// 库位编码
/// </summary>
public string? location_code { get; set; }
}

View File

@@ -18,4 +18,9 @@ public partial class WmsPretaskH : ITaskManagerDel
/// </summary>
[SugarColumn(IsIgnore = true)]
public string third_eqp_type { get; set; }
/// <summary>
/// 巷道
/// </summary>
[SugarColumn(IsIgnore = true)]
public string passage { get; set; }
}

View File

@@ -124,4 +124,16 @@ public partial class WmsRawmatOutstockD : BaseEntity<string>
/// </summary>
public decimal? actual_outstock_qty { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
/// <summary>
/// 辅助属性 供应商
/// </summary>
public string auxprop_gys { get; set; }
/// <summary>
/// 辅助属性 小批号
/// </summary>
public string auxprop_xph { get; set; }
}

View File

@@ -138,5 +138,17 @@ public partial class WmsRawmatTransferinstockD : BaseEntity<string>
/// 物料名称
/// </summary>
public string? matname { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
/// <summary>
/// 辅助属性 供应商
/// </summary>
public string auxprop_gys { get; set; }
/// <summary>
/// 辅助属性 小批号
/// </summary>
public string auxprop_xph { get; set; }
}

View File

@@ -97,5 +97,16 @@ public partial class WmsSaleD : BaseEntity<string>
/// </summary>
public string? erp_line_pk { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
/// <summary>
/// 辅助属性 供应商
/// </summary>
public string auxprop_gys { get; set; }
/// <summary>
/// 辅助属性 小批号
/// </summary>
public string auxprop_xph { get; set; }
}

View File

@@ -17,7 +17,7 @@ public partial class WmsStockReportCode : BaseEntity<string>
/// <summary>
/// 主表ID
/// </summary>
public string? report_id { get; set; }
//public string? report_id { get; set; }
///// <summary>
///// 载具ID
@@ -52,7 +52,7 @@ public partial class WmsStockReportCode : BaseEntity<string>
/// <summary>
/// 条码数量
/// </summary>
public decimal codeqty { get; set; }
public decimal? codeqty { get; set; }
/// <summary>
/// 单位ID
@@ -84,6 +84,10 @@ public partial class WmsStockReportCode : BaseEntity<string>
/// </summary>
public DateTime? time_stamp { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string? material_name { get; set; }
/// <summary>
/// 规格型号
/// </summary>
@@ -116,4 +120,14 @@ public partial class WmsStockReportCode : BaseEntity<string>
/// </summary>
public string? warehouse_name { get; set; }
/// <summary>
/// 区域编码
/// </summary>
public string? region_code { get; set; }
/// <summary>
/// 区域名称
/// </summary>
public string? region_name { get; set; }
}

View File

@@ -18,7 +18,7 @@ public partial class WmsStockReportH
//[SugarColumn(IsIgnore = true)]
//public List<WmsStockReportCode> Details { get; set; }
//[SugarColumn(IsIgnore = true)]
public decimal codeqty { get; set; }
public decimal? codeqty { get; set; }
}

View File

@@ -123,5 +123,17 @@ public partial class WmsTransferInstockD : BaseEntity<string>
/// 物料名称
/// </summary>
public string? material_name { get; set; }
/// <summary>
/// 辅助属性
/// </summary>
public string auxprop { get; set; }
/// <summary>
/// 辅助属性 供应商
/// </summary>
public string auxprop_gys { get; set; }
/// <summary>
/// 辅助属性 小批号
/// </summary>
public string auxprop_xph { get; set; }
}

View File

@@ -10,5 +10,6 @@
,
,
,
,
}
}

View File

@@ -196,6 +196,7 @@ namespace Tnb.WarehouseMgr.Interfaces
/// <returns></returns>
Task<List<WmsPointH>> PathAlgorithmsEle(string pStartId, string pEndId, int ele);
Task SsxControl(WmsDistaskH disTask, string action);
Task SsxControl_complete(WmsDistaskH disTask, string action);
Func<string, int, Task> AddUnExecuteTask { get; set; }
Task<bool> Check(string code, string action);
/// <summary>
@@ -235,5 +236,13 @@ namespace Tnb.WarehouseMgr.Interfaces
Task<WmsElevatorH> FindElevatorFromPars(ElevagorInfoQuery input);
Task<string> CreateCodeRules(string prefix, string custom, int watercodeLength);
public Task CallingLanding(List<WmsDistaskH?> agvDTTasks);
/// <summary>
/// 电梯第三次改动 生成Agv到电梯任务
/// </summary>
/// <param name="args"></param>
public Task AgvelevatorTimerTaskExceptionHandle();
}
}

View File

@@ -107,7 +107,7 @@ namespace Tnb.WarehouseMgr
public static Dictionary<string, SemaphoreSlim> _s_elevatortaskWCSRequestDic = new();
public static List<ISqlSugarClient> _db_ElevatorTaskExceptionHandles = new();
public static SemaphoreSlim s_agvElevatortaskDic = new(1);
public static SemaphoreSlim s_GenTaskExecute = new(1);
protected IEventPublisher? EventPublisher { set; get; }
@@ -145,6 +145,39 @@ namespace Tnb.WarehouseMgr
return _Logger;
}
}
protected string _LoggerAgvElevatorTaskFileName = "";
protected ILogger _LoggerAgvElevatorTask;
protected ILogger LoggerAgvElevatorTask
{
get
{
string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/custom{DateTime.Now:yyyyMMdd}AgvElevatorTask.log";
if (_LoggerAgvElevatorTaskFileName != newFileName)
{
ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts =>
{
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
cfgOpts.MessageFormat = (logMsg) =>
{
var logLevel = s_logLevelMap[logMsg.LogLevel];
var sb = new StringBuilder();
_ = sb.Append($"[{logLevel}] ");
_ = sb.Append($"{logMsg.LogName} ");
_ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
_ = sb.Append($"#{logMsg.EventId.Id} ");
_ = sb.Append(logMsg.Message + " ");
_ = sb.Append(logMsg.Exception?.ToString());
return sb.ToString();
};
}));
_LoggerAgvElevatorTask = loggerFactory.CreateLogger(this.GetType());
_LoggerAgvElevatorTaskFileName = newFileName;
}
return _LoggerAgvElevatorTask;
}
}
static BaseWareHouseService()
{

View File

@@ -92,9 +92,9 @@ namespace Tnb.WarehouseMgr
{
Logger.Information($"【LoadConfirm】接收到WCS取货确认信号.................. {JsonConvert.SerializeObject(input)}");
var dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
try
{
var dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
if (dis.area_code == "ZSCJ001")
{
var flag = await _wareHouseService.Check(dis.startlocation_code, "LOAD");
@@ -174,7 +174,6 @@ namespace Tnb.WarehouseMgr
var tags = _eleCtlCfg.tags;
await Task.Delay(1000);
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}");
{
var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor);
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
@@ -182,6 +181,7 @@ namespace Tnb.WarehouseMgr
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}");
*/
Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo},目标楼层:{curFloor},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}");
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus. && curFloor != floorNo)
{
_ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None);
@@ -281,19 +281,22 @@ namespace Tnb.WarehouseMgr
Logger.Information("【UnloadConfirm】 接收到WCS放货确认信号..................");
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode}");
WmsDistaskH dis = null;
try
{
var dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
if (dis.area_code == "ZSCJ001")
{
var flag = await _wareHouseService.Check(dis.endlocation_code, "UNLOAD");
if (flag)
{
await _wareHouseService.SsxControl(dis, "UNLOAD");
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认成功");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
else
{
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认信号不允许");
return await ToApiResult(HttpStatusCode.InternalServerError, "失败");
}
}
@@ -304,10 +307,12 @@ namespace Tnb.WarehouseMgr
{
// 二楼机械臂
await _wareHouseService.Floor2MechanicalConfirm(dis, "UNLOAD");
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认成功");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
else
{
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认成功");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
}
@@ -316,6 +321,7 @@ namespace Tnb.WarehouseMgr
{
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认失败");
return await ToApiResult(HttpStatusCode.InternalServerError, $"放货确认..................失败 原因是{ex.Message}");
throw;
}
@@ -397,7 +403,7 @@ namespace Tnb.WarehouseMgr
Logger.Information($"【UnloadConfirm】 发送电梯{devName}前门开门指令");
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
}
string innerpos = "";
// 3 4号梯需要电梯是当前楼层开门状态就能进
bool canEnter = false;
if (devName == "Elevator3" || devName == "Elevator4")
@@ -423,8 +429,19 @@ namespace Tnb.WarehouseMgr
if (elevator.carry_count >= 2)
{
Logger.LogInformation($"电梯内{devName}已有两托货!");
return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯{devName}已有两托货!");
return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯{devName}已有两托货!");
}
WmsElevatorH wmsElevatorH = await _db.Queryable<WmsElevatorH>().Where(r => r.elevator_id == elevator.device_id).FirstAsync();
WmsElevatorcacheArea wmsElevatorcacheArea = await _db.Queryable<WmsElevatorcacheArea>().Where(r => r.location_id == dis.startlocation_id).FirstAsync();
// 如果当前所放梯内货位已占用
if (wmsElevatorH.innerpos.Contains(wmsElevatorcacheArea.name))
{
return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯{devName}内托盘{dis.carry_code}当前准备放置的货位已有货!");
}
innerpos = wmsElevatorH.innerpos + "," + wmsElevatorcacheArea.name;
canEnter = true;
}
@@ -434,7 +451,8 @@ namespace Tnb.WarehouseMgr
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
{
is_use = (int)EnumElevatorUseStatus.,
use_tasks = $"','{r.use_tasks}".Trim(',')
use_tasks = $"','{r.use_tasks}".Trim(','),
innerpos = innerpos.Trim(',')
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.;
Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
@@ -845,7 +863,8 @@ namespace Tnb.WarehouseMgr
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
{
is_use = (int)EnumElevatorUseStatus.,
use_tasks = ""
use_tasks = "",
innerpos = ""
}).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]}");
@@ -895,6 +914,11 @@ namespace Tnb.WarehouseMgr
_ = await _db.Deleteable(elevatorQueueItem).ExecuteCommandAsync();
}
// 三楼出库取货完成时呼叫电梯
if (disTask.area_code == "FC")
{
_wareHouseService.CallingLanding(new List<WmsDistaskH?>() { disTask });
}
// 中储仓KIVA取货确认后不需要再发送信号给输送线
if (disTask.startlocation_code == "ZSSSXCTU01" || disTask.startlocation_code == "ZSSSXCTU02")
@@ -915,10 +939,20 @@ namespace Tnb.WarehouseMgr
};
Logger.Information($"taskCompleUpInput json parameter:{JsonConvert.SerializeObject(taskCompleUpInput)}");
await _wareHouseService.TaskComplate(taskCompleUpInput);
await _wareHouseService.SsxControl(disTask, "UNLOAD");
await _wareHouseService.SsxControl_complete(disTask, "UNLOAD");
await _wareHouseService.Floor2MechanicalComplete(disTask, "UNLOAD");
// 三楼暂存放货完成时生成到电梯任务
if (disTask.area_code == "F")
{
BasLocation endlocation = await _db.Queryable<BasLocation>().FirstAsync(r => r.id == disTask.endlocation_id);
if (endlocation.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID)
{
Logger.Information($"【TaskCallback】托盘{disTask.carry_code}放货完成 开始分配到电梯任务");
await _wareHouseService.AgvelevatorTimerTaskExceptionHandle();
}
}
Logger.Information($"【TaskCallback】 Agv放货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}");
}
@@ -956,10 +990,18 @@ namespace Tnb.WarehouseMgr
{
is_use = (int)EnumElevatorUseStatus.,
use_tasks = "",
carry_count = 0
carry_count = 0,
innerpos = ""
})
.Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync();
var floor3FirstSelectElevator = await _db.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
if (floor3FirstSelectElevator.value == input.elevator_code)
{
// 剩余可放托数
await _db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
}
List<WmsDistaskH> elevatorTasks = _db.Queryable<WmsDistaskH>()
.Where(r => r.startlocation_code.Contains($"DT") && r.endlocation_code.Contains($"DT") && r.act_start_date == null && r.act_end_date == null

View File

@@ -5,6 +5,7 @@ using JNPF.Common.Enums;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using Microsoft.AspNetCore.Authorization;
@@ -938,6 +939,284 @@ namespace Tnb.WarehouseMgr
}
}
/// <summary>
/// 转库单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> MaterialTransferBatch(List<MaterialTransferInput> inputs)
{
LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(inputs)}");
var db = _repository.AsSugarClient();
List<string> error_erpbillcodes = new List<string>();
foreach (MaterialTransferInput input in inputs)
{
try
{
WmsErpWarehouserelaH wmsErpWarehouserelaHout = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_outstock).FirstAsync();
if (wmsErpWarehouserelaHout == null)
{
_LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_outstock}对应wms系统的映射关系");
throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_outstock}对应wms系统的映射关系", 500);
}
WmsErpWarehouserelaH wmsErpWarehouserelaHin = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_instock).FirstAsync();
if (wmsErpWarehouserelaHin == null)
{
_LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系");
throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系", 500);
}
string warehouse_outstock_code = wmsErpWarehouserelaHout.wms_warehousecode;
string warehouse_instock_code = wmsErpWarehouserelaHin.wms_warehousecode;
BasWarehouse warehouse_outstock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == warehouse_outstock_code).FirstAsync();
BasWarehouse warehouse_instock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == warehouse_instock_code).FirstAsync();
if (warehouse_outstock == null)
{
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!");
throw new AppFriendlyException($"无法查询到出库仓库{input.warehouse_outstock}的档案记录!", 500);
}
if (warehouse_instock == null)
{
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!");
throw new AppFriendlyException($"无法查询到入库仓库{input.warehouse_instock}的档案记录!", 500);
}
if (string.IsNullOrEmpty(input.erp_pk))
{
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】主表主键不能为空");
throw new AppFriendlyException($@"主表主键不能为空!", 500);
}
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
if (count_erp_line_pk > 0)
{
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】子表主键不能为空");
throw new AppFriendlyException($@"子表主键不能为空!", 500);
}
string transfer_type = "";
// 中储仓到暂存仓
if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID
&& (warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_HCC_ID))
{
int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count();
if (count > 0)
{
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细");
throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500);
}
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE;
}
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID)
{
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBRK_CODE;
}
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_JZGL_ID)
{
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_JZGLRK_CODE;
}
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
{
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CROSSLAYER_CODE;
}
// 暂时其他情况都算齐套出入库类型(未定)
else
{
int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count();
if (count > 0)
{
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细");
throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500);
}
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE;
}
//var wmsMaterialTransferdsDistinct = input.details.Select(r => new
//{
// material_id = r.material_code,
// code_batch = r.code_batch,
//}).Distinct();
//if (wmsMaterialTransferdsDistinct.Count() < input.details.Count)
//{
// _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在物料和批号重复的明细");
// throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
//}
await db.Ado.BeginTranAsync();
// 判断是否重复传输
WmsMaterialTransfer wmsMaterialTransferRep = await db.Queryable<WmsMaterialTransfer>().Where(r => r.erp_bill_code == input.bill_code).FirstAsync();
if (wmsMaterialTransferRep != null)
{
// 判断单据是否已经下发
List<WmsMaterialTransferD> _wmsMaterialTransferDs = await db.Queryable<WmsMaterialTransferD>().Where(r => r.bill_id == wmsMaterialTransferRep.id).ToListAsync();
bool isxf = _wmsMaterialTransferDs.Where(r => r.yxfqty > 0).Any();
if (isxf)
{
_LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用转库单{input.bill_code}");
throw new AppFriendlyException($@"wms已下发使用转库单{input.bill_code}", 500);
}
else // 删除数据重新插入
{
await db.Deleteable<WmsMaterialTransfer>().Where(r => r.id == wmsMaterialTransferRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsMaterialTransferD>().Where(r => r.bill_id == wmsMaterialTransferRep.id).ExecuteCommandAsync();
}
}
List<MaterialTransferDetail> details = input.details.Where(r => r.qty > 0).ToList();
List<MaterialTransferDetail> details_return = input.details.Where(r => r.qty < 0).ToList();
if (details.Count > 0)
{
WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer();
string Code = await _billRuleService.GetBillNumber("MaterialTransfer");
wmsMaterialTransfer.bill_code = Code;
wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
wmsMaterialTransfer.bill_date = DateTime.Now;
wmsMaterialTransfer.warehouse_outstock = warehouse_outstock.id;
wmsMaterialTransfer.warehouse_instock = warehouse_instock.id;
wmsMaterialTransfer.biller_out = input.biller_out;
wmsMaterialTransfer.depart_out = input.depart_out;
wmsMaterialTransfer.biller_in = input.biller_in;
wmsMaterialTransfer.depart_in = input.depart_in;
wmsMaterialTransfer.deliver_date = input.deliver_date;
wmsMaterialTransfer.arrival_date = input.arrival_date;
wmsMaterialTransfer.create_id = WmsWareHouseConst.ErpUserId;
wmsMaterialTransfer.create_time = DateTime.Now;
wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsMaterialTransfer.erp_bill_code = input.bill_code;
wmsMaterialTransfer.type = transfer_type;
wmsMaterialTransfer.erp_pk = input.erp_pk;
await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = new List<WmsMaterialTransferD>();
foreach (var detail in details)
{
WmsMaterialTransferD wmsMaterialTransferD = new WmsMaterialTransferD();
wmsMaterialTransferD.lineno = detail.lineno;
wmsMaterialTransferD.material_code = detail.material_code;
wmsMaterialTransferD.code_batch = detail.code_batch;
wmsMaterialTransferD.station_code = detail.station_code;
wmsMaterialTransferD.qty = detail.qty;
wmsMaterialTransferD.bill_id = wmsMaterialTransfer.id;
wmsMaterialTransferD.yxfqty = 0;
wmsMaterialTransferD.yzqty = 0;
wmsMaterialTransferD.yxfqty_rk = 0;
wmsMaterialTransferD.yzqty_rk = 0;
wmsMaterialTransferD.erp_line_pk = detail.erp_line_pk;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsMaterialTransferD.material_id = material.id;
wmsMaterialTransferD.material_specification = material.material_specification;
}
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsMaterialTransferD.unit_id = erpExtendField.Id;
wmsMaterialTransferD.unit_code = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsMaterialTransferDs.Add(wmsMaterialTransferD);
}
await db.Insertable(wmsMaterialTransferDs).ExecuteCommandAsync();
LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}");
}
if (details_return.Count > 0)
{
WmsPrdReturnH wmsPrdReturnH = new WmsPrdReturnH();
string Code = await _billRuleService.GetBillNumber("WMSPRDRETURN");
wmsPrdReturnH.bill_code = Code;
wmsPrdReturnH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
wmsPrdReturnH.warehouse_id = warehouse_instock.id;
wmsPrdReturnH.create_id = WmsWareHouseConst.ErpUserId;
wmsPrdReturnH.create_time = DateTime.Now;
wmsPrdReturnH.erp_bill_code = input.bill_code;
wmsPrdReturnH.transfer_type = transfer_type;
wmsPrdReturnH.erp_pk = input.erp_pk;
await db.Insertable(wmsPrdReturnH).ExecuteCommandAsync();
List<WmsPrdReturnD> wmsPrdReturnDs = new List<WmsPrdReturnD>();
foreach (var detail in details_return)
{
WmsPrdReturnD wmsPrdReturnD = new WmsPrdReturnD();
wmsPrdReturnD.lineno = detail.lineno;
wmsPrdReturnD.material_code = detail.material_code;
wmsPrdReturnD.code_batch = detail.code_batch;
wmsPrdReturnD.qty = -detail.qty;
wmsPrdReturnD.bill_id = wmsPrdReturnH.id;
wmsPrdReturnD.ytqty = 0;
wmsPrdReturnD.erp_line_pk = detail.erp_line_pk;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsPrdReturnD.material_id = material.id;
wmsPrdReturnD.material_code = material.code;
wmsPrdReturnD.material_name = material.name;
}
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsPrdReturnD.unit_id = erpExtendField.Id;
}
else
{
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsPrdReturnDs.Add(wmsPrdReturnD);
}
await db.Insertable(wmsPrdReturnDs).ExecuteCommandAsync();
LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}");
}
await db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
error_erpbillcodes.Add($"bip单据号{input.bill_code}: {ex.Message}");
LoggerErp2Mes.LogWarning($"【MaterialTransfer】{ex.Message}");
LoggerErp2Mes.LogWarning($"【MaterialTransfer】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
}
finally
{
}
}
if (error_erpbillcodes.Count > 0)
{
LoggerErp2Mes.LogWarning($"同步失败信息:{string.Join(',', error_erpbillcodes)}");
return await ToApiResult(HttpStatusCode.InternalServerError, $"同步失败信息:{string.Join(',', error_erpbillcodes)}");
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 销售发货单
@@ -965,16 +1244,16 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException($@"子表主键不能为空!", 500);
}
var wmsSaleShippingsDistinct = input.details.Select(r => new
{
material_id = r.material_code,
code_batch = r.code_batch,
}).Distinct();
if (wmsSaleShippingsDistinct.Count() < input.details.Count)
{
_LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细");
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
}
//var wmsSaleShippingsDistinct = input.details.Select(r => new
//{
// material_id = r.material_code,
// code_batch = r.code_batch,
//}).Distinct();
//if (wmsSaleShippingsDistinct.Count() < input.details.Count)
//{
// _LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细");
// throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
//}
WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync();
if (wmsErpWarehouserelaH == null)
@@ -994,7 +1273,7 @@ namespace Tnb.WarehouseMgr
await db.Ado.BeginTranAsync();
// 判断是否重复传输
WmsSaleH wmsSaleHRep = await db.Queryable<WmsSaleH>().Where(r => r.erp_pk == input.erp_pk).FirstAsync();
WmsSaleH wmsSaleHRep = await db.Queryable<WmsSaleH>().Where(r => r.erp_bill_code == input.bill_code).FirstAsync();
if (wmsSaleHRep != null)
{
// 判断单据是否已经下发
@@ -1016,6 +1295,7 @@ namespace Tnb.WarehouseMgr
string Code = await _billRuleService.GetBillNumber("WmsSale");
wmsSaleH.bill_code = Code;
wmsSaleH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsSaleH.erp_bill_code = input.bill_code;
wmsSaleH.bill_type = "25103439022357";//销售出库单
wmsSaleH.audit_status = 0;
@@ -1031,7 +1311,7 @@ namespace Tnb.WarehouseMgr
wmsSaleH.customer_name = customer.customer_name;
}
wmsSaleH.ship_date = input.ship_date.Value;
//wmsSaleH.ship_date = input.ship_date.Value;
wmsSaleH.erp_pk = input.erp_pk;
wmsSaleH.create_id = WmsWareHouseConst.ErpUserId;
wmsSaleH.create_time = DateTime.Now;
@@ -1070,7 +1350,7 @@ namespace Tnb.WarehouseMgr
wmsSaleD.material_name = material.name;
wmsSaleD.material_specification = material.material_specification;
}
wmsSaleD.auxprop = detail.auxprop;
wmsSaleDs.Add(wmsSaleD);
}
@@ -1218,6 +1498,12 @@ namespace Tnb.WarehouseMgr
{
wmsRawmatTransferinstockH.outstockorg_id = org_erpExtendField.pk_org_v;
wmsRawmatTransferinstockH.outstockorg_code = org_erpExtendField.pk_org;
var OrganizeEntity = await db.Queryable<OrganizeEntity>().Where(a => a.Id == org_erpExtendField.table_id).FirstAsync();
if (OrganizeEntity != null)
{
wmsRawmatTransferinstockH.outstockorg_name = OrganizeEntity.FullName;
}
}
else
{
@@ -1268,7 +1554,7 @@ namespace Tnb.WarehouseMgr
msRawmatTransferinstockD.matname = material.name;
msRawmatTransferinstockD.matspecification = material.material_specification;
}
msRawmatTransferinstockD.auxprop = detail.auxprop;
wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD);
}
@@ -1339,6 +1625,7 @@ namespace Tnb.WarehouseMgr
wmsTransferInstockD.material_code = material.code;
wmsTransferInstockD.material_desc = material.material_specification;
}
wmsTransferInstockD.auxprop = detail.auxprop;
wmsTransferInstockDs.Add(wmsTransferInstockD);
}
@@ -1897,6 +2184,8 @@ namespace Tnb.WarehouseMgr
wmsRawmatOutstockH.bill_code = code;
wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId;
wmsRawmatOutstockH.create_time = DateTime.Now;
wmsRawmatOutstockH.erp_bill_code = input.outstock_order;
wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
//wmsRawmatOutstockH.biller = input.biller;
wmsRawmatOutstockH.department = input.dept_code;
wmsRawmatOutstockH.erp_pk = input.erp_pk;
@@ -1907,7 +2196,7 @@ namespace Tnb.WarehouseMgr
WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD();
wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id;
wmsRawmatOutstockD.unit = detail.unit_code;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsRawmatOutstockD.unit = erpExtendField.EnCode;
@@ -1934,7 +2223,7 @@ namespace Tnb.WarehouseMgr
wmsRawmatOutstockD.material_name = material.name;
wmsRawmatOutstockD.material_specification = material.material_specification;
}
wmsRawmatOutstockD.auxprop = detail.auxprop;
wmsRawmatOutstockDs.Add(wmsRawmatOutstockD);
}
@@ -1959,6 +2248,292 @@ namespace Tnb.WarehouseMgr
}
}
/// <summary>
/// 材料出库单(批量)
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> RawmatOutstockBatch(List<ErpRawmatOutstockInput> inputs)
{
LoggerErp2Mes.LogInformation($"【RawmatOutstock】ERP传入数据:{JsonConvert.SerializeObject(inputs)}");
var db = _repository.AsSugarClient();
List<string> error_erpbillcodes = new List<string>();
foreach (ErpRawmatOutstockInput input in inputs)
{
try
{
if (string.IsNullOrEmpty(input.erp_pk))
{
_LoggerErp2Mes.LogWarning($"【RawmatOutstock】主表主键不能为空");
throw new AppFriendlyException($@"主表主键不能为空!", 500);
}
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
if (count_erp_line_pk > 0)
{
_LoggerErp2Mes.LogWarning($@"【RawmatOutstock】子表主键不能为空");
throw new AppFriendlyException($@"子表主键不能为空!", 500);
}
//var wmsRawmatOutstocksDistinct = input.details.Select(r => new
//{
// material_id = r.material_code,
// code_batch = r.code_batch,
//}).Distinct();
//if (wmsRawmatOutstocksDistinct.Count() < input.details.Count)
//{
// _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】表体存在物料和批号重复的明细");
// throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
//}
await db.Ado.BeginTranAsync();
// 判断是否重复传输
WmsRawmatOutstockH wmsRawmatOutstockHRep = await db.Queryable<WmsRawmatOutstockH>().Where(r => r.erp_bill_code == input.outstock_order).FirstAsync();
if (wmsRawmatOutstockHRep != null)
{
// 判断单据是否已经下发
List<WmsRawmatOutstockD> _wmsRawmatOutstockDs = await db.Queryable<WmsRawmatOutstockD>().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ToListAsync();
bool isxf = _wmsRawmatOutstockDs.Where(r => r.actual_outstock_qty > 0).Any();
if (isxf)
{
_LoggerErp2Mes.LogWarning($@"【RawmatOutstock】wms已下发使用材料出库单{input.outstock_order}");
throw new AppFriendlyException($@"wms已下发使用材料出库单{input.outstock_order}", 500);
}
else // 删除数据重新插入
{
await db.Deleteable<WmsRawmatOutstockH>().Where(r => r.id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsRawmatOutstockD>().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
}
}
WmsRawmatOutstockH wmsRawmatOutstockH = new WmsRawmatOutstockH();
string code = await _billRuleService.GetBillNumber("rawmatoutstock");
wmsRawmatOutstockH.bill_code = code;
wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId;
wmsRawmatOutstockH.create_time = DateTime.Now;
wmsRawmatOutstockH.erp_bill_code = input.outstock_order;
wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
//wmsRawmatOutstockH.biller = input.biller;
wmsRawmatOutstockH.department = input.dept_code;
wmsRawmatOutstockH.erp_pk = input.erp_pk;
wmsRawmatOutstockH.issuance_status = "0";
List<WmsRawmatOutstockD> wmsRawmatOutstockDs = new List<WmsRawmatOutstockD>();
foreach (var detail in input.details)
{
WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD();
wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id;
wmsRawmatOutstockD.unit = detail.unit_code;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsRawmatOutstockD.unit = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsRawmatOutstockD.qty = detail.qty;
wmsRawmatOutstockD.batchno = detail.code_batch;
wmsRawmatOutstockD.erp_line_pk = detail.erp_line_pk;
wmsRawmatOutstockD.create_id = WmsWareHouseConst.ErpUserId;
wmsRawmatOutstockD.create_time = DateTime.Now;
wmsRawmatOutstockD.lineno = detail.lineno;
wmsRawmatOutstockD.actual_outstock_qty = 0;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsRawmatOutstockD.material_id = material.id;
wmsRawmatOutstockD.material_code = material.code;
wmsRawmatOutstockD.material_name = material.name;
wmsRawmatOutstockD.material_specification = material.material_specification;
}
wmsRawmatOutstockDs.Add(wmsRawmatOutstockD);
}
await db.Insertable(wmsRawmatOutstockH).ExecuteCommandAsync();
await db.Insertable(wmsRawmatOutstockDs).ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}");
}
catch (Exception ex)
{
error_erpbillcodes.Add($"bip单据号{input.outstock_order}: {ex.Message}");
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}");
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
}
finally
{
}
}
if (error_erpbillcodes.Count > 0)
{
LoggerErp2Mes.LogWarning($"同步失败信息:{string.Join(',', error_erpbillcodes)}");
return await ToApiResult(HttpStatusCode.InternalServerError, $"同步失败信息:{string.Join(',', error_erpbillcodes)}");
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 盘点单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> Inventorycheck(InventorycheckInput input)
{
LoggerErp2Mes.LogInformation($"【Inventorycheck】ERP传入数据:{JsonConvert.SerializeObject(input)}");
var db = _repository.AsSugarClient();
try
{
if (string.IsNullOrEmpty(input.erp_pk))
{
_LoggerErp2Mes.LogWarning($"【Inventorycheck】主表主键不能为空");
throw new AppFriendlyException($@"主表主键不能为空!", 500);
}
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
if (count_erp_line_pk > 0)
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】子表主键不能为空");
throw new AppFriendlyException($@"子表主键不能为空!", 500);
}
var wmsInventorychecksDistinct = input.details.Select(r => new
{
material_id = r.material_code,
code_batch = r.code_batch,
}).Distinct();
if (wmsInventorychecksDistinct.Count() < input.details.Count)
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体存在物料和批号重复的明细");
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
}
WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync();
if (wmsErpWarehouserelaH == null)
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系");
throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系", 500);
}
string warehouse_code = wmsErpWarehouserelaH.wms_warehousecode;
BasWarehouse warehouse = await db.Queryable<BasWarehouse>().Where(r => r.whcode == warehouse_code).FirstAsync();
if (warehouse == null)
{
_LoggerErp2Mes.LogWarning($"【Inventorycheck】无法查询到出库仓库{warehouse_code}的档案记录!");
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_code}的档案记录!");
}
await db.Ado.BeginTranAsync();
// 判断是否重复传输
WmsInventorycheckH wmsInventorycheckHRep = await db.Queryable<WmsInventorycheckH>().Where(r => r.erp_pk == input.erp_pk).FirstAsync();
if (wmsInventorycheckHRep != null)
{
// 判断单据是否已经下发
List<WmsInventorycheckD> _wmsSaleDs = await db.Queryable<WmsInventorycheckD>().Where(r => r.bill_id == wmsInventorycheckHRep.id).ToListAsync();
bool isxf = _wmsSaleDs.Where(r => r.actual_qty > 0).Any();
if (isxf)
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】wms已下发使用盘点单{input.erp_bill_code}");
throw new AppFriendlyException($@"wms已下发使用盘点单{input.erp_bill_code}", 500);
}
else // 删除数据重新插入
{
await db.Deleteable<WmsInventorycheckH>().Where(r => r.id == wmsInventorycheckHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsInventorycheckD>().Where(r => r.bill_id == wmsInventorycheckHRep.id).ExecuteCommandAsync();
}
}
WmsInventorycheckH wmsInventorycheckH = new WmsInventorycheckH();
string Code = await _billRuleService.GetBillNumber("CheckStockCode");
wmsInventorycheckH.create_id = WmsWareHouseConst.ErpUserId;
wmsInventorycheckH.create_time = DateTime.Now;
wmsInventorycheckH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsInventorycheckH.bill_code = Code;
wmsInventorycheckH.warehouse_id = warehouse.id;
wmsInventorycheckH.warehouse_code = warehouse.whcode;
wmsInventorycheckH.warehouse_name = warehouse.whname;
wmsInventorycheckH.dept_code = input.dept_code;
wmsInventorycheckH.biller = input.biller;
wmsInventorycheckH.erp_bill_code = input.erp_bill_code;
wmsInventorycheckH.erp_pk = input.erp_pk;
wmsInventorycheckH.check_date = input.check_date;
await db.Insertable(wmsInventorycheckH).ExecuteCommandAsync();
List<WmsInventorycheckD> wmsInventorycheckDs = new List<WmsInventorycheckD>();
foreach (var detail in input.details)
{
WmsInventorycheckD wmsInventorycheckD = new WmsInventorycheckD();
wmsInventorycheckD.bill_id = wmsInventorycheckH.id;
wmsInventorycheckD.create_id = WmsWareHouseConst.ErpUserId;
wmsInventorycheckD.create_time = DateTime.Now;
wmsInventorycheckD.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsInventorycheckD.production_date = detail.production_date;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsInventorycheckD.material_id = material.id;
wmsInventorycheckD.material_code = material.code;
wmsInventorycheckD.material_name = material.name;
wmsInventorycheckD.material_specification = material.material_specification;
}
wmsInventorycheckD.qty = detail.qty;
wmsInventorycheckD.actual_qty = 0;
wmsInventorycheckD.code_batch = detail.code_batch;
wmsInventorycheckD.erp_line_pk = detail.erp_line_pk;
wmsInventorycheckD.lineno = detail.lineno;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsInventorycheckD.unit_id = erpExtendField.Id;
wmsInventorycheckD.unit_code = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsInventorycheckD.auxprop = detail.auxprop;
wmsInventorycheckDs.Add(wmsInventorycheckD);
}
await db.Insertable(wmsInventorycheckDs).ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【Inventorycheck】成功生成单据:{Code}");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
catch (Exception ex)
{
LoggerErp2Mes.LogError($"【Inventorycheck】{ex.Message}");
LoggerErp2Mes.LogError($"【Inventorycheck】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
}
}
protected Task<Entities.Dto.Outputs.Result> ToApiResult(HttpStatusCode statusCode, string msg)
{

View File

@@ -76,9 +76,11 @@ namespace Tnb.WarehouseMgr
private readonly IWmsCarryBindService _wmsCarryBindService;
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
private readonly IWmsOutinStockDetailService _wmsOutinStockDetailService;
private static ISqlSugarClient db_agvElevatorTaskExceptionHandles;
private static readonly Dictionary<string, int> _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase);
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
private static Dictionary<string, object> locMap = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
@@ -276,7 +278,11 @@ namespace Tnb.WarehouseMgr
List<BasLocation> items = new();
try
{
var db = _db.CopyNew();
var db = input.dbConn;
if (input.dbConn == null)
{
db = _db.CopyNew();
}
WmsInstockPolicies policy = await db.Queryable<WmsInstockPolicies>().Where(it => it.status == 1 && (string.IsNullOrEmpty(input.PolicyCode)||
it.bill_code == input.PolicyCode)).FirstAsync();
if (policy == null)
@@ -307,7 +313,7 @@ namespace Tnb.WarehouseMgr
.AndIF(!string.IsNullOrEmpty(input.passage), it => it.passage == input.passage)
.ToExpression();
items = await _db.CopyNew().Queryable<BasLocation>().Where(whereExp).OrderBy(policy.policy).ToListAsync();
items = await db.Queryable<BasLocation>().Where(whereExp).OrderBy(policy.policy).ToListAsync();
}
catch (Exception)
{
@@ -325,7 +331,12 @@ namespace Tnb.WarehouseMgr
List<BasLocation> items = new();
try
{
WmsInstockPolicies policy = await _db.CopyNew().Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
var db = input.dbConn;
if (input.dbConn == null)
{
db = _db.CopyNew();
}
WmsInstockPolicies policy = await db.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用的策略", 500);
@@ -337,7 +348,7 @@ namespace Tnb.WarehouseMgr
.And(it => it.is_type == ((int)EnumLocationType.).ToString())
.And(it => it.is_use == ((int)EnumCarryStatus.).ToString())
.ToExpression();
items = await _db.CopyNew().Queryable<BasLocation>().Where(whereExp).OrderBy(policy.policy).ToListAsync();
items = await db.Queryable<BasLocation>().Where(whereExp).OrderBy(policy.policy).ToListAsync();
}
catch (Exception)
{
@@ -356,7 +367,12 @@ namespace Tnb.WarehouseMgr
List<BasLocation> items = new();
try
{
WmsInstockPolicies policy = await _db.CopyNew().Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
var db = input.dbConn;
if (input.dbConn == null)
{
db = _db.CopyNew();
}
WmsInstockPolicies policy = await db.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用的策略", 500);
@@ -368,7 +384,7 @@ namespace Tnb.WarehouseMgr
.And(it => it.is_type == ((int)EnumLocationType.).ToString())
.And(it => it.is_use == ((int)EnumCarryStatus.).ToString())
.ToExpression();
items = await _db.CopyNew().Queryable<BasLocation>().Where(whereExp).OrderBy(policy.policy).ToListAsync();
items = await db.Queryable<BasLocation>().Where(whereExp).OrderBy(policy.policy).ToListAsync();
}
catch (Exception)
{
@@ -472,7 +488,11 @@ namespace Tnb.WarehouseMgr
_ = whereExprable.And(carryStatusFilterExp);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> whereExpr = whereExprable.ToExpression();
SqlSugarClient cyDb = _db.CopyNew();
var cyDb = input.dbConn;
if (input.dbConn == null)
{
cyDb = _db.CopyNew();
}
List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>> items = cyDb.Queryable<WmsCarryH>().LeftJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
.LeftJoin<BasLocation>((a, b, c) => a.location_id == c.id)
@@ -513,7 +533,11 @@ namespace Tnb.WarehouseMgr
public async Task<List<WmsCarryH>> OutStockStrategy([FromQuery] OutStockStrategyQuery input)
{
SqlSugarClient cyDb = _db.CopyNew();
var cyDb = input.dbConn;
if (input.dbConn == null)
{
cyDb = _db.CopyNew();
}
List<string> busyPassages = new();
if (input.AvoidBusyPassage)
{
@@ -915,8 +939,8 @@ namespace Tnb.WarehouseMgr
putdic.Add("ZS-A03-1", new string[] { "hxjA", "A5允许入空箱", });
getdic.Add("ZS-A03-2", new string[] { "hxjA", "A5允许取满箱" });
putdic.Add("ZS-A04-1", new string[] { "hxjA", "A6允许入空箱", });
getdic.Add("ZS-A04-2", new string[] { "hxjA", "A6允许取满箱" });
putdic.Add("ZS-D06-1", new string[] { "hxjA", "A6允许入空箱", });
getdic.Add("ZS-D06-2", new string[] { "hxjA", "A6允许取满箱" });
putdic.Add("ZS-A05-1", new string[] { "hxjA", "A7允许入空箱", });
getdic.Add("ZS-A05-2", new string[] { "hxjA", "A7允许取满箱" });
@@ -1028,7 +1052,7 @@ namespace Tnb.WarehouseMgr
getdic.Add("ZS-A01-2", new string[] { "hxjA", "A3AGV允许入满箱", "true" });
getdic.Add("ZS-A02-2", new string[] { "hxjA", "A4AGV允许入满箱", "true" });
getdic.Add("ZS-A03-2", new string[] { "hxjA", "A5AGV允许入满箱", "true" });
getdic.Add("ZS-A04-2", new string[] { "hxjA", "A6AGV允许入满箱", "true" });
getdic.Add("ZS-D06-2", new string[] { "hxjA", "A6AGV允许入满箱", "true" });
getdic.Add("ZS-A05-2", new string[] { "hxjA", "A7AGV允许入满箱", "true" });
getdic.Add("ZS-A06-2", new string[] { "hxjA", "A8AGV允许入满箱", "true" });
getdic.Add("ZS-A07-2", new string[] { "hxjA", "A9AGV允许入满箱", "true" });
@@ -1067,7 +1091,7 @@ namespace Tnb.WarehouseMgr
putdic.Add("ZS-A01-1", new string[] { "hxjA", "A3AGV允许出空箱", "true" });
putdic.Add("ZS-A02-1", new string[] { "hxjA", "A4AGV允许出空箱", "true" });
putdic.Add("ZS-A03-1", new string[] { "hxjA", "A5AGV允许出空箱", "true" });
putdic.Add("ZS-A04-1", new string[] { "hxjA", "A6AGV允许出空箱", "true" });
putdic.Add("ZS-D06-1", new string[] { "hxjA", "A6AGV允许出空箱", "true" });
putdic.Add("ZS-A05-1", new string[] { "hxjA", "A7AGV允许出空箱", "true" });
putdic.Add("ZS-A06-1", new string[] { "hxjA", "A8AGV允许出空箱", "true" });
putdic.Add("ZS-A07-1", new string[] { "hxjA", "A9AGV允许出空箱", "true" });
@@ -1116,6 +1140,131 @@ namespace Tnb.WarehouseMgr
}
public async Task SsxControl_complete(WmsDistaskH disTask, string action)
{
Logger.Information($"输送线控制SsxControl_complete传入参数: {JsonConvert.SerializeObject(disTask)} {action}");
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
Dictionary<string, string[]> getdic = new Dictionary<string, string[]>();
getdic.Add("SSX-021-005", new string[] { "YTCS", "FullOut_CS05Done", "true" });
getdic.Add("SSX-111-011", new string[] { "东面提升机输送线", "下升降机11出箱完毕", "true" });
getdic.Add("SSX-111-012", new string[] { "东面提升机输送线", "下升降机12出箱完毕", "true" });
getdic.Add("ZZ-01-02", new string[] { "外包装箱码垛线", "WBZX_x1_take_mtp", "true" });
getdic.Add("ZZ-02-02", new string[] { "外包装箱码垛线", "WBZX_x2_take_mtp", "true" });
getdic.Add("ZSSSXCTU02", new string[] { "YTCS", "右输送线上层允许出箱3", "true" });
getdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线上层允许出箱1", "true" });
getdic.Add("SSX-011-008", new string[] { "东面提升机输送线", "入库输送线8出箱完毕", "true" });
getdic.Add("ZS-C01-2", new string[] { "hxjC", "A2AGV允许入满箱", "true" });
getdic.Add("ZS-C02-2", new string[] { "hxjC", "A3AGV允许入满箱", "true" });
getdic.Add("ZS-C03-2", new string[] { "hxjC", "A4AGV允许入满箱", "true" });
getdic.Add("ZS-C04-2", new string[] { "hxjC", "A5AGV允许入满箱", "true" });
getdic.Add("ZS-C05-2", new string[] { "hxjC", "A6AGV允许入满箱", "true" });
getdic.Add("ZS-C06-2", new string[] { "hxjC", "A7AGV允许入满箱", "true" });
getdic.Add("ZS-C07-2", new string[] { "hxjC", "A8AGV允许入满箱", "true" });
getdic.Add("ZS-C08-2", new string[] { "hxjC", "A9AGV允许入满箱", "true" });
getdic.Add("ZS-C09-2", new string[] { "hxjC", "A10AGV允许入满箱", "true" });
getdic.Add("ZS-C10-2", new string[] { "hxjC", "A11AGV允许入满箱", "true" });
getdic.Add("ZS-C11-2", new string[] { "hxjC", "A12AGV允许入满箱", "true" });
getdic.Add("ZS-C12-2", new string[] { "hxjC", "A13AGV允许入满箱", "true" });
getdic.Add("ZS-C13-2", new string[] { "hxjC", "A14AGV允许入满箱", "true" });
getdic.Add("ZS-C14-2", new string[] { "hxjC", "A1AGV允许入满箱", "true" });
getdic.Add("ZS-A01-2", new string[] { "hxjA", "A3AGV允许入满箱", "true" });
getdic.Add("ZS-A02-2", new string[] { "hxjA", "A4AGV允许入满箱", "true" });
getdic.Add("ZS-A03-2", new string[] { "hxjA", "A5AGV允许入满箱", "true" });
getdic.Add("ZS-D06-2", new string[] { "hxjA", "A6AGV允许入满箱", "true" });
getdic.Add("ZS-A05-2", new string[] { "hxjA", "A7AGV允许入满箱", "true" });
getdic.Add("ZS-A06-2", new string[] { "hxjA", "A8AGV允许入满箱", "true" });
getdic.Add("ZS-A07-2", new string[] { "hxjA", "A9AGV允许入满箱", "true" });
getdic.Add("ZS-A08-2", new string[] { "hxjA", "A10AGV允许入满箱", "true" });
getdic.Add("ZS-A09-2", new string[] { "hxjA", "A11AGV允许入满箱", "true" });
getdic.Add("ZS-A10-2", new string[] { "hxjA", "A12AGV允许入满箱", "true" });
getdic.Add("ZS-A11-2", new string[] { "hxjA", "A13AGV允许入满箱", "true" });
getdic.Add("ZS-A12-2", new string[] { "hxjA", "A14AGV允许入满箱", "true" });
putdic.Add("SSX-021-007", new string[] { "东面提升机输送线", "出库输送线7入箱完毕", "true" });
putdic.Add("SSX-011-006", new string[] { "YTCS", "EmptyIn_CS06Done", "true" });
putdic.Add("SSX-021-003", new string[] { "YTCS", "AgvFullIn_CS03Done", "true" });
putdic.Add("SSX-021-001", new string[] { "YTCS", "CtuEmptyIn_CS01Done", "true" });
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "右输送线下层允许入箱4", "true" });
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线下层允许入箱2", "true" });
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9入箱完毕", "true" });
putdic.Add("SSX-121-010", new string[] { "东面提升机输送线", "上升降机10入箱完毕", "true" });
putdic.Add("YCLCKBGW", new string[] { "CP8", "PutDoneEmptyBox", "true" });
putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2AGV允许出空箱", "true" });
putdic.Add("ZS-C02-1", new string[] { "hxjC", "A3AGV允许出空箱", "true" });
putdic.Add("ZS-C03-1", new string[] { "hxjC", "A4AGV允许出空箱", "true" });
putdic.Add("ZS-C04-1", new string[] { "hxjC", "A5AGV允许出空箱", "true" });
putdic.Add("ZS-C05-1", new string[] { "hxjC", "A6AGV允许出空箱", "true" });
putdic.Add("ZS-C06-1", new string[] { "hxjC", "A7AGV允许出空箱", "true" });
putdic.Add("ZS-C07-1", new string[] { "hxjC", "A8AGV允许出空箱", "true" });
putdic.Add("ZS-C08-1", new string[] { "hxjC", "A9AGV允许出空箱", "true" });
putdic.Add("ZS-C09-1", new string[] { "hxjC", "A10AGV允许出空箱", "true" });
putdic.Add("ZS-C10-1", new string[] { "hxjC", "A11AGV允许出空箱", "true" });
putdic.Add("ZS-C11-1", new string[] { "hxjC", "A12AGV允许出空箱", "true" });
putdic.Add("ZS-C12-1", new string[] { "hxjC", "A13AGV允许出空箱", "true" });
putdic.Add("ZS-C13-1", new string[] { "hxjC", "A14AGV允许出空箱", "true" });
putdic.Add("ZS-C14-1", new string[] { "hxjC", "A1AGV允许出空箱", "true" });
putdic.Add("ZS-A01-1", new string[] { "hxjA", "A3AGV允许出空箱", "true" });
putdic.Add("ZS-A02-1", new string[] { "hxjA", "A4AGV允许出空箱", "true" });
putdic.Add("ZS-A03-1", new string[] { "hxjA", "A5AGV允许出空箱", "true" });
putdic.Add("ZS-D06-1", new string[] { "hxjA", "A6AGV允许出空箱", "false" });
putdic.Add("ZS-A05-1", new string[] { "hxjA", "A7AGV允许出空箱", "true" });
putdic.Add("ZS-A06-1", new string[] { "hxjA", "A8AGV允许出空箱", "true" });
putdic.Add("ZS-A07-1", new string[] { "hxjA", "A9AGV允许出空箱", "true" });
putdic.Add("ZS-A08-1", new string[] { "hxjA", "A10AGV允许出空箱", "true" });
putdic.Add("ZS-A09-1", new string[] { "hxjA", "A11AGV允许出空箱", "true" });
putdic.Add("ZS-A10-1", new string[] { "hxjA", "A12AGV允许出空箱", "true" });
putdic.Add("ZS-A11-1", new string[] { "hxjA", "A13AGV允许出空箱", "false" });
putdic.Add("ZS-A12-1", new string[] { "hxjA", "A14AGV允许出空箱", "true" });
if (action == "LOAD")//取货
{
if (getdic.Keys.Contains(disTask.startlocation_code))
{
var strarr = getdic.Where(p => p.Key == disTask.startlocation_code).First().Value;
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
{
["DevName"] = strarr[0],
["token"] = _eleCtlCfg.token,
["TagName"] = strarr[1],
["Value"] = strarr[2],
};
Logger.Information($"SsxControlLOAD:{JsonConvert.SerializeObject(dicCommand)}");
var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
Logger.Information($"SsxControlLOAD:{str}");
//Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}");
}
}
else if (action == "UNLOAD")//放货
{
if (putdic.Keys.Contains(disTask.endlocation_code))
{
var strarr = putdic.Where(p => p.Key == disTask.endlocation_code).First().Value;
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
{
["DevName"] = strarr[0],
["token"] = _eleCtlCfg.token,
["TagName"] = strarr[1],
["Value"] = strarr[2],
};
Logger.Information($"SsxControlUNLOAD:{JsonConvert.SerializeObject(dicCommand)}");
var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
Logger.Information($"SsxControlUNLOAD:{str}");
//Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}");
}
}
}
/// <summary>
/// 二楼机械臂
/// </summary>
@@ -1480,6 +1629,35 @@ namespace Tnb.WarehouseMgr
agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList();
}
#region
// 原材料仓的未完成任务
List<WmsPretaskH> wmspretasks_ycl = await db.Queryable<WmsPretaskH>()
.InnerJoin<BasLocation>((a, b) => a.endlocation_id == b.id)
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
.InnerJoin<BasLocation>((a, b, c, d) => a.startlocation_id == d.id)
.Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
&& b.is_use == "0" && d.is_type == "0" && b.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID)
.Select((a, b, c, d) => new WmsPretaskH
{
move_num = c.move_num,
third_eqp_type = c.third_eqp_type,
passage = d.passage
}, true)
.ToListAsync();
// 原材料仓的执行中任务
List<WmsPretaskH> wmspretasksrun_ycl = wmspretasks_ycl.Where(r => r.status == WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID || r.status == WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID).ToList();
// 过滤normalPreTasks中的原材料仓的任务
normalPreTasks = normalPreTasks.Where(r => !wmspretasks_ycl.Select(a => a.id).Contains(r.id)).ToList();
// 过滤原材料仓同巷道的正在执行的任务
var yclTasks = wmspretasks_ycl.Where(r => !wmspretasksrun_ycl.Select(a => a.passage).Contains(r.passage)).ToList();
// 过滤重复巷道的预任务
yclTasks = yclTasks.OrderBy(r => r.passage).GroupBy(r => r.passage).Select(r => { return r.ToList()[0]; }).OrderBy(r => r.bill_code).ToList();
normalPreTasks = normalPreTasks.Concat(yclTasks).ToList();
#endregion
#region
#region
@@ -1507,7 +1685,7 @@ namespace Tnb.WarehouseMgr
// 过滤到三楼暂存区同目标库位的正在执行的任务
var cacheLocTasks = wmspretasks_agvElevator.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList();
// 过滤重复目标库位的预任务
cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList();
cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).OrderBy(r => r.bill_code).ToList();
normalPreTasks = normalPreTasks.Concat(cacheLocTasks).ToList();
#endregion
@@ -1695,26 +1873,8 @@ namespace Tnb.WarehouseMgr
task.device_id = e.device_id;
}
}
_ = CallingLanding(agvDTTasks);
Logger.Information($"【GenTaskExecute】呼梯任务数:{agvDTTasks.Count}");
List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks.Where(r => !string.IsNullOrEmpty(r.device_id))
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
var callLiftCnt = endLocCodes?.Count ?? 0;
Logger.Information($"【GenTaskExecute】实际可呼梯任务数:{callLiftCnt}");
if (endLocCodes?.Count > 0)
{
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
{
Logger.Information("【GenTaskExecute】呼梯操作");
_ = CallingLanding(endLocCodes);
}
else
{
Logger.Error("【GenTaskExecute】呼梯失败没有设备ID");
return;
}
}
//执行电梯任务
List<WmsDistaskH>? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
@@ -1818,6 +1978,7 @@ namespace Tnb.WarehouseMgr
}
/// <summary>
/// 获取电梯根据任务单号
/// </summary>
@@ -2222,8 +2383,28 @@ namespace Tnb.WarehouseMgr
/// </summary>
/// <param name="endLocCodes"></param>
/// <returns></returns>
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes)
public async Task CallingLanding(List<WmsDistaskH?> agvDTTasks)
{
Logger.Information($"【GenTaskExecute】呼梯任务数:{agvDTTasks.Count}");
List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks.Where(r => !string.IsNullOrEmpty(r.device_id))
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
var callLiftCnt = endLocCodes?.Count ?? 0;
Logger.Information($"【GenTaskExecute】实际可呼梯任务数:{callLiftCnt}");
if (endLocCodes?.Count > 0)
{
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
{
Logger.Information("【GenTaskExecute】呼梯操作");
// todo
}
else
{
Logger.Error("【GenTaskExecute】呼梯失败没有设备ID");
return;
}
}
Logger.Information($"【CallingLanding】 开始呼梯操作.............");
try
{
@@ -2387,14 +2568,10 @@ namespace Tnb.WarehouseMgr
// 一托下的时候切换首选电梯
if (disTaskIds.Count == 1)
{
// 选择另一个电梯座位首选电梯
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
// 剩余可放托数
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
await ChangeSelectedElevator(db);
}
#endregion
}
@@ -4085,8 +4262,7 @@ namespace Tnb.WarehouseMgr
code_batch = input.code_batch,
Size = 100,
Region_id = WmsWareHouseConst.REGION_Purchase_ID,
PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK,
AvoidBusyPassage = true
PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK
};
List<WmsCarryH> items = await OutStockStrategy(outStockStrategyInput);
@@ -4221,6 +4397,7 @@ namespace Tnb.WarehouseMgr
public SemaphoreSlim GetSemaphore(string type, string warehouse_id, string region_id = "")
{
Logger.LogInformation($"【GetSemaphore】type:{type} warehouse_id:{warehouse_id} region_id:{region_id}");
SemaphoreSlim result = null;
switch (warehouse_id)
{
@@ -4290,10 +4467,327 @@ namespace Tnb.WarehouseMgr
break;
}
}
return _s_taskExecuteSemaphore_F1ZCCOutstock;
return result;
}
#endregion
/// <summary>
/// 电梯第三次改动 生成Agv到电梯任务
/// </summary>
/// <param name="args"></param>
public async Task AgvelevatorTimerTaskExceptionHandle()
{
if (s_agvElevatortaskDic.CurrentCount == 0)
return;
LoggerAgvElevatorTask.Information($"三楼出货检查暂存区");
await s_agvElevatortaskDic.WaitAsync();
if (db_agvElevatorTaskExceptionHandles == null)
db_agvElevatorTaskExceptionHandles = _db.CopyNew();
try
{
var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3outstock").FirstAsync();
if (floor3outstock != null && floor3outstock.value == "0")
return;
await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync();
// 获取暂存区需要生成任务的库位
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync();
if (agvElevatorStartLocs.Count > 0)
{
LoggerAgvElevatorTask.Information($"【AgvelevatorTimerTaskExceptionHandle】检查到需要下发到一楼任务的暂存区库位{agvElevatorStartLocs.Count}条 {string.Join(',', agvElevatorStartLocs.Select(x => x.location_code))}");
List<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
{
List<BasLocation> locs = group.ToList();
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
for (int i = 0; i < locs.Count; i++)
{
// 交替选择缓存区库位
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync();
if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右"))
throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误需要配置值为【3楼发货左】或【3楼发货右】", 500);
BasLocation startloc = null;
// 如果没切换就是当前发货区
string = YCLInnerTransfer.value;
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
{
List<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
.Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
startloc = locations.FirstOrDefault();
#region
// 交替出的时候可能会选不到库位,做特殊处理
if (startloc == null)
{
LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发");
var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
= YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左";
LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货");
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == )
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
.Where((a, b) => b.name == && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
startloc = locations.FirstOrDefault();
// 如果还是选不到
if (startloc == null)
{
throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常");
}
var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
// 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯
if (_floor3FirstSelectElevatorTasknums.value == "2")
{
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯");
}
// 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯
else
{
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯");
string = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货");
WmsElevatorH _wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == ).FirstAsync();
// 仅切换电梯后 如果一托任务在等第二托时要做特殊处理
if (_wmsElevatorH.task_nums == 1)
{
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles, "1");
}
else
{
// 选择另一个电梯座位首选电梯
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
}
}
}
#endregion
}
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().Where(r => r.location_id == startloc.id).ToListAsync();
if (wmsCarryHs.Count > 1)
{
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}");
continue;
}
if (wmsCarryHs.Count == 0)
{
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘");
continue;
}
// 选一楼出货库位
List<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
.Where(r => GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
.OrderBy("location_code" + ( == "3楼发货左" ? " desc" : "")).ToListAsync();
if (outLocations.Count == 0)
{
LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位");
continue;
}
BasLocation outLocation = outLocations.FirstOrDefault();
WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().FirstAsync(it => it.location_id == outLocation.id);
WmsCarryH wmsCarryH = wmsCarryHs.FirstOrDefault();
WmsElevatorH wmsElevatorH = null;
string elevatorSno = "";
// 选电梯
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
{
var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync();
elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
// 检查有没有同时从同个暂存区分区发到同个电梯任务
//if (wmsElevatorH.task_nums + wmsElevatorH.carry_count > 0)
//{
// List<string> currentAreaLocs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorcacheArea>().Where(r => r.name == 切换发货区).Select(r => r.location_code).ToListAsync();
// // 同个暂存分区同个电梯的托盘
// List<string> _carrys = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPretaskH>()
// .InnerJoin<WmsPretaskH>((a, b) => currentAreaLocs.Contains(a.startlocation_code) && a.carry_code == b.carry_code
// && a.endlocation_code == b.startlocation_code && a.endlocation_code == $"DT-3-{elevatorSno}")
// .Where((a, b) => (a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)
// || (b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)).Select((a, b) => a.carry_code).ToListAsync();
// if (_carrys.Count > 0)
// {
// LoggerAgvElevatorTask.LogInformation($"出现同时从同个暂存区分区发到同个电梯{wmsElevatorH.elevator_code}的托盘{string.Join(',', _carrys)},等待托盘任务完成");
// continue;
// }
//}
floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString();
if (floor3FirstSelectElevatorTasknums.value == "0")
{
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
}
else
{
// 仅切换电梯后 如果一托任务在等第二托时要做特殊处理
if (wmsElevatorH.task_nums == 1)
{
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
}
else
{
// 剩余可放托数
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value)
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
}
}
}
List<WmsPointH> wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().Where(it => it.status == 1).ToListAsync();
List<WmsPointH> points = new List<WmsPointH>();
// 到电梯
WmsPointH cacheOut_point = wmsPointHs.Where(r => r.location_code == startloc.location_code).First().Copy();
WmsPointH DT_C_point = wmsPointHs.Where(r => r.point_code == $"DT-C-03-0{elevatorSno}").First().Copy();
cacheOut_point.area_code = "FC";
DT_C_point.area_code = "FC";
points.Add(cacheOut_point);
points.Add(DT_C_point);
// 到一楼
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-3-{elevatorSno}").First());
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-1-{elevatorSno}").First());
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-R-01-0{elevatorSno}").First());
points.Add(outPoint);
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
if (points?.Count > 0)
{
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
{
WmsPointH? sPoint = it.FirstOrDefault();
WmsPointH? ePoint = it.LastOrDefault();
WmsPretaskH preTask = new()
{
org_id = WmsWareHouseConst.AdministratorOrgId,
startlocation_id = sPoint?.location_id!,
startlocation_code = sPoint?.location_code!,
endlocation_id = ePoint?.location_id!,
endlocation_code = ePoint?.location_code!,
start_floor = sPoint?.floor.ToString(),
end_floor = ePoint?.floor.ToString(),
startpoint_id = sPoint?.id!,
startpoint_code = sPoint?.point_code!,
endpoint_id = ePoint?.id!,
endpoint_code = ePoint?.point_code!,
bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
biz_type = wmsCarryH.biz_type,
task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID
};
preTask.carry_id = wmsCarryH.id;
preTask.carry_code = wmsCarryH.carry_code;
preTask.area_id = sPoint?.area_id!;
preTask.area_code = it.Key;
// 载具记录 require_id todo
preTask.require_id = wmsCarryH.require_id;
preTask.require_code = "";
preTask.create_id = _userManager.UserId;
preTask.create_time = DateTime.Now;
return preTask;
}).ToList();
bool isOk = await GenPreTask(preTasks, null!, db_agvElevatorTaskExceptionHandles);
if (isOk)
{
LoggerAgvElevatorTask.LogInformation($"成功下发预任务 {string.Join(',', preTasks.Select(r => r.bill_code))}");
LoggerAgvElevatorTask.LogInformation($"成功下发载具 {string.Join(',', preTasks.Select(r => r.carry_code).Distinct())}");
//查询库位表
BasLocation location = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>().SingleAsync(it => it.id == startloc.id);
{
//载具加锁,增加库位信息
_ = await db_agvElevatorTaskExceptionHandles.Updateable<WmsCarryH>().SetColumns(it => new WmsCarryH
{
carry_status = ((int)EnumCarryStatus.).ToString(),
is_lock = 1,
location_id = startloc.id,
location_code = location.location_code
}).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync();
}
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == ( == "3楼发货左" ? "3楼发货右" : "3楼发货左"))
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
//所有库位加锁
string?[] ids = new[] { startloc.id, preTasks[0].endlocation_id, outLocation.id };
_ = await db_agvElevatorTaskExceptionHandles.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
}
else
{
throw new Exception("预任务生成失败");
}
}
}
}
await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync();
}
}
catch (ObjectDisposedException ex)
{
LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.Message}");
LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.StackTrace}");
if (ex.Source == "Npgsql")
db_agvElevatorTaskExceptionHandles = _db.CopyNew();
}
catch (Exception ex)
{
Console.WriteLine("【AgvelevatorTimerTaskExceptionHandle】" + ex.Message);
LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.Message}");
LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.StackTrace}");
// 数据库连接断开时会报错
try { await db_agvElevatorTaskExceptionHandles.Ado.RollbackTranAsync(); } catch { };
}
finally
{
s_agvElevatortaskDic.Release();
}
}
async Task ChangeSelectedElevator(ISqlSugarClient db, string maxposcount = "2")
{
BasFactoryConfig floor3FirstSelectElevator = await db.Queryable<BasFactoryConfig>().Where(r => r.key == "floor3FirstSelectElevator").FirstAsync();
string elevator = floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
LoggerAgvElevatorTask.LogInformation($"重置首选电梯为{elevator}");
// 选择另一个电梯座位首选电梯
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == elevator)
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == maxposcount)
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
}
}
}

View File

@@ -200,7 +200,10 @@ namespace Tnb.WarehouseMgr
{
decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum();
WmsPurchaseD wmsPurchaseD = await _db.Queryable<WmsPurchaseD>().Where(r => r.id == group.Key.require_id).FirstAsync();
if (wmsPurchaseD == null)
{
throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源采购收货明细不存在!");
}
// 收货质检之后不能绑定
if (!string.IsNullOrEmpty(wmsPurchaseD.qc_res))
{
@@ -221,6 +224,10 @@ namespace Tnb.WarehouseMgr
{
decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum();
WmsOutsourceD wmsOutsourceD = await _db.Queryable<WmsOutsourceD>().Where(r => r.id == group.Key.require_id).FirstAsync();
if (wmsOutsourceD == null)
{
throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源委外收货明细不存在!");
}
decimal? bind_qty = wmsOutsourceD.bind_qty ?? 0;
if (sum + bind_qty > wmsOutsourceD.outsource_quantity)
{
@@ -234,6 +241,10 @@ namespace Tnb.WarehouseMgr
{
decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum();
WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable<WmsRawmatTransferinstockD>().Where(r => r.id == group.Key.require_id).FirstAsync();
if (wmsRawmatTransferinstockD == null)
{
throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源原材料调拨入库明细不存在!");
}
decimal? bind_qty = wmsRawmatTransferinstockD.bind_qty ?? 0;
if (sum + bind_qty > wmsRawmatTransferinstockD.qty)
@@ -339,7 +350,6 @@ namespace Tnb.WarehouseMgr
throw new Exception($"以下条码已被绑定:{string.Join(',', repeat_wmsCarryCodes.Select(r => r.barcode))}");
}
List<WmsCarryCode> WmsCarryCodes = new List<WmsCarryCode>();
WmsCarrybindH wmsCarrybindH = new WmsCarrybindH();
@@ -441,6 +451,7 @@ namespace Tnb.WarehouseMgr
foreach (var detail in WmsCarryCodes)
{
var wmsCarrybindCode = detail.Adapt<WmsCarrybindCode>();
wmsCarrybindCode.id = SnowflakeIdHelper.NextId();
wmsCarrybindCode.membercarry_id = input.membercarry_id;
wmsCarrybindCode.membercarry_code = input.membercarry_code;
wmsCarrybindCode.carrybind_id = wmsCarrybindH.id;

View File

@@ -59,8 +59,7 @@ namespace Tnb.WarehouseMgr
.LeftJoin<WmsCarrystd>((a, b, c, d) => d.id == b.carrystd_id)
.LeftJoin<WmsCarryCode>((a, b, c, d, e) => e.carry_id == b.id)
.LeftJoin<BasMaterial>((a, b, c, d, e, f) => f.id == e.material_id)
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString()
&& ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code)))
.Where((a, b, c, d, e) => ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code)))
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code))
@@ -71,8 +70,8 @@ namespace Tnb.WarehouseMgr
{
warehouse_name = c.whname,
carry_id = b.id,
carry_code = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_code,
carry_name = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_name,
carry_code = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_code,
carry_name = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_name,
carry_status = b.is_lock == 1 ? "锁定" : "未锁定",
carry_type = d.carrystd_name,
location_code = a.location_code,
@@ -101,7 +100,7 @@ namespace Tnb.WarehouseMgr
.InnerJoin<WmsCarryCode>((a, b, c, d, e, f) => f.carry_id == e.membercarry_id)
.InnerJoin<BasMaterial>((a, b, c, d, e, f, g) => g.id == f.material_id)
.InnerJoin<WmsCarryH>((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id)
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString() && b.carry_status != "0" && b.carry_status != "6")
.Where((a, b, c, d, e) => b.carry_status != "0" && b.carry_status != "6")
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code)|| h.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code))
@@ -146,7 +145,7 @@ namespace Tnb.WarehouseMgr
if (report.carry_code != "空托盘堆垛")
{
List<WmsCarryStockReport> curCarryCodes = items.FindAll(x => x.carry_id == itGroup.Key.carry_id);
List<WmsCarryStockReport> curCarryCodes = items.FindAll(x => !string.IsNullOrEmpty(x.carry_id) && x.carry_id == itGroup.Key.carry_id);
List<WmsCarryStockReportCode> wmsCarryStockReportCodes = new List<WmsCarryStockReportCode>();
int index = 0;
@@ -205,51 +204,56 @@ namespace Tnb.WarehouseMgr
var warehouse_id = "";
var carry_code = "";
var material_code = "";
var container_no = "";
var code_batch = "";
if (!input.queryJson.IsNullOrWhiteSpace())
{
warehouse_id = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.warehouse_id));
carry_code = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.carry_code));
material_code = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.material_code));
code_batch = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.code_batch));
container_no = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.container_no));
}
List<WmsCarryStockReport> items = await _db.Queryable<BasLocation>()
.LeftJoin<WmsCarryH>((a, b) => b.location_id == a.id)
.InnerJoin<BasWarehouse>((a, b, c) => a.wh_id == c.id)
.LeftJoin<WmsCarrystd>((a, b, c, d) => d.id == b.carrystd_id)
.LeftJoin<WmsCarryCode>((a, b, c, d, e) => e.carry_id == b.id)
.LeftJoin<BasMaterial>((a, b, c, d, e, f) => f.id == e.material_id)
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString() && a.is_use == "1"
&& ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code)))
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code))
.OrderByDescending((a, b, c, d, e, f) => b.carry_code)
.Select((a, b, c, d, e, f) => new WmsCarryStockReport
{
warehouse_name = c.whname,
carry_id = b.id,
carry_code = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_code,
carry_name = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_name,
carry_status = b.is_lock == 1 ? "锁定" : "未锁定",
carry_type = d.carrystd_name,
location_code = a.location_code,
location_name = a.location_name,
location_status = a.is_lock == 1 ? "锁定" : "未锁定",
instock_time = b.instock_time != null ? b.instock_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
barcode = e.barcode,
code_batch = e.code_batch,
qty = e.codeqty,
material_id = e.material_id,
material_code = e.material_code,
material_name = f.name,
unit = e.unit_id,
creator = e.create_id,
bind_time = e.create_time != null ? e.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
})
.OrderBy((a) => a.location_code)
.ToListAsync();
.LeftJoin<WmsCarryH>((a, b) => b.location_id == a.id)
.InnerJoin<BasWarehouse>((a, b, c) => a.wh_id == c.id)
.LeftJoin<WmsCarrystd>((a, b, c, d) => d.id == b.carrystd_id)
.LeftJoin<WmsCarryCode>((a, b, c, d, e) => e.carry_id == b.id)
.LeftJoin<BasMaterial>((a, b, c, d, e, f) => f.id == e.material_id)
.Where((a, b, c, d, e) => ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code)))
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code))
.WhereIF(!string.IsNullOrEmpty(code_batch), (a, b, c, d, e, f) => e.code_batch.Contains(code_batch))
.WhereIF(!string.IsNullOrEmpty(container_no), (a, b, c, d, e, f) => f.container_no.Contains(container_no))
.OrderByDescending((a, b, c, d, e, f) => b.carry_code)
.Select((a, b, c, d, e, f) => new WmsCarryStockReport
{
warehouse_name = c.whname,
carry_id = b.id,
carry_code = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_code,
carry_name = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_name,
carry_status = b.is_lock == 1 ? "锁定" : "未锁定",
carry_type = d.carrystd_name,
location_code = a.location_code,
location_name = a.location_name,
location_status = a.is_lock == 1 ? "锁定" : "未锁定",
instock_time = b.instock_time != null ? b.instock_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
barcode = e.barcode,
code_batch = e.code_batch,
qty = e.codeqty,
material_id = e.material_id,
material_code = e.material_code,
material_name = f.name,
unit = e.unit_id,
creator = e.create_id,
bind_time = e.create_time != null ? e.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
})
.OrderBy((a) => a.location_code)
.ToListAsync();
// 料架
List<WmsCarryStockReport> items_LJ = await _db.Queryable<BasLocation>()
@@ -264,6 +268,8 @@ namespace Tnb.WarehouseMgr
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code) || h.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code))
.WhereIF(!string.IsNullOrEmpty(code_batch), (a, b, c, d, e, f, g) => f.code_batch.Contains(code_batch))
.WhereIF(!string.IsNullOrEmpty(container_no), (a, b, c, d, e, f, g) => g.container_no.Contains(container_no))
.Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport
{
warehouse_name = c.whname,

View File

@@ -11,6 +11,7 @@ using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using SqlSugar;
using Tnb.BasicData.Entities;
@@ -68,7 +69,8 @@ namespace Tnb.WarehouseMgr
SemaphoreSlim semaphoreSlim = null;
try
{
semaphoreSlim = _wareHouseService.GetSemaphore("outstock", input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString());
string warehouse_id = input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString();
semaphoreSlim = _wareHouseService.GetSemaphore("outstock", warehouse_id);
await semaphoreSlim.WaitAsync();
await _db.Ado.BeginTranAsync();
@@ -83,9 +85,10 @@ namespace Tnb.WarehouseMgr
OutStockStrategyQuery OutStockStrategyInput = new()
{
carrystd_id = input.data[nameof(OutStockStrategyQuery.carrystd_id)].ToString(),
warehouse_id = input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString(),
warehouse_id = warehouse_id,
Size = qty
};
List<WmsCarryH>? carrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput);
Logger.Information($"根据出库策略获取的载具数量:{carrys?.Count}");
//var carrys = await _db.Queryable<WmsCarryH>().LeftJoin<BasLocation>((a, b) => a.location_id == b.id)
@@ -253,7 +256,8 @@ namespace Tnb.WarehouseMgr
}
catch (Exception ex)
{
Logger.Information($"空载具出库错误", ex);
Logger.LogWarning($"空载具出库错误 {ex.Message}");
Logger.LogWarning($"空载具出库错误 {ex.StackTrace}");
await _db.Ado.RollbackTranAsync();
throw;
}

View File

@@ -179,57 +179,113 @@ namespace Tnb.WarehouseMgr
List<WmsCarryCode> _wmsCarryCodes = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).ToList();
await _db.Updateable<WmsCarryH>().SetColumns(r => r.carry_status == (_wmsCarryCodes.Count == 0 ? "0" : r.carry_status)).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync();
switch (carryLoc.wh_id)
await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync();
wmsMaterialSignH.warehouse_sign_id = carryLoc.wh_id;
if (_wmsCarryCodes.Count > 0)
{
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
{
await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync();
await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync();
wmsMaterialSignH.warehouse_sign_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
wmsMaterialSignH.warehouse_instock_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
try
switch (carryLoc.wh_id)
{
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
{
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_YCLCache_ID };
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations.Count == 0)
try
{
throw new AppFriendlyException("没有可以回库的库位", 500);
await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync();
wmsMaterialSignH.warehouse_instock_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_YCLCache_ID };
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations.Count == 0)
{
throw new AppFriendlyException("没有可以回库的库位", 500);
}
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = carryLoc.id;
commonCreatePretaskInput.endlocation_id = endLocations[0].id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WmsMaterialSign_ID;
Logger.LogInformation($"【MaterialSign】 开始生成原材料仓回库任务 起点{carryLoc.location_code} 终点{endLocations[0].location_code} 托盘 {wmsCarryH.carry_code}");
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db);
if (res.code != HttpStatusCode.OK)
{
throw new AppFriendlyException(res.msg, 500);
}
}
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = carryLoc.id;
commonCreatePretaskInput.endlocation_id = endLocations[0].id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WmsMaterialSign_ID;
Logger.LogInformation($"【MaterialSign】 开始生成原材料仓回库任务 起点{carryLoc.location_code} 终点{endLocations[0].location_code} 托盘 {wmsCarryH.carry_code}");
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db);
if (res.code != HttpStatusCode.OK)
catch (Exception ex)
{
throw new AppFriendlyException(res.msg, 500);
throw;
}
finally
{
_wareHouseService.s_taskExecuteSemaphore_YCLInstock.Release();
}
}
catch (Exception ex)
{
throw;
}
finally
{
_wareHouseService.s_taskExecuteSemaphore_YCLInstock.Release();
}
break;
}
break;
}
}
}
await _db.Insertable(wmsMaterialSignH).ExecuteCommandAsync();
await _db.Insertable(wmsMaterialSignDs).ExecuteCommandAsync();
#region
//switch (wmsDistaskH.biz_type)
//{
// // 原材料调拨出库
// case WmsWareHouseConst.BIZTYPE_WmsRawmatTransferoutstock_ID:
// {
// //WmsRawmatTransferoutstockD wmsRawmatTransferoutstockD = await _db.Queryable<WmsRawmatTransferoutstockD>().Where(r => r.id == wmsDistaskH.source_id).FirstAsync();
// //WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = await _db.Queryable<WmsRawmatTransferoutstockH>().Where(r => r.id == wmsRawmatTransferoutstockD.bill_id).FirstAsync();
// //WmsTransferOrderH wmsTransferOrderH = await _db.Queryable<WmsTransferOrderH>().Where(r => r.id == wmsRawmatTransferoutstockH.transfer_order_id).FirstAsync();
// break;
// }
// case WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID:
// {
// WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable<WmsMaterialTransferD>().Where(r => r.id == wmsDistaskH.source_id).FirstAsync();
// WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable<WmsMaterialTransfer>().Where(r => r.id == wmsMaterialTransferD.bill_id).FirstAsync();
// List<WmsStockReportCode> wmsStockReportCodes = new List<WmsStockReportCode>();
// foreach (var wmsMaterialSignD in wmsMaterialSignDs)
// {
// WmsStockReportCode wmsStockReportCode = new WmsStockReportCode();
// wmsStockReportCode.material_id = wmsMaterialSignD.id;
// wmsStockReportCode.material_code = wmsMaterialSignD.material_code;
// wmsStockReportCode.barcode = wmsMaterialSignD.barcode;
// wmsStockReportCode.code_batch = wmsMaterialSignD.code_batch;
// wmsStockReportCode.codeqty = wmsMaterialSignD.qty - wmsMaterialSignD.sign_qty;
// wmsStockReportCode.unit_id = wmsMaterialSignD.unit_id;
// wmsStockReportCode.create_id = _userManager?.User?.Id;
// wmsStockReportCode.create_time = DateTime.Now;
// wmsStockReportCode.warehouse_id = wmsMaterialTransfer.warehouse_instock;
// wmsStockReportCode.
// wmsStockReportCodes.Add(wmsStockReportCode);
// }
// //// todo 对接其它出库单 出库数量为签收数量
// //if (!_wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(carryLoc.id))
// //{
// // // todo 对接其它入库单 入库数量为签收数量
// //}
// break;
// }
//}
#endregion
#region bip
switch (wmsDistaskH.biz_type)
@@ -333,8 +389,8 @@ namespace Tnb.WarehouseMgr
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
thirdWebapiRecord.name = "调拨出库";
thirdWebapiRecord.method = "POST";
thirdWebapiRecord.url = config.value + "uapws/rest/transOut/save";
// thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
//thirdWebapiRecord.url = config.value + "uapws/rest/transOut/save";
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
thirdWebapiRecord.create_time = DateTime.Now;
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();

View File

@@ -108,7 +108,6 @@ namespace Tnb.WarehouseMgr
{
queryJson = JObject.Parse(input.queryJson);
}
SqlSugarPagedList<WmsMaterialTransfer> result = await _db.Queryable<WmsMaterialTransfer>()
.InnerJoin<DictionaryDataEntity>((a, b) => a.status == b.Id)
@@ -117,7 +116,7 @@ namespace Tnb.WarehouseMgr
.InnerJoin<BasWarehouse>((a, b, c, d, e) => e.id == a.warehouse_instock)
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e, f) => a.type == f.EnCode)
// 只显示未完成的单据
.Where(a => a.status != "25065149810453")
//.Where(a => a.status != "25065149810453")
.WhereIF(queryJson != null && queryJson["type"] != null, a => a.type == queryJson["type"].ToString())
.WhereIF(queryJson != null && queryJson["bill_code"] != null, a => a.bill_code.Contains(queryJson["bill_code"].ToString()))
.Select((a, b, c, d, e, f) => new WmsMaterialTransfer
@@ -195,7 +194,6 @@ namespace Tnb.WarehouseMgr
}
}
/// <summary>
/// 获取物料库存
/// </summary>
@@ -227,8 +225,7 @@ namespace Tnb.WarehouseMgr
code_batch = input.code_batch,
Size = input.palletCount,
Region_id = WmsWareHouseConst.REGION_Purchase_ID,
PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK,
AvoidBusyPassage = true
PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK
};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
@@ -337,8 +334,7 @@ namespace Tnb.WarehouseMgr
await _db.Ado.BeginTranAsync();
OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id,
code_batch = input.code_batch, Size = input.palletCount,Region_id = WmsWareHouseConst.REGION_Purchase_ID,PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK,
AvoidBusyPassage = true};
code_batch = input.code_batch, Size = input.palletCount,Region_id = WmsWareHouseConst.REGION_Purchase_ID,PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
if (items.Count == 0)
@@ -363,7 +359,7 @@ namespace Tnb.WarehouseMgr
.OrderBy("is_lock, task_nums, location_code").ToList();
}
// 中储仓三工位
else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZCC_ID)
{
// 根据三工位任务数平均分配任务 暂定
endLocations = _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
@@ -387,7 +383,7 @@ namespace Tnb.WarehouseMgr
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1GLSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync();
}
// 中储仓三工位
else if(wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
else if(wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZCC_ID)
{
// 根据三工位任务数平均分配任务 暂定
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync();
@@ -789,8 +785,10 @@ namespace Tnb.WarehouseMgr
{
semaphoreSlimOutStock = _wareHouseService.GetSemaphore("outstock", WmsWareHouseConst.WAREHOUSE_BCK_ID);
await semaphoreSlimOutStock.WaitAsync();
Logger.LogInformation($"开始执行下发到包材库1");
semaphoreSlimInStock = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_F2BCQ_ID);
await semaphoreSlimInStock.WaitAsync();
Logger.LogInformation($"开始执行下发到包材库2");
if (string.IsNullOrEmpty(input.source_id))
{
throw new AppFriendlyException("来源单据id不可为空", 500);
@@ -1129,6 +1127,7 @@ namespace Tnb.WarehouseMgr
{
await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
Logger.LogInformation($"中储仓下发到二楼暂存仓");
try
{
WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable<WmsMaterialTransfer>().Where(r => r.id == input.source_id).First();
@@ -1271,7 +1270,7 @@ namespace Tnb.WarehouseMgr
public async Task<Entities.Dto.Outputs.Result> DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input)
{
await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
Logger.LogInformation($"开始执行中储仓退料到原材料仓");
try
{
WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable<WmsMaterialTransfer>().Where(r => r.id == input.source_id).First();
@@ -1677,7 +1676,7 @@ namespace Tnb.WarehouseMgr
{
try
{
List<WmsCarryH> wmsCarryHs = _db.Queryable<WmsCarryH>().Where(r => r.work_station == input.work_station && r.is_lock == 0 && r.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID
List<WmsCarryH> wmsCarryHs = _db.Queryable<WmsCarryH>().Where(r => r.work_station == input.work_station && r.is_lock == 0
&& (r.carry_status == ((int)(EnumCarryStatus.)).ToString() || r.carry_status == ((int)(EnumCarryStatus.)).ToString())).ToList();
if (string.IsNullOrEmpty(input.work_station))
{
@@ -2102,9 +2101,9 @@ namespace Tnb.WarehouseMgr
{
throw new AppFriendlyException($"载具{input.carry_code}已锁定!", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.location_id))
if (string.IsNullOrEmpty(input.startlocation_code))
{
throw new AppFriendlyException($"载具{input.carry_code}的库位为空!", 500);
throw new AppFriendlyException($"起点库位为空!", 500);
}
if (wmsCarryH.carrystd_id != WmsWareHouseConst.CARRY_ZYXCSTD_ID && wmsCarryH.carrystd_id != WmsWareHouseConst.CARRY_ZYLJSTD_ID)
@@ -2139,7 +2138,7 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException($@"没有可以入库的库位", 500);
}
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.location_code == input.startlocation_code).FirstAsync();
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = startLocation.id;

View File

@@ -120,11 +120,12 @@ namespace Tnb.WarehouseMgr
}
if (input.data.ContainsKey(nameof(WmsTransfer.endlocation_id)))
{
ePoint = await _db!.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.data[nameof(WmsTransfer.endlocation_id)].ToString());
ePoint = await _db!.Queryable<WmsPointH>().FirstAsync(it => it.location_code == input.data[nameof(WmsTransfer.endlocation_id)].ToString());
}
if (sPoint != null && ePoint != null)
{
Logger.LogError($"【PDADelivery】起点 {sPoint.point_code} 终点 {ePoint.point_code}");
List<WmsPointH> points = new List<WmsPointH>();
if (sPoint.area_code != ePoint.area_code)
{
@@ -198,10 +199,17 @@ namespace Tnb.WarehouseMgr
_ = await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
}
}
else
{
throw new AppFriendlyException($"【PDADelivery】生成预任务失败", 500);
}
}
}
else
{
throw new AppFriendlyException($"【PDADelivery】点位不存在", 500);
}
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)

View File

@@ -226,8 +226,8 @@ namespace Tnb.WarehouseMgr
}
catch (Exception ex)
{
Log.Error("PDA空载具出库错误", ex.Message);
Log.Error("PDA空载具出库错误", ex.StackTrace);
Logger.Error("PDA空载具出库错误", ex.Message);
Logger.Error("PDA空载具出库错误", ex.StackTrace);
await _db.Ado.RollbackTranAsync();
throw;
}

View File

@@ -274,7 +274,6 @@ namespace Tnb.WarehouseMgr
commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
commonCreatePretaskInput2.require_id = wmsPrdInstockD.id;
commonCreatePretaskInput2.isChangeCarryLoc2StartLoc = false;
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
if (res2.code != HttpStatusCode.OK)

View File

@@ -116,7 +116,7 @@ namespace Tnb.WarehouseMgr
string wmsPurchaseOrderHId = wmsPurchaseH?.erp_bill_code ?? "";
WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable<WmsPurchaseOrderH>().SingleAsync(x => x.id == wmsPurchaseOrderHId);
WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable<WmsPurchaseOrderD>().FirstAsync(x => x.fk_wms_purchase_order_id == wmsPurchaseOrderHId);
BasWarehouse basWarehouse = await _db.Queryable<BasWarehouse>().SingleAsync(x=>x.id==instock.warehouse_id);
//BasWarehouse basWarehouse = await _db.Queryable<BasWarehouse>().SingleAsync(x=>x.id==instock.warehouse_id);
List<String> materialIds = allInstockDetails.Select(x => x.material_id).Distinct().ToList();
List<String> unitCodes = allInstockDetails.Select(x => x.unit_id).Distinct().ToList();
@@ -134,7 +134,7 @@ namespace Tnb.WarehouseMgr
tableIds.Add(_userManager.UserId);
tableIds.Add(wmsPurchaseH.create_id);
tableIds.Add(WmsWareHouseConst.AdministratorOrgId);
tableIds.Add(instock.warehouse_id);
tableIds.Add(instock.warehouse_id);// 1001A11000000002OOGU
tableIds.AddRange(materialIds);
tableIds.Add(supplierId);
tableIds.Add(tranTypeId);
@@ -178,7 +178,8 @@ namespace Tnb.WarehouseMgr
["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id)?.Id ?? ""))?.cunitid ?? "",
["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "",
// ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "",
//["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "",
["cbodywarehouseid"] = "1001A11000000002OOGU",
["cgeneralbid"] = null,
["cgeneralhid"] = null,
["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "",
@@ -193,7 +194,7 @@ namespace Tnb.WarehouseMgr
["nnum"] = item.qty,
["nshouldnum"] = item.pr_qty,
// ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
["pk_creqwareid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "",
["pk_creqwareid"] = "1001A11000000002OOGU",
["pk_group"] = erpOrg.pk_group,
["pk_org"] = erpOrg.pk_org,
["pk_org_v"] = erpOrg.pk_org_v,

View File

@@ -74,21 +74,22 @@ namespace Tnb.WarehouseMgr
}
Logger.Information($"进入原材料调拨入库单上传BIP逻辑");
List<WmsCarryCode> wmsCarryCodes = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == input.carryIds[0]).ToListAsync();
WmsTempCode wmsTempCode = await _db.Queryable<WmsCarryCode>()
.LeftJoin<WmsTempCode>((a, b) => a.barcode == b.barcode)
.Where((a, b) => a.carry_id == input.wmsDistaskH.carry_id)
.Select((a, b) => b)
.FirstAsync();
string rawmatTransferinstockDId = wmsTempCode?.require_id ?? "";
WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable<WmsRawmatTransferinstockD>().SingleAsync(x => x.id == rawmatTransferinstockDId);
List<WmsCarryCode> wmsCarryCodes = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == input.carryIds[0])
.Where(r => r.material_id == wmsRawmatTransferinstockD.matcode_id && r.code_batch == wmsRawmatTransferinstockD.code_batch).ToListAsync();
await _db.Updateable<WmsRawmatTransferinstockD>().SetColumns(it => new WmsRawmatTransferinstockD { actual_qty = it.actual_qty + wmsCarryCodes.Sum(r => r.codeqty) })
.Where(it => it.id == input.wmsDistaskH.source_id).ExecuteCommandHasChangeAsync();
WmsInstockH instock = await _db.Queryable<WmsInstockH>().SingleAsync(x => x.id == input.requireId);
List<WmsInstockD> allInstockDetails = await _db.Queryable<WmsInstockD>().Where(it => it.bill_id == input.requireId).ToListAsync();
WmsTempCode wmsTempCode = await _db.Queryable<WmsCarryCode>()
.LeftJoin<WmsTempCode>((a, b) => a.barcode == b.barcode)
.Where((a, b) => a.carry_id == input.wmsDistaskH.carry_id)
.Select((a, b) => b)
.FirstAsync();
string rawmatTransferinstockDId = wmsTempCode?.require_id ?? "";
WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable<WmsRawmatTransferinstockD>().SingleAsync(x => x.id == rawmatTransferinstockDId);
string rawmatTransferinstockHId = wmsRawmatTransferinstockD?.bill_id ?? "";
WmsRawmatTransferinstockH wmsRawmatTransferinstockH = await _db.Queryable<WmsRawmatTransferinstockH>().SingleAsync(x => x.id == rawmatTransferinstockHId);
@@ -116,7 +117,9 @@ namespace Tnb.WarehouseMgr
tableIds.AddRange(unitDatas.Select(x => x.Id).ToList());
List<ErpExtendField> erpExtendFields = await _db.Queryable<ErpExtendField>().Where(x => tableIds.Contains(x.table_id)).ToListAsync();
string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? "";
// 暂时传 1001A110000000003NBJ 陈书会
//string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? "";
string erpCreateId = "1001A110000000003NBJ";
ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId));
string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
@@ -144,8 +147,9 @@ namespace Tnb.WarehouseMgr
erpRequestData.Add("ctrantypeid", "0001H11000000000D31E");//先写死
erpRequestData.Add("vtrantypecode", "4E-01");//先写死
erpRequestData.Add("csourcebillhid", wmsRawmatTransferinstockH?.erp_pk ?? "");
decimal qty = wmsCarryCodes.Sum(r => r.codeqty);
List<Dictionary<string, object>> erpRequestDataDetails = new List<Dictionary<string, object>>();
foreach (WmsInstockD item in allInstockDetails)
{
@@ -169,8 +173,8 @@ namespace Tnb.WarehouseMgr
["dplanoutdate"] = instock.create_time.ToString("yyyy-MM-dd HH:mm:ss"),
// ["nnum"] = item.qty,
// ["nshouldnum"] = item.pr_qty,
["nnum"] = wmsRawmatTransferinstockD.actual_qty,
["nshouldnum"] = wmsRawmatTransferinstockD.actual_qty,
["nnum"] = qty,
["nshouldnum"] = qty,
["pk_group"] = erpOrg.pk_group,
["pk_org"] = erpOrg.pk_org,
["pk_org_v"] = erpOrg.pk_org_v,

View File

@@ -165,7 +165,7 @@ namespace Tnb.WarehouseMgr
WmsSaleD wmsOutstockD = await _db.Queryable<WmsSaleD>().FirstAsync(it => it.id == input.source_id);
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.code_batch, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID };
OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.code_batch, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, dbConn = _db };
List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>> items = await _wareHouseService.OutStockStrategy_saleRelease(outStockStrategyInput);
decimal canOutstockQty = items.Sum(r => r.Item3.codeqty).ParseToDecimal();
@@ -200,7 +200,7 @@ namespace Tnb.WarehouseMgr
//人工发货
else
{
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = items_pretask.Count, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID };
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = items_pretask.Count, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID, dbConn = _db };
endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations.Count < items_pretask.Count)
@@ -244,11 +244,15 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException($"载具{carry.carry_code}无法选到缓存区库位,请检查电梯缓存分区配置表", 500);
}
#endregion
if (endLocation == null)
{
throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500);
}
}
//人工发货
else
{
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = 1, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID };
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = 1, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID, dbConn = _db };
endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations.Count < 1)
@@ -257,10 +261,6 @@ namespace Tnb.WarehouseMgr
}
endLocation = endLocations[0];
}
if (endLocation == null)
{
throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500);
}
WmsPointH sPoint = null!;
WmsPointH ePoint = null!;
@@ -366,8 +366,7 @@ namespace Tnb.WarehouseMgr
//所有库位加锁
string?[] ids = new[] { startLocation.id, preTasks[0].endlocation_id, endLocationId };
_ = await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
int row = await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
}
}
}

View File

@@ -192,8 +192,8 @@ namespace Tnb.WarehouseMgr
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
thirdWebapiRecord.name = "转库单";
thirdWebapiRecord.method = "POST";
thirdWebapiRecord.url = config.value + "uapws/rest/whstrans/save";
// thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
//thirdWebapiRecord.url = config.value + "uapws/rest/whstrans/save";
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData);
thirdWebapiRecord.create_time = DateTime.Now;
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();

View File

@@ -96,7 +96,7 @@ namespace Tnb.WarehouseMgr
WmsTransferOutstockD wmsOutstockD = await _db.Queryable<WmsTransferOutstockD>().FirstAsync(it => it.id == input.source_id);
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.pi_code, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID };
OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.pi_code, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, dbConn = _db };
List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>> items = await _wareHouseService.OutStockStrategy_saleRelease(outStockStrategyInput);
decimal canOutstockQty = items.Sum(r => r.Item3.codeqty).ParseToDecimal();

View File

@@ -1657,6 +1657,10 @@ public class FormDataParsing : ITransient
case JnpfKeyConst.POPUPTABLESELECT:
case JnpfKeyConst.POPUPSELECT:
{
//if (model.relationField == model.showField)
//{
// break;
//}
// 获取远端数据
var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId);
if (dynamic == null) break;