齐套出库

This commit is contained in:
2024-06-04 15:48:13 +08:00
parent 0fec54597d
commit 49f9e7b01c
7 changed files with 1264 additions and 102 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
namespace Tnb.WarehouseMgr.Entities.Dto
{
/// <summary>
///
/// </summary>
public class MaterialTransferGetRackAndMatByWorkStationInput
{
/// <summary>
/// 组织ID
/// </summary>
public string org_id { get; set; }
/// <summary>
/// 工位号
/// </summary>
public string? work_station{ get; set; }
}
}

View File

@@ -1526,7 +1526,7 @@ namespace Tnb.WarehouseMgr
{
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
await Task.Delay(1000);
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态 );
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
_elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus;
}
@@ -1554,9 +1554,9 @@ namespace Tnb.WarehouseMgr
{
tuple = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
await Task.Delay(1000);
} while (tuple.sysStatus != 3 || tuple.runStatus != 0);
} while (tuple.sysStatus != 3 || tuple.runStatus != 0 || floor != tuple.floorNo);
Logger.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}");
Logger.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},当前楼层floorNo:{tuple.floorNo},目标楼层disTask.end_floor={floor}");
if (tuple.sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && tuple.runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.)
{
@@ -1834,6 +1834,11 @@ namespace Tnb.WarehouseMgr
await _db.Updateable<WmsTransferInstockD>().SetColumns(r => r.qty == r.qty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync();
}
}
// 二楼物料呼叫任务结束后清空工位信息
else if (dt.biz_type == "FloorCallMaterial")
{
await _db.Updateable<WmsCarryH>().SetColumns(r => r.work_station == "").Where(r => r.id == dt.carry_id).ExecuteCommandAsync();
}
#endregion
List<WmsDistaskCode> disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync();

View File

@@ -34,6 +34,7 @@ using Microsoft.Extensions.Logging;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Entitys.Permission;
using Aop.Api.Domain;
using Senparc.Weixin.Work.AdvancedAPIs.OaDataOpen;
namespace Tnb.WarehouseMgr
{
@@ -497,42 +498,42 @@ namespace Tnb.WarehouseMgr
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> CallRackToProductionLine(MaterialTransferCallRackToProductionLineInput input)
{
WmsCarryH wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
if (wmsCarryH == null)
{
Logger.LogWarning($"不存在编码为{input.carry_code}的料架号!");
throw new AppFriendlyException($"不存在编码为{input.carry_code}的料架号!", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.work_station))
{
Logger.LogWarning($"此料架目标工位为空!{input.carry_code}");
throw new AppFriendlyException($"此料架目标工位为空!{input.carry_code}", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.location_id))
{
Logger.LogWarning($"此料架的库位为空!{input.carry_code}");
throw new AppFriendlyException($"此料架的库位为空!{input.carry_code}", 500);
}
BasLocation endlocation = _db.Queryable<BasLocation>().Where(r => r.location_code == wmsCarryH.work_station).First();
WmsDistaskH wmsDistaskH = _db.Queryable<WmsDistaskH>().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).First();
if (wmsDistaskH != null)
{
Logger.LogWarning($"此料架{input.carry_code}存在未完成的任务{wmsDistaskH.bill_code}");
throw new AppFriendlyException($"此料架{input.carry_code}存在未完成的任务{wmsDistaskH.bill_code}", 500);
}
try
{
WmsCarryH wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
if (wmsCarryH == null)
{
Logger.LogWarning($"【CallRackToProductionLine】不存在编码为{input.carry_code}的料架号!");
throw new AppFriendlyException($"不存在编码为{input.carry_code}的料架号!", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.work_station))
{
Logger.LogWarning($"【CallRackToProductionLine】此料架目标工位为空{input.carry_code}");
throw new AppFriendlyException($"此料架目标工位为空!{input.carry_code}", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.location_id))
{
Logger.LogWarning($"【CallRackToProductionLine】此料架的库位为空{input.carry_code}");
throw new AppFriendlyException($"此料架的库位为空!{input.carry_code}", 500);
}
BasLocation endlocation = _db.Queryable<BasLocation>().Where(r => r.location_code == wmsCarryH.work_station).First();
WmsPretaskH wmsPretaskH = _db.Queryable<WmsPretaskH>().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First();
if (wmsPretaskH != null)
{
Logger.LogWarning($"【CallRackToProductionLine】此料架{input.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}");
throw new AppFriendlyException($"此料架{input.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}", 500);
}
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = wmsCarryH.location_id;
commonCreatePretaskInput.endlocation_id = endlocation.id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.task_type = "";
commonCreatePretaskInput.biz_type = "";
commonCreatePretaskInput.biz_type = "FloorCallMaterial";
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
@@ -550,5 +551,75 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 从暂存仓呼叫料架到产线
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> RackAndMatByWorkstation(MaterialTransferGetRackAndMatByWorkStationInput input)
{
try
{
List<WmsCarryH> wmsCarryHs = _db.Queryable<WmsCarryH>().Where(r => r.work_station == input.work_station).ToList();
if (string.IsNullOrEmpty(input.work_station))
{
Logger.LogWarning($"【RackAndMatByWorkstation】工位不能为空");
throw new AppFriendlyException($"工位不能为空!", 500);
}
if (wmsCarryHs.Count == 0)
{
Logger.LogWarning($"【RackAndMatByWorkstation】工位{input.work_station}未绑定料架!");
throw new AppFriendlyException($"工位{input.work_station}未绑定料架!", 500);
}
JObject keyValuePairs = new JObject();
JArray jArray = new JArray();
foreach (WmsCarryH wmsCarryH in wmsCarryHs)
{
if (wmsCarryH.carrystd_id != "26037267399717")
{
Logger.LogWarning($"【RackAndMatByWorkstation】工位{input.work_station}绑定的{wmsCarryH.carry_code}载具不是料架类型!请检查");
continue;
}
var matCodes = _db.Queryable<WmsCarryD>()
.InnerJoin<WmsCarryCode>((a, b) => a.membercarry_id == b.carry_id)
.InnerJoin<BasMaterial>((a, b, c) => b.material_id == c.id)
.Where((a, b, c) => a.carry_id == wmsCarryH.id)
.Select((a, b, c) => new
{
b.org_id,
a.membercarry_id,
a.membercarry_code,
b.material_id,
b.material_code,
material_name = c.name,
c.material_specification,
b.unit_id,
b.barcode,
b.code_batch,
b.codeqty,
b.create_id,
b.create_time
}).ToList();
JObject pairs = new JObject();
pairs["carry_id"] = wmsCarryH.id;
pairs["carry_code"] = wmsCarryH.carry_code;
pairs["details"] = JArray.Parse(JsonConvert.SerializeObject(matCodes));
jArray.Add(pairs);
}
return await ToApiResult(HttpStatusCode.OK, "成功", jArray);
}
catch (Exception ex)
{
Logger.LogError("【RackAndMatByWorkstation】" + ex.Message);
Logger.LogError("【RackAndMatByWorkstation】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
}
}
}

View File

@@ -324,6 +324,7 @@ namespace Tnb.WarehouseMgr
bindCarryCodeInput.location_id = endLocations[0].id;
bindCarryCodeInput.location_code = endLocations[0].location_code;
bindCarryCodeInput.code_batch = wmsTransferInstockD.pi_code;
bindCarryCodeInput.unit_id = basMaterial.unit_id;
await _wmsCarryService.BindCarryMaterial(bindCarryCodeInput);
}

View File

@@ -195,7 +195,7 @@ namespace Tnb.WarehouseMgr
commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
commonCreatePretaskInput2.require_id = wmsPrdInstockD.id;
commonCreatePretaskInput2.isExcuteMission = false;
commonCreatePretaskInput1.isChangeCarryLoc2StartLoc = false;
commonCreatePretaskInput2.isChangeCarryLoc2StartLoc = false;
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2);
}

View File

@@ -2,23 +2,37 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;
using Aspose.Cells.Drawing;
using CSRedis;
using JNPF;
using JNPF.Common.Cache;
using JNPF.DependencyInjection;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using static CSRedis.CSRedisClient;
namespace Tnb.Common.Redis
{
public class RedisData : ISingleton
{
private static CSRedisClient _instance;
public delegate void rcvMsgHandler(string Channel, string Body);
public event rcvMsgHandler rcvMsg;
public RedisData()
{
RedisOptions _RedisOptions = App.GetConfig<RedisOptions>("Redis", true);
_instance = new CSRedis.CSRedisClient(string.Format(_RedisOptions.RedisConnectionString, _RedisOptions.ip, _RedisOptions.port, _RedisOptions.password));
_instance.Subscribe(("devdata_change", msg =>
{
if (rcvMsg != null)
{
rcvMsg(msg.Channel, msg.Body);
}
}
));
}
/// <summary>
@@ -264,5 +278,7 @@ namespace Tnb.Common.Redis
}
return default(T);
}
}
}