完善日志 bug处理

This commit is contained in:
2024-06-21 15:14:30 +08:00
parent c9ad81052e
commit 0095ebec24
40 changed files with 470 additions and 254 deletions

View File

@@ -94,7 +94,7 @@
/// </summary>
public const string PRETASK_BILL_STATUS_COMPLE_ID = "26126838773285";
/// <summary>
/// 预任务单据状态-已完成Id
/// 预任务单据状态-已取消Id
/// </summary>
public const string PRETASK_BILL_STATUS_CANCEL_ID = "26126842129701";
@@ -341,7 +341,11 @@
/// <summary>
/// 一楼供料三工位库位
/// </summary>
public const string Floor1GLSGWOutstockStation4 = "30773146852480";
public const string Floor1GLSGWOutstockStation4 = "30773146852481";
/// <summary>
/// 一楼供料三工位库位
/// </summary>
public const string Floor1GLSGWOutstockStation5 = "34863907485461";
/// <summary>
/// todo 一楼外协三工位库位
/// </summary>

View File

@@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Dtos.VisualDev;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
{
@@ -21,9 +22,13 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
public string biz_type { get; set; }
public string task_type { get; set; }
/// <summary>
/// 来源业务单据id
/// </summary>
public string require_id { get; set; }
/// <summary>
/// 来源业务单据code
/// </summary>
public string require_code { get; set; }
public string moduleConsts { get; set; }
@@ -43,6 +48,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
/// </summary>
public bool isChangeCarryLoc2StartLoc { get; set; } = true;
}
}
}

View File

@@ -185,5 +185,9 @@ public partial class WmsPretaskH : BaseEntity<string>
/// 任务属性
/// </summary>
public string chain_type { get; set; } = "3";
/// <summary>
/// 备注
/// </summary>
public string note { get; set; }
}

View File

@@ -1,6 +1,7 @@
using System.Linq.Expressions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Dto;
@@ -32,6 +33,14 @@ namespace Tnb.WarehouseMgr.Interfaces
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
Task<List<WmsCarryH>> OutStockStrategyYCL([FromQuery] OutStockStrategyQuery input);
/// <summary>
/// 中储仓到二楼出库策略
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
Task<List<WmsCarryH>> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyQuery input);
/// <summary>
/// 出库策略-销售出库下发
/// </summary>
@@ -72,13 +81,13 @@ namespace Tnb.WarehouseMgr.Interfaces
/// </summary>
/// <param name="preTasks"></param>
/// <returns></returns>
Task<bool> GenPreTask(List<WmsPretaskH> preTasks, List<WmsPretaskCode> preTaskCodes);
Task<bool> GenPreTask(List<WmsPretaskH> preTasks, List<WmsPretaskCode> preTaskCodes, ISqlSugarClient dbConn = null);
/// <summary>
/// 生成预任务成功后操作
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task GenInStockTaskHandleAfter(GenPreTaskUpInput input, Expression<Func<WmsCarryH, WmsCarryH>> setCarryColumnsExp, Expression<Func<BasLocation, BasLocation>> setLocaionColumbExp);
Task GenInStockTaskHandleAfter(GenPreTaskUpInput input, Expression<Func<WmsCarryH, WmsCarryH>> setCarryColumnsExp, Expression<Func<BasLocation, BasLocation>> setLocaionColumbExp, ISqlSugarClient dbConn = null);
/// <summary>
/// 生成任务执行
/// </summary>
@@ -132,7 +141,7 @@ namespace Tnb.WarehouseMgr.Interfaces
/// <param name="input"></param>
/// <returns></returns>
[HttpPost, NonUnify, AllowAnonymous]
Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> CommonCreatePretask(CommonCreatePretaskInput input);
Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> CommonCreatePretask(CommonCreatePretaskInput input, ISqlSugarClient db = null);
}
}

View File

@@ -50,8 +50,8 @@ namespace Tnb.WarehouseMgr
protected IEventPublisher? EventPublisher { set; get; }
protected string _LoggerFileName = "";
protected ILogger _Logger;
protected static string _LoggerFileName = "";
protected static ILogger _Logger;
protected ILogger Logger
{
get

View File

@@ -1,4 +1,5 @@
using Aliyun.OSS;
using System.Drawing.Drawing2D;
using Aliyun.OSS;
using Aop.Api.Domain;
using JNPF;
using JNPF.Common.Core.Manager;
@@ -15,6 +16,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Org.BouncyCastle.Crypto.Agreement;
using Senparc.CO2NET.Cache;
using SqlSugar;
using Tnb.Common.Extension;
@@ -148,7 +150,7 @@ 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>()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}");
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.end_floor);
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
@@ -162,10 +164,12 @@ namespace Tnb.WarehouseMgr
}
if (curFloor != floorNo)
{
Logger.Information($"【LoadConfirm】 电梯还未开门请重试curFloor != floorNo");
return await ToApiResult(HttpStatusCode.InternalServerError, "【LoadConfirm】 电梯还未开门,请重试!");
}
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus. && floorNo == curFloor) //判断电梯楼层与当前放货在同一楼层在允许放货
{
Logger.Information($"【LoadConfirm】 发送电梯{devName}前门开门指令");
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
}
//if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
@@ -177,6 +181,7 @@ namespace Tnb.WarehouseMgr
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.
&& doorStatus == (int)EnumDoorStatus.)
{
Logger.Information($"【LoadConfirm】 {devName}取货成功");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
}
@@ -329,13 +334,14 @@ namespace Tnb.WarehouseMgr
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
if (doorStatus != (int)EnumDoorStatus. && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus. && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
{
Logger.Information($"【UnloadConfirm】 发送电梯{devName}前门开门指令");
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
}
if (sysStatus == (int)EnumSysStatus. && runStatus == (int)EnumRunStatus.
&& doorStatus == (int)EnumDoorStatus. && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.)
{
Logger.Information($"【UnloadConfirm】 成功 {devName} 变更为占用");
Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用");
await _db.Updateable<WmsElevatorH>().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.;
return await ToApiResult(HttpStatusCode.OK, "成功");
@@ -389,9 +395,72 @@ namespace Tnb.WarehouseMgr
await _wareHouseService.TaskExecute(taskExecuteUpInput);
}
break;
case "CANCELLED": break;
case "CANCELLED":
{
Logger.Information("开始处理WCS上传的取消任务");
int row = await _db.Updateable<WmsDistaskH>().SetColumns(r => new WmsDistaskH
{
agreement = "WCS上传取消(CANCELLED)信号 取消时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
status = WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID
}).Where(P => P.bill_code.Contains(input.taskChainCode)).ExecuteCommandAsync();
if (row > 0)
{
List<WmsDistaskH> wmsDistaskHs = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code.Contains(input.taskChainCode)).ToList();
List<string> wmsDistaskHCodes = wmsDistaskHs.Select(r => r.pretask_code).ToList();
foreach (WmsDistaskH wmsDistaskH in wmsDistaskHs)
{
if (wmsDistaskH.startlocation_code.Contains("DT") || wmsDistaskH.endlocation_code.Contains("DT"))
{
WmsElevatorUnlockInput wmsElevatorUnlockInput = new ();
wmsElevatorUnlockInput.elevator_id = wmsDistaskH.device_id;
await WmsElevatorUnlock(wmsElevatorUnlockInput);
Logger.Information($"WCS取消任务{wmsDistaskH.bill_code},自动解占用电梯{wmsDistaskH.device_id}");
}
}
await _db.Updateable<WmsPretaskH>().SetColumns(r => new WmsPretaskH
{
note = "WCS上传取消(CANCELLED)信号 取消时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
status = WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
}).Where(P => wmsDistaskHCodes.Contains(P.bill_code)).ExecuteCommandAsync();
Logger.Information("成功处理WCS上传的取消任务");
}
else
{
Logger.Information("未处理WCS上传的取消任务");
}
break;
}
case "SUCCEED": break;
case "FAILURE": break;
case "FAILURE":
{
Logger.Information("开始处理WCS上传的失败任务");
int row = await _db.Updateable<WmsDistaskH>().SetColumns(r => new WmsDistaskH
{
agreement = "WCS上传失败(FAILURE)信号 失败时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
status = WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID
}).Where(P => P.bill_code.Contains(input.taskChainCode)).ExecuteCommandAsync();
if (row > 0)
{
List<string> wmsDistaskHCodes = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code.Contains(input.taskChainCode)).Select(r => r.pretask_code).ToList();
await _db.Updateable<WmsPretaskH>().SetColumns(r => new WmsPretaskH
{
note = "WCS上传失败(FAILURE)信号 取消时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
status = WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID
}).Where(P => wmsDistaskHCodes.Contains(P.bill_code)).ExecuteCommandAsync();
Logger.Information("成功处理WCS上传的失败任务");
}
else
{
Logger.Information("未处理WCS上传的失败任务");
}
break;
}
case "FINISHED":
break;

View File

@@ -5,7 +5,9 @@ using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto.ErpInputs;
using Tnb.WarehouseMgr.Entities.Entity;
namespace Tnb.WarehouseMgr
{
@@ -278,5 +280,59 @@ namespace Tnb.WarehouseMgr
await db.Insertable(WmsInstockH).ExecuteCommandAsync();
await db.Insertable(WmsInstockDs).ExecuteCommandAsync();
}
/// <summary>
/// 转库单
/// </summary>
public async Task MaterialTransfer(MaterialTransferInput input)
{
var db = _repository.AsSugarClient();
WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer();
string Code = await _billRuleService.GetBillNumber("MaterialTransfer");
wmsMaterialTransfer.bill_code = Code;
wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
wmsMaterialTransfer.bill_date = input.bill_date;
wmsMaterialTransfer.warehouse_outstock = input.warehouse_outstock;
wmsMaterialTransfer.warehouse_instock = input.warehouse_instock;
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 = "";
wmsMaterialTransfer.create_time = DateTime.Now;
wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId;
await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = new List<WmsMaterialTransferD>();
foreach (var detail in input.details)
{
WmsMaterialTransferD wmsMaterialTransferD = new WmsMaterialTransferD();
wmsMaterialTransferD.lineno = detail.lineno;
wmsMaterialTransferD.material_code = detail.material_code;
wmsMaterialTransferD.material_specification = detail.material_specification;
wmsMaterialTransferD.unit_code = detail.unit_code;
wmsMaterialTransferD.code_batch = detail.code_batch;
wmsMaterialTransferD.station_code = detail.station_code;
wmsMaterialTransferD.qty = detail.qty;
wmsMaterialTransferD.bill_id = "";
wmsMaterialTransferD.material_specification = detail.material_ex;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
//wmsPurchased.material_id = material.id;
//// wmsPurchased.material_name = material.name;
//wmsPurchased.unit_id = material.unit_id;
}
wmsMaterialTransferDs.Add(wmsMaterialTransferD);
}
await db.Insertable(wmsMaterialTransferDs).ExecuteCommandAsync();
}
}
}

View File

@@ -77,6 +77,7 @@ namespace Tnb.WarehouseMgr
public static SemaphoreSlim s_floor2CreatePretask = new(1);
public SemaphoreSlim s_taskCommonCreatePretask = new(1);
public SemaphoreSlim s_taskGenPreTask = new(1);
public Func<string, int, Task> AddUnExecuteTask { get; set; }
@@ -248,8 +249,8 @@ namespace Tnb.WarehouseMgr
/// <returns></returns>
public string[] GetFloor1GLSGWOutstockLocation()
{
return new string[4] { WmsWareHouseConst.Floor1GLSGWOutstockStation1 , WmsWareHouseConst.Floor1GLSGWOutstockStation2
, WmsWareHouseConst.Floor1GLSGWOutstockStation3, WmsWareHouseConst.Floor1GLSGWOutstockStation4 };
return new string[5] { WmsWareHouseConst.Floor1GLSGWOutstockStation1 , WmsWareHouseConst.Floor1GLSGWOutstockStation2
, WmsWareHouseConst.Floor1GLSGWOutstockStation3, WmsWareHouseConst.Floor1GLSGWOutstockStation4, WmsWareHouseConst.Floor1GLSGWOutstockStation5 };
}
/// <summary>
@@ -409,6 +410,51 @@ namespace Tnb.WarehouseMgr
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}
/// <summary>
/// 1->2出库策略
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
public async Task<List<WmsCarryH>> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyQuery input)
{
Expressionable<WmsCarryH, WmsCarryCode, BasLocation> whereExprable = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
.And((a, b, c) => a.is_lock == 0 && c.is_lock == 0)
.And((a, b, c) => !string.IsNullOrEmpty(a.location_id))
.And((a, b, c) => c.is_type == ((int)EnumLocationType.).ToString())
.And((a, b, c) => a.out_status == "0")
.And((a, b, c) => c.wh_id == input.warehouse_id)
.AndIF(!string.IsNullOrEmpty(input.material_id), (a, b, c) => b.material_id == input.material_id)
.AndIF(!string.IsNullOrEmpty(input.code_batch), (a, b, c) => b.code_batch == input.code_batch)
.AndIF(!string.IsNullOrEmpty(input.material_specification), (a, b, c) => b.material_specification == input.material_specification)
.AndIF(!string.IsNullOrEmpty(input.container_no), (a, b, c) => b.container_no == input.container_no)
.AndIF(!string.IsNullOrEmpty(input.carrystd_id), (a, b, c) => a.carrystd_id == input.carrystd_id);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> carryStatusFilterExp = !input.material_id.IsNullOrWhiteSpace()
? (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString()
: (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString();
_ = whereExprable.And(carryStatusFilterExp);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> whereExpr = whereExprable.ToExpression();
SqlSugarClient cyDb = _db.CopyNew();
WmsInstockPolicies policy = await cyDb.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用策略", 500);
}
List<WmsCarryH> items = await cyDb.Queryable<WmsCarryH>().LeftJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
.LeftJoin<BasLocation>((a, b, c) => a.location_id == c.id)
.Where(whereExpr)
//.OrderByIF((a,b,c)=>SqlFunc.IsNullOrEmpty())
.OrderBy(policy.policy)
.Select<WmsCarryH>()
.ToListAsync();
items = items.Distinct().ToList();
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}
/// <summary>
/// 判断CTU是否可以放货
/// </summary>
@@ -733,14 +779,13 @@ namespace Tnb.WarehouseMgr
{
await _db.Ado.BeginTranAsync();
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】收到到货完成信号 传入参数: {disTask.bill_code} {action}");
SqlSugarClient db = _db.CopyNew();
if (action == "UNLOAD")
{
// 去料架区放货
if (rackAreaPointsUp.Contains(disTask.endlocation_code) || rackAreaPointsDown.Contains(disTask.endlocation_code))
{
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>().Where(r => r.location_code == disTask.endlocation_code);
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = _db.Queryable<WmsMechanicalArmH>().Where(r => r.location_code == disTask.endlocation_code);
if (WmsMechanicalArmHs.Count() == 0)
{
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配");
@@ -749,7 +794,7 @@ namespace Tnb.WarehouseMgr
WmsMechanicalArmH target = WmsMechanicalArmHs.First();
// 回写料架和AGV确认
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
await _db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
{
agvconfirm = 1,
rackid = disTask.carry_id,
@@ -760,7 +805,7 @@ namespace Tnb.WarehouseMgr
// 下升降机写满托数量和送到信号
if (rackAreaPointsDown.Contains(disTask.endlocation_code))
{
int LXCount = db.Queryable<WmsCarryD>().Where(a => a.carry_id == disTask.carry_id).Count();
int LXCount = _db.Queryable<WmsCarryD>().Where(a => a.carry_id == disTask.carry_id).Count();
bool result = await Floor2UpDownMachinecode_SetTag($"下升降机满托{target.stackingposition}数量", LXCount.ToString());
Logger.LogInformation($@"【送满托到下升降区】设定下升降机满托{target.stackingposition}满托数量为 {LXCount} 结果为 {result}");
@@ -778,7 +823,7 @@ namespace Tnb.WarehouseMgr
}
// 绑定料架
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
await _db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
{
mechanicalconfirm = 1,
maxnum = LXCount
@@ -800,7 +845,7 @@ namespace Tnb.WarehouseMgr
else // 去暂存仓放货
{
// 回写料架料箱绑定表的库位
ISugarQueryable<WmsCarryCode> WmsCarryCodes = db.Queryable<WmsCarryCode>()
ISugarQueryable<WmsCarryCode> WmsCarryCodes = _db.Queryable<WmsCarryCode>()
.InnerJoin<WmsCarryD>((a, b) => b.membercarry_id == a.carry_id)
.Where((a, b) => b.carry_id == disTask.carry_id);
var WmsCarryCodeList = WmsCarryCodes.ToList();
@@ -809,7 +854,7 @@ namespace Tnb.WarehouseMgr
r.location_id = disTask.endlocation_id;
r.location_code = disTask.endlocation_code;
});
await db.Updateable(WmsCarryCodeList).ExecuteCommandAsync();
await _db.Updateable(WmsCarryCodeList).ExecuteCommandAsync();
}
}
else
@@ -822,7 +867,7 @@ namespace Tnb.WarehouseMgr
}
else // 去料架区取货
{
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>().Where(r => r.location_code == disTask.startlocation_code);
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = _db.Queryable<WmsMechanicalArmH>().Where(r => r.location_code == disTask.startlocation_code);
if (WmsMechanicalArmHs.Count() == 0)
{
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行起点{disTask.endpoint_code} 与料架区的点位不匹配");
@@ -843,7 +888,7 @@ namespace Tnb.WarehouseMgr
// todo erp工位字段取数位置未确定
string targetWorkstation = "003-01-01-01";
Logger.LogInformation($@"【上升降机】更新料架 {target.rackcode} 在二楼配送的目标工位 {targetWorkstation}");
await db.Updateable<WmsCarryH>().SetColumns(r => new WmsCarryH
await _db.Updateable<WmsCarryH>().SetColumns(r => new WmsCarryH
{
work_station = targetWorkstation
}).Where(r => r.id == target.rackid).ExecuteCommandAsync();
@@ -859,7 +904,7 @@ namespace Tnb.WarehouseMgr
}
// 重置料架区
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
await _db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
{
stackingcount = 0,
barcodes = "",
@@ -1185,7 +1230,7 @@ namespace Tnb.WarehouseMgr
}
catch (Exception ex)
{
Logger.Error("【GenTaskExecute】生成预任务执行时出现错误", ex);
Logger.Error("【GenTaskExecute】任务执行时出现错误", ex);
Logger.Error(ex.StackTrace!);
await db.Ado.RollbackTranAsync();
throw;
@@ -1195,7 +1240,7 @@ namespace Tnb.WarehouseMgr
_ = s_taskExecuteSemaphore.Release();
agvCts.Dispose();
sw.Stop();
Logger.Error($"【GenTaskExecute】 任务执行耗时{sw.ElapsedMilliseconds}毫秒");
Logger.Information($"【GenTaskExecute】 任务执行耗时{sw.ElapsedMilliseconds}毫秒");
}
}
@@ -1716,12 +1761,14 @@ namespace Tnb.WarehouseMgr
int floor = await GetRealFloor(disTask.end_floor);
Logger.Information($"目标楼层:{floor}");
//发送到目标楼的指令
dynamic reuslt = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor);
//电梯任务手动执行任务状态上报
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
tuple = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
Logger.Information($"目标楼层:{floor} 当前楼层:{tuple.floorNo}");
Logger.Information($"开始呼梯 {devName}到{floor}");
//发送到目标楼的指令
dynamic reuslt = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor);
do
{
@@ -1800,10 +1847,18 @@ namespace Tnb.WarehouseMgr
{
var typeflag = false;
var dis = disTasks.Where(p => p.groups == k).First();
if (kiva.Contains(dis.startlocation_code) || kiva.Contains(dis.endlocation_code) || floor2.Contains(dis.startlocation_code) || floor2.Contains(dis.endlocation_code))
if (kiva.Contains(dis.startlocation_code) || kiva.Contains(dis.endlocation_code)
|| floor2.Contains(dis.startlocation_code) || floor2.Contains(dis.endlocation_code))
{
typeflag = true;
}
// 如果管理区是E二楼暂存仓和二楼缓存仓 统一发KIVA
if (dis.area_code == "E")
{
typeflag = true;
}
dynamic reqBody = new ExpandoObject();
reqBody.taskChainCode = k;
reqBody.type = typeflag ? (int)EnumTaskChainType.KIVA : (int)EnumTaskChainType.AGV;
@@ -1907,11 +1962,14 @@ namespace Tnb.WarehouseMgr
{
try
{
Logger.Information($"【TaskComplate】 开始执行TaskComplate");
await _db.Ado.BeginTranAsync();
//更新任务执行表,单据状态为 完成
_ = await _db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID, act_end_date = DateTime.Now }).Where(it => input.disTaskIds.Contains(it.id)).ExecuteCommandAsync();
List<WmsDistaskH> disTasks = await _db.Queryable<WmsDistaskH>().InnerJoin<WmsCarryH>((a, b) => a.carry_id == b.id).Where(a => input.disTaskIds.Contains(a.id)).Select((a, b) => new WmsDistaskH { carry_status = b.carry_status }, true).ToListAsync();
Logger.Information($"【TaskComplate】 disTasks 值 {JsonConvert.SerializeObject(disTasks)}");
if (disTasks?.Count > 0)
{
// 更新预任务申请表,单据状态为 已完成
@@ -1933,6 +1991,8 @@ namespace Tnb.WarehouseMgr
List<WmsCarryH> carryIts = new();
List<WmsCarryCode> carryCodeIts = new();
List<BasLocation> locIts = new();
Logger.Information($"【TaskComplate】 multiList 值 {JsonConvert.SerializeObject(multiList)}");
for (int i = 0, cnt = multiList.Count; i < cnt; i++)
{
WmsCarryH carry = new()
@@ -1972,6 +2032,7 @@ namespace Tnb.WarehouseMgr
}
_ = await _db.Updateable(carryIts).UpdateColumns(it => new { it.is_lock, it.location_id, it.location_code }).ExecuteCommandAsync();
Logger.Information($"【TaskComplate】 更新载具 {JsonConvert.SerializeObject(carryIts)}");
//更新条码的库位和仓库信息
_ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
//更新库位信息,使用状态为 使用,锁定状态为未锁定
@@ -2078,88 +2139,110 @@ namespace Tnb.WarehouseMgr
/// <param name="preTasks">预任务集合</param>
/// <param name="preTaskCodes">预任务编码集合</param>
/// <returns></returns>
public async Task<bool> GenPreTask(List<WmsPretaskH> preTasks, List<WmsPretaskCode> preTaskCodes)
public async Task<bool> GenPreTask(List<WmsPretaskH> preTasks, List<WmsPretaskCode> preTaskCodes, ISqlSugarClient dbConn = null)
{
//如果预任务出现起终库位相同,则删除对应预任务
//modifiy by ly on 20230922 将当前预任务操作者设为四场管理员
preTasks.ForEach(pt =>
try
{
pt.org_id = WmsWareHouseConst.AdministratorOrgId;
pt.create_id = WmsWareHouseConst.AdministratorUserId;
});
if (preTasks.FindAll(it => it.startlocation_id == it.endlocation_id)?.Count > 0)
{
_ = preTasks.RemoveAll(it => it.startlocation_id == it.endlocation_id);
}
List<IGrouping<string, WmsPretaskH>> grpList = preTasks.OrderBy(o => o.bill_code).GroupBy(g => g.carry_id).ToList();
if (grpList?.Count > 0)
{
foreach (IGrouping<string, WmsPretaskH>? grp in grpList)
await s_taskGenPreTask.WaitAsync();
var db = _db;
if (dbConn != null)
db = dbConn;
//如果预任务出现起终库位相同,则删除对应预任务
//modifiy by ly on 20230922 将当前预任务操作者设为四场管理员
preTasks.ForEach(pt =>
{
WmsPretaskH[] arr = grp.ToArray();
if (arr.Length > 1)
pt.org_id = WmsWareHouseConst.AdministratorOrgId;
pt.create_id = WmsWareHouseConst.AdministratorUserId;
});
if (preTasks.FindAll(it => it.startlocation_id == it.endlocation_id)?.Count > 0)
{
_ = preTasks.RemoveAll(it => it.startlocation_id == it.endlocation_id);
}
List<IGrouping<string, WmsPretaskH>> grpList = preTasks.OrderBy(o => o.bill_code).GroupBy(g => g.carry_id).ToList();
if (grpList?.Count > 0)
{
foreach (IGrouping<string, WmsPretaskH>? grp in grpList)
{
WmsPretaskH[] subArr = arr[..^1];
System.Array.ForEach(subArr, a => a.chain_type = "1");
WmsPretaskH[] arr = grp.ToArray();
if (arr.Length > 1)
{
WmsPretaskH[] subArr = arr[..^1];
System.Array.ForEach(subArr, a => a.chain_type = "1");
}
}
}
}
int row = await _db.Insertable(preTasks).ExecuteCommandAsync();
if (preTaskCodes?.Count > 0)
{
row = await _db.Insertable(preTaskCodes).ExecuteCommandAsync();
}
var eleP = preTasks.Find(x => x.area_code.Contains("ELE"));
if (eleP != null)
{
row = await _db.Updateable<WmsElevatorH>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => it.area_code == eleP.area_code).ExecuteCommandAsync();
}
int row = await db.Insertable(preTasks).ExecuteCommandAsync();
if (preTaskCodes?.Count > 0)
{
row = await db.Insertable(preTaskCodes).ExecuteCommandAsync();
}
var eleP = preTasks.Find(x => x.area_code.Contains("ELE"));
if (eleP != null)
{
row = await db.Updateable<WmsElevatorH>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => it.area_code == eleP.area_code).ExecuteCommandAsync();
}
// 累加终点库位任务数
row = await _db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1)
.Where(it => preTasks.Select(r => r.endlocation_id).Contains(it.id)).ExecuteCommandAsync();
// 累加终点库位任务数
row = await db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1)
.Where(it => preTasks.Select(r => r.endlocation_id).Contains(it.id)).ExecuteCommandAsync();
return row > 0;
return row > 0;
}
catch (Exception ex)
{
throw;
}
finally
{
s_taskGenPreTask.Release();
}
}
/// <summary>
/// 生成预任务后续处理
/// </summary>
/// <returns></returns>
[NonAction]
public async Task GenInStockTaskHandleAfter(GenPreTaskUpInput input, Expression<Func<WmsCarryH, WmsCarryH>> setCarryColumnsExp, Expression<Func<BasLocation, BasLocation>> setLocaionColumbExp)
public async Task GenInStockTaskHandleAfter(GenPreTaskUpInput input, Expression<Func<WmsCarryH, WmsCarryH>> setCarryColumnsExp, Expression<Func<BasLocation, BasLocation>> setLocaionColumbExp, ISqlSugarClient dbConn = null)
{
try
{
await _db.Ado.BeginTranAsync();
var db = _db;
if (dbConn != null)
db = dbConn;
//根据生成的预任务,插入预任务操作记录
if (input.PreTaskRecord != null)
{
_ = await _db.Insertable(input.PreTaskRecord).ExecuteCommandAsync();
_ = await db.Insertable(input.PreTaskRecord).ExecuteCommandAsync();
}
if (input.PreTaskHandleCodes.Count > 0)
{
_ = await _db.Insertable(input.PreTaskHandleCodes).ExecuteCommandAsync();
_ = await db.Insertable(input.PreTaskHandleCodes).ExecuteCommandAsync();
}
//根据载具ID更新是否锁定和赋值起始库位
if (setCarryColumnsExp != null)
{
Expression<Func<WmsCarryH, bool>> whereExp = input.CarryIds?.Count > 0 ? it => input.CarryIds.Contains(it.id) : it => it.id == input.CarryId;
_ = await _db.Updateable<WmsCarryH>().SetColumns(setCarryColumnsExp).Where(whereExp).ExecuteCommandAsync();
_ = await db.Updateable<WmsCarryH>().SetColumns(setCarryColumnsExp).Where(whereExp).ExecuteCommandAsync();
}
if (input.CarryStartLocationId.IsNullOrWhiteSpace() == false)
{
_ = await _db.Updateable<BasLocation>().SetColumns(setLocaionColumbExp).Where(it => input.LocationIds.Contains(it.id)).ExecuteCommandAsync();
_ = await db.Updateable<BasLocation>().SetColumns(setLocaionColumbExp).Where(it => input.LocationIds.Contains(it.id)).ExecuteCommandAsync();
}
//根据所有库位更新库位的锁定状态为“锁定”
if (setLocaionColumbExp != null && input.LocationIds?.Count > 0)
{
_ = await _db.Updateable<BasLocation>().SetColumns(setLocaionColumbExp).Where(it => input.LocationIds.Contains(it.id)).ExecuteCommandAsync();
_ = await db.Updateable<BasLocation>().SetColumns(setLocaionColumbExp).Where(it => input.LocationIds.Contains(it.id)).ExecuteCommandAsync();
}
await _db.Ado.CommitTranAsync();
}
catch (Exception)
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
Logger.LogError("【GenInStockTaskHandleAfter】" + ex.Message);
Logger.LogError("【GenInStockTaskHandleAfter】" + ex.StackTrace);
throw;
}
}
@@ -2638,9 +2721,12 @@ namespace Tnb.WarehouseMgr
/// <param name="input"></param>
/// <returns></returns>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> CommonCreatePretask(CommonCreatePretaskInput input)
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> CommonCreatePretask(CommonCreatePretaskInput input, ISqlSugarClient dbConn = null)
{
//using (var db = _db.CopyNew())
var db = _db;
if (dbConn != null)
db = dbConn;
{
await s_taskCommonCreatePretask.WaitAsync();
Logger.LogInformation($"【createPretask】 接收到请求 参数:{JsonConvert.SerializeObject(input)}");
@@ -2652,11 +2738,11 @@ namespace Tnb.WarehouseMgr
if (!string.IsNullOrEmpty(input.startlocation_id))
{
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.startlocation_id);
sPoint = await db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.startlocation_id);
}
if (!string.IsNullOrEmpty(input.endlocation_id))
{
ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.endlocation_id);
ePoint = await db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.endlocation_id);
}
if (sPoint == null)
@@ -2675,7 +2761,7 @@ namespace Tnb.WarehouseMgr
points = await PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else
@@ -2701,14 +2787,14 @@ namespace Tnb.WarehouseMgr
// 如果指定了carry_id
else if (!string.IsNullOrEmpty(input.carry_id))
{
wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.id == input.carry_id).First();
wmsCarryH = db.Queryable<WmsCarryH>().Where(r => r.id == input.carry_id).First();
carry_id = wmsCarryH.id;
carry_code = wmsCarryH.carry_code;
}
// carry_code
else if (!string.IsNullOrEmpty(input.carry_code))
{
wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
wmsCarryH = db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
carry_id = wmsCarryH.id;
carry_code = wmsCarryH.carry_code;
}
@@ -2763,7 +2849,8 @@ namespace Tnb.WarehouseMgr
//赋值签收状态
Logger.LogInformation($"【CommonCreatePretask】 开始执行 GenPreTask {JsonConvert.SerializeObject(preTasks)}");
bool result = await GenPreTask(preTasks, null!);
bool result = await GenPreTask(preTasks, null!, db);
Logger.LogInformation($"【CommonCreatePretask】 GenPreTask 结果 {result}");
if (result)
{
@@ -2777,7 +2864,7 @@ namespace Tnb.WarehouseMgr
};
//根据载具移入Id回更单据状态
_ = await _db.Updateable<WmsMoveInstock>().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
_ = await db.Updateable<WmsMoveInstock>().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
Expression<Func<WmsCarryH, WmsCarryH>> wmsCarryHChangeExp = a => new WmsCarryH { is_lock = 1 };
@@ -2789,7 +2876,7 @@ namespace Tnb.WarehouseMgr
await GenInStockTaskHandleAfter(preTaskUpInput,
wmsCarryHChangeExp,
it => new BasLocation { is_lock = 1 });
it => new BasLocation { is_lock = 1 }, db);
Logger.LogInformation($"【CommonCreatePretask】 成功生成预任务:{preTasks.First().bill_code}");
return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功");
}

View File

@@ -164,7 +164,7 @@ namespace Tnb.WarehouseMgr
WmsCarryCode.id = SnowflakeIdHelper.NextId();
WmsCarryCode.carry_id = carry.id;
WmsCarryCode.is_out = 0;
WmsCarryCode.id = input.create_id;
WmsCarryCode.create_id = input.create_id;
WmsCarryCode.create_time = DateTime.Now;
WmsCarryCodes.Add(WmsCarryCode);
}

View File

@@ -98,7 +98,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -94,7 +94,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -306,7 +306,7 @@ namespace Tnb.WarehouseMgr
/// <summary>
/// 载具绑定物料(MES用)
/// 载具绑定物料
/// </summary>
/// <param name="input"></param>
/// <exception cref="ArgumentNullException"></exception>

View File

@@ -227,7 +227,7 @@ namespace Tnb.WarehouseMgr
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
if (points?.Count > 0)
@@ -499,7 +499,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
/* var genPreTask = BuildPreTaskHelper.GenPretaskCurried<WmsCheckstockH>(null, WmsWareHouseConst.BIZTYPE_CARRYMOVEINSTOCK_ID, WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID);

View File

@@ -137,7 +137,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -110,7 +110,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -149,7 +149,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -420,7 +420,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -103,7 +103,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -272,7 +272,28 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException($@"当前实际托盘数量为{input.palletCount} 实际库存数量为{qty},与前台数据不一致,请重新获取库存", HttpStatusCode.InternalServerError);
}
foreach(var wmsCarryH in items)
List<BasLocation> endLocations = new List<BasLocation>();
// 集中供料区三工位
if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_JZGL_ID)
{
// 根据三工位任务数平均分配任务 暂定
endLocations = _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").ToList();
}
// 中储仓三工位
else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID)
{
// 根据三工位任务数平均分配任务 暂定
endLocations = _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").ToList();
}
if (endLocations.Count() < input.palletCount)
{
throw new AppFriendlyException($@"可用的终点库位数量为{endLocations.Count()}个 下发数量为{input.palletCount}个 请检查终点库位的锁定和占用状态", 500);
}
foreach (var wmsCarryH in items)
{
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).FirstAsync();
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.location_code == wmsCarryH.location_code).FirstAsync();
@@ -282,13 +303,18 @@ namespace Tnb.WarehouseMgr
if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_JZGL_ID)
{
// 根据三工位任务数平均分配任务 暂定
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1GLSGWOutstockLocation().Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
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)
{
// 根据三工位任务数平均分配任务 暂定
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
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();
}
if (endLocation == null)
{
throw new AppFriendlyException($@"没有可用的终点库位!请检查终点库位的锁定和占用状态", 500);
}
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
@@ -299,6 +325,7 @@ namespace Tnb.WarehouseMgr
commonCreatePretaskInput.require_id = input.source_id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.isExcuteMission = false;
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
@@ -317,6 +344,8 @@ namespace Tnb.WarehouseMgr
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
Logger.LogError("【Distribute】" + ex.Message);
Logger.LogError("【Distribute】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
@@ -334,14 +363,14 @@ namespace Tnb.WarehouseMgr
{
throw new ArgumentNullException(nameof(input));
}
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == input.carryIds[0]).SingleAsync();
if (wmsCarryCode == null)
List<WmsCarryCode> wmsCarryCodes = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == input.carryIds[0]).ToListAsync();
if (wmsCarryCodes.Count == 0)
{
Logger.LogWarning($"【ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码");
return;
}
// 更新已转数量
bool isOk = await _db.Updateable<WmsMaterialTransferD>().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCode.codeqty })
bool isOk = await _db.Updateable<WmsMaterialTransferD>().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty)})
.Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
// 如果所有明细已完成 更新主表状态为完成
@@ -401,7 +430,7 @@ namespace Tnb.WarehouseMgr
material_id = wmsMaterialTransferD.material_id,
code_batch = wmsMaterialTransferD.code_batch
};
List<WmsCarryH>? carrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput);
List<WmsCarryH>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
// 需要转库数量
decimal? needOut = wmsMaterialTransferD.qty;
@@ -412,8 +441,16 @@ namespace Tnb.WarehouseMgr
{
break;
}
WmsCarryCode wmsCarryCode = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).First();
needOut -= wmsCarryCode.codeqty;
List<WmsCarryCode> wmsCarryCodes = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).ToList();
WmsCarryCode wmsCarryCode = wmsCarryCodes.First();
// 目前只支持一个料箱只有一个物料
foreach (WmsCarryCode _wmsCarryCode in wmsCarryCodes)
{
needOut -= wmsCarryCode.codeqty;
}
BasLocation endlocation_ssx = await _db.Queryable<BasLocation>().Where(r => new string[2] { "32609229889045", "32609238573589" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
await _db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync();

View File

@@ -95,7 +95,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -298,7 +298,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> curPreTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
@@ -714,7 +714,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -243,7 +243,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -198,7 +198,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -92,7 +92,7 @@ namespace Tnb.WarehouseMgr
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -124,7 +124,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -95,7 +95,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -102,7 +102,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -104,7 +104,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -94,7 +94,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -85,7 +85,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -31,6 +31,7 @@ namespace Tnb.WarehouseMgr
{
private const string BizTypeId = "26191496816421";
private readonly ISqlSugarClient _db;
private ISqlSugarClient _dbScanInStockByRedis;
private readonly IDictionaryDataService _dictionaryDataService;
private readonly IUserManager _userManager;
private readonly IWareHouseService _wareHouseService;
@@ -47,6 +48,7 @@ namespace Tnb.WarehouseMgr
)
{
_db = repository.AsSugarClient();
_dbScanInStockByRedis = repository.AsSugarClient();
_dictionaryDataService = dictionaryDataService;
_userManager = userManager;
_billRullService = billRullService;
@@ -213,7 +215,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else
@@ -353,7 +355,7 @@ namespace Tnb.WarehouseMgr
Logger.LogInformation($"【ScanInStockByRedis】执行入库 {JsonConvert.SerializeObject(input)}");
try
{
await _db.Ado.BeginTranAsync();
await _dbScanInStockByRedis.Ado.BeginTranAsync();
WmsInstockCode? item = null;
BasMaterial? mat = null;
WmsCarryH? carry = null;
@@ -369,19 +371,19 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException("请输入入库数量", 500);
}
carryCode = item.barcode;
carry = await _db.Queryable<WmsCarryH>().FirstAsync(it => it.carry_code == carryCode);
carry = await _dbScanInStockByRedis.Queryable<WmsCarryH>().FirstAsync(it => it.carry_code == carryCode);
if (carry == null)
{
throw new AppFriendlyException("载具有误", 500);
}
mat = await _db.Queryable<BasMaterial>().FirstAsync(it => it.code == item.material_code);
mat = await _dbScanInStockByRedis.Queryable<BasMaterial>().FirstAsync(it => it.code == item.material_code);
if (mat == null)
{
throw new AppFriendlyException("物料有误", 500);
}
loc = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == item.extras);
loc = await _dbScanInStockByRedis.Queryable<BasLocation>().FirstAsync(it => it.location_code == item.extras);
if (loc == null)
{
throw new AppFriendlyException("库位有误", 500);
@@ -472,13 +474,13 @@ namespace Tnb.WarehouseMgr
};
}
_ = await _db.Insertable(instock).ExecuteCommandAsync();
_ = await _dbScanInStockByRedis.Insertable(instock).ExecuteCommandAsync();
Logger.LogInformation($"【ScanInStockByRedis】插入WmsInstockH {JsonConvert.SerializeObject(instock)}");
_ = await _db.Insertable(instockDs).ExecuteCommandAsync();
_ = await _dbScanInStockByRedis.Insertable(instockDs).ExecuteCommandAsync();
Logger.LogInformation($"【ScanInStockByRedis】插入WmsInstockD {JsonConvert.SerializeObject(instockDs)}");
if (instockCode != null)
{
_ = await _db.Insertable(instockCode).ExecuteCommandAsync();
_ = await _dbScanInStockByRedis.Insertable(instockCode).ExecuteCommandAsync();
Logger.LogInformation($"【ScanInStockByRedis】插入WmsInstockCode {JsonConvert.SerializeObject(instockCode)}");
}
@@ -488,16 +490,16 @@ namespace Tnb.WarehouseMgr
WmsPointH ePoint = new();
if (endLocations?.Count > 0)
{
BasLocation eloc = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == endLocations[0].id);
BasLocation eloc = await _dbScanInStockByRedis.Queryable<BasLocation>().SingleAsync(it => it.id == endLocations[0].id);
bool isMatch = await IsCarryAndLocationMatchByCarryStd(carry, eloc);
if (!isMatch)
{
throw new AppFriendlyException("库位与载具规格不匹配", 500);
}
ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
ePoint = await _dbScanInStockByRedis.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
}
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == loc.id);
sPoint = await _dbScanInStockByRedis.Queryable<WmsPointH>().FirstAsync(it => it.location_id == loc.id);
Logger.LogInformation($"【ScanInStockByRedis】sPoint:{JsonConvert.SerializeObject(sPoint)} ePoint:{JsonConvert.SerializeObject(ePoint)}");
if (sPoint != null && ePoint != null)
@@ -509,7 +511,7 @@ namespace Tnb.WarehouseMgr
Logger.LogInformation($"【ScanInStockByRedis】 路径点数量为:{points.Count}");
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else
@@ -615,22 +617,28 @@ namespace Tnb.WarehouseMgr
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
it => new WmsCarryH { carry_code = instock!.carry_code!, is_lock = 1, carry_status = ((int)EnumCarryStatus.).ToString(), location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode },
it => new BasLocation { is_lock = 1 });
_ = await _db.Updateable<WmsInstockD>().SetColumns(it => new WmsInstockD { line_status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => instockCode.bill_d_id == it.id).ExecuteCommandAsync();
_ = await _db.Updateable<WmsInstockH>().SetColumns(it => new WmsInstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == instock!.id).ExecuteCommandAsync();
_ = await _dbScanInStockByRedis.Updateable<WmsInstockD>().SetColumns(it => new WmsInstockD { line_status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => instockCode.bill_d_id == it.id).ExecuteCommandAsync();
_ = await _dbScanInStockByRedis.Updateable<WmsInstockH>().SetColumns(it => new WmsInstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == instock!.id).ExecuteCommandAsync();
}
}
}
await _db.Ado.CommitTranAsync();
await _dbScanInStockByRedis.Ado.CommitTranAsync();
}
catch (AggregateException ex)
{
Console.WriteLine("【ScanInStockByRedis】 AggregateException" + ex.Message);
_dbScanInStockByRedis = _dbScanInStockByRedis.CopyNew();
await _dbScanInStockByRedis.Ado.RollbackTranAsync();
throw;
}
catch (Exception)
{
await _db.Ado.RollbackTranAsync();
await _dbScanInStockByRedis.Ado.RollbackTranAsync();
throw;
}
finally
{
_ = InvokeGenPretaskExcute();
}
return Task.FromResult(true);

View File

@@ -85,7 +85,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -169,7 +169,7 @@ namespace Tnb.WarehouseMgr
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
if (points?.Count > 0)

View File

@@ -207,7 +207,7 @@ namespace Tnb.WarehouseMgr
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else

View File

@@ -301,7 +301,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> curPreTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -84,7 +84,7 @@ namespace Tnb.WarehouseMgr
{
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>

View File

@@ -207,7 +207,7 @@ namespace Tnb.WarehouseMgr
List<WmsPointH> points = await _warehouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException("该路径不存在", 500);
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
if (points?.Count > 0)