356 lines
20 KiB
C#
356 lines
20 KiB
C#
|
|
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;
|
|||
|
|
using APT.BaseData.Domain.IServices.FM;
|
|||
|
|
using APT.Infrastructure.Core;
|
|||
|
|
using APT.MS.Domain.Entities.OG;
|
|||
|
|
using APT.MS.Domain.Entities.SC;
|
|||
|
|
using APT.MS.Domain.Entities.SC.OG;
|
|||
|
|
using APT.MS.Domain.Enums;
|
|||
|
|
using APT.Utility;
|
|||
|
|
using Microsoft.AspNetCore.Mvc;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
namespace APT.SC.WebApi.Controllers.Api.OG
|
|||
|
|
{
|
|||
|
|
[Route("api/OG/OGSafePdtAssessPlanCheck")]
|
|||
|
|
public class OGSafePdtAssessPlanCheckController : AuthorizeApiController<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK>
|
|||
|
|
{
|
|||
|
|
IPFCodeRuleService CodeRuleService { get; set; }
|
|||
|
|
IFMNotificationTaskService NotificationTaskService { get; set; }
|
|||
|
|
IFMFlowPermitService MFlowPermitService { get; set; }
|
|||
|
|
IPFApproveCallBackService ApproveCallBackService { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="notificationTaskService"></param>
|
|||
|
|
public OGSafePdtAssessPlanCheckController(IPFCodeRuleService codeRuleService, IFMNotificationTaskService notificationTaskService, IFMFlowPermitService mFlowPermitService, IPFApproveCallBackService approveCallBackService)
|
|||
|
|
{
|
|||
|
|
CodeRuleService = codeRuleService;
|
|||
|
|
NotificationTaskService = notificationTaskService;
|
|||
|
|
MFlowPermitService = mFlowPermitService;
|
|||
|
|
ApproveCallBackService = approveCallBackService;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 新增/编辑
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="entity"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("FullUpdate")]
|
|||
|
|
public JsonActionResult<bool> FullUpdate([FromBody] T_OG_SAFE_PDT_ASSESS_PLAN_CHECK entity)
|
|||
|
|
{
|
|||
|
|
return SafeExecute(() =>
|
|||
|
|
{
|
|||
|
|
var details = entity.Nav_Details;
|
|||
|
|
var files = entity.Nav_Files;
|
|||
|
|
if (entity.ANNUAL == null || entity.ANNUAL == 0)
|
|||
|
|
{
|
|||
|
|
entity.ANNUAL = DateTime.Now.Year;
|
|||
|
|
}
|
|||
|
|
entity.USER_ID = APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
|
|||
|
|
var department = this.GetEntity<T_FM_USER>(t => t.ID == entity.USER_ID.Value, new string[] { "Nav_Department", "Nav_Person.Nav_Post" });
|
|||
|
|
entity.DEPARTMENT_ID = department?.DEPARTMENT_ID;
|
|||
|
|
entity.TIME = DateTime.Now;
|
|||
|
|
List<T_FM_NOTIFICATION_TASK> notices = new List<T_FM_NOTIFICATION_TASK>();
|
|||
|
|
List<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL_CONTENT> contents = new List<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL_CONTENT>();
|
|||
|
|
T_FM_NOTIFICATION_TASK task = null;
|
|||
|
|
List<T_OG_SAFE_ASSESS_PLAN_INPUT> newDetailTemps = new List<T_OG_SAFE_ASSESS_PLAN_INPUT>();
|
|||
|
|
List<T_OG_SAFE_ASSESS_ITEM> newContentTemps = new List<T_OG_SAFE_ASSESS_ITEM>();
|
|||
|
|
List<Guid> deleteIds = new List<Guid>();
|
|||
|
|
|
|||
|
|
if (entity.PUBLISH != null && entity.PUBLISH.Equals("SaveAndNotify"))
|
|||
|
|
{
|
|||
|
|
entity.STATUS = PFStandardStatus.Approving;
|
|||
|
|
|
|||
|
|
if (details != null && details.Any())
|
|||
|
|
{
|
|||
|
|
//回写考核方案导入表
|
|||
|
|
var postBack = details.Select(t => t.POST_ID).Distinct().ToList();
|
|||
|
|
var tempDetails = this.GetEntities<T_OG_SAFE_ASSESS_PLAN_INPUT>(t => t.DEPARTMENT_ID == entity.DEPARTMENT_ID && postBack.Contains(t.POST_ID.Value) && t.ANNUAL == entity.ANNUAL, new BaseFilter(entity.ORG_ID), new string[] { "Nav_SafeAssessItem" }).ToList();
|
|||
|
|
foreach (var t in details)
|
|||
|
|
{
|
|||
|
|
t.ANNUAL = entity.ANNUAL;
|
|||
|
|
if (t.CYCLE == 0)
|
|||
|
|
this.ThrowError("040006");
|
|||
|
|
var first = tempDetails.FirstOrDefault(f => f.POST_ID == t.POST_ID && f.ANNUAL == t.ANNUAL);
|
|||
|
|
if (first == null)
|
|||
|
|
{
|
|||
|
|
T_OG_SAFE_ASSESS_PLAN_INPUT newDetailTemp = new T_OG_SAFE_ASSESS_PLAN_INPUT();
|
|||
|
|
newDetailTemp.NAME = entity.NAME;
|
|||
|
|
newDetailTemp.DEPARTMENT_ID =entity.DEPARTMENT_ID;
|
|||
|
|
newDetailTemp.USER_ID = APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
|
|||
|
|
newDetailTemp.POST_ID = t.POST_ID;
|
|||
|
|
newDetailTemp.CYCLE = t.CYCLE;
|
|||
|
|
newDetailTemp.CODE = DateTime.Now.ToString("yyyyMMddHHmmss");
|
|||
|
|
newDetailTemp.ANNUAL = t.ANNUAL;
|
|||
|
|
newDetailTemp.ORG_ID = t.ORG_ID;
|
|||
|
|
newDetailTemp.POST_ID = t.POST_ID;
|
|||
|
|
newDetailTemp.CHECK_ID = entity.ID;
|
|||
|
|
newDetailTemps.Add(newDetailTemp);
|
|||
|
|
if (t.Nav_Contents != null && t.Nav_Contents.Any())
|
|||
|
|
{
|
|||
|
|
var sum = t.Nav_Contents.Where(p => !p.IS_DELETED).Sum(x => x.SCORE);
|
|||
|
|
if (sum != 100)
|
|||
|
|
throw new Exception("考试项目标准分总分必须为100");
|
|||
|
|
t.Nav_Contents.ForEach(t1 =>
|
|||
|
|
{
|
|||
|
|
t1.ORG_ID = entity.ORG_ID;
|
|||
|
|
t1.CHECK_DETAIL_ID = t.ID;
|
|||
|
|
contents.Add(t1);
|
|||
|
|
T_OG_SAFE_ASSESS_ITEM newContent = new T_OG_SAFE_ASSESS_ITEM();
|
|||
|
|
newContent.ORG_ID = entity.ORG_ID;
|
|||
|
|
newContent.ASSESS_PLAN_INPUT_ID = newDetailTemp.ID;
|
|||
|
|
newContent.SCORE = t1.SCORE;
|
|||
|
|
newContent.METHOD = t1.METHOD;
|
|||
|
|
newContent.NAME = t1.NAME;
|
|||
|
|
newContentTemps.Add(newContent);
|
|||
|
|
});
|
|||
|
|
t.Nav_Contents = null;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
throw new Exception("考试项目未全部填写");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var ids = first.Nav_SafeAssessItem.Select(p => p.ID).ToList();
|
|||
|
|
deleteIds.AddRange(ids);
|
|||
|
|
if (t.Nav_Contents != null && t.Nav_Contents.Any())
|
|||
|
|
{
|
|||
|
|
var sum = t.Nav_Contents.Where(p => !p.IS_DELETED).Sum(x => x.SCORE);
|
|||
|
|
if (sum != 100)
|
|||
|
|
throw new Exception("考试项目标准分总分必须为100");
|
|||
|
|
t.Nav_Contents.ForEach(t1 =>
|
|||
|
|
{
|
|||
|
|
t1.ORG_ID = entity.ORG_ID;
|
|||
|
|
t1.CHECK_DETAIL_ID = t.ID;
|
|||
|
|
contents.Add(t1);
|
|||
|
|
T_OG_SAFE_ASSESS_ITEM newContent = new T_OG_SAFE_ASSESS_ITEM();
|
|||
|
|
newContent.ORG_ID = entity.ORG_ID;
|
|||
|
|
newContent.ASSESS_PLAN_INPUT_ID = first.ID;
|
|||
|
|
newContent.SCORE = t1.SCORE;
|
|||
|
|
newContent.METHOD = t1.METHOD;
|
|||
|
|
newContent.NAME = t1.NAME;
|
|||
|
|
newContentTemps.Add(newContent);
|
|||
|
|
});
|
|||
|
|
t.Nav_Contents = null;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
throw new Exception("考试项目未全部填写");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
entity.STATUS = PFStandardStatus.Approving;
|
|||
|
|
entity.Nav_Details = null;
|
|||
|
|
//取审批流水码
|
|||
|
|
var sysFilter = new SystemCodeFilter();
|
|||
|
|
sysFilter.CodeType = (int)PFCodeRuleType.审批流编码;
|
|||
|
|
sysFilter.Count = 1;
|
|||
|
|
sysFilter.OrgId = entity.ORG_ID;
|
|||
|
|
var codes = CodeRuleService.NewGenSerial(sysFilter);
|
|||
|
|
var serialCode = codes.Split(new char[] { ',' });
|
|||
|
|
var param = Enum.GetName(typeof(FMDepartmentType), entity.LEVEL);
|
|||
|
|
MFlowPermitService.InsertApprove(serialCode[0], "OG004", param, entity.ID, "OG003_SHOWPRINT", entity.TaskID, true, () =>
|
|||
|
|
{
|
|||
|
|
if (entity != null)
|
|||
|
|
this.UpdateEntityNoCommit(entity);
|
|||
|
|
if (details != null && details.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(details);
|
|||
|
|
if (contents != null && contents.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(contents);
|
|||
|
|
if (newDetailTemps != null && newDetailTemps.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(newDetailTemps);
|
|||
|
|
if (deleteIds != null && deleteIds.Any())
|
|||
|
|
this.BantchDeleteEntityNoCommit<T_OG_SAFE_ASSESS_ITEM>(deleteIds);
|
|||
|
|
if (newContentTemps != null && newContentTemps.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(newContentTemps);
|
|||
|
|
if (task != null)
|
|||
|
|
this.UpdateEntityNoCommit(task);
|
|||
|
|
if (notices != null && notices.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(notices);
|
|||
|
|
if (files != null && files.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(files);
|
|||
|
|
}, null, null, null, null, null, "OG003_SHOWPRINT", null);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
entity.Nav_Details = null;
|
|||
|
|
UnifiedCommit(() =>
|
|||
|
|
{
|
|||
|
|
if (entity != null)
|
|||
|
|
this.UpdateEntityNoCommit(entity);
|
|||
|
|
if (details != null && details.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(details);
|
|||
|
|
if (contents != null && contents.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(contents);
|
|||
|
|
if (newDetailTemps != null && newDetailTemps.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(newDetailTemps);
|
|||
|
|
if (deleteIds != null && deleteIds.Any())
|
|||
|
|
this.BantchDeleteEntityNoCommit<T_OG_SAFE_ASSESS_ITEM>(deleteIds);
|
|||
|
|
if (newContentTemps != null && newContentTemps.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(newContentTemps);
|
|||
|
|
if (task != null)
|
|||
|
|
this.UpdateEntityNoCommit(task);
|
|||
|
|
if (notices != null && notices.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(notices);
|
|||
|
|
});
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 已阅
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="entity"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("IdentityUpdate")]
|
|||
|
|
public JsonActionResult<bool> IdentityUpdate([FromBody] T_OG_SAFE_PDT_ASSESS_PLAN_CHECK entity)
|
|||
|
|
{
|
|||
|
|
return SafeExecute(() =>
|
|||
|
|
{
|
|||
|
|
var audit = this.GetEntity<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK>(entity.ID);
|
|||
|
|
//发起车间、班组、个人目标与指标
|
|||
|
|
T_OG_SAFE_PDT_ASSESS_PLAN_CHECK auditDepart = null;
|
|||
|
|
var loginUserId = APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
|
|||
|
|
var loginUser = this.GetEntity<T_FM_USER>(t => t.ID == loginUserId.Value, "Nav_Department", "Nav_ApproveRole");
|
|||
|
|
var name = ""; var type = 0; var departmentType = FMDepartmentType.公司;
|
|||
|
|
switch (audit.LEVEL)
|
|||
|
|
{
|
|||
|
|
case FMDepartmentType.公司:
|
|||
|
|
departmentType = FMDepartmentType.部门;
|
|||
|
|
name = "部门"; type = 1;
|
|||
|
|
break;
|
|||
|
|
case FMDepartmentType.部门:
|
|||
|
|
departmentType = FMDepartmentType.车间;
|
|||
|
|
name = "车间"; type = 2;
|
|||
|
|
break;
|
|||
|
|
case FMDepartmentType.车间:
|
|||
|
|
departmentType = FMDepartmentType.班组;
|
|||
|
|
name = "班组";
|
|||
|
|
break;
|
|||
|
|
case FMDepartmentType.班组:
|
|||
|
|
name = "";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
name = "";
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
List<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL> auditDetails = new List<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL>();
|
|||
|
|
List<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL_CONTENT> contents = new List<T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL_CONTENT>();
|
|||
|
|
T_FM_NOTIFICATION_TASK notice = null;
|
|||
|
|
if ((int)audit.LEVEL != loginUser.Nav_Department.DEPARTMENT_TYPE || ((int)audit.LEVEL == loginUser.Nav_Department.DEPARTMENT_TYPE && audit.LEVEL == FMDepartmentType.班组))
|
|||
|
|
{
|
|||
|
|
if (name == "")
|
|||
|
|
{
|
|||
|
|
auditDepart = null;
|
|||
|
|
audit.STATUS = PFStandardStatus.Archived;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
auditDepart = new T_OG_SAFE_PDT_ASSESS_PLAN_CHECK();
|
|||
|
|
auditDepart.STATUS = PFStandardStatus.Draft;
|
|||
|
|
auditDepart.ORG_ID = audit.ORG_ID;
|
|||
|
|
auditDepart.ANNUAL = audit.ANNUAL;
|
|||
|
|
auditDepart.TIME = DateTime.Now;
|
|||
|
|
auditDepart.USER_ID = loginUserId;
|
|||
|
|
auditDepart.DEPARTMENT_ID = loginUser?.DEPARTMENT_ID;
|
|||
|
|
auditDepart.LEVEL = departmentType;
|
|||
|
|
var departmentIds = this.GetEntities<T_FM_DEPARTMENT>(t => t.DEPARTMENT_TYPE == type && t.PARENT_ID == loginUser.DEPARTMENT_ID && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, new BaseFilter(audit.ORG_ID)).Select(m => m.ID).ToList();
|
|||
|
|
if (departmentIds.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var department in departmentIds)
|
|||
|
|
{
|
|||
|
|
//细表
|
|||
|
|
T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL auditDetail = new T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL();
|
|||
|
|
auditDetail.ORG_ID = audit.ORG_ID;
|
|||
|
|
auditDetail.CHECK_ID = auditDepart.ID;
|
|||
|
|
auditDetail.ANNUAL = DateTime.Now.Year;
|
|||
|
|
auditDetails.Add(auditDetail);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var userInfos = this.GetEntities<T_FM_USER>(t => t.DEPARTMENT_ID == loginUser.DEPARTMENT_ID && (t.Nav_ApproveRole == null || (t.Nav_ApproveRole != null && !t.Nav_ApproveRole.NAME.Contains("副总"))) && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用 && !t.CODE.Contains("admin"), new BaseFilter(entity.ORG_ID)).ToList();
|
|||
|
|
foreach (var info in userInfos)
|
|||
|
|
{
|
|||
|
|
//细表
|
|||
|
|
T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL auditDetail = new T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL();
|
|||
|
|
auditDetail.ORG_ID = audit.ORG_ID;
|
|||
|
|
auditDetail.POST_ID = info.ID;
|
|||
|
|
auditDetail.CHECK_ID = auditDepart.ID;
|
|||
|
|
auditDetail.ANNUAL = DateTime.Now.Year;
|
|||
|
|
auditDetails.Add(auditDetail);
|
|||
|
|
}
|
|||
|
|
var userIds = userInfos.Select(t => t.ID).ToList();
|
|||
|
|
var tempDetails = this.GetEntities<T_OG_SAFE_ASSESS_PLAN_INPUT>(t => departmentIds.Contains(t.DEPARTMENT_ID.Value) || userIds.Contains(t.USER_ID.Value), new BaseFilter(entity.ORG_ID), new string[] { "Nav_SafeAssessItem" }).ToList();
|
|||
|
|
if (auditDetails != null && auditDetails.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var auditDs in auditDetails)
|
|||
|
|
{
|
|||
|
|
var tempCurrent = tempDetails.FirstOrDefault(t => t.POST_ID == auditDs.POST_ID && t.ANNUAL == auditDs.ANNUAL);
|
|||
|
|
if (tempCurrent != null)
|
|||
|
|
{
|
|||
|
|
auditDs.CYCLE = tempCurrent.CYCLE;
|
|||
|
|
if (tempCurrent.Nav_SafeAssessItem != null && tempCurrent.Nav_SafeAssessItem.Any())
|
|||
|
|
{
|
|||
|
|
tempCurrent.Nav_SafeAssessItem.ForEach(t =>
|
|||
|
|
{
|
|||
|
|
T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL_CONTENT content = new T_OG_SAFE_PDT_ASSESS_PLAN_CHECK_DETAIL_CONTENT();
|
|||
|
|
content.ORG_ID = t.ORG_ID;
|
|||
|
|
content.CHECK_DETAIL_ID = auditDs.ID;
|
|||
|
|
content.NAME = t.NAME;
|
|||
|
|
content.SCORE = t.SCORE;
|
|||
|
|
content.METHOD = t.METHOD;
|
|||
|
|
contents.Add(content);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
notice = NotificationTaskService.InsertUserNoticeTaskModel(name + "考核方案审核", auditDepart.ID, audit.ORG_ID, loginUser.ID, loginUser.NAME, DateTime.Now,
|
|||
|
|
DateTime.Now.AddHours(24), (int)FMNoticeTypeEnum.消息, "PT024");//userIds, userNames,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
T_FM_NOTIFICATION_TASK task = null;
|
|||
|
|
if (entity.TaskID != Guid.Empty)
|
|||
|
|
{
|
|||
|
|
task = NotificationTaskService.FOGetTaskFinishModel(entity.TaskID,entity.ID);
|
|||
|
|
task.SOURCE_FORMCODE = "PT024_SHOWPRINT";
|
|||
|
|
}
|
|||
|
|
UnifiedCommit(() =>
|
|||
|
|
{
|
|||
|
|
if (audit != null)
|
|||
|
|
this.UpdateEntityNoCommit(audit);
|
|||
|
|
if (auditDepart != null)
|
|||
|
|
this.UpdateEntityNoCommit(auditDepart);
|
|||
|
|
if (auditDetails != null && auditDetails.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(auditDetails);
|
|||
|
|
if (contents != null && contents.Any())
|
|||
|
|
this.BantchSaveEntityNoCommit(contents);
|
|||
|
|
if (task != null)
|
|||
|
|
this.UpdateEntityNoCommit(task);
|
|||
|
|
if (notice != null)
|
|||
|
|
this.UpdateEntityNoCommit(notice);
|
|||
|
|
});
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 回调函数
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="id"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpGet, Route("BackUpdate")]
|
|||
|
|
public JsonActionResult<bool> BackUpdate(string id)
|
|||
|
|
{
|
|||
|
|
return SafeExecute(() =>
|
|||
|
|
{
|
|||
|
|
return ApproveCallBackService.CallBack("OG/OGSafePdtAssessPlanCheck/BackUpdate", id);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|