齐套出库
This commit is contained in:
@@ -226,8 +226,8 @@ public class ModuleConsts
|
||||
/// </summary>
|
||||
public const string MODULE_WMSMATERIALTRANSFER_ID = "34354738929685";
|
||||
/// <summary>
|
||||
/// 模块标识-生产入库单 todo
|
||||
/// 模块标识-生产入库单
|
||||
/// </summary>
|
||||
public const string MODULE_WMSPRDINSTOCK_ID = "MODULE_WMSPRDINSTOCK_ID";
|
||||
public const string MODULE_WMSPRDINSTOCK_ID = "34467501190677";
|
||||
|
||||
}
|
||||
@@ -218,7 +218,7 @@
|
||||
/// <summary>
|
||||
/// 预任务生成业务类型-原材料转库单下发 todo
|
||||
/// </summary>
|
||||
public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "BIZTYPE_WMSMATERIALTRANSFER_ID";
|
||||
public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "34354738929685";
|
||||
/// <summary>
|
||||
/// 预任务生成业务类型-载具绑定
|
||||
/// </summary>
|
||||
@@ -234,9 +234,9 @@
|
||||
public const string BIZTYPE_WMSTRANSFERINSTOCK_ID = "34154749548053";
|
||||
|
||||
/// <summary>
|
||||
/// 生产入库 todo
|
||||
/// 生产入库
|
||||
/// </summary>
|
||||
public const string BIZTYPE_WMSPRDINSTOCK_ID = "BIZTYPE_WMSPRDINSTOCK_ID";
|
||||
public const string BIZTYPE_WMSPRDINSTOCK_ID = "34467501190677";
|
||||
|
||||
/// <summary>
|
||||
/// 条码打印状态-已完成
|
||||
|
||||
@@ -18,8 +18,8 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
|
||||
public string location_id { get; set; } = "";
|
||||
public string location_code { get; set; } = "";
|
||||
public string code_batch { get; set; }
|
||||
public string unit_id { get; set; }
|
||||
public string unit_code { get; set; }
|
||||
public string unit_id { get; set; } = "";
|
||||
public string unit_code { get; set; } = "";
|
||||
public string create_id { get; set; } = WmsWareHouseConst.AdministratorUserId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
namespace Tnb.WarehouseMgr.Entities.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 库房业务更新输入参数
|
||||
/// </summary>
|
||||
public class MaterialTransferCallRackToProductionLineInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 组织ID
|
||||
/// </summary>
|
||||
public string org_id { get; set; }
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
public string create_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 料架号
|
||||
/// </summary>
|
||||
public string? carry_code { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
namespace Tnb.WarehouseMgr.Entities.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 库房业务更新输入参数
|
||||
/// </summary>
|
||||
public class MaterialTransferDistributeToZCCInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 组织ID
|
||||
/// </summary>
|
||||
public string org_id { get; set; }
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
public string create_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源单据id(转库单主表)
|
||||
/// </summary>
|
||||
public string? source_id { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -135,4 +135,9 @@ public partial class WmsCarryH : BaseEntity<string>
|
||||
/// </summary>
|
||||
public int check_conclusion { get; set; } = 1;
|
||||
|
||||
/// <summary>
|
||||
/// 配送工位
|
||||
/// </summary>
|
||||
public string? work_station { get; set; }
|
||||
|
||||
}
|
||||
|
||||
@@ -84,15 +84,15 @@ public partial class WmsEmptyOutstockH : BaseEntity<string>
|
||||
/// </summary>
|
||||
public DateTime? timestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 二楼机械臂剩余绑定料架数量
|
||||
/// </summary>
|
||||
public int? remainbindracknum { get; set; }
|
||||
///// <summary>
|
||||
///// 二楼机械臂剩余绑定料架数量
|
||||
///// </summary>
|
||||
//public int? remainbindracknum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 二楼机械臂料箱绑定完成
|
||||
/// </summary>
|
||||
public string? bindrackcomplete { get; set; }
|
||||
///// <summary>
|
||||
///// 二楼机械臂料箱绑定完成
|
||||
///// </summary>
|
||||
//public string? bindrackcomplete { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -114,4 +114,14 @@ public partial class WmsMaterialTransfer : BaseEntity<string>
|
||||
/// </summary>
|
||||
public string? order_code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 载具数量
|
||||
/// </summary>
|
||||
public int? carry_count { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可绑定料架的载具数量
|
||||
/// </summary>
|
||||
public int? remainbindracknum { get; set; }
|
||||
|
||||
}
|
||||
|
||||
@@ -92,4 +92,5 @@ public partial class WmsMaterialTransferD : BaseEntity<string>
|
||||
/// </summary>
|
||||
public string? material_ex { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
using JNPF.Common.Contracts;
|
||||
using JNPF.Common.Security;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Tnb.WarehouseMgr.Entities.Entity;
|
||||
|
||||
/// <summary>
|
||||
/// 转库单载具表
|
||||
/// </summary>
|
||||
[SugarTable("wms_material_transfer_carry")]
|
||||
public partial class WmsMaterialTransferCarry : BaseEntity<string>
|
||||
{
|
||||
public WmsMaterialTransferCarry()
|
||||
{
|
||||
id = SnowflakeIdHelper.NextId();
|
||||
}
|
||||
/// <summary>
|
||||
/// 转库单id
|
||||
/// </summary>
|
||||
public string? bill_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 载具ID
|
||||
/// </summary>
|
||||
public string? carry_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 载具编号
|
||||
/// </summary>
|
||||
public string? carry_code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
public string? create_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime? create_time { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 起点库位id
|
||||
/// </summary>
|
||||
public string? startlocation_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 起点库位编码
|
||||
/// </summary>
|
||||
public string? startlocation_code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 终点库位id
|
||||
/// </summary>
|
||||
public string? endlocation_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 终点库位编码
|
||||
/// </summary>
|
||||
public string? endlocation_code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 转库单物料明细id
|
||||
/// </summary>
|
||||
public string? mat_bill_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 料箱数量
|
||||
/// </summary>
|
||||
public decimal? qty { get; set; }
|
||||
}
|
||||
@@ -302,6 +302,13 @@ namespace Tnb.WarehouseMgr
|
||||
codeqty = b.codeqty
|
||||
}).ToList().Select(r =>
|
||||
{
|
||||
// 如果可出库数量已经扣减完
|
||||
if (input.qty <= 0)
|
||||
{
|
||||
return new Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>("", r.WmsCarryH, r.WmsCarryCode, r.BasLocation);
|
||||
}
|
||||
|
||||
// 扣减可出库数量
|
||||
input.qty = input.qty - r.codeqty;
|
||||
|
||||
// 出库数量与托盘上的数量不一致需要进行分拣
|
||||
@@ -315,7 +322,7 @@ namespace Tnb.WarehouseMgr
|
||||
// 正常预任务出库
|
||||
return new Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>("预任务", r.WmsCarryH, r.WmsCarryCode, r.BasLocation);
|
||||
}
|
||||
}).ToList();
|
||||
}).Where(r => r.Item1 != "").ToList();
|
||||
return items;
|
||||
}
|
||||
|
||||
@@ -547,7 +554,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// // 二楼机械臂
|
||||
/// 二楼机械臂
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> Floor2MechanicalComplete(WmsDistaskH disTask, string action)
|
||||
@@ -673,6 +680,15 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
throw new Exception($@"【上升降机】设定升上升降机满托{target.stackingposition}移走 结果为 {result}");
|
||||
}
|
||||
|
||||
// 更新料架在二楼配送的目标工位
|
||||
// todo erp工位字段取数位置未确定
|
||||
string targetWorkstation = "003-01-01-01";
|
||||
Logger.LogInformation($@"【上升降机】更新料架 {target.rackcode} 在二楼配送的目标工位 {targetWorkstation}");
|
||||
await db.Updateable<WmsCarryH>().SetColumns(r => new WmsCarryH
|
||||
{
|
||||
work_station = targetWorkstation
|
||||
}).Where(r => r.id == target.rackid).ExecuteCommandAsync();
|
||||
}
|
||||
else if (target.note == "下升降机")
|
||||
{
|
||||
@@ -684,12 +700,6 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
}
|
||||
|
||||
//回写出库单状态
|
||||
await db.Updateable<WmsEmptyOutstockH>().SetColumns(r => new WmsEmptyOutstockH
|
||||
{
|
||||
bindrackcomplete = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID
|
||||
}).Where(r => r.bill_code == target.outbill).ExecuteCommandAsync();
|
||||
|
||||
// 重置料架区
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
@@ -721,26 +731,26 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
private async Task<bool> Floor2UpDownMachinecode_SetTag(string tag, string value)
|
||||
{
|
||||
//string DevName = "东面提升机输送线";
|
||||
//Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
|
||||
//{
|
||||
// ["DevName"] = DevName,
|
||||
// ["token"] = _eleCtlCfg.token,
|
||||
// ["TagName"] = tag,
|
||||
// ["Value"] = value,
|
||||
//};
|
||||
//string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
|
||||
string DevName = "东面提升机输送线";
|
||||
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["DevName"] = DevName,
|
||||
["token"] = _eleCtlCfg.token,
|
||||
["TagName"] = tag,
|
||||
["Value"] = value,
|
||||
};
|
||||
string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
|
||||
|
||||
//return result.Contains("Ok");
|
||||
return result.Contains("Ok");
|
||||
|
||||
// 测试
|
||||
string DevName = "东面提升机输送线";
|
||||
//string DevName = "东面提升机输送线";
|
||||
|
||||
JObject valueJson = new JObject();
|
||||
valueJson["Value"] = value;
|
||||
//JObject valueJson = new JObject();
|
||||
//valueJson["Value"] = value;
|
||||
|
||||
bool res = await _redisData.HSet(DevName, tag, valueJson.ToString());
|
||||
return true;
|
||||
//bool res = await _redisData.HSet(DevName, tag, valueJson.ToString());
|
||||
//return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1100,7 +1110,7 @@ namespace Tnb.WarehouseMgr
|
||||
Logger.Information($@"【CTUTaskExecute】 获取任务TaskCodes: {JsonConvert.SerializeObject(TaskCodes)}");
|
||||
|
||||
var InTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID).ToList();
|
||||
var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID).ToList();
|
||||
var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID || a.task_type == WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID).ToList();
|
||||
|
||||
//Logger.Information($@"【CTUTaskExecute】 获取任务InTasks: {JsonConvert.SerializeObject(InTasks)}");
|
||||
//Logger.Information($@"【CTUTaskExecute】 获取任务OutTasks: {JsonConvert.SerializeObject(OutTasks)}");
|
||||
@@ -1297,7 +1307,7 @@ namespace Tnb.WarehouseMgr
|
||||
BillCode = $"{groups}-" + (orgdistaskHs.Count + newdistaskHs.Count + 1);
|
||||
}
|
||||
}
|
||||
else if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID)
|
||||
else if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID || distaskH.task_type == WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID)
|
||||
{
|
||||
var orgdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList();
|
||||
var newdistaskHs = NewdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList();
|
||||
@@ -1775,7 +1785,7 @@ namespace Tnb.WarehouseMgr
|
||||
is_lock = 0,
|
||||
is_use = multiList[i].carry_status
|
||||
};
|
||||
if (multiList[i].carry_status.ToEnum<EnumCarryStatus>() == EnumCarryStatus.空闲)
|
||||
if (!string.IsNullOrEmpty(multiList[i].carry_status) && multiList[i].carry_status.ToEnum<EnumCarryStatus>() == EnumCarryStatus.空闲)
|
||||
{
|
||||
loc.is_use = ((int)EnumCarryStatus.占用).ToString();
|
||||
}
|
||||
@@ -1824,12 +1834,6 @@ 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 == WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID)
|
||||
{
|
||||
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == dt.carry_id).FirstAsync();
|
||||
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yzqty == r.yzqty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync();
|
||||
}
|
||||
#endregion
|
||||
|
||||
List<WmsDistaskCode> disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync();
|
||||
|
||||
@@ -33,6 +33,7 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using JNPF.Systems.Entitys.System;
|
||||
using JNPF.Systems.Entitys.Permission;
|
||||
using Aop.Api.Domain;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
@@ -43,7 +44,7 @@ namespace Tnb.WarehouseMgr
|
||||
[ServiceModule(BizTypeId)]
|
||||
public class WmsMaterialTransferService : BaseWareHouseService
|
||||
{
|
||||
private const string BizTypeId = "";
|
||||
private const string BizTypeId = "34354738929685";
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IRunService _runService;
|
||||
private readonly IVisualDevService _visualDevService;
|
||||
@@ -51,6 +52,8 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IBillRullService _billRullService;
|
||||
private readonly IUserManager _userManager;
|
||||
|
||||
public static SemaphoreSlim s_taskDistributeToZCC = new(1);
|
||||
|
||||
public WmsMaterialTransferService(
|
||||
ISqlSugarRepository<WmsCarryH> repository,
|
||||
IRunService runService,
|
||||
@@ -80,6 +83,8 @@ namespace Tnb.WarehouseMgr
|
||||
.InnerJoin<UserEntity>((a, b, c) => c.Id == a.create_id)
|
||||
.InnerJoin<BasWarehouse>((a, b, c, d) => d.id == a.warehouse_outstock)
|
||||
.InnerJoin<BasWarehouse>((a, b, c, d, e) => e.id == a.warehouse_instock)
|
||||
// 只显示未完成的单据
|
||||
.Where( a => a.status != "25065149810453")
|
||||
.Select((a, b, c, d, e) => new WmsMaterialTransfer
|
||||
{
|
||||
id = a.id,
|
||||
@@ -94,7 +99,7 @@ namespace Tnb.WarehouseMgr
|
||||
status = b.FullName,
|
||||
bill_date = a.bill_date,
|
||||
warehouse_outstock = d.whname,
|
||||
warehouse_instock = d.whname,
|
||||
warehouse_instock = e.whname,
|
||||
type = a.type,
|
||||
biller_out = a.biller_out,
|
||||
depart_out = a.depart_out,
|
||||
@@ -113,9 +118,9 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
foreach (dynamic row in mainTable)
|
||||
{
|
||||
row.deliver_date = row.deliver_date.Value.ToString("yyyy-MM-dd");
|
||||
row.arrival_date = row.arrival_date.Value.ToString("yyyy-MM-dd");
|
||||
row.create_time = row.create_time.Value.ToString("yyyy-MM-dd");
|
||||
row.deliver_date = row.deliver_date.Value?.ToString("yyyy-MM-dd");
|
||||
row.arrival_date = row.arrival_date.Value?.ToString("yyyy-MM-dd");
|
||||
row.create_time = row.create_time.Value?.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
List<WmsMaterialTransferD> wmsTransferInstockDs = _db.Queryable<WmsMaterialTransferD, BasMaterial>((a, b) =>
|
||||
@@ -235,6 +240,12 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable<WmsMaterialTransferD>().FirstAsync(it => it.id == input.source_id);
|
||||
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable<WmsMaterialTransfer>().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id);
|
||||
|
||||
if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty)
|
||||
{
|
||||
throw new AppFriendlyException("已下发数量已达到转库数量", 500);
|
||||
}
|
||||
|
||||
await s_taskExecuteSemaphore.WaitAsync();
|
||||
await _db.Ado.BeginTranAsync();
|
||||
|
||||
@@ -280,6 +291,8 @@ namespace Tnb.WarehouseMgr
|
||||
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
|
||||
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
|
||||
commonCreatePretaskInput.require_id = input.source_id;
|
||||
commonCreatePretaskInput.carry_id = wmsCarryH.id;
|
||||
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
|
||||
|
||||
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
|
||||
|
||||
@@ -303,7 +316,7 @@ namespace Tnb.WarehouseMgr
|
||||
finally
|
||||
{
|
||||
_ = s_taskExecuteSemaphore.Release();
|
||||
await InvokeGenPretaskExcute();
|
||||
InvokeGenPretaskExcute();
|
||||
}
|
||||
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
@@ -321,12 +334,221 @@ namespace Tnb.WarehouseMgr
|
||||
Logger.LogWarning($"【ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码");
|
||||
return;
|
||||
}
|
||||
// 更新已转数量
|
||||
bool isOk = await _db.Updateable<WmsMaterialTransferD>().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCode.codeqty })
|
||||
.Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
|
||||
if (!isOk)
|
||||
|
||||
// 如果所有明细已完成 更新主表状态为完成
|
||||
WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable<WmsMaterialTransferD>().Where(r => r.id == input.requireId).SingleAsync();
|
||||
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>()
|
||||
.Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList();
|
||||
bool isOk2 = true;
|
||||
if (wmsMaterialTransferDs.Count == 0)
|
||||
{
|
||||
isOk2 = await _db.Updateable<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
|
||||
.Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync();
|
||||
}
|
||||
|
||||
|
||||
if (!isOk || !isOk2)
|
||||
{
|
||||
throw Oops.Oh(ErrorCode.COM1001);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 中储仓下发到二楼暂存仓
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="AppFriendlyException"></exception>
|
||||
[HttpPost, NonUnify, AllowAnonymous]
|
||||
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> DistributeToZCC(MaterialTransferDistributeToZCCInput input)
|
||||
{
|
||||
s_taskDistributeToZCC.Wait();
|
||||
|
||||
try
|
||||
{
|
||||
WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable<WmsMaterialTransfer>().Where(r => r.id == input.source_id).First();
|
||||
if (wmsMaterialTransfer == null)
|
||||
{
|
||||
Logger.LogWarning($"不存在id为{input.source_id}的转库单!");
|
||||
throw new AppFriendlyException($"不存在id为{input.source_id}的转库单!", 500);
|
||||
}
|
||||
if (wmsMaterialTransfer.status != WmsWareHouseConst.BILLSTATUS_ADD_ID)
|
||||
{
|
||||
Logger.LogWarning($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓下发到二楼暂存仓任务!");
|
||||
throw new AppFriendlyException($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓下发到二楼暂存仓任务!", 500);
|
||||
}
|
||||
|
||||
List<WmsMaterialTransferD> wmsMaterialTransferds = _db.Queryable<WmsMaterialTransferD>().Where(r => r.bill_id == input.source_id).ToList();
|
||||
|
||||
// 转库单载具子表
|
||||
List<WmsMaterialTransferCarry> wmsMaterialTransferCarrys = new List<WmsMaterialTransferCarry>();
|
||||
|
||||
foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds)
|
||||
{
|
||||
//出库取起点,获取所有符合输入的载具规格的载具
|
||||
OutStockStrategyQuery OutStockStrategyInput = new()
|
||||
{
|
||||
warehouse_id = "2",
|
||||
material_id = wmsMaterialTransferD.material_id,
|
||||
code_batch = wmsMaterialTransferD.code_batch
|
||||
};
|
||||
List<WmsCarryH>? carrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput);
|
||||
|
||||
// 需要转库数量
|
||||
decimal? needOut = wmsMaterialTransferD.qty;
|
||||
|
||||
foreach (WmsCarryH wmsCarryH in carrys)
|
||||
{
|
||||
if (needOut <= 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
WmsCarryCode wmsCarryCode = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).First();
|
||||
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();
|
||||
|
||||
// 转库单载具子表
|
||||
WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry();
|
||||
wmsMaterialTransferCarry.bill_id = input.source_id;
|
||||
wmsMaterialTransferCarry.carry_id = wmsCarryH.id;
|
||||
wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code;
|
||||
wmsMaterialTransferCarry.create_id = input.create_id;
|
||||
wmsMaterialTransferCarry.create_time = DateTime.Now;
|
||||
wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id;
|
||||
wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code;
|
||||
wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id;
|
||||
wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code;
|
||||
wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id;
|
||||
wmsMaterialTransferCarry.qty = wmsCarryCode.codeqty;
|
||||
wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry);
|
||||
}
|
||||
|
||||
if (needOut > 0)
|
||||
{
|
||||
throw new AppFriendlyException($"物料{wmsMaterialTransferD.material_code}没有足够的库存!,缺失数量为{needOut}", 500);
|
||||
}
|
||||
}
|
||||
|
||||
await _db.Ado.BeginTranAsync();
|
||||
|
||||
await _db.Updateable<WmsMaterialTransfer>().SetColumns(r => new WmsMaterialTransfer
|
||||
{
|
||||
status = WmsWareHouseConst.BILLSTATUS_ON_ID,
|
||||
carry_count = wmsMaterialTransferCarrys.Count,
|
||||
remainbindracknum = wmsMaterialTransferCarrys.Count
|
||||
}).Where(r => r.id == input.source_id).ExecuteCommandAsync();
|
||||
Logger.LogInformation($"【DistributeToZCC】更新转库单{wmsMaterialTransfer.bill_code}主表的数据");
|
||||
|
||||
await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync();
|
||||
Logger.LogInformation($"【DistributeToZCC插入转库单{wmsMaterialTransfer.bill_code}载具表的数据");
|
||||
|
||||
foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys)
|
||||
{
|
||||
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
|
||||
commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id;
|
||||
commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id;
|
||||
commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id;
|
||||
commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code;
|
||||
commonCreatePretaskInput.task_type = WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID;
|
||||
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
|
||||
commonCreatePretaskInput.require_id = wmsMaterialTransferCarry.mat_bill_id;
|
||||
commonCreatePretaskInput.isExcuteMission = false;
|
||||
|
||||
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
|
||||
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
|
||||
{
|
||||
Logger.LogInformation($"【DistributeToZCC生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}");
|
||||
throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500);
|
||||
}
|
||||
|
||||
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync();
|
||||
}
|
||||
Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功");
|
||||
|
||||
|
||||
await _db.Ado.CommitTranAsync();
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
Logger.LogError("【DistributeToZCC】" + ex.Message);
|
||||
Logger.LogError("【DistributeToZCC】" + ex.StackTrace);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
s_taskDistributeToZCC.Release();
|
||||
InvokeGenPretaskExcute();
|
||||
}
|
||||
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> 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
|
||||
{
|
||||
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 = "";
|
||||
|
||||
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
|
||||
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
|
||||
{
|
||||
Logger.LogInformation($"【CallRackToProductionLine】生成预任务失败 载具 {wmsCarryH.carry_code}");
|
||||
throw new AppFriendlyException($"生成预任务失败 载具 {wmsCarryH.carry_code}", 500);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("【CallRackToProductionLine】" + ex.Message);
|
||||
Logger.LogError("【CallRackToProductionLine】" + ex.StackTrace);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
|
||||
}
|
||||
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ using Tnb.BasicData;
|
||||
using Tnb.BasicData.Entities;
|
||||
using Tnb.ProductionMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Attributes;
|
||||
using Tnb.WarehouseMgr.Entities.Consts;
|
||||
using Tnb.WarehouseMgr.Entities.Dto;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
@@ -27,8 +28,10 @@ using Tnb.WarehouseMgr.Interfaces;
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
[OverideVisualDev(ModuleConsts.MODULE_WMSPRDINSTOCK_ID)]
|
||||
[ServiceModule(BizTypeId)]
|
||||
public class WmsPrdInstockHService : BaseWareHouseService
|
||||
{
|
||||
private const string BizTypeId = "34467501190677";
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IRunService _runService;
|
||||
private readonly IVisualDevService _visualDevService;
|
||||
|
||||
@@ -154,7 +154,7 @@ namespace Tnb.WarehouseMgr
|
||||
decimal canOutstockQty = items.Sum(r => r.Item3.codeqty).ParseToDecimal();
|
||||
if (canOutstockQty < input.qty)
|
||||
{
|
||||
throw new AppFriendlyException($@"当前可出库数量只有 {canOutstockQty}", 500);
|
||||
throw new AppFriendlyException($@"当前可出库数量只有 {canOutstockQty.ToString("G")}", 500);
|
||||
}
|
||||
|
||||
List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>> items_sorttask = items.Where(r => r.Item1 == "分拣任务").ToList();
|
||||
|
||||
Reference in New Issue
Block a user