diff --git a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs new file mode 100644 index 00000000..d1d954fb --- /dev/null +++ b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.QcMgr.Entities.Enums +{ + public enum EnumTriggerType + { + 一次性 = 1, + 周期触发 = 2, + 事件触发 = 3 + } +} diff --git a/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs b/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs index e3c4f2bb..03bdcbaa 100644 --- a/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs +++ b/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs @@ -8,16 +8,22 @@ using System.Threading.Tasks; using Aspose.Cells.Drawing; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; +using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.JsonSerialization; +using JNPF.TaskScheduler; +using JNPF.TaskScheduler.Entitys.Dto.TaskScheduler; +using JNPF.TaskScheduler.Entitys.Model; using JNPF.VisualDev; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using SqlSugar; using Tnb.QcMgr.Entities; using Tnb.QcMgr.Entities.Dto; using Tnb.QcMgr.Entities.Entity; +using Tnb.QcMgr.Entities.Enums; using Tnb.QcMgr.Interfaces; namespace Tnb.QcMgr @@ -31,11 +37,12 @@ namespace Tnb.QcMgr { private readonly ISqlSugarRepository _repository; private readonly IUserManager _userManager; - - public QcCheckPlanService(ISqlSugarRepository repository, IUserManager userManager) + private readonly TimeTaskService _timeTaskService; + public QcCheckPlanService(ISqlSugarRepository repository, IUserManager userManager, TimeTaskService timeTaskService) { _repository = repository; _userManager = userManager; + _timeTaskService = timeTaskService; } /// @@ -190,6 +197,35 @@ namespace Tnb.QcMgr await db.Insertable(QcCheckPlanDs).ExecuteCommandAsync(); await db.Insertable(QcCheckPlanAdd).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); + if (QcCheckPlanAdd.triggertype == ((int)EnumTriggerType.周期触发).ToString()|| QcCheckPlanAdd.triggertype == ((int)EnumTriggerType.一次性).ToString()) + { + var comtentModel = new ContentModel(); + comtentModel.cron = QcCheckPlanAdd.content!.Replace("\"", ""); + comtentModel.interfaceId = ""; + comtentModel.interfaceName = ""; + comtentModel.parameter = new List(); + comtentModel.parameter!.Add(new InterfaceParameter() { field = "id", value = QcCheckPlanAdd.mainid, defaultValue = "" }); + if(QcCheckPlanAdd.triggertype == ((int)EnumTriggerType.一次性).ToString()) + comtentModel.parameter!.Add(new InterfaceParameter() { field = "doonce", value = true.ToString(), defaultValue = "" }); + comtentModel.localHostTaskId = "QcTaskTimeWorker/CreateTask"; + comtentModel.startTime = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + comtentModel.TenantId = _userManager?.TenantId!; + comtentModel.TenantDbName = _userManager?.TenantDbName!; + comtentModel.ConnectionConfig = _userManager?.ConnectionConfig!; + comtentModel.Token = _userManager?.ToKen!; + TimeTaskCrInput timeTaskCrInput = new TimeTaskCrInput() + { + enCode = DateTime.Now.ToString("yyyyMMddHHmmss"), + fullName = "生成质检任务" + QcCheckPlanAdd.mainid, + executeType = "3", + executeContent = comtentModel.ToJsonString(), + description = "", + sortCode = 99, + enabledMark = 1, + }; + await _timeTaskService.DeleteByName(timeTaskCrInput.fullName); + await _timeTaskService.Create(timeTaskCrInput, false); + } } catch (Exception) { diff --git a/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj b/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj index 4c21cfe1..d77af53f 100644 --- a/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj +++ b/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj @@ -8,6 +8,7 @@ + diff --git a/taskschedule/Tnb.TaskScheduler/Listener/QcTaskTimeWorker.cs b/taskschedule/Tnb.TaskScheduler/Listener/QcTaskTimeWorker.cs index 9227c3e7..1b0b300b 100644 --- a/taskschedule/Tnb.TaskScheduler/Listener/QcTaskTimeWorker.cs +++ b/taskschedule/Tnb.TaskScheduler/Listener/QcTaskTimeWorker.cs @@ -8,8 +8,11 @@ using JNPF.Common.Security; using JNPF.Systems.Entitys.System; using JNPF.TaskScheduler; using JNPF.TaskScheduler.Entitys; +using JNPF.TaskScheduler.Entitys.Model; using SqlSugar; +using Tnb.BasicData.Entities; using Tnb.EquipMgr.Entities; +using Tnb.ProductionMgr.Entities; using Tnb.QcMgr.Entities; using Tnb.QcMgr.Entities.Entity; using TimeTaskEntity = JNPF.TaskScheduler.Entitys.TimeTaskEntity; @@ -25,40 +28,69 @@ namespace Tnb.TaskScheduler.Listener [SpareTime("0 0 0 * * ?", "生成质检任务", ExecuteType = SpareTimeExecuteTypes.Serial, StartNow = false)] public async void CreateTask(SpareTimer timer, long count) { - var timeTaskEntity = await repository.AsSugarClient().Queryable().Where(p => p.Id == timer.WorkerName).FirstAsync(); + var timeTaskEntity = await repository.AsSugarClient().Queryable().Where(p => p.Id == timer.WorkerName && p.EnabledMark == 1).FirstAsync(); if (timeTaskEntity == null) return; - var PlanH = await repository.AsQueryable().Where(p => p.id == timeTaskEntity.Description).FirstAsync(); + ContentModel? comtentModel = timeTaskEntity.ExecuteContent.ToObject(); + var PlanH = await repository.AsQueryable().Where(p => p.id == comtentModel.parameter.Where(p => p.field == "id").First().value).FirstAsync(); var PlanDs = await repository.AsSugarClient().Queryable().Where(p => p.mainid == timeTaskEntity.Description).ToListAsync(); if (PlanH == null || PlanDs.Count == 0) return; + var PlanMaterials = repository.AsSugarClient().Queryable().Where(p => p.planid == PlanH.id).Select(p => p.materialid).ToList(); + var PlanProcesss = repository.AsSugarClient().Queryable().Where(p => p.planid == PlanH.id).Select(p => p.processid).ToList(); + var PlanWork = repository.AsSugarClient().Queryable().Where(p => p.planid == PlanH.id).Select(p => p.workid).ToList(); + //物料工序工位不能同时为空 + if (PlanMaterials.Count == 0 && PlanProcesss.Count == 0 && PlanWork.Count == 0) + return; + var PrdMoTasks = await repository.AsSugarClient().Queryable() + .WhereIF(PlanMaterials.Count > 0, p => PlanMaterials.Contains(p.material_id)) + .WhereIF(PlanProcesss.Count > 0, p => PlanProcesss.Contains(p.process_id)) + .WhereIF(PlanWork.Count > 0, p => PlanWork.Contains(p.workstation_id)) + .Where(p => p.mo_task_status == "InProgress")//进行中 + .ToListAsync(); + var DictionaryType = await repository.AsSugarClient().Queryable().Where(p => p.FullName == "质检状态").FirstAsync(); var DictionaryData = await repository.AsSugarClient().Queryable().Where(p => p.DictionaryTypeId == DictionaryType.Id && p.FullName == "待执行").FirstAsync(); - QcCheckExecH qcCheckExecH = new QcCheckExecH(); - qcCheckExecH.id = SnowflakeIdHelper.NextId(); - qcCheckExecH.checktype = PlanH.checktype; - qcCheckExecH.status = DictionaryData.Id; - qcCheckExecH.tasktime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - var ExecDs = new List(); - foreach (var PlanD in PlanDs) + foreach (var PrdMoTask in PrdMoTasks) { - QcCheckExecD QcCheckExecD = new QcCheckExecD(); - QcCheckExecD.mainid = qcCheckExecH.id; - QcCheckExecD.extype = PlanD.extype; - QcCheckExecD.excontent = PlanD.excontent; - QcCheckExecD.check = PlanD.check; - QcCheckExecD.errorcause = PlanD.errorcause; - QcCheckExecD.errorlevel = PlanD.errorlevel; - QcCheckExecD.remark = PlanD.remark; - QcCheckExecD.attachment = PlanD.attachment; - QcCheckExecD.isexec = PlanD.isexec; - QcCheckExecD.custom = PlanD.custom; - QcCheckExecD.typeid = PlanD.typeid; - QcCheckExecD.itemid = PlanD.itemid; - ExecDs.Add(QcCheckExecD); + QcCheckExecH qcCheckExecH = new QcCheckExecH(); + qcCheckExecH.id = SnowflakeIdHelper.NextId(); + qcCheckExecH.checktype = PlanH.checktype; + qcCheckExecH.status = DictionaryData.Id; + qcCheckExecH.tasktime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + qcCheckExecH.materialid = PrdMoTask.material_id; + qcCheckExecH.processid = PrdMoTask.process_id; + qcCheckExecH.workid = PrdMoTask.workstation_id; + var ExecDs = new List(); + foreach (var PlanD in PlanDs) + { + QcCheckExecD QcCheckExecD = new QcCheckExecD(); + QcCheckExecD.mainid = qcCheckExecH.id; + QcCheckExecD.extype = PlanD.extype; + QcCheckExecD.excontent = PlanD.excontent; + QcCheckExecD.check = PlanD.check; + QcCheckExecD.errorcause = PlanD.errorcause; + QcCheckExecD.errorlevel = PlanD.errorlevel; + QcCheckExecD.remark = PlanD.remark; + QcCheckExecD.attachment = PlanD.attachment; + QcCheckExecD.isexec = PlanD.isexec; + QcCheckExecD.custom = PlanD.custom; + QcCheckExecD.typeid = PlanD.typeid; + QcCheckExecD.itemid = PlanD.itemid; + ExecDs.Add(QcCheckExecD); + } + await repository.AsSugarClient().Insertable(qcCheckExecH).ExecuteCommandAsync(); + await repository.AsSugarClient().Insertable(ExecDs).ExecuteCommandAsync(); } - await repository.AsSugarClient().Insertable(qcCheckExecH).ExecuteCommandAsync(); - await repository.AsSugarClient().Insertable(ExecDs).ExecuteCommandAsync(); + //只执行一次的 修改EnabledMark字段 + var InterfaceParameter = comtentModel.parameter.Where(p => p.field == "doonce").FirstOrDefault(); + if (InterfaceParameter != null && bool.Parse(InterfaceParameter.value)) + { + timeTaskEntity.EnabledMark = 0; + await repository.AsSugarClient().Updateable(timeTaskEntity).ExecuteCommandAsync(); + SpareTime.Cancel(timeTaskEntity.Id); + } + } } } diff --git a/taskschedule/Tnb.TaskScheduler/TimeTaskService.cs b/taskschedule/Tnb.TaskScheduler/TimeTaskService.cs index e626badc..b2ad1f7f 100644 --- a/taskschedule/Tnb.TaskScheduler/TimeTaskService.cs +++ b/taskschedule/Tnb.TaskScheduler/TimeTaskService.cs @@ -219,6 +219,25 @@ public class TimeTaskService : ITimeTaskService, IDynamicApiController, ITransie SpareTime.Cancel(entity.Id); } + /// + /// 删除. + /// + /// 名称 + /// + [HttpDelete("{fullName}")] + public async Task DeleteByName(string fullName) + { + var entitys = await _repository.AsQueryable().Where(p=>p.FullName==fullName).ToListAsync(); + foreach (var entity in entitys) + { + var isOk = await _repository.AsUpdateable(entity).CallEntityMethod(m => m.Delete()).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).ExecuteCommandHasChangeAsync(); + if (!isOk) + throw Oops.Oh(ErrorCode.COM1002); + // 从调度器里取消 + SpareTime.Cancel(entity.Id); + } + } + /// /// 停止. /// diff --git a/taskschedule/Tnb.TaskScheduler/Tnb.TaskScheduler.csproj b/taskschedule/Tnb.TaskScheduler/Tnb.TaskScheduler.csproj index 9de6d936..46699d63 100644 --- a/taskschedule/Tnb.TaskScheduler/Tnb.TaskScheduler.csproj +++ b/taskschedule/Tnb.TaskScheduler/Tnb.TaskScheduler.csproj @@ -14,6 +14,7 @@ +