diff --git a/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs b/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs index e4035d79..c413b9b4 100644 --- a/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs +++ b/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs @@ -183,6 +183,11 @@ public static class DictConst /// 模具维修TypeId /// public const string WXTypeId = "26149320818965"; + /// + /// 设备维修状态 + /// + public const string RepairStatus = "RepairStatus"; + #endregion diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PdaRepairApplyListOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PdaRepairApplyListOutput.cs new file mode 100644 index 00000000..c2455cec --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PdaRepairApplyListOutput.cs @@ -0,0 +1,21 @@ +namespace Tnb.EquipMgr.Entities.Dto +{ + public class PdaRepairApplyListOutput + { + public string id { get; set; } + public string code { get; set; } + public string name { get; set; } + public string equip_id { get; set; } + public string equip_id_id { get; set; } + public string? expect_complete_time { get; set; } + public string? is_ugent { get; set; } + public string description { get; set; } + public string status { get; set; } + public string repairer_id { get; set; } + public string? repairer_id_id { get; set; } + + public string apply_user_id { get; set; } + public string apply_user_id_id { get; set; } + + } +} \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr/App/AppEqpRepairApplyService.cs b/EquipMgr/Tnb.EquipMgr/App/AppEqpRepairApplyService.cs new file mode 100644 index 00000000..2c188cd1 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr/App/AppEqpRepairApplyService.cs @@ -0,0 +1,119 @@ +using JNPF.Common.Core.Manager; +using JNPF.Common.Enums; +using JNPF.Common.Filter; +using JNPF.Common.Security; +using JNPF.DependencyInjection; +using JNPF.DynamicApiController; +using JNPF.FriendlyException; +using JNPF.Systems.Entitys.Permission; +using JNPF.Systems.Entitys.System; +using JNPF.VisualDev; +using JNPF.VisualDev.Entitys.Dto.VisualDevModelData; +using JNPF.VisualDev.Interfaces; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using SqlSugar; +using Tnb.BasicData; +using Tnb.EquipMgr.Entities; +using Tnb.EquipMgr.Entities.Dto; +using Tnb.EquipMgr.Interfaces; + +namespace Tnb.EquipMgr +{ + /// + /// app设备维修登记 + /// + [ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 700)] + [Route("api/[area]/[controller]/[action]")] + [OverideVisualDev(ModuleId)] + public class AppEqpRepairApplyService : IOverideVisualDevService,IDynamicApiController, ITransient + { + private const string ModuleId = "28621611210261"; + private readonly ISqlSugarRepository _repository; + private readonly IUserManager _userManager; + private readonly IRunService _runService; + private readonly IVisualDevService _visualDevService; + public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); + + public AppEqpRepairApplyService(ISqlSugarRepository repository, + IRunService runService, + IVisualDevService visualDevService, + IUserManager userManager) + { + _repository = repository; + _userManager = userManager; + _runService = runService; + _visualDevService = visualDevService; + OverideFuncs.GetListAsync = GetList; + } + + private async Task GetList(VisualDevModelListQueryInput input) + { + var db = _repository.AsSugarClient(); + Dictionary queryJson = !string.IsNullOrEmpty(input.queryJson) ? JsonConvert.DeserializeObject>(input.queryJson) : new Dictionary(); + string code = queryJson!=null && queryJson.ContainsKey("code") ? queryJson["code"].ToString() : ""; + string name = queryJson!=null && queryJson.ContainsKey("name") ? queryJson["name"].ToString() : ""; + string userId = _userManager.UserId; + var result = await db.Queryable() + .LeftJoin((a, b) => a.equip_id == b.id) + .LeftJoin((a, b, c) => a.apply_user_id == c.Id) + .LeftJoin((a,b,c,d)=>d.EnCode==DictConst.RepairStatus) + .LeftJoin((a,b,c,d,e)=>a.status==e.EnCode && d.Id==e.DictionaryTypeId) + .WhereIF(!string.IsNullOrEmpty("code"), (a, b, c) => a.code.Contains(code)) + .WhereIF(!string.IsNullOrEmpty("name"), (a, b, c) => a.name.Contains(name)) + .Where((a, b, c) => a.repairer_id == userId) + .Where((a, b, c) => a.status == "2" || a.status=="3") + .Select((a, b, c,d,e) => new PdaRepairApplyListOutput + { + id = a.id, + code = a.code, + name = a.name, + equip_id = b.code+"/"+b.name, + equip_id_id = a.equip_id, + expect_complete_time = a.expect_complete_time==null ? "" : a.expect_complete_time.Value.ToString("yyyy-MM-dd"), + is_ugent = a.is_ugent==null ? "" : a.is_ugent==0 ? "否" : "是", + description = a.description, + status = e.FullName, + apply_user_id = SqlFunc.IsNull(c.RealName,"异常停机"), + apply_user_id_id = a.create_id, + // repairer_id = c.RealName, + // repairer_id_id = a.repairer_id, + }).ToPagedListAsync(input.currentPage,input.pageSize); + + return PageResult.SqlSugarPageResult(result); + } + + + /// + /// 根据id获取维修相关信息 + /// + /// + /// + [HttpPost] + public async Task GetRepairInfoById(Dictionary dic) + { + string id = dic.ContainsKey("id") ? dic["id"] : ""; + if (string.IsNullOrEmpty(id)) return null; + var db = _repository.AsSugarClient(); + return await db.Queryable() + .LeftJoin((a, b) => a.equip_id == b.id) + .Where((a, b) => a.id == id) + .Select((a, b) => new + { + id = a.id, + a.code, + a.name, + equip_id = a.equip_id, + equip_code = b.code, + equip_name = b.name, + expect_complete_time = a.expect_complete_time==null?"":a.expect_complete_time.Value.ToString("yyyy-MM-dd"), + is_ugent = a.is_ugent, + description = a.description, + status = a.status, + repairer_id = a.repairer_id, + }).FirstAsync(); + + } + + } +} \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs b/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs index 5b7dd85d..f6047912 100644 --- a/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs +++ b/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs @@ -16,7 +16,7 @@ using Tnb.EquipMgr.Interfaces; namespace Tnb.EquipMgr { /// - /// 设备维修延期 + /// 设备维修登记 /// [ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 700)] [Route("api/[area]/[controller]/[action]")] diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskCode.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskCode.cs index 44a9d12e..40606a87 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskCode.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskCode.cs @@ -72,7 +72,7 @@ public partial class WmsDistaskCode : BaseEntity /// /// 时间戳 /// - public DateTime time_stamp { get; set; } = DateTime.Now; + //public DateTime? time_stamp { get; set; } = DateTime.Now; /// /// 创建用户 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs index ba6e9562..c45821f5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs @@ -5,6 +5,7 @@ using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Aop.Api.Domain; +using JNPF.Common.Const; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; @@ -19,6 +20,7 @@ using JNPF.VisualDev.Interfaces; using Mapster; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; +using NPOI.SS.Formula.Functions; using SqlSugar; using SqlSugar.DbConvert; using Tnb.BasicData.Entities; @@ -76,14 +78,63 @@ namespace Tnb.WarehouseMgr OverideFuncs.CreateAsync = OutStockApplyFor; } - private async Task OutStockApplyFor(VisualDevModelDataCrInput input) { try { await _db.Ado.BeginTranAsync(); //判断目标库位是否自动签收 - var loc = await _db.Queryable().SingleAsync(it => it.id == input.data[nameof(WmsPointH.location_id)].ToString()); + BasLocation? loc = null; + if (input.data.ContainsKey(nameof(WmsPointH.location_id)) && input.data[nameof(WmsPointH.location_id)].IsNotEmptyOrNull()) + { + loc = await _db.Queryable().SingleAsync(it => it.id == input.data[nameof(WmsPointH.location_id)].ToString()); + } + else if (input.data.ContainsKey(nameof(WmsOutstockH.station_id)) && input.data[nameof(WmsOutstockH.station_id)].IsNotEmptyOrNull()) + { + //多个投料库位 + /* + * 天益 + * 2、不管库位是否为空, 获取到所有库位 A B + * 2.1 根据这些库位去查任务执行 目的库位是这些库位的未完成任务数。 A 10 B 9 + * 2.2 哪个最少给哪个 + */ + var org = await _db.Queryable().FirstAsync(it => it.Id == input.data[nameof(WmsOutstockH.station_id)].ToString()); + if (!org?.FeedingLocationId.IsNullOrWhiteSpace() ?? false) + { + var fLocIds = JArray.Parse(org.FeedingLocationId).Values().ToList(); + var minTaskNumLocs = await _db.Queryable().Where(it => it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && fLocIds.Contains(it.endlocation_id)) + .GroupBy(it => it.endlocation_id) + .Select(it => new + { + it.endlocation_id, + count = SqlFunc.AggregateCount(it.endlocation_id) + }) + .MergeTable() + .OrderBy(it => it.count) + .ToListAsync(); + if (minTaskNumLocs?.Count > 0) + { + var freeLocIds = fLocIds.Except(minTaskNumLocs.Select(x => x.endlocation_id)).ToList(); + if (freeLocIds?.Count > 0) + { + var rIdx = new Random().Next(0, freeLocIds.Count); + loc = await _db.Queryable().SingleAsync(it => it.id == freeLocIds[rIdx]); + } + else + { + var firstLocId = minTaskNumLocs.FirstOrDefault().endlocation_id; + loc = await _db.Queryable().SingleAsync(it => it.id == firstLocId); + } + } + else if (minTaskNumLocs?.Count < 1) + { + var rIdx = new Random().Next(0, fLocIds.Count); + loc = await _db.Queryable().SingleAsync(it => it.id == fLocIds[rIdx]); + } + input.data[nameof(WmsOutstockH.location_id)] = loc.id; + } + } + var carryIds = new List(); //tablefield120 出库物料明细 @@ -98,20 +149,20 @@ namespace Tnb.WarehouseMgr { var OutStockStrategyInput = new OutStockStrategyQuery { - carry_id = input.data[nameof(OutStockStrategyQuery.carry_id)].ToString(), - warehouse_id = input.data[nameof(WmsOutstockH.warehouse_id)].ToString(), + carry_id = input.data[nameof(OutStockStrategyQuery.carry_id)]?.ToString() ?? string.Empty, + warehouse_id = input.data[nameof(WmsOutstockH.warehouse_id)]?.ToString() ?? string.Empty, material_id = os.material_id, code_batch = os.code_batch, }; var outStkCarrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput); - Expression> whereExp = input.data.ContainsKey(nameof(WmsOutstockH.carry_id)) + Expression> whereExp = input.data.ContainsKey(nameof(WmsOutstockH.carry_id)) && input.data[nameof(WmsOutstockH.carry_id)].IsNotEmptyOrNull() ? (a, b) => a.id == input.data[nameof(WmsOutstockH.carry_id)].ToString() : (a, b) => outStkCarrys.Select(x => x.id).Contains(b.carry_id); List? carryCodesPart = await _db.Queryable().InnerJoin((a, b) => a.id == b.carry_id).InnerJoin((a, b, c) => a.location_id == c.id) .Where(whereExp) .Select() - .ToListAsync(); + .ToListAsync(); if (carryCodesPart?.Count > 0) { @@ -177,8 +228,21 @@ namespace Tnb.WarehouseMgr } } carryIds = allOutIds.Concat(sortingOutIds).ToList(); - await _db.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.全部出).ToString(), source_id = input.data[nameof(WmsOutstockH.source_id)].ToString(), source_code = input.data[nameof(WmsOutstockH.source_code)].ToString() }).Where(it => allOutIds.Contains(it.id)).ExecuteCommandAsync(); - await _db.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.分拣出).ToString(), source_id = input.data[nameof(WmsOutstockH.source_id)].ToString(), source_code = input.data[nameof(WmsOutstockH.source_code)].ToString() }).Where(it => sortingOutIds.Contains(it.id)).ExecuteCommandAsync(); + var carryH = new WmsCarryH + { + out_status = ((int)EnumOutStatus.全部出).ToString(), + source_id = input.data.ContainsKey(nameof(WmsOutstockH.source_id)) ? input.data[nameof(WmsOutstockH.source_id)]?.ToString() ?? string.Empty : string.Empty, + source_code = input.data.ContainsKey(nameof(WmsOutstockH.source_code)) ? input.data[nameof(WmsOutstockH.source_code)]?.ToString() ?? string.Empty : string.Empty, + }; + await _db.Updateable(carryH) + .UpdateColumns(it => new { it.out_status, it.source_id, it.source_code }) + .Where(it => allOutIds.Contains(it.id)) + .ExecuteCommandAsync(); + carryH.out_status = ((int)EnumOutStatus.分拣出).ToString(); + await _db.Updateable(carryH) + .UpdateColumns(it => new { it.out_status, it.source_id, it.source_code }) + .Where(it => sortingOutIds.Contains(it.id)) + .ExecuteCommandAsync(); } @@ -186,9 +250,7 @@ namespace Tnb.WarehouseMgr var carrys = await _db.Queryable().Where(it => carryIds.Contains(it.id)).ToListAsync(); if (carrys?.Count > 0) { - var curCarry = carrys[^carrys.Count]; - var isMatch = await IsCarryAndLocationMatchByCarryStd(curCarry, loc); - if (!isMatch) throw new AppFriendlyException("该载具无法放置到目标库位", 500); + VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSOUTSTOCK_ID, true); await _runService.Create(templateEntity, input); @@ -197,6 +259,9 @@ namespace Tnb.WarehouseMgr List locIds = new(); foreach (var carry in carrys) { + var isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc); + if (!isMatch) throw new AppFriendlyException("该载具无法放置到目标库位", 500); + WmsPointH sPoint = null!; WmsPointH ePoint = null!; if (input.data.ContainsKey(nameof(WmsPointH.location_id))) @@ -205,37 +270,7 @@ namespace Tnb.WarehouseMgr } if (input.data.ContainsKey(nameof(WmsPointH.location_id)) && input.data[nameof(WmsPointH.location_id)].IsNotEmptyOrNull()) { - ePoint = await _db.Queryable().FirstAsync(it => it.location_id == input.data[nameof(WmsPointH.location_id)].ToString()); - } - else if (input.data.ContainsKey(nameof(WmsOutstockH.station_id))) - { - //多个投料库位 - /* - * 潍柴 - * 1、那个库位状态是空的出那个 - * 1.1、没有空位直接抛异常 - * - * 天益 - * 2、不管库位是否为空, 获取到所有库位 A B - * 2.1 根据这些库位去查任务执行 目的库位是这些库位的未完成任务数。 A 10 B 9 - * 2.2 哪个最少给哪个 - */ - var org = await _db.Queryable().FirstAsync(it => it.Id == input.data[nameof(WmsOutstockH.station_id)].ToString()); - if (!org?.FeedingLocationId.IsNullOrWhiteSpace() ?? false) - { - var fLocIds = JArray.Parse(org.FeedingLocationId).Values(); - var minTaskNumLoc = await _db.Queryable().Where(it => it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && fLocIds.Contains(it.endlocation_id)) - .GroupBy(it => it.endlocation_id) - .Select(it => new - { - it.endlocation_id, - count = SqlFunc.AggregateCount(it.endlocation_id) - }) - .MergeTable() - .OrderBy(it => it.count) - .FirstAsync(); - ePoint = await _db.Queryable().FirstAsync(it => it.location_id == minTaskNumLoc.endlocation_id); - } + ePoint = await _db.Queryable().FirstAsync(it => it.location_id == loc.id); } if (sPoint != null && ePoint != null) @@ -323,8 +358,9 @@ namespace Tnb.WarehouseMgr await _db.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception ex) { + JNPF.Logging.Log.Error(ex.ToString()); await _db.Ado.RollbackTranAsync(); throw; } @@ -608,11 +644,12 @@ namespace Tnb.WarehouseMgr { await _db.Ado.BeginTranAsync(); - + var curUser = await GetUserIdentity(); var carryId = input.carryIds[^input.carryIds.Count]; var carry = await _db.Queryable().SingleAsync(it => it.id == carryId); if (carry != null) { + var otds = await _db.Queryable().Where(it => it.bill_id == input.requireId).ToListAsync(); var outStatus = carry.out_status.ToEnum(); if (outStatus == EnumOutStatus.全部出) @@ -621,6 +658,7 @@ namespace Tnb.WarehouseMgr var carryCodes = await _db.Queryable().Where(it => it.carry_id == carryId).ToListAsync(); var outStockCodes = carryCodes.Adapt>(); + outStockCodes.ForEach(x => { var billDId = otds?.Find(xx => xx.material_id == x.material_id && xx.code_batch == x.code_batch)?.id; @@ -631,8 +669,8 @@ namespace Tnb.WarehouseMgr x.id = SnowflakeIdHelper.NextId(); x.bill_id = input.requireId; x.bill_d_id = billDId!; - x.org_id = _userManager.User.OrganizeId; - x.create_id = _userManager.UserId; + x.org_id = _userManager.User?.OrganizeId ?? curUser.FindFirst(ClaimConst.CLAINMORGID)?.Value ?? string.Empty; + x.create_id = _userManager.UserId ?? curUser.FindFirst(ClaimConst.CLAINMUSERID)?.Value ?? string.Empty; ; x.create_time = DateTime.Now; }); await _db.Insertable(outStockCodes).ExecuteCommandAsync(); @@ -683,8 +721,8 @@ namespace Tnb.WarehouseMgr x.id = SnowflakeIdHelper.NextId(); x.bill_id = input.requireId; x.bill_d_id = billDId!; - x.org_id = _userManager.User.OrganizeId; - x.create_id = _userManager.UserId; + x.org_id = _userManager.User?.OrganizeId ?? curUser.FindFirst(ClaimConst.CLAINMORGID)?.Value ?? string.Empty; + x.create_id = _userManager.UserId?? curUser.FindFirst(ClaimConst.CLAINMUSERID)?.Value ?? string.Empty; x.create_time = DateTime.Now; }); await _db.Insertable(osCodes).ExecuteCommandAsync(); diff --git a/apihost/Tnb.API.Entry/Startup.cs b/apihost/Tnb.API.Entry/Startup.cs index 2d5ed531..5f8b9d74 100644 --- a/apihost/Tnb.API.Entry/Startup.cs +++ b/apihost/Tnb.API.Entry/Startup.cs @@ -115,8 +115,8 @@ public class Startup : AppStartup SnowflakeIdHelper.InitYitIdWorker(); - bool isStartTimeJob = App.GetConfig("IsStartTimeJob"); - if (isStartTimeJob) - serviceProvider.GetRequiredService().StartTimerJob(); + //bool isStartTimeJob = App.GetConfig("IsStartTimeJob"); + //if (isStartTimeJob) + // serviceProvider.GetRequiredService().StartTimerJob(); } } \ No newline at end of file diff --git a/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj b/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj index e3a54fc6..61fcc8dc 100644 --- a/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj +++ b/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj @@ -14,6 +14,14 @@ + + + + + + + +