using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aspose.Cells.Drawing; using DingTalk.Api.Request; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Logging; using JNPF.Systems.Interfaces.System; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using StackExchange.Profiling.Internal; using Tnb.BasicData; using Tnb.EquipMgr.Entities; using Tnb.EquipMgr.Entities.Consts; using Tnb.EquipMgr.Entities.Dto; using Tnb.EquipMgr.Interfaces; namespace Tnb.EquipMgr { /// /// 模具维修任务执行 /// [ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 700)] [Route("api/[area]/[controller]/[action]")] public class ToolMoldMaintainPlanRunService : IToolMoldMaintainPlanRunService, IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly IUserManager _userManager; private readonly IDictionaryDataService _dictionaryDataService; public ToolMoldMaintainPlanRunService(ISqlSugarRepository repository, IUserManager userManager, IDictionaryDataService dictionaryDataService) { _db = repository.AsSugarClient(); _userManager = userManager; _dictionaryDataService = dictionaryDataService; } /// /// 根据计划id,获取相关联模具、设备、信息 /// /// /// [HttpGet] public async Task GetMaintainInfoFromByPlanId([FromRoute] string planId) { List result = new(); var planMoldRelations = await _db.Queryable() .LeftJoin((a, b) => a.maintain_plan_id == b.id)//ToolMoldMaintainPlan .LeftJoin((a, b, c) => b.plan_code == c.plan_code) .Where(a => a.maintain_plan_id == planId) .Select((a, b, c) => new { mold_id = a.mold_id, plan_start_time = c.plan_start_time, }) .ToListAsync(); if (planMoldRelations?.Count > 0) { var mids = planMoldRelations.Select(x => x.mold_id).ToList(); var molds = await _db.Queryable().Where(it => mids.Contains(it.id)).ToListAsync(); if (molds?.Count > 0) { for (int i = 0, cnt = molds.Count; i < cnt; i++) { var mold = molds[i]; dynamic info = new ExpandoObject(); info.mold_id = mold.id; info.mold_code = mold.mold_code; info.mold_name = mold.mold_name; info.mold_status = (await _dictionaryDataService.GetInfo(mold.mold_status))?.FullName; info.maintain_qty = mold.maintain_qty; info.plan_start_time = planMoldRelations[i].plan_start_time; var moldEqpRelation = await _db.Queryable().FirstAsync(it => it.mold_id == mold.id); if (moldEqpRelation != null) { var eqp = await _db.Queryable().FirstAsync(it => it.id == moldEqpRelation.equipment_id); info.eqp_code = eqp.code; info.eqp_name = eqp.name; } result.Add(info); } } } return result; } /// /// 根据模具ID获取,保养组及项目信息 /// /// 模具ID /// [HttpGet] public async Task GetCheckItemAndGrpByMoldId([FromRoute] string moldId) { if (moldId.IsNullOrEmpty()) throw new ArgumentException($"parameter {nameof(moldId)} not be null or empty"); { var checkItems = await _db.Queryable().Where(it => it.mold_id == moldId).Select(it => new { item_group_id = it.item_group_id, item_group_name = it.item_group_name, item_id = it.item_id, item_name = it.item_name, status = it.status, }).ToListAsync(); //var checkItems = await _db.Queryable((a, b, c, d) => new JoinQueryInfos // ( // JoinType.Inner, a.item_group_id == b.id, // JoinType.Inner, b.id == c.item_group_id, // JoinType.Inner, c.item_id == d.id // )) // .Where(a => a.mold_id == moldId) // .Select((a, b, c, d) => new // { // item_group_id = b.id, // item_group_name = b.name, // item_id = d.id, // item_name = d.name, // status = d.status, // }).ToListAsync(); return checkItems; } return Enumerable.Empty(); } /// /// 模具保养计划执行-开始模具保养 /// /// /// { /// plan_id:执行计划id /// } /// /// [HttpPost] public async Task MaintainStart(MoldMaintainRunUpInput input) { if (input == null) throw new ArgumentNullException("input"); try { await _db.Ado.BeginTranAsync(); var dic = await _dictionaryDataService.GetDicByTypeId(DictConst.MaintainStatusTypeId); var mold = await _db.Queryable().FirstAsync(it => it.id == input.mold_id); if (mold != null) { mold.mold_status = MoldUseStatus.MOLD_USE_STATUS_MAINTAIN_ID; var isOk = await _db.Updateable(mold).Where(it => it.id == input.mold_id).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1001); var plan = await _db.Queryable().LeftJoin((a, b) => a.maintain_plan_id == b.id) .Where(a => a.mold_id == input.mold_id).Select((a, b) => b).FirstAsync(); if (plan is not null) { //插入保养计划记录 ToolMoldMaintainRunRecord record = new(); record.plan_code = plan.plan_code; record.mode = plan.mode; record.plan_status = dic.ContainsKey(plan.plan_code) ? dic[plan.plan_code].ToString() : ""; record.designer = _userManager.RealName; record.designer_time = DateTime.Now; record.mold_code = mold.mold_code; record.mold_name = mold.mold_name; record.plan_start_time = DateTime.Now; var row = await _db.Insertable(record).ExecuteCommandAsync(); if (row < 1) throw Oops.Oh(ErrorCode.COM1001); var maintainInfos = await _db.Queryable() .LeftJoin((a, b) => a.item_group_id == b.id) .LeftJoin((a, b, c) => b.id == c.item_group_id) .LeftJoin((a, b, c, d) => c.item_id == d.id) .Where(a => a.mold_id == input.mold_id) .Select((a, b, c, d) => new { group_id = b.id, group_name = b.name, check_item_id = d.id, check_item_name = d.name }) .ToListAsync(); if (maintainInfos?.Count > 0) { List recordDs = new(); foreach (var info in maintainInfos) { ToolMoldMaintainRunRecordD record_d = new(); record_d.group_id = info.group_id; record_d.group_name = info.group_name; record_d.check_item_id = info.check_item_id; record_d.check_item_name = info.check_item_name; recordDs.Add(record_d); } row = await _db.Insertable(recordDs).ExecuteCommandAsync(); if (row < 1) throw Oops.Oh(ErrorCode.COM1001); } } } await _db.Ado.CommitTranAsync(); } catch (Exception ex) { Log.Error("开始模具保养失败", ex); await _db.Ado.RollbackTranAsync(); throw; } } public async Task MaintainItemFinish(MoldMaintainRunUpInput input) { if (input == null) throw new ArgumentNullException("input"); if (input.itemIds == null || input.itemIds.Count == 0) throw new ArgumentException($"parameter {nameof(input.itemIds)} not be null or empty"); var row = await _db.Updateable().SetColumns(it => new ToolMoldMaintainItemRecord { status = 1 }).Where(it => input.itemIds.Contains(it.id)).ExecuteCommandAsync(); if (row < 1) throw Oops.Oh(ErrorCode.COM1001); } /// /// 模具保养计划执行-保养完成 /// /// /// [HttpPost] public async Task MaintainFinish(MoldMaintainRunUpInput input) { if (input == null) throw new ArgumentNullException("input"); var grpIds = await _db.Queryable() .LeftJoin((a, b) => a.mold_id == b.id) .Where(a => a.mold_id == input.mold_id) .Select((a, b) => a.item_group_id) .Distinct() .ToListAsync(); var itemIds = await _db.Queryable().Where(it => grpIds.Contains(it.item_group_id)).Select(it => it.item_id).ToListAsync(); if (itemIds?.Count > 0) { var items = await _db.Queryable().Where(it => it.mold_id == input.mold_id && it.status == 1).ToListAsync(); if (items?.Count < itemIds.Count) { throw new AppFriendlyException("当前模具有未完成的保养项目", 500); } var row = await _db.Updateable().SetColumns(it => new ToolMolds { mold_status = MoldUseStatus.MOLD_USE_STATUS_ZK_ID }).Where(it => it.id == input.mold_id).ExecuteCommandAsync(); if (row < 1) throw Oops.Oh(ErrorCode.COM1001); var allMoldStatus = await _db.Queryable().InnerJoin((a, b) => a.mold_id == b.id) .Where((a, b) => a.maintain_plan_id == input.plan_id) .Select((a, b) => b.mold_status) .ToListAsync(); if (allMoldStatus?.Count > 0 && allMoldStatus.All(x => x == MoldUseStatus.MOLD_USE_STATUS_ZK_ID)) { row = await _db.Updateable().SetColumns(it => new ToolMoldMaintainPlan { status = MoldPlanMaintainStatus.MOLDPLAN_MAINTAIN_STATUS_COMPLETED_CODE }).Where(it => it.id == input.plan_id).ExecuteCommandAsync(); } if (row < 1) throw Oops.Oh(ErrorCode.COM1001); } } } }