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 @@
+
+
+
+
+
+
+
+