From be00d09facea8aee1ddddc50a03340bbaa78e467 Mon Sep 17 00:00:00 2001 From: zhou keda <1315948824@qq.com> Date: Mon, 26 Aug 2024 18:46:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A1=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/PrdMoTask.cs | 4 ++ .../Helpers/TimerPoolHelper.cs | 12 ++-- .../Tnb.ProductionMgr/PrdMoTaskService.cs | 68 ++++++++++++++++++- QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs | 20 ++++++ .../Enums/EnumTriggerType.cs | 6 +- QcMgr/Tnb.QcMgr/QcCheckTaskService.cs | 25 ++++++- 6 files changed, 127 insertions(+), 8 deletions(-) diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs index 472d6627..3b6d226a 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs @@ -241,4 +241,8 @@ public partial class PrdMoTask : BaseEntity /// public string nightshiftafter_worker_id { get; set; } + /// + /// 定时任务key + /// + public string timer_key { get; set; } } diff --git a/ProductionMgr/Tnb.ProductionMgr/Helpers/TimerPoolHelper.cs b/ProductionMgr/Tnb.ProductionMgr/Helpers/TimerPoolHelper.cs index 07f1f23a..c42873cb 100644 --- a/ProductionMgr/Tnb.ProductionMgr/Helpers/TimerPoolHelper.cs +++ b/ProductionMgr/Tnb.ProductionMgr/Helpers/TimerPoolHelper.cs @@ -27,7 +27,7 @@ namespace Tnb.ProductionMgr.Helpers // 初始化代码,如果有必要的话 } - public void StartTimer(TimerCallback timerCallback,object data,TimeSpan dueTime, TimeSpan period) + public void StartTimer(TimerCallback timerCallback,object data,TimeSpan dueTime, TimeSpan period,bool autoClode = true) { Timer timer; lock (_lockObject) @@ -36,16 +36,19 @@ namespace Tnb.ProductionMgr.Helpers Dictionary dic = new Dictionary(); dic.Add("key",timestamp); dic.Add("value",data); - timerCallback += DisposeTimer; + if (autoClode) + { + timerCallback += DisposeTimer; + } timer = new Timer(timerCallback, dic, dueTime, period); _timers.Add(timestamp,timer); } } - private void DisposeTimer(object args) + public void DisposeTimer(object args) { Dictionary dic = (Dictionary)args; - string key = dic["key"].ToString(); + string key = dic["key"]!=null ? dic["key"].ToString() : ""; if (_timers.ContainsKey(key)) { _timers[dic["key"].ToString()].Dispose(); @@ -53,5 +56,6 @@ namespace Tnb.ProductionMgr.Helpers _timers.Remove(dic["key"].ToString()); } } + } } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index f35df649..8de1b503 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -1247,6 +1247,23 @@ namespace Tnb.ProductionMgr await _qcCheckPlanService.CreateTask(entity); } } + + if (behavior == PrdTaskBehavior.Start) + { + TimerPoolHelper.GetInstance().StartTimer(TimeCallback2,prdTaskList.Where(p => p.mo_task_status == "Pause" || p.mo_task_status == "ToBeStarted").ToList(),TimeSpan.FromHours(2),Timeout.InfiniteTimeSpan,false); + } + + if (behavior == PrdTaskBehavior.Pause) + { + foreach (PrdMoTask? task in prdTaskList.Where(p => p.mo_task_status == "ToBeStarted").ToList()) + { + TimerPoolHelper.GetInstance().DisposeTimer(new Dictionary() + { + ["key"] = task.timer_key + }); + } + } + #endregion foreach (PrdMoTask item in prdTaskList) @@ -1589,8 +1606,14 @@ namespace Tnb.ProductionMgr { Dictionary dic = (Dictionary)args; List prdTaskList = (List)(dic["value"]); + await _db.Ado.BeginTranAsync(); foreach (PrdMoTask? task in prdTaskList) { + ToolMolds toolMolds = await _db.Queryable().SingleAsync(x=>x.id==task.mold_id); + await _db.Updateable() + .SetColumns(x => x.timer_key == dic["key"]) + .Where(x => x.id == task.id) + .ExecuteCommandAsync(); TriggerPlanEntity entity = new() { materialid = task.material_id, @@ -1598,7 +1621,44 @@ namespace Tnb.ProductionMgr workid = task.workstation_id, triggerevent = EnumTriggerEvent.开工首件检, mo_task_code = task.mo_task_code, - check_type = WmsWareHouseConst.FULLREVIEW_CODE + newpronum = toolMolds?.mold_cavity + // check_type = WmsWareHouseConst.FULLREVIEW_CODE + }; + await _qcCheckPlanService.CreateTask(entity); + } + + await _db.Ado.CommitTranAsync(); + Console.WriteLine("质检任务生成成功"); + } + catch (Exception e) + { + await _db.Ado.RollbackTranAsync(); + Log.Error("质检任务生成失败:"+e.Message,e); + } + } + + public async void TimeCallback2(object args) + { + try + { + Dictionary dic = (Dictionary)args; + List prdTaskList = (List)(dic["value"]); + foreach (PrdMoTask? task in prdTaskList) + { + ToolMolds toolMolds = await _db.Queryable().SingleAsync(x=>x.id==task.mold_id); + await _db.Updateable() + .SetColumns(x => x.timer_key == dic["key"]) + .Where(x => x.id == task.id) + .ExecuteCommandAsync(); + TriggerPlanEntity entity = new() + { + materialid = task.material_id, + processid = task.process_id, + workid = task.workstation_id, + triggerevent = EnumTriggerEvent.巡检, + mo_task_code = task.mo_task_code, + newpronum = toolMolds?.mold_cavity + // check_type = WmsWareHouseConst.FULLREVIEW_CODE }; await _qcCheckPlanService.CreateTask(entity); } @@ -1860,6 +1920,11 @@ namespace Tnb.ProductionMgr .Where(x => x.id == prdMoTask.id) .ExecuteCommandAsync(); + TimerPoolHelper.GetInstance().DisposeTimer(new Dictionary() + { + ["key"] = prdMoTask.timer_key + }); + ToolMolds toolMolds = await db.Queryable().SingleAsync(x=>x.id==prdMoTask.mold_id); TriggerPlanEntity entity = new() { materialid = prdMoTask.material_id, @@ -1871,6 +1936,7 @@ namespace Tnb.ProductionMgr report_id = report.id, batch = report.batch, plan_check_type = WmsWareHouseConst.MOJIAN_ID, + newpronum = toolMolds?.mold_cavity, }; await _qcCheckPlanService.CreateTask(entity); } diff --git a/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs b/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs index 7f49016a..72d51bd5 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs @@ -20,6 +20,15 @@ public int? qty { get; set; } public string bill_code { get; set; } public string equip_name { get; set; } + /// + /// 物料规格 + /// + public string? material_specification { get; set; } + + /// + /// 物料型号 + /// + public string? material_standard { get; set; } } public class CheckTaskOut @@ -168,6 +177,7 @@ public string? result { get; set; } public List>? checktypes { get; set; } + public CheckCarry carryInfo { get; set; } } public class Checktype { @@ -186,5 +196,15 @@ public PostItemForm? postItemForm { get; set; } public string? result { get; set; } } + + public class CheckCarry + { + public string carry_name { get; set; } + public string location_id { get; set; } + public string location_code { get; set; } + public string is_check { get; set; } + public string material_name { get; set; } + public decimal qty { get; set; } + } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs index 38e6964b..1038100e 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs @@ -41,7 +41,11 @@ namespace Tnb.QcMgr.Entities.Enums [Remark("首检", "开工检")] 开工首件检 = 15, [Remark("末检", "末检触发事件")] - 末检质检方案 = 16 + 末检质检方案 = 16, + [Remark("巡检", "巡检")] + 巡检 = 17, + [Remark("巡检", "巡检")] + 注塑特殊产品工序检 = 18, } public class RemarkAttribute : Attribute { diff --git a/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs b/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs index 32ee9afe..e31256ad 100644 --- a/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs +++ b/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using Tnb.BasicData.Entities; +using Tnb.EquipMgr.Entities; using Tnb.ProductionMgr.Entities.Dto.PrdManage; using Tnb.QcMgr.Entities; using Tnb.QcMgr.Interfaces; @@ -83,11 +84,13 @@ namespace Tnb.QcMgr .LeftJoin((a, b, c, d) => a.workid == d.Id) .LeftJoin((a, b, c, d, e) => a.execuser == e.Id) .LeftJoin((a,b,c,d,e,f)=>a.report_id==f.id) + .LeftJoin((a,b,c,d,e,f,g)=>a.mo_task_code==g.mo_task_code) + .LeftJoin((a,b,c,d,e,f,g,h)=>g.eqp_id==h.id) .WhereIF(!string.IsNullOrEmpty(materialid), (a, b, c, d,e) => b.name.Contains(materialid)) .WhereIF(!string.IsNullOrEmpty(checktype), (a, b, c, d, e) => a.checktype == checktype) .WhereIF(!string.IsNullOrEmpty(status), (a, b, c, d, e) => a.status == status) .Where((a, b, c, d, e) => a.status == list.Where(p => p.FullName == "待执行").First().Id) - .Select((a, b, c, d, e,f) => new QcCheckExecHOut + .Select((a, b, c, d, e,f,g,h) => new QcCheckExecHOut { id = a.id, materialid = b.name, @@ -103,7 +106,10 @@ namespace Tnb.QcMgr execuser = e.RealName ?? "", mo_task_code = a.mo_task_code, batch = a.batch, - qty = a.qty + qty = a.qty, + material_standard = b.material_standard, + material_specification = b.material_specification, + equip_name = h.name, }).OrderByDescending(a => DateTime.Parse(a.tasktime)).ToPagedListAsync(input.currentPage, input.pageSize); foreach (QcCheckExecHOut? item in result.list) { @@ -408,6 +414,21 @@ namespace Tnb.QcMgr checktypes = new List>(), result = QcCheckExecH.result }; + if (!string.IsNullOrEmpty(QcCheckExecH.carry_code)) + { + WmsCarryH carryH = await db.Queryable().FirstAsync(x => x.carry_code == QcCheckExecH.carry_code); + WmsCarryCode carryCode = await db.Queryable().FirstAsync(x => x.carry_id == carryH.id); + string materialId = carryCode?.id ?? ""; + BasMaterial basMaterial = await db.Queryable().SingleAsync(x=>x.id==materialId); + Result.carryInfo = new CheckCarry() + { + carry_name = carryH.carry_name, + location_id = carryH.location_id, + location_code = carryH.location_code, + material_name = basMaterial?.name, + qty = carryCode?.codeqty ?? 0, + }; + } List groupkeys = QcCheckExecDs.Select(p => p.checkindex).Distinct().ToList(); foreach (string? key in groupkeys) {