Merge branch 'dev' of https://git.tuotong-tech.com/tnb/tnb.server into dev
This commit is contained in:
15
BasicData/Tnb.BasicData.Entities/Consts/DbTimeFormat.cs
Normal file
15
BasicData/Tnb.BasicData.Entities/Consts/DbTimeFormat.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
namespace Tnb.BasicData
|
||||
{
|
||||
public static class DbTimeFormat
|
||||
{
|
||||
/// <summary>
|
||||
/// 2024-10-27 10:10
|
||||
/// </summary>
|
||||
public const string MM = "yyyy-MM-dd HH:mi";
|
||||
|
||||
/// <summary>
|
||||
/// 2024-10-27 10:10:10
|
||||
/// </summary>
|
||||
public const string SS = "yyyy-MM-dd HH:mi:ss";
|
||||
}
|
||||
}
|
||||
@@ -164,6 +164,11 @@ public static class DictConst
|
||||
/// </summary>
|
||||
public const string AndonStatusYWC = "5";
|
||||
|
||||
/// <summary>
|
||||
/// 产成品入库单
|
||||
/// </summary>
|
||||
public const string CHANCHENGPINRUKUDAN = "40";
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -229,8 +229,8 @@ namespace Tnb.BasicData
|
||||
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,
|
||||
start_time = a.start_time.HasValue ? a.start_time.Value.ToString(DbTimeFormat.SS) : null,
|
||||
end_time = a.end_time.HasValue ? a.end_time.Value.ToString(DbTimeFormat.SS) : null,
|
||||
version = a.version,
|
||||
route_id = c.id,
|
||||
route_name = c.name,
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
namespace Tnb.EquipMgr.Entities.Dto
|
||||
{
|
||||
public class EqpMaintainRecordListOutput
|
||||
{
|
||||
public string id { get; set; }
|
||||
public string equip_id { get; set; }
|
||||
public string equip_id_id { get; set; }
|
||||
public string status { get; set; }
|
||||
public string result { get; set; }
|
||||
public string result_remark { get; set; }
|
||||
public string repeat_result { get; set; }
|
||||
public string repeat_remark { get; set; }
|
||||
public string create_time { get; set; }
|
||||
public string execute_time { get; set; }
|
||||
public string repeat_user_id { get; set; }
|
||||
public string repeat_user_id_id { get; set; }
|
||||
public string execute_user_id{ get; set; }
|
||||
public string execute_user_id_id { get; set; }
|
||||
public string repeat_time { get; set; }
|
||||
public string last_execute_time { get; set; }
|
||||
|
||||
public DateTime? date_repeat_time { get; set; }
|
||||
public DateTime? date_create_time { get; set; }
|
||||
public DateTime? date_execute_time { get; set; }
|
||||
public DateTime? date_last_execute_time { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -15,5 +15,9 @@ namespace Tnb.EquipMgr.Entities.Dto
|
||||
public string spot_record_user_id{ get; set; }
|
||||
public string spot_record_user_id_id { get; set; }
|
||||
public string repeat_time { get; set; }
|
||||
|
||||
public DateTime? date_repeat_time { get; set; }
|
||||
public DateTime? date_create_time { get; set; }
|
||||
public DateTime? date_spot_record_date_time { get; set; }
|
||||
}
|
||||
}
|
||||
27
EquipMgr/Tnb.EquipMgr.Entities/Dto/PadMainListOutput.cs
Normal file
27
EquipMgr/Tnb.EquipMgr.Entities/Dto/PadMainListOutput.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Tnb.EquipMgr.Entities.Dto
|
||||
{
|
||||
public class PadMainListOutput
|
||||
{
|
||||
public string plan_id { get; set; }
|
||||
public string mold_id { get; set; }
|
||||
|
||||
public string mold_code { get; set; }
|
||||
|
||||
public string mold_name { get; set; }
|
||||
|
||||
public string mold_status { get; set; }
|
||||
public string status { get; set; }
|
||||
public string createuser { get; set; }
|
||||
public string createtime { get; set; }
|
||||
public string plan_start_time { get; set; }
|
||||
public string starttime { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,15 @@
|
||||
using JNPF.Common.Filter;
|
||||
|
||||
namespace Tnb.EquipMgr.Entities.Dto
|
||||
{
|
||||
public class PadRepairListInput
|
||||
public class PadRepairListInput : PageInputBase
|
||||
{
|
||||
public string status { get; set; }
|
||||
|
||||
public string equip_info { get; set; }
|
||||
|
||||
public DateTime? start_time { get; set; }
|
||||
public DateTime? end_time { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
20
EquipMgr/Tnb.EquipMgr.Entities/Dto/PdaMaintainInput.cs
Normal file
20
EquipMgr/Tnb.EquipMgr.Entities/Dto/PdaMaintainInput.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using JNPF.Common.Filter;
|
||||
|
||||
namespace Tnb.EquipMgr.Entities.Dto
|
||||
{
|
||||
public class PdaMaintainInput : PageInputBase
|
||||
{
|
||||
public string status { get; set; }
|
||||
|
||||
public string maintain_info { get; set; }
|
||||
|
||||
public DateTime? start_time { get; set; }
|
||||
public DateTime? end_time { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -208,4 +208,19 @@ public partial class EqpEquipment : BaseEntity<string>
|
||||
/// </summary>
|
||||
public string? qrcode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 挤出件类型
|
||||
/// </summary>
|
||||
public string? tube { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 入库库位id
|
||||
/// </summary>
|
||||
public string? as_location_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 第三方平台设备编号
|
||||
/// </summary>
|
||||
public string? third_equip_code { get; set; }
|
||||
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using SqlSugar;
|
||||
using Tnb.EquipMgr.Entities;
|
||||
using Tnb.EquipMgr.Entities.Dto;
|
||||
using Tnb.EquipMgr.Interfaces;
|
||||
using Tnb.BasicData;
|
||||
|
||||
namespace Tnb.EquipMgr
|
||||
{
|
||||
@@ -48,7 +49,7 @@ namespace Tnb.EquipMgr
|
||||
id = a.id,
|
||||
data_source = a.data_source,
|
||||
create_id = b.RealName,
|
||||
create_time = a.create_time==null ? null : a.create_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
create_time = a.create_time==null ? null : a.create_time.Value.ToString(DbTimeFormat.MM),
|
||||
data_type = a.data_type,
|
||||
enabled = a.enabled==1 ? "是" : "否",
|
||||
equip_id = a.equip_id,
|
||||
|
||||
@@ -12,6 +12,7 @@ using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
using JNPF.VisualDev.Entitys;
|
||||
using JNPF.VisualDev.Interfaces;
|
||||
using Mapster;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
using SqlSugar;
|
||||
@@ -58,29 +59,61 @@ namespace Tnb.EquipMgr
|
||||
if (!input.data.ContainsKey("create_time"))
|
||||
{
|
||||
input.data.Add("create_time",DateTime.Now);
|
||||
}else if ( string.IsNullOrEmpty((string)input.data["create_time"]))
|
||||
{
|
||||
input.data["create_time"] = DateTime.Now;
|
||||
}
|
||||
|
||||
if (!input.data.ContainsKey("create_id"))
|
||||
{
|
||||
input.data.Add("create_id",_userManager.UserId);
|
||||
}else if ( string.IsNullOrEmpty((string)input.data["create_id"]))
|
||||
{
|
||||
input.data["create_id"] = _userManager.UserId;
|
||||
}
|
||||
|
||||
if (!input.data.ContainsKey("apply_user_id"))
|
||||
{
|
||||
input.data.Add("apply_user_id",_userManager.UserId);
|
||||
}else if ( string.IsNullOrEmpty((string)input.data["apply_user_id"]))
|
||||
{
|
||||
input.data["apply_user_id"] = _userManager.UserId;
|
||||
}
|
||||
|
||||
if (!input.data.ContainsKey("org_id"))
|
||||
{
|
||||
input.data.Add("org_id",_userManager.GetUserInfo().Result.organizeId);
|
||||
}else if ( string.IsNullOrEmpty((string)input.data["org_id"]))
|
||||
{
|
||||
input.data["org_id"] = _userManager.GetUserInfo().Result.organizeId;
|
||||
}
|
||||
|
||||
if (!input.data.ContainsKey("code"))
|
||||
{
|
||||
input.data.Add("code",await _billRuleService.GetBillNumber(CodeTemplateConst.EQPREPAIR_CODE));
|
||||
}else if (string.IsNullOrEmpty((string)input.data["code"]))
|
||||
{
|
||||
input.data["code"] = await _billRuleService.GetBillNumber(CodeTemplateConst.EQPREPAIR_CODE);
|
||||
}
|
||||
VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true);
|
||||
await _runService.Create(templateEntity, input);
|
||||
|
||||
EqpRepairApply eqpRepairApply = new EqpRepairApply();
|
||||
eqpRepairApply.code = (string)input.data["code"];
|
||||
eqpRepairApply.name = (string)input.data["name"];
|
||||
eqpRepairApply.equip_id = (string)input.data["equip_id"];
|
||||
eqpRepairApply.expect_complete_time = input.data["expect_complete_time"]!=null && input.data["expect_complete_time"].ToString()!="" ? Convert.ToDateTime(input.data["expect_complete_time"]) : null;
|
||||
eqpRepairApply.is_ugent = (int?)(long)input.data["is_ugent"];
|
||||
eqpRepairApply.attachment = input.data.ContainsKey("attachment") ? (string)input.data["attachment"] : null;
|
||||
eqpRepairApply.apply_user_id = (string)input.data["apply_user_id"];
|
||||
eqpRepairApply.create_id = (string)input.data["create_id"];
|
||||
eqpRepairApply.create_time = DateTime.Now;
|
||||
eqpRepairApply.org_id = (string)input.data["org_id"];
|
||||
eqpRepairApply.remark = (string)input.data["remark"];
|
||||
eqpRepairApply.description = (string)input.data["description"];
|
||||
eqpRepairApply.status = RepairApplyStatus.TOBEEXECUTED;
|
||||
await _repository.InsertAsync(eqpRepairApply);
|
||||
|
||||
// VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true);
|
||||
// await _runService.Create(templateEntity, input);
|
||||
return await Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -101,7 +134,7 @@ namespace Tnb.EquipMgr
|
||||
string id = dic["id"];
|
||||
await _repository.UpdateAsync(x => new EqpRepairApply()
|
||||
{
|
||||
status = RepairApplyStatus.CLOSE
|
||||
status = RepairApplyStatus.CLOSE,
|
||||
}, x => x.id == id);
|
||||
return "关闭成功";
|
||||
}
|
||||
@@ -209,7 +242,7 @@ namespace Tnb.EquipMgr
|
||||
{
|
||||
|
||||
EqpRepairApply eqpRepairApply = await _repository.GetSingleAsync(x=>x.id==input.id);
|
||||
if (eqpRepairApply.status == RepairApplyStatus.TOBERECEIVED)
|
||||
if (eqpRepairApply.status == RepairApplyStatus.RECEIVED)
|
||||
{
|
||||
if (_userManager.UserId == eqpRepairApply.repairer_id)
|
||||
{
|
||||
@@ -270,6 +303,7 @@ namespace Tnb.EquipMgr
|
||||
.LeftJoin<UserEntity>((a,b)=>a.apply_user_id==b.Id)
|
||||
.LeftJoin<UserEntity>((a,b,c)=>a.repairer_id==c.Id)
|
||||
.Where(a=>a.equip_id==input.equip_id)
|
||||
.OrderByDescending(a=>a.create_time)
|
||||
.Select((a,b,c) => new EquipRepairRecordQueryOutput
|
||||
{
|
||||
id = a.id,
|
||||
@@ -280,7 +314,7 @@ namespace Tnb.EquipMgr
|
||||
is_ugent = a.is_ugent==1 ? "是" : "否",
|
||||
description = a.description,
|
||||
repair_description = a.repair_description,
|
||||
complete_time = a.complete_time==null ? null : a.complete_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
complete_time = a.complete_time==null ? null : a.complete_time.Value.ToString(DbTimeFormat.MM),
|
||||
repairer_id = c.RealName
|
||||
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
|
||||
@@ -290,6 +324,9 @@ namespace Tnb.EquipMgr
|
||||
[HttpPost]
|
||||
public async Task<dynamic> GetPadRepairList(PadRepairListInput input)
|
||||
{
|
||||
|
||||
DateTime? start_time = input.start_time;
|
||||
DateTime? end_time = input.end_time;
|
||||
List<string> statusList = new List<string>();
|
||||
if (!string.IsNullOrEmpty(input.status))
|
||||
{
|
||||
@@ -314,6 +351,17 @@ namespace Tnb.EquipMgr
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(input.sidx))
|
||||
{
|
||||
input.sidx = "a.create_time";
|
||||
input.sort = "desc";
|
||||
}
|
||||
else
|
||||
{
|
||||
input.sidx = "a." + input.sidx;
|
||||
}
|
||||
|
||||
var db = _repository.AsSugarClient();
|
||||
var result = await db.Queryable<EqpRepairApply>()
|
||||
.LeftJoin<UserEntity>((a,b)=>a.apply_user_id==b.Id)
|
||||
@@ -323,6 +371,9 @@ namespace Tnb.EquipMgr
|
||||
.LeftJoin<DictionaryDataEntity>((a,b,c,d,e,f)=>e.Id==f.DictionaryTypeId && a.status==f.EnCode)
|
||||
.WhereIF(!string.IsNullOrEmpty(input.equip_info),(a,b,c,d)=>d.code.Contains(input.equip_info) || d.name.Contains(input.equip_info))
|
||||
.WhereIF(!string.IsNullOrEmpty(input.status),(a,b,c,d)=>statusList.Contains(a.status))
|
||||
.WhereIF(input.status=="3" && start_time!=null,a=>a.complete_time!=null && a.complete_time>=start_time)
|
||||
.WhereIF(input.status=="3" && end_time!=null,a=>a.complete_time!=null && a.complete_time<=end_time)
|
||||
.OrderBy($"{input.sidx} {input.sort}")
|
||||
.Select((a,b,c,d,e,f) => new PadRepairListOutput
|
||||
{
|
||||
id = a.id,
|
||||
@@ -334,16 +385,16 @@ namespace Tnb.EquipMgr
|
||||
apply_user_id_id =b.Id,
|
||||
is_ugent = a.is_ugent==1 ? "是" : "否",
|
||||
description = a.description,
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
complete_time = a.complete_time==null ? "" : a.complete_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
expect_complete_time = a.expect_complete_time==null ? "" : a.expect_complete_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
complete_time = a.complete_time==null ? "" : a.complete_time.Value.ToString(DbTimeFormat.SS),
|
||||
expect_complete_time = a.expect_complete_time==null ? "" : a.expect_complete_time.Value.ToString(DbTimeFormat.SS),
|
||||
repairer_id = c.RealName,
|
||||
repairer_id_id = c.Id,
|
||||
remark = a.remark,
|
||||
status = f.FullName
|
||||
}).ToListAsync();
|
||||
}).ToPagedListAsync((input?.currentPage ?? 1), (input?.pageSize ?? 50));
|
||||
|
||||
return result;
|
||||
return PageResult<PadRepairListOutput>.SqlSugarPageResult(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Filter;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.FriendlyException;
|
||||
@@ -9,6 +10,7 @@ using JNPF.Systems.Entitys.Permission;
|
||||
using JNPF.Systems.Entitys.System;
|
||||
using JNPF.VisualDev;
|
||||
using JNPF.VisualDev.Entitys;
|
||||
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
|
||||
using JNPF.VisualDev.Interfaces;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
@@ -44,9 +46,71 @@ namespace Tnb.EquipMgr
|
||||
_visualDevService = visualDevService;
|
||||
_runService = runService;
|
||||
_userManager = userManager;
|
||||
OverideFuncs.GetListAsync = GetList;
|
||||
// OverideFuncs.UpdateAsync = ExecuteSpotIns;
|
||||
}
|
||||
|
||||
private async Task<object> GetList(VisualDevModelListQueryInput input)
|
||||
{
|
||||
var db = _repository.AsSugarClient();
|
||||
Dictionary<string, object>? queryJson = (input==null || string.IsNullOrEmpty(input.queryJson)) ? new Dictionary<string, object>() : input.queryJson.ToObject<Dictionary<string, object>>();
|
||||
string equioInfo = queryJson.ContainsKey("query_info") ? (queryJson["query_info"].ToString() ?? "") : "";
|
||||
string status = queryJson.ContainsKey("status") ? (queryJson["status"].ToString() ?? "") : "";
|
||||
DateTime? start_time = queryJson.ContainsKey("start_time") ? queryJson["start_time"].ToString()=="" ? null : Convert.ToDateTime(queryJson["start_time"]) : null;
|
||||
DateTime? end_time = queryJson.ContainsKey("end_time") ? queryJson["end_time"].ToString()=="" ? null : Convert.ToDateTime(queryJson["end_time"]) : null;
|
||||
|
||||
if (string.IsNullOrEmpty(input.sidx))
|
||||
{
|
||||
input.sidx = "a.create_time";
|
||||
input.sort = "desc";
|
||||
}else
|
||||
{
|
||||
input.sidx = "a." + input.sidx;
|
||||
}
|
||||
|
||||
var list = await db.Queryable<EqpMaintainRecordH, EqpEquipment, UserEntity,UserEntity>((a, b, c,d) => new object[]
|
||||
{
|
||||
JoinType.Left, a.equip_id == b.id,
|
||||
JoinType.Left, a.execute_user_id == c.Id,
|
||||
JoinType.Left, a.repeat_user_id == d.Id,
|
||||
})
|
||||
.WhereIF(!string.IsNullOrEmpty(status),(a,b,c)=>a.status==status)
|
||||
.WhereIF(!string.IsNullOrEmpty(equioInfo),(a,b,c)=>b.code.Contains(equioInfo)|| b.name.Contains(equioInfo))
|
||||
.WhereIF(status=="3" && start_time!=null,a=>a.execute_time>=start_time)
|
||||
.WhereIF(status=="3" && end_time!=null,a=>a.execute_time<=end_time)
|
||||
.OrderBy($"{input.sidx} {input.sort}")
|
||||
.Select((a, b, c,d) => new EqpMaintainRecordListOutput
|
||||
{
|
||||
id = a.id,
|
||||
equip_id = b.code+"/"+b.name,
|
||||
equip_id_id = a.equip_id,
|
||||
status = a.status,
|
||||
result = a.result=="1" ? "合格" : "不合格",
|
||||
repeat_result = a.repeat_result=="1" ? "合格" : "不合格",
|
||||
date_create_time = a.create_time,
|
||||
date_execute_time = a.execute_time,
|
||||
date_repeat_time = a.repeat_time,
|
||||
execute_user_id = c.RealName,
|
||||
execute_user_id_id = a.execute_user_id,
|
||||
repeat_user_id = d.RealName,
|
||||
repeat_user_id_id = a.repeat_user_id,
|
||||
result_remark = a.result_remark,
|
||||
repeat_remark = a.repeat_remark,
|
||||
date_last_execute_time = SqlFunc.Subqueryable<EqpMaintainRecordH>().Where(x=>a.equip_id==x.equip_id && a.execute_time!=null).OrderByDesc(x=>x.execute_time).Select(x=>x.execute_time)
|
||||
})
|
||||
.Mapper(a =>
|
||||
{
|
||||
a.status = a.status=="1" ? "待执行" : a.status=="2" ? "待复核" : "已完成";
|
||||
a.create_time = a.date_create_time == null ? "" : a.date_create_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
a.execute_time = a.date_execute_time == null ? "" : a.date_execute_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
a.repeat_time = a.date_repeat_time == null ? "" : a.date_repeat_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
a.last_execute_time = a.date_last_execute_time == null ? "" : a.date_last_execute_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
})
|
||||
.ToPagedListAsync((input?.currentPage ?? 1), (input?.pageSize ?? 50));
|
||||
|
||||
return PageResult<EqpMaintainRecordListOutput>.SqlSugarPageResult(list);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 执行设备保养计划
|
||||
/// </summary>
|
||||
@@ -136,6 +200,11 @@ namespace Tnb.EquipMgr
|
||||
public async Task<string> RepeatMaintain(MaintainRecordRepeatInput input)
|
||||
{
|
||||
var db = _repository.AsSugarClient();
|
||||
EqpMaintainRecordH eqpMaintainRecordH = await _repository.GetSingleAsync(x => x.id == input.id);
|
||||
if (eqpMaintainRecordH.status == "1")
|
||||
{
|
||||
throw Oops.Bah("状态错误");
|
||||
}
|
||||
DbResult<bool> result = await db.Ado.UseTranAsync(async () =>
|
||||
{
|
||||
|
||||
@@ -185,17 +254,17 @@ namespace Tnb.EquipMgr
|
||||
{
|
||||
id = a.id,
|
||||
attachment = a.attachment,
|
||||
create_time = a.create_time==null ? null : a.create_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
create_time = a.create_time==null ? null : a.create_time.Value.ToString(DbTimeFormat.MM),
|
||||
equip_id = b.code,
|
||||
equip_id_id = a.equip_id,
|
||||
repeat_remark = a.repeat_remark,
|
||||
repeat_result = a.repeat_result=="1"?"合格":"不合格",
|
||||
repeat_time = a.repeat_time==null ? null : a.repeat_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
repeat_time = a.repeat_time==null ? null : a.repeat_time.Value.ToString(DbTimeFormat.MM),
|
||||
repeat_user_id = d.RealName,
|
||||
result = a.result=="1"?"合格":"不合格",
|
||||
result_remark = a.result_remark,
|
||||
maintain_tem_equip_id = a.maintain_tem_equip_id,
|
||||
execute_time = a.execute_time==null ? null : a.execute_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
execute_time = a.execute_time==null ? null : a.execute_time.Value.ToString(DbTimeFormat.MM),
|
||||
execute_user_id = c.RealName,
|
||||
status = SqlFunc.IF(a.status.Equals("1")).Return("待执行").ElseIF(a.status.Equals("2")).Return("待复核").ElseIF(a.status.Equals("3")).Return("已完成").End("")
|
||||
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
@@ -222,7 +291,7 @@ namespace Tnb.EquipMgr
|
||||
equip_id = a.equip_id,
|
||||
equip_code = b.code,
|
||||
equip_name = b.name,
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
result_remark = a.result_remark,
|
||||
result = a.result,
|
||||
status = a.status,
|
||||
|
||||
@@ -19,6 +19,7 @@ using Tnb.BasicData.Entities.Dto;
|
||||
using Tnb.EquipMgr.Entities;
|
||||
using Tnb.EquipMgr.Entities.Dto;
|
||||
using Tnb.EquipMgr.Interfaces;
|
||||
using Tnb.BasicData;
|
||||
|
||||
namespace Tnb.EquipMgr
|
||||
{
|
||||
@@ -56,6 +57,19 @@ namespace Tnb.EquipMgr
|
||||
Dictionary<string, object>? queryJson = (input==null || string.IsNullOrEmpty(input.queryJson)) ? new Dictionary<string, object>() : input.queryJson.ToObject<Dictionary<string, object>>();
|
||||
string equioInfo = queryJson.ContainsKey("query_info") ? (queryJson["query_info"].ToString() ?? "") : "";
|
||||
string status = queryJson.ContainsKey("status") ? (queryJson["status"].ToString() ?? "") : "";
|
||||
DateTime? start_time = queryJson.ContainsKey("start_time") ? queryJson["start_time"].ToString()=="" ? null : Convert.ToDateTime(queryJson["start_time"]) : null;
|
||||
DateTime? end_time = queryJson.ContainsKey("end_time") ? queryJson["end_time"].ToString()=="" ? null : Convert.ToDateTime(queryJson["end_time"]) : null;
|
||||
string now = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
if (string.IsNullOrEmpty(input.sidx))
|
||||
{
|
||||
input.sidx = "a.create_time";
|
||||
input.sort = "desc";
|
||||
}
|
||||
else
|
||||
{
|
||||
input.sidx = "a." + input.sidx;
|
||||
}
|
||||
|
||||
var list = await db.Queryable<EqpSpotInsRecordH, EqpEquipment, UserEntity,UserEntity>((a, b, c,d) => new object[]
|
||||
{
|
||||
JoinType.Left, a.equip_id == b.id,
|
||||
@@ -64,6 +78,10 @@ namespace Tnb.EquipMgr
|
||||
})
|
||||
.WhereIF(!string.IsNullOrEmpty(status),(a,b,c)=>a.status==status)
|
||||
.WhereIF(!string.IsNullOrEmpty(equioInfo),(a,b,c)=>b.code.Contains(equioInfo)|| b.name.Contains(equioInfo))
|
||||
.WhereIF(status=="3" && start_time!=null,a=>a.spot_record_date_time>=start_time)
|
||||
.WhereIF(status=="3" && end_time!=null,a=>a.spot_record_date_time<=end_time)
|
||||
.Where(a=>a.create_time.Value.ToString("yyyy-MM-dd")==now)
|
||||
.OrderBy($"{input.sidx} {input.sort}")
|
||||
.Select((a, b, c,d) => new EqpSpotInsRecordListOutput
|
||||
{
|
||||
id = a.id,
|
||||
@@ -72,9 +90,9 @@ namespace Tnb.EquipMgr
|
||||
status = a.status,
|
||||
result = a.result=="1" ? "合格" : "不合格",
|
||||
repeat_result = a.repeat_result=="1" ? "合格" : "不合格",
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
spot_record_date_time = a.spot_record_date_time==null ? "" : a.spot_record_date_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
repeat_time = a.repeat_time==null ? "" : a.repeat_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
date_create_time = a.create_time,
|
||||
date_spot_record_date_time = a.spot_record_date_time,
|
||||
date_repeat_time = a.repeat_time,
|
||||
spot_record_user_id = c.RealName,
|
||||
spot_record_user_id_id = a.spot_record_user_id,
|
||||
repeat_user_id = d.RealName,
|
||||
@@ -83,6 +101,9 @@ namespace Tnb.EquipMgr
|
||||
.Mapper(a =>
|
||||
{
|
||||
a.status = a.status=="1" ? "待执行" : a.status=="2" ? "待复核" : "已完成";
|
||||
a.create_time = a.date_create_time == null ? "" : a.date_create_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
a.spot_record_date_time = a.date_spot_record_date_time == null ? "" : a.date_spot_record_date_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
a.repeat_time = a.date_repeat_time == null ? "" : a.date_repeat_time.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
})
|
||||
.ToPagedListAsync((input?.currentPage ?? 1), (input?.pageSize ?? 50));
|
||||
|
||||
@@ -99,6 +120,7 @@ namespace Tnb.EquipMgr
|
||||
DbResult<bool> result = await _repository.AsSugarClient().Ado.UseTranAsync(async () =>
|
||||
{
|
||||
EqpSpotInsRecordH eqpSpotInsRecordH = _repository.GetSingle(x=>x.id==input.id);
|
||||
|
||||
string status = "";
|
||||
if (eqpSpotInsRecordH.is_repeat == "1")
|
||||
{
|
||||
@@ -164,6 +186,11 @@ namespace Tnb.EquipMgr
|
||||
[HttpPost]
|
||||
public async Task RepeatSpotIns(SpotInsRecordRepeatInput input)
|
||||
{
|
||||
EqpSpotInsRecordH eqpSpotInsRecordH = await _repository.GetSingleAsync(x => x.id == input.id);
|
||||
if (eqpSpotInsRecordH.status == "1")
|
||||
{
|
||||
throw Oops.Bah("状态错误");
|
||||
}
|
||||
await _repository.UpdateAsync(x => new EqpSpotInsRecordH()
|
||||
{
|
||||
repeat_result = input.repeat_result,
|
||||
@@ -190,16 +217,16 @@ namespace Tnb.EquipMgr
|
||||
{
|
||||
id = a.id,
|
||||
attachment = a.attachment,
|
||||
create_time = a.create_time==null ? null : a.create_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
create_time = a.create_time==null ? null : a.create_time.Value.ToString(DbTimeFormat.MM),
|
||||
equip_id = a.equip_id,
|
||||
repeat_remark = a.repeat_remark,
|
||||
repeat_result = a.repeat_result=="1"?"合格":"不合格",
|
||||
repeat_time = a.repeat_time==null ? null : a.repeat_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
repeat_time = a.repeat_time==null ? null : a.repeat_time.Value.ToString(DbTimeFormat.MM),
|
||||
repeat_user_id = b.RealName,
|
||||
result = a.result=="1"?"合格":"不合格",
|
||||
result_remark = a.result_remark,
|
||||
spot_ins_tem_equip_id = a.spot_ins_tem_equip_id,
|
||||
spot_record_date_time = a.spot_record_date_time==null ? null :a.spot_record_date_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
spot_record_date_time = a.spot_record_date_time==null ? null :a.spot_record_date_time.Value.ToString(DbTimeFormat.MM),
|
||||
spot_record_user_id = a.spot_record_user_id,
|
||||
status = SqlFunc.IF(a.status.Equals("1")).Return("待执行").ElseIF(a.status.Equals("2")).Return("待复核").ElseIF(a.status.Equals("3")).Return("已完成").End("")
|
||||
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
@@ -226,7 +253,7 @@ namespace Tnb.EquipMgr
|
||||
equip_id = a.equip_id,
|
||||
equip_code = b.code,
|
||||
equip_name = b.name,
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
result_remark = a.result_remark,
|
||||
result = a.result,
|
||||
status = a.status,
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace Tnb.EquipMgr
|
||||
|
||||
private async Task<dynamic> Create(VisualDevModelDataCrInput visualDevModelDataCrInput)
|
||||
{
|
||||
string qrcode = visualDevModelDataCrInput.data.ContainsKey("qrcode") ? visualDevModelDataCrInput.data["qrcode"].ToString() : "";
|
||||
string qrcode = visualDevModelDataCrInput.data.ContainsKey("qrcode") ? visualDevModelDataCrInput.data["qrcode"]?.ToString() : "";
|
||||
if (!string.IsNullOrEmpty(qrcode) && await _repository.AsSugarClient().Queryable<BasQrcode>().AnyAsync(x => x.code == qrcode))
|
||||
{
|
||||
throw Oops.Bah("二维码总表中已存在该二维码");
|
||||
@@ -120,7 +120,7 @@ namespace Tnb.EquipMgr
|
||||
|
||||
private async Task<dynamic> Update(string id,VisualDevModelDataUpInput visualDevModelDataUpInput)
|
||||
{
|
||||
string qrcode = visualDevModelDataUpInput.data.ContainsKey("qrcode") ? visualDevModelDataUpInput.data["qrcode"].ToString() : "";
|
||||
string qrcode = visualDevModelDataUpInput.data.ContainsKey("qrcode") ? visualDevModelDataUpInput.data["qrcode"]?.ToString() : "";
|
||||
if (!string.IsNullOrEmpty(qrcode) && await _repository.AsSugarClient().Queryable<BasQrcode>().AnyAsync(x => x.code == visualDevModelDataUpInput.data["qrcode"] && x.source_id!=id))
|
||||
{
|
||||
throw Oops.Bah("二维码总表中已存在该二维码");
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Dynamic;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System.Reactive.Joins;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
@@ -12,6 +13,7 @@ using DingTalk.Api.Request;
|
||||
using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Filter;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.FriendlyException;
|
||||
@@ -62,12 +64,14 @@ namespace Tnb.EquipMgr
|
||||
List<dynamic> result = new();
|
||||
var planMoldRelations = await _db.Queryable<ToolMoldMaintainPlanRelation>()
|
||||
.LeftJoin<ToolMoldMaintainPlan>((a, b) => a.maintain_plan_id == b.id)//ToolMoldMaintainPlan
|
||||
.LeftJoin<ToolMoldMaintainRunRecord>((a, b, c) => b.plan_code == c.plan_code)
|
||||
.LeftJoin<ToolMolds>((a, b, c) => a.mold_id == c.id)
|
||||
.LeftJoin<ToolMoldMaintainRunRecord>((a, b, c,d) => d.plan_code == b.plan_code&&d.mold_code==c.mold_code)
|
||||
.Where(a => a.maintain_plan_id == planId)
|
||||
.Select((a, b, c) => new
|
||||
.Select((a, b, c,d) => new
|
||||
{
|
||||
mold_id = a.mold_id,
|
||||
plan_start_time = c.plan_start_time,
|
||||
plan_start_time = d.plan_start_time,
|
||||
designer=d.designer
|
||||
})
|
||||
.ToListAsync();
|
||||
var moldids = planMoldRelations.Select(x => x.mold_id).ToList();
|
||||
@@ -75,7 +79,7 @@ namespace Tnb.EquipMgr
|
||||
foreach (var planMoldRelation in planMoldRelations)
|
||||
|
||||
{
|
||||
var mold= molds.Where(p=>p.id== planMoldRelation.mold_id).FirstOrDefault();
|
||||
var mold = molds.Where(p => p.id == planMoldRelation.mold_id).FirstOrDefault();
|
||||
if (mold != null)
|
||||
{
|
||||
dynamic info = new ExpandoObject();
|
||||
@@ -84,6 +88,7 @@ namespace Tnb.EquipMgr
|
||||
info.mold_name = mold.mold_name;
|
||||
info.mold_status = (await _dictionaryDataService.GetInfo(mold.mold_status!))?.FullName;
|
||||
info.maintain_qty = mold.maintain_qty;
|
||||
info.designer = planMoldRelation.designer == null ? "" : planMoldRelation.designer;
|
||||
info.plan_start_time = planMoldRelation.plan_start_time == null ? "" : ((DateTime)planMoldRelation.plan_start_time).ToString("yyyy-MM-dd");
|
||||
var moldEqpRelation = await _db.Queryable<ToolMoldsEquipment>().FirstAsync(it => it.mold_id == mold.id);
|
||||
if (moldEqpRelation != null)
|
||||
@@ -183,6 +188,51 @@ namespace Tnb.EquipMgr
|
||||
return result;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<dynamic> GetPdaMaintainInfo(PdaMaintainInput input)
|
||||
{
|
||||
DateTime? start_time = input.start_time;
|
||||
DateTime? end_time = input.end_time;
|
||||
if (string.IsNullOrEmpty(input.sidx))
|
||||
{
|
||||
input.sidx = "b.create_time";
|
||||
input.sort = "desc";
|
||||
}
|
||||
else
|
||||
{
|
||||
input.sidx = "b." + input.sidx;
|
||||
}
|
||||
var records = await _db.Queryable<ToolMoldMaintainItemRecord>().Select(p => p.plan_id + p.mold_id).ToListAsync();
|
||||
var result= await _db.Queryable<ToolMoldMaintainPlanRelation>()
|
||||
.LeftJoin<ToolMoldMaintainPlan>((a, b) => a.maintain_plan_id == b.id)
|
||||
.LeftJoin<ToolMolds>((a, b, c) => a.mold_id == c.id)
|
||||
.LeftJoin<ToolMoldMaintainRunRecord>((a, b, c, d) => b.plan_code == d.plan_code && c.mold_code == d.mold_code)
|
||||
.LeftJoin<ToolMoldMaintainItemRecord>((a, b, c, d, e) => e.plan_id == b.id && e.mold_id == c.id)
|
||||
.LeftJoin<UserEntity>((a, b, c, d, e, f) => b.create_id == f.Id)
|
||||
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e, f,g) => c.mold_status == g.Id)
|
||||
.Where((a, b, c, d, e, f) => b.create_time != null)
|
||||
.WhereIF(!string.IsNullOrEmpty(input.maintain_info), (a, b, c, d, e, f, g) => c.mold_code!.Contains(input.maintain_info) || c.mold_name!.Contains(input.maintain_info))
|
||||
.WhereIF(start_time != null, (a, b, c, d, e, f, g) => b.create_time != null && b.create_time >= start_time)
|
||||
.WhereIF(end_time != null, (a, b, c, d, e, f, g) => b.create_time != null && b.create_time <= end_time)
|
||||
.WhereIF(input.status == "待保养", (a, b, c, d, e, f, g) => !records.Contains(a.maintain_plan_id + a.mold_id))
|
||||
.WhereIF(input.status == "已完成", (a, b, c, d, e, f, g) => records.Contains(a.maintain_plan_id + a.mold_id))
|
||||
.Select((a, b, c, d, e, f, g) => new PadMainListOutput
|
||||
{
|
||||
plan_id = b.id,
|
||||
mold_id = c.id,
|
||||
mold_code = c.mold_code!,
|
||||
mold_name = c.mold_name!,
|
||||
mold_status=g.FullName!,
|
||||
status = input.status,
|
||||
createuser = f.RealName,
|
||||
createtime = b.create_time == null ? "" : b.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
plan_start_time = b.plan_start_date == null ? "" : b.plan_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
starttime = d.plan_start_time == null ? "" : d.plan_start_time.Value.ToString(DbTimeFormat.SS),
|
||||
}).OrderBy($"{input.sidx} {input.sort}").ToPagedListAsync((input?.currentPage ?? 1), (input?.pageSize ?? 50));
|
||||
return PageResult<PadMainListOutput>.SqlSugarPageResult(result);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据计划Id、模具ID获取,保养组及项目信息
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Tnb.ProductionMgr.Entities.Dto
|
||||
{
|
||||
public class InstockInput
|
||||
{
|
||||
public string equip_code { get; set; }
|
||||
public string as_location_code { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -122,5 +122,37 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
|
||||
/// 预计结束时间
|
||||
/// </summary>
|
||||
public string? plan_end_date { get; set; }
|
||||
/// <summary>
|
||||
/// 实际完工日期
|
||||
/// </summary>
|
||||
public string? act_end_date { get; set; }
|
||||
/// <summary>
|
||||
/// 挤出件类型
|
||||
/// </summary>
|
||||
public string? tube { get; set; }
|
||||
/// <summary>
|
||||
/// 最小包装
|
||||
/// </summary>
|
||||
public decimal? minpacking { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 主单位数量
|
||||
/// </summary>
|
||||
public string? main_num { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 副单位数量(kg)
|
||||
/// </summary>
|
||||
public string? deputy_num { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 第三方平台设备编号
|
||||
/// </summary>
|
||||
public string? third_equip_code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 称重点位名称
|
||||
/// </summary>
|
||||
public string? weight_name { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -104,5 +104,10 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
|
||||
/// </summary>
|
||||
public string? station { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 料箱二维码
|
||||
/// </summary>
|
||||
public string material_box_qrcode { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,4 +125,9 @@ public partial class PrdReport : BaseEntity<string>
|
||||
/// </summary>
|
||||
public string? process_id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 料箱编号
|
||||
/// </summary>
|
||||
public string material_box_code { get; set; }
|
||||
|
||||
}
|
||||
|
||||
@@ -21,5 +21,12 @@ namespace Tnb.ProductionMgr.Interfaces
|
||||
/// <param name="dic">source_id</param>
|
||||
/// <returns></returns>
|
||||
public Task<dynamic> SyncInstock(Dictionary<string, string> dic);
|
||||
|
||||
/// <summary>
|
||||
/// 注塑满箱到位后入库申请
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
public Task<dynamic> InstockTypeOne(InstockInput inut);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Tnb.ProductionMgr.Interfaces
|
||||
{
|
||||
public interface IRedisDataService
|
||||
{
|
||||
/// <summary>
|
||||
/// 根据机号获取重量
|
||||
/// </summary>
|
||||
Task<dynamic> GetWeight(string key, string field);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -167,8 +167,8 @@ namespace Tnb.ProductionMgr
|
||||
{
|
||||
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_start_time = it.closedown_start_time.HasValue ? it.closedown_start_time.Value.ToString(DbTimeFormat.SS) : null,
|
||||
closedown_end_time = it.closedown_end_time.HasValue ? it.closedown_end_time.Value.ToString(DbTimeFormat.SS) : null,
|
||||
closedown_time = it.closedown_time,
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
@@ -29,6 +29,7 @@ using JNPF.Common.Filter;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.Systems.Entitys.Permission;
|
||||
using JNPF.Systems.Interfaces.Permission;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using SQLitePCL;
|
||||
using SqlSugar.Extensions;
|
||||
|
||||
@@ -261,5 +262,132 @@ namespace Tnb.ProductionMgr
|
||||
|
||||
return result.IsSuccess;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 注塑满箱到位后入库申请
|
||||
/// </summary>
|
||||
/// <param name="inut"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="AppFriendlyException"></exception>
|
||||
[AllowAnonymous]
|
||||
public async Task<dynamic> InstockTypeOne(InstockInput inut)
|
||||
{
|
||||
string equip_code = inut.equip_code;
|
||||
string as_location_code = inut.as_location_code;
|
||||
if (!string.IsNullOrEmpty(equip_code)) throw Oops.Bah("请传机台号");
|
||||
var db = _repository.AsSugarClient();
|
||||
EqpEquipment equipment = await db.Queryable<EqpEquipment>().Where(x => x.code == equip_code).FirstAsync();
|
||||
if(equipment==null ) throw Oops.Bah("未找到机台");
|
||||
if(string.IsNullOrEmpty(equipment.as_location_id)) throw Oops.Bah("未找到入库库位");
|
||||
BasLocation basLocation = await db.Queryable<BasLocation>().SingleAsync(x=>x.id==equipment.as_location_id);
|
||||
if(basLocation==null) throw Oops.Bah("未找到入库库位");
|
||||
PrdReport prdReport = await db.Queryable<PrdReport>()
|
||||
.Where(x => x.equip_id == equipment.id && x.status == 0).OrderByDescending(x => x.create_time)
|
||||
.FirstAsync();
|
||||
if(prdReport==null) throw Oops.Bah("未找到提报记录");
|
||||
|
||||
PrdInstockH prdInstockH = null;
|
||||
List<PrdInstockD> prdInstockDs = new List<PrdInstockD>() { };
|
||||
DbResult<bool> result2 = new DbResult<bool>();
|
||||
BasMaterial basMaterial = await db.Queryable<BasMaterial>().SingleAsync(x=>x.id==prdReport.material_id);
|
||||
DbResult<bool> result = await db.Ado.UseTranAsync(async () =>
|
||||
{
|
||||
OrganizeEntity workline = await _organizeService.GetAnyParentByWorkstationId(prdReport.station, DictConst.RegionCategoryWorklineCode);
|
||||
OrganizeEntity workshop = await _organizeService.GetAnyParentByWorkstationId(prdReport.station, DictConst.RegionCategoryWorkshopCode);
|
||||
|
||||
prdInstockH = new PrdInstockH()
|
||||
{
|
||||
bill_type = DictConst.CHANCHENGPINRUKUDAN,
|
||||
bill_date = DateTime.Now,
|
||||
create_id = _userManager.UserId,
|
||||
location_code = basLocation.location_code,
|
||||
carry_code = prdReport.material_box_code,
|
||||
is_check = 1,
|
||||
station_id = prdReport.station,
|
||||
workline_id = workline?.Id ?? "",
|
||||
workshop_id = workshop?.Id ?? "",
|
||||
org_id = _userManager.GetUserInfo().Result.organizeId,
|
||||
warehouse_id = basLocation?.wh_id,
|
||||
status = 0,
|
||||
};
|
||||
|
||||
prdInstockDs.Add(new PrdInstockD()
|
||||
{
|
||||
instock_id = prdInstockH.id,
|
||||
report_id = prdReport.create_id,
|
||||
material_id = prdReport.material_id,
|
||||
material_code = basMaterial.code,
|
||||
unit_id = prdReport.unit_id,
|
||||
barcode = prdReport.barcode,
|
||||
code_batch = prdReport.barcode+"0001",
|
||||
quantity = (int)prdReport.reported_qty,
|
||||
});
|
||||
});
|
||||
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
MESCreateInstockInput mesCreateInstockInput = new MESCreateInstockInput();
|
||||
mesCreateInstockInput.instock = new MESWmsInstockHInput()
|
||||
{
|
||||
org_id = _userManager.GetUserInfo().Result.organizeId,
|
||||
bill_date = DateTime.Now,
|
||||
bill_type = DictConst.CHANCHENGPINRUKUDAN,
|
||||
warehouse_id = basLocation?.wh_id,
|
||||
source_id = prdInstockH.id,
|
||||
create_id = _userManager.UserId,
|
||||
carry_code = prdReport.material_box_code,
|
||||
location_code = basLocation.location_code,
|
||||
is_check = 1,
|
||||
};
|
||||
mesCreateInstockInput.instockds = new List<MESWmsInstockDInput>();
|
||||
mesCreateInstockInput.instockcodes = new List<MESWmsInstockCodeInput>();
|
||||
mesCreateInstockInput.instockds.Add(new MESWmsInstockDInput()
|
||||
{
|
||||
material_id = prdReport.material_id,
|
||||
material_code = basMaterial.code,
|
||||
unit_id = prdReport.unit_id,
|
||||
code_batch = prdReport.barcode,
|
||||
pr_qty = (int)prdReport.reported_qty,
|
||||
});
|
||||
|
||||
mesCreateInstockInput.instockcodes.Add(new MESWmsInstockCodeInput()
|
||||
{
|
||||
material_id = prdReport.material_id,
|
||||
material_code = basMaterial.code,
|
||||
unit_id = prdReport.unit_id,
|
||||
barcode = prdReport.barcode,
|
||||
code_batch = prdReport.barcode+"0001",
|
||||
codeqty = (int)prdReport.reported_qty,
|
||||
});
|
||||
string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host;
|
||||
Dictionary<string, object> header = new Dictionary<string, object>()
|
||||
{
|
||||
["Authorization"] = App.HttpContext.Request.Headers["Authorization"]
|
||||
};
|
||||
var sendResult = HttpUtils.RequestPost(domain + WebApiConst.MES_CREATE_INSTOCK,JsonConvert.SerializeObject(mesCreateInstockInput),header);
|
||||
Log.Information(sendResult);
|
||||
AuthResponse authResponse = JsonConvert.DeserializeObject<AuthResponse>(sendResult);
|
||||
if (authResponse.code != 200 || !authResponse.data.ObjToBool())
|
||||
{
|
||||
throw Oops.Bah(authResponse.msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
result2 = await db.Ado.UseTranAsync(async () =>
|
||||
{
|
||||
await _repository.InsertAsync(prdInstockH);
|
||||
|
||||
if (prdInstockDs.Count > 0)
|
||||
{
|
||||
await db.Insertable<PrdInstockD>(prdInstockDs).ExecuteCommandAsync();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(!result2.IsSuccess) throw Oops.Oh(ErrorCode.COM1008);
|
||||
return result2.IsSuccess ? "申请成功" : result2.ErrorMessage;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -396,8 +396,8 @@ namespace Tnb.ProductionMgr
|
||||
id = x.id,
|
||||
mo_task_code = x.mo_task_code,
|
||||
mo_task_status = y.FullName,
|
||||
estimated_start_date = x.estimated_start_date==null ? "" : x.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_end_date = x.estimated_end_date==null ? "" : x.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_start_date = x.estimated_start_date==null ? "" : x.estimated_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
estimated_end_date = x.estimated_end_date==null ? "" : x.estimated_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
scheduled_qty = x.scheduled_qty,
|
||||
reported_work_qty = x.reported_work_qty,
|
||||
scrap_qty = x.scrap_qty,
|
||||
@@ -456,8 +456,8 @@ namespace Tnb.ProductionMgr
|
||||
material_code = b.code,
|
||||
material_name = b.name,
|
||||
material_standard = b.material_standard,
|
||||
act_start_date = a.act_start_date==null ? "" : a.act_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
act_end_date = a.act_end_date==null ? "" : a.act_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss")
|
||||
act_start_date = a.act_start_date==null ? "" : a.act_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
act_end_date = a.act_end_date==null ? "" : a.act_end_date.Value.ToString(DbTimeFormat.SS)
|
||||
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
return PageResult<PrdMoFromOneListOutput>.SqlSugarPageResult(result);
|
||||
}
|
||||
@@ -500,8 +500,8 @@ namespace Tnb.ProductionMgr
|
||||
material_code = b.code,
|
||||
material_name = b.name,
|
||||
material_standard = b.material_standard,
|
||||
act_start_date = a.act_start_date == null ? "" : a.act_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
act_end_date = a.act_end_date == null ? "" : a.act_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
act_start_date = a.act_start_date == null ? "" : a.act_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
act_end_date = a.act_end_date == null ? "" : a.act_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
workshop_name = e.FullName,
|
||||
station_name = d.FullName,
|
||||
equip_code = f.code
|
||||
@@ -525,8 +525,8 @@ namespace Tnb.ProductionMgr
|
||||
material_code = b.code,
|
||||
material_name = b.name,
|
||||
material_standard = b.material_standard,
|
||||
act_start_date = a.act_start_date == null ? "" : a.act_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
act_end_date = a.act_end_date == null ? "" : a.act_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
act_start_date = a.act_start_date == null ? "" : a.act_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
act_end_date = a.act_end_date == null ? "" : a.act_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
workline_name = c.FullName,
|
||||
mbom_version = d.version
|
||||
}).ToListAsync();
|
||||
@@ -751,8 +751,8 @@ namespace Tnb.ProductionMgr
|
||||
batch = a.batch,
|
||||
supplier_name = d.supplier_name,
|
||||
check_conclusion = c.check_conclusion,
|
||||
instock_time = c.instock_time.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
feeding_time = e.create_time == null ? "" : e.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
instock_time = c.instock_time.ToString(DbTimeFormat.SS),
|
||||
feeding_time = e.create_time == null ? "" : e.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
}).ToListAsync();
|
||||
|
||||
}
|
||||
@@ -984,7 +984,7 @@ namespace Tnb.ProductionMgr
|
||||
feeding_detail_id = x.id,
|
||||
feeding_time = y.create_time == null
|
||||
? ""
|
||||
: y.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
: y.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
num = x.num,
|
||||
check_conclusion = mp.check_conclusion,
|
||||
feeding_name = z.RealName,
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace Tnb.ProductionMgr
|
||||
mo_task_status = d.FullName,
|
||||
plan_qty = f.plan_qty,
|
||||
scheduled_qty = a.scheduled_qty,
|
||||
create_time = a.create_time==null ? "" :a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
create_time = a.create_time==null ? "" :a.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
}).OrderByDescending(a=>a.create_time).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
return PageResult<PrdMoTaskIssueListOutput>.SqlSugarPageResult(result);
|
||||
}
|
||||
|
||||
@@ -320,13 +320,13 @@ namespace Tnb.ProductionMgr
|
||||
eqp_name = e.name,
|
||||
eqp_type_code = SqlFunc.Subqueryable<EqpEquipType>().Where(it => it.id == e.equip_type_id).Select(it => it.code),
|
||||
mo_task_qty = SqlFunc.Subqueryable<PrdMoTask>().Where(a => a.mo_id == moId).Count(),
|
||||
estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_start_date = a.estimated_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
estimated_end_date = a.estimated_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
plan_qty = a.scheduled_qty,
|
||||
complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
|
||||
process_code = SqlFunc.Subqueryable<BasProcess>().Where(it => it.id == a.process_id).Select(it => it.process_code),
|
||||
process_name = SqlFunc.Subqueryable<BasProcess>().Where(it => it.id == a.process_id).Select(it => it.process_name),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
})
|
||||
.Mapper(it =>
|
||||
{
|
||||
@@ -353,11 +353,11 @@ namespace Tnb.ProductionMgr
|
||||
process_code = e.process_code,
|
||||
process_name = e.process_name,
|
||||
mo_task_qty = SqlFunc.Subqueryable<PrdMoTask>().Where(a => a.mo_id == moId).Count(),
|
||||
estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_start_date = a.estimated_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
estimated_end_date = a.estimated_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
plan_qty = a.scheduled_qty,
|
||||
complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
create_time = a.create_time==null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS),
|
||||
})
|
||||
.Mapper(it =>
|
||||
{
|
||||
@@ -399,8 +399,8 @@ namespace Tnb.ProductionMgr
|
||||
scheduled_qty = a.scheduled_qty,
|
||||
plan_qty = SqlFunc.Subqueryable<PrdMo>().Where(it => it.id == a.mo_id).Select(it => it.plan_qty),
|
||||
complete_qty = a.last_process_complete_qty,
|
||||
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString(DbTimeFormat.MM),
|
||||
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString(DbTimeFormat.MM),
|
||||
bom_id = d.id,
|
||||
bom_version = d.version
|
||||
})
|
||||
@@ -436,8 +436,8 @@ namespace Tnb.ProductionMgr
|
||||
plan_qty = d.plan_qty,
|
||||
process_task_qty = a.process_task_qty,
|
||||
complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
|
||||
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString(DbTimeFormat.MM),
|
||||
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString(DbTimeFormat.MM),
|
||||
process_name = e.process_name,
|
||||
bom_version = SqlFunc.Subqueryable<BasMbom>().Where(it => it.material_id == a.material_id).Select(it => it.version)
|
||||
})
|
||||
@@ -1163,6 +1163,10 @@ namespace Tnb.ProductionMgr
|
||||
{
|
||||
prdTaskList.ForEach(x => x.act_start_date = DateTime.Now);
|
||||
}
|
||||
if (behavior == PrdTaskBehavior.Compled)
|
||||
{
|
||||
prdTaskList.ForEach(x => x.act_end_date = DateTime.Now);
|
||||
}
|
||||
row = await db.Updateable(prdTaskList).ExecuteCommandAsync();
|
||||
foreach (var item in prdTaskList)
|
||||
{
|
||||
@@ -2080,7 +2084,7 @@ namespace Tnb.ProductionMgr
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString("yyyy-MM-dd"),
|
||||
eqp_id = a.eqp_id==null ? "" : h.code+"/"+h.name,
|
||||
eqp_id_id = a.eqp_id,
|
||||
create_time = a.create_time==null ? "" :a.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss")
|
||||
create_time = a.create_time==null ? "" :a.create_time.Value.ToString(DbTimeFormat.SS)
|
||||
}).OrderByDescending(a => a.create_time).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
return PageResult<WorkOrderAdjustmentListOutput>.SqlSugarPageResult(result);
|
||||
}
|
||||
|
||||
@@ -276,8 +276,8 @@ namespace Tnb.ProductionMgr
|
||||
scrap_qty = a.scrap_qty,
|
||||
scheduled_qty = a.scheduled_qty,
|
||||
reported_work_qty = a.reported_work_qty,
|
||||
estimated_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
parent_id = a.parent_id,
|
||||
process_id = a.process_id,
|
||||
process_name = c.process_name,
|
||||
@@ -332,8 +332,8 @@ namespace Tnb.ProductionMgr
|
||||
scrap_qty = a.scrap_qty,
|
||||
scheduled_qty = a.scheduled_qty,
|
||||
reported_work_qty = a.reported_work_qty,
|
||||
estimated_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
parent_id = a.parent_id,
|
||||
process_id = a.process_id,
|
||||
process_name = c.process_name,
|
||||
@@ -362,6 +362,8 @@ namespace Tnb.ProductionMgr
|
||||
Dictionary<string, object> queryJson = string.IsNullOrEmpty(input.queryJson) ? new Dictionary<string, object>() : input.queryJson.ToObject<Dictionary<string, object>>();
|
||||
string mo_task_code = queryJson.ContainsKey("mo_task_code") ? queryJson["mo_task_code"].ToString() : "";
|
||||
string status = queryJson.ContainsKey("status") ? queryJson["status"].ToString() : "";
|
||||
DateTime? start_time = queryJson.ContainsKey("start_time") ? queryJson["start_time"].ToString()=="" ? null : Convert.ToDateTime(queryJson["start_time"]) : null;
|
||||
DateTime? end_time = queryJson.ContainsKey("end_time") ? queryJson["end_time"].ToString()=="" ? null : Convert.ToDateTime(queryJson["end_time"]) : null;
|
||||
List<string> statusList = new List<string>();
|
||||
if (!string.IsNullOrEmpty(status))
|
||||
{
|
||||
@@ -398,11 +400,15 @@ namespace Tnb.ProductionMgr
|
||||
.LeftJoin<PerProcessStandardsH>((a,b,c,d,e,f,g,h)=>a.material_id==h.output_material_id && a.eqp_id==h.equip_id && a.mold_id==h.molds_id && h.enabled==1)
|
||||
.LeftJoin<BasStandardTime>((a,b,c,d,e,f,g,h,i)=>a.process_id==i.process_id && i.enabled==1)
|
||||
.LeftJoin<PrdMo>((a,b,c,d,e,f,g,h,i,j)=>a.mo_id==j.id)
|
||||
.LeftJoin<BasMaterialUnit>((a,b,c,d,e,f,g,h,i,j,k)=>a.material_id==k.material_id && k.auxiliary_unit_id=="kg")
|
||||
.LeftJoin<EqpDaq>((a,b,c,d,e,f,g,h,i,j,k,l)=>a.eqp_id==l.equip_id && l.enabled==1 && l.label_point=="提报装箱称重点位")
|
||||
.Where((a, b) => a.workstation_id == input.stationId && (a.mo_task_status == DictConst.ToBeStartedEnCode || a.mo_task_status == DictConst.MoStatusPauseCode || a.mo_task_status == DictConst.ComplatedEnCode || a.mo_task_status == DictConst.InProgressEnCode) )
|
||||
.WhereIF(!string.IsNullOrEmpty(mo_task_code),a=>a.mo_task_code.Contains(mo_task_code))
|
||||
//.WhereIF(!string.IsNullOrEmpty(mo_task_status),a=>a.mo_task_status==mo_task_status)
|
||||
.WhereIF(statusList.Count>0,a=>statusList.Contains(a.mo_task_status))
|
||||
.Select((a, b, c, d, e,f,g,h,i,j) => new PADPackageTaskPageOutput
|
||||
.WhereIF(status=="3" && start_time!=null,a=>a.act_end_date>=start_time)
|
||||
.WhereIF(status=="3" && end_time!=null,a=>a.act_end_date<=end_time)
|
||||
.Select((a, b, c, d, e,f,g,h,i,j,k,l) => new PADPackageTaskPageOutput
|
||||
{
|
||||
id = a.id,
|
||||
mo_task_code = a.mo_task_code,
|
||||
@@ -419,8 +425,8 @@ namespace Tnb.ProductionMgr
|
||||
scrap_qty = a.scrap_qty,
|
||||
scheduled_qty = a.scheduled_qty,
|
||||
reported_work_qty = a.reported_work_qty,
|
||||
estimated_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
estimated_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
estimated_end_date = a.estimated_end_date==null ? "" : a.estimated_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
parent_id = a.parent_id,
|
||||
process_id = a.process_id,
|
||||
process_name = c.process_name,
|
||||
@@ -436,8 +442,15 @@ namespace Tnb.ProductionMgr
|
||||
mold_cavity = g.mold_cavity,
|
||||
moulding_cycle = h.moulding_cycle,
|
||||
standard_time = i.standard_time,
|
||||
act_start_date = a.act_start_date==null ? "" : a.act_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
act_start_date = a.act_start_date==null ? "" : a.act_start_date.Value.ToString(DbTimeFormat.SS),
|
||||
act_end_date = a.act_end_date==null ? "" : a.act_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString(DbTimeFormat.SS),
|
||||
tube = f.tube,
|
||||
minpacking = b.minpacking,
|
||||
main_num = k.number_of_primary_unit,
|
||||
deputy_num = k.number_of_auxiliary_unit,
|
||||
third_equip_code = f.third_equip_code,
|
||||
weight_name = l.label_name
|
||||
})
|
||||
.MergeTable()
|
||||
.OrderBy($"{input.sidx} {input.sort}")
|
||||
|
||||
@@ -126,7 +126,7 @@ namespace Tnb.ProductionMgr
|
||||
reported_qty = x.reported_qty,
|
||||
create_id = y.RealName,
|
||||
create_id_id = x.create_id,
|
||||
create_time = x.create_time==null ? "" : x.create_time.Value.ToString("yyyy-MM-dd HH:mm"),
|
||||
create_time = x.create_time==null ? "" : x.create_time.Value.ToString(DbTimeFormat.MM),
|
||||
batch = x.barcode
|
||||
})
|
||||
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
|
||||
47
ProductionMgr/Tnb.ProductionMgr/RedisDataService.cs
Normal file
47
ProductionMgr/Tnb.ProductionMgr/RedisDataService.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using System.Collections;
|
||||
using JNPF.Common.Cache;
|
||||
using JNPF.Common.Manager;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.FriendlyException;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Tnb.ProductionMgr.Interfaces;
|
||||
|
||||
namespace Tnb.ProductionMgr
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据采集
|
||||
/// </summary>
|
||||
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)]
|
||||
[Route("api/[area]/[controller]/[action]")]
|
||||
public class RedisDataService: IRedisDataService, IDynamicApiController, ITransient
|
||||
{
|
||||
private readonly RedisCache _redisCache;
|
||||
public RedisDataService(RedisCache redisCache)
|
||||
{
|
||||
_redisCache = redisCache;
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据机号获取重量
|
||||
/// </summary>
|
||||
[HttpPost]
|
||||
public async Task<dynamic> GetWeight(string device, string jihao)
|
||||
{
|
||||
decimal result = 0;
|
||||
if (!_redisCache.HashExist(device, jihao))
|
||||
throw Oops.Bah("没有找到" + device + "----" + jihao + "的数据");
|
||||
var data = _redisCache.GetHash(device, jihao);
|
||||
|
||||
var res = JsonConvert.DeserializeObject<JObject>(data);
|
||||
if (res != null && res["Value"] != null)
|
||||
{
|
||||
result=decimal.Parse( res["Value"]!.ToString());
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,7 @@ namespace Tnb.QcMgr.Entities
|
||||
public object[]? checkbox { get; set; }
|
||||
public string? errorcause { get; set; }
|
||||
public string? errorlevel { get; set; }
|
||||
public object? measuredValue { get; set; }
|
||||
public string? measuredValue { get; set; }
|
||||
public string? radio { get; set; }
|
||||
public string? remark { get; set; }
|
||||
public string? text { get; set; }
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Aspose.Cells.Drawing;
|
||||
@@ -14,6 +15,7 @@ using JNPF.VisualDev;
|
||||
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
using NPOI.SS.Formula.Functions;
|
||||
using SqlSugar;
|
||||
using Tnb.BasicData.Entities;
|
||||
using Tnb.QcMgr.Entities;
|
||||
@@ -25,13 +27,13 @@ namespace Tnb.QcMgr
|
||||
[ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 800)]
|
||||
[Route("api/[area]/[controller]/[action]")]
|
||||
[OverideVisualDev(ModuleId)]
|
||||
public class QcCheckTaskResultServic:IDynamicApiController, ITransient, IOverideVisualDevService
|
||||
public class QcCheckTaskResultService : IDynamicApiController, ITransient, IOverideVisualDevService
|
||||
{
|
||||
private const string ModuleId = "26873741070613";
|
||||
private readonly ISqlSugarRepository<QcCheckExecH> _repository;
|
||||
private readonly IUserManager _userManager;
|
||||
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||
public QcCheckTaskResultServic(ISqlSugarRepository<QcCheckExecH> repository, IUserManager userManager)
|
||||
public QcCheckTaskResultService(ISqlSugarRepository<QcCheckExecH> repository, IUserManager userManager)
|
||||
{
|
||||
_repository = repository;
|
||||
_userManager = userManager;
|
||||
@@ -87,5 +89,67 @@ namespace Tnb.QcMgr
|
||||
}
|
||||
return PageResult<QcCheckExecHOut>.SqlSugarPageResult(result);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<dynamic> GetCheckTask(VisualDevModelListQueryInput input)
|
||||
{
|
||||
var db = _repository.AsSugarClient();
|
||||
Dictionary<string, string> dic = new Dictionary<string, string>();
|
||||
dic.Add("ok", "合格");
|
||||
dic.Add("no", "不合格");
|
||||
dic.Add("barelyOk", "让步合格");
|
||||
dic.Add("await", "待检");
|
||||
dic.Add("temporarily", "暂控");
|
||||
Dictionary<string, string> queryJson = !string.IsNullOrEmpty(input.queryJson) ? JsonConvert.DeserializeObject<Dictionary<string, string>>(input.queryJson) : new Dictionary<string, string>();
|
||||
string materialid = queryJson.ContainsKey("materialid") ? queryJson["materialid"].ToString() : "";
|
||||
string checktype = queryJson.ContainsKey("checktype") ? queryJson["checktype"].ToString() : "";
|
||||
string status = queryJson.ContainsKey("status") ? queryJson["status"].ToString() : "";
|
||||
var list = await db.Queryable<DictionaryDataEntity>()
|
||||
.LeftJoin<DictionaryTypeEntity>((a, b) => a.DictionaryTypeId == b.Id)
|
||||
.Where((a, b) => b.FullName == "质检状态" || b.FullName == "质检类型选择").ToListAsync();
|
||||
var BasLocations = await db.Queryable<BasLocation>().ToListAsync();
|
||||
Expression<Func<QcCheckExecHOut, object>> expression;
|
||||
if (list.Where(p => p.FullName == "待执行").First().Id == status)
|
||||
{
|
||||
expression = a => DateTime.Parse(a.tasktime!);
|
||||
}
|
||||
else
|
||||
{
|
||||
expression = a => DateTime.Parse(a.exectime!);
|
||||
}
|
||||
var result = await db.Queryable<QcCheckExecH>()
|
||||
.LeftJoin<BasMaterial>((a, b) => a.materialid == b.id)
|
||||
.LeftJoin<BasProcess>((a, b, c) => a.processid == c.id)
|
||||
.LeftJoin<OrganizeEntity>((a, b, c, d) => a.workid == d.Id)
|
||||
.LeftJoin<UserEntity>((a, b, c, d, e) => a.execuser == e.Id)
|
||||
.WhereIF(!string.IsNullOrEmpty(materialid), (a, b, c, d, e) => a.materialid == materialid)
|
||||
.WhereIF(!string.IsNullOrEmpty(checktype), (a, b, c, d, e) => a.checktype == checktype)
|
||||
.WhereIF(!string.IsNullOrEmpty(status), (a, b, c, d, e) => a.status == status)
|
||||
// .Where((a, b, c, d, e) => a.status == list.Where(p => p.FullName == "已完成").First().Id)
|
||||
.Select((a, b, c, d, e) => new QcCheckExecHOut
|
||||
{
|
||||
id = a.id,
|
||||
materialid = b.name,
|
||||
checktype = a.checktype,
|
||||
workid = d.FullName,
|
||||
processid = c.process_name,
|
||||
wareid = a.wareid,
|
||||
checknum = a.checknum,
|
||||
status = a.status,
|
||||
result = a.result,
|
||||
tasktime = a.tasktime == null ? "" : a.tasktime,
|
||||
exectime = a.exectime == null ? "" : a.exectime,
|
||||
execuser = e.RealName == null ? "" : e.RealName,
|
||||
}).OrderByDescending(expression).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||
|
||||
foreach (var item in result.list)
|
||||
{
|
||||
item.checktype = list.Select(p => p.Id).Contains(item.checktype) ? list.Where(p => p.Id == item.checktype).First().FullName : "";
|
||||
item.status = list.Select(p => p.Id).Contains(item.status) ? list.Where(p => p.Id == item.status).First().FullName : "";
|
||||
item.result = dic.Where(p => p.Key == item.result).Any() ? dic.Where(p => p.Key == item.result).First().Value : "";
|
||||
item.wareid = BasLocations.Where(p => p.id == item.wareid).Any() ? BasLocations.Where(p => p.id == item.wareid).First().location_code : "";
|
||||
}
|
||||
return PageResult<QcCheckExecHOut>.SqlSugarPageResult(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,5 +15,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
|
||||
/// 任务执行Ids
|
||||
/// </summary>
|
||||
public List<string> disTaskIds { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,5 +15,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
|
||||
/// 任务执行Ids
|
||||
/// </summary>
|
||||
public List<string> disTaskIds { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,4 +13,53 @@ public partial class WmsElevatorH
|
||||
{
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public int end_floor { get; set; }
|
||||
/// <summary>
|
||||
/// 上级表单ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string bill_id { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 库位ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
|
||||
public string location_id { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 库位编号
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
|
||||
public string location_code { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 点位ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
|
||||
public string point_id { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 点位编号
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
|
||||
public string point_code { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 楼层
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
|
||||
public int floor { get; set; }
|
||||
/// <summary>
|
||||
/// 执行任务Id
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string distask_id { get; set; }
|
||||
/// <summary>
|
||||
/// 设备Id
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string device_id { get; set; }
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ using JNPF.Common.Extension;
|
||||
using JNPF.DataEncryption;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.Extras.CollectiveOAuth.Enums;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
@@ -34,6 +35,8 @@ using NPOI.SS.UserModel;
|
||||
using NPOI.XSSF.UserModel;
|
||||
using SqlSugar;
|
||||
using Tnb.BasicData.Entities;
|
||||
using Tnb.Common.Core.EventBus.Constants;
|
||||
using Tnb.Common.Core.EventBus.Sources;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Attributes;
|
||||
using Tnb.WarehouseMgr.Entities.Consts;
|
||||
@@ -53,14 +56,22 @@ namespace Tnb.WarehouseMgr
|
||||
private static Lazy<Dictionary<string, IWHStorageService>> _stroageMapLazy;
|
||||
private static Dictionary<string, IWHStorageService> _storeMap = new(StringComparer.OrdinalIgnoreCase);
|
||||
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||
private readonly ChannelWriter<NotifyMessage> _channelWriter;
|
||||
|
||||
private IEventPublisher _eventPublisher;
|
||||
|
||||
|
||||
protected IEventPublisher EventPublisher
|
||||
{
|
||||
set { _eventPublisher = value; }
|
||||
get { return _eventPublisher; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
public BaseWareHouseService(ChannelWriter<NotifyMessage>? channelWriter = default)
|
||||
/*public BaseWareHouseService(ChannelWriter<NotifyMessage>? channelWriter = default)
|
||||
{
|
||||
_channelWriter = channelWriter;
|
||||
}
|
||||
}*/
|
||||
|
||||
static BaseWareHouseService()
|
||||
{
|
||||
@@ -97,6 +108,23 @@ namespace Tnb.WarehouseMgr
|
||||
return Task.FromResult(curUser);
|
||||
}
|
||||
|
||||
|
||||
protected Task SetUserEntity(IUserManager userManager, ClaimsPrincipal principal)
|
||||
=> Task.Run(() =>
|
||||
{
|
||||
FieldInfo fieldInfo = userManager.GetType().GetField("_user", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
if (fieldInfo != null)
|
||||
{
|
||||
fieldInfo.SetValue(userManager, principal);
|
||||
}
|
||||
});
|
||||
|
||||
protected Task InvokeGenPretaskExcute()
|
||||
{
|
||||
var wareHouseSvc =App.GetRequiredService<IWareHouseService>();
|
||||
return wareHouseSvc.GenTaskExecute();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断最终目标库位是否可以放置当前载具
|
||||
/// </summary>
|
||||
@@ -160,9 +188,7 @@ namespace Tnb.WarehouseMgr
|
||||
[NonAction]
|
||||
protected async Task Publish(string taskName)
|
||||
{
|
||||
NotifyMessage message = new() { TaskName = taskName };
|
||||
if (_channelWriter != null)
|
||||
await _channelWriter.WriteAsync(message);
|
||||
await _eventPublisher.PublishAsync(new TaskStatusChangeSource(EventSubscribeEventConsts.TASKSTATUSCHANGE_EVENTID, taskName));
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
|
||||
61
WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService`1.cs
Normal file
61
WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService`1.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using JNPF.Common.Contracts;
|
||||
using JNPF.Logging;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SqlSugar;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
public class BaseWareHouseService<T> : BaseWareHouseService
|
||||
{
|
||||
protected static Dictionary<string, object> _elevatorMap = new Dictionary<string, object>();
|
||||
|
||||
public BaseWareHouseService(ISqlSugarClient db)
|
||||
{
|
||||
if (_elevatorMap.Count < 1)
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
_elevatorMap = await db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
protected ILogger Logger => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/custom{DateTime.Now:yyyyMMdd}.log", cfgOpts =>
|
||||
{
|
||||
|
||||
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
|
||||
cfgOpts.MessageFormat = (logMsg) =>
|
||||
{
|
||||
Span<char> span = logMsg.LogLevel.ToString().ToCharArray();
|
||||
var sb = new StringBuilder();
|
||||
sb.Append($"{span.Slice(0, 4)} ");
|
||||
sb.Append($"{logMsg.LogName} ");
|
||||
sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
|
||||
sb.Append($"#{logMsg.EventId.Id} ");
|
||||
sb.Append(logMsg.Message + " ");
|
||||
sb.Append(logMsg.Exception?.ToString());
|
||||
return sb.ToString();
|
||||
};
|
||||
|
||||
})).CreateLogger<T>();
|
||||
}
|
||||
|
||||
public static class CustomLoggerExtenstions
|
||||
{
|
||||
public static void Information(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.LogInformation(message, parameters);
|
||||
}
|
||||
|
||||
public static void Error(this ILogger logger, string message, Exception ex, params object[] parameters)
|
||||
{
|
||||
logger.LogError(ex, message, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
public class ConditionalBackgroundService : IHostedService
|
||||
{
|
||||
private readonly IHostedService _backgroundService;
|
||||
//private readonly Func<bool> _condition;
|
||||
|
||||
public ConditionalBackgroundService(IHostedService backgroundService)
|
||||
{
|
||||
_backgroundService = backgroundService;
|
||||
}
|
||||
|
||||
public async Task StartAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
await _backgroundService.StartAsync(cancellationToken);
|
||||
}
|
||||
public async Task StopAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
await _backgroundService.StopAsync(cancellationToken);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -20,12 +20,15 @@ using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.WorkFlow.Entitys.Dto.FlowLaunch;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using NPOI.OpenXmlFormats;
|
||||
using Senparc.NeuChar.ApiHandlers;
|
||||
using SqlSugar;
|
||||
using Tnb.Common.Extension;
|
||||
using Tnb.EquipMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Configs;
|
||||
using Tnb.WarehouseMgr.Entities.Consts;
|
||||
using Tnb.WarehouseMgr.Entities.Dto;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
@@ -40,7 +43,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// Wms设备接口提供程序服务类
|
||||
/// </summary>
|
||||
|
||||
public class DeviceProviderService : BaseWareHouseService
|
||||
public class DeviceProviderService : BaseWareHouseService<DeviceProviderService>
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
@@ -48,6 +51,9 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IEventPublisher _eventPublisher;
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly IElevatorControlService _elevatorControlService;
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
|
||||
|
||||
|
||||
public DeviceProviderService(ISqlSugarRepository<WmsInstockH> repository, IWareHouseService wareHouseService,
|
||||
@@ -55,7 +61,7 @@ namespace Tnb.WarehouseMgr
|
||||
IEventPublisher eventPublisher,
|
||||
IUserManager userManger,
|
||||
IElevatorControlService elevatorControlService
|
||||
)
|
||||
) : base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_wareHouseService = wareHouseService;
|
||||
@@ -72,6 +78,7 @@ namespace Tnb.WarehouseMgr
|
||||
[HttpPost, NonUnify]
|
||||
public async Task<Result> CreateTaskChain()
|
||||
{
|
||||
Logger.LogInformation("fasdfadsfadsfasdfasdfadsfasdfadsfadsfasdfasdfasdfasdfas");
|
||||
return await Task.FromResult<Result>(null);
|
||||
}
|
||||
|
||||
@@ -85,32 +92,43 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
Log.Information("取货确认..................");
|
||||
|
||||
try
|
||||
{
|
||||
var elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
var elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id)
|
||||
.LeftJoin<WmsPointH>((a, b, c, d) => c.startlocation_id == d.location_id)
|
||||
.Where((a, b, c, d) => d.point_code == input.sourceName && input.taskCode.Contains(c.bill_code))
|
||||
.Select((a, b, c, d) => new WmsElevatorH
|
||||
{
|
||||
distask_id = c.id,
|
||||
device_id = c.device_id,
|
||||
}, true)
|
||||
.FirstAsync();
|
||||
|
||||
//Log.Information($"elevator!=null?{elevator!=null}");
|
||||
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus("Elevator1", CancellationToken.None);
|
||||
Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus.ToEnum<EnumRunStatus>().ToString()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{floorNo}");
|
||||
if (elevator.IsNull())
|
||||
{
|
||||
Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"));
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
}
|
||||
try
|
||||
{
|
||||
Logger.Information($"当前任务Id:{elevator.distask_id}");
|
||||
if (_elevatorMap.TryGetValue(elevator.device_id, out var elevatorCode))
|
||||
{
|
||||
//var endFloor = elevator.end_floor;
|
||||
var floor = 5;
|
||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.开门到位保持)
|
||||
var devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName;
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus.ToEnum<EnumRunStatus>().ToString()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{floorNo}");
|
||||
{
|
||||
await _elevatorControlService.SendOpenCloseCmd("Elevator1", 3); //发送电梯前门开门指令
|
||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.开门到位保持)
|
||||
{
|
||||
await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||
}
|
||||
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯)
|
||||
{
|
||||
//elevator.current_floor = floor;
|
||||
//await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
}
|
||||
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯)
|
||||
{
|
||||
//elevator.current_floor = floor;
|
||||
//await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -130,7 +148,7 @@ namespace Tnb.WarehouseMgr
|
||||
[HttpPost, NonUnify, AllowAnonymous]
|
||||
public async Task<Result> UnloadConfirm(ConfirmInput input)//
|
||||
{
|
||||
Log.Information("放货确认..................");
|
||||
Logger.Information("放货确认..................");
|
||||
try
|
||||
{
|
||||
//根据Agv传递的参数获取,对应的电梯
|
||||
@@ -138,48 +156,60 @@ namespace Tnb.WarehouseMgr
|
||||
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.endlocation_id)
|
||||
.LeftJoin<WmsPointH>((a, b, c, d) => c.endlocation_id == d.location_id)
|
||||
.Where((a, b, c, d) => d.point_code == input.targetName && c.bill_code == input.taskCode)
|
||||
.Select((a, b, c, d) => new WmsElevatorH { end_floor = SqlFunc.ToInt32(c.end_floor) }, true)
|
||||
.Select((a, b, c, d) => new WmsElevatorH
|
||||
{
|
||||
end_floor = SqlFunc.ToInt32(c.end_floor),
|
||||
distask_id = c.id,
|
||||
}, true)
|
||||
.FirstAsync();
|
||||
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus("Elevator1", CancellationToken.None);//elevator.elevator_code
|
||||
Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
||||
//判断Agv电梯是否进入状态
|
||||
if (agvStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
if (elevator.IsNull())
|
||||
throw new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
if (_elevatorMap.TryGetValue(elevator.elevator_id, out var elevatorCode))
|
||||
{
|
||||
await _elevatorControlService.WriteTagAsync("Elevator1", ElevatorConsts.AGVControl, 1);
|
||||
}
|
||||
|
||||
Log.Information("目前正常");
|
||||
|
||||
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
|
||||
if (doorStatus != (int)EnumDoorStatus.开门到位保持)
|
||||
{
|
||||
await _elevatorControlService.SendOpenCloseCmd("Elevator1", 3); //发送电梯前门开门指令
|
||||
}
|
||||
if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯
|
||||
&& doorStatus == (int)EnumDoorStatus.开门到位保持)
|
||||
{
|
||||
Log.Information("进入开门状态,马上要成功了");
|
||||
try
|
||||
var devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName;
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);//elevator.elevator_code
|
||||
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
||||
//判断Agv电梯是否进入状态
|
||||
if (agvStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
elevator.current_floor = elevator.end_floor;
|
||||
await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("更新延迟队列异常", ex);
|
||||
throw;
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
}
|
||||
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
Logger.Information("目前正常");
|
||||
|
||||
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
|
||||
if (doorStatus != (int)EnumDoorStatus.开门到位保持)
|
||||
{
|
||||
await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||
}
|
||||
if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯
|
||||
&& doorStatus == (int)EnumDoorStatus.开门到位保持)
|
||||
{
|
||||
Log.Information("进入开门状态,马上要成功了");
|
||||
try
|
||||
{
|
||||
/* elevator.current_floor = elevator.end_floor;
|
||||
await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();*/
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("更新延迟队列异常", ex);
|
||||
throw;
|
||||
}
|
||||
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("放货确认失败", ex);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
throw;
|
||||
}
|
||||
@@ -194,7 +224,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.Information($"任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}");
|
||||
Logger.Information($"任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}");
|
||||
switch (input.status)
|
||||
{
|
||||
case "CREATED": break;
|
||||
@@ -235,8 +265,9 @@ namespace Tnb.WarehouseMgr
|
||||
CreatorTime = DateTime.Now
|
||||
}));
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("任务链状态上报", ex);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
||||
throw;
|
||||
}
|
||||
@@ -263,26 +294,16 @@ namespace Tnb.WarehouseMgr
|
||||
disTaskIds = disTasks.Select(x => x.id).ToList()
|
||||
};
|
||||
await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput);
|
||||
Log.Information("Agv取货完成");
|
||||
Logger.Information($"Agv取货完成,任务Id:{string.Join(",", disTasks.Select(x => x.id))}");
|
||||
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中");
|
||||
if (elevatorQueueItem != null)
|
||||
{
|
||||
Log.Information("开始进入关门流程");
|
||||
|
||||
var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
|
||||
//if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
|
||||
Logger.Information("开始进入关门流程");
|
||||
var doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus);
|
||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.关门到位保持)
|
||||
{
|
||||
var doorStatus = await _elevatorControlService.GetTagAsync("Elevator1", ElevatorConsts.DoorStatus);
|
||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.关门到位保持)
|
||||
{
|
||||
await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令
|
||||
await _db.Deleteable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "待执行");
|
||||
if (!elevatorQueueItem?.elevator_code.IsNullOrEmpty() ?? false)
|
||||
{
|
||||
await (_wareHouseService.AddUnExecuteTask?.Invoke(elevatorQueueItem?.elevator_code!, disTask.start_floor.ParseToInt()) ?? Task.CompletedTask);
|
||||
}
|
||||
}
|
||||
await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令
|
||||
await _db.Deleteable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,7 +320,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("任务状态上报出现错误", ex);
|
||||
Logger.Error("任务状态上报出现错误", ex);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
||||
throw;
|
||||
}
|
||||
|
||||
@@ -1,215 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using JNPF.Common.Contracts;
|
||||
using NPOI.SS.Formula.Functions;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
/// <summary>
|
||||
/// 迪杰斯特拉(最短路径算法)
|
||||
/// </summary>
|
||||
//public class Dijkstra<T> where T : BaseEntity<string>, IWmsRoadEntity, new()
|
||||
//{
|
||||
// public static int MAX = int.MaxValue;
|
||||
|
||||
// public int mEdgNum; // 边的数量
|
||||
// public VNode[] mVexs; // 顶点数组
|
||||
// //private EData[] edges; //边的数组
|
||||
// /*
|
||||
// * 创建图
|
||||
// *
|
||||
// * 参数说明:
|
||||
// * vexs -- 顶点数组
|
||||
// * edges -- 边
|
||||
// */
|
||||
// public Dijkstra(string[] vexs, EData[] edges)
|
||||
// {
|
||||
|
||||
// // 初始化"顶点数"和"边数"
|
||||
// int vlen = vexs.Length;
|
||||
// int elen = edges.Length;
|
||||
|
||||
// // 初始化"顶点"
|
||||
// mVexs = new VNode[vlen];
|
||||
// for (int i = 0; i < mVexs.Length; i++)
|
||||
// {
|
||||
// mVexs[i] = new VNode();
|
||||
// mVexs[i].data = vexs[i];
|
||||
// mVexs[i].firstEdge = null;
|
||||
// }
|
||||
|
||||
// // 初始化"边"
|
||||
// mEdgNum = elen;
|
||||
// for (int i = 0; i < elen; i++)
|
||||
// {
|
||||
// // 读取边的起始顶点和结束顶点
|
||||
// string c1 = edges[i].start;
|
||||
// string c2 = edges[i].end;
|
||||
// int weight = edges[i].weight;
|
||||
|
||||
// // 读取边的起始顶点和结束顶点
|
||||
// int p1 = GetPosition(c1);
|
||||
// int p2 = GetPosition(c2);
|
||||
// // 初始化node1
|
||||
// ENode node1 = new ENode();
|
||||
// node1.ivex = p2;
|
||||
// node1.weight = weight;
|
||||
// // 将node1链接到"p1所在链表的末尾"
|
||||
// if (mVexs[p1].firstEdge == null)
|
||||
// mVexs[p1].firstEdge = node1;
|
||||
// else
|
||||
// LinkLast(mVexs[p1].firstEdge, node1);
|
||||
// // 初始化node2
|
||||
// ENode node2 = new ENode();
|
||||
// node2.ivex = p1;
|
||||
// node2.weight = weight;
|
||||
// // 将node2链接到"p2所在链表的末尾"
|
||||
// if (mVexs[p2].firstEdge == null)
|
||||
// mVexs[p2].firstEdge = node2;
|
||||
// else
|
||||
// LinkLast(mVexs[p2].firstEdge, node2);
|
||||
// }
|
||||
// }
|
||||
|
||||
// /*
|
||||
// * 将node节点链接到list的最后
|
||||
// */
|
||||
// private void LinkLast(ENode list, ENode node)
|
||||
// {
|
||||
// ENode p = list;
|
||||
|
||||
// while (p.nextEdge != null)
|
||||
// p = p.nextEdge;
|
||||
// p.nextEdge = node;
|
||||
// }
|
||||
|
||||
// /*
|
||||
// * 返回ch位置
|
||||
// */
|
||||
// private int GetPosition(string ch)
|
||||
// {
|
||||
// for (int i = 0; i < mVexs.Length; i++)
|
||||
// if (mVexs[i].data == ch)
|
||||
// return i;
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// /*
|
||||
// * 获取边<start, end>的权值;若start和end不是连通的,则返回无穷大。
|
||||
// */
|
||||
// private int GetWeight(int start, int end)
|
||||
// {
|
||||
// if (start == end)
|
||||
// return 0;
|
||||
|
||||
// ENode node = mVexs[start].firstEdge;
|
||||
// while (node != null)
|
||||
// {
|
||||
// if (end == node.ivex)
|
||||
// return node.weight;
|
||||
// node = node.nextEdge;
|
||||
// }
|
||||
|
||||
// return MAX;
|
||||
// }
|
||||
|
||||
// /*
|
||||
// * Dijkstra最短路径。
|
||||
// * 即,统计图中"起点D"到其它各个顶点的最短路径。
|
||||
// *
|
||||
// * 参数说明:
|
||||
// * vs -- 起始顶点(start vertex)。
|
||||
// * prev -- 前驱顶点数组。即,prev[i]的值是"起点D"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。
|
||||
// * dist -- 长度数组。即,dist[i]是"起点D"到"顶点i"的最短路径的长度。
|
||||
// */
|
||||
// public void CalcDijkstra(int vs, int[] prev, int[] dist, List<T> roads)
|
||||
// {
|
||||
// //List<T> vertexs = new(); //最短路径串联的点位列表
|
||||
// // flag[i]=true表示"起点D"到"顶点i"的最短路径已成功获取。
|
||||
// bool[] flag = new bool[mVexs.Length];
|
||||
|
||||
// // 初始化
|
||||
// for (int i = 0; i < mVexs.Length; i++)
|
||||
// {
|
||||
// flag[i] = false; // 顶点i的最短路径还没获取到。
|
||||
// prev[i] = 0; // 顶点i的前驱顶点为0。
|
||||
// dist[i] = GetWeight(vs, i); // 顶点i的最短路径为"起点D"到"顶点i"的权。
|
||||
// }
|
||||
|
||||
// // 对"起点D"自身进行初始化
|
||||
// flag[vs] = true;
|
||||
// dist[vs] = 0;
|
||||
|
||||
// // 遍历mVexs.Length-1次;每次找出一个顶点的最短路径。
|
||||
// int k = 0;
|
||||
// for (int i = 1; i < mVexs.Length; i++)
|
||||
// {
|
||||
// // 寻找当前最小的路径
|
||||
// // 即,在未获取最短路径的顶点中,找到离起点D最近的顶点(k)。
|
||||
// int min = MAX;
|
||||
// for (int j = 0; j < mVexs.Length; j++)
|
||||
// {
|
||||
// if (flag[j] == false && dist[j] < min)
|
||||
// {
|
||||
// min = dist[j];
|
||||
// k = j;
|
||||
// }
|
||||
// }
|
||||
// // 标记"顶点k"为已经获取到最短路径
|
||||
// flag[k] = true;
|
||||
// // 更新当前最短路径和前驱顶点
|
||||
// // 即,更新"未获取最短路径的顶点的最短路径和前驱顶点"。
|
||||
// for (int j = 0; j < mVexs.Length; j++)
|
||||
// {
|
||||
// int tmp = GetWeight(k, j);
|
||||
// tmp = (tmp == MAX ? MAX : (min + tmp)); // 防止溢出
|
||||
// if (flag[j] == false && (tmp < dist[j]))
|
||||
// {
|
||||
// dist[j] = tmp;
|
||||
// prev[j] = k;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
///// <summary>
|
||||
///// 邻接表中表对应的链表的顶点
|
||||
///// </summary>
|
||||
//public class ENode
|
||||
//{
|
||||
// public int ivex; // 该边所指向的顶点的位置
|
||||
// public int weight; // 该边的权
|
||||
// public ENode nextEdge; // 指向下一条弧的指针
|
||||
//}
|
||||
|
||||
///// <summary>
|
||||
///// 邻接表中表的顶点
|
||||
///// </summary>
|
||||
//public class VNode
|
||||
//{
|
||||
// public string data; // 顶点信息
|
||||
// public ENode firstEdge; // 指向第一条依附该顶点的弧
|
||||
//}
|
||||
|
||||
///// <summary>
|
||||
///// 边的结构体
|
||||
///// </summary>
|
||||
//public class EData
|
||||
//{
|
||||
// public string start; // 边的起点
|
||||
// public string end; // 边的终点
|
||||
// public int weight; // 边的权重
|
||||
|
||||
// public EData(string start, string end, int weight)
|
||||
// {
|
||||
// this.start = start;
|
||||
// this.end = end;
|
||||
// this.weight = weight;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Templates;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NPOI.SS.Formula.Functions;
|
||||
using Spire.Doc;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
/// <summary>
|
||||
/// 动态规划类
|
||||
/// </summary>
|
||||
public class Dp
|
||||
{
|
||||
private HashSet<string> set = new HashSet<string>();
|
||||
|
||||
/// <summary>
|
||||
/// 动态规划函数
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public void DpFunc(List<WmsRoad> roads, List<string> pointIds, Dictionary<string, bool> isVisited, string sPointId, string ePointId, dynamic ArrivedEpoint)
|
||||
{
|
||||
var sRoads = roads.FindAll(x => x.startpoint_id == sPointId).ToList();
|
||||
var sRoads_EPointIds = sRoads.Select(x => x.endpoint_id).ToList();
|
||||
|
||||
if (!isVisited[sPointId])
|
||||
{
|
||||
pointIds.Add(sPointId);
|
||||
set.Add(roads?.Find(x => x.startpoint_id == sPointId)?.startpoint_code!);
|
||||
isVisited[sPointId] = true;
|
||||
}
|
||||
|
||||
if (sRoads_EPointIds.Contains(ePointId)) //判断是否到达终点
|
||||
{
|
||||
ArrivedEpoint.isArrivedEpoint = true;
|
||||
pointIds.Add(ePointId);
|
||||
foreach (var kvp in isVisited)
|
||||
{
|
||||
isVisited[kvp.Key] = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (sRoads_EPointIds?.Count > 0)
|
||||
{
|
||||
var subRoads = roads?.FindAll(x => sRoads_EPointIds.Contains(x.startpoint_id) && !isVisited[x.endpoint_id]);
|
||||
if (subRoads?.Count > 0)
|
||||
{
|
||||
for (int i = 0; i < subRoads.Count; i++)
|
||||
{
|
||||
var sIdx = subRoads[i].startpoint_id;
|
||||
if (!isVisited[sIdx])
|
||||
{
|
||||
DpFunc(roads, pointIds, isVisited, sIdx, ePointId, ArrivedEpoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!ArrivedEpoint.isArrivedEpoint)
|
||||
{
|
||||
pointIds.Remove(sPointId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
using System.Reflection;
|
||||
using System.Security.Claims;
|
||||
using JNPF.Common.Configuration;
|
||||
using JNPF.Common.Core.Manager;
|
||||
using JNPF.DataEncryption;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.TaskScheduler.Entitys;
|
||||
using NetTaste;
|
||||
using SqlSugar;
|
||||
using Tnb.Common.Core.EventBus.Constants;
|
||||
using Tnb.Common.Core.EventBus.Sources;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
|
||||
namespace Tnb.WarehouseMgr.EventSubscribers;
|
||||
|
||||
/// <summary>
|
||||
/// 任务事件订阅.
|
||||
/// </summary>
|
||||
public class TaskStatusChangeSubscriber : IEventSubscriber, ISingleton
|
||||
{
|
||||
/// <summary>
|
||||
/// 初始化客户端.
|
||||
/// </summary>
|
||||
//private static SqlSugarScope? _sqlSugarClient;
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
private readonly IWmskittingOutService _wmskittingOutService;
|
||||
/// <summary>
|
||||
/// 构造函数.
|
||||
/// </summary>
|
||||
public TaskStatusChangeSubscriber(IWareHouseService wareHouseService, IWmskittingOutService wmskittingOutService)
|
||||
{
|
||||
_wareHouseService = wareHouseService;
|
||||
_wmskittingOutService = wmskittingOutService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建任务日记.
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
[EventSubscribe(EventSubscribeEventConsts.TASKSTATUSCHANGE_EVENTID)]
|
||||
public async Task Excute(EventHandlerExecutingContext context)
|
||||
{
|
||||
/*var claims = JWTEncryption.ReadJwtToken(UserManager.AsscessToken)?.Claims;
|
||||
ClaimsIdentity toKen = new ClaimsIdentity();
|
||||
foreach (Claim item in claims)
|
||||
{
|
||||
toKen.AddClaim(item);
|
||||
}
|
||||
var principal = new ClaimsPrincipal(toKen);
|
||||
FieldInfo fieldInfo = _userManager.GetType().GetField("_user", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
if (fieldInfo != null)
|
||||
{
|
||||
fieldInfo.SetValue(_userManager, principal);
|
||||
}*/
|
||||
|
||||
|
||||
var tscSource = (TaskStatusChangeSource)context.Source;
|
||||
switch (tscSource.Payload)
|
||||
{
|
||||
case nameof(_wareHouseService.GenTaskExecute):
|
||||
await _wareHouseService.GenTaskExecute();
|
||||
break;
|
||||
case nameof(_wmskittingOutService.KittingOutByAdd):
|
||||
await _wmskittingOutService.KittingOutByAdd();
|
||||
break;
|
||||
case nameof(_wmskittingOutService.KittingOutByIsToBeShipped):
|
||||
await _wmskittingOutService.KittingOutByIsToBeShipped();
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
public class WareHouseBasedControllerActivator : IControllerActivator
|
||||
{
|
||||
public object Create(ControllerContext context)
|
||||
{
|
||||
if(context == null) { throw new ArgumentNullException("context"); }
|
||||
var controllerType = context.ActionDescriptor.ControllerTypeInfo.AsType();
|
||||
//获取Controller实例
|
||||
var controller =context.HttpContext.RequestServices.GetRequiredService(controllerType);
|
||||
//判断是否继承了自定义Controller基类
|
||||
//if(controller is BaseWareHouseService basedWhSvc)
|
||||
//{
|
||||
// basedWhSvc.WareHouseSrv = context.HttpContext.RequestServices.GetRequiredService<IWareHouseService>();
|
||||
//}
|
||||
return controller;
|
||||
|
||||
}
|
||||
|
||||
public void Release(ControllerContext context, object controller)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -47,17 +47,7 @@ namespace Tnb.WarehouseMgr
|
||||
private IEventPublisher _eventPublisher = default!;
|
||||
private ElevatorControlConfiguration _elevatorControlConfiguration = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private static Dictionary<string, Func<CancellationToken?, Task>> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase);
|
||||
static TimedTaskBackgroundService()
|
||||
{
|
||||
//Task.Run(() =>
|
||||
//{
|
||||
// _timedFuncMap = App.EffectiveTypes.AsParallel().Where(t => !t.Namespace.IsNullOrWhiteSpace() && t.Namespace.Equals("Tnb.WarehouseMgr", StringComparison.OrdinalIgnoreCase)).SelectMany(t => t.GetMethods())
|
||||
// .Where(m => m.GetCustomAttribute<TimedAttribute>() != null)
|
||||
// .ToDictionary(x => x.Name, x =>
|
||||
// (Func<CancellationToken?, Task>)Delegate.CreateDelegate(typeof(Func<CancellationToken?, Task>), App.GetService(x.DeclaringType), x));
|
||||
//});
|
||||
}
|
||||
//private static Dictionary<string, Func<CancellationToken?, Task>> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase);
|
||||
public TimedTaskBackgroundService(IServiceProvider serviceProvider)
|
||||
{
|
||||
_serviceProvider = serviceProvider;
|
||||
@@ -66,39 +56,12 @@ namespace Tnb.WarehouseMgr
|
||||
protected override Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
IsStarted = true;
|
||||
//var queueTask = Task.Run(async () =>
|
||||
// {
|
||||
|
||||
// var channelReader = _serviceProvider.GetRequiredService<ITaskMessageNotify>().Reader;
|
||||
|
||||
// CancellationTokenSource? cts = new();
|
||||
|
||||
// while (channelReader != null && await channelReader.WaitToReadAsync())
|
||||
// {
|
||||
// while (channelReader.TryRead(out var message))
|
||||
// {
|
||||
// if (_timedFuncMap.ContainsKey(message.TaskName))
|
||||
// {
|
||||
// await _timedFuncMap[message.TaskName].Invoke(stoppingToken);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }, stoppingToken);
|
||||
|
||||
var timedTask = Task.Run(() =>
|
||||
{
|
||||
_eventPublisher = App.GetRequiredService<IEventPublisher>();
|
||||
var whSvc = App.GetRequiredService<IWareHouseService>();
|
||||
TimedTask(token => whSvc.GenTaskExecute(), stoppingToken, 1);
|
||||
////齐套出库
|
||||
var kittingOutService = App.GetRequiredService<IWmskittingOutService>();
|
||||
TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1);
|
||||
TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1);
|
||||
//齐套分拣
|
||||
var setSortingService = App.GetRequiredService<IWmsSetSortingService>();
|
||||
TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 2);
|
||||
|
||||
|
||||
//电梯Agv心跳检测
|
||||
TimedTask(async token =>
|
||||
{
|
||||
var parameter = new Dictionary<string, string>();
|
||||
@@ -109,9 +72,18 @@ namespace Tnb.WarehouseMgr
|
||||
var result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
|
||||
await Console.Out.WriteLineAsync($"心跳检测结果:{result}");
|
||||
}, stoppingToken, 30, TimeSpanUnit.Seconds);
|
||||
////齐套出库
|
||||
/*var kittingOutService = App.GetRequiredService<IWmskittingOutService>();
|
||||
TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1);
|
||||
TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1);
|
||||
//齐套分拣
|
||||
var setSortingService = App.GetRequiredService<IWmsSetSortingService>();
|
||||
TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 2);
|
||||
|
||||
|
||||
//最低库存检查
|
||||
var transferSignService = App.GetRequiredService<IWmsPDATransferSignService>();
|
||||
TimedTask(token => transferSignService.IsMinStorage(token), stoppingToken, 30, TimeSpanUnit.Minutes);
|
||||
TimedTask(token => transferSignService.IsMinStorage(token), stoppingToken, 30, TimeSpanUnit.Minutes);*/
|
||||
|
||||
}, stoppingToken);
|
||||
|
||||
@@ -129,6 +101,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
await action(ct).Catch(async ex =>
|
||||
{
|
||||
|
||||
if (ex is TimedTaskException timedTaskEx and not null)
|
||||
{
|
||||
await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateExLog", timedTaskEx.options!, new SysLogEntity
|
||||
|
||||
@@ -33,13 +33,14 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
using Tnb.WarehouseMgr.Entities.Entity;
|
||||
using Tnb.WarehouseMgr.Entities.Enums;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
using JNPF.Common.Extension;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
/// <summary>
|
||||
/// 库房业务类(出入库)
|
||||
/// </summary>
|
||||
public class WareHouseService : BaseWareHouseService, IWareHouseService
|
||||
public class WareHouseService : BaseWareHouseService<WareHouseService>, IWareHouseService
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IDictionaryDataService _dictionaryDataService;
|
||||
@@ -47,12 +48,13 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private readonly IElevatorControlService _elevatorControlService;
|
||||
private static Dictionary<string, object> _elevatorMap = new Dictionary<string, object>();
|
||||
private static Dictionary<string, int> _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
public Func<string, int, Task> AddUnExecuteTask { get; set; }
|
||||
|
||||
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService,
|
||||
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService)
|
||||
: base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -60,10 +62,6 @@ namespace Tnb.WarehouseMgr
|
||||
_userManager = userManager;
|
||||
_cacheManager = cacheManager;
|
||||
_elevatorControlService = elevatorControlService;
|
||||
AddUnExecuteTask = async (code, floor) =>
|
||||
{
|
||||
await _elevatorControlService.CallLift(code, floor, CancellationToken.None);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -226,10 +224,23 @@ namespace Tnb.WarehouseMgr
|
||||
var db = _db.CopyNew();
|
||||
try
|
||||
{
|
||||
//if (_elevatorMap.Count < 1)
|
||||
//{
|
||||
// _elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
//}
|
||||
/*if (_elevatorMap.Count < 1)
|
||||
{
|
||||
_elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
}*/
|
||||
//获取电梯数据
|
||||
var elevatorList = await db.Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.Select((a, b) => new WmsElevatorH
|
||||
{
|
||||
bill_id = b.bill_id,
|
||||
location_id = b.location_id,
|
||||
location_code = b.location_code,
|
||||
point_id = b.point_id,
|
||||
point_code = b.point_code,
|
||||
floor = b.floor
|
||||
}, true).ToListAsync();
|
||||
|
||||
|
||||
//获取所有未下发的预任务申请
|
||||
var preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
|
||||
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
|
||||
@@ -240,6 +251,14 @@ namespace Tnb.WarehouseMgr
|
||||
move_num = c.move_num
|
||||
}, true)
|
||||
.ToListAsync();
|
||||
var agvElevatorTasks = preTasks
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
var firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
|
||||
agvElevatorTasks = agvElevatorTasks.FindAll(x => firstEleGrp.Select(y => y.endlocation_code).Contains(x.endlocation_code));
|
||||
preTasks = preTasks.Where(it => !it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).Concat(agvElevatorTasks).ToList();
|
||||
|
||||
var ids = preTasks.Select(x => x.id).Distinct().ToList();
|
||||
var preTaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
|
||||
if (preTasks.Count > 0)
|
||||
@@ -323,7 +342,25 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
await db.Ado.BeginTranAsync();
|
||||
|
||||
var endPointIds = disTasks.Where(t => t.area_code.StartsWith("ELE", StringComparison.OrdinalIgnoreCase)).Select(t => t.endpoint_id).ToList();
|
||||
if (endPointIds?.Count > 0)
|
||||
{
|
||||
elevatorList = elevatorList.FindAll(x => endPointIds.Contains(x.point_id));
|
||||
if (elevatorList?.Count > 0)
|
||||
{
|
||||
foreach (var e in elevatorList)
|
||||
{
|
||||
var disTask = disTasks.Find(x => x.endpoint_id == e.point_id);
|
||||
if (disTask != null)
|
||||
{
|
||||
disTask.device_id = e.elevator_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//disTasks.ForEach(x => x.id = SnowflakeIdHelper.NextId());
|
||||
|
||||
|
||||
var row = await db.Insertable(disTasks).ExecuteCommandAsync();
|
||||
if (preTaskCodes?.Count > 0)
|
||||
{
|
||||
@@ -335,28 +372,28 @@ namespace Tnb.WarehouseMgr
|
||||
row = await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
Log.Information($"程序运行耗时{sw.ElapsedMilliseconds}ms");
|
||||
await db.Ado.CommitTranAsync();
|
||||
|
||||
//呼梯操作
|
||||
//获取目标库位为电梯库位的任务
|
||||
|
||||
var endLocCodes = disTasks
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)
|
||||
).Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
||||
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||
if (endLocCodes?.Count > 0)
|
||||
{
|
||||
|
||||
await CallingLanding(endLocCodes);
|
||||
}
|
||||
//执行电梯任务
|
||||
var elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||
Log.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||
Log.Information("准备执行电梯任务");
|
||||
|
||||
if (elevatorTasks?.Count > 0)
|
||||
{
|
||||
Log.Information("执行电梯任务");
|
||||
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||
Logger.Information("准备执行电梯任务");
|
||||
Logger.Information("执行电梯任务");
|
||||
|
||||
foreach (var elevatorTask in elevatorTasks)
|
||||
{
|
||||
await ExecuteTargetFloorTask(elevatorTask);
|
||||
@@ -369,7 +406,6 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
await AgvDispatch(agvTasks, agvCts.Token);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex) when (ex is HttpRequestException hReqEx)
|
||||
@@ -378,7 +414,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("生成预任务执行时出现错误", ex);
|
||||
Logger.Error("生成预任务执行时出现错误", ex);
|
||||
await db.Ado.RollbackTranAsync();
|
||||
throw;
|
||||
}
|
||||
@@ -394,63 +430,71 @@ namespace Tnb.WarehouseMgr
|
||||
/// <returns></returns>
|
||||
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes)
|
||||
{
|
||||
Log.Information($"开始呼梯操作.............");
|
||||
Logger.Information($" 开始呼梯操作.............");
|
||||
try
|
||||
{
|
||||
var item = endLocCodes.FirstOrDefault();
|
||||
//if (_elevatorMap.ContainsKey(item.device_id))
|
||||
var devName = _eleCtlCfg.DevName;
|
||||
foreach (var (_, devId, disTaskId, floorNO) in endLocCodes)
|
||||
{
|
||||
var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl);
|
||||
Log.Information($"当前Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||
|
||||
//判断当前设备是否为运行状态,不是则进入Agv电梯控制状态
|
||||
if (agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态)
|
||||
if (!_elevatorMap.TryGetValue(devId, out var elevatorCode)) continue;
|
||||
|
||||
var devName = elevatorCode.ToString();
|
||||
|
||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(devId, out var agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
do
|
||||
{
|
||||
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
await Task.Delay(500);
|
||||
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||
_elevatorAgvCtlStatusMap[devId] = eleStatusMulti.agvStatus;
|
||||
}
|
||||
}
|
||||
{
|
||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
|
||||
foreach (var (_, devId, disTaskId, floorNO) in endLocCodes)
|
||||
Logger.Information($"任务开始目标楼层为:{floorNO}");
|
||||
|
||||
var floorN = await GetRealFloor(floorNO.ParseToInt());
|
||||
//如果电梯在当前楼层则不呼梯
|
||||
if (floorN == eleStatusMulti.curFloorNo)
|
||||
{
|
||||
Log.Information($"任务开始目标楼层为:{floorNO}");
|
||||
|
||||
var floorN = await GetRealFloor(floorNO.ParseToInt());
|
||||
|
||||
Log.Information($"实际目标楼层为:{floorN}");
|
||||
|
||||
WmsElevatorUnexecute elevatorQueueItem = new()
|
||||
{
|
||||
distask_id = disTaskId,
|
||||
elevator_id = devId,
|
||||
elevator_code = devName,
|
||||
floor = floorN, //5代表4楼
|
||||
task_status = "待执行",
|
||||
create_id = _userManager.UserId,
|
||||
create_time = DateTime.Now
|
||||
};
|
||||
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.elevator_id == devId && it.task_status == "执行中").ToListAsync();
|
||||
if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1) && floorNO.ParseToInt() != curFloorNo)
|
||||
{
|
||||
|
||||
elevatorQueueItem.task_status = "执行中";
|
||||
var callLiftRes = await _elevatorControlService.CallLift(devName, floorN, CancellationToken.None);
|
||||
string successful = "成功", fail = "失败";
|
||||
var callLiftResult = callLiftRes ? successful : fail;
|
||||
Log.Information($"呼梯结果:{callLiftResult}");
|
||||
}
|
||||
|
||||
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
|
||||
await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
Logger.Information($"{devName.Match(@"\d+")}#,在当前楼层,无需呼梯");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Logger.Information($"实际目标楼层为:{floorN}");
|
||||
|
||||
WmsElevatorUnexecute elevatorQueueItem = new()
|
||||
{
|
||||
distask_id = disTaskId,
|
||||
elevator_id = devId,
|
||||
elevator_code = devName,
|
||||
floor = floorN, //5代表4楼
|
||||
task_status = "待执行",
|
||||
create_id = _userManager.UserId,
|
||||
create_time = DateTime.Now
|
||||
};
|
||||
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.distask_id == disTaskId && it.task_status == "执行中").ToListAsync();
|
||||
if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1) && floorN != eleStatusMulti.curFloorNo)
|
||||
{
|
||||
|
||||
elevatorQueueItem.task_status = "执行中";
|
||||
var callLiftRes = await _elevatorControlService.CallLift(devName, floorN, CancellationToken.None);
|
||||
string successful = "成功", fail = "失败";
|
||||
var callLiftResult = callLiftRes ? successful : fail;
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 呼梯结果:{callLiftResult}");
|
||||
}
|
||||
|
||||
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
|
||||
await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("呼梯操作错误", ex);
|
||||
Logger.Error("呼梯操作错误", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -463,57 +507,65 @@ namespace Tnb.WarehouseMgr
|
||||
private async Task ExecuteTargetFloorTask(WmsDistaskH disTask)
|
||||
{
|
||||
//收到放货确认通知,向电梯发送到3楼的指令
|
||||
Log.Information($"开始执行电梯任务,任务ID:{disTask.id}");
|
||||
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}");
|
||||
try
|
||||
{
|
||||
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => it.task_status == "执行中");
|
||||
Log.Information($"是否存在电梯任务项:{elevatorQueueItem != null}");
|
||||
if (elevatorQueueItem != null)
|
||||
if (!_elevatorMap.TryGetValue(disTask.device_id, out var elevatorCode))
|
||||
{
|
||||
//var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
|
||||
//if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
|
||||
{
|
||||
var doorStatus = -1;
|
||||
var closeDoorRes = await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令
|
||||
Log.Information($"关门结果:{closeDoorRes}");
|
||||
do
|
||||
{
|
||||
doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus);
|
||||
await Task.Delay(2000);
|
||||
} while (doorStatus != 4);
|
||||
Log.Information($"当前门状态:{doorStatus}");
|
||||
var floor = await GetRealFloor(disTask.end_floor.ParseToInt());
|
||||
Log.Information($"目标楼层:{floor}");
|
||||
|
||||
//发送到目标楼的指令
|
||||
var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, floor);
|
||||
//电梯任务手动执行任务状态上报
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
|
||||
|
||||
do
|
||||
{
|
||||
tuple = await _elevatorControlService.GetElevatorStatus(elevatorQueueItem.elevator_code, CancellationToken.None);
|
||||
await Task.Delay(2000);
|
||||
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
|
||||
|
||||
Log.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}");
|
||||
|
||||
if (tuple.sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && tuple.runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯)
|
||||
{
|
||||
Log.Information($"disTask.require_id={disTask.require_id}");
|
||||
|
||||
List<string> disTaskIds = new() { disTask.id };
|
||||
TaskExecuteAfterUpInput teaUpInput = new() { disTaskIds = disTaskIds };
|
||||
await TaskExecuteAfter(teaUpInput);
|
||||
TaskCompleUpInput tcUpInput = new() { disTaskIds = disTaskIds };
|
||||
await TaskComplate(tcUpInput);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
var devName = _elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName;
|
||||
|
||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||
|
||||
var doorStatus = -1;
|
||||
var closeDoorRes = await _elevatorControlService.SendOpenCloseCmd(devName, 4); //向电梯发送前门关门指令
|
||||
Logger.Information($"关门结果:{closeDoorRes}");
|
||||
do
|
||||
{
|
||||
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
||||
await Task.Delay(2000);
|
||||
} while (doorStatus != 4);
|
||||
Logger.Information($"当前门状态:{doorStatus}");
|
||||
|
||||
var floor = await GetRealFloor(disTask.end_floor.ParseToInt());
|
||||
|
||||
Logger.Information($"目标楼层:{floor}");
|
||||
|
||||
//发送到目标楼的指令
|
||||
var reuslt = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor);
|
||||
//电梯任务手动执行任务状态上报
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
|
||||
|
||||
do
|
||||
{
|
||||
tuple = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
await Task.Delay(2000);
|
||||
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
|
||||
|
||||
Logger.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}");
|
||||
|
||||
if (tuple.sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && tuple.runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯)
|
||||
{
|
||||
Log.Information($"disTask.require_id={disTask.require_id}");
|
||||
var disTaskIds = new List<string> { disTask.id };
|
||||
var upInput = new { disTaskIds = disTask.id };
|
||||
TaskExecuteAfterUpInput teaUpInput = new()
|
||||
{
|
||||
disTaskIds = disTaskIds,
|
||||
};
|
||||
await TaskExecuteAfter(teaUpInput);
|
||||
TaskCompleUpInput tcUpInput = new()
|
||||
{
|
||||
disTaskIds = disTaskIds,
|
||||
};
|
||||
await TaskComplate(tcUpInput);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("执行到目标楼层电梯任务失败", ex);
|
||||
Logger.Error("执行到目标楼层电梯任务失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -538,7 +590,7 @@ namespace Tnb.WarehouseMgr
|
||||
targetName = it.endpoint_code,
|
||||
containerCode = it.carry_code,
|
||||
}));
|
||||
Log.Information($"请求地址:{url}");
|
||||
Logger.Information($"请求地址:{url}");
|
||||
foreach (var (k, v) in taskChainCodeDic)
|
||||
{
|
||||
dynamic reqBody = new ExpandoObject();
|
||||
@@ -547,14 +599,14 @@ namespace Tnb.WarehouseMgr
|
||||
reqBody.sequential = false;
|
||||
reqBody.taskChainPriority = 0;
|
||||
reqBody.taskList = v;
|
||||
Log.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}");
|
||||
Logger.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}");
|
||||
var respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||
Log.Information($"调用Agv接口响应结果:{respBody}");
|
||||
Logger.Information($"调用Agv接口响应结果:{respBody}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("agv调度失败异常", ex);
|
||||
Logger.Error("agv调度失败异常", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -658,11 +710,13 @@ namespace Tnb.WarehouseMgr
|
||||
await _db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||
|
||||
//更新电梯任务数量
|
||||
var eles = await _db.Queryable<WmsElevatorH>().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync();
|
||||
if (eles?.Count > 0)
|
||||
await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync();
|
||||
|
||||
/* var eles = await _db.Queryable<WmsElevatorH>().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync();
|
||||
if (eles?.Count > 0)
|
||||
await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync();
|
||||
*/
|
||||
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位
|
||||
Logger.Information("更新载具及库位准备中.....");
|
||||
|
||||
var multiList = disTasks.Select(it => (it.carry_id, it.carry_status, it.endlocation_id, it.endlocation_code)).ToList();
|
||||
var locWhIdMap = await _db.Queryable<BasLocation>().Where(it => multiList.Select(x => x.endlocation_id).Contains(it.id)).ToDictionaryAsync(it => it.id, it => it.wh_id);
|
||||
List<WmsCarryH> carryIts = new();
|
||||
@@ -677,9 +731,10 @@ namespace Tnb.WarehouseMgr
|
||||
location_id = multiList[i].endlocation_id,
|
||||
location_code = multiList[i].endlocation_code
|
||||
};
|
||||
var endLocId = multiList[i].endlocation_id;
|
||||
WmsCarryCode carryCode = new()
|
||||
{
|
||||
warehouse_id = locWhIdMap[multiList[i].endlocation_id].ToString(),
|
||||
warehouse_id = locWhIdMap.ContainsKey(endLocId) ? locWhIdMap[endLocId].ToString() : "",
|
||||
location_id = multiList[i].endlocation_id,
|
||||
location_code = multiList[i].endlocation_code
|
||||
};
|
||||
@@ -697,25 +752,37 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
locIts.Add(loc);
|
||||
}
|
||||
Log.Information("更新载具及库位开始.....");
|
||||
Logger.Information("更新载具及库位开始.....");
|
||||
await _db.Updateable(carryIts).UpdateColumns(it => new { it.is_lock, it.location_id, it.location_code }).ExecuteCommandAsync();
|
||||
//更新条码的库位和仓库信息
|
||||
await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
|
||||
//更新库位信息,使用状态为 使用,锁定状态为未锁定
|
||||
await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync();
|
||||
Log.Information("更新载具及库位结束.....");
|
||||
Log.Information($"_userManager.LoginType={_userManager.LoginType}");
|
||||
//更新业务主表的单据状态
|
||||
Logger.Information("更新载具及库位结束.....");
|
||||
Logger.Information($"_userManager==null:{_userManager == null}");
|
||||
/* var loginType= _userManager?.LoginType ?? "web";
|
||||
Log.Information($"_userManager.LoginType={loginType}");
|
||||
*/ //更新业务主表的单据状态
|
||||
foreach (var dt in disTasks)
|
||||
{
|
||||
Logger.Information("开始业务回更");
|
||||
var disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync();
|
||||
var upInput = new WareHouseUpInput { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() };
|
||||
|
||||
upInput.loginType = !_userManager.LoginType.IsNullOrEmpty() ? "app" : "web";
|
||||
Log.Information($"upInput.loginType={upInput.loginType}");
|
||||
/*if (!_userManager?.LoginType.IsNullOrEmpty() ?? false)
|
||||
{
|
||||
upInput.loginType = "app";
|
||||
}
|
||||
else
|
||||
{
|
||||
upInput.loginType = "web";
|
||||
}*/
|
||||
Logger.Information("loginType赋值前");
|
||||
upInput.loginType = "web";//(!string.IsNullOrEmpty(_userManager?.LoginType) ? "app" : "web") ?? "web";
|
||||
Logger.Information($"upInput.loginType={upInput.loginType}");
|
||||
if (dt.is_sign == 1 && dt.chain_type == "3")
|
||||
{
|
||||
Log.Information("执行业务回更操作.....");
|
||||
Logger.Information("执行业务回更操作.....");
|
||||
await DoUpdate(upInput);
|
||||
}
|
||||
}
|
||||
@@ -724,7 +791,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error($"任务结束失败", ex);
|
||||
Logger.Error($"任务结束失败", ex);
|
||||
Log.Error($"任务结束失败堆栈异常", ex.StackTrace);
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
throw;
|
||||
@@ -792,11 +859,13 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
row = await _db.Insertable(preTaskCodes).ExecuteCommandAsync();
|
||||
}
|
||||
var eleP = preTasks.Find(x => x.area_code.Contains("ELE"));
|
||||
if (eleP != null)
|
||||
{
|
||||
row = await _db.Updateable<WmsElevatorH>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => it.area_code == eleP.area_code).ExecuteCommandAsync();
|
||||
}
|
||||
//先注释 by ly on 20231025
|
||||
/* var eleP = preTasks.Find(x => x.area_code.Contains("ELE"));
|
||||
if (eleP != null)
|
||||
{
|
||||
row = await _db.Updateable<WmsElevatorH>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => it.area_code == eleP.area_code).ExecuteCommandAsync();
|
||||
}
|
||||
*/
|
||||
return row > 0;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -847,7 +916,7 @@ namespace Tnb.WarehouseMgr
|
||||
[NonAction]
|
||||
public async Task<List<WmsPointH>> PathAlgorithms(string pStartId, string pEndId)
|
||||
{
|
||||
var roads = await _db.Queryable<WmsRoad>().ToListAsync();
|
||||
var roads = await _db.Queryable<WmsRoad>().Where(it => it.status == 1).ToListAsync();
|
||||
var points = await LocPathCalcAlgorithms(pStartId, pEndId, roads);
|
||||
try
|
||||
{
|
||||
@@ -893,8 +962,9 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("路径算法异常", ex);
|
||||
throw;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Entitys.Permission;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
@@ -44,7 +45,6 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
private readonly IBillRullService _billRullService;
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly ChannelWriter<NotifyMessage> _channelWriter;
|
||||
|
||||
|
||||
public WmsCarryMoveInStockService(
|
||||
@@ -54,8 +54,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -178,7 +178,7 @@ namespace Tnb.WarehouseMgr
|
||||
finally
|
||||
{
|
||||
//向队列写入消息
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -46,7 +47,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -54,6 +56,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = CarryMoveOut;
|
||||
}
|
||||
|
||||
@@ -161,7 +164,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -44,8 +45,8 @@ namespace Tnb.WarehouseMgr
|
||||
IRunService runService,
|
||||
IBillRullService billRullService,
|
||||
IUserManager userManager,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_warehouseService = wareHouseService;
|
||||
@@ -53,6 +54,7 @@ namespace Tnb.WarehouseMgr
|
||||
_runService = runService;
|
||||
_billRullService = billRullService;
|
||||
_userManager = userManager;
|
||||
|
||||
OverideFuncs.CreateAsync = Create;
|
||||
}
|
||||
|
||||
@@ -222,7 +224,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(row);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Logging;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
@@ -56,8 +57,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -66,6 +67,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = Create;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -128,7 +130,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
var points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
||||
|
||||
Log.Information($"经过的所有点位编码:{Environment.NewLine}{string.Join("\r\n", points.Select(x=>x.point_code))}");
|
||||
Log.Information($"经过的所有点位编码:{Environment.NewLine}{string.Join("\r\n", points.Select(x => x.point_code))}");
|
||||
|
||||
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
||||
if (points?.Count > 0)
|
||||
@@ -139,7 +141,7 @@ namespace Tnb.WarehouseMgr
|
||||
var sPoint = it.FirstOrDefault();
|
||||
var ePoint = it.LastOrDefault();
|
||||
|
||||
Log.Information("ePoint?.point_code="+ ePoint?.point_code);
|
||||
Log.Information("ePoint?.point_code=" + ePoint?.point_code);
|
||||
|
||||
WmsPretaskH preTask = new();
|
||||
preTask.org_id = _userManager.User.OrganizeId;
|
||||
@@ -202,7 +204,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return await Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -54,8 +55,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMesageNotify
|
||||
) : base(taskMesageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -63,7 +64,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
_channelWriter = taskMesageNotify.Writer;
|
||||
|
||||
OverideFuncs.CreateAsync = WmsEmptyIn;
|
||||
}
|
||||
private async Task<dynamic> WmsEmptyIn(VisualDevModelDataCrInput input)
|
||||
@@ -188,7 +189,7 @@ namespace Tnb.WarehouseMgr
|
||||
finally
|
||||
{
|
||||
//向队列写入消息
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -52,8 +53,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -61,6 +62,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = WmsEmptyOut;
|
||||
}
|
||||
|
||||
@@ -218,7 +220,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Filter;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Logging;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
@@ -55,8 +56,8 @@ namespace Tnb.WarehouseMgr
|
||||
IBillRullService billRullService,
|
||||
IWareHouseService wareHouseService,
|
||||
IPrdInstockService prdInstockService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -64,6 +65,7 @@ namespace Tnb.WarehouseMgr
|
||||
_billRullService = billRullService;
|
||||
_wareHouseService = wareHouseService;
|
||||
_prdInstockService = prdInstockService;
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据入库申请单ID获取申请单明细信息
|
||||
@@ -480,7 +482,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return isSuccessFul;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -49,8 +50,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -58,6 +59,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = KittingInStk;
|
||||
}
|
||||
|
||||
@@ -218,7 +220,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
@@ -246,11 +248,8 @@ namespace Tnb.WarehouseMgr
|
||||
kittingOut.carry_id = kittingIn.carry_id;
|
||||
kittingOut.carry_code = kittingIn.carry_code;
|
||||
await _db.Updateable(kittingOut).UpdateColumns(it => new { it.status, it.carry_id, it.carry_code }).ExecuteCommandAsync();
|
||||
//if (kittingOut.status == WmsWareHouseConst.BILLSTATUS_TOBESHIPPED_ID)
|
||||
//{
|
||||
// await Publish(nameof(IWmskittingOutService.KittingOutByIsToBeShipped));
|
||||
//}
|
||||
|
||||
await Publish(nameof(IWmskittingOutService.KittingOutByIsToBeShipped));
|
||||
}
|
||||
}
|
||||
if (row < 1) throw Oops.Oh(ErrorCode.COM1001);
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -48,8 +49,8 @@ namespace Tnb.WarehouseMgr
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
IWmsCarryService wmsCarryService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -58,6 +59,7 @@ namespace Tnb.WarehouseMgr
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
_wmsCarryService = wmsCarryService;
|
||||
|
||||
OverideFuncs.CreateAsync = CarryOutBale;
|
||||
}
|
||||
|
||||
@@ -164,7 +166,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ using Tnb.WarehouseMgr.Interfaces;
|
||||
using System.Reflection;
|
||||
using Tnb.WarehouseMgr.Print;
|
||||
using System.Runtime.InteropServices;
|
||||
using JNPF.EventBus;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
@@ -67,7 +68,7 @@ namespace Tnb.WarehouseMgr
|
||||
IBillRullService billRullService,
|
||||
IWmsCarryMoveInStockService wmsCarryMoveInStockService,
|
||||
IWmsCarryService wareCarryService,
|
||||
ITaskMessageNotify taskMessageNotify) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -78,6 +79,7 @@ namespace Tnb.WarehouseMgr
|
||||
_billRullService = billRullService;
|
||||
_wmsCarryMoveInStockService = wmsCarryMoveInStockService;
|
||||
_wareCarryService = wareCarryService;
|
||||
|
||||
OverideFuncs.CreateAsync = OutStockApplyFor;
|
||||
}
|
||||
|
||||
@@ -372,7 +374,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
@@ -765,7 +767,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return isSuccessful;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Entitys.Permission;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
@@ -51,7 +52,7 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -59,6 +60,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = PDACarryMoveIn;
|
||||
}
|
||||
|
||||
@@ -161,7 +163,7 @@ namespace Tnb.WarehouseMgr
|
||||
//}
|
||||
//finally
|
||||
//{
|
||||
// await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
// await InvokeGenPretaskExcute();
|
||||
//}
|
||||
//return Task.FromResult(true);
|
||||
#endregion
|
||||
@@ -251,7 +253,7 @@ namespace Tnb.WarehouseMgr
|
||||
handleH.carry_code = input.data[nameof(WmsHandleH.carry_code)]?.ToString()!;
|
||||
handleH.require_id = input.data["ReturnIdentity"].ToString();
|
||||
handleH.require_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!;
|
||||
handleH.create_id = _userManager.UserId ;
|
||||
handleH.create_id = _userManager.UserId;
|
||||
handleH.create_time = DateTime.Now;
|
||||
preTaskUpInput.PreTaskRecord = handleH;
|
||||
//根据载具移入Id,回更单据状态
|
||||
@@ -274,7 +276,7 @@ namespace Tnb.WarehouseMgr
|
||||
finally
|
||||
{
|
||||
//向队列写入消息
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -39,6 +40,7 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
private readonly IBillRullService _billRullService;
|
||||
private readonly IUserManager _userManager;
|
||||
|
||||
public WmsPDACarryMoveOutStockService(
|
||||
ISqlSugarRepository<WmsCarryH> repository,
|
||||
IRunService runService,
|
||||
@@ -46,8 +48,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -55,6 +57,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = PDACarryMoveOut;
|
||||
}
|
||||
|
||||
@@ -158,7 +161,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -51,8 +52,8 @@ namespace Tnb.WarehouseMgr
|
||||
IBillRullService billRullService,
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -61,6 +62,7 @@ namespace Tnb.WarehouseMgr
|
||||
_billRullService = billRullService;
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
|
||||
OverideFuncs.CreateAsync = Create;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -191,7 +193,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return await Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -48,7 +49,7 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -56,6 +57,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = PDAWmsEmptyIn;
|
||||
}
|
||||
|
||||
@@ -168,7 +170,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Logging;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
@@ -49,8 +50,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -58,6 +59,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = PDAWmsEmptyOut;
|
||||
}
|
||||
|
||||
@@ -210,7 +212,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -55,8 +56,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -64,6 +65,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = ScanCodeInStock;
|
||||
}
|
||||
|
||||
@@ -142,7 +144,7 @@ namespace Tnb.WarehouseMgr
|
||||
create_time = DateTime.Now,
|
||||
source_id = input.data[nameof(WmsKittingInstock.source_id)].ToString(),
|
||||
source_code = input.data[nameof(WmsKittingInstock.source_code)].ToString()
|
||||
};
|
||||
};
|
||||
|
||||
return preTask;
|
||||
}).ToList();
|
||||
@@ -280,7 +282,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -50,8 +51,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -59,6 +60,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = Inbale;
|
||||
}
|
||||
|
||||
@@ -152,7 +154,7 @@ namespace Tnb.WarehouseMgr
|
||||
handleH.create_time = DateTime.Now;
|
||||
preTaskUpInput.PreTaskRecord = handleH;
|
||||
//根据载具移入Id,回更单据状态
|
||||
await _db.Updateable<WmsInbale>().SetColumns(it => new WmsInbale { status = WmsWareHouseConst.BILLSTATUS_ON_ID}).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
|
||||
await _db.Updateable<WmsInbale>().SetColumns(it => new WmsInbale { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
|
||||
|
||||
var baleNum = input.data[nameof(WmsCarryH.bale_num)]?.ToString();
|
||||
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
|
||||
@@ -172,7 +174,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -39,8 +40,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(repository, runService, visualDevService, wareHouseService, userManager, billRullService, taskMessageNotify)
|
||||
IEventPublisher publisher
|
||||
) : base(repository, runService, visualDevService, wareHouseService, userManager, billRullService, publisher)
|
||||
|
||||
{
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -48,8 +49,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -57,6 +58,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = PDAOutBale;
|
||||
}
|
||||
|
||||
@@ -160,7 +162,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -46,8 +47,8 @@ namespace Tnb.WarehouseMgr
|
||||
IBillRullService billRullService,
|
||||
IWareHouseService wareHouseService,
|
||||
IPrdInstockService prdInstockService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -55,6 +56,7 @@ namespace Tnb.WarehouseMgr
|
||||
_billRullService = billRullService;
|
||||
_wareHouseService = wareHouseService;
|
||||
_prdInstockService = prdInstockService;
|
||||
|
||||
OverideFuncs.CreateAsync = ScanInStock;
|
||||
}
|
||||
public async Task<dynamic> ScanInStock(VisualDevModelDataCrInput input)
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -51,8 +52,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher publisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -60,6 +61,7 @@ namespace Tnb.WarehouseMgr
|
||||
_wareHouseService = wareHouseService;
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
|
||||
OverideFuncs.CreateAsync = CarryTransfer;
|
||||
}
|
||||
|
||||
@@ -155,7 +157,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using Mapster;
|
||||
@@ -45,8 +46,8 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService warehouseService,
|
||||
IBillRullService billRullService,
|
||||
IWmsKittingInStkService wmsKittingInStkService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher publisher
|
||||
)
|
||||
{
|
||||
_wmsCarryBindService = wmsCarryBindService;
|
||||
_db = repository.AsSugarClient();
|
||||
@@ -54,6 +55,7 @@ namespace Tnb.WarehouseMgr
|
||||
_warehouseService = warehouseService;
|
||||
_billRullService = billRullService;
|
||||
_wmsKittingInStkService = wmsKittingInStkService;
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 机器人完成任务后回调接口
|
||||
@@ -90,6 +92,11 @@ namespace Tnb.WarehouseMgr
|
||||
var kittingout = await _db.Queryable<WmsKittingoutH>().FirstAsync(it => it.collocation_scheme_id == carry.collocation_scheme_id && it.status == WmsWareHouseConst.BILLSTATUS_CALLED_ID);
|
||||
if (kittingout != null)
|
||||
{
|
||||
|
||||
await Publish(nameof(IWmskittingOutService.KittingOutByAdd));
|
||||
await Publish(nameof(IWmskittingOutService.KittingOutByIsToBeShipped));
|
||||
|
||||
|
||||
visualDevModelCrInput.data = new Dictionary<string, object>();
|
||||
visualDevModelCrInput.data[nameof(InStockStrategyQuery.warehouse_id)] = kittingout.warehouse_id;
|
||||
visualDevModelCrInput.data[nameof(WmsKittingInstock.carry_id)] = input.carry_id;
|
||||
@@ -145,7 +152,8 @@ namespace Tnb.WarehouseMgr
|
||||
genPreTaskAfterUpInput.CarryIds = preTasks.Select(x => x.carry_id).ToList();
|
||||
genPreTaskAfterUpInput.LocationIds = new List<string> { carry.location_id! };
|
||||
await _warehouseService.GenInStockTaskHandleAfter(genPreTaskAfterUpInput, it => new WmsCarryH { is_lock = 1 }, it => new BasLocation { is_lock = 1 });
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -13,6 +13,7 @@ using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Manager;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -59,8 +60,8 @@ namespace Tnb.WarehouseMgr
|
||||
ICacheManager cacheManager,
|
||||
IRunService runService,
|
||||
IVisualDevService visualDevService,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher publisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_wareHouseService = wareHouseService;
|
||||
@@ -69,6 +70,7 @@ namespace Tnb.WarehouseMgr
|
||||
_cacheManager = cacheManager;
|
||||
_runService = runService;
|
||||
_visualDevService = visualDevService;
|
||||
|
||||
//OverideFuncs.CreateAsync = Create;
|
||||
}
|
||||
|
||||
@@ -97,10 +99,11 @@ namespace Tnb.WarehouseMgr
|
||||
[HttpPost, Timed(Name = nameof(PackSortingByAdd))]
|
||||
public async Task PackSortingByAdd(CancellationToken? ct = default)
|
||||
{
|
||||
//if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return;
|
||||
//var curUser = await GetUserIdentity();
|
||||
|
||||
//Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId}\t Thread pool: {Thread.CurrentThread.IsThreadPoolThread}");
|
||||
if (_userManager.User.IsNull())
|
||||
{
|
||||
var curUser = await GetUserIdentity();
|
||||
await SetUserEntity(_userManager, curUser);
|
||||
}
|
||||
|
||||
var curDb = _db.CopyNew();
|
||||
|
||||
@@ -282,7 +285,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
//await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
@@ -52,7 +53,7 @@ namespace Tnb.WarehouseMgr
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager,
|
||||
IBillRullService billRullService,
|
||||
ITaskMessageNotify taskMessageNotify):base(taskMessageNotify.Writer)
|
||||
IEventPublisher publisher)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
@@ -145,6 +146,7 @@ namespace Tnb.WarehouseMgr
|
||||
await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
|
||||
await _db.Updateable<WmsTransfer>().SetColumns(it => new WmsTransfer { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == input.data["ReturnIdentity"].ToString()).ExecuteCommandAsync();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,7 +161,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
await InvokeGenPretaskExcute();;
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ using JNPF.Common.Extension;
|
||||
using JNPF.Common.Manager;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.DataEncryption;
|
||||
using JNPF.EventBus;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.LinqBuilder;
|
||||
using JNPF.Logging;
|
||||
@@ -62,8 +63,8 @@ namespace Tnb.WarehouseMgr
|
||||
IBillRullService billRullService,
|
||||
IWmsCarryService carryService,
|
||||
ICacheManager cacheManager,
|
||||
ITaskMessageNotify taskMessageNotify
|
||||
) : base(taskMessageNotify.Writer)
|
||||
IEventPublisher eventPublisher
|
||||
)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_warehouseService = warehouseService;
|
||||
@@ -77,7 +78,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// 齐套出库(新增状态)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Timed(Name = nameof(KittingOutByAdd))]
|
||||
[HttpPost]
|
||||
public async Task KittingOutByAdd(CancellationToken? ct = default)
|
||||
{
|
||||
//if (ct?.IsCancellationRequested ?? false)
|
||||
@@ -120,7 +121,7 @@ namespace Tnb.WarehouseMgr
|
||||
ko.carry_id = firstCarry?.id;
|
||||
ko.carry_code = firstCarry?.carry_code;
|
||||
await _db.Updateable(ko).UpdateColumns(it => new { it.status, it.carry_id, it.carry_code }).ExecuteCommandAsync();
|
||||
//await KittingOutByIsToBeShipped();
|
||||
_ = KittingOutByIsToBeShipped();
|
||||
if (firstCarry != null)
|
||||
{
|
||||
firstCarry.source_id = ko.source_id;
|
||||
@@ -169,7 +170,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
Log.Error("齐套出库,新增时出现错误", ex);
|
||||
await curDb.Ado.RollbackTranAsync();
|
||||
if(_userManager?.ToKen.IsNullOrEmpty() ?? false)
|
||||
if (_userManager?.ToKen.IsNullOrEmpty() ?? false)
|
||||
{
|
||||
TimedTaskErrorInfo ei = new()
|
||||
{
|
||||
@@ -187,7 +188,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// 齐套出库,(待配送状态)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Timed(Name = nameof(KittingOutByIsToBeShipped))]
|
||||
[HttpPost]
|
||||
public async Task KittingOutByIsToBeShipped(CancellationToken? ct = default)
|
||||
{
|
||||
//if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return;
|
||||
@@ -279,7 +280,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
Log.Error("齐套出库,待配送时出现错误", ex);
|
||||
await curDb.Ado.RollbackTranAsync();
|
||||
if(_userManager?.ToKen.IsNullOrEmpty() ?? false)
|
||||
if (_userManager?.ToKen.IsNullOrEmpty() ?? false)
|
||||
{
|
||||
TimedTaskErrorInfo ei = new()
|
||||
{
|
||||
@@ -295,7 +296,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
//await Publish(nameof(IWareHouseService.GenTaskExecute));
|
||||
//await InvokeGenPretaskExcute();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +71,8 @@
|
||||
"txt",
|
||||
"rar",
|
||||
"zip",
|
||||
"csv"
|
||||
"csv",
|
||||
"json"
|
||||
],
|
||||
//过滤上传文件名称特殊字符
|
||||
"SpecialString": [
|
||||
@@ -188,5 +189,5 @@
|
||||
"DoMainApp": "http://localhost:8081", // 前端App外网能访问的地址(域名), 回调的时候拼接接口地址用
|
||||
"AppPushUrl": "https://8e84eea8-6922-4033-8e86-67ad7442e692.bspapp.com/unipush"
|
||||
},
|
||||
"IsStartTimeJob": true //是否开启定时任务
|
||||
"IsStartTimeJob": false //是否开启定时任务
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"DevName": "Elevator1",
|
||||
"DevName": "Elevator2",
|
||||
"token": "780BE4144636CF47DDF3920B0F1D069B",
|
||||
"GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList",
|
||||
"GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using IGeekFan.AspNetCore.Knife4jUI;
|
||||
using System.Reflection;
|
||||
using IGeekFan.AspNetCore.Knife4jUI;
|
||||
using JNPF.API.Entry.Handlers;
|
||||
using JNPF.Common.Cache;
|
||||
using JNPF.Common.Core;
|
||||
@@ -62,15 +63,14 @@ public class Startup : AppStartup
|
||||
.AddSenparcWeixinServices(App.Configuration); // Senparc.Weixin 注册(如果使用Senparc.Weixin SDK则添加)
|
||||
|
||||
services.AddOverideVisualDev();
|
||||
//注册任务消息通知 added by ly on 20230814
|
||||
services.AddTaskMessageNotify();
|
||||
|
||||
SnowflakeIdHelper.InitYitIdWorker();
|
||||
//定时任务
|
||||
services.AddHostedService<TimedTaskBackgroundService>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
|
||||
{
|
||||
// 添加状态码拦截中间件
|
||||
@@ -115,7 +115,7 @@ public class Startup : AppStartup
|
||||
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
|
||||
});
|
||||
|
||||
//SnowflakeIdHelper.InitYitIdWorker();
|
||||
SnowflakeIdHelper.InitYitIdWorker();
|
||||
|
||||
bool isStartTimeJob = App.GetConfig<bool>("IsStartTimeJob");
|
||||
if (isStartTimeJob)
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<Import Project="$(SolutionDir)\common.props" />
|
||||
<Import Project="$(SolutionDir)\common.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="logs\**" />
|
||||
<Content Remove="logs\**" />
|
||||
<EmbeddedResource Remove="logs\**" />
|
||||
<None Remove="logs\**" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Remove="logs\**" />
|
||||
<Content Remove="logs\**" />
|
||||
<EmbeddedResource Remove="logs\**" />
|
||||
<None Remove="logs\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\AppService.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityDto.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityDtoAcmen.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityInfo.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityInfoAcmen.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\AppService.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityDto.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityDtoAcmen.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityInfo.cshtml" />
|
||||
<None Include="wwwroot\Template\VengineSqlSugar\EntityInfoAcmen.cshtml" />
|
||||
</ItemGroup>
|
||||
|
||||
<!--<ItemGroup>
|
||||
<!--<ItemGroup>
|
||||
<None Remove="lib\regworkerid_lib_v1.3.1\yitidgengo.dll" />
|
||||
<None Remove="lib\regworkerid_lib_v1.3.1\yitidgengo.so" />
|
||||
<None Remove="sensitive-words.txt" />
|
||||
@@ -35,38 +35,38 @@
|
||||
<EmbeddedResource Include="sensitive-words.txt" />
|
||||
</ItemGroup>-->
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="IGeekFan.AspNetCore.Knife4jUI" Version="0.0.13" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="IGeekFan.AspNetCore.Knife4jUI" Version="0.0.13" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\app\Tnb.Apps\Tnb.Apps.csproj" />
|
||||
<ProjectReference Include="..\..\BasicData\Tnb.BasicData\Tnb.BasicData.csproj" />
|
||||
<ProjectReference Include="..\..\EquipMgr\Tnb.EquipMgr\Tnb.EquipMgr.csproj" />
|
||||
<ProjectReference Include="..\..\message\Tnb.Message\Tnb.Message.csproj" />
|
||||
<ProjectReference Include="..\..\PerMgr\Tnb.PerMgr\Tnb.PerMgr.csproj" />
|
||||
<ProjectReference Include="..\..\ProductionMgr\Tnb.ProductionMgr\Tnb.ProductionMgr.csproj" />
|
||||
<ProjectReference Include="..\..\QcMgr\Tnb.QcMgr\Tnb.QcMgr.csproj" />
|
||||
<ProjectReference Include="..\..\system\Tnb.OAuth\Tnb.OAuth.csproj" />
|
||||
<ProjectReference Include="..\..\system\Tnb.Systems\Tnb.Systems.csproj" />
|
||||
<ProjectReference Include="..\..\taskschedule\Tnb.TaskScheduler\Tnb.TaskScheduler.csproj" />
|
||||
<ProjectReference Include="..\..\visualdev\Tnb.Vengine\Tnb.Vengine.csproj" />
|
||||
<ProjectReference Include="..\..\visualdev\Tnb.VisualDev\Tnb.VisualDev.csproj" />
|
||||
<ProjectReference Include="..\..\WarehouseMgr\Tnb.WarehouseMgr\Tnb.WarehouseMgr.csproj" />
|
||||
<ProjectReference Include="..\..\workflow\Tnb.WorkFlow\Tnb.WorkFlow.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\app\Tnb.Apps\Tnb.Apps.csproj" />
|
||||
<ProjectReference Include="..\..\BasicData\Tnb.BasicData\Tnb.BasicData.csproj" />
|
||||
<ProjectReference Include="..\..\EquipMgr\Tnb.EquipMgr\Tnb.EquipMgr.csproj" />
|
||||
<ProjectReference Include="..\..\message\Tnb.Message\Tnb.Message.csproj" />
|
||||
<ProjectReference Include="..\..\PerMgr\Tnb.PerMgr\Tnb.PerMgr.csproj" />
|
||||
<ProjectReference Include="..\..\ProductionMgr\Tnb.ProductionMgr\Tnb.ProductionMgr.csproj" />
|
||||
<ProjectReference Include="..\..\QcMgr\Tnb.QcMgr\Tnb.QcMgr.csproj" />
|
||||
<ProjectReference Include="..\..\system\Tnb.OAuth\Tnb.OAuth.csproj" />
|
||||
<ProjectReference Include="..\..\system\Tnb.Systems\Tnb.Systems.csproj" />
|
||||
<ProjectReference Include="..\..\taskschedule\Tnb.TaskScheduler\Tnb.TaskScheduler.csproj" />
|
||||
<ProjectReference Include="..\..\visualdev\Tnb.Vengine\Tnb.Vengine.csproj" />
|
||||
<ProjectReference Include="..\..\visualdev\Tnb.VisualDev\Tnb.VisualDev.csproj" />
|
||||
<ProjectReference Include="..\..\WarehouseMgr\Tnb.WarehouseMgr\Tnb.WarehouseMgr.csproj" />
|
||||
<ProjectReference Include="..\..\workflow\Tnb.WorkFlow\Tnb.WorkFlow.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Update="wwwroot\Template\*.vm">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Update="wwwroot\Template\*.vm">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="_install.bat">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="_install.bat">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Tnb.Common.Core.EventBus.Constants
|
||||
{
|
||||
public class EventSubscribeEventConsts
|
||||
{
|
||||
/// <summary>
|
||||
/// 预任务执行EventId
|
||||
/// </summary>
|
||||
public const string TASKSTATUSCHANGE_EVENTID = "DisTask:TaskStatusChange";
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using JNPF.EventBus;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Tnb.Common.Core.EventBus.Sources
|
||||
{
|
||||
public class TaskStatusChangeSource : IEventSource
|
||||
{
|
||||
/// <summary>
|
||||
/// 构造函数.
|
||||
/// </summary>
|
||||
/// <param name="eventId">事件ID.</param>
|
||||
/// <param name="connectionConfig">数据库连接配置.</param>
|
||||
/// <param name="entity">实体.</param>
|
||||
public TaskStatusChangeSource(string eventId, object payload)
|
||||
{
|
||||
EventId = eventId;
|
||||
Payload = payload;
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// 数据库连接配置.
|
||||
///// </summary>
|
||||
//public ConnectionConfigOptions ConnectionConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件 Id.
|
||||
/// </summary>
|
||||
public string EventId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件承载(携带)数据.
|
||||
/// </summary>
|
||||
public object Payload { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 取消任务 Token.
|
||||
/// </summary>
|
||||
/// <remarks>用于取消本次消息处理.</remarks>
|
||||
public CancellationToken CancellationToken { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件创建时间.
|
||||
/// </summary>
|
||||
public DateTime CreatedTime { get; } = DateTime.UtcNow;
|
||||
}
|
||||
}
|
||||
@@ -224,4 +224,12 @@ public class RedisCache : ICache, ISingleton
|
||||
long second = RedisHelper.PTtl(key);
|
||||
return DateTime.Now.AddMilliseconds(second);
|
||||
}
|
||||
public string GetHash(string key, string field)
|
||||
{
|
||||
return RedisHelper.HGet(key, field);
|
||||
}
|
||||
public bool HashExist(string key, string field)
|
||||
{
|
||||
return RedisHelper.HExists(key, field);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Collections;
|
||||
using System.Globalization;
|
||||
using System.Text.RegularExpressions;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace JNPF.Common.Extension;
|
||||
|
||||
@@ -701,6 +702,13 @@ public static partial class Extensions
|
||||
{
|
||||
return thisValue == null;
|
||||
}
|
||||
//added by ly on 20231030
|
||||
public static T ConvertToType<T>(this object value) where T : class
|
||||
{
|
||||
var jsonData = JsonConvert.SerializeObject(value);
|
||||
return JsonConvert.DeserializeObject<T>(jsonData);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -25,6 +25,21 @@ namespace Tnb.Common.Extension
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
public static async Task<T> Retry<T>(Func<Task<T>> task, int retries,
|
||||
TimeSpan delay, CancellationToken cts = default) =>
|
||||
await task().ContinueWith(async innerTask =>
|
||||
{
|
||||
cts.ThrowIfCancellationRequested();
|
||||
if (innerTask.Status != TaskStatus.Faulted)
|
||||
return innerTask.Result;
|
||||
if (retries == 0)
|
||||
throw innerTask.Exception ?? throw new Exception();
|
||||
await Task.Delay(delay, cts);
|
||||
return await Retry(task, retries - 1, delay, cts);
|
||||
}).Unwrap();
|
||||
|
||||
|
||||
|
||||
public static async Task Catch(this Task task, Func<Exception,Task> exceptionHandler)
|
||||
{
|
||||
try
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using JNPF.Common.Extension;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
|
||||
namespace System;
|
||||
|
||||
@@ -183,4 +184,17 @@ public static class StringExtensions
|
||||
public static string ToCamel(this string str) => str.SplitWord().Select((a, i) => i == 0 ? a : a.UpperFirst()).JoinAsString("");
|
||||
|
||||
#endregion
|
||||
|
||||
public static (string, string) LastSplit(this string str, char seperate)
|
||||
{
|
||||
int n = str.LastIndexOf(seperate);
|
||||
if(n > 0)
|
||||
{
|
||||
return (str.Substring(0, n), str.Substring(n + 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
return (str, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,17 +18,18 @@ namespace JNPF.TaskScheduler.Listener
|
||||
// }
|
||||
|
||||
[SpareTime("0 0 0 * * ?", "生成设备保养计划", ExecuteType = SpareTimeExecuteTypes.Serial,StartNow = false)]
|
||||
public void GenerateSpotInspectionPlan(SpareTimer timer, long count)
|
||||
public async void GenerateSpotInspectionPlan(SpareTimer timer, long count)
|
||||
{
|
||||
Log.Information("----------------------开始生成设备保养计划----------------------");
|
||||
|
||||
try
|
||||
{
|
||||
List<EqpMaintainTemEquipH> eqpSpotInsTemEquipHsByOne = _repository.GetList(x => x.is_start=="1" && x.plan_cycle_unit == "1");
|
||||
List<EqpMaintainTemEquipH> eqpSpotInsTemEquipHsByCirculate = _repository.GetList(x => x.is_start=="1" && x.plan_cycle_unit == "2");
|
||||
var db = _repository.CopyNew();
|
||||
List<EqpMaintainTemEquipH> eqpSpotInsTemEquipHsByOne = await db.Queryable<EqpMaintainTemEquipH>().Where(x => x.is_start=="1" && x.plan_cycle_unit == "1").ToListAsync();
|
||||
List<EqpMaintainTemEquipH> eqpSpotInsTemEquipHsByCirculate = await db.Queryable<EqpMaintainTemEquipH>().Where(x => x.is_start=="1" && x.plan_cycle_unit == "2").ToListAsync();
|
||||
List<EqpMaintainRecordH> tobeCreateList = new List<EqpMaintainRecordH>();
|
||||
List<EqpMaintainTemEquipH> tobeCreateTemplets = new List<EqpMaintainTemEquipH>();
|
||||
var db = _repository.AsSugarClient();
|
||||
|
||||
|
||||
foreach (var item in eqpSpotInsTemEquipHsByOne)
|
||||
{
|
||||
@@ -56,7 +57,7 @@ namespace JNPF.TaskScheduler.Listener
|
||||
|
||||
if (tobeCreateTemplets != null && tobeCreateTemplets.Count > 0)
|
||||
{
|
||||
List<EqpEquipment> equipments = db.Queryable<EqpEquipment>().Where(x => x.life==Tnb.EquipMgr.EquipmentLife.ENABLE).ToList();
|
||||
List<EqpEquipment> equipments = await db.Queryable<EqpEquipment>().Where(x => x.life==Tnb.EquipMgr.EquipmentLife.ENABLE).ToListAsync();
|
||||
int index = 1;
|
||||
foreach (var item in tobeCreateTemplets)
|
||||
{
|
||||
@@ -67,7 +68,6 @@ namespace JNPF.TaskScheduler.Listener
|
||||
string code = $"{DateTime.Now.ToString("yyyyMMdd")+(index++).ToString().PadLeft(3,'0')}";
|
||||
tobeCreateList.Add(new EqpMaintainRecordH()
|
||||
{
|
||||
id = SnowflakeIdHelper.NextId(),
|
||||
code = code,
|
||||
// equip_type_id = item.equip_type_id,
|
||||
equip_id = item.equip_id,
|
||||
@@ -90,14 +90,14 @@ namespace JNPF.TaskScheduler.Listener
|
||||
if (tobeCreateList != null && tobeCreateList.Count > 0)
|
||||
{
|
||||
List<string> templetIDs = tobeCreateList.Select(x => x.maintain_tem_equip_id).ToList();
|
||||
List<EqpMaintainTemEquipD> spotInsTemEquipDs = db.Queryable<EqpMaintainTemEquipD>().Where(x => templetIDs.Contains(x.maintain_tem_equip_id)).ToList();
|
||||
List<EqpMaintainTemEquipD> spotInsTemEquipDs = await db.Queryable<EqpMaintainTemEquipD>().Where(x => templetIDs.Contains(x.maintain_tem_equip_id)).ToListAsync();
|
||||
List<string> spotInsItemIDs = spotInsTemEquipDs.Select(x => x.maintain_item_id).ToList();
|
||||
List<EqpMaintainItem> spotCheckItems = db.Queryable<EqpMaintainItem>().Where(x => spotInsItemIDs.Contains(x.id)).ToList();
|
||||
List<EqpMaintainItem> spotCheckItems = await db.Queryable<EqpMaintainItem>().Where(x => spotInsItemIDs.Contains(x.id)).ToListAsync();
|
||||
|
||||
|
||||
List<EqpMaintainRecordD> spotInsRecordDs = new List<EqpMaintainRecordD>();
|
||||
foreach (var tobeCreatePlan in tobeCreateList)
|
||||
{
|
||||
List<EqpMaintainRecordD> spotInsRecordDs = new List<EqpMaintainRecordD>();
|
||||
List<string> spotInsItems = spotInsTemEquipDs
|
||||
.Where(x => x.maintain_tem_equip_id == tobeCreatePlan.maintain_tem_equip_id)
|
||||
.Select(x => x.maintain_item_id).ToList();
|
||||
@@ -119,25 +119,30 @@ namespace JNPF.TaskScheduler.Listener
|
||||
});
|
||||
}
|
||||
|
||||
var dbResult = db.Ado.UseTran(() =>
|
||||
{
|
||||
if (tobeCreateList != null && tobeCreateList.Count > 0)
|
||||
{
|
||||
db.Insertable<EqpMaintainRecordH>(tobeCreateList).ExecuteCommand();
|
||||
}
|
||||
|
||||
if (spotInsRecordDs != null && spotInsRecordDs.Count > 0)
|
||||
{
|
||||
db.Insertable<EqpMaintainRecordD>(spotInsRecordDs).ExecuteCommand();
|
||||
}
|
||||
});
|
||||
if (!dbResult.IsSuccess)
|
||||
{
|
||||
Console.WriteLine(dbResult.ErrorMessage);
|
||||
Log.Error(dbResult.ErrorMessage);
|
||||
}
|
||||
Log.Information($"---------------生成{tobeCreateList.Count}个计划---------------");
|
||||
}
|
||||
if (spotInsRecordDs.Count<=0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var dbResult = db.Ado.UseTran(() =>
|
||||
{
|
||||
if (tobeCreateList != null && tobeCreateList.Count > 0)
|
||||
{
|
||||
db.Insertable<EqpMaintainRecordH>(tobeCreateList).ExecuteCommand();
|
||||
}
|
||||
|
||||
if (spotInsRecordDs != null && spotInsRecordDs.Count > 0)
|
||||
{
|
||||
db.Insertable<EqpMaintainRecordD>(spotInsRecordDs).ExecuteCommand();
|
||||
}
|
||||
});
|
||||
if (!dbResult.IsSuccess)
|
||||
{
|
||||
Console.WriteLine(dbResult.ErrorMessage);
|
||||
Log.Error(dbResult.ErrorMessage);
|
||||
}
|
||||
Log.Information($"---------------生成{tobeCreateList.Count}个计划---------------");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
||||
@@ -18,17 +18,17 @@ namespace JNPF.TaskScheduler.Listener
|
||||
// }
|
||||
|
||||
[SpareTime("0 0,30 * * * ?", "生成点巡检计划", ExecuteType = SpareTimeExecuteTypes.Serial,StartNow = false)]
|
||||
public void GenerateSpotInspectionPlan(SpareTimer timer, long count)
|
||||
public async void GenerateSpotInspectionPlan(SpareTimer timer, long count)
|
||||
{
|
||||
Log.Information("----------------------开始生成点巡检计划----------------------");
|
||||
|
||||
try
|
||||
{
|
||||
List<EqpSpotInsTemEquipH> eqpSpotInsTemEquipHsByOne = _repository.GetList(x => x.is_start=="1" && x.plan_cycle_unit == "1");
|
||||
List<EqpSpotInsTemEquipH> eqpSpotInsTemEquipHsByCirculate = _repository.GetList(x => x.is_start=="1" && x.plan_cycle_unit == "2");
|
||||
var db = _repository.CopyNew();
|
||||
List<EqpSpotInsTemEquipH> eqpSpotInsTemEquipHsByOne = await db.Queryable<EqpSpotInsTemEquipH>().Where(x => x.is_start=="1" && x.plan_cycle_unit == "1").ToListAsync();
|
||||
List<EqpSpotInsTemEquipH> eqpSpotInsTemEquipHsByCirculate = await db.Queryable<EqpSpotInsTemEquipH>().Where(x => x.is_start=="1" && x.plan_cycle_unit == "2").ToListAsync();
|
||||
List<EqpSpotInsRecordH> tobeCreateList = new List<EqpSpotInsRecordH>();
|
||||
List<EqpSpotInsTemEquipH> tobeCreateTemplets = new List<EqpSpotInsTemEquipH>();
|
||||
var db = _repository.AsSugarClient();
|
||||
|
||||
foreach (var item in eqpSpotInsTemEquipHsByOne)
|
||||
{
|
||||
@@ -80,7 +80,7 @@ namespace JNPF.TaskScheduler.Listener
|
||||
|
||||
if (tobeCreateTemplets != null && tobeCreateTemplets.Count > 0)
|
||||
{
|
||||
List<EqpEquipment> equipments = db.Queryable<EqpEquipment>().Where(x => x.life==Tnb.EquipMgr.EquipmentLife.ENABLE).ToList();
|
||||
List<EqpEquipment> equipments = await db.Queryable<EqpEquipment>().Where(x => x.life==Tnb.EquipMgr.EquipmentLife.ENABLE).ToListAsync();
|
||||
int index = 1;
|
||||
foreach (var item in tobeCreateTemplets)
|
||||
{
|
||||
@@ -114,14 +114,14 @@ namespace JNPF.TaskScheduler.Listener
|
||||
if (tobeCreateList != null && tobeCreateList.Count > 0)
|
||||
{
|
||||
List<string> templetIDs = tobeCreateList.Select(x => x.spot_ins_tem_equip_id).ToList();
|
||||
List<EqpSpotInsTemEquipD> spotInsTemEquipDs = db.Queryable<EqpSpotInsTemEquipD>().Where(x => templetIDs.Contains(x.spot_ins_tem_equip_id)).ToList();
|
||||
List<EqpSpotInsTemEquipD> spotInsTemEquipDs = await db.Queryable<EqpSpotInsTemEquipD>().Where(x => templetIDs.Contains(x.spot_ins_tem_equip_id)).ToListAsync();
|
||||
List<string> spotInsItemIDs = spotInsTemEquipDs.Select(x => x.spot_ins_item_id).ToList();
|
||||
List<EqpSpotInsItem> spotCheckItems = db.Queryable<EqpSpotInsItem>().Where(x => spotInsItemIDs.Contains(x.id)).ToList();
|
||||
List<EqpSpotInsItem> spotCheckItems = await db.Queryable<EqpSpotInsItem>().Where(x => spotInsItemIDs.Contains(x.id)).ToListAsync();
|
||||
|
||||
|
||||
List<EqpSpotInsRecordD> spotInsRecordDs = new List<EqpSpotInsRecordD>();
|
||||
foreach (var tobeCreatePlan in tobeCreateList)
|
||||
{
|
||||
List<EqpSpotInsRecordD> spotInsRecordDs = new List<EqpSpotInsRecordD>();
|
||||
List<string> spotInsItems = spotInsTemEquipDs
|
||||
.Where(x => x.spot_ins_tem_equip_id == tobeCreatePlan.spot_ins_tem_equip_id)
|
||||
.Select(x => x.spot_ins_item_id).ToList();
|
||||
@@ -130,7 +130,6 @@ namespace JNPF.TaskScheduler.Listener
|
||||
{
|
||||
spotInsRecordDs.Add(new EqpSpotInsRecordD()
|
||||
{
|
||||
id = SnowflakeIdHelper.NextId(),
|
||||
spot_ins_record_id = tobeCreatePlan.id,
|
||||
spot_ins_tem_equip_id = tobeCreatePlan.spot_ins_tem_equip_id,
|
||||
spot_ins_item_id = tobeCreateItem.id,
|
||||
@@ -149,25 +148,30 @@ namespace JNPF.TaskScheduler.Listener
|
||||
});
|
||||
}
|
||||
|
||||
var dbResult = db.Ado.UseTran(() =>
|
||||
{
|
||||
if (tobeCreateList != null && tobeCreateList.Count > 0)
|
||||
{
|
||||
db.Insertable<EqpSpotInsRecordH>(tobeCreateList).ExecuteCommand();
|
||||
}
|
||||
|
||||
if (spotInsRecordDs != null && spotInsRecordDs.Count > 0)
|
||||
{
|
||||
db.Insertable<EqpSpotInsRecordD>(spotInsRecordDs).ExecuteCommand();
|
||||
}
|
||||
});
|
||||
if (!dbResult.IsSuccess)
|
||||
{
|
||||
Console.WriteLine(dbResult.ErrorMessage);
|
||||
Log.Error(dbResult.ErrorMessage);
|
||||
}
|
||||
Log.Information($"---------------生成{tobeCreateList.Count}个计划---------------");
|
||||
}
|
||||
if (spotInsRecordDs.Count<=0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var dbResult = await db.Ado.UseTranAsync(async () =>
|
||||
{
|
||||
if (tobeCreateList != null && tobeCreateList.Count > 0)
|
||||
{
|
||||
await db.Insertable<EqpSpotInsRecordH>(tobeCreateList).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
if (spotInsRecordDs != null && spotInsRecordDs.Count > 0)
|
||||
{
|
||||
await db.Insertable<EqpSpotInsRecordD>(spotInsRecordDs).ExecuteCommandAsync();
|
||||
}
|
||||
});
|
||||
if (!dbResult.IsSuccess)
|
||||
{
|
||||
Console.WriteLine(dbResult.ErrorMessage);
|
||||
Log.Error(dbResult.ErrorMessage);
|
||||
}
|
||||
Log.Information($"---------------生成{tobeCreateList.Count}个计划---------------");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Tnb.TaskScheduler.Listener
|
||||
/// <summary>
|
||||
/// 生成质检任务
|
||||
/// </summary>
|
||||
public class QcTaskTimeWorker : ISpareTimeWorker
|
||||
public class QcTaskTimeWorker //u: ISpareTimeWorker
|
||||
{
|
||||
private ISqlSugarRepository<QcCheckPlanH> repository => App.GetService<ISqlSugarRepository<QcCheckPlanH>>();
|
||||
private ITimeTaskService timeTaskService => App.GetService<ITimeTaskService>();
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Security.Cryptography.Xml;
|
||||
using JNPF;
|
||||
using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.DependencyInjection;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using SqlSugar;
|
||||
@@ -15,7 +17,7 @@ namespace Tnb.Vengine.DataAccess;
|
||||
public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
{
|
||||
private const int MAX_PAGE_SIZE = 1000;
|
||||
private ISqlSugarClient? _db;
|
||||
private static ISqlSugarClient? _db;
|
||||
|
||||
protected ISqlSugarClient Db
|
||||
{
|
||||
@@ -170,14 +172,18 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
private async Task LoadVmodelNavigateAsync(Vmodel vm)
|
||||
{
|
||||
Dictionary<string, Vmodel> dictVm = new();
|
||||
var vmids = vm.navProps.Select(a => a.vmid).Distinct().ToList();
|
||||
var ls = await Db.Queryable<Vmodel>().Where(a => vmids.Contains(a.id)).ToListAsync();
|
||||
var navs = ls.ToDictionary(a => a.id);
|
||||
foreach (var navProp in vm.navProps)
|
||||
{
|
||||
if (!dictVm.ContainsKey(navProp.vmid))
|
||||
{
|
||||
var navModel = await GetVmodelAsync(navProp.vmid);
|
||||
dictVm.Add(navProp.vmid, navModel);
|
||||
}
|
||||
navProp.naviModel = dictVm[navProp.vmid];
|
||||
navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid);
|
||||
//if (!dictVm.ContainsKey(navProp.vmid))
|
||||
//{
|
||||
// var navModel = await GetVmodelAsync(navProp.vmid);
|
||||
// dictVm.Add(navProp.vmid, navModel);
|
||||
//}
|
||||
//navProp.naviModel = dictVm[navProp.vmid];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,10 +197,8 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
var selProps = vm.GetVmSelectProps(input.o);
|
||||
//处理导航属性联表
|
||||
List<JoinInfoParameter> joins = vm.GetJoinInfos(selProps);
|
||||
query.AddJoinInfo(joins);
|
||||
//if (joins.Count > 0)
|
||||
//{
|
||||
//}
|
||||
query.AddJoinInfo(joins);
|
||||
List<IConditionalModel> wheres = vm.GetConditionalModels(input.q);
|
||||
if (!string.IsNullOrEmpty(input.k))
|
||||
{
|
||||
@@ -208,10 +212,8 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
wheres.Add(new ConditionalCollections() { ConditionalList = lsCondition });
|
||||
}
|
||||
//处理查询参数
|
||||
query.Where(wheres);
|
||||
//if (wheres.Count > 0)
|
||||
//{
|
||||
//}
|
||||
query.Where(wheres);
|
||||
if (!string.IsNullOrEmpty(input.sort))
|
||||
{
|
||||
query.OrderBy(input.sort);
|
||||
@@ -229,7 +231,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
//组装输出对象
|
||||
foreach (var data in ls)
|
||||
{
|
||||
DObject ret = await NestedOutputAsync(vm, new DObject(data), selProps);
|
||||
DObject ret = await CombineOutputAsync(vm, new DObject(data), selProps);
|
||||
result.items.Add(ret);
|
||||
}
|
||||
|
||||
@@ -243,11 +245,12 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
/// <param name="src"></param>
|
||||
/// <param name="selProps"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<DObject> NestedOutputAsync(Vmodel vm, DObject src, List<VmSelectProp> selProps)
|
||||
private async Task<DObject> CombineOutputAsync(Vmodel vm, DObject src, List<VmSelectProp> selProps)
|
||||
{
|
||||
DObject ret = new();
|
||||
foreach (var prop in selProps)
|
||||
{
|
||||
// 加载主表字段
|
||||
if (prop.navType == eNavigateType.None || prop.navCode == VmSelectProp.MAIN_ALIES)
|
||||
{
|
||||
if (src.ContainsKey(prop.code))
|
||||
@@ -257,40 +260,14 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
}
|
||||
else
|
||||
{
|
||||
// 加载关联表字段
|
||||
if (prop.navType == eNavigateType.OneToOne)
|
||||
{
|
||||
//以 nav_prop的形式返回
|
||||
var key = prop.navCode + "_" + prop.code;
|
||||
ret.Add(key, src[key]);
|
||||
//以 nav.prop的形式返回
|
||||
//if (!ret.ContainsKey(prop.navCode))
|
||||
//{
|
||||
// ret.Add(prop.navCode, new DObject());
|
||||
//}
|
||||
//var key = prop.navCode + "_" + prop.code;
|
||||
//if (src.ContainsKey(key))
|
||||
//{
|
||||
// ((DObject)ret[prop.navCode]).Add(prop.code, src[key]);
|
||||
//}
|
||||
NestedOutput(vm, src, ret, prop);
|
||||
}
|
||||
else if (prop.navType == eNavigateType.OneToMany)
|
||||
{
|
||||
if (!ret.ContainsKey(prop.navCode))
|
||||
{
|
||||
ret.Add(prop.navCode, new List<DObject>());
|
||||
}
|
||||
var navProp = vm.navProps.First(a => a.code == prop.navCode);
|
||||
if (navProp != null && navProp.naviModel != null && src.ContainsKey(navProp.refField))
|
||||
{
|
||||
VmListInput input = new VmListInput();
|
||||
var fkProp = navProp.naviModel.FieldCodeToPropCode(navProp.fkField);
|
||||
if (!string.IsNullOrEmpty(fkProp))
|
||||
{
|
||||
input.q = new DObject(fkProp, src[navProp.refField]);
|
||||
input.o = string.Join(',', selProps.Where(a => a.navCode == prop.navCode).Select(a => a.code));
|
||||
ret[prop.navCode] = (await QueryDataAsync(navProp.naviModel, input)).items;
|
||||
}
|
||||
}
|
||||
await NestedOneToManyAsync(vm, src, ret, prop, selProps);
|
||||
}
|
||||
else if (prop.navType == eNavigateType.ManyToMany)
|
||||
{
|
||||
@@ -304,6 +281,50 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将一对一的关联表字段嵌入到返回值中
|
||||
/// </summary>
|
||||
private void NestedOutput(Vmodel vm, DObject src, DObject ret, VmSelectProp prop)
|
||||
{
|
||||
// 以 nav_prop的形式返回
|
||||
var key = prop.navCode + "_" + prop.code;
|
||||
ret.Add(key, src[key]);
|
||||
// 以 nav.prop的形式返回
|
||||
//if (!ret.ContainsKey(prop.navCode))
|
||||
//{
|
||||
// ret.Add(prop.navCode, new DObject());
|
||||
//}
|
||||
//var key = prop.navCode + "_" + prop.code;
|
||||
//if (src.ContainsKey(key))
|
||||
//{
|
||||
// ((DObject)ret[prop.navCode]).Add(prop.code, src[key]);
|
||||
//}
|
||||
}
|
||||
|
||||
private async Task NestedOneToManyAsync(Vmodel vm, DObject src, DObject ret, VmSelectProp prop, List<VmSelectProp> selProps)
|
||||
{
|
||||
// 在返回值中增加导航属性
|
||||
if (ret.ContainsKey(prop.navCode))
|
||||
{
|
||||
return;
|
||||
}
|
||||
ret.Add(prop.navCode, new List<DObject>());
|
||||
|
||||
// 找到导航属性的配置
|
||||
var navCfg = vm.navProps.First(a => a.code == prop.navCode);
|
||||
if (navCfg != null && navCfg.naviModel != null && src.ContainsKey(navCfg.refField) && navCfg.refCode == VmSelectProp.MAIN_ALIES)
|
||||
{
|
||||
VmListInput input = new VmListInput();
|
||||
var fkProp = navCfg.naviModel.FieldCodeToPropCode(navCfg.fkField);
|
||||
if (!string.IsNullOrEmpty(fkProp))
|
||||
{
|
||||
input.q = new DObject(fkProp, src[navCfg.refField]);
|
||||
input.o = string.Join(',', selProps.Where(a => a.navCode == prop.navCode).Select(a => a.code));
|
||||
ret[prop.navCode] = (await QueryDataAsync(navCfg.naviModel, input)).items;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增数据 默认方法
|
||||
/// </summary>
|
||||
|
||||
97
visualdev/Tnb.Vengine/Domain/OutputParser.cs
Normal file
97
visualdev/Tnb.Vengine/Domain/OutputParser.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using JNPF.Common.Extension;
|
||||
using Tnb.Vengine.DataAccess;
|
||||
|
||||
namespace Tnb.Vengine.Domain
|
||||
{
|
||||
public class OutputParser
|
||||
{
|
||||
private readonly IDataAccess _dataAccess;
|
||||
private readonly Vmodel _root;
|
||||
private List<string> _outputs;
|
||||
private Dictionary<string, OutputSelect> _selectProps = new Dictionary<string, OutputSelect>();
|
||||
private Dictionary<string, Vmodel?> _navModels = new Dictionary<string, Vmodel?>();
|
||||
public OutputParser(IDataAccess dataAccess, Vmodel rootModel, string output)
|
||||
{
|
||||
_dataAccess = dataAccess;
|
||||
_root = rootModel;
|
||||
_outputs = output.Split(',').Distinct().ToList();
|
||||
ParseOutputStr();
|
||||
}
|
||||
/// <summary>
|
||||
/// 按模型组织要输出的属性
|
||||
/// </summary>
|
||||
private void ParseOutputStr()
|
||||
{
|
||||
foreach (var outStr in _outputs)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(outStr))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string vmPath;
|
||||
int n = outStr.LastIndexOf('.');
|
||||
if (n < 1)
|
||||
{
|
||||
vmPath = Vmodel.MAIN_ALIES;
|
||||
}
|
||||
else
|
||||
{
|
||||
vmPath = outStr.Substring(0, n);
|
||||
}
|
||||
if (!_selectProps.ContainsKey(vmPath))
|
||||
{
|
||||
_selectProps.Add(vmPath, new OutputSelect { navPaths = vmPath.Split(',').ToList(), vmPath = vmPath });
|
||||
}
|
||||
var outSelect = _selectProps[vmPath];
|
||||
outSelect.propCodes.Add(outStr.Substring(n + 1));
|
||||
}
|
||||
}
|
||||
|
||||
private async Task LoadNavModel()
|
||||
{
|
||||
var navProps = _root.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList();
|
||||
await LoadVmodelNavigateAsync(navProps);
|
||||
}
|
||||
private async Task LoadVmodelNavigateAsync(List<VmNavProp> navProps)
|
||||
{
|
||||
var db = _dataAccess.GetSqlSugar();
|
||||
|
||||
var vmids = navProps.Select(a => a.vmid).Distinct().ToList();
|
||||
var navs = await db.Queryable<Vmodel>().Where(a => vmids.Contains(a.id)).ToDictionaryAsync(a => a.id, a => a);
|
||||
foreach (var navProp in navProps)
|
||||
{
|
||||
navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid);
|
||||
navProp.naviModel.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal class OutputSelect
|
||||
{
|
||||
public string vmId { get; set; } = string.Empty;
|
||||
public string vmCode { get; set; } = string.Empty;
|
||||
public string vmPath { get; set; } = string.Empty;
|
||||
public eNavigateType navType { get; set; } = eNavigateType.None;
|
||||
public List<string> navPaths { get; set; } = new List<string>();
|
||||
|
||||
public List<string> propCodes { get; set; } = new List<string>();
|
||||
public List<string> fieldCodes { get; set; } = new List<string>();
|
||||
|
||||
public OutputSelect()
|
||||
{
|
||||
|
||||
}
|
||||
public OutputSelect(Vmodel model)
|
||||
{
|
||||
vmId = model.id;
|
||||
vmCode = model.vmCode;
|
||||
vmPath = Vmodel.MAIN_ALIES;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -164,6 +164,7 @@ public class VmSelectProp
|
||||
public const string MAIN_ALIES = "m";
|
||||
public string code { get; set; } = string.Empty;
|
||||
public string field { get; set; } = string.Empty;
|
||||
public List<string> navPath { get; set; } = new List<string>();
|
||||
public string navCode { get; set; } = MAIN_ALIES;
|
||||
public ePropType propType { get; set; }
|
||||
public eNavigateType navType { get; set; }
|
||||
|
||||
@@ -111,7 +111,7 @@ public class VmDbProp : VmBaseProp
|
||||
/// 获取默认值文本
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public object? GetDefaultValueString()
|
||||
public string? GetDefaultValueString()
|
||||
{
|
||||
string val = "";
|
||||
if (!required) return val;
|
||||
|
||||
@@ -23,6 +23,8 @@ namespace Tnb.Vengine.Domain;
|
||||
[SugarTable("sys_vmodel")]
|
||||
public partial class Vmodel : Entity
|
||||
{
|
||||
public const string MAIN_ALIES = "m";
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
@@ -146,7 +148,8 @@ public partial class Vmodel : Entity
|
||||
}
|
||||
|
||||
#endregion Properties
|
||||
|
||||
//private Dictionary<string, string>? _mapField2Prop = null;
|
||||
//private Dictionary<string, string>? _mapProp2Field = null;
|
||||
/// <summary>
|
||||
/// 通过实体创建模型
|
||||
/// </summary>
|
||||
@@ -351,11 +354,30 @@ public partial class Vmodel : Entity
|
||||
if (filter == null) return wheres;
|
||||
foreach (var item in filter)
|
||||
{
|
||||
VmDbProp? prop = null;
|
||||
// TODO 按子表条件查询
|
||||
if (item.Key.Contains("."))
|
||||
{
|
||||
var codes = item.Key.Split('.');
|
||||
if (codes.Length >= 2)
|
||||
{
|
||||
var navProp = navProps.FirstOrDefault(a => a.code == codes[0]);
|
||||
if (navProp != null && navProp.naviModel != null)
|
||||
{
|
||||
var dbProp = navProp.naviModel.dbProps.FirstOrDefault(a => a.code == codes[1]);
|
||||
if (dbProp != null)
|
||||
{
|
||||
prop = new VmDbProp();
|
||||
prop.field = codes[0] + "." + dbProp.field;
|
||||
prop.csType = dbProp.csType;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prop = dbProps.FirstOrDefault(a => a.code == item.Key);
|
||||
}
|
||||
var prop = dbProps.FirstOrDefault(a => a.code == item.Key);
|
||||
if (prop == null) continue;
|
||||
if (item.Value is JArray val)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user