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

This commit is contained in:
2024-09-24 17:13:56 +08:00
13 changed files with 759 additions and 11 deletions

View File

@@ -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);
/// <summary>
/// AGV到电梯任务
/// </summary>
@@ -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<string> elevatorAreas = repository.CopyNew().Queryable<WmsElevatorH>().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<PrdMoTask> prdMoTasks = await db_WmsMaterialkit.Queryable<PrdMoTask>().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<PrdMoTask> 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<WmsMaterialkitRecordH>().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<WmsMaterialkitRecordH>().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<BasMaterial>().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<BasMbom>().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<BasMbomInput> basMbomInputs = await db_WmsMaterialkit.Queryable<BasMbomInput>().Where(r => r.mbom_id == basMbom.id).ToListAsync();
List<BasMaterial> materials = await db_WmsMaterialkit.Queryable<BasMaterial>().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<WmsMaterialkitRecordD> wmsMaterialkitRecordDs = new List<WmsMaterialkitRecordD>();
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<WmsMaterialkitRecordH> wmsMaterialkitRecordHs = await db_WmsMaterialkit.Queryable<WmsMaterialkitRecordH>().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<WmsCarryH>()
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
.InnerJoin<BasMaterial>((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<WmsPretaskH>()
.InnerJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
.InnerJoin<WmsCarryCode>((a, b, c) => c.carry_id == b.id)
.InnerJoin<BasMaterial>((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<WmsCarryH>()
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
.InnerJoin<BasMaterial>((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<customInventoryEntity> inventory = new List<customInventoryEntity>();
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; }
}
}
}

View File

@@ -348,6 +348,10 @@
/// </summary>
public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "34354738929685";
/// <summary>
/// 预任务生成业务类型-物料齐套配送记录 todo
/// </summary>
public const string BIZTYPE_WmsMaterialkitRecordHService_ID = "WmsMaterialkitRecordHService";
/// <summary>
/// 预任务生成业务类型-调拨出库单(原材料)
/// </summary>
public const string BIZTYPE_WmsRawmatTransferoutstock_ID = "36318854044437";

View File

@@ -0,0 +1,112 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 物料齐套配送记录明细
/// </summary>
[SugarTable("wms_materialkit_record_d")]
public partial class WmsMaterialkitRecordD : BaseEntity<string>
{
public WmsMaterialkitRecordD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 记录表id
/// </summary>
public string? bill_id { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string? material_name { get; set; }
/// <summary>
/// 规格型号
/// </summary>
public string? material_specification { get; set; }
/// <summary>
/// 单位
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 计划数量
/// </summary>
public decimal? plan_qty { get; set; }
/// <summary>
/// 已下发数量
/// </summary>
public decimal? yxf_qty { get; set; }
/// <summary>
/// 分子
/// </summary>
public decimal? molecule { get; set; }
/// <summary>
/// 分母
/// </summary>
public decimal? denominator { get; set; }
/// <summary>
/// 状态
/// </summary>
public string? status { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? start_time { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? end_time { get; set; }
/// <summary>
/// 运行次数
/// </summary>
public int? times { get; set; }
/// <summary>
/// 运行总时长(毫秒)
/// </summary>
public int? total_time { get; set; }
}

View File

@@ -0,0 +1,127 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 物料齐套配送记录表
/// </summary>
[SugarTable("wms_materialkit_record_h")]
public partial class WmsMaterialkitRecordH : BaseEntity<string>
{
public WmsMaterialkitRecordH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 记录单号
/// </summary>
public string? bill_code { get; set; }
/// <summary>
/// 任务单id
/// </summary>
public string? mo_task_id { get; set; }
/// <summary>
/// 任务单号
/// </summary>
public string? mo_task_code { get; set; }
/// <summary>
/// 生产bom id
/// </summary>
public string? bom_id { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string? material_name { get; set; }
/// <summary>
/// 规格型号
/// </summary>
public string? material_specification { get; set; }
/// <summary>
/// 单位
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 数量
/// </summary>
public decimal? qty { get; set; }
/// <summary>
/// 产线id
/// </summary>
public string? workline_id { get; set; }
/// <summary>
/// 状态(开始 执行中 完成)
/// </summary>
public string? status { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? start_time { get; set; }
/// <summary>
/// 完成时间
/// </summary>
public DateTime? complete_time { get; set; }
/// <summary>
/// 运行次数
/// </summary>
public int? times { get; set; }
/// <summary>
/// 运行总时长(毫秒)
/// </summary>
public int? total_time { get; set; }
}

View File

@@ -0,0 +1,122 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 物料齐套配送详情
/// </summary>
[SugarTable("wms_materialkit_record_t")]
public partial class WmsMaterialkitRecordT : BaseEntity<string>
{
public WmsMaterialkitRecordT()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 记录表id
/// </summary>
public string? bill_id { get; set; }
/// <summary>
/// 记录明细id
/// </summary>
public string? bill_d_id { get; set; }
/// <summary>
/// 转库单id
/// </summary>
public string? materialtransfer_id { get; set; }
/// <summary>
/// 转库单单号
/// </summary>
public string? materialtransfer_billcode { get; set; }
/// <summary>
/// 转库单明细id
/// </summary>
public string? materialtransfer_d_id { get; set; }
/// <summary>
/// 下发前数量
/// </summary>
public decimal? oldqty { get; set; }
/// <summary>
/// 下发后数量
/// </summary>
public decimal? newqty { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string? material_name { get; set; }
/// <summary>
/// 规格型号
/// </summary>
public string? material_specification { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 单位
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 下发数量
/// </summary>
public decimal? xf_qty { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? start_time { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? end_time { get; set; }
/// <summary>
/// 运行时长(毫秒)
/// </summary>
public int? total_time { get; set; }
}

View File

@@ -160,4 +160,8 @@ public partial class WmsPurchaseH : BaseEntity<string>, IPurchaseAndSaleAuitEnti
/// </summary>
public string erp_arriveorder_pk { get;set; }
/// <summary>
/// 制单方式(自制 同步)
/// </summary>
public string make_method { get; set; }
}

View File

@@ -573,7 +573,8 @@ namespace Tnb.WarehouseMgr
#region
WmsPretaskH curWmsPretaskH = await _db.Queryable<WmsPretaskH>().Where(r => r.bill_code == wmsDistaskH.pretask_code).FirstAsync();
List<WmsPretaskH> nextWmsPretaskHs = _db.Queryable<WmsPretaskH>().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<WmsPretaskH>().Where(r => r.bill_code == wmsDistaskH.pretask_code).FirstAsync();
List<WmsPretaskH> nextWmsPretaskHs = _db.Queryable<WmsPretaskH>().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<WmsDistaskH> elevatorTasks = _db.Queryable<WmsDistaskH>()
.Where(r => r.startlocation_code.Contains($"DT") && r.endlocation_code.Contains($"DT") && r.act_start_date == null && r.act_end_date == null
.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;

View File

@@ -304,7 +304,10 @@ namespace Tnb.WarehouseMgr
int index = 0;
items.ForEach(x =>
{
if (x.carry_code == "TP0599")
{
}
index++;
WmsCarryStockReportExcel wmsCarryStockReportCode = x.Adapt<WmsCarryStockReportExcel>();
wmsCarryStockReportCode.index = index;

View File

@@ -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<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
@@ -1028,7 +1027,7 @@ namespace Tnb.WarehouseMgr
if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID)
{
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>()
.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<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
@@ -1039,7 +1038,7 @@ namespace Tnb.WarehouseMgr
else
{
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>()
.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<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })

View File

@@ -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<WmsCarryH> 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;
}
}
}

View File

@@ -71,7 +71,10 @@ namespace Tnb.WarehouseMgr
WmsPurchaseD wmsPurchaseD = await _db.Queryable<WmsPurchaseD>().SingleAsync(x => x.id == id);
string purchaseHId = wmsPurchaseD?.bill_id ?? "";
WmsPurchaseH wmsPurchaseH = await _db.Queryable<WmsPurchaseH>().SingleAsync(x => x.id == purchaseHId);
if (wmsPurchaseH.make_method == "自制")
{
throw Oops.Bah("自制采购收货单不需要操作此按钮");
}
#region
string? create_id = _userManager.User.Id;
@@ -282,6 +285,7 @@ namespace Tnb.WarehouseMgr
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message,e);
throw Oops.Bah(e.Message);
}
return "保存成功";

View File

@@ -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<WmsPurchaseD>, 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;
}
/// <summary>
/// 保存工序工位关联表
/// </summary>
[HttpPost]
public async Task<dynamic> 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<WmsPurchaseH>().SetColumns(r => r.make_method == "自制").Where(r => r.id == id).ExecuteCommandAsync();
}
else
{
await _db.Updateable<WmsPurchaseH>().SetColumns(r => r.make_method == "同步").Where(r => r.id == id).ExecuteCommandAsync();
}
return "保存成功";
}
private async Task<dynamic> xxx(VisualDevModelDataCrInput input)
@@ -106,6 +131,11 @@ namespace Tnb.WarehouseMgr
var blFlag = true;
try
{
WmsPurchaseH wmsPurchaseH = await _db.Queryable<WmsPurchaseH>().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);

View File

@@ -460,7 +460,7 @@ namespace JNPF.VisualDev
async Task<dynamic> 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;