From 1007c7c23d3fa83d6a35ce41cad94bec243530a5 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Tue, 24 Sep 2024 12:04:40 +0800
Subject: [PATCH] =?UTF-8?q?=E9=BD=90=E5=A5=97=E7=AD=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Tnb.ProductionMgr/RedisBackGround.cs | 280 +++++++++++++++++-
.../Consts/WmsWareHouseConst.cs | 4 +
.../Entity/WmsMaterialkitRecordD.cs | 112 +++++++
.../Entity/WmsMaterialkitRecordH.cs | 127 ++++++++
.../Entity/WmsMaterialkitRecordT.cs | 122 ++++++++
.../Entity/WmsPurchaseH.cs | 4 +
.../Tnb.WarehouseMgr/DeviceProviderService.cs | 10 +-
.../WmsCarryStockReportService.cs | 3 +
.../WmsMaterialTransferService.cs | 5 +-
.../WmsMaterialkitRecordHService.cs | 63 ++++
.../Tnb.WarehouseMgr/WmsPurchaseDService.cs | 6 +-
.../Tnb.WarehouseMgr/WmsPurchaseService.cs | 32 +-
.../VisualDevModelDataService.cs | 2 +-
13 files changed, 759 insertions(+), 11 deletions(-)
create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordD.cs
create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs
create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordT.cs
create mode 100644 WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialkitRecordHService.cs
diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
index 5e5810c8..e2cce63a 100644
--- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
@@ -36,6 +36,8 @@ using Org.BouncyCastle.Asn1.X509.Qualified;
using Qiniu.Util;
using Senparc.CO2NET.Helpers.Serializers;
using SqlSugar;
+using Tnb.BasicData;
+
//using Swashbuckle.AspNetCore.SwaggerGen;
using Tnb.BasicData.Entities;
using Tnb.Common.Extension;
@@ -95,6 +97,8 @@ namespace Tnb.ProductionMgr
private static Timer? F2KTPsupplementtimer;
// 原材料仓内转移
private static Timer? YCLInternalTransfertimer;
+ // 生成物料齐套配送计划
+ private static Timer? WmsMaterialkittimer;
// 电梯
private static Timer? elevatorTimer;
@@ -118,6 +122,8 @@ namespace Tnb.ProductionMgr
public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1);
public SemaphoreSlim s_taskF2KTPsupplement = new(1);
public SemaphoreSlim s_taskYCLInternalTransfer = new(1);
+ public SemaphoreSlim s_taskWmsMaterialkit = new(1);
+
///
/// AGV到电梯任务
///
@@ -144,6 +150,7 @@ namespace Tnb.ProductionMgr
private ISqlSugarClient db_Floor4DMC2CPK;
private ISqlSugarClient db_F2KTPsupplement;
private ISqlSugarClient db_YCLInternalTransfer;
+ private ISqlSugarClient db_WmsMaterialkit;
@@ -202,6 +209,7 @@ namespace Tnb.ProductionMgr
db_Floor4DMC2CPK = repository.CopyNew();
db_F2KTPsupplement = repository.CopyNew();
db_YCLInternalTransfer = repository.CopyNew();
+ db_WmsMaterialkit = repository.CopyNew();
List elevatorAreas = repository.CopyNew().Queryable().Select(r => r.area_code).Distinct().ToList();
foreach (var s_elevatorArea in elevatorAreas)
@@ -2700,7 +2708,233 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
}
}
#endregion
+ // 物料齐套配送记录
+ private async void WmsMaterialkit(object? args)
+ {
+ if (s_taskWmsMaterialkit.CurrentCount == 0)
+ return;
+ await s_taskWmsMaterialkit.WaitAsync();
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+ try
+ {
+ Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行生成物料齐套配送记录");
+ LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行生成物料齐套配送记录");
+ List prdMoTasks = await db_WmsMaterialkit.Queryable().Where(r => r.mo_task_status == DictConst.InProgressEnCode
+ && !string.IsNullOrEmpty(r.parent_id)).ToListAsync();
+ LoggerWmsMaterialkit.LogInformation($"查找到进行中的任务单:{string.Join(',', prdMoTasks.Select(r => r.mo_task_code))}");
+ foreach (PrdMoTask prdMoTask in prdMoTasks)
+ {
+ List rep_prdMoTasks = prdMoTasks.Where(r => r.workline_id == prdMoTask.workline_id && r.id != prdMoTask.id).ToList();
+ if (rep_prdMoTasks.Count() > 0)
+ {
+ LoggerWmsMaterialkit.LogWarning($"存在与任务单{prdMoTask.mo_task_code}相同产线的状态为进行中的任务单{string.Join(',', rep_prdMoTasks.Select(r => r.mo_task_code))}");
+ continue;
+ }
+ await db_WmsMaterialkit.Ado.BeginTranAsync();
+
+ WmsMaterialkitRecordH wmsMaterialkitRecordH = await db_WmsMaterialkit.Queryable().Where(r => (r.status == WmsWareHouseConst.BILLSTATUS_ADD_ID || r.status == WmsWareHouseConst.BILLSTATUS_ON_ID)
+ && r.workline_id == prdMoTask.workline_id).FirstAsync();
+ LoggerWmsMaterialkit.LogInformation($"查找任务单{prdMoTask.mo_task_code}的物料配送记录:{JsonConvert.SerializeObject(wmsMaterialkitRecordH)}");
+
+ if (wmsMaterialkitRecordH == null || (wmsMaterialkitRecordH != null && prdMoTask.id != wmsMaterialkitRecordH.mo_task_id))
+ {
+ if (wmsMaterialkitRecordH != null && prdMoTask.id != wmsMaterialkitRecordH.mo_task_id)
+ {
+ LoggerWmsMaterialkit.LogInformation($"取消任务单{prdMoTask.mo_task_code}的旧物料配送记录:{wmsMaterialkitRecordH.bill_code}");
+ // 取消旧物料配送记录
+ await db_WmsMaterialkit.Updateable().SetColumns(r =>
+ new WmsMaterialkitRecordH { status = WmsWareHouseConst.BILLSTATUS_CANCEL_ID, remark = $"由于任务单切换取消 {wmsMaterialkitRecordH.mo_task_code} -> {prdMoTask.mo_task_code}" })
+ .Where(r => r.id == wmsMaterialkitRecordH.id).ExecuteCommandAsync();
+ }
+ // 生成物料配送记录
+ BasMaterial basMaterial = await db_WmsMaterialkit.Queryable().Where(r => r.id == prdMoTask.material_id).FirstAsync();
+ string Code = await _billRullService.GetBillNumber("WmsMaterialkitRecordH");
+ wmsMaterialkitRecordH = new WmsMaterialkitRecordH();
+ wmsMaterialkitRecordH.org_id = WmsWareHouseConst.AdministratorOrgId;
+ wmsMaterialkitRecordH.create_id = WmsWareHouseConst.AdministratorUserId;
+ wmsMaterialkitRecordH.create_time = DateTime.Now;
+ wmsMaterialkitRecordH.bill_code = Code;
+ wmsMaterialkitRecordH.mo_task_id = prdMoTask.id;
+ wmsMaterialkitRecordH.mo_task_code = prdMoTask.mo_task_code;
+ wmsMaterialkitRecordH.bom_id = prdMoTask.bom_id;
+ wmsMaterialkitRecordH.material_id = prdMoTask.material_id;
+ wmsMaterialkitRecordH.material_code = basMaterial.code;
+ wmsMaterialkitRecordH.material_name = basMaterial.name;
+ wmsMaterialkitRecordH.material_specification = basMaterial.material_specification;
+ wmsMaterialkitRecordH.unit_code = prdMoTask.unit_id;
+ wmsMaterialkitRecordH.qty = prdMoTask.scheduled_qty;
+ wmsMaterialkitRecordH.workline_id = prdMoTask.workline_id;
+ wmsMaterialkitRecordH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
+ wmsMaterialkitRecordH.times = 0;
+ wmsMaterialkitRecordH.total_time = 0;
+
+ BasMbom basMbom = await db_WmsMaterialkit.Queryable().Where(r => r.id == prdMoTask.bom_id).FirstAsync();
+ if (basMbom == null)
+ {
+ LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的生产Bom id{prdMoTask.bom_id}找不到对应的生产Bom资料");
+ continue;
+ }
+
+ List basMbomInputs = await db_WmsMaterialkit.Queryable().Where(r => r.mbom_id == basMbom.id).ToListAsync();
+ List materials = await db_WmsMaterialkit.Queryable().Where(r => basMbomInputs.Select(x => x.material_id).Contains(r.id)).ToListAsync();
+ LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的生产Bom{prdMoTask.bom_id}找到对应的生产Bom清单{string.Join(',', basMbomInputs.Select(r => r.material_id))}");
+ List wmsMaterialkitRecordDs = new List();
+ foreach (BasMbomInput input in basMbomInputs)
+ {
+ BasMaterial material = materials.Where(r => r.id == input.material_id).First();
+ if (material == null)
+ {
+ LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的生产Bom id{prdMoTask.bom_id}下的物料id{input.material_id}在物料档案中不存在");
+ continue;
+ }
+ WmsMaterialkitRecordD wmsMaterialkitRecordD = new WmsMaterialkitRecordD();
+ wmsMaterialkitRecordD.create_id = WmsWareHouseConst.AdministratorUserId;
+ wmsMaterialkitRecordD.create_time = DateTime.Now;
+ wmsMaterialkitRecordD.bill_id = wmsMaterialkitRecordH.id;
+ wmsMaterialkitRecordD.material_id = material.id;
+ wmsMaterialkitRecordD.material_code = material.code;
+ wmsMaterialkitRecordD.material_name = material.name;
+ wmsMaterialkitRecordD.material_specification = material.material_specification;
+ wmsMaterialkitRecordD.unit_code = material.unit_id;
+ wmsMaterialkitRecordD.plan_qty = prdMoTask.scheduled_qty * input.denominator / input.molecule;
+ wmsMaterialkitRecordD.yxf_qty = 0;
+ wmsMaterialkitRecordD.molecule = input.molecule;
+ wmsMaterialkitRecordD.denominator = input.denominator;
+ wmsMaterialkitRecordD.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
+ wmsMaterialkitRecordD.times = 0;
+ wmsMaterialkitRecordD.total_time = 0;
+ wmsMaterialkitRecordDs.Add(wmsMaterialkitRecordD);
+ }
+
+ await db_WmsMaterialkit.Insertable(wmsMaterialkitRecordH).ExecuteCommandAsync();
+ await db_WmsMaterialkit.Insertable(wmsMaterialkitRecordDs).ExecuteCommandAsync();
+ LoggerWmsMaterialkit.LogInformation($"生成任务单{prdMoTask.mo_task_code}的新物料配送记录:{wmsMaterialkitRecordH.bill_code}");
+ }
+
+ await db_WmsMaterialkit.Ado.CommitTranAsync();
+ }
+
+ List wmsMaterialkitRecordHs = await db_WmsMaterialkit.Queryable().Where(r => (r.status == WmsWareHouseConst.BILLSTATUS_ADD_ID
+ || r.status == WmsWareHouseConst.BILLSTATUS_ON_ID)).ToListAsync();
+ LoggerWmsMaterialkit.LogInformation($"查找到需要运算的物料配送记录:{JsonConvert.SerializeObject(string.Join(',', wmsMaterialkitRecordHs.Select(r => r.bill_code)))}");
+
+ if (wmsMaterialkitRecordHs.Count == 0)
+ return;
+
+ Stopwatch stopwatch_inv = new Stopwatch();
+ stopwatch_inv.Start();
+ // 暂存仓库存
+ var zccinventory = await db_WmsMaterialkit.Queryable()
+ .InnerJoin((a, b) => a.location_id == b.id)
+ .InnerJoin((a, b, c) => a.id == c.carry_id)
+ .InnerJoin((a, b, c, d) => c.membercarry_id == d.carry_id)
+ .InnerJoin((a, b, c, d, e) => d.material_id == e.id)
+ .Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZCC_ID)
+ .Select((a, b, c, d, e) => new customInventoryEntity
+ {
+ material_id = e.id,
+ material_code = e.code,
+ material_name = e.name,
+ material_specification = e.material_specification,
+ codeqty = d.codeqty,
+ unit_code = d.unit_id
+ }).ToListAsync();
+
+ // 正在配送
+ var inroadinventory = await db_WmsMaterialkit.Queryable()
+ .InnerJoin((a, b) => a.carry_id == b.id)
+ .InnerJoin((a, b, c) => c.carry_id == b.id)
+ .InnerJoin((a, b, c, d) => d.id == c.material_id)
+ .Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
+ && (a.endlocation_id == WmsWareHouseConst.ZZCSSX111011 || a.endlocation_id == WmsWareHouseConst.ZZCSSX111012))
+ .Select((a, b, c, d) => new customInventoryEntity
+ {
+ material_id = d.id,
+ material_code = d.code,
+ material_name = d.name,
+ material_specification = d.material_specification,
+ codeqty = c.codeqty,
+ unit_code = c.unit_id
+ }).ToListAsync();
+
+ // 中储仓库存
+ var inventory_中储 = await db_WmsMaterialkit.Queryable()
+ .InnerJoin((a, b) => a.location_id == b.id)
+ .InnerJoin((a, b, c) => a.id == c.carry_id)
+ .InnerJoin((a, b, c, d) => c.membercarry_id == d.carry_id)
+ .InnerJoin((a, b, c, d, e) => d.material_id == e.id)
+ .Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ .Select((a, b, c, d, e) => new customInventoryEntity
+ {
+ material_id = e.id,
+ material_code = e.code,
+ material_name = e.name,
+ material_specification = e.material_specification,
+ codeqty = d.codeqty,
+ unit_code = d.unit_id
+ }).ToListAsync();
+
+ List inventory = new List();
+ inventory.AddRange(zccinventory);
+ inventory.AddRange(inroadinventory);
+
+ inventory.GroupBy(g => new { g.material_id, g.material_code, g.material_name, g.material_specification, g.unit_code }).Select(g =>
+ {
+ customInventoryEntity newinventory = new customInventoryEntity();
+ newinventory.material_id = g.Key.material_id;
+ newinventory.material_code = g.Key.material_code;
+ newinventory.material_name = g.Key.material_name;
+ newinventory.material_specification = g.Key.material_specification;
+ newinventory.unit_code = g.Key.unit_code;
+ newinventory.codeqty = inventory.Where(r => r.material_id == newinventory.material_id && r.unit_code == newinventory.unit_code).Sum(s => s.codeqty);
+
+ return newinventory;
+ });
+ stopwatch_inv.Stop();
+ LoggerWmsMaterialkit.LogInformation($"中储仓与暂存仓库存查询完成,耗时{stopwatch_inv.ElapsedMilliseconds} ms");
+
+ // 执行暂存仓库存检查与转库单下发
+ foreach (WmsMaterialkitRecordH wmsMaterialkitRecord in wmsMaterialkitRecordHs)
+ {
+ Stopwatch stopwatch2 = new Stopwatch();
+ stopwatch2.Start();
+ await db_WmsMaterialkit.Ado.BeginTranAsync();
+
+
+
+ await db_WmsMaterialkit.Ado.CommitTranAsync();
+ stopwatch2.Stop();
+ LoggerWmsMaterialkit.LogInformation($"物料配送记录{wmsMaterialkitRecord.bill_code}已下发,耗时{stopwatch2.ElapsedMilliseconds} ms");
+ }
+ }
+ catch (ObjectDisposedException ex)
+ {
+ LoggerWmsMaterialkit.LogWarning($"【物料齐套配送】 数据库连接异常:{ex.Message}");
+ LoggerWmsMaterialkit.LogWarning($"【物料齐套配送】 数据库连接异常:{ex.StackTrace}");
+ if (ex.Source == "Npgsql")
+ db_WmsMaterialkit = _repository.AsSugarClient().CopyNew();
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine("【物料齐套配送】" + ex.Message);
+ LoggerWmsMaterialkit.LogWarning($"【物料齐套配送】 {ex.Message}");
+ LoggerWmsMaterialkit.LogWarning($"【物料齐套配送】 {ex.StackTrace}");
+ // 数据库连接断开时会报错
+ try { await db_WmsMaterialkit.Ado.RollbackTranAsync(); } catch { };
+ }
+ finally
+ {
+ s_taskWmsMaterialkit.Release();
+ if (!db_WmsMaterialkit.Ado.Transaction.IsNull())
+ try { await db_WmsMaterialkit.Ado.CommitTranAsync(); } catch { };
+ _wareHouseService.GenTaskExecute();
+ stopwatch.Stop();
+ Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束物料齐套配送记录 {stopwatch.ElapsedMilliseconds} ms");
+ LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束物料齐套配送记录 {stopwatch.ElapsedMilliseconds} ms");
+ }
+ }
public Task StartAsync(CancellationToken cancellationToken)
{
@@ -2740,6 +2974,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
+ //WmsMaterialkittimer = new Timer(WmsMaterialkit, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(3600));
+
return Task.CompletedTask;
}
@@ -2773,7 +3009,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
YCLInternalTransfertimer?.Dispose();
elevatorTimer?.Dispose();
agvelevatorTimer?.Dispose();
-
+ WmsMaterialkittimer?.Dispose();
}
#region 日志
@@ -3197,7 +3433,49 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
return _LoggerYCLInternalTransfer;
}
}
+ protected string _LoggerWmsMaterialkitFileName = "";
+ protected ILogger _LoggerWmsMaterialkit;
+ protected ILogger LoggerWmsMaterialkit
+ {
+ get
+ {
+ string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/齐套配送/custom{DateTime.Now:yyyyMMdd}齐套配送.log";
+ if (_LoggerWmsMaterialkitFileName != 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();
+ };
+
+ }));
+ _LoggerWmsMaterialkit = loggerFactory.CreateLogger(this.GetType());
+ _LoggerWmsMaterialkitFileName = newFileName;
+ }
+ return _LoggerWmsMaterialkit;
+ }
+ }
#endregion
+
+ public class customInventoryEntity
+ {
+ public string material_id { get; set; }
+ public string material_code { get; set; }
+ public string material_name { get; set; }
+ public string material_specification { get; set; }
+ public decimal? codeqty { get; set; }
+ public string unit_code { get; set; }
+ }
}
}
\ No newline at end of file
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
index 792ba745..73db23ef 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
@@ -348,6 +348,10 @@
///
public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "34354738929685";
///
+ /// 预任务生成业务类型-物料齐套配送记录 todo
+ ///
+ public const string BIZTYPE_WmsMaterialkitRecordHService_ID = "WmsMaterialkitRecordHService";
+ ///
/// 预任务生成业务类型-调拨出库单(原材料)
///
public const string BIZTYPE_WmsRawmatTransferoutstock_ID = "36318854044437";
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordD.cs
new file mode 100644
index 00000000..05d37f7e
--- /dev/null
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordD.cs
@@ -0,0 +1,112 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.WarehouseMgr.Entities.Entity;
+
+///
+/// 物料齐套配送记录明细
+///
+[SugarTable("wms_materialkit_record_d")]
+public partial class WmsMaterialkitRecordD : BaseEntity
+{
+ public WmsMaterialkitRecordD()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 创建用户
+ ///
+ public string? create_id { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? create_time { get; set; }
+
+ ///
+ /// 修改用户
+ ///
+ public string? modify_id { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? modify_time { get; set; }
+
+ ///
+ /// 记录表id
+ ///
+ public string? bill_id { get; set; }
+
+ ///
+ /// 物料id
+ ///
+ public string? material_id { get; set; }
+
+ ///
+ /// 物料编码
+ ///
+ public string? material_code { get; set; }
+
+ ///
+ /// 物料名称
+ ///
+ public string? material_name { get; set; }
+
+ ///
+ /// 规格型号
+ ///
+ public string? material_specification { get; set; }
+
+ ///
+ /// 单位
+ ///
+ public string? unit_code { get; set; }
+
+ ///
+ /// 计划数量
+ ///
+ public decimal? plan_qty { get; set; }
+
+ ///
+ /// 已下发数量
+ ///
+ public decimal? yxf_qty { get; set; }
+
+ ///
+ /// 分子
+ ///
+ public decimal? molecule { get; set; }
+
+ ///
+ /// 分母
+ ///
+ public decimal? denominator { get; set; }
+
+ ///
+ /// 状态
+ ///
+ public string? status { get; set; }
+
+ ///
+ /// 开始时间
+ ///
+ public DateTime? start_time { get; set; }
+
+ ///
+ /// 结束时间
+ ///
+ public DateTime? end_time { get; set; }
+
+ ///
+ /// 运行次数
+ ///
+ public int? times { get; set; }
+
+ ///
+ /// 运行总时长(毫秒)
+ ///
+ public int? total_time { get; set; }
+
+}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs
new file mode 100644
index 00000000..6f3d6bd8
--- /dev/null
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs
@@ -0,0 +1,127 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.WarehouseMgr.Entities.Entity;
+
+///
+/// 物料齐套配送记录表
+///
+[SugarTable("wms_materialkit_record_h")]
+public partial class WmsMaterialkitRecordH : BaseEntity
+{
+ public WmsMaterialkitRecordH()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 所属组织
+ ///
+ public string? org_id { get; set; }
+
+ ///
+ /// 修改用户
+ ///
+ public string? modify_id { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? modify_time { get; set; }
+
+ ///
+ /// 创建用户
+ ///
+ public string? create_id { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? create_time { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string? remark { get; set; }
+
+ ///
+ /// 记录单号
+ ///
+ public string? bill_code { get; set; }
+
+ ///
+ /// 任务单id
+ ///
+ public string? mo_task_id { get; set; }
+
+ ///
+ /// 任务单号
+ ///
+ public string? mo_task_code { get; set; }
+
+ ///
+ /// 生产bom id
+ ///
+ public string? bom_id { get; set; }
+
+ ///
+ /// 物料id
+ ///
+ public string? material_id { get; set; }
+
+ ///
+ /// 物料编码
+ ///
+ public string? material_code { get; set; }
+
+ ///
+ /// 物料名称
+ ///
+ public string? material_name { get; set; }
+
+ ///
+ /// 规格型号
+ ///
+ public string? material_specification { get; set; }
+
+ ///
+ /// 单位
+ ///
+ public string? unit_code { get; set; }
+
+ ///
+ /// 数量
+ ///
+ public decimal? qty { get; set; }
+
+ ///
+ /// 产线id
+ ///
+ public string? workline_id { get; set; }
+
+ ///
+ /// 状态(开始 执行中 完成)
+ ///
+ public string? status { get; set; }
+
+ ///
+ /// 开始时间
+ ///
+ public DateTime? start_time { get; set; }
+
+ ///
+ /// 完成时间
+ ///
+ public DateTime? complete_time { get; set; }
+
+ ///
+ /// 运行次数
+ ///
+ public int? times { get; set; }
+
+ ///
+ /// 运行总时长(毫秒)
+ ///
+ public int? total_time { get; set; }
+
+}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordT.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordT.cs
new file mode 100644
index 00000000..bd32bb10
--- /dev/null
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordT.cs
@@ -0,0 +1,122 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.WarehouseMgr.Entities.Entity;
+
+///
+/// 物料齐套配送详情
+///
+[SugarTable("wms_materialkit_record_t")]
+public partial class WmsMaterialkitRecordT : BaseEntity
+{
+ public WmsMaterialkitRecordT()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 创建用户
+ ///
+ public string? create_id { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? create_time { get; set; }
+
+ ///
+ /// 修改用户
+ ///
+ public string? modify_id { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? modify_time { get; set; }
+
+ ///
+ /// 记录表id
+ ///
+ public string? bill_id { get; set; }
+
+ ///
+ /// 记录明细id
+ ///
+ public string? bill_d_id { get; set; }
+
+ ///
+ /// 转库单id
+ ///
+ public string? materialtransfer_id { get; set; }
+
+ ///
+ /// 转库单单号
+ ///
+ public string? materialtransfer_billcode { get; set; }
+
+ ///
+ /// 转库单明细id
+ ///
+ public string? materialtransfer_d_id { get; set; }
+
+ ///
+ /// 下发前数量
+ ///
+ public decimal? oldqty { get; set; }
+
+ ///
+ /// 下发后数量
+ ///
+ public decimal? newqty { get; set; }
+
+ ///
+ /// 物料id
+ ///
+ public string? material_id { get; set; }
+
+ ///
+ /// 物料编码
+ ///
+ public string? material_code { get; set; }
+
+ ///
+ /// 物料名称
+ ///
+ public string? material_name { get; set; }
+
+ ///
+ /// 规格型号
+ ///
+ public string? material_specification { get; set; }
+
+ ///
+ /// 批次
+ ///
+ public string? code_batch { get; set; }
+
+ ///
+ /// 单位
+ ///
+ public string? unit_code { get; set; }
+
+ ///
+ /// 下发数量
+ ///
+ public decimal? xf_qty { get; set; }
+
+ ///
+ /// 开始时间
+ ///
+ public DateTime? start_time { get; set; }
+
+ ///
+ /// 结束时间
+ ///
+ public DateTime? end_time { get; set; }
+
+ ///
+ /// 运行时长(毫秒)
+ ///
+ public int? total_time { get; set; }
+
+}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs
index fea7bbe2..a044e45e 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs
@@ -160,4 +160,8 @@ public partial class WmsPurchaseH : BaseEntity, IPurchaseAndSaleAuitEnti
///
public string erp_arriveorder_pk { get;set; }
+ ///
+ /// 制单方式(自制 同步)
+ ///
+ public string make_method { get; set; }
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
index 2c01924b..7e4fdba0 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
@@ -573,7 +573,8 @@ namespace Tnb.WarehouseMgr
#region 当前任务后续未开始的任务全取消,并解锁库位
WmsPretaskH curWmsPretaskH = await _db.Queryable().Where(r => r.bill_code == wmsDistaskH.pretask_code).FirstAsync();
List nextWmsPretaskHs = _db.Queryable().Where(r => r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID
- && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && r.carry_code == wmsDistaskH.carry_code && long.Parse(r.id) > long.Parse(curWmsPretaskH.id)).ToList();
+ && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && r.carry_code == wmsDistaskH.carry_code && long.Parse(r.id) > long.Parse(curWmsPretaskH.id)
+ && new string[3] { "A", "F", "FC" }.Contains(r.area_code)).ToList();
Logger.Information($"即将取消{wmsDistaskH.bill_code}的后续预任务{nextWmsPretaskHs.Count}条");
foreach (WmsPretaskH wmsPretaskH in nextWmsPretaskHs)
{
@@ -704,7 +705,8 @@ namespace Tnb.WarehouseMgr
#region 当前任务后续未开始的任务全取消,并解锁库位
WmsPretaskH curWmsPretaskH = await _db.Queryable().Where(r => r.bill_code == wmsDistaskH.pretask_code).FirstAsync();
List nextWmsPretaskHs = _db.Queryable().Where(r => r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID
- && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && r.carry_code == wmsDistaskH.carry_code && long.Parse(r.id) > long.Parse(curWmsPretaskH.id)).ToList();
+ && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && r.carry_code == wmsDistaskH.carry_code && long.Parse(r.id) > long.Parse(curWmsPretaskH.id)
+ && new string[3] { "A", "F", "FC" }.Contains(r.area_code)).ToList();
Logger.Information($"即将取消{wmsDistaskH.bill_code}的后续预任务{nextWmsPretaskHs.Count}条");
foreach (WmsPretaskH wmsPretaskH in nextWmsPretaskHs)
{
@@ -836,7 +838,7 @@ namespace Tnb.WarehouseMgr
//根据Agv传递的参数获取,对应的电梯
- if (!input.sourceName.IsNullOrWhiteSpace() && (input.sourceName.Contains("DT-R", StringComparison.OrdinalIgnoreCase)))
+ if (!input.sourceName.IsNullOrWhiteSpace() && (input.sourceName.Contains("DT-", StringComparison.OrdinalIgnoreCase)))
{
Logger.Information($"【TaskCallback】 开始根据任务单查找电梯 {input.sourceName}");
ElevagorInfoQuery q = new() { taskCode = input.taskCode };
@@ -1023,7 +1025,7 @@ namespace Tnb.WarehouseMgr
}
List elevatorTasks = _db.Queryable()
- .Where(r => r.startlocation_code.Contains($"DT") && r.endlocation_code.Contains($"DT") && r.act_start_date == null && r.act_end_date == null
+ .Where(r => r.startlocation_code.Contains($"DT") && r.endlocation_code.Contains($"DT") && r.area_code == wmsElevatorH.area_code && r.act_start_date == null && r.act_end_date == null
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToList();
int eleUpdateRow = 0;
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs
index f8b1ae72..e8120e2e 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs
@@ -304,7 +304,10 @@ namespace Tnb.WarehouseMgr
int index = 0;
items.ForEach(x =>
{
+ if (x.carry_code == "TP0599")
+ {
+ }
index++;
WmsCarryStockReportExcel wmsCarryStockReportCode = x.Adapt();
wmsCarryStockReportCode.index = index;
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
index 75d9e954..e1a89f29 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
@@ -345,7 +345,6 @@ namespace Tnb.WarehouseMgr
material_id = wmsMaterialTransferD.material_id,
code_batch = input.code_batch,
Size = input.palletCount,
- Region_id = WmsWareHouseConst.REGION_Purchase_ID,
PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK
};
List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
@@ -1028,7 +1027,7 @@ namespace Tnb.WarehouseMgr
if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID)
{
List wmsMaterialTransferDs = _db.Queryable()
- .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk < a.yzqty_rk).ToList();
+ .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk <= a.yzqty_rk).ToList();
if (wmsMaterialTransferDs.Count == 0)
{
isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
@@ -1039,7 +1038,7 @@ namespace Tnb.WarehouseMgr
else
{
List wmsMaterialTransferDs = _db.Queryable()
- .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList();
+ .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty <= a.qty).ToList();
if (wmsMaterialTransferDs.Count == 0)
{
isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialkitRecordHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialkitRecordHService.cs
new file mode 100644
index 00000000..fc6fda61
--- /dev/null
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialkitRecordHService.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using JNPF.Common.Core.Manager;
+using JNPF.EventBus;
+using JNPF.Systems.Interfaces.Permission;
+using JNPF.Systems.Interfaces.System;
+using JNPF.VisualDev;
+using JNPF.VisualDev.Interfaces;
+using NPOI.Util;
+using SqlSugar;
+using Tnb.WarehouseMgr.Entities;
+using Tnb.WarehouseMgr.Entities.Attributes;
+using Tnb.WarehouseMgr.Entities.Consts;
+using Tnb.WarehouseMgr.Interfaces;
+
+namespace Tnb.WarehouseMgr
+{
+ [OverideVisualDev(ModuleConsts.MODULE_WMSMATERIALTRANSFER_ID)]
+ [ServiceModule(BizTypeId)]
+ public class WmsMaterialkitRecordHService
+ {
+ private const string BizTypeId = WmsWareHouseConst.BIZTYPE_WmsMaterialkitRecordHService_ID;
+ private readonly ISqlSugarClient _db;
+ private readonly IRunService _runService;
+ private readonly IVisualDevService _visualDevService;
+ private readonly IWareHouseService _wareHouseService;
+ private readonly IBillRullService _billRullService;
+ private readonly IUserManager _userManager;
+ private readonly IWmsCarryBindService _wmsCarryBindService;
+ private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
+ private readonly IOrganizeService _organizeService;
+ private readonly IWmsCarryQueryService _wmsCarryQueryService;
+ public WmsMaterialkitRecordHService(
+ ISqlSugarRepository repository,
+ IRunService runService,
+ IVisualDevService visualDevService,
+ IWareHouseService wareHouseService,
+ IUserManager userManager,
+ IBillRullService billRullService,
+ IEventPublisher eventPublisher,
+ IWmsCarryUnbindService wmsCarryUnbindService,
+ IOrganizeService organizeService,
+ IWmsCarryQueryService wmsCarryQueryService,
+ IWmsCarryBindService wmsCarryBindService)
+ {
+ _db = repository.AsSugarClient();
+ _runService = runService;
+ _visualDevService = visualDevService;
+ _wareHouseService = wareHouseService;
+ _userManager = userManager;
+ _billRullService = billRullService;
+ _wmsCarryBindService = wmsCarryBindService;
+ _wmsCarryUnbindService = wmsCarryUnbindService;
+ _organizeService = organizeService;
+ _wmsCarryQueryService = wmsCarryQueryService;
+ }
+
+
+ }
+}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs
index 639901b3..923c526e 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs
@@ -71,7 +71,10 @@ namespace Tnb.WarehouseMgr
WmsPurchaseD wmsPurchaseD = await _db.Queryable().SingleAsync(x => x.id == id);
string purchaseHId = wmsPurchaseD?.bill_id ?? "";
WmsPurchaseH wmsPurchaseH = await _db.Queryable().SingleAsync(x => x.id == purchaseHId);
-
+ if (wmsPurchaseH.make_method == "自制")
+ {
+ throw Oops.Bah("自制采购收货单不需要操作此按钮");
+ }
#region 插入质检记录
string? create_id = _userManager.User.Id;
@@ -273,6 +276,7 @@ namespace Tnb.WarehouseMgr
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message,e);
+ throw Oops.Bah(e.Message);
}
return "保存成功";
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs
index a8dc5498..0d56efdd 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs
@@ -38,6 +38,8 @@ using Microsoft.AspNetCore.Authorization;
using JNPF.VisualDev.Interfaces;
using JNPF.VisualDev.Entitys;
using Tnb.BasicData.Interfaces;
+using JNPF.Common.Enums;
+using System.Reflection;
namespace Tnb.WarehouseMgr
{
@@ -47,6 +49,7 @@ namespace Tnb.WarehouseMgr
[OverideVisualDev(ModuleConsts.MODULE_WMSPURCHASE_ID)]
public class WmsPurchaseService : WmsPurchaseAndSaleCommonService, IWmsPurchaseService
{
+ private const string ModuleId = "29975280336405";
private readonly IBillRullService _billRullService;
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
@@ -67,10 +70,32 @@ namespace Tnb.WarehouseMgr
_runService = runService;
_thirdApiRecordService = thirdApiRecordService;
_visualDevService = visualDevService;
-
+ OverideFuncs.CreateAsync += Create;
}
+ ///
+ /// 保存工序工位关联表
+ ///
+ [HttpPost]
+ public async Task Create(VisualDevModelDataCrInput visualDevModelDataCrInput)
+ {
+ string purchase_order = visualDevModelDataCrInput.data["erp_bill_code"].ToString();
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true);
+ await _runService.Create(templateEntity, visualDevModelDataCrInput);
+ string id = visualDevModelDataCrInput.data["ReturnIdentity"].ToString();
+ string type = "";
+ if (string.IsNullOrEmpty(purchase_order))
+ {
+ await _db.Updateable().SetColumns(r => r.make_method == "自制").Where(r => r.id == id).ExecuteCommandAsync();
+ }
+ else
+ {
+ await _db.Updateable().SetColumns(r => r.make_method == "同步").Where(r => r.id == id).ExecuteCommandAsync();
+ }
+
+ return "保存成功";
+ }
private async Task xxx(VisualDevModelDataCrInput input)
@@ -106,6 +131,11 @@ namespace Tnb.WarehouseMgr
var blFlag = true;
try
{
+ WmsPurchaseH wmsPurchaseH = await _db.Queryable().Where(r => r.bill_code == input.bill_code).FirstAsync();
+ if (wmsPurchaseH.make_method == "自制")
+ {
+ throw Oops.Bah("自制采购收货单不能操作此按钮");
+ }
await _db.Ado.BeginTranAsync();
WmsInstockH? instock = null;
var purchaseDs = await PurchaseAndSaleUpdate(input);
diff --git a/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs b/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs
index 0a48095a..b51be987 100644
--- a/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs
+++ b/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs
@@ -460,7 +460,7 @@ namespace JNPF.VisualDev
async Task ReportExcel(VisualDevModelListQueryInput input)
{
// 全部页面导出 限制条数
- if (input.dataType == "1") input.pageSize = 9999;
+ if (input.dataType == "1") input.pageSize = 999999;
dynamic reqBody = new ExpandoObject();
CancellationTokenSource Ctu = new();
reqBody.currentPage = input.currentPage;