diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs index 12b4ded0..ada9dbb8 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs @@ -4,6 +4,8 @@ namespace Tnb.EquipMgr.Entities.Dto { public string? id { get; set; } public string? attachment { get; set; } + + public string? fhattachment { get; set; } public string? create_time { get; set; } public string? equip_id { get; set; } public string? equip_id_id { get; set; } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartRecord.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartRecord.cs new file mode 100644 index 00000000..4bd1b2b5 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartRecord.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.EquipMgr.Entities +{ + public class EquipSparePartRecordInput + { + public string? equip_id { get; set; } + } + public class EquipSparePartRecordOut + { + public string? id { get; set; } + public string? code { get; set; } + public string? name { get; set; } + public string? type { get; set; } + public string? execuser { get; set; } + public string? execdatetime { get; set; } + public int? num { get; set; } + + } +} diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartsQueryOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartsQueryOutput.cs index 33f096ac..37ccbbca 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartsQueryOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSparePartsQueryOutput.cs @@ -8,6 +8,7 @@ namespace Tnb.EquipMgr.Entities.Dto public string? code { get; set; } public string? name { get; set; } public string? specification { get; set; } + public int? num { get; set; } } } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs index ba40ffb9..3664bb2c 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs @@ -4,6 +4,8 @@ namespace Tnb.EquipMgr.Entities.Dto { public string? id { get; set; } public string? attachment { get; set; } + + public string? fhattachment { get; set; } public string? create_time { get; set; } public string? equip_id { get; set; } public string? repeat_remark { get; set; } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs index ff09b958..1f07e4c0 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs @@ -7,6 +7,7 @@ namespace Tnb.EquipMgr.Entities.Dto public string repeat_result { get; set; } = string.Empty; public string? repeat_remark { get; set; } + public string? attachment { get; set; } public List>? details { get; set; } } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldMaintainRunUpInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldMaintainRunUpInput.cs index e9a2cf48..e25142a3 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldMaintainRunUpInput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldMaintainRunUpInput.cs @@ -37,4 +37,10 @@ public string result { get; set; } } + public class MaintainItemResult + { + public string item_name { get; set; } + public string group_name { get; set; } + public string result { get; set; } + } } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldStartWxInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldStartWxInput.cs new file mode 100644 index 00000000..2a861c76 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldStartWxInput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.EquipMgr.Entities +{ + public class MoldStartWxInput + { + public string? id { get; set; } + } +} diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadMainListOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadMainListOutput.cs index 30431bcc..85437eee 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadMainListOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadMainListOutput.cs @@ -16,5 +16,6 @@ public string plan_start_time { get; set; } public string starttime { get; set; } + public string finishtime { get; set; } } } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs index 228f6286..d865e4e5 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs @@ -20,5 +20,6 @@ namespace Tnb.EquipMgr.Entities.Dto public string repairer_id { get; set; } public string repairer_id_id { get; set; } public string status { get; set; } + public string attachment { get; set; } } } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs index 35cc5b6d..35074944 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs @@ -7,5 +7,7 @@ namespace Tnb.EquipMgr.Entities.Dto public string? repeat_result { get; set; } public string? repeat_remark { get; set; } + + public string? attachment { get; set; } } } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs index d6643199..d0d33f2e 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs @@ -164,5 +164,10 @@ public partial class EqpMaintainRecordH : BaseEntity /// public string? org_id { get; set; } + /// + /// 复核附件 + /// + public string? fhattachment { get; set; } + } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs index 38b993c6..5807603b 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs @@ -159,4 +159,10 @@ public partial class EqpSpotInsRecordH : BaseEntity /// public string? repeat_result { get; set; } + + /// + /// 复核附件 + /// + public string? fhattachment { get; set; } + } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs index b077342b..e843dc6d 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs @@ -53,4 +53,12 @@ public partial class ToolMoldMaintainTask : BaseEntity /// public string status { get; set; } + public string? name { get; set; } + public string? attachment { get; set; } + public string? describe { get; set; } + + public int is_finish { get; set; } + public string? wxattachment { get; set; } + public string? wxdescribe { get; set; } + } diff --git a/EquipMgr/Tnb.EquipMgr/EqpEquipSparePartsService.cs b/EquipMgr/Tnb.EquipMgr/EqpEquipSparePartsService.cs index bcd10817..2360799e 100644 --- a/EquipMgr/Tnb.EquipMgr/EqpEquipSparePartsService.cs +++ b/EquipMgr/Tnb.EquipMgr/EqpEquipSparePartsService.cs @@ -1,11 +1,14 @@ +using System.CodeDom.Compiler; using JNPF.Common.Core.Manager; using JNPF.Common.Filter; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; +using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; +using NPOI.SS.Formula.Functions; using SqlSugar; using Tnb.EquipMgr.Entities; using Tnb.EquipMgr.Entities.Dto; @@ -68,6 +71,9 @@ namespace Tnb.EquipMgr { queryJson = JsonConvert.DeserializeObject>(input.queryJson); } + var eqpSpareParts = await db.Queryable().ToListAsync(); + var InstockDs= await db.Queryable().ToListAsync(); + var RequisitionDs = await db.Queryable().ToListAsync(); SqlSugarPagedList result = await db.Queryable() .LeftJoin((a, b) => a.spare_parts_id == b.id) .LeftJoin((a, b, c) => c.EnCode == Tnb.BasicData.DictConst.SparePartsType && c.DeleteMark == null) @@ -82,10 +88,68 @@ namespace Tnb.EquipMgr type_name = d.FullName, code = b.code, name = b.name, - specification = b.specification + specification = b.specification, + num = 0 }).ToPagedListAsync(input.currentPage, input.pageSize); + foreach (var item in result.list) + { + try + { + var part = eqpSpareParts.Where(p => p.code == item.code).First(); + var Instocknum = InstockDs.Where(p => p.spare_parts_id == part.id).Sum(p => p.quantity); + var Requisitionum = RequisitionDs.Where(p => p.spare_parts_id == part.id).Sum(p => p.quantity); + item.num = Instocknum > Requisitionum ? Instocknum - Requisitionum : 0; + } + catch (Exception) + { + } + } return PageResult.SqlSugarPageResult(result); } + + //获取备品备件历史 + [HttpPost] + public async Task GetEquipSparePartRecord(EquipSparePartRecordInput input) + { + ISqlSugarClient db = _repository.AsSugarClient(); + var partsids = await db.Queryable().Where(p => p.equip_id == input.equip_id).Select(p => p.spare_parts_id).ToListAsync(); + var Instocks = await db.Queryable() + .LeftJoin((a, b) => a.instock_id == b.id) + .LeftJoin((a, b, c) => a.spare_parts_id == c.id) + .LeftJoin((a, b, c, d) => b.instock_id == d.Id) + .Where((a, b, c, d) => partsids.Contains(a.spare_parts_id!)) + .Select((a, b, c, d) => new EquipSparePartRecordOut() + { + id = a.id, + code = c.code, + name = c.name, + type = "入库", + execuser = d.RealName, + execdatetime = b.create_time != null ? b.create_time.ToString() : "", + num = a.quantity + }) + .ToListAsync(); + + var Requisitions = await db.Queryable() + .LeftJoin((a, b) => a.spare_parts_requisition_id == b.id) + .LeftJoin((a, b, c) => a.spare_parts_id == c.id) + .LeftJoin((a, b, c, d) => b.recipient_id == d.Id) + .Where((a, b, c, d) => partsids.Contains(a.spare_parts_id!)) + .Select((a, b, c, d) => new EquipSparePartRecordOut() + { + id = a.id, + code = c.code, + name = c.name, + type = "领用", + execuser = d.RealName, + execdatetime = b.create_time != null ? b.create_time.ToString()!.Substring(0,19) : "", + num = a.quantity + }) + .ToListAsync(); + Instocks.AddRange(Requisitions); + var result = Instocks.OrderByDescending(p => DateTime.Parse(p.execdatetime!)); + return result; + } } } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs b/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs index f49cdbc5..9d92a6e5 100644 --- a/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs +++ b/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs @@ -99,22 +99,22 @@ namespace Tnb.EquipMgr input.data["code"] = await _billRuleService.GetBillNumber(CodeTemplateConst.EQPREPAIR_CODE); } - EqpRepairApply eqpRepairApply = new() - { - code = (string)input.data["code"], - name = (string)input.data["name"], - equip_id = (string)input.data["equip_id"], - expect_complete_time = input.data["expect_complete_time"] != null && input.data["expect_complete_time"].ToString() != "" ? DateTimeOffset.FromUnixTimeSeconds(((long)input.data["expect_complete_time"]) / 1000).ToLocalTime().DateTime : null, - is_ugent = (int?)(long)input.data["is_ugent"], - attachment = input.data.ContainsKey("attachment") ? JSON.Serialize(input.data["attachment"]) : null, - apply_user_id = (string)input.data["apply_user_id"], - create_id = (string)input.data["create_id"], - create_time = DateTime.Now, - org_id = (string)input.data["org_id"], - remark = input.data.ContainsKey("remark") ? (string)input.data["remark"] : "", - description = input.data.ContainsKey("description") ? (string)input.data["description"] : "", - status = RepairApplyStatus.TOBEEXECUTED - }; + EqpRepairApply eqpRepairApply = new(); + + 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() != "" ? DateTimeOffset.FromUnixTimeSeconds(((long)input.data["expect_complete_time"]) / 1000).ToLocalTime().DateTime : null; + eqpRepairApply.is_ugent = (int?)(long)input.data["is_ugent"]; + eqpRepairApply.attachment = input.data.ContainsKey("attachment") ? JsonConvert.SerializeObject(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 = input.data.ContainsKey("remark") ? (string)input.data["remark"] : ""; + eqpRepairApply.description = input.data.ContainsKey("description") ? (string)input.data["description"] : ""; + eqpRepairApply.status = RepairApplyStatus.TOBEEXECUTED; + _ = await _repository.InsertAsync(eqpRepairApply); // VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true); @@ -397,7 +397,8 @@ namespace Tnb.EquipMgr repairer_id = c.RealName, repairer_id_id = c.Id, remark = a.remark, - status = f.FullName + status = f.FullName, + attachment=a.attachment }).ToPagedListAsync(input?.currentPage ?? 1, input?.pageSize ?? 50); return PageResult.SqlSugarPageResult(result); diff --git a/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs b/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs index 225f3154..0438198c 100644 --- a/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs +++ b/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs @@ -1,3 +1,4 @@ +using System.Linq; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Security; @@ -117,7 +118,14 @@ namespace Tnb.EquipMgr if (eqpSparePartsList.Count > 0) { - _ = await db.Insertable(eqpSparePartsList).ExecuteCommandAsync(); + var datas= await db.Queryable().ToListAsync(); + foreach (var item in eqpSparePartsList) + { + if (!datas.Where(p => p.equip_id == item.equip_id && p.spare_parts_id == item.spare_parts_id).Any()) + _ = await db.Insertable(eqpSparePartsList).ExecuteCommandAsync(); + + } + } } diff --git a/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs b/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs index c7c003da..b1e45c66 100644 --- a/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs +++ b/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs @@ -214,6 +214,7 @@ namespace Tnb.EquipMgr { _ = await _repository.UpdateAsync(x => new EqpMaintainRecordH() { + fhattachment=input.attachment, repeat_result = input.repeat_result, repeat_remark = input.repeat_remark, repeat_user_id = _userManager.UserId, @@ -244,6 +245,7 @@ namespace Tnb.EquipMgr { id = a.id, attachment = a.attachment, + fhattachment= a.fhattachment, create_time = a.create_time == null ? null : a.create_time.Value.ToString(DbTimeFormat.MM), equip_id = b.code, equip_id_id = a.equip_id, diff --git a/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs b/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs index 111e86a7..cc558030 100644 --- a/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs +++ b/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs @@ -183,6 +183,7 @@ namespace Tnb.EquipMgr repeat_result = input.repeat_result, repeat_remark = input.repeat_remark, repeat_user_id = _userManager.UserId, + fhattachment=input.attachment, repeat_time = DateTime.Now, status = SpotInsRecordExecutionStatus.COMPLETED }, x => x.id == input.id); @@ -204,6 +205,7 @@ namespace Tnb.EquipMgr { id = a.id, attachment = a.attachment, + fhattachment=a.fhattachment, create_time = a.create_time == null ? null : a.create_time.Value.ToString(DbTimeFormat.MM), equip_id = a.equip_id, repeat_remark = a.repeat_remark, diff --git a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs index 2ada52bb..63c0924d 100644 --- a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs +++ b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainRunService.cs @@ -196,33 +196,35 @@ namespace Tnb.EquipMgr else { input.sidx = "b." + input.sidx; + input.sort = "desc"; } List records = await _db.Queryable().Select(p => p.plan_id + p.mold_id).ToListAsync(); SqlSugarPagedList result = await _db.Queryable() .LeftJoin((a, b) => a.maintain_plan_id == b.id) .LeftJoin((a, b, c) => a.mold_id == c.id) .LeftJoin((a, b, c, d) => b.plan_code == d.plan_code && c.mold_code == d.mold_code) - .LeftJoin((a, b, c, d, e) => e.plan_id == b.id && e.mold_id == c.id) - .LeftJoin((a, b, c, d, e, f) => b.create_id == f.Id) - .LeftJoin((a, b, c, d, e, f, g) => c.mold_status == g.Id) + // .LeftJoin((a, b, c, d, e) => e.plan_id == b.id && e.mold_id == c.id) + .LeftJoin((a, b, c, d, e) => b.create_id == e.Id) + .LeftJoin((a, b, c, d, e, f) => c.mold_status == f.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 + .WhereIF(!string.IsNullOrEmpty(input.maintain_info), (a, b, c, d, e, f) => c.mold_code!.Contains(input.maintain_info) || c.mold_name!.Contains(input.maintain_info)) + .WhereIF(start_time != null, (a, b, c, d, e, f) => b.create_time != null && b.create_time >= start_time) + .WhereIF(end_time != null, (a, b, c, d, e, f) => b.create_time != null && b.create_time <= end_time) + .WhereIF(input.status == "待保养", (a, b, c, d, e, f) => !records.Contains(a.maintain_plan_id + a.mold_id)) + .WhereIF(input.status == "已完成", (a, b, c, d, e, f) => records.Contains(a.maintain_plan_id + a.mold_id)) + .Select((a, b, c, d, e, f) => new PadMainListOutput { plan_id = b.id, mold_id = c.id, mold_code = c.mold_code!, mold_name = c.mold_name!, - mold_status = g.FullName!, + mold_status = f.FullName!, status = input.status, - createuser = f.RealName, + createuser = e.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), + finishtime= d.plan_end_time == null ? "" : d.plan_end_time.Value.ToString(DbTimeFormat.SS), }).OrderBy($"{input.sidx} {input.sort}").ToPagedListAsync(input?.currentPage ?? 1, input?.pageSize ?? 50); return PageResult.SqlSugarPageResult(result); } @@ -303,7 +305,23 @@ namespace Tnb.EquipMgr return items; } + [HttpPost] + public async Task GetMaintainItem(MoldMaintainRunUpInput input) + { + var data = await _db.Queryable() + .LeftJoin((a, b) => a.item_id == b.id) + .LeftJoin((a, b, c) => a.item_group_id == c.id) + .Where((a, b, c) => a.plan_id == input.plan_id && a.mold_id == input.mold_id) + .Select((a, b, c) => new MaintainItemResult + { + group_name = c.name!, + item_name = b.name!, + result = a.result, + }) + .ToListAsync(); + return data; + } /// /// 模具保养计划执行-开始模具保养 /// @@ -447,6 +465,11 @@ namespace Tnb.EquipMgr { throw new ArgumentException($"parameter {nameof(input.items)} not be null or empty"); } + var plan_code = _db.Queryable().Where(p => p.id == input.plan_id).Select(p=>p.plan_code).First(); + var mold_code = _db.Queryable().Where(p => p.id == input.mold_id).Select(p => p.mold_code).First(); + if (!string.IsNullOrEmpty(plan_code)&& !string.IsNullOrEmpty(mold_code)) { + _ = await _db.Updateable().SetColumns(it => new ToolMoldMaintainRunRecord { plan_end_time = DateTime.Now }).Where(it => it.plan_code == plan_code && it.mold_code== mold_code).ExecuteCommandAsync(); + } List records = new(); foreach (MaintainItemInfo item in input.items) @@ -505,6 +528,11 @@ namespace Tnb.EquipMgr } } + + + + + /// /// 模具保养计划执行-保养完成 /// diff --git a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs index 4979f99f..fcbe2d65 100644 --- a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs +++ b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs @@ -1,4 +1,5 @@ -using JNPF.Common.Enums; +using JNPF.Common.Core.Manager; +using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.DependencyInjection; using JNPF.DynamicApiController; @@ -29,16 +30,19 @@ namespace Tnb.EquipMgr private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private static Dictionary _dicMold = new(); + private readonly IUserManager _userManager; public ToolMoldMaintainTaskService( ISqlSugarRepository repository, IRunService runService, - IVisualDevService visualDevService + IVisualDevService visualDevService, + IUserManager userManager ) { _db = repository.AsSugarClient(); _runService = runService; _visualDevService = visualDevService; OverideFuncs.GetListAsync = GetList; + _userManager = userManager; //OverideFuncs.CreateAsync = Create; } public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); @@ -100,5 +104,23 @@ namespace Tnb.EquipMgr throw Oops.Oh(ErrorCode.COM1001); } } + + + /// + /// 开始维修 + /// + /// 输入参数 + /// + [HttpPost] + public async Task StartWx(MoldStartWxInput input) + { + DateTime? StartTime = DateTime.Now; + int row = await _db.Updateable().SetColumns(it => new ToolMoldMaintainTask { status = "WXZ", modify_strat_time = StartTime, modify_id = _userManager.UserId }) + .Where(it => input.id == it.id).ExecuteCommandAsync(); + if (row < 1) + { + throw Oops.Oh(ErrorCode.COM1001); + } + } } } diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/AndonPdaListInput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/AndonPdaListInput.cs new file mode 100644 index 00000000..aaaf32af --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/AndonPdaListInput.cs @@ -0,0 +1,9 @@ +using JNPF.Common.Filter; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Tnb.ProductionMgr.Entities.Dto +{ + public class AndonPdaListInput : PageInputBase + { + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/AndonRecordService.cs b/ProductionMgr/Tnb.ProductionMgr/AndonRecordService.cs index 2f873ee0..1a350944 100644 --- a/ProductionMgr/Tnb.ProductionMgr/AndonRecordService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/AndonRecordService.cs @@ -68,17 +68,75 @@ namespace Tnb.ProductionMgr andon_info_name = b.name, promoter_name = d.RealName, repair_name = c.RealName, - promoter_time = a.create_time == null ? "" : a.create_time.Value.ToString("yyyy-MM-dd hh:mm:ss"), - response_time = a.response_time == null ? "" : a.response_time.Value.ToString("yyyy-MM-dd hh:mm:ss"), - start_repair_time = a.start_repair_time == null ? "" : a.start_repair_time.Value.ToString("yyyy-MM-dd hh:mm:ss"), - end_repair_time = a.end_repair_time == null ? "" : a.end_repair_time.Value.ToString("yyyy-MM-dd hh:mm:ss"), - confirm_time = a.confirm_time == null ? "" : a.confirm_time.Value.ToString("yyyy-MM-dd hh:mm:ss"), + promoter_time = a.create_time == null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS), + response_time = a.response_time == null ? "" : a.response_time.Value.ToString(DbTimeFormat.SS), + start_repair_time = a.start_repair_time == null ? "" : a.start_repair_time.Value.ToString(DbTimeFormat.SS), + end_repair_time = a.end_repair_time == null ? "" : a.end_repair_time.Value.ToString(DbTimeFormat.SS), + confirm_time = a.confirm_time == null ? "" : a.confirm_time.Value.ToString(DbTimeFormat.SS), status = f.FullName, }).ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(result); } + + [HttpPost] + public async Task GetAndonPdaList(AndonPdaListInput input) + { + Dictionary queryJson = string.IsNullOrEmpty(input.queryJson) ? new Dictionary() : input.queryJson.ToObject>(); + string? status = queryJson.ContainsKey("status") ? queryJson["status"].ToString() : ""; + List statusList = new(); + if (!string.IsNullOrEmpty(status)) + { + switch (status) + { + case "1": + statusList.Add(DictConst.AndonStatusHJZ); + break; + case "2": + statusList.Add(DictConst.AndonStatusYXY); + statusList.Add(DictConst.AndonStatusCLZ); + break; + case "3": + statusList.Add(DictConst.AndonStatusDQR); + statusList.Add(DictConst.AndonStatusYWC); + break; + } + } + if (string.IsNullOrEmpty(input.sidx)) + { + input.sidx = "create_time"; + input.sort = "desc"; + } + + + SqlSugarPagedList result = await _db.Queryable() + .LeftJoin((a, b) => a.andon_info_id == b.id) + .LeftJoin((a, b, c) => a.repair_id == c.Id) + .LeftJoin((a, b, c, d) => a.create_id == d.Id) + .LeftJoin((a, b, c, d, e) => e.EnCode == DictConst.AndonStatus) + .LeftJoin((a, b, c, d, e, f) => a.status == f.EnCode && e.Id == f.DictionaryTypeId) + .WhereIF(statusList.Count > 0, a => statusList.Contains(a.status)) + .Select((a, b, c, d, e, f) => new AndonPadListOutput + { + id = a.id, + andon_info_name = b.name, + promoter_name = d.RealName, + repair_name = c.RealName, + promoter_time = a.create_time == null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS), + response_time = a.response_time == null ? "" : a.response_time.Value.ToString(DbTimeFormat.SS), + start_repair_time = a.start_repair_time == null ? "" : a.start_repair_time.Value.ToString(DbTimeFormat.SS), + end_repair_time = a.end_repair_time == null ? "" : a.end_repair_time.Value.ToString(DbTimeFormat.SS), + confirm_time = a.confirm_time == null ? "" : a.confirm_time.Value.ToString(DbTimeFormat.SS), + status = f.FullName, + }) + .MergeTable() + .OrderBy($"{input.sidx} {input.sort}") + .ToPagedListAsync(input.currentPage, input.pageSize); + + return PageResult.SqlSugarPageResult(result); + + } [HttpPost] public async Task AddAndon(AddAndonInput input) @@ -247,19 +305,28 @@ namespace Tnb.ProductionMgr AndonRecords andonRecords = await _db.Queryable().SingleAsync(x => x.id == id); if (andonRecords != null) { - if (andonRecords.status != DictConst.AndonStatusYXY) + if (andonRecords.repair_id!=_userManager.UserId) { - throw Oops.Bah($"状态错误"); + UserEntity user = await _db.Queryable().SingleAsync(x => x.Id == andonRecords.repair_id); + throw Oops.Bah($"您不是处理人"); } else { - _ = await _db.Updateable() - .SetColumns(x => x.start_repair_time == DateTime.Now) - .Where(x => x.id == id) - .ExecuteCommandAsync(); - return true; + if (andonRecords.status != DictConst.AndonStatusYXY) + { + throw Oops.Bah($"状态错误"); + } + else + { + _ = await _db.Updateable() + .SetColumns(x => x.start_repair_time == DateTime.Now) + .Where(x => x.id == id) + .ExecuteCommandAsync(); + return true; + } } + } else { @@ -274,19 +341,28 @@ namespace Tnb.ProductionMgr AndonRecords andonRecords = await _db.Queryable().SingleAsync(x => x.id == id); if (andonRecords != null) { - if (andonRecords.status != DictConst.AndonStatusCLZ) + if (andonRecords.repair_id!=_userManager.UserId) { - throw Oops.Bah($"状态错误"); + UserEntity user = await _db.Queryable().SingleAsync(x => x.Id == andonRecords.repair_id); + throw Oops.Bah($"您不是处理人"); } else { - _ = await _db.Updateable() - .SetColumns(x => x.end_repair_time == DateTime.Now) - .Where(x => x.id == id) - .ExecuteCommandAsync(); - return true; + if (andonRecords.status != DictConst.AndonStatusCLZ) + { + throw Oops.Bah($"状态错误"); + } + else + { + _ = await _db.Updateable() + .SetColumns(x => x.end_repair_time == DateTime.Now) + .Where(x => x.id == id) + .ExecuteCommandAsync(); + return true; + } } + } else { @@ -301,19 +377,28 @@ namespace Tnb.ProductionMgr AndonRecords andonRecords = await _db.Queryable().SingleAsync(x => x.id == id); if (andonRecords != null) { - if (andonRecords.status != DictConst.AndonStatusYWC) + if (andonRecords.repair_id!=_userManager.UserId) { - throw Oops.Bah($"状态错误"); + UserEntity user = await _db.Queryable().SingleAsync(x => x.Id == andonRecords.repair_id); + throw Oops.Bah($"您不是处理人"); } else { - _ = await _db.Updateable() - .SetColumns(x => x.confirm_time == DateTime.Now) - .Where(x => x.id == id) - .ExecuteCommandAsync(); - return true; + if (andonRecords.status != DictConst.AndonStatusYWC) + { + throw Oops.Bah($"状态错误"); + } + else + { + _ = await _db.Updateable() + .SetColumns(x => x.confirm_time == DateTime.Now) + .Where(x => x.id == id) + .ExecuteCommandAsync(); + return true; + } } + } else { diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs new file mode 100644 index 00000000..a26991ce --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class CloseElevatorInput + { + public IEnumerable devNames { get; set; } + public int value { get; set; } + public string flag{ get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs index b6ef7fb4..62c5936b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs @@ -32,7 +32,7 @@ public partial class WmsDistaskH : BaseEntity /// /// 起始楼层 /// - public string? start_floor { get; set; } + public int start_floor { get; set; } /// /// 目标库位ID @@ -42,7 +42,7 @@ public partial class WmsDistaskH : BaseEntity /// /// 目标楼层 /// - public string? end_floor { get; set; } + public int end_floor { get; set; } /// /// 起始点位ID diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs index f42aacde..71d1b0b1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs @@ -1,4 +1,6 @@ -namespace Tnb.WarehouseMgr.Interfaces +using Tnb.WarehouseMgr.Entities.Dto.Inputs; + +namespace Tnb.WarehouseMgr.Interfaces { /// /// 电梯控制服务接口 @@ -31,10 +33,10 @@ /// 标签集合 /// 取消标志 /// 获取到的状态值 - Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable tags, CancellationToken token); + Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, IEnumerable tags, CancellationToken token); - Task> GetELevatorStatusMap(string devName,IEnumerable tags, CancellationToken token); + Task> GetELevatorStatusMap(string devName, IEnumerable tags, CancellationToken token); /// /// 检查Agv状态 /// @@ -61,5 +63,7 @@ /// Task CallLift(string devName, int floor, CancellationToken cancellationToken); + Task CloseElevatorControl(CloseElevatorInput input); + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index a51c8936..838ce1cb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -182,6 +182,10 @@ namespace Tnb.WarehouseMgr { realFloor = 3; } + else if(floor == 1) + { + realFloor = 1; + } return Task.FromResult(realFloor); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index d1e943df..15b8b86f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -200,10 +200,8 @@ namespace Tnb.WarehouseMgr } } - return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); - } catch (Exception ex) { @@ -223,53 +221,40 @@ namespace Tnb.WarehouseMgr try { Logger.Information($"任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}"); - /*switch (input.status) + switch (input.status) { case "CREATED": break; case "ALLOCATED": break; case "PROCESSING": - //if (await _cacheManager.GetAsync($"{input.taskChainCode}") == "任务链状态上报,上报状态PROCESSING") break; if (input.taskChainCode.Trim().IsNullOrEmpty()) { - break; + return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - TaskExecuteUpInput taskExecuteUpInput = new() + if (disTasks == null || disTasks.Count < 1) { - disTaskIds = disTasks.Select(x => x.id).ToList(), - EqpIds = eps.Select(x => x.id).ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); break; + Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); + } + if (disTasks?.Count > 0) + { + TaskExecuteUpInput taskExecuteUpInput = new() + { + disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + }; + await _wareHouseService.TaskExecute(taskExecuteUpInput); + } + break; case "CANCELLED": break; case "SUCCEED": break; case "FAILURE": break; case "FINISHED": break; default: break; - }*/ - - - if (input.taskChainCode.Trim().IsNullOrEmpty()) - { - return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); - List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - if (disTasks == null || disTasks.Count < 1) - { - Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); - } - if (disTasks?.Count > 0) - { - TaskExecuteUpInput taskExecuteUpInput = new() - { - disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), - EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); - } + + /*ConnectionConfigOptions opts = App.GetOptions(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index 9aefd605..2b42bb0c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -4,12 +4,14 @@ using DingTalk.Api.Request; using JNPF; using JNPF.Common.Extension; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json.Linq; using Tnb.Common.Extension; using Tnb.Common.Utils; using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -24,11 +26,14 @@ namespace Tnb.WarehouseMgr private readonly BackgroundService _agvHeartbeatMonitor; private static readonly Dictionary> _fetchStartedStausValue = new(); private readonly bool isFrontDoorBit = false; //是否到前门位 + private readonly IServiceProvider _sp; + private readonly BackgroundService _backgudSvc; - public ElevatorControlService() + public ElevatorControlService(IServiceProvider sp, BackgroundService bgSvc) { _elevatorCtlCfg = App.Configuration.Build(); - //_agvHeartbeatMonitor = agvHeartbeatMonitorService; + _sp = sp; + _backgudSvc = bgSvc; } /// @@ -402,5 +407,39 @@ namespace Tnb.WarehouseMgr } return isSuccefuly; } + + private List> ParallelWriteTagAsync(CloseElevatorInput input) + { + var tasks = new List>(input.devNames.Count()); + foreach (var devName in input.devNames) + { + tasks.Add(WriteTagAsync(devName, ElevatorConsts.AGVControl, input.value)); + } + return tasks; + } + + public async Task CloseElevatorControl(CloseElevatorInput input) + { + if (input.devNames == null || !input.devNames.Any()) + { + throw new ArgumentNullException(nameof(input.devNames)); + } + var tasks = ParallelWriteTagAsync(input); + await Task.WhenAll(tasks); + var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService; + if (timedTaskSvc != null) + { + if (input.flag.Equals("close", StringComparison.OrdinalIgnoreCase)) + { + _ = timedTaskSvc.CloseAgvHeartbeat(input.devNames); + } + else + { + _ = timedTaskSvc.OpenAgvHeartbeat(input.devNames); + } + } + } + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs index 1bc85611..5a78ace9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs @@ -6,7 +6,8 @@ namespace Tnb.WarehouseMgr.Print { private const uint IMAGE_BITMAP = 0; private const uint LR_LOADFROMFILE = 16; - private static readonly string dllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + private static readonly string winPPLBDllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + private static readonly string winPortDllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\WinPort.dll"); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, @@ -490,7 +491,7 @@ namespace Tnb.WarehouseMgr.Print /// 注:经测试,type=1E 手机不能识别;type=1 手机可识别; /// 这个 B_Prn_Barcode 函数可以列印出一个指定类型的条码 功能。 /// - [DllImport("Library\\x64\\Winpplb.dll")] + [DllImport($"Library\\x64\\Winpplb.dll")] public static extern int B_Prn_Barcode(int x, int y, int ori, string type, int narrow, int width, int height, char human, string data); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index b1717e98..cc9cdacc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using Aop.Api.Domain; using JNPF; using JNPF.Common.Extension; using JNPF.Common.Security; @@ -26,24 +27,24 @@ namespace Tnb.WarehouseMgr private IEventPublisher _eventPublisher = default!; private readonly ElevatorControlConfiguration _elevatorControlConfiguration = App.Configuration.Build(); private readonly IServiceProvider _serviceProvider; + private readonly IHostApplicationLifetime _lifeTime; + private static List s_heartbeatDevNames = new(); //private static Dictionary> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase); - public TimedTaskBackgroundService(IServiceProvider serviceProvider) + public TimedTaskBackgroundService() { - _serviceProvider = serviceProvider; } protected override Task ExecuteAsync(CancellationToken stoppingToken) { IsStarted = true; - + s_heartbeatDevNames = _elevatorControlConfiguration.HeartbeatDevNames; Task timedTask = Task.Run(() => { _eventPublisher = App.GetRequiredService(); - //电梯Agv心跳检测 _ = TimedTask(async token => { - foreach (var devName in _elevatorControlConfiguration.HeartbeatDevNames) + foreach (var devName in s_heartbeatDevNames) { Dictionary parameter = new() { @@ -56,7 +57,7 @@ namespace Tnb.WarehouseMgr await Console.Out.WriteLineAsync($"{devName.Match(@"\d+")}#梯, 心跳检测结果:{result}"); } }, stoppingToken, 30); - + }); return timedTask; } @@ -144,6 +145,18 @@ namespace Tnb.WarehouseMgr return delayTask; } + public Task CloseAgvHeartbeat(IEnumerable devNames) + { + s_heartbeatDevNames.RemoveAll(x => devNames.Contains(x)); + return Task.CompletedTask; + } + + public Task OpenAgvHeartbeat(IEnumerable devNames) + { + s_heartbeatDevNames.AddRange(devNames); + return Task.CompletedTask; + } + } /// /// 自定义任务调度器,保证长任务在单独的线程中运行 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index e90b85b1..3742747a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -161,7 +161,7 @@ namespace Tnb.WarehouseMgr List items = new(); try { - WmsInstockPolicies policy = await _db.Queryable().Where(it => it.status == 1).FirstAsync(); + WmsInstockPolicies policy = await _db.CopyNew().Queryable().Where(it => it.status == 1).FirstAsync(); if (policy == null) { throw new AppFriendlyException("没有可用的策略", 500); @@ -173,7 +173,7 @@ namespace Tnb.WarehouseMgr .And(it => it.is_type == ((int)EnumLocationType.存储库位).ToString()) .And(it => it.is_use == ((int)EnumCarryStatus.空闲).ToString()) .ToExpression(); - items = await _db.Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); + items = await _db.CopyNew().Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); } catch (Exception) { @@ -238,6 +238,7 @@ namespace Tnb.WarehouseMgr { //获取电梯数据 List elevatorList = await db.Queryable().InnerJoin((a, b) => a.id == b.bill_id) + .Where((a, b) => a.enabled == 1) .Select((a, b) => new WmsElevatorH { @@ -249,6 +250,7 @@ namespace Tnb.WarehouseMgr floor = b.floor }, true).ToListAsync(); + Logger.Information($"可用电梯信息:{elevatorList.Select(e => e.elevator_code)}"); //获取所有未下发的预任务申请 @@ -416,14 +418,14 @@ namespace Tnb.WarehouseMgr foreach (var at in agvDTTasks) { var ele = elevatorList.Find(x => x.location_code == at.endlocation_code); - Logger.Information($"ele.elevator_id={ele?.elevator_id}"); + Logger.Information($"ele.elevator_id:{ele?.elevator_id},elevator_code:{ele.elevator_code}"); if (ele != null) { at.device_id = ele.elevator_id; } } - List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = agvDTTasks + List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); if (endLocCodes?.Count > 0) { @@ -475,13 +477,13 @@ namespace Tnb.WarehouseMgr /// /// /// - private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes) + private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes) { Logger.Information($" 开始呼梯操作............."); Logger.Information($"电梯信息:{JsonConvert.SerializeObject(s_elevatorMap)}"); try { - foreach ((_, string devId, string disTaskId, string floorNO) in endLocCodes) + foreach ((_, string devId, string disTaskId, int floorNO) in endLocCodes) { Logger.Information($"devId:{devId}"); if (!s_elevatorMap.TryGetValue(devId, out object? elevatorCode)) @@ -597,7 +599,7 @@ namespace Tnb.WarehouseMgr } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); - int floor = await GetRealFloor(disTask.end_floor.ParseToInt()); + int floor = await GetRealFloor(disTask.end_floor); Logger.Information($"目标楼层:{floor}"); @@ -608,7 +610,7 @@ namespace Tnb.WarehouseMgr do { - tuple = await _elevatorControlService.GetElevatorStatus(devName,tags, CancellationToken.None); + tuple = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); await Task.Delay(1000); } while (tuple.sysStatus != 3 && tuple.runStatus != 0); @@ -986,27 +988,38 @@ namespace Tnb.WarehouseMgr { List roads = await _db.Queryable().Where(it => it.status == 1).ToListAsync(); List points = await LocPathCalcAlgorithms(pStartId, pEndId, roads); + Logger.Information($"points:{string.Join(",", points.Select(p => p.point_code))}"); try { - if (points.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) + if (points?.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) { + Logger.Information("包含电梯Agv任务"); //查询当前电梯点 - List curEleDs = await _db.Queryable().Where(it => points.Select(x => x.id).Contains(it.point_id)).ToListAsync(); + List curEleDs = await _db.Queryable().InnerJoin((a, b) => a.bill_id == b.id).Where((a, b) => points.Select(x => x.id).Contains(a.point_id)).ToListAsync(); + Logger.Information($"curEleDs==null :{curEleDs == null},curEleDs:{string.Join(",", curEleDs.Select(x => x.bill_id))}"); //如果有电梯点,则会进行电梯的均匀分配 if (curEleDs?.Count > 0) { //当前电梯 - WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id && it.enabled == 1); + WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id); + Logger.Information($"curEle==null :{curEle == null}"); + //同电梯组电梯 List sGpEle = await _db.Queryable().Where(it => it.elevator_group == curEle.elevator_group && it.id != curEle.id && it.enabled == 1).ToListAsync(); - - if (curEle == null && sGpEle?.Count > 0) + if (curEle.enabled == 0 && (sGpEle == null || sGpEle.Count < 1)) { throw new AppFriendlyException("电梯被禁用或未配置", 500); } - + if ((sGpEle == null || sGpEle.Count < 1) && curEle.enabled == 1) + { + return points; + } + if (sGpEle?.Count > 0 && curEle.enabled == 0) + { + return points; + } //判断电梯组中各电梯任务数 - if (curEle == null || sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) + if (sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) { List sGpDs = await _db.Queryable().Where(it => it.bill_id == sGpEle.First().id).ToListAsync(); if (sGpDs?.Count > 0) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs index 0127a490..a594fa26 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs @@ -31,6 +31,7 @@ namespace Tnb.WarehouseMgr preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID; _ = await _db.Updateable(preTask).UpdateColumns(it => it.status).ExecuteCommandAsync(); } + _ = await _db.Deleteable().Where(it => it.distask_id == id).ExecuteCommandAsync(); _ = await _db.Deleteable(disTask).ExecuteCommandAsync(); } diff --git a/apihost/Tnb.API.Entry/Startup.cs b/apihost/Tnb.API.Entry/Startup.cs index 049b470c..bc4afbe2 100644 --- a/apihost/Tnb.API.Entry/Startup.cs +++ b/apihost/Tnb.API.Entry/Startup.cs @@ -20,6 +20,7 @@ namespace JNPF.API.Entry; public class Startup : AppStartup { + //private TimedTaskBackgroundService timedTaskSvc = new(); public void ConfigureServices(IServiceCollection services) { // 注册和配置Mvc和api服务 @@ -48,7 +49,7 @@ public class Startup : AppStartup services.AddMemoryCache(); // 使用本地缓存必须添加 services.AddConfigurableOptions(); - services.AddSingleton( typeof(ISingleton), typeof(RedisData)); + services.AddSingleton(typeof(ISingleton), typeof(RedisData)); // 微信 services.AddSenparcGlobalServices(App.Configuration) // Senparc.CO2NET 全局注册 .AddSenparcWeixinServices(App.Configuration); // Senparc.Weixin 注册(如果使用Senparc.Weixin SDK则添加) @@ -56,15 +57,18 @@ public class Startup : AppStartup services.AddOverideVisualDev(); //定时任务 - services.AddHostedService(); - //services.AddHostedService(); + services.AddHostedService(); + services.AddSingleton(sp => new TimedTaskBackgroundService()); + //var bgSvc = App.GetRequiredService(); + //bgSvc.StartAsync(CancellationToken.None); + //services.AddHostedService(); } - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions senparcSetting, IOptions senparcWeixinSetting) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions senparcSetting, IOptions senparcWeixinSetting, IHostApplicationLifetime lifeTime) { // 添加状态码拦截中间件 app.UseUnifyResultStatusCodes(); @@ -113,5 +117,10 @@ public class Startup : AppStartup bool isStartTimeJob = App.GetConfig("IsStartTimeJob"); if (isStartTimeJob) serviceProvider.GetRequiredService().StartTimerJob(); + + + + + } } \ No newline at end of file diff --git a/taskschedule/Tnb.TaskScheduler/Listener/GenerateMaintainPlanTimeWorker.cs b/taskschedule/Tnb.TaskScheduler/Listener/GenerateMaintainPlanTimeWorker.cs index 192ca171..64fbc34b 100644 --- a/taskschedule/Tnb.TaskScheduler/Listener/GenerateMaintainPlanTimeWorker.cs +++ b/taskschedule/Tnb.TaskScheduler/Listener/GenerateMaintainPlanTimeWorker.cs @@ -1,5 +1,8 @@ using JNPF.Common.Security; using JNPF.Logging; +using JNPF.Message; +using JNPF.Message.Interfaces.Message; +using JNPF.Message.Service; using SqlSugar; using Tnb.EquipMgr.Entities; @@ -15,7 +18,7 @@ namespace JNPF.TaskScheduler.Listener // { // _repository = repository; // } - + private IMessageService _sendMessageService => App.GetService(); [SpareTime("0 0 0 * * ?", "生成设备保养计划", ExecuteType = SpareTimeExecuteTypes.Serial, StartNow = false)] public async void GenerateSpotInspectionPlan(SpareTimer timer, long count) { @@ -171,6 +174,24 @@ namespace JNPF.TaskScheduler.Listener Console.WriteLine(dbResult.ErrorMessage); Log.Error(dbResult.ErrorMessage); } + else + { + List equipments = await db.Queryable().Where(x => x.life == Tnb.EquipMgr.EquipmentLife.ENABLE).ToListAsync(); + foreach (var item in tobeCreateList) + { + try + { + if (equipments.FirstOrDefault(x => x.id == item.equip_id) == null) + continue; + var users = new List() { item.execute_user_id }; + var title = equipments.FirstOrDefault(x => x.id == item.equip_id).code + "设备保养提醒"; + await _sendMessageService.SentMessage(users, title, title); + } + catch (Exception) + { + } + } + } Log.Information($"---------------生成{tobeCreateList.Count}个计划---------------"); } } diff --git a/taskschedule/Tnb.TaskScheduler/Listener/GenerateSpotInspectionPlanTimeWorker.cs b/taskschedule/Tnb.TaskScheduler/Listener/GenerateSpotInspectionPlanTimeWorker.cs index 14889bf3..a473253d 100644 --- a/taskschedule/Tnb.TaskScheduler/Listener/GenerateSpotInspectionPlanTimeWorker.cs +++ b/taskschedule/Tnb.TaskScheduler/Listener/GenerateSpotInspectionPlanTimeWorker.cs @@ -1,5 +1,6 @@ using JNPF.Common.Security; using JNPF.Logging; +using JNPF.Message.Interfaces.Message; using SqlSugar; using Tnb.EquipMgr.Entities; @@ -15,7 +16,7 @@ namespace JNPF.TaskScheduler.Listener // { // _repository = repository; // } - + private IMessageService _sendMessageService => App.GetService(); [SpareTime("0 0,30 * * * ?", "生成点巡检计划", ExecuteType = SpareTimeExecuteTypes.Serial, StartNow = false)] public async void GenerateSpotInspectionPlan(SpareTimer timer, long count) { @@ -172,6 +173,24 @@ namespace JNPF.TaskScheduler.Listener Console.WriteLine(dbResult.ErrorMessage); Log.Error(dbResult.ErrorMessage); } + else + { + List equipments = await db.Queryable().Where(x => x.life == Tnb.EquipMgr.EquipmentLife.ENABLE).ToListAsync(); + foreach (var item in tobeCreateList) + { + try + { + if (equipments.FirstOrDefault(x => x.id == item.equip_id) == null) + continue; + var users = new List() { item.spot_record_user_id }; + var title = equipments.FirstOrDefault(x => x.id == item.equip_id).code + "设备点巡检提醒"; + await _sendMessageService.SentMessage(users, title, title); + } + catch (Exception) + { + } + } + } Log.Information($"---------------生成{tobeCreateList.Count}个计划---------------"); } }