From f388692848c52eddde6cc70125c965dc479ab621 Mon Sep 17 00:00:00 2001 From: "DEVICE8\\12494" Date: Tue, 23 May 2023 19:23:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E8=A3=85=E5=8C=85=E8=A3=85=EF=BC=8C?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E6=8E=92=E4=BA=A7=E4=BB=A3=E7=A0=81=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dto/SubBomListOutput.cs | 39 +++++ .../IBasMbomService.cs | 9 +- BasicData/Tnb.BasicData/BasMbomService.cs | 151 +++++++++++----- .../IToolMoldMaintainPlanRunService.cs | 12 ++ .../ToolMoldMaintainRuleService.cs | 106 +----------- .../ToolMoldMaintainRunService.cs | 162 ++++++++++++++++++ .../ToolMoldMaintainTaskService.cs | 3 + .../Dto/PrdManage/ClosedownHistoryOutput.cs | 12 +- .../Dto/PrdManage/GenSubMoCrInput.cs | 45 +++++ .../Dto/PrdManage/PrdMotreeOutput.cs | 128 ++++++++++++++ .../Entity/PrdMo.cs | 4 + .../PrdCancelCloseDownService.cs | 15 +- .../Tnb.ProductionMgr/PrdMoService.cs | 6 +- .../Tnb.ProductionMgr/PrdMoTaskService.cs | 95 ++++++++++ 14 files changed, 632 insertions(+), 155 deletions(-) create mode 100644 BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs create mode 100644 EquipMgr/Tnb.EquipMgr.Interfaces/IToolMoldMaintainPlanRunService.cs create mode 100644 EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs create mode 100644 ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/GenSubMoCrInput.cs create mode 100644 ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMotreeOutput.cs diff --git a/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs b/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs new file mode 100644 index 00000000..a666855d --- /dev/null +++ b/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.BasicData.Entities.Dto +{ + /// + /// 子工单列表 + /// + public class SubBomListOutput + { + /// + /// 物料id + /// + public string material_id { get; set; } + /// + /// 物料编码 + /// + public string material_code { get; set; } + /// + /// 物料名称 + /// + public string material_name { get; set; } + /// + /// 物料型号 + /// + public string material_category_code { get; set; } + /// + ///输出数量 + /// + public int output_qty { get; set; } + /// + /// 数量 + /// + public string num { get; set;} + } +} diff --git a/BasicData/Tnb.BasicData.Interfaces/IBasMbomService.cs b/BasicData/Tnb.BasicData.Interfaces/IBasMbomService.cs index 97007bfc..4f85705e 100644 --- a/BasicData/Tnb.BasicData.Interfaces/IBasMbomService.cs +++ b/BasicData/Tnb.BasicData.Interfaces/IBasMbomService.cs @@ -1,7 +1,14 @@ +using Microsoft.AspNetCore.Mvc; + namespace Tnb.BasicData.Interfaces { public interface IBasMbomService { - + /// + /// idȡӦб + /// + /// bomid + /// + Task GetSubMoListByBomId([FromRoute] string bomId); } } \ No newline at end of file diff --git a/BasicData/Tnb.BasicData/BasMbomService.cs b/BasicData/Tnb.BasicData/BasMbomService.cs index 586fc06c..3ae20b9a 100644 --- a/BasicData/Tnb.BasicData/BasMbomService.cs +++ b/BasicData/Tnb.BasicData/BasMbomService.cs @@ -13,6 +13,8 @@ using SqlSugar; using Tnb.BasicData.Entities; using Tnb.BasicData.Interfaces; using Tnb.BasicData.Entities.Dto; +using NPOI.OpenXmlFormats.Dml; +using JNPF.Common.Extension; namespace Tnb.BasicData { @@ -22,15 +24,16 @@ namespace Tnb.BasicData [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)] [Route("api/[area]/[controller]/[action]")] [OverideVisualDev(ModelId)] - public class BasMbomService : IBasMbomService,IOverideVisualDevService,IDynamicApiController, ITransient + public class BasMbomService : IBasMbomService, IOverideVisualDevService, IDynamicApiController, ITransient { public const string ModelId = "25574817510421"; private readonly ISqlSugarRepository _repository; private readonly DataBaseManager _dbManager; private readonly IDictionaryDataService _dictionaryDataService; private readonly IUserManager _userManager; + private readonly ISqlSugarClient _db; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); - + public BasMbomService( ISqlSugarRepository repository, DataBaseManager dbManager, @@ -41,10 +44,11 @@ namespace Tnb.BasicData _dbManager = dbManager; _userManager = userManager; _dictionaryDataService = dictionaryDataService; + _db = repository.AsSugarClient(); // OverideFuncs.GetAsync = GetInfo; OverideFuncs.GetListAsync = GetList; } - + /// /// 生产bom列表 /// @@ -55,14 +59,14 @@ namespace Tnb.BasicData var db = _repository.AsSugarClient(); Dictionary queryJson = string.IsNullOrEmpty(input.queryJson) ? null : input.queryJson.ToObject>(); string materialInfo = queryJson?["query_info"]?.ToString(); - var list = await db.Queryable((a, b, c,d) => new object[] + var list = await db.Queryable((a, b, c, d) => new object[] { JoinType.Left, a.material_id == b.id, JoinType.Left, a.ebom_id == c.id, JoinType.Left, a.route_id == d.id, }) - .WhereIF(!string.IsNullOrEmpty(materialInfo),(a,b,c,d)=>b.code.Contains(materialInfo) || b.name.Contains(materialInfo)) - .Select((a, b, c,d) => new MbomListOutput + .WhereIF(!string.IsNullOrEmpty(materialInfo), (a, b, c, d) => b.code.Contains(materialInfo) || b.name.Contains(materialInfo)) + .Select((a, b, c, d) => new MbomListOutput { id = a.id, material_id = b.code + "-" + b.name, @@ -71,12 +75,41 @@ namespace Tnb.BasicData ebom_id = c.version, route_id = d.name, route_id_id = c.id, - start_time = a.start_time.Value.ToString("yyyy-MM-dd"), - end_time = a.start_time.Value.ToString("yyyy-MM-dd"), - is_first = SqlFunc.IIF(a.is_first==0 , "否","是"), + start_time = a.start_time.Value.ToString("yyyy-MM-dd"), + end_time = a.start_time.Value.ToString("yyyy-MM-dd"), + is_first = SqlFunc.IIF(a.is_first == 0, "否", "是"), }).ToPagedListAsync(input.currentPage, input.pageSize); - - return PageResult.SqlSugarPageResult(list); + + return PageResult.SqlSugarPageResult(list); + } + + /// + /// 根据bomid获取对应的子bom列表 + /// + /// + /// + [HttpGet] + public async Task GetSubMoListByBomId([FromRoute] string bomId) + { + if (string.IsNullOrEmpty(bomId)) throw new ArgumentException($"parameter {nameof(bomId)} not be null or empty"); + var result = await _db.Queryable().LeftJoin((a, b) => a.route_id == b.route_id) + .LeftJoin((a, b, c) => b.process_id == c.id) + .LeftJoin((a, b, c, d) => c.id == d.process_id) + .LeftJoin((a, b, c, d, e) => d.material_id == e.id) + .LeftJoin((a, b, c, d, e, f) => e.category_id == f.id) + .Where((a, b, c, d, e, f) => a.id == bomId) + .Select((a, b, c, d, e, f) => new SubBomListOutput + { + material_id = e.id, + material_code = e.code, + material_name = e.name, + material_category_code = f.category_code, + num = d.num + }) + .Mapper(it => it.output_qty = it.num.ParseToInt()) + .Distinct() + .ToListAsync(); + return result; } /// @@ -87,13 +120,13 @@ namespace Tnb.BasicData public async Task GetInfo(string id) { var db = _repository.AsSugarClient(); - BasMbom mbom = await _repository.GetSingleAsync(x=>x.id==id); + BasMbom mbom = await _repository.GetSingleAsync(x => x.id == id); List processes = await db.Queryable().Where(x => x.mbom_id == id).ToListAsync(); List inputs = await db.Queryable().Where(x => x.mbom_id == id).ToListAsync(); List outputs = await db.Queryable().Where(x => x.mbom_id == id).ToListAsync(); MbomDataOutput mbomDataOutput = new MbomDataOutput(); List mbomProcessOutDtos = new List(); - + mbomDataOutput.id = mbom.id; mbomDataOutput.ebom_id = mbom.ebom_id; mbomDataOutput.is_first = mbom.is_first; @@ -105,7 +138,7 @@ namespace Tnb.BasicData mbomDataOutput.end_time = mbom.end_time; mbomDataOutput.unit_id = mbom.unit_id; mbomDataOutput.version = mbom.version; - + foreach (BasMbomProcess process in processes) { mbomProcessOutDtos.Add(new MbomProcessOutDto() @@ -118,13 +151,51 @@ namespace Tnb.BasicData production_method = process.production_method, inputs = inputs.Where(x => x.process_id == process.process_id).ToList(), outputs = outputs.Where(x => x.process_id == process.process_id).ToList(), - + }); } mbomDataOutput.processes = mbomProcessOutDtos; return mbomDataOutput; } + + /// + /// 根据物料id获取生产bom + /// + /// + /// + /// returns: + ///
{ + ///
bom_id:bomid + ///
material_code:物料编码 + ///
material_name:物料名称 + ///
start_time:有效开始时间 + ///
end_time:有效结束时间 + ///
version:bom版本 + ///
route_id:工艺路线id + ///
route_name:工艺路线名称 + ///
} + ///
+ [HttpGet] + public async Task GetMBomListByMaterialId([FromRoute] string materialId) + { + return await _db.Queryable() + .LeftJoin((a, b) => a.material_id == b.id) + .LeftJoin((a, b, c) => a.route_id == c.id) + .Where((a, b, c) => a.material_id == materialId) + .Select((a, b, c) => new + { + bom_id = a.id, + material_code = b.code, + material_name = b.name, + start_time = a.start_time.HasValue ? a.start_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : null, + end_time = a.end_time.HasValue ? a.end_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : null, + version = a.version, + route_id = c.id, + route_name = c.name, + }) + .ToListAsync(); + } /// /// 保存生产bom /// @@ -133,18 +204,18 @@ namespace Tnb.BasicData [HttpPost] public async Task SaveData(MbomSaveDataInput mbomSaveDataInput) { - DbResult result = await _repository.AsSugarClient().Ado.UseTranAsync(async () => + DbResult result = await _repository.AsSugarClient().Ado.UseTranAsync(async () => { //新增 if (string.IsNullOrEmpty(mbomSaveDataInput.id)) { string mbomId = SnowflakeIdHelper.NextId(); - string orgId = _userManager.GetUserInfo().Result.organizeId; + string orgId = _userManager.GetUserInfo().Result.organizeId; BasMbom mbom = new BasMbom() { id = mbomId, org_id = orgId, - material_id= mbomSaveDataInput.material_id, + material_id = mbomSaveDataInput.material_id, num = mbomSaveDataInput.num, unit_id = mbomSaveDataInput.unit_id, version = mbomSaveDataInput.version, @@ -156,13 +227,13 @@ namespace Tnb.BasicData remark = mbomSaveDataInput.remark, create_id = _userManager.UserId, create_time = DateTime.Now, - + }; await _repository.InsertAsync(mbom); List processes = new List(); List inputs = new List(); List outputs = new List(); - + foreach (var process in mbomSaveDataInput.processes) { string mbomProcessId = SnowflakeIdHelper.NextId(); @@ -170,13 +241,13 @@ namespace Tnb.BasicData { id = mbomProcessId, org_id = orgId, - mbom_id= mbomId, + mbom_id = mbomId, process_id = process.process_id, preparation_time = process.preparation_time, station = process.station, byproduct_status = process.byproduct_status, production_method = process.production_method, - + }); if (process.inputs != null) @@ -220,12 +291,12 @@ namespace Tnb.BasicData { await _repository.AsSugarClient().Insertable(processes).ExecuteCommandAsync(); } - + if (inputs.Count > 0) { await _repository.AsSugarClient().Insertable(inputs).ExecuteCommandAsync(); } - + if (outputs.Count > 0) { await _repository.AsSugarClient().Insertable(outputs).ExecuteCommandAsync(); @@ -233,11 +304,11 @@ namespace Tnb.BasicData } else//修改 { - string orgId = _userManager.GetUserInfo().Result.organizeId; - await _repository.UpdateAsync(x=>new BasMbom() + string orgId = _userManager.GetUserInfo().Result.organizeId; + await _repository.UpdateAsync(x => new BasMbom() { // org_id = orgId, - material_id= mbomSaveDataInput.material_id, + material_id = mbomSaveDataInput.material_id, num = mbomSaveDataInput.num, unit_id = mbomSaveDataInput.unit_id, version = mbomSaveDataInput.version, @@ -249,12 +320,12 @@ namespace Tnb.BasicData remark = mbomSaveDataInput.remark, modify_id = _userManager.UserId, modify_time = DateTime.Now, - - },x=>x.id==mbomSaveDataInput.id); + + }, x => x.id == mbomSaveDataInput.id); List processes = new List(); List inputs = new List(); List outputs = new List(); - + foreach (var process in mbomSaveDataInput.processes) { string mbomProcessId = SnowflakeIdHelper.NextId(); @@ -262,13 +333,13 @@ namespace Tnb.BasicData { id = mbomProcessId, org_id = orgId, - mbom_id= mbomSaveDataInput.id, + mbom_id = mbomSaveDataInput.id, process_id = process.process_id, preparation_time = process.preparation_time, station = process.station, byproduct_status = process.byproduct_status, production_method = process.production_method, - + }); if (process.inputs != null) @@ -306,28 +377,28 @@ namespace Tnb.BasicData }); } } - + } - await _repository.AsSugarClient().Deleteable().Where(x=>x.mbom_id==mbomSaveDataInput.id).ExecuteCommandAsync(); - await _repository.AsSugarClient().Deleteable().Where(x=>x.mbom_id==mbomSaveDataInput.id).ExecuteCommandAsync(); - await _repository.AsSugarClient().Deleteable().Where(x=>x.mbom_id==mbomSaveDataInput.id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Deleteable().Where(x => x.mbom_id == mbomSaveDataInput.id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Deleteable().Where(x => x.mbom_id == mbomSaveDataInput.id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Deleteable().Where(x => x.mbom_id == mbomSaveDataInput.id).ExecuteCommandAsync(); if (processes.Count > 0) { await _repository.AsSugarClient().Insertable(processes).ExecuteCommandAsync(); } - + if (inputs.Count > 0) { await _repository.AsSugarClient().Insertable(inputs).ExecuteCommandAsync(); } - + if (outputs.Count > 0) { await _repository.AsSugarClient().Insertable(outputs).ExecuteCommandAsync(); } } - + }); if (!result.IsSuccess) @@ -340,7 +411,7 @@ namespace Tnb.BasicData { throw Oops.Oh(ErrorCode.COM1000); } - + } return result.IsSuccess ? "保存成功" : result.ErrorMessage; } diff --git a/EquipMgr/Tnb.EquipMgr.Interfaces/IToolMoldMaintainPlanRunService.cs b/EquipMgr/Tnb.EquipMgr.Interfaces/IToolMoldMaintainPlanRunService.cs new file mode 100644 index 00000000..0c482f04 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr.Interfaces/IToolMoldMaintainPlanRunService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.EquipMgr.Interfaces +{ + public interface IToolMoldMaintainPlanRunService + { + } +} diff --git a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRuleService.cs b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRuleService.cs index 73803225..3581442a 100644 --- a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRuleService.cs +++ b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRuleService.cs @@ -83,111 +83,7 @@ namespace Tnb.EquipMgr }) .ToListAsync(); } - [HttpGet] - public async Task GetMaintainInfoFromByPlanId([FromRoute] string planId) - { - dynamic info = new ExpandoObject(); - var planMoldRelation = await _db.Queryable().FirstAsync(it => it.id == planId); - if (planMoldRelation != null) - { - var mold = await _db.Queryable().FirstAsync(it => it.id == planMoldRelation.mold_id); - if (mold != null) - { - info.mold_code = mold.mold_code; - info.mold_name = mold.mold_name; - 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; - } - var itemGroupRelation = await _db.Queryable().FirstAsync(it => it.mold_id == mold.id); - if (itemGroupRelation != null) - { - var itemGroup = await _db.Queryable().FirstAsync(it => it.id == itemGroupRelation.item_group_id); - if (itemGroup != null) - { - info.item_group_name = itemGroup.name; - } - var itemRelation = await _db.Queryable().FirstAsync(it => it.item_group_id == itemGroupRelation.item_group_id); - if (itemRelation != null) - { - var checkItem = await _db.Queryable().FirstAsync(it => it.id == itemRelation.item_id); - if (checkItem != null) - { - info.item_name = checkItem.name; - } - } - } - } - } - return info; - } - - /// - /// 模具保养计划执行-开始模具保养 - /// - /// - /// { - /// plan_id:执行计划id - /// } - /// - /// - [HttpPost] - public async Task MaintainStart(MoldMaintainRunUpInput input) - { - try - { - await _db.Ado.BeginTranAsync(); - - var dic = await _dictionaryDataService.GetDicByTypeId(DictConst.MaintainStatusTypeId); - var plan = await _db.Queryable().FirstAsync(it => it.id == input.plan_id); - if (plan != null) - { - plan.status = DictConst.MoldMaintainStatusDBYCode; - var row = await _db.Updateable(plan).ExecuteCommandAsync(); - if (row < 1) throw Oops.Oh(ErrorCode.COM1001); - 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; - var moldPlanRelation = await _db.Queryable().FirstAsync(it => it.maintain_plan_id == input.plan_id); - if (moldPlanRelation != null) - { - var mold = await _db.Queryable().FirstAsync(it => it.id == moldPlanRelation.mold_id); - record.mold_code = mold?.mold_code; - record.mold_name = mold?.mold_name; - var moldGroupRelation = await _db.Queryable().FirstAsync(it => it.mold_id == mold.id); - if (moldGroupRelation != null) - { - var maintainGroup = await _db.Queryable().FirstAsync(it => it.id == moldGroupRelation.item_group_id); - record.group_name = maintainGroup.name; - var itemGrpRelation = await _db.Queryable().FirstAsync(it => it.item_group_id == maintainGroup.id); - if (itemGrpRelation != null) - { - var checkItem = await _db.Queryable().FirstAsync(it => it.id == itemGrpRelation.item_id); - record.check_item_name = checkItem.name; - } - } - } - record.plan_start_time = DateTime.Now; - row = await _db.Insertable(record).ExecuteCommandAsync(); - if (row < 1) throw Oops.Oh(ErrorCode.COM1001); - - await _db.Ado.CommitTranAsync(); - } - } - catch (Exception ex) - { - Log.Error("开始模具保养失败", ex); - await _db.Ado.RollbackTranAsync(); - throw; - } - - } + /// /// 关联模具 diff --git a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs new file mode 100644 index 00000000..12db28d5 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Aspose.Cells.Drawing; +using JNPF.Common.Core.Manager; +using JNPF.Common.Enums; +using JNPF.DependencyInjection; +using JNPF.DynamicApiController; +using JNPF.FriendlyException; +using JNPF.Logging; +using JNPF.Systems.Interfaces.System; +using Microsoft.AspNetCore.Mvc; +using SqlSugar; +using Tnb.BasicData; +using Tnb.EquipMgr.Entities; +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) + { + dynamic info = new ExpandoObject(); + var planMoldRelation = await _db.Queryable().FirstAsync(it => it.id == planId); + if (planMoldRelation != null) + { + var mold = await _db.Queryable().FirstAsync(it => it.id == planMoldRelation.mold_id); + if (mold != null) + { + info.mold_code = mold.mold_code; + info.mold_name = mold.mold_name; + 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; + } + var itemGroupRelation = await _db.Queryable().FirstAsync(it => it.mold_id == mold.id); + if (itemGroupRelation != null) + { + var itemGroup = await _db.Queryable().FirstAsync(it => it.id == itemGroupRelation.item_group_id); + if (itemGroup != null) + { + info.item_group_name = itemGroup.name; + } + var itemRelation = await _db.Queryable().FirstAsync(it => it.item_group_id == itemGroupRelation.item_group_id); + if (itemRelation != null) + { + var checkItem = await _db.Queryable().FirstAsync(it => it.id == itemRelation.item_id); + if (checkItem != null) + { + info.item_name = checkItem.name; + } + } + } + } + } + return info; + } + + /// + /// 模具保养计划执行-开始模具保养 + /// + /// + /// { + /// plan_id:执行计划id + /// } + /// + /// + [HttpPost] + public async Task MaintainStart(MoldMaintainRunUpInput input) + { + try + { + await _db.Ado.BeginTranAsync(); + + var dic = await _dictionaryDataService.GetDicByTypeId(DictConst.MaintainStatusTypeId); + var plan = await _db.Queryable().FirstAsync(it => it.id == input.plan_id); + if (plan != null) + { + plan.status = DictConst.MoldMaintainStatusDBYCode; + var row = await _db.Updateable(plan).ExecuteCommandAsync(); + if (row < 1) throw Oops.Oh(ErrorCode.COM1001); + 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; + var moldPlanRelation = await _db.Queryable().FirstAsync(it => it.maintain_plan_id == input.plan_id); + if (moldPlanRelation != null) + { + var mold = await _db.Queryable().FirstAsync(it => it.id == moldPlanRelation.mold_id); + record.mold_code = mold?.mold_code; + record.mold_name = mold?.mold_name; + var moldGroupRelation = await _db.Queryable().FirstAsync(it => it.mold_id == mold.id); + if (moldGroupRelation != null) + { + var maintainGroup = await _db.Queryable().FirstAsync(it => it.id == moldGroupRelation.item_group_id); + record.group_name = maintainGroup.name; + var itemGrpRelation = await _db.Queryable().FirstAsync(it => it.item_group_id == maintainGroup.id); + if (itemGrpRelation != null) + { + var checkItem = await _db.Queryable().FirstAsync(it => it.id == itemGrpRelation.item_id); + record.check_item_name = checkItem.name; + } + } + } + record.plan_start_time = DateTime.Now; + row = await _db.Insertable(record).ExecuteCommandAsync(); + if (row < 1) throw Oops.Oh(ErrorCode.COM1001); + + await _db.Ado.CommitTranAsync(); + } + } + catch (Exception ex) + { + Log.Error("开始模具保养失败", ex); + await _db.Ado.RollbackTranAsync(); + throw; + } + + } + /// + /// 模具保养计划执行-保养完成 + /// + /// + /// + [HttpPost] + public async Task MaintainFinish(MoldMaintainRunUpInput input) + { + + } + } +} diff --git a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs index 73299f32..d1250d59 100644 --- a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs +++ b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Aspose.Cells.Drawing; +using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.DependencyInjection; @@ -47,9 +48,11 @@ namespace Tnb.EquipMgr _runService = runService; _visualDevService = visualDevService; OverideFuncs.GetListAsync = GetList; + //OverideFuncs.CreateAsync = Create; } public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); + private async Task GetList(VisualDevModelListQueryInput input) { if (_dicMold.Count < 1) diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/ClosedownHistoryOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/ClosedownHistoryOutput.cs index b1890e52..3f1a6658 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/ClosedownHistoryOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/ClosedownHistoryOutput.cs @@ -8,14 +8,22 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage { public class ClosedownHistoryOutput { + /// + /// 设备编码 + /// + public string eqp_code { get; set; } + /// + /// 设备名称 + /// + public string eqp_name { get; set; } /// /// 停机开始时间 /// - public DateTime? closedown_start_time { get; set; } + public string? closedown_start_time { get; set; } /// /// 停机结束时间 /// - public DateTime? closedown_end_time { get; set; } + public string? closedown_end_time { get; set; } /// /// 停机时间 /// diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/GenSubMoCrInput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/GenSubMoCrInput.cs new file mode 100644 index 00000000..aa6b1f76 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/GenSubMoCrInput.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.ProductionMgr.Entities.Dto.PrdManage +{ + public class GenSubMoCrInput + { + /// + /// 父工单id + /// + public string mo_id { get; set; } + /// + /// 子物料ids + /// + public List ids { get; set; } + + } + + //public class SubMo + //{ + // /// + // /// 物料id + // /// + // public string material_id { get; set; } + // /// + // /// 物料编码 + // /// + // public string material_code { get; set; } + // /// + // /// 物料名称 + // /// + // public string material_name { get; set; } + // /// + // /// 物料型号 + // /// + // public string material_category_code { get; set; } + // /// + // ///输出数量 + // /// + // public int output_qty { get; set; } + //} +} diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMotreeOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMotreeOutput.cs new file mode 100644 index 00000000..f274fe7c --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMotreeOutput.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using JNPF.Common.Security; + +namespace Tnb.ProductionMgr.Entities.Dto.PrdManage +{ + public class PrdMotreeOutput : TreeModel + { + public string? org_id { get; set; } + /// + /// 工单id + /// + + public string mo_id { get; set; } + + /// + /// 工单代码 + /// + public string mo_code { get; set; } = string.Empty; + + /// + /// 物料编号 + /// + public string? material_code { get; set; } + + /// + /// 工单类型:1-正常工单、2-返工工单、3-试制工单 + /// + public string? mo_type { get; set; } + + /// + /// 生产状态 Initial: 初始, Confirm:确认 Release: 下发, Open: 生产中, Close: 关单, Pending: 暂停 + /// + public string? mo_status { get; set; } + + /// + /// 计划生产数量 + /// + public int? plan_qty { get; set; } + + /// + /// 已投入数量 + /// + public int? input_qty { get; set; } + + /// + /// 已完工数量 + /// + public int? complete_qty { get; set; } + + /// + /// 报废数量 + /// + public int? scrap_qty { get; set; } + + /// + /// 计划开始时间 + /// + public DateTime? plan_start_date { get; set; } + + /// + /// 计划结束时间 + /// + public DateTime? plan_end_date { get; set; } + + /// + /// 是否生派工单 + /// + public int? is_create_dispatch { get; set; } + + + /// + /// 产线代码 + /// + public string? production_linecode { get; set; } + + /// + /// 是否合并 + /// + public int? is_merge { get; set; } + + /// + /// 组合工单 + /// + public string? combine_mo_code { get; set; } + + /// + /// 时间戳 + /// + public string? time_stamp { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + /// + /// 物料ID + /// + public string? material_id { get; set; } + + /// + /// 已排产数量 + /// + public int? scheduled_qty { get; set; } + /// + /// 父工单id + /// + public string parent_id { get; set; } + } +} diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMo.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMo.cs index 82a83bbb..4a2a743f 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMo.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMo.cs @@ -218,5 +218,9 @@ public partial class PrdMo : BaseEntity /// 已排产数量 /// public int? scheduled_qty { get; set; } + /// + /// 父工单id + /// + public string parent_id { get; set; } } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdCancelCloseDownService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdCancelCloseDownService.cs index b38d7411..7238c247 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdCancelCloseDownService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdCancelCloseDownService.cs @@ -139,15 +139,17 @@ namespace Tnb.ProductionMgr { var pagedList = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.eqpName), it => it.eqp_name.Contains(input.eqpName)) - .WhereIF(input.beginTime.HasValue, it => it.closedown_start_time.Value == input.beginTime) - .WhereIF(input.endTime.HasValue, it => it.closedown_end_time.Value == input.endTime) + .WhereIF(input.beginTime.HasValue, it => it.closedown_start_time.Value >= input.beginTime) + .WhereIF(input.endTime.HasValue, it => it.closedown_start_time.Value <= input.endTime) .Select(it => new ClosedownHistoryOutput { - closedown_start_time = it.closedown_start_time, - closedown_end_time = it.closedown_end_time, + eqp_code = it.eqp_code, + eqp_name = it.eqp_name, + closedown_start_time = it.closedown_start_time.HasValue ? it.closedown_start_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : null, + closedown_end_time = it.closedown_end_time.HasValue ? it.closedown_end_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : null, closedown_time = it.closedown_time, }) - .ToPagedListAsync(input.currentPage, input.pageSize); + .ToListAsync(); return pagedList; } /// @@ -216,8 +218,9 @@ namespace Tnb.ProductionMgr var mold = await _moldService.GetListById(moldId); var maintaindTask = new ToolMoldMaintainTask(); maintaindTask.mold_id = moldId; - maintaindTask.code = DictConst.MaintainStatusDWXCode; + maintaindTask.code = mold.mold_code; maintaindTask.create_id = _userManager.UserId; + maintaindTask.status = DictConst.UnMaintainStatusCode; maintaindTask.create_time = DateTime.Now; await _maintainTaskService.Create(maintaindTask); diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs index 314e66d1..e080b375 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs @@ -49,6 +49,7 @@ namespace Tnb.ProductionMgr private readonly IDictionaryDataService _dictionaryDataService; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; + private readonly ISqlSugarClient _db; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); @@ -67,6 +68,7 @@ namespace Tnb.ProductionMgr _dictionaryDataService = dictionaryDataService; _runService = runService; _visualDevService = visualDevService; + _db = _repository.AsSugarClient(); OverideFuncs.GetListAsync = GetList; } @@ -89,7 +91,7 @@ namespace Tnb.ProductionMgr { row.Add("material_name", material.name); row.Add($"material_attribute", material.attribute); - + } } } @@ -241,6 +243,8 @@ namespace Tnb.ProductionMgr .ExecuteCommandHasChangeAsync(); } + + #endregion } } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index dc5a47f2..cbcea7c3 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -466,6 +466,35 @@ namespace Tnb.ProductionMgr .ToListAsync(); return result; } + /// + /// 获取组装、包装 待排产工单树形列表 + /// + /// + [HttpGet] + public async Task GetUnSchedulingList() + { + List trees = new(); + var list = await _db.Queryable().Where(it => string.IsNullOrEmpty(it.parent_id) && it.mo_status == DictConst.ScheduledId).ToListAsync(); + foreach (var item in list) + { + var node = item.Adapt(); + node.mo_id = item.id; + node.id = SnowflakeIdHelper.NextId(); + node.parentId = "0"; + var items = await _db.Queryable().Where(it => it.parent_id == item.id).ToListAsync(); + if (items?.Count() > 0) + { + var childNodes = items.Adapt>(); + for (int i = 0; i < items.Count; i++) + { + childNodes[i].mo_id = items[i].id; + } + trees.AddRange(childNodes); + } + trees.Add(node); + } + return trees.ToTree(); + } #endregion @@ -653,6 +682,24 @@ namespace Tnb.ProductionMgr taskLog.mo_task_id = moTask.id; taskLog.mo_task_code = moTask.mo_task_code!; row = await _db.Insertable(taskLog).ExecuteCommandAsync(); + //将生产任务插入到自检报废记录表 + //var sacipRecord = new PrdMoTaskDefectRecord(); + //sacipRecord.id = SnowflakeIdHelper.NextId(); + //sacipRecord.material_code = material?.code!; + //sacipRecord.material_name = material?.name!; + //sacipRecord.eqp_code = (await db.Queryable().FirstAsync(it => it.id == moTask.eqp_id))?.code!; + //sacipRecord.mold_name = (await db.Queryable().FirstAsync(it => it.id == moTask.mold_id))?.mold_name!; + //sacipRecord.estimated_start_date = moTask.plan_start_date; + //sacipRecord.estimated_end_date = moTask.plan_end_date; + //sacipRecord.plan_qty = moTask.plan_qty; + //sacipRecord.scrap_qty = moTask.scrap_qty; + //sacipRecord.status = moTask.mo_task_status; + //sacipRecord.create_id = _userManager.UserId; + //sacipRecord.create_time = DateTime.Now; + //sacipRecord.mo_task_id = moTask.id; + //sacipRecord.mo_task_code = moTask.mo_task_code; + //await db.Insertable(sacipRecord).ExecuteCommandAsync(); + //根据工单号获取当前工单包含的已排产数 var schedQty = _db.Queryable().Where(it => it.mo_id == input.mo_id)?.Sum(d => d.scheduled_qty); if (mo != null) @@ -1026,6 +1073,54 @@ namespace Tnb.ProductionMgr return row > 0; } + /// + /// 生成子工单 + /// + /// + [HttpPost] + public async Task GenSubMo(GenSubMoCrInput input) + { + if (input is null) throw new ArgumentNullException("input"); + if (input.ids is null || input.ids.Count == 0) throw new ArgumentException($"{nameof(input.ids)} not be null or count zero"); + var curMo = await _db.Queryable().FirstAsync(it => it.id == input.mo_id); + if (curMo == null) throw new ArgumentNullException("创建子工单时的父工单不能为null"); + List subMoList = new(); + var outputMaterials = await _db.Queryable().LeftJoin((a, b) => a.id == b.material_id) + .Where((a, b) => input.ids.Contains(a.id)) + .Select((a, b) => new + { + material_id = a.id, + material_code = a.code, + num = b.num, + }) + .ToListAsync(); + foreach (var om in outputMaterials) + { + PrdMo subMo = new(); + subMo.material_id = om.material_id; + subMo.material_code = om.material_code; + subMo.plan_qty = om.num.ParseToInt() * curMo.plan_qty; + subMo.mo_type = curMo.mo_type; + subMo.parent_id = curMo.id; + subMo.plan_start_date = curMo.plan_start_date; + subMo.plan_end_date = curMo.plan_end_date; + subMo.create_id = _userManager.UserId; + subMo.create_time = DateTime.Now; + subMo.mo_status = DictConst.WaitProductId; + subMoList.Add(subMo); + } + //生成子工单编码 + for (int i = 0; i < subMoList.Count; i++) + { + var num = (i + 1).ToString().PadLeft(2, '0'); + subMoList[i].mo_code = $"{subMoList[i].mo_code}-{num}"; + } + var row = await _db.Insertable(subMoList).ExecuteCommandAsync(); + if (row < 1) throw Oops.Oh(ErrorCode.COM1000); + + } + + #endregion