using JNPF.Common.Core.Manager; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Entitys.Dto.VisualDevModelData; using JNPF.VisualDev.Interfaces; using Microsoft.AspNetCore.Mvc; using SqlSugar; using Tnb.BasicData; using Tnb.BasicData.Entities; using Tnb.EquipMgr.Entities; using Tnb.ProductionMgr.Entities; using Tnb.ProductionMgr.Entities.Dto; using Tnb.ProductionMgr.Entities.Dto.PrdManage; using Tnb.ProductionMgr.Entities.Enums; using Tnb.ProductionMgr.Interfaces; namespace Tnb.ProductionMgr { /// /// 生产计划管理 /// [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)] [Route("api/[area]/[controller]/[action]")] [OverideVisualDev(ModuleId)] public class PrdMoService : IOverideVisualDevService, IPrdMoService, IDynamicApiController, ITransient { // private const string ModuleId = "25018860321301"; private const string ModuleId = "26900026924053"; private readonly ISqlSugarRepository _repository; private readonly IDataBaseManager _dataBaseManager; private readonly IUserManager _userManager; private readonly IDictionaryDataService _dictionaryDataService; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly ISqlSugarClient _db; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); public PrdMoService( ISqlSugarRepository repository, IDataBaseManager dataBaseManager, IUserManager userManager, IDictionaryDataService dictionaryDataService, IRunService runService, IVisualDevService visualDevService ) { _repository = repository; _dataBaseManager = dataBaseManager; _userManager = userManager; _dictionaryDataService = dictionaryDataService; _runService = runService; _visualDevService = visualDevService; _db = _repository.AsSugarClient(); OverideFuncs.GetListAsync = GetList; } // private async Task GetList(VisualDevModelListQueryInput input) // { // var db = _repository.AsSugarClient(); // VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true); // var data = await _runService.GetListResult(templateEntity, input); // if (data?.list?.Count > 0) // { // foreach (var row in data.list) // { // var dic = row.ToDictionary(x => x.Key, x => x.Value); // var pkName = "material_id_id"; // if (dic.ContainsKey(pkName)) // { // var materialId = dic[pkName]?.ToString(); // var material = await db.Queryable().FirstAsync(it => it.id == materialId); // if (material != null) // { // row.Add("material_name", material.name); // row.Add($"material_attribute", material.attribute); // if (dic.ContainsKey("material_id")) // { // row["material_id"] = material.code + "/" + material.name; // } // } // // if (dic.ContainsKey("unit_id")) // { // string unitId = dic["unit_id"]?.ToString() ?? ""; // var unit = await db.Queryable().SingleAsync(x => x.Id == unitId); // row["unit_id"] = unit?.FullName ?? ""; // } // } // } // } // return data!; // } private async Task GetList(VisualDevModelListQueryInput input) { var db = _repository.AsSugarClient(); Dictionary queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject>(input.queryJson) : new Dictionary(); string moCode = queryJson.ContainsKey("mo_code") ? queryJson["mo_code"].ToString() : ""; string moStatus = queryJson.ContainsKey("mo_status") ? queryJson["mo_status"].ToString() : ""; string combineMoCode = queryJson.ContainsKey("combine_mo_code") ? queryJson["combine_mo_code"].ToString() : ""; var result = await db.Queryable() .LeftJoin((a, b) => a.material_id == b.id) .LeftJoin((a, b, c) => c.EnCode == DictConst.MeasurementUnit) .LeftJoin((a, b, c, d) => c.Id == d.DictionaryTypeId && a.unit_id == d.Id) .LeftJoin((a, b, c, d, e) => a.mo_status == e.Id) .LeftJoin((a, b, c, d, e,f) => a.mo_type==f.Id) .WhereIF(!string.IsNullOrEmpty(moCode), (a, b, c, d, e) => a.mo_code.Contains(moCode)) .WhereIF(!string.IsNullOrEmpty(combineMoCode), (a, b, c, d, e) => a.combine_mo_code.Contains(combineMoCode)) .WhereIF(!string.IsNullOrEmpty(moStatus), (a, b, c, d, e) => a.mo_status == moStatus) .Where(a=>SqlFunc.IsNullOrEmpty(a.parent_id)) .OrderByDescending(a=>a.create_time) .Select((a, b, c, d, e,f) => new PrdMoListOuput { id = a.id, mo_type = f.FullName, mo_source = a.mo_source=="1" ? "ERP同步" : "新建/导入", mo_code = a.mo_code, plan_start_date = a.plan_start_date==null ? "" : a.plan_start_date.Value.ToString("yyyy-MM-dd"), plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString("yyyy-MM-dd"), material_id = b.code+"/"+b.name, material_id_id = b.id, plan_qty = a.plan_qty, unit_id = d.FullName, mo_status = e.FullName, remark = a.remark, children = SqlFunc.Subqueryable() .LeftJoin((aa, bb) => aa.material_id == bb.id) .LeftJoin((aa, bb, cc) => cc.EnCode == DictConst.MeasurementUnit) .LeftJoin((aa, bb, cc, dd) => cc.Id == dd.DictionaryTypeId && aa.unit_id == dd.Id) .LeftJoin((aa, bb, cc, dd, ee) => aa.mo_status == ee.Id) .LeftJoin((aa, bb, cc, dd, ee,ff) => aa.mo_type==ff.Id) .Where(aa=>aa.parent_id==a.id) .ToList((aa,bb,cc,dd,ee,ff)=>new PrdMoListOuput { id = aa.id, mo_type = ff.FullName, mo_source = aa.mo_source=="1" ? "ERP同步" : "新建/导入", mo_code = aa.mo_code, plan_start_date = aa.plan_start_date==null ? "" : aa.plan_start_date.Value.ToString("yyyy-MM-dd"), plan_end_date = aa.plan_end_date==null ? "" : aa.plan_end_date.Value.ToString("yyyy-MM-dd"), material_id = bb.code+"/"+bb.name, material_id_id = bb.id, plan_qty = aa.plan_qty, unit_id = dd.FullName, mo_status = ee.FullName, remark = aa.remark, }) }).ToPagedListAsync(input.currentPage, int.MaxValue); return PageResult.SqlSugarPageResult(result); } #region Get /// /// 获取自建报废记录 /// /// /// [HttpGet("{icmoCode}")] public async Task GetReportRecord(string icmoCode) { var db = _repository.AsSugarClient(); var output = new PrdMoTaskDefectOutput(); //output.mo_task_code = icmoCode; //var scrap = (await db.Queryable().FirstAsync(it => it.icmo_code == icmoCode)); //output.items = new List(); //var categorys = await db.Queryable().Where(it => it.icmo_code == icmoCode).ToListAsync(); //foreach (var category in categorys) //{ // var categoryItem = category.Adapt(); // categoryItem.items = new List(); // var items = await db.Queryable().Where(it => it.defective_cagetory_id == category.id).ToListAsync(); // categoryItem.items.AddRange(items); // output.categoryItems.Add(categoryItem); //} return output; } #endregion #region Post /// /// 生产工单创建-生产工单下发 /// /// 生产工单下发输入参数 /// [HttpPut] public async Task WorkOrderIssue(MoCrInput input) { if (input is null) { throw new ArgumentNullException(nameof(input)); } if (input.Behavior.IsNullOrWhiteSpace()) { throw new ArgumentException($"{nameof(input.Behavior)},not be null or empty"); } var db = _repository.AsSugarClient(); //获取同组工单的Id,一起下发 var combineMoCodes = await db.Queryable().Where(it => input.WorkOrderIds.Contains(it.id)).Select(it => it.combine_mo_code).ToListAsync(); if (combineMoCodes?.Count > 0) { var moIds = await db.Queryable().Where(it => combineMoCodes.Contains(it.combine_mo_code) && !input.WorkOrderIds.Contains(it.id)).Select(it => it.id).ToListAsync(); input.WorkOrderIds = input.WorkOrderIds.Concat(moIds).ToList(); } string getMoStatus(MoBehavior behavior) { string status = ""; switch (behavior) { case MoBehavior.Release: status = DictConst.IssueId; break; case MoBehavior.Closed: status = DictConst.MoCloseId; break; } return status!; } var behavior = input.Behavior.ToEnum(); var status = getMoStatus(behavior); var row = await db.Updateable() .SetColumns(it => new PrdMo { mo_status = status }) .Where(it => input.WorkOrderIds.Contains(it.id)) .ExecuteCommandAsync(); return (row > 0); } // /// // /// 关联同组工单 // /// // /// 关联同组工单输入参数 // /// // [HttpPost] // public async Task RelevancySameGroupMo(MoCrInput input) // { // (bool executeRes, string errMsg) multi = (true, ""); // var list = await _repository.AsSugarClient().Queryable() // .InnerJoin((a, b) => a.material_id == b.material_id) // .Where((a, b) => input.WorkOrderIds.Contains(a.id)) // .Select((a, b) => new // { // planDate = a.plan_start_date, // mold_code = b.mold_code, // }).ToListAsync(); // var planDateAll = true; // var moldIdAll = true; // if (list?.Count > 0) // { // var planDate = list.FirstOrDefault()?.planDate; // var moldCode = list.FirstOrDefault()?.mold_code; // // planDateAll = list.Skip(1).All(x => x.planDate == planDate); // moldIdAll = list.Skip(1).All(x => x.mold_code == moldCode); // if (planDateAll && moldIdAll) // { // var groupId = SnowflakeIdHelper.NextId(); // multi.executeRes = await _repository.AsSugarClient().Updateable() // .SetColumns(c => new PrdMo { combine_mo_code = groupId }) // .Where(it => input.WorkOrderIds.Contains(it.id)) // .ExecuteCommandHasChangeAsync(); // } // else // { // multi.executeRes = false; // if (!planDateAll) // { // throw new AppFriendlyException("计划开始日期不一致", null); // } // if (!moldIdAll) // { // throw new AppFriendlyException("未关联到同一模具下", null); // } // } // } // return multi; // } /// /// 关联同组工单 /// /// 关联同组工单输入参数 /// [HttpPost] public async Task RelevancySameGroupMo(MoCrInput input) { (bool executeRes, string errMsg) multi = (true, ""); var list = await _repository.AsSugarClient().Queryable() .LeftJoin((a, b) => a.material_id == b.material_id) .LeftJoin((a,b,c)=>b.mold_id==c.id) .Where((a, b,c) => input.WorkOrderIds.Contains(a.id)) .Select((a, b,c) => new { planDate = a.plan_start_date, mold_code = c.mold_code, }).ToListAsync(); var planDateAll = true; var moldIdAll = true; if (list?.Count > 0) { var planDate = list.FirstOrDefault()?.planDate; var moldCode = list.FirstOrDefault()?.mold_code; planDateAll = list.All(x => x.planDate == planDate); moldIdAll = moldCode != null && list.All(x => x.mold_code == moldCode); if (planDateAll && moldIdAll) { var groupId = SnowflakeIdHelper.NextId(); multi.executeRes = await _repository.AsSugarClient().Updateable() .SetColumns(c => new PrdMo { combine_mo_code = groupId }) .Where(it => input.WorkOrderIds.Contains(it.id)) .ExecuteCommandHasChangeAsync(); } else { multi.executeRes = false; if (!planDateAll) { throw Oops.Bah("计划开始日期不一致"); } if (!moldIdAll) { throw Oops.Bah("未关联到同一模具下"); } } } return multi; } /// /// 取消关联 /// /// 取消关联输入参数 /// [HttpPost] public async Task CanelRelevancy(MoCrInput input) { return await _repository.AsSugarClient().Updateable() .SetColumns(c => new PrdMo { combine_mo_code = "" }) .Where(it => input.WorkOrderIds.Contains(it.id)) .ExecuteCommandHasChangeAsync(); } #endregion } }