821 lines
41 KiB
C#
821 lines
41 KiB
C#
|
|
using APT.BaseData.Domain.ApiModel;
|
|||
|
|
using APT.BaseData.Domain.Entities;
|
|||
|
|
using APT.BaseData.Domain.Entities.FM;
|
|||
|
|
using APT.BaseData.Domain.Enums;
|
|||
|
|
using APT.BaseData.Domain.Enums.PF;
|
|||
|
|
using APT.BaseData.Domain.IServices.FM;
|
|||
|
|
using APT.Infrastructure.Core;
|
|||
|
|
using APT.MS.Domain.Entities.DM;
|
|||
|
|
using APT.MS.Domain.Entities.SC.DM;
|
|||
|
|
using APT.MS.Domain.Entities.SC.PT;
|
|||
|
|
using APT.MS.Domain.Enums;
|
|||
|
|
using APT.Utility;
|
|||
|
|
using APT.WebApi.Models;
|
|||
|
|
using Microsoft.AspNetCore.Mvc;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
namespace APT.PP.WebApi.Controllers.Api.PP
|
|||
|
|
{
|
|||
|
|
[Route("api/PP/DM")]
|
|||
|
|
[TypeFilter(typeof(CustomActionFilterAttribute))]
|
|||
|
|
public partial class DMController : AuthorizeApiController<T_DM_DEVICE_MAINTENANCE_PLAN>
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
IFMNotificationTaskService NotificationTaskService { get; set; }
|
|||
|
|
IFMUserService UserService { get; set; }
|
|||
|
|
IPFSysLogService SysLogService { get; set; }
|
|||
|
|
IFMSyncLogDetailService SyncLogDetailService { get; set; }
|
|||
|
|
public DMController(IFMNotificationTaskService notificationTaskService, IPFSysLogService sysLogService, IFMUserService userService, IFMSyncLogDetailService syncLogDetailService)
|
|||
|
|
{
|
|||
|
|
NotificationTaskService = notificationTaskService;
|
|||
|
|
SysLogService = sysLogService;
|
|||
|
|
UserService = userService;
|
|||
|
|
SyncLogDetailService = syncLogDetailService;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 判断跑批时间是否符合
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="RUNSETTIME"></param>
|
|||
|
|
/// <param name="dtNow"></param>
|
|||
|
|
/// <param name="minAdvance"></param>
|
|||
|
|
/// <param name="minLaster"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private bool ISTimeOK(DateTime? RUNSETTIME, DateTime dtNow, int minAdvance, int minLaster)
|
|||
|
|
{
|
|||
|
|
if (RUNSETTIME == null)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (RUNSETTIME != null)
|
|||
|
|
{
|
|||
|
|
if (minAdvance != 0 || minLaster != 0)
|
|||
|
|
{
|
|||
|
|
DateTime dtSetTime = Convert.ToDateTime(dtNow.ToString("yyyy-MM-dd") + RUNSETTIME.Value.ToString(" HH:mm:ss"));
|
|||
|
|
if (minAdvance > 0 && minLaster > 0)
|
|||
|
|
{
|
|||
|
|
if (dtNow.AddMinutes(-1 * minAdvance) <= dtSetTime && dtSetTime <= dtNow.AddMinutes(minLaster))
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (minAdvance > 0)
|
|||
|
|
{
|
|||
|
|
if (dtNow.AddMinutes(-1 * minAdvance) <= dtSetTime && dtSetTime <= dtNow)
|
|||
|
|
{
|
|||
|
|
//如果设置时间小于当前时间 并且 设置使劲按大于 当前时间大于当前时间往前偏移分钟数
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (dtNow <= dtSetTime && dtSetTime <= dtNow.AddMinutes(minLaster))
|
|||
|
|
{
|
|||
|
|
//如果 设置时间大于当前时间 并且设置时间小于当前时间往后偏移分钟数
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (RUNSETTIME.Value.ToString("HH:mm") == dtNow.ToString("HH:mm"))
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 机电管理 每天触发
|
|||
|
|
/// 数据逻辑自己控制
|
|||
|
|
/// 如果要写入此方法 每个人的代码用代码块包起来 以免冲突
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="filter"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("DailyRun")]
|
|||
|
|
public JsonActionResult<bool> DailyRun([FromBody] KeywordFilter filter)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<bool>(() =>
|
|||
|
|
{
|
|||
|
|
DateTime dtNow = DateTime.Now;
|
|||
|
|
if (!string.IsNullOrEmpty(filter.Parameter1))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
dtNow = Convert.ToDateTime(filter.Parameter1);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
dtNow = DateTime.Now;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool isCheck = true;//点检 巡检
|
|||
|
|
bool isPlan = true; //设备维保
|
|||
|
|
int min = 5;//按设置时间 可以提前5分钟执行跑批生成代办任务
|
|||
|
|
|
|||
|
|
#region wyw 维保计划录入
|
|||
|
|
|
|||
|
|
var listDMPlan = GetEntities<T_DM_DEVICE_MAINTENANCE_PLAN>(e => e.PLANCHECKFREQUENCY != BSPLANCHECKFREQUENCYEnum.None && e.DEVICEBASE_ID.HasValue && e.ENABLE_STATUS == FMEnableStatusEnum.启用 && e.STATUS_APPROVE == PFStandardStatus.Archived && !e.IS_DELETED, null, "Nav_ListUser.Nav_User");
|
|||
|
|
|
|||
|
|
List<T_DM_DEVICE_MAINTENANCE_PLAN> listPlan = new List<T_DM_DEVICE_MAINTENANCE_PLAN>();
|
|||
|
|
if (listDMPlan != null && listDMPlan.Any())
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
foreach (var item in listDMPlan)
|
|||
|
|
{
|
|||
|
|
if (ISTimeOK(item.RUNSETTIME, dtNow, min, min))//设置时间往前后各偏移 5 分钟 判断跑批
|
|||
|
|
{
|
|||
|
|
switch (item.PLANCHECKFREQUENCY)
|
|||
|
|
{
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.None:
|
|||
|
|
break;
|
|||
|
|
//case BSPLANCHECKFREQUENCYEnum.OneTime:
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Year:
|
|||
|
|
if (!string.IsNullOrEmpty(item.RUNDATA))//05-01,10-01
|
|||
|
|
{
|
|||
|
|
List<string> listMMdd = item.RUNDATA.Split(",").ToList();
|
|||
|
|
if (item.RUNDATA.Contains("-"))
|
|||
|
|
{
|
|||
|
|
for (int j = 0; j < listMMdd.Count; j++)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(listMMdd[j]) && (listMMdd[j] == dtNow.ToString("MM-dd") || listMMdd[j] == dtNow.ToString("M-d")))
|
|||
|
|
{
|
|||
|
|
listPlan.Add(item);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch { }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (item.RUNDATA.Contains("/"))
|
|||
|
|
{
|
|||
|
|
for (int j = 0; j < listMMdd.Count; j++)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(listMMdd[j]) && (listMMdd[j] == dtNow.ToString("MM/dd") || listMMdd[j] == dtNow.ToString("M/d")))
|
|||
|
|
{
|
|||
|
|
listPlan.Add(item);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch { }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Date:
|
|||
|
|
listPlan.Add(item);
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Week:
|
|||
|
|
if (item.WEEKDATA != null && (int)dtNow.DayOfWeek == (int)item.WEEKDATA.Value)
|
|||
|
|
{
|
|||
|
|
//星期匹配 DateTime.Now.DayOfWeek Thursday (int)DateTime.Now.DayOfWeek 4
|
|||
|
|
listPlan.Add(item);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Month:
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Quarter:
|
|||
|
|
if (item.DATA != null && item.DATA.Value == dtNow.Day)
|
|||
|
|
{
|
|||
|
|
listPlan.Add(item); //日匹配 (季度是季度第一月的某日 刚好也符合)
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
DateTime dtNowEdit = DateTime.Now;
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (listPlan.Count < 1)
|
|||
|
|
{
|
|||
|
|
isPlan = false;
|
|||
|
|
}
|
|||
|
|
var listPlanID = listPlan.Select(e => e.ID);
|
|||
|
|
var listDateCheck = GetEntities<T_DM_DEVICE_MAINTENANCE_CHECK_DETAIL>(e => e.CREATE_TIME.Value.Date == dtNowEdit.Date && listPlanID.Contains(e.ID), null, null);
|
|||
|
|
if (listDateCheck != null && listDateCheck.Any())
|
|||
|
|
{
|
|||
|
|
for (int i = listPlan.Count(); i > -1; i--)
|
|||
|
|
{
|
|||
|
|
var checkDate = listDateCheck.FirstOrDefault(e => e.ID == listPlan[i].ID);
|
|||
|
|
if (checkDate != null)
|
|||
|
|
{
|
|||
|
|
listPlan.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (listPlan.Count < 1)
|
|||
|
|
{
|
|||
|
|
isPlan = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 点检 巡检
|
|||
|
|
|
|||
|
|
List<T_DM_DEVICE_BASE> listDeviceBase = null; //点检 巡检 结果
|
|||
|
|
var listDeviceBaseT = GetEntities<T_DM_DEVICE_BASE>(e => !e.IS_DELETED && e.Nav_ListCheck != null && e.Nav_ListCheck.Any(), null, "Nav_ListCheck.Nav_ListUser.Nav_User");//&& e.QTY > 0
|
|||
|
|
if (listDeviceBaseT == null || !listDeviceBaseT.Any())
|
|||
|
|
{
|
|||
|
|
isCheck = false;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
//今天
|
|||
|
|
var ListDetail = GetEntities<T_DM_DEVICE_CHECK_DETAIL>(e => e.CREATE_TIME.HasValue && e.CREATE_TIME.Value.Date == dtNowEdit.Date, null, null);//listBaseCheckID.Contains(e.BASECHECK_ID) &&
|
|||
|
|
|
|||
|
|
listDeviceBase = listDeviceBaseT.ToList();
|
|||
|
|
List<T_DM_DEVICE_BASE_CHECK> listBaseCheck = null;
|
|||
|
|
foreach (var item in listDeviceBaseT)
|
|||
|
|
{
|
|||
|
|
var listBaseCheckT = item.Nav_ListCheck;
|
|||
|
|
if (listBaseCheckT != null && listBaseCheckT.Any())
|
|||
|
|
{
|
|||
|
|
listBaseCheck = listBaseCheckT.ToList();
|
|||
|
|
for (int i = listBaseCheck.Count - 1; i > -1; i--)
|
|||
|
|
{
|
|||
|
|
if (listBaseCheck[i].IS_DELETED)
|
|||
|
|
{
|
|||
|
|
listBaseCheck.RemoveAt(i);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (ListDetail != null && ListDetail.Any())
|
|||
|
|
{
|
|||
|
|
//var detail = ListDetail.FirstOrDefault(e => e.BASECHECK_ID == listBaseCheck[i].ID);
|
|||
|
|
var detail = ListDetail.FirstOrDefault(e => e.BASECHECK_ID == listBaseCheck[i].ID);
|
|||
|
|
if (detail != null)
|
|||
|
|
{
|
|||
|
|
listBaseCheck.RemoveAt(i);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (ISTimeOK(listBaseCheck[i].CHECKTIME, dtNow, min, min))//设置时间往前后各偏移 5 分钟 判断跑批
|
|||
|
|
{
|
|||
|
|
switch (listBaseCheck[i].PLANCHECKFREQUENCY)
|
|||
|
|
{
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.None:
|
|||
|
|
break;
|
|||
|
|
//TODO 0525
|
|||
|
|
//case BSPLANCHECKFREQUENCYEnum.OneTime:
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Year:
|
|||
|
|
if (!string.IsNullOrEmpty(listBaseCheck[i].RUNDATA))//05-01,10-01
|
|||
|
|
{
|
|||
|
|
List<string> listMMdd = listBaseCheck[i].RUNDATA.Split(",").ToList();
|
|||
|
|
if (!listMMdd.Contains(dtNow.ToString("MM-dd")) && !listMMdd.Contains(dtNow.ToString("M-d")) && !listMMdd.Contains(dtNow.ToString("MM/dd")) && !listMMdd.Contains(dtNow.ToString("M/d")))
|
|||
|
|
{
|
|||
|
|
listBaseCheck.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Date:
|
|||
|
|
//listPlan.Add(listBaseCheck[i]);
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Week:
|
|||
|
|
if (listBaseCheck[i].WEEKDATA == null || (int)dtNow.DayOfWeek != (int)listBaseCheck[i].WEEKDATA.Value)
|
|||
|
|
{
|
|||
|
|
listBaseCheck.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Month:
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Quarter:
|
|||
|
|
if (listBaseCheck[i].DATA == null || listBaseCheck[i].DATA.Value != dtNow.Day)
|
|||
|
|
{
|
|||
|
|
listBaseCheck.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
listBaseCheck.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
item.Nav_ListCheck = listBaseCheck;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = listDeviceBase.Count - 1; i > -1; i--)
|
|||
|
|
{
|
|||
|
|
if (listDeviceBase[i].Nav_ListCheck == null || listDeviceBase[i].Nav_ListCheck.Count() == 0)
|
|||
|
|
{
|
|||
|
|
listDeviceBase.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (listDeviceBase == null || listDeviceBase.Count < 1)
|
|||
|
|
{
|
|||
|
|
isCheck = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
if (!isPlan && !isCheck)//没有 维保计划 和点检、巡检
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
List<T_DM_DEVICE_MAINTENANCE_CHECK> listCheck = new List<T_DM_DEVICE_MAINTENANCE_CHECK>();
|
|||
|
|
List<T_DM_DEVICE_MAINTENANCE_CHECK_USER> listCheckUser = new List<T_DM_DEVICE_MAINTENANCE_CHECK_USER>();
|
|||
|
|
List<T_DM_DEVICE_MAINTENANCE_CHECK_USER> listCheckUserTemp = null;
|
|||
|
|
List<T_DM_DEVICE_MAINTENANCE_CHECK_DETAIL> listCheckDetail = new List<T_DM_DEVICE_MAINTENANCE_CHECK_DETAIL>();
|
|||
|
|
List<T_FM_NOTIFICATION_TASK> listTaskMaintCheck = new List<T_FM_NOTIFICATION_TASK>();
|
|||
|
|
|
|||
|
|
var listBaseID = listPlan.Select(e => e.DEVICEBASE_ID.Value);
|
|||
|
|
|
|||
|
|
var listBase = GetEntities<T_DM_DEVICE_BASE>(e => listBaseID.Contains(e.ID), null, "Nav_ListCheck.Nav_ListUser.Nav_User", "Nav_User");
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (listBase == null || !listBase.Any())
|
|||
|
|
{
|
|||
|
|
isPlan = false;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
foreach (var item in listPlan)
|
|||
|
|
{
|
|||
|
|
var DeviceBase = listBase.FirstOrDefault(e => e.ID == item.DEVICEBASE_ID.Value);
|
|||
|
|
if (DeviceBase != null)
|
|||
|
|
item.Nav_DeviceBase = DeviceBase;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (isPlan)//维保计划
|
|||
|
|
{
|
|||
|
|
Guid CheckID = Guid.Empty;
|
|||
|
|
Guid UserID = Guid.Empty;
|
|||
|
|
string UserName = string.Empty;
|
|||
|
|
bool isHave = false;
|
|||
|
|
for (int i = 0; i < listPlan.Count; i++)
|
|||
|
|
{
|
|||
|
|
//所有 维保 计划 如果维保人员 维保设备负责人 完全一致 合并单
|
|||
|
|
foreach (var item in listCheck)
|
|||
|
|
{
|
|||
|
|
if (item.Nav_ListUser.Count() == listPlan[i].Nav_ListUser.Count() && listPlan[i].Nav_DeviceBase != null && item.USER_ID == listPlan[i].Nav_DeviceBase.USER_ID)
|
|||
|
|
{
|
|||
|
|
isHave = true;
|
|||
|
|
//查找 维保人员 如果一致
|
|||
|
|
foreach (var itemUser in item.Nav_ListUser)
|
|||
|
|
{
|
|||
|
|
var userCheck = listPlan[i].Nav_ListUser.FirstOrDefault(e => e.USER_ID == itemUser.USER_ID && e.ISMAIN == itemUser.ISMAIN);
|
|||
|
|
if (userCheck == null)
|
|||
|
|
{
|
|||
|
|
//没找到
|
|||
|
|
isHave = false;
|
|||
|
|
CheckID = Guid.Empty;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!isHave)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CheckID = item.ID;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//如果 没有找到之前 一致的 维保ID
|
|||
|
|
if (CheckID == Guid.Empty)
|
|||
|
|
{
|
|||
|
|
CheckID = Guid.NewGuid();
|
|||
|
|
|
|||
|
|
listCheck.Add(new T_DM_DEVICE_MAINTENANCE_CHECK()
|
|||
|
|
{
|
|||
|
|
ID = CheckID,
|
|||
|
|
CODE = "WB" + dtNowEdit.ToString("yyyyMMddHHmmss"),
|
|||
|
|
NAME = "设备设施维保" + dtNowEdit.ToString("MMdd"),
|
|||
|
|
CHECKDATETIME = dtNowEdit,
|
|||
|
|
STATUS_APPROVE = PFStandardStatus.Draft,
|
|||
|
|
//APPROVE_ID = ,
|
|||
|
|
IS_DELETED = false,
|
|||
|
|
ORG_ID = listPlan[i].ORG_ID,
|
|||
|
|
//ENTITY_ORG_TPYE = ,
|
|||
|
|
//FORM_ID = ,
|
|||
|
|
//FLOW_STATUS = ,
|
|||
|
|
//FLOW_SEND_STATUS = ,
|
|||
|
|
//FLOW_ID = ,
|
|||
|
|
CREATE_TIME = dtNowEdit,
|
|||
|
|
MODIFY_TIME = dtNowEdit,
|
|||
|
|
//CREATER_ID = ,
|
|||
|
|
//MODIFIER_ID = ,
|
|||
|
|
USER_ID = listPlan[i].Nav_DeviceBase.USER_ID
|
|||
|
|
});
|
|||
|
|
listCheckUserTemp = new List<T_DM_DEVICE_MAINTENANCE_CHECK_USER>();
|
|||
|
|
foreach (var item in listPlan[i].Nav_ListUser)
|
|||
|
|
{
|
|||
|
|
if (item.ISMAIN)
|
|||
|
|
{
|
|||
|
|
UserID = item.USER_ID;
|
|||
|
|
UserName = item.Nav_User.NAME;
|
|||
|
|
}
|
|||
|
|
listCheckUserTemp.Add(new T_DM_DEVICE_MAINTENANCE_CHECK_USER()
|
|||
|
|
{
|
|||
|
|
ID = Guid.NewGuid(),
|
|||
|
|
CHECK_ID = CheckID,
|
|||
|
|
USER_ID = item.USER_ID,
|
|||
|
|
ISMAIN = item.ISMAIN,
|
|||
|
|
ISCHECK = item.ISMAIN,
|
|||
|
|
//CHECKTIME = ,
|
|||
|
|
IS_DELETED = false,
|
|||
|
|
ORG_ID = item.ORG_ID,
|
|||
|
|
//ENTITY_ORG_TPYE = ,
|
|||
|
|
//FORM_ID = ,
|
|||
|
|
//FLOW_STATUS = ,
|
|||
|
|
//FLOW_SEND_STATUS = ,
|
|||
|
|
//FLOW_ID = ,
|
|||
|
|
CREATE_TIME = dtNowEdit,
|
|||
|
|
MODIFY_TIME = dtNowEdit,
|
|||
|
|
//CREATER_ID = ,
|
|||
|
|
//MODIFIER_ID = ,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//维保人员赋值 容易查找
|
|||
|
|
listCheck[listCheck.Count - 1].Nav_ListUser = listCheckUserTemp;
|
|||
|
|
listCheckUser.AddRange(listCheckUserTemp);
|
|||
|
|
|
|||
|
|
//待办
|
|||
|
|
listTaskMaintCheck.Add(NotificationTaskService.InsertUserNoticeTaskModel("设备设施维保", CheckID, listCheck[0].ORG_ID, UserID, UserName, dtNowEdit, dtNowEdit.AddDays(1), 1, "DM030"));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//检查明细
|
|||
|
|
listCheckDetail.Add(new T_DM_DEVICE_MAINTENANCE_CHECK_DETAIL()
|
|||
|
|
{
|
|||
|
|
ID = Guid.NewGuid(),
|
|||
|
|
PLANID = listPlan[i].ID,
|
|||
|
|
CHECK_ID = CheckID,
|
|||
|
|
DEVICEBASE_ID = listPlan[i].DEVICEBASE_ID,
|
|||
|
|
MACHINE_NAME = listPlan[i].MACHINE_NAME,
|
|||
|
|
SPEC = listPlan[i].SPEC,
|
|||
|
|
COUNT = listPlan[i].COUNT,
|
|||
|
|
POSITION = listPlan[i].POSITION,
|
|||
|
|
CONTENT = listPlan[i].CONTENT,
|
|||
|
|
//Result = ,
|
|||
|
|
IS_DELETED = false,
|
|||
|
|
ORG_ID = listPlan[i].ORG_ID,
|
|||
|
|
//ENTITY_ORG_TPYE = ,
|
|||
|
|
//FORM_ID = ,
|
|||
|
|
//FLOW_STATUS = ,
|
|||
|
|
//FLOW_SEND_STATUS = ,
|
|||
|
|
//FLOW_ID = ,
|
|||
|
|
CREATE_TIME = dtNowEdit,
|
|||
|
|
MODIFY_TIME = dtNowEdit,
|
|||
|
|
//CREATER_ID = ,
|
|||
|
|
//MODIFIER_ID = ,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//符合 条件的 计划 做设备点检、巡检
|
|||
|
|
//var listBaseID = listPlan.Select(e => e.DEVICEBASE_ID.Value);
|
|||
|
|
|
|||
|
|
//var listBase = GetEntities<T_DM_DEVICE_BASE>(e => listBaseID.Contains(e.ID), null, "Nav_ListCheck.Nav_ListUser.Nav_User");
|
|||
|
|
//if (listBase == null || !listBase.Any())
|
|||
|
|
//{
|
|||
|
|
// return true;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//给 符合条件的 计划 对应 设备设施库 中 点检、巡检 发送 点检 巡检 待办 给 第一个 巡检人员
|
|||
|
|
|
|||
|
|
List<T_DM_DEVICE_CHECK> listCheckSend = new List<T_DM_DEVICE_CHECK>();
|
|||
|
|
List<T_DM_DEVICE_CHECK_DETAIL> listCheckDetailSend = new List<T_DM_DEVICE_CHECK_DETAIL>();
|
|||
|
|
List<T_DM_DEVICE_CHECK_USER> listCheckUserSend = new List<T_DM_DEVICE_CHECK_USER>();
|
|||
|
|
List<T_FM_NOTIFICATION_TASK> listTask = new List<T_FM_NOTIFICATION_TASK>();
|
|||
|
|
|
|||
|
|
if (isCheck)//点检 巡检
|
|||
|
|
{
|
|||
|
|
int RowIndex = 1;
|
|||
|
|
Guid UserId = Guid.Empty;
|
|||
|
|
Guid CheckId = Guid.Empty;
|
|||
|
|
string userName = String.Empty;
|
|||
|
|
T_DM_DEVICE_BASE_CHECK_USER UserMain = null;
|
|||
|
|
T_DM_DEVICE_CHECK_DETAIL CheckDetail = null;
|
|||
|
|
CheckType? lastCheckType = null;
|
|||
|
|
foreach (var item in listDeviceBase)// listBase
|
|||
|
|
{
|
|||
|
|
if (item.Nav_ListCheck == null || !item.Nav_ListCheck.Any())
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//var listCheckCircle = item.Nav_ListCheck.Where(e => e.Nav_ListUser != null && e.Nav_ListUser.Any() && e.CHECKTYPE == CheckType.CheckCircuit);
|
|||
|
|
//var listCheck = item.Nav_ListCheck.Where(e => e.Nav_ListUser != null && e.Nav_ListUser.Any() && e.CHECKTYPE == CheckType.Check);
|
|||
|
|
|
|||
|
|
var listCheckBase = item.Nav_ListCheck.Where(e => e.Nav_ListUser != null && e.Nav_ListUser.Any()).OrderBy(e => e.CHECKTYPE);
|
|||
|
|
|
|||
|
|
if (listCheckBase != null && listCheckBase.Any())
|
|||
|
|
{
|
|||
|
|
RowIndex = 1;
|
|||
|
|
//巡检单
|
|||
|
|
foreach (var itemDetail in listCheckBase)
|
|||
|
|
{
|
|||
|
|
//检查人员
|
|||
|
|
UserMain = itemDetail.Nav_ListUser.FirstOrDefault(e => e.ISMAIN);
|
|||
|
|
|
|||
|
|
if (UserId == Guid.Empty || UserMain.USER_ID != UserId || (lastCheckType != null && lastCheckType != itemDetail.CHECKTYPE))
|
|||
|
|
{
|
|||
|
|
UserId = UserMain.USER_ID;
|
|||
|
|
userName = UserMain.Nav_User.NAME;
|
|||
|
|
|
|||
|
|
T_DM_DEVICE_CHECK checkCircle = new T_DM_DEVICE_CHECK();
|
|||
|
|
|
|||
|
|
#region 点检 巡检 单
|
|||
|
|
|
|||
|
|
checkCircle.ID = Guid.NewGuid();
|
|||
|
|
checkCircle.DEVICEBASE_ID = item.ID;
|
|||
|
|
checkCircle.CHECKTYPE = itemDetail.CHECKTYPE;
|
|||
|
|
|
|||
|
|
//checkCircle.PLANID = listPlan.Find(e => e.DEVICEBASE_ID == item.ID).ID;// null;
|
|||
|
|
checkCircle.CODE = dtNowEdit.ToString("yyyyMMddHHmmss") + RowIndex.ToString();
|
|||
|
|
checkCircle.NAME = (itemDetail.CHECKTYPE == CheckType.Check ? "点检" : "巡检") + dtNowEdit.ToString("MMdd");
|
|||
|
|
|
|||
|
|
checkCircle.RECORD_DATE = dtNowEdit;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//checkCircle.START_TIME = ;
|
|||
|
|
//checkCircle.END_TIME = ;
|
|||
|
|
//checkCircle.TEAM_NAME = ;
|
|||
|
|
//checkCircle.TEAM_ID = ;
|
|||
|
|
//checkCircle.SCHEDULIN_ID = ;
|
|||
|
|
|
|||
|
|
checkCircle.MACHINE_NAME = item.NAME;
|
|||
|
|
checkCircle.SPEC = item.SPEC;
|
|||
|
|
checkCircle.MACHINE_CODE = item.CODE;
|
|||
|
|
checkCircle.POSITION_NAME = item.POSITION;
|
|||
|
|
checkCircle.STATUS = PFStandardStatus.Draft;
|
|||
|
|
checkCircle.IS_DELETED = false;
|
|||
|
|
checkCircle.ORG_ID = item.ORG_ID;
|
|||
|
|
//checkCircle.ENTITY_ORG_TPYE = ;
|
|||
|
|
//checkCircle.FORM_ID = ;
|
|||
|
|
//checkCircle.FLOW_STATUS = ;
|
|||
|
|
//checkCircle.FLOW_SEND_STATUS = ;
|
|||
|
|
//checkCircle.FLOW_ID = ;
|
|||
|
|
checkCircle.CREATE_TIME = dtNowEdit;
|
|||
|
|
checkCircle.MODIFY_TIME = dtNowEdit;
|
|||
|
|
//checkCircle.CREATER_ID = ;
|
|||
|
|
//checkCircle.MODIFIER_ID = ;
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
CheckId = checkCircle.ID;
|
|||
|
|
listCheckSend.Add(checkCircle);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//添加待办
|
|||
|
|
listTask.Add(NotificationTaskService.InsertUserNoticeTaskModel("设备设施" + (itemDetail.CHECKTYPE == CheckType.Check ? "点检" : "巡检"), checkCircle.ID, checkCircle.ORG_ID, UserId, userName, dtNowEdit, dtNowEdit.AddDays(1), 1, (itemDetail.CHECKTYPE == CheckType.Check ? "DM010" : "DM032")));
|
|||
|
|
|
|||
|
|
#region 检查明细 检查人员
|
|||
|
|
|
|||
|
|
foreach (var itemDetailUser in itemDetail.Nav_ListUser)
|
|||
|
|
{
|
|||
|
|
listCheckUserSend.Add(new T_DM_DEVICE_CHECK_USER()
|
|||
|
|
{
|
|||
|
|
ID = Guid.NewGuid(),
|
|||
|
|
CHECK_ID = CheckId,// CheckDetail.ID,
|
|||
|
|
USER_ID = itemDetailUser.USER_ID,
|
|||
|
|
ISMAIN = itemDetailUser.ISMAIN,
|
|||
|
|
ISCHECK = itemDetailUser.ISMAIN ? true : false,//记录人 默认 确认过
|
|||
|
|
IS_DELETED = false,
|
|||
|
|
ORG_ID = itemDetailUser.ORG_ID,
|
|||
|
|
//ENTITY_ORG_TPYE = ,
|
|||
|
|
//FORM_ID = ,
|
|||
|
|
//FLOW_STATUS = ,
|
|||
|
|
//FLOW_SEND_STATUS = ,
|
|||
|
|
//FLOW_ID = ,
|
|||
|
|
CREATE_TIME = dtNowEdit,
|
|||
|
|
MODIFY_TIME = dtNowEdit,
|
|||
|
|
//CREATER_ID = ,
|
|||
|
|
//MODIFIER_ID = ,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region 点检、巡检 检查明细
|
|||
|
|
|
|||
|
|
CheckDetail = new T_DM_DEVICE_CHECK_DETAIL()
|
|||
|
|
{
|
|||
|
|
ID = Guid.NewGuid(),
|
|||
|
|
DEVICE_CHECK_ID = CheckId,
|
|||
|
|
ROW_NO = RowIndex,
|
|||
|
|
DEVICEBASE_ID = item.ID,
|
|||
|
|
ITEM1 = itemDetail.ITEM1,
|
|||
|
|
ITEM2 = itemDetail.ITEM2,
|
|||
|
|
ITEM3 = itemDetail.ITEM3,
|
|||
|
|
//CHECK_VALUE = ,
|
|||
|
|
////DESCRIPTION = ,
|
|||
|
|
IS_DELETED = false,
|
|||
|
|
ORG_ID = itemDetail.ORG_ID,
|
|||
|
|
//ENTITY_ORG_TPYE = ,
|
|||
|
|
//FORM_ID = ,
|
|||
|
|
//FLOW_STATUS = ,
|
|||
|
|
//FLOW_SEND_STATUS = ,
|
|||
|
|
//FLOW_ID = ,
|
|||
|
|
CREATE_TIME = dtNowEdit,
|
|||
|
|
MODIFY_TIME = dtNowEdit,
|
|||
|
|
//CREATER_ID = ,
|
|||
|
|
//MODIFIER_ID = ,
|
|||
|
|
BASECHECK_ID = itemDetail.ID,
|
|||
|
|
};
|
|||
|
|
listCheckDetailSend.Add(CheckDetail);
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
RowIndex++;
|
|||
|
|
lastCheckType = itemDetail.CHECKTYPE;//检查类型赋值
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region 跑批信息修改
|
|||
|
|
|
|||
|
|
T_FM_SYNC_TASK task = null;
|
|||
|
|
task = GetEntity<T_FM_SYNC_TASK>(filter.Keyword);
|
|||
|
|
if (task != null)
|
|||
|
|
{
|
|||
|
|
task.UPDATE_SUCCES_TIME = DateTime.Now;//上次同步结束时间
|
|||
|
|
task.SYNC_PARAM = "";//清空参数
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
this.UnifiedCommit(() =>
|
|||
|
|
{
|
|||
|
|
if (task != null)
|
|||
|
|
UpdateEntityNoCommit(task);//跑批信息
|
|||
|
|
|
|||
|
|
//点检 巡检
|
|||
|
|
if (listCheckSend != null && listCheckSend.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listCheckSend);
|
|||
|
|
if (listCheckDetailSend != null && listCheckDetailSend.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listCheckDetailSend);
|
|||
|
|
if (listCheckUserSend != null && listCheckUserSend.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listCheckUserSend);
|
|||
|
|
if (listTask != null && listTask.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listTask);
|
|||
|
|
|
|||
|
|
//维保
|
|||
|
|
if (listCheckUser != null && listCheckUser.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listCheckUser);
|
|||
|
|
if (listCheck != null && listCheck.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listCheck);
|
|||
|
|
if (listCheckDetail != null && listCheckDetail.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listCheckDetail);
|
|||
|
|
if (listTaskMaintCheck != null && listTaskMaintCheck.Any())
|
|||
|
|
BantchSaveEntityNoCommit(listTaskMaintCheck);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
int Count = ((listCheckSend != null && listCheckSend.Any()) ? listCheckSend.Count : 0) + ((listCheckDetailSend != null && listCheckDetailSend.Any()) ? listCheckDetailSend.Count : 0) + ((listCheckUserSend != null && listCheckUserSend.Any()) ? listCheckUserSend.Count : 0) + ((listTask != null && listTask.Any()) ? listTask.Count : 0) + ((listCheckUser != null && listCheckUser.Any()) ? listCheckUser.Count : 0) + ((listCheck != null && listCheck.Any()) ? listCheck.Count : 0) + ((listCheckDetail != null && listCheckDetail.Any()) ? listCheckDetail.Count : 0) + ((listTaskMaintCheck != null && listTaskMaintCheck.Any()) ? listTaskMaintCheck.Count : 0);
|
|||
|
|
SyncLogDetailService.InsertSyncLogDetail(HttpContext.Items, HttpContext.TraceIdentifier, filter.OrgId, Count, filter.Parameter1, SyncLogType.BSCreateCheckPlanSet);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region HMR
|
|||
|
|
/// <summary>
|
|||
|
|
/// 触发设备设施检测检验
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("InspectionSync")]
|
|||
|
|
public JsonActionResult<bool> InspectionSync([FromBody] KeywordFilter filter)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<bool>(() =>
|
|||
|
|
{
|
|||
|
|
var dtNow = DateTime.Now;
|
|||
|
|
var month = dtNow.Month;
|
|||
|
|
var day = dtNow.Day;
|
|||
|
|
var time = dtNow.TimeOfDay;
|
|||
|
|
var week = dtNow.DayOfWeek;
|
|||
|
|
bool isSend = false;
|
|||
|
|
List<T_FM_NOTIFICATION_TASK> sendNotices = new List<T_FM_NOTIFICATION_TASK>();
|
|||
|
|
T_DM_DETECTION_INSPECTION_RECORD record = null;
|
|||
|
|
var newFilter = new BaseFilter(filter.OrgId);
|
|||
|
|
newFilter.SelectField = new List<string> { "PLANCHECKFREQUENCY", "MONTH", "DATA", "WEEKDATA", "RUNSETTIME" };
|
|||
|
|
var timeSet = GetEntity<T_PT_TIME_SET>(i => i.SET_TYPE == PTSetTypeEnum.Inspection, newFilter);
|
|||
|
|
if (timeSet != null)
|
|||
|
|
{
|
|||
|
|
switch (timeSet.PLANCHECKFREQUENCY)
|
|||
|
|
{
|
|||
|
|
//case BSPLANCHECKFREQUENCYEnum.OneTime:
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Year:
|
|||
|
|
if (timeSet.MONTH == month && timeSet.DATA == day)
|
|||
|
|
isSend = true;
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.HalfYear:
|
|||
|
|
if ((timeSet.MONTH == month && timeSet.DATA == day) || ((timeSet.MONTH + 6) == month && (timeSet.DATA + 183) == day))
|
|||
|
|
isSend = true;
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Date:
|
|||
|
|
isSend = true;
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Week:
|
|||
|
|
if (timeSet.WEEKDATA != null && (int)timeSet.WEEKDATA.Value == (int)week)
|
|||
|
|
isSend = true;
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Month:
|
|||
|
|
if (timeSet.DATA == day)
|
|||
|
|
isSend = true;
|
|||
|
|
break;
|
|||
|
|
case BSPLANCHECKFREQUENCYEnum.Quarter:
|
|||
|
|
if (timeSet.MONTH == 1)
|
|||
|
|
{
|
|||
|
|
if ((month == 1 || month == 4 || month == 7 || month == 10) && timeSet.DATA == day)
|
|||
|
|
isSend = true;
|
|||
|
|
}
|
|||
|
|
if (timeSet.MONTH == 2)
|
|||
|
|
{
|
|||
|
|
if ((month == 2 || month == 5 || month == 8 || month == 11) && timeSet.DATA == day)
|
|||
|
|
isSend = true;
|
|||
|
|
}
|
|||
|
|
if (timeSet.MONTH == 3)
|
|||
|
|
{
|
|||
|
|
if ((month == 3 || month == 6 || month == 9 || month == 12) && timeSet.DATA == day)
|
|||
|
|
isSend = true;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (isSend)
|
|||
|
|
{
|
|||
|
|
var userInfo = this.GetEntity<T_FM_PARAM_SET>(t => t.NAME == "检测检验责任人", "Nav_User");
|
|||
|
|
if (userInfo != null)
|
|||
|
|
{
|
|||
|
|
record = new T_DM_DETECTION_INSPECTION_RECORD();
|
|||
|
|
record.ORG_ID = userInfo.ORG_ID;
|
|||
|
|
record.STATUS = PFStandardStatus.Draft;
|
|||
|
|
record.TIME = DateTime.Now;
|
|||
|
|
record.RESULT = DMInspectionResultEnum.不合格;
|
|||
|
|
record.USER_ID = userInfo.USER_ID;
|
|||
|
|
var user = this.GetEntity<T_FM_USER>(t => t.ID == userInfo.USER_ID);
|
|||
|
|
record.DEPARTMENT_ID = user?.DEPARTMENT_ID;
|
|||
|
|
sendNotices.Add(NotificationTaskService.InsertUserNoticeTaskModel("设备设施检测检验记录", record.ID, filter.GetOrgId(), userInfo.USER_ID.Value, userInfo.Nav_User.NAME, DateTime.Now, DateTime.Now.AddDays(30), (int)FMNoticeTypeEnum.消息, "DM012"));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
UnifiedCommit(() =>
|
|||
|
|
{
|
|||
|
|
if (record != null)
|
|||
|
|
UpdateEntityNoCommit(record);
|
|||
|
|
if (sendNotices != null && sendNotices.Any())
|
|||
|
|
BantchSaveEntityNoCommit(sendNotices);
|
|||
|
|
});
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 触发设备设施归还记录
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("DeviceReturnSync")]
|
|||
|
|
public JsonActionResult<bool> DeviceReturnSync([FromBody] KeywordFilter filter)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<bool>(() =>
|
|||
|
|
{
|
|||
|
|
var dtNow = DateTime.Now;
|
|||
|
|
List<T_FM_NOTIFICATION_TASK> sendNotices = new List<T_FM_NOTIFICATION_TASK>();
|
|||
|
|
var details = GetEntities<T_DM_DEVICE_ISSUE_DETAIL>(i => i.RETURN_STATUS == DMIsReturnEnum.NG && i.RETURN_TIME.Value.Date == dtNow.Date, new BaseFilter(filter.OrgId), "Nav_User", "Nav_DeviceBase");
|
|||
|
|
if (details != null && details.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in details)
|
|||
|
|
{
|
|||
|
|
sendNotices.Add(NotificationTaskService.InsertUserNoticeTaskModel("设备" + item.Nav_DeviceBase.NAME + "归还记录", item.ID, filter.GetOrgId(), item.USER_ID.Value, item.Nav_User.NAME, DateTime.Now, DateTime.Now.AddDays(30), (int)FMNoticeTypeEnum.消息, "DM026"));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
UnifiedCommit(() =>
|
|||
|
|
{
|
|||
|
|
if (sendNotices != null && sendNotices.Any())
|
|||
|
|
BantchSaveEntityNoCommit(sendNotices);
|
|||
|
|
});
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|