namespace APT.PF.WebApi.Controllers.Api { using APT.Infrastructure.Core; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using APT.Utility; using APT.Infrastructure.Api; using APT.BaseData.Domain.ApiModel.PF; using APT.BaseData.Domain.Entities; using APT.BaseData.Domain.Enums.PF; using System.Linq; using System; using APT.BaseData.Domain.IServices.FM; using APT.MS.Domain.Enums; using System.Dynamic; using System.Reflection; using APT.BaseData.Domain.Entities.PF; using APT.BaseData.Domain.Entities.FM; using System.Linq.Expressions; using APT.MS.Domain.Entities.BS; using APT.BaseData.Domain.Enums; using APT.BaseData.Domain.IServices; using APT.MS.Domain.Entities.HM; using Newtonsoft.Json; using NPOI.Util; using System.Data; using NPOI.SS.Formula.Functions; using APT.MS.Domain.Entities.SC; using APT.Infrastructure.EF; using APT.BaseData.Services.DomainServices; using APT.BaseData.Services.Services.FM; using APT.BaseData.Services.Sys; using APT.MS.Domain.Entities.FO; using APT.BaseData.Domain.IServices.OP; [Route("api/PF/PFApprove")] public partial class ApproveController : AuthorizeApiController { IFMNotificationTaskService NotificationTaskService { get; set; } IPFSysLogService SysLogService { get; set; } IRepository Repository { get; set; } IPFCodeRuleService CodeRuleService { get; set; } IFMDepartmentService DepartmentService { get; set; } IFMUserService UserService { get; set; } IOPTenantDBConnService OPTenantDBConnService { get; set; } public ApproveController(IFMNotificationTaskService notificationTaskService, IPFSysLogService sysLogService, IRepository repository, IPFCodeRuleService codeRuleService, IFMDepartmentService departmentService, IFMUserService userService, IOPTenantDBConnService oPTenantDBConnService) { NotificationTaskService = notificationTaskService; SysLogService = sysLogService; Repository = repository; CodeRuleService = codeRuleService; DepartmentService = departmentService; UserService = userService; OPTenantDBConnService = oPTenantDBConnService; } /// /// 更新或新增数据 /// /// 对象实体 /// [HttpPost, Route("FullUpdate")] public JsonActionResult FullUpdate([FromBody] T_PF_APPROVE entity) { return SafeExecute(() => { var detail = entity.Nav_ApproveDetails; entity.Nav_ApproveDetails = null; UnifiedCommit(() => { this.UpdateEntityNoCommit(entity); if (detail != null) this.BantchSaveEntityNoCommit(detail); }); return true; }); } /// /// 审批单据 /// /// 对象实体 /// [HttpPost, Route("Submit")] public JsonActionResult Submit([FromBody] T_PF_APPROVE entity) { return base.SafeExecute(() => { var ret = string.Empty; var dbApprove = this.GetEntity(entity.ID.ToString(), false, "Nav_ApproveDetails"); if (dbApprove == null) this.ThrowError("020027"); if (dbApprove.APPROVE_STATUS != (int)ApproveStatus.Doing) this.ThrowError("020028"); var node = dbApprove.Nav_ApproveDetails.FirstOrDefault(i => i.ID == entity.CurrentNode.ID); if (!node.IS_CURRENT) this.ThrowError("020030"); //查询消息表 var task = this.GetEntity(i => i.SOURCE_DATA_ID == entity.ID && i.USER_ID == node.APPROVE_USER_ID && i.NOTICE_STATUS == FMNoticeStatusEnum.未处理.GetInt(), false); if (task != null) { task.NOTICE_STATUS = FMNoticeStatusEnum.正常已办.GetInt(); task.TASK_DT = DateTime.Now; if (DateTime.Now > task.TASK_ENDDT) task.NOTICE_STATUS = FMNoticeStatusEnum.超期办理.GetInt(); } //修改节点状态 node.NODE_APPROVE_TIME = DateTime.Now; node.NODE_APPROVE_STATUS = entity.CurrentNode.NODE_APPROVE_STATUS; node.IS_CURRENT = false; node.CONTEXT = entity.CurrentNode.CONTEXT; //Type dbTypeEnd = null;//反射类 //MethodInfo methodInfoEnd = null;//反射方法 //更新审批单据状态 if (node.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Reject)//驳回 { //驳回时状态改为驳回,并通知申请人重新提交 dbApprove.APPROVE_STATUS = ApproveStatus.Reject.GetInt(); var details = dbApprove.Nav_ApproveDetails; dbApprove.Nav_ApproveDetails = null; details.ForEach(i => i.Nav_Approve = null); List userIds = new List(); userIds.Add((Guid)dbApprove.CREATER_ID); //消息通知并修改状态 NotificationTaskService.SendNotificationTask(entity.NAME + "已被驳回,请重新新建表单提交审核", entity.ID, APT.Infrastructure.Api.AppContext.CurrentSession.OrgId, userIds, DateTime.Now, DateTime.Now.AddHours(24), (int)FMNoticeTypeEnum.消息, "PF119", () => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); }); return ret; } else if (node.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Done) { //判断下一个节点是否包含 本节点的人 //如果是 并且 只有这个人 // 继续判断下一个人节点 #region wyw 默认审批判断 bool isLast = false; List Nav_ApproveDetails = dbApprove.Nav_ApproveDetails.ToList(); DoneLaterApproverDeal(node, node.APPROVE_USER_ID.Value, node.CONTEXT, node.NODE_APPROVE_STATUS, ref Nav_ApproveDetails, ref isLast); dbApprove.Nav_ApproveDetails = Nav_ApproveDetails;//可能会有修改赋值过去 #endregion //var lastNode = dbApprove.Nav_ApproveDetails.Where(i => i.NUM >= entity.CurrentNode.NUM && i.ID != entity.CurrentNode.ID && i.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing); //if (!lastNode.Any()) if (isLast) { dbApprove.APPROVE_STATUS = ApproveStatus.Done.GetInt();//完成 ret = dbApprove.CALLBACK_INTERFACE; //if (ret == "SC/SCMtMeetingMinutes/MeetingMinutesBack") //{ // //不存在无参的构造函数所以实例化失败 ccy // var callBackInterface = APT.Infrastructure.Core.Refctor.ReflectHelper.FindTypeInCurrentDomain("PFApproveCallBackMTService"); // MethodInfo callbackMethd = callBackInterface.GetMethod("MeetingMinutesBack", BindingFlags.Public | BindingFlags.Instance); // var instance = Activator.CreateInstance(callBackInterface, Repository, CodeRuleService, NotificationTaskService, SysLogService, DepartmentService, UserService); // callbackMethd.Invoke(instance, new object[] { dbApprove.DATA_ID.ToString() }); // //将方法写在此类也可以调用 wyw // //var callBackInterface1 = this.GetType(); // //MethodInfo callbackMethd1 = callBackInterface1.GetMethod("MeetingMinutesBack", BindingFlags.Public | BindingFlags.Instance); // Error lies // //callbackMethd1.Invoke(this, new object[] { dbApprove.DATA_ID.ToString() }); //} //查询审批的表单数据 var form = this.GetEntity(i => i.CODE == dbApprove.APPROVE_CODE, new BaseFilter(dbApprove.ORG_ID)); var tableName = form?.TABLE_NAME; if (string.IsNullOrEmpty(tableName)) { var formEdit = this.GetEntity(i => i.PAGE_FORM_ID == form.ID && i.PARENT_ID == null); if (formEdit != null) { tableName = formEdit.EDIT_NAME; } } if (!string.IsNullOrEmpty(tableName)) { var dbType = APT.Infrastructure.Core.Refctor.ReflectHelper.FindTypeInCurrentDomain(tableName); if (dbType != null) { MethodInfo methodInfo = this.GetType().GetMethod("GetMyEntity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); var entity = methodInfo.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { dbApprove.DATA_ID }); if (entity != null) { var prop = dbType.GetProperty("FLOW_STATUS"); if (prop != null) { prop.SetValue(entity, 2); MethodInfo methodInfoUpdate = this.GetType().GetMethod("UpdateMyEntityNoCommit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); var details = dbApprove.Nav_ApproveDetails; dbApprove.Nav_ApproveDetails = null; details.ForEach(i => i.Nav_Approve = null); UnifiedCommit(() => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); methodInfoUpdate.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { entity }); }); return ret; } } } } if (ret == "FO/FOCrucialLicenseJob/BackUpdate") { BackUpdate_FOJobCrucialLicense(dbApprove.DATA_ID.ToString(), () => JobChangeApproveStatus(dbApprove, task)); return ""; } if (ret == "FO/FOJobEventRecord/BackUpdate") { BackUpdate_FOJobEventRecord(dbApprove.DATA_ID.ToString(), () => JobChangeApproveStatus(dbApprove, task)); return ""; } } else { var next = dbApprove.Nav_ApproveDetails.Where(i => i.NUM == entity.CurrentNode.NUM && i.ID != entity.CurrentNode.ID && i.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing); if (next.Any()) { } else { //var nextNodes = dbApprove.Nav_ApproveDetails.Where(i => i.NUM > entity.CurrentNode.NUM);//wyw var nextNodes = dbApprove.Nav_ApproveDetails.Where(i => i.NUM > entity.CurrentNode.NUM && i.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing); if (nextNodes.Any()) { T_PF_APPROVE_DETAIL curentApprove = null; GetApproveNodes(nextNodes.ToList(), ref curentApprove); //所有节点均无审核人,直接归档 if (curentApprove == null) { dbApprove.APPROVE_STATUS = ApproveStatus.Done.GetInt();//完成 ret = dbApprove.CALLBACK_INTERFACE; //查询审批的表单数据 var form = this.GetEntity(i => i.CODE == dbApprove.APPROVE_CODE, new BaseFilter(dbApprove.ORG_ID)); var tableName = form?.TABLE_NAME; if (string.IsNullOrEmpty(tableName)) { var formEdit = this.GetEntity(i => i.PAGE_FORM_ID == form.ID && i.PARENT_ID == null); if (formEdit != null) { tableName = formEdit.EDIT_NAME; } } if (!string.IsNullOrEmpty(tableName)) { var dbType = APT.Infrastructure.Core.Refctor.ReflectHelper.FindTypeInCurrentDomain(tableName); if (dbType != null) { MethodInfo methodInfo = this.GetType().GetMethod("GetMyEntity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); var entity = methodInfo.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { dbApprove.DATA_ID }); if (entity != null) { var prop = dbType.GetProperty("FLOW_STATUS"); if (prop != null) { prop.SetValue(entity, 2); MethodInfo methodInfoUpdate = this.GetType().GetMethod("UpdateMyEntityNoCommit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); var details = dbApprove.Nav_ApproveDetails; dbApprove.Nav_ApproveDetails = null; details.ForEach(i => i.Nav_Approve = null); UnifiedCommit(() => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); methodInfoUpdate.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { entity }); }); return ret; } } } } } else { var nextNode = nextNodes.Where(i => i.NUM == curentApprove.NUM && i.APPROVE_USER_ID != entity.CurrentNode.APPROVE_USER_ID);// && i.APPROVE_USER_ID != entity.CurrentNode.APPROVE_USER_ID nextNode.ForEach(i => i.IS_CURRENT = true); List userIds = new List(); userIds.AddRange(nextNode.Select(i => (Guid)i.APPROVE_USER_ID).ToArray()); var details = dbApprove.Nav_ApproveDetails; details.ForEach(i => i.Nav_Approve = null); dbApprove.Nav_ApproveDetails = null; //var nextNodeName=nextNode.Select(i => i.NAME).FirstOrDefault(); //消息通知并修改状态 string NoticeTitle = entity.NAME; if (!entity.NAME.EndsWith("审批")) { NoticeTitle = NoticeTitle + "待审批"; } var startTime = DateTime.Now; var endTime = DateTime.Now.AddHours(24); switch (entity.NAME) { case "作业任务识别表": case "作业任务识别分析表": case "一般任务分析表": case "关键任务分析表": case "作业许可分析表": endTime = Convert.ToDateTime(DateTime.Now.AddDays(2).ToString("D").ToString()).AddSeconds(-1); break; case "作业活动记录(一般作业)": case "关键许可工作票": case "关键许可工作票(无审批层级)": case "关键许可工作票(一级审批)": case "关键许可工作票(二级审批)": case "关键许可工作票(三级审批)": case "关键许可工作票(四级审批)": var job = this.GetEntity(t => t.ID == entity.DATA_ID, "Nav_OperationStep"); NoticeTitle = job != null && job.Nav_OperationStep != null ? entity.NAME + "-" + job.Nav_OperationStep?.NAME + "待审批" : NoticeTitle; endTime = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("D").ToString()).AddSeconds(-1); break; default: break; } NotificationTaskService.SendNotificationTask(NoticeTitle, entity.ID, APT.Infrastructure.Api.AppContext.CurrentSession.OrgId, userIds, startTime, endTime, (int)FMNoticeTypeEnum.审批, "PF119", () => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); }); return ret; } } else { } } } } ChangeApproveStatus(dbApprove, task);//, dbTypeEnd, methodInfoEnd return ret; }); } /// /// 审批通过 判断是否下一节点未本人 wyw /// /// /// /// /// /// /// private void DoneLaterApproverDeal(T_PF_APPROVE_DETAIL currentNode, Guid OperateID, string CONTEXT, int NODE_APPROVE_STATUS, ref List Nav_ApproveDetails, ref bool isLast) { if (NODE_APPROVE_STATUS != 10) { //审批不通过 return; } var detailDoing = Nav_ApproveDetails.FirstOrDefault(e => e.APPROVE_USER_ID.HasValue && e.NUM >= currentNode.NUM && e.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing && e.ID != currentNode.ID); if (detailDoing == null) { //最后一个审批人了 isLast = true; return; } else { isLast = false; } if (!isLast) { //如果不是最后一个审批人 判断处理 下级审批人信息 //同级 审批完了 下一级有他 默认审批 var currentNumNode = Nav_ApproveDetails.FirstOrDefault(e => e.NUM == currentNode.NUM && e.ID != currentNode.ID && e.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing); if (currentNumNode != null) { //同级 还有未审批的 return; } //同级没有未审批的人员信息 List listDoing = Nav_ApproveDetails.FindAll(e => e.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing).OrderBy(e => e.NUM).ToList(); if (listDoing != null && listDoing.Count > 0) { //还有未审批的 List listDoingMin = listDoing.FindAll(e => e.NUM == listDoing[0].NUM);//最小未审批节点 T_PF_APPROVE_DETAIL detailLogin = listDoingMin.FirstOrDefault(e => e.APPROVE_USER_ID == OperateID); if (detailLogin == null) { //下一个节点不是当前审批人 return; } //默认 审批 //detailLogin detailLogin.NODE_APPROVE_TIME = DateTime.Now; detailLogin.NODE_APPROVE_STATUS = (int)NodeApproveStatus.Done; detailLogin.IS_CURRENT = false; detailLogin.CONTEXT = CONTEXT; if (listDoingMin.Count == 1) { DoneLaterApproverDeal(detailLogin, OperateID, CONTEXT, NODE_APPROVE_STATUS, ref Nav_ApproveDetails, ref isLast); } } } } private void JobChangeApproveStatus(T_PF_APPROVE dbApprove, T_FM_NOTIFICATION_TASK task)//, Type dbTypeEnd = null, MethodInfo methodInfoEnd = null { var details = dbApprove.Nav_ApproveDetails; dbApprove.Nav_ApproveDetails = null; details.ForEach(i => i.Nav_Approve = null); if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); //if (methodInfoEnd != null) // methodInfoEnd.MakeGenericMethod(new Type[] { dbTypeEnd }).Invoke(this, new object[] { dbApprove.DATA_ID.ToString() }); } private void ChangeApproveStatus(T_PF_APPROVE dbApprove, T_FM_NOTIFICATION_TASK task)//, Type dbTypeEnd = null, MethodInfo methodInfoEnd = null { var details = dbApprove.Nav_ApproveDetails; dbApprove.Nav_ApproveDetails = null; details.ForEach(i => i.Nav_Approve = null); UnifiedCommit(() => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); //if (methodInfoEnd != null) // methodInfoEnd.MakeGenericMethod(new Type[] { dbTypeEnd }).Invoke(this, new object[] { dbApprove.DATA_ID.ToString() }); }); } public T GetMyEntity(Guid id) where T : MesEntityBase, new() { return this.GetEntity(id.ToString()); } public T GetMyEntity2(Expression> expression) where T : MesEntityBase, new() { return GetEntity(expression); } public void UpdateMyEntityNoCommit(T entity) where T : MesEntityBase, new() { this.UpdateEntityNoCommit(entity); } /// /// 转办 /// /// 参数 /// [HttpPost, Route("Complaint")] public JsonActionResult Complaint([FromBody] KeywordFilter keywordFilter) { return base.SafeExecute(() => { if (string.IsNullOrEmpty(keywordFilter.Keyword)) this.ThrowError("020005"); if (string.IsNullOrEmpty(keywordFilter.Parameter1)) this.ThrowError("020024"); var dbApproveDetail = this.GetEntity(keywordFilter.Keyword, false, "Nav_Approve"); if (dbApproveDetail == null) this.ThrowError("020007"); //查询消息表 var task = this.GetEntity(i => i.SOURCE_DATA_ID == dbApproveDetail.APPROVE_ID && i.USER_ID == dbApproveDetail.APPROVE_USER_ID && i.NOTICE_STATUS == FMNoticeStatusEnum.未处理.GetInt(), false); if (task != null) { task.USER_ID = Guid.Parse(keywordFilter.Parameter1); task.USER_NAME = this.GetEntity(t => t.ID == task.USER_ID && t.ENABLE_STATUS == 0)?.NAME; } //修改当前审核人为转办人 dbApproveDetail.APPROVE_USER_ID = Guid.Parse(keywordFilter.Parameter1); //添加转办记录 T_PF_COMPLAINT_LOG complant = new T_PF_COMPLAINT_LOG(); complant.ORG_ID = keywordFilter.OrgId; complant.APPROVE_DETAIL_ID = Guid.Parse(keywordFilter.Keyword); complant.COMPLAINT_USER_ID = Guid.Parse(keywordFilter.Parameter1); UnifiedCommit(() => { if (task != null) this.UpdateEntityNoCommit(task); if (dbApproveDetail != null) this.UpdateEntityNoCommit(dbApproveDetail); this.AddEntityNoCommit(complant); }); return true; }); } /// /// 根据数据id获取审核id /// /// 参数 /// [HttpPost, Route("GetDataId")] public JsonActionResult GetDataId([FromBody] KeywordFilter keywordFilter) { return SafeExecute(() => { Guid dataId = new Guid(keywordFilter.Keyword); bool isAPPROVEID = false; if (string.IsNullOrEmpty(keywordFilter.Keyword)) this.ThrowError("020005"); if (!string.IsNullOrEmpty(keywordFilter.Parameter2)) { //以这种形式传参查看反射实现 一劳永逸 if (keywordFilter.Parameter2 == "T_BS_RISK_SUBMIT_NOTICE,RISK_SUBMIT_ID") { T_BS_RISK_SUBMIT_NOTICE modelNo = GetEntity(e => e.RISK_SUBMIT_ID == dataId); if (modelNo != null) dataId = modelNo.ID; else return ""; //throw new Exception("未获取到审批流信息!"); } else if (keywordFilter.Parameter2 == "T_BS_SAFE_CHECK,APPROVE_CHECKAUDIT_ID") { var T_BS_SAFE_CHECK = GetEntity(e => e.ID == dataId); if (T_BS_SAFE_CHECK != null && T_BS_SAFE_CHECK.APPROVE_CHECKAUDIT_ID.HasValue) { dataId = T_BS_SAFE_CHECK.APPROVE_CHECKAUDIT_ID.Value; isAPPROVEID = true; } else { dataId = Guid.Empty; } } } Expression> expression = e => e.DATA_ID == dataId; if (isAPPROVEID) { expression = e => e.ID == dataId; } if (!string.IsNullOrEmpty(keywordFilter.Parameter1)) { expression = expression.And(e => e.PARAM == keywordFilter.Parameter1); } var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId; var dbApprove = this.GetEntities(expression, new BaseFilter(keywordFilter.OrgId)).OrderByDescending(t => t.CREATE_TIME).FirstOrDefault(); if (dbApprove == null) return ""; return dbApprove.ID.ToString(); }); } /// /// 更新状态为已阅 /// /// [HttpPost, Route("ChangeStatus")] public JsonActionResult ChangeStatus([FromBody] T_PF_APPROVE dbApprove) { return SafeExecute(() => { //更新状态为已阅 dbApprove.Nav_ApproveDetails = null; dbApprove.APPROVE_STATUS = (int)ApproveStatus.View; //查询消息表 var task = this.GetEntity(i => i.SOURCE_DATA_ID == dbApprove.ID && i.USER_ID == dbApprove.CREATER_ID && (i.NOTICE_STATUS == FMNoticeStatusEnum.未处理.GetInt() || i.NOTICE_STATUS == FMNoticeStatusEnum.超期办理.GetInt()), false); if (task != null) { if (DateTime.Now > task.TASK_ENDDT) task.NOTICE_STATUS = (int)FMNoticeStatusEnum.超期办理; else task.NOTICE_STATUS = (int)FMNoticeStatusEnum.正常已办; //task.NOTICE_STATUS = FMNoticeStatusEnum.已阅.GetInt(); task.TASK_DT = DateTime.Now; } UnifiedCommit(() => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); }); return true; }); } /// /// 获取下个审核节点、审核人 /// /// /// /// static void GetApproveNodes(List approveDetails, ref T_PF_APPROVE_DETAIL approveNode) { if (approveDetails == null) return; var curentNode = approveDetails.FirstOrDefault(i => i.NUM == approveDetails.Min(x => x.NUM) && i.NODE_APPROVE_STATUS == (int)NodeApproveStatus.Doing); if (curentNode == null || curentNode.APPROVE_USER_ID == null) { approveDetails.Remove(curentNode); approveNode = null; if (!approveDetails.Any()) return; GetApproveNodes(approveDetails, ref approveNode); } else { approveNode = curentNode; return; } } /// /// 获得单条实体数据 /// /// 过滤实体 /// [HttpPost, Route("FullGet")] public JsonActionResult FullGet([FromBody] KeywordFilter filter) { return SafeExecute(() => { T_PF_APPROVE result = null; if (!string.IsNullOrEmpty(filter.Parameter1) && filter.OrgId.HasValue && filter.Parameter1 != filter.OrgId.Value.ToString()) { //集团人员 通过 首页点击 获取对应的数据库链接 返回结果 ////后端直接处理 //string tenant = OPTenantDBConnService.GetTenantByORGID(new Guid(filter.Parameter1)); //filter.IgnoreOrgRule = true; //filter.OrgId = null; //filter.IsSpecifyDb = true; //filter.SpecifyTenant = tenant; //filter.IgnoreDataRule = true; //result = GetEntity(e => !e.IS_DELETED, filter, null); //前端处理Tenant filter.IgnoreOrgRule = true; filter.OrgId = null; result = GetEntity(e => !e.IS_DELETED, filter, null); } else { result = GetEntity(null, filter, null); if (result != null) { if (result.APPROVE_TEMP_ID != null) { var approveTemp = this.GetEntity(t => t.ID == result.APPROVE_TEMP_ID); if (approveTemp != null) result.REJECT_INTERFACE = approveTemp.REJECT_INTERFACE; } result.Nav_ApproveDetails = result.Nav_ApproveDetails.OrderBy(t => t.NUM).ThenBy(m => m.MODIFY_TIME).ToList(); } } return result; }); } /// /// 驳回单据 /// /// 对象实体 /// [HttpPost, Route("Reject")] public JsonActionResult Reject([FromBody] T_PF_APPROVE entity) { return base.SafeExecute(() => { var ret = string.Empty; var dbApprove = this.GetEntity(entity.ID.ToString(), false, "Nav_ApproveDetails"); if (dbApprove == null) this.ThrowError("020027"); if (dbApprove.APPROVE_STATUS != (int)ApproveStatus.Doing) this.ThrowError("020028"); var node = dbApprove.Nav_ApproveDetails.FirstOrDefault(i => i.ID == entity.CurrentNode.ID); if (!node.IS_CURRENT) this.ThrowError("020030"); //查询消息表 var task = this.GetEntity(i => i.SOURCE_DATA_ID == entity.ID && i.USER_ID == node.APPROVE_USER_ID && i.NOTICE_STATUS == FMNoticeStatusEnum.未处理.GetInt(), false); if (task != null) { task.NOTICE_STATUS = FMNoticeStatusEnum.正常已办.GetInt(); task.TASK_DT = DateTime.Now; if (DateTime.Now > task.TASK_ENDDT) task.NOTICE_STATUS = FMNoticeStatusEnum.超期办理.GetInt(); } //修改节点状态 node.NODE_APPROVE_TIME = DateTime.Now; node.NODE_APPROVE_STATUS = entity.CurrentNode.NODE_APPROVE_STATUS; node.IS_CURRENT = false; node.CONTEXT = entity.CurrentNode.CONTEXT; //驳回时状态改为驳回,并通知申请人重新提交 dbApprove.APPROVE_STATUS = ApproveStatus.Reject.GetInt(); var details = dbApprove.Nav_ApproveDetails; dbApprove.Nav_ApproveDetails = null; details.ForEach(i => i.Nav_Approve = null); var rejectInfo = this.GetEntity(t => t.ID == dbApprove.APPROVE_TEMP_ID); if (rejectInfo != null && !string.IsNullOrEmpty(rejectInfo.REJECT_INTERFACE)) ret = rejectInfo.REJECT_INTERFACE; else this.ThrowError("020030"); UnifiedCommit(() => { if (task != null) this.UpdateEntityNoCommit(task); this.UpdateEntityNoCommit(dbApprove); this.BantchUpdateEntityNoCommit(details); }); return ret; }); } /// /// 获取驳回意见 /// /// /// [HttpPost, Route("GetRejectContent")] public JsonActionResult GetRejectContent(string id) { return base.SafeExecute(() => { var result = string.Empty; var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId; var newFilter = new BaseFilter(orgId); newFilter.SelectField = new List { "Nav_ApproveDetails" }; var approveInfo = this.GetEntities(t => t.DATA_ID == Guid.Parse(id), newFilter).OrderByDescending(m => m.CREATE_TIME).FirstOrDefault(); if (approveInfo != null && approveInfo.Nav_ApproveDetails.Any()) { var detail = approveInfo.Nav_ApproveDetails.FirstOrDefault(t => t.NODE_APPROVE_STATUS == 20); if (detail != null) { var userInfo = this.GetEntity(t => t.ID == detail.APPROVE_USER_ID && t.ENABLE_STATUS == 0); result = userInfo?.NAME + "驳回,内容:" + detail.CONTEXT; } } return result; }); } /// /// 获取驳回原因 /// /// /// [HttpGet, Route("GetRejectContentByAPPID")] public JsonActionResult GetRejectContentByAPPID(string ApproveID) { return SafeExecute(() => { if (string.IsNullOrEmpty(ApproveID)) { throw new Exception("传参有误"); } var appID = Guid.Empty; try { appID = new Guid(ApproveID); } catch { throw new Exception("传参有误"); } var approveDetail = GetEntity(e => e.APPROVE_ID == appID && !e.ISCANCEL && e.NODE_APPROVE_STATUS == 20); if (approveDetail != null) { var userInfo = this.GetEntity(t => t.ID == approveDetail.APPROVE_USER_ID); if (DataHelper.GetRequestType(Request.Headers) == 2) { return approveDetail.CONTEXT + "\r\n" + (userInfo != null ? userInfo.NAME + "(" + approveDetail.MODIFY_TIME.Value.ToString("yyyy-MM-dd HH:mm") + ")" : approveDetail.MODIFY_TIME.Value.ToString("yyyy-MM-dd HH:mm")); } else { return userInfo?.NAME + " 驳回内容:" + approveDetail.CONTEXT; } } else { throw new Exception("未获取到驳回信息!"); } }); } /// /// 记录回调失败LOG /// /// /// [HttpPost, Route("AddLog")] public JsonActionResult AddLog([FromBody] T_PF_APPROVE entity) { return base.SafeExecute(() => { var loginUserId = APT.Infrastructure.Api.AppContext.CurrentSession.UserID; string data = "APPROVE:" + JsonConvert.SerializeObject(entity); SysLogService.AddLog(entity.ORG_ID.Value, loginUserId.Value, PFSysLogTypeEnum.FaildApproveCallBack, "PF119", "审批流回调失败-hmr记录", string.IsNullOrEmpty(entity.CALLBACK_INTERFACE) ? "" : "未执行回调:" + (entity.CALLBACK_INTERFACE + "ID=(" + entity.ID + ")&" + "DATA_ID=(" + entity.DATA_ID + ")"), data); return true; }); } /// /// 根据数据id获取审核id /// /// 参数 /// [HttpPost, Route("GetApproveInfo")] public JsonActionResult> GetApproveInfo([FromBody] KeywordFilter keywordFilter) { return SafeExecute>(() => { Guid dataId = new Guid(keywordFilter.Keyword); bool isAPPROVEID = false; if (string.IsNullOrEmpty(keywordFilter.Keyword)) this.ThrowError("020005"); if (!string.IsNullOrEmpty(keywordFilter.Parameter2)) { #region 反射demo 行255 var parms = keywordFilter.Parameter2.Split(','); string tableName = parms[0]; string attribute = parms[1]; var dbType = APT.Infrastructure.Core.Refctor.ReflectHelper.FindTypeInCurrentDomain(tableName); if (dbType != null) { //var mt = this.GetType().GetMethods().OrderBy(e => e.Name).ToList(); if (keywordFilter.Parameter2 == "T_BS_RISK_SUBMIT_NOTICE,RISK_SUBMIT_ID") { //标准化执行 > 安全检查管理 > 手动隐患上报 MethodInfo methodInfo = this.GetType().GetMethod("GetMyEntity2", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); Expression> expression2 = e => e.RISK_SUBMIT_ID == dataId; var modelNo = methodInfo.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { expression2 }); //T_BS_RISK_SUBMIT_NOTICE modelNo = GetEntity(e => e.RISK_SUBMIT_ID == dataId); if (modelNo != null) dataId = new Guid(dbType.GetProperty("ID").GetValue(modelNo).ToString()); else return null; //throw new Exception("未获取到审批流信息!"); } else if (keywordFilter.Parameter2 == "T_BS_SAFE_CHECK,APPROVE_CHECKAUDIT_ID") { MethodInfo methodInfo = this.GetType().GetMethod("GetMyEntity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); var entity = methodInfo.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { dataId }); if (entity != null) { var prop = dbType.GetProperty(attribute).GetValue(entity); if (prop != null) { dataId = new Guid(prop.ToString()); isAPPROVEID = true; } else { dataId = Guid.Empty; } } } else if (keywordFilter.Parameter2 == "T_BS_SAFE_CHECK,APPROVE_ID") { MethodInfo methodInfo = this.GetType().GetMethod("GetMyEntity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); var entity = methodInfo.MakeGenericMethod(new Type[] { dbType }). Invoke(this, new object[] { dataId }); if (entity != null) { var prop = dbType.GetProperty(attribute).GetValue(entity); if (prop != null) { dataId = new Guid(prop.ToString()); isAPPROVEID = true; } else { dataId = Guid.Empty; } } } } #endregion ////以这种形式传参查看反射实现 一劳永逸 //if (keywordFilter.Parameter2 == "T_BS_RISK_SUBMIT_NOTICE,RISK_SUBMIT_ID") //{ // T_BS_RISK_SUBMIT_NOTICE modelNo = GetEntity(e => e.RISK_SUBMIT_ID == dataId); // if (modelNo != null) // dataId = modelNo.ID; // else // return null; // //throw new Exception("未获取到审批流信息!"); //} //else if (keywordFilter.Parameter2 == "T_BS_SAFE_CHECK,APPROVE_CHECKAUDIT_ID") //{ // var T_BS_SAFE_CHECK = GetEntity(e => e.ID == dataId); // if (T_BS_SAFE_CHECK != null && T_BS_SAFE_CHECK.APPROVE_CHECKAUDIT_ID.HasValue) // { // dataId = T_BS_SAFE_CHECK.APPROVE_CHECKAUDIT_ID.Value; // isAPPROVEID = true; // } // else // { // dataId = Guid.Empty; // } //} } Expression> expression = e => e.DATA_ID == dataId; if (isAPPROVEID) { expression = e => e.ID == dataId; } if (!string.IsNullOrEmpty(keywordFilter.Parameter1)) { expression = expression.And(e => e.PARAM == keywordFilter.Parameter1); } var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId; var dbApprove = this.GetEntities(expression, new BaseFilter(keywordFilter.OrgId), new string[] { "Nav_ApproveDetails.Nav_ApproveUser" }).OrderByDescending(t => t.CREATE_TIME).ToList(); if (!dbApprove.Any()) return null; return dbApprove; }); } public bool MeetingMinutesBack(string id) { //状态修改 Guid MeetingMinutesId = new Guid(id); T_SC_MT_MEETING_MINUTES entity = GetEntity(MeetingMinutesId); entity.STATUS = PFStandardStatus.Archived;//变成已归档 this.UnifiedCommit(() => { if (entity != null) UpdateEntityNoCommit(entity); }); return true; } /// /// 工作票回调函数 /// /// /// private bool BackUpdate_FOJobCrucialLicense(string id, Action action) { //var entity = this.GetEntity(id, false, "Nav_OperationStep", "Nav_ApplyUser", "Nav_CrucialLicensePerson"); var entity = this.GetEntity(id, new string[] { "Nav_OperationStep", "Nav_ApplyUser", "Nav_CrucialLicensePerson" });// wyw entity.IS_PUBLISH = (int)FOPreMeetingStatusEnum.签到中; //触发技术交底表 var tech = new T_FO_TECH_DISCLOSURE_FROM(); var techUsers = new List(); var notices = new List(); var techForm = this.GetEntity(t => t.JOB_NAME_ID == entity.ID); if (techForm == null) { //取审批流水码 var sysFilter = new SystemCodeFilter(); sysFilter.CodeType = (int)PFCodeRuleType.技术交底表编号; sysFilter.Count = 1; sysFilter.OrgId = entity.ORG_ID; var codes = CodeRuleService.NewGenSerial(sysFilter); var codeList = codes.Split(new char[] { ',' }); //主表 tech.CODE = codeList[0]; tech.ORG_ID = entity.ORG_ID; tech.OPERATION_STEP_ID = entity.OPERATION_STEP_ID; tech.JOB_NAME_ID = entity.ID; tech.JOB_LOCATION = entity.JOB_LOCATION; tech.DISCLOSURE_PERSON_ID = entity.APPLY_USER_ID; tech.IS_AUTO = (int)ISImportantEnum.是; tech.IS_OUTSOURCE = false; tech.RELATED_ID = null; if (entity.MONITOR_USER_ID != null) { T_FO_TECH_DISCLOSURE_PERSON person = new T_FO_TECH_DISCLOSURE_PERSON(); person.ORG_ID = entity.ORG_ID; person.USER_ID = entity.MONITOR_USER_ID; person.TECH_DISCLOSURE_FROM_ID = tech.ID; person.CREATER_ID = entity.CREATER_ID; techUsers.Add(person); } if (entity.Nav_CrucialLicensePerson != null && entity.Nav_CrucialLicensePerson.Any()) { entity.Nav_CrucialLicensePerson.ForEach(t => { T_FO_TECH_DISCLOSURE_PERSON person = new T_FO_TECH_DISCLOSURE_PERSON(); person.ORG_ID = t.ORG_ID; person.USER_ID = t.USER_ID; person.TECH_DISCLOSURE_FROM_ID = tech.ID; person.CREATER_ID = t.CREATER_ID; techUsers.Add(person); }); } techUsers = techUsers.Where(m => m.USER_ID != null).Distinct(t => t.USER_ID).ToList(); var userIds = entity.Nav_CrucialLicensePerson.Select(t => (Guid)t.USER_ID).Distinct().ToList(); //if (!userIds.Contains((Guid)entity.MONITOR_USER_ID)) //{ // techUsers.Where(t => t.USER_ID == entity.MONITOR_USER_ID).ForEach(m => m.DEAL_STATUS = FOUserShiftStatusEnum.已处理); //} var UserNames = new List(); var user = this.GetEntities(t => t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用 && (userIds.Contains(t.ID) || t.ID == entity.APPLY_USER_ID), new BaseFilter(entity.ORG_ID)); var userFirst = user.FirstOrDefault(t => t.ID == entity.APPLY_USER_ID); foreach (var u in userIds) { var current = user.FirstOrDefault(t => t.ID == u); UserNames.Add(current?.NAME); } //DateTime dtEnd = NotificationTaskService.GetTaskEndTime(FMTASKTYPE.JobSite, entity.ORG_ID.Value, DateTime.Now, null, null); if (userFirst != null) { notices.Add(NotificationTaskService.InsertUserNoticeTaskModel("安全技术交底表(" + entity.JOB_DATE.Value.ToShortDateString().Replace("/", "") + ")", tech.ID, entity.ORG_ID, entity.APPLY_USER_ID.Value, userFirst?.NAME, DateTime.Now, entity.JOB_DATE.Value, (int)FMNoticeTypeEnum.消息, "FO019")); } if (userIds != null && userIds.Any()) { notices.AddRange(NotificationTaskService.InsertUserNoticeTaskModels("关键作业/许可作业工作票确认(" + entity.JOB_DATE.Value.ToShortDateString().Replace("/", "") + ")", entity.ID, entity.ORG_ID, userIds, UserNames, DateTime.Now, entity.JOB_DATE.Value, (int)FMNoticeTypeEnum.消息, "FO017_SHOWPRINT")); } } else { entity.IS_PUBLISH = (int)FOPreMeetingStatusEnum.归档; tech = null; techUsers = null; notices = null; } UnifiedCommit(() => { if (entity != null) this.UpdateEntityNoCommit(entity); if (notices != null && notices.Any()) this.BantchSaveEntityNoCommit(notices); if (tech != null) this.UpdateEntityNoCommit(tech); if (techUsers != null && techUsers.Any()) this.BantchSaveEntityNoCommit(techUsers); if (action != null) action(); }); return true; } private bool BackUpdate_FOJobEventRecord(string id, Action action) { var entity = this.GetEntity(id, "Nav_Details"); entity.FORM_STATUS = (int)FOTeamActivityState.已归档; UnifiedCommit(() => { if (entity != null) this.UpdateEntityNoCommit(entity); if (action != null) action(); }); return true; } } }