This commit is contained in:
FanLian
2023-11-03 11:38:04 +08:00
87 changed files with 1857 additions and 895 deletions

View 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";
}
}

View File

@@ -164,6 +164,11 @@ public static class DictConst
/// </summary>
public const string AndonStatusYWC = "5";
/// <summary>
/// 产成品入库单
/// </summary>
public const string CHANCHENGPINRUKUDAN = "40";
#endregion

View File

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

View File

@@ -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; }
}
}

View File

@@ -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; }
}
}

View 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; }
}
}

View File

@@ -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; }
}
}

View 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; }
}
}

View File

@@ -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; }
}

View File

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

View File

@@ -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);
}
}
}

View File

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

View File

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

View File

@@ -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("二维码总表中已存在该二维码");

View File

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

View File

@@ -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; }
}
}

View File

@@ -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; }
}
}

View File

@@ -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; }
}
}

View File

@@ -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; }
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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;
}
}
}

View File

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

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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}")

View File

@@ -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);

View 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;
}
}
}

View File

@@ -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; }

View File

@@ -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);
}
}
}

View File

@@ -15,5 +15,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
/// 任务执行Ids
/// </summary>
public List<string> disTaskIds { get; set; }
}
}

View File

@@ -15,5 +15,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
/// 任务执行Ids
/// </summary>
public List<string> disTaskIds { get; set; }
}
}

View File

@@ -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; }
}

View File

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

View 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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}

View File

@@ -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;
// }
//}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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)
{
}
}
}

View File

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

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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)
{

View File

@@ -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);
}

View File

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

View File

@@ -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);
}

View File

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

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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();
}
}

View File

@@ -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 //是否开启定时任务
}

View File

@@ -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",

View File

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

View File

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

View File

@@ -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";
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

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

View File

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

View File

@@ -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);
}
}
}

View File

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

View File

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

View File

@@ -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>();

View File

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

View 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;
}
}
}

View File

@@ -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; }

View File

@@ -111,7 +111,7 @@ public class VmDbProp : VmBaseProp
/// 获取默认值文本
/// </summary>
/// <returns></returns>
public object? GetDefaultValueString()
public string? GetDefaultValueString()
{
string val = "";
if (!required) return val;

View File

@@ -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)
{