| using HslCommunication.WebSocket; | 
| using NetTaste; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_ApprovalRepository; | 
| using WIDESEA_Common.CommonEnum; | 
| using WIDESEA_Core; | 
| using WIDESEA_Core.BaseRepository; | 
| using WIDESEA_Core.BaseServices; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_IApprovalRepository; | 
| using WIDESEA_IApprovalService; | 
| using WIDESEA_ICheckRepository; | 
| using WIDESEA_ISystemRepository; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_ApprovalService | 
| { | 
|     public class ApprovalTaskService : ServiceBase<Dt_ApprovalTask, IApprovalTaskRepository>, IApprovalTaskService | 
|     { | 
|         private readonly IUnitOfWorkManage _unitOfWorkManage; | 
|         private readonly IApprovalFlowRepository _approvalFlowRepository; | 
|         private readonly IApprovalNodeRepository _approvalNodeRepository; | 
|         private readonly ICheckOrderRepository _checkOrderRepository; | 
|         private readonly WebSocketServer _webSocketServer; | 
|         private readonly ISys_UserRepository _userRepository; | 
|   | 
|         public IApprovalTaskRepository Repository => BaseDal; | 
|   | 
|         public ApprovalTaskService(IApprovalTaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IApprovalFlowRepository approvalFlowRepository, IApprovalNodeRepository approvalNodeRepository, ICheckOrderRepository checkOrderRepository, WebSocketServer webSocketServer, ISys_UserRepository userRepository) : base(BaseDal) | 
|         { | 
|             _unitOfWorkManage = unitOfWorkManage; | 
|             _approvalFlowRepository = approvalFlowRepository; | 
|             _approvalNodeRepository = approvalNodeRepository; | 
|             _checkOrderRepository = checkOrderRepository; | 
|             _webSocketServer = webSocketServer; | 
|             _userRepository = userRepository; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 审批同意 | 
|         /// </summary> | 
|         /// <param name="sourceKey">源主键</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent AuditAgree(int sourceKey) | 
|         { | 
|             try | 
|             { | 
|                 Dt_ApprovalFlow approvalFlow = _approvalFlowRepository.QueryFirst(x => x.FlowCode == "IQC"); | 
|                 if (approvalFlow == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未定义该审批流"); | 
|                 } | 
|                 List<Dt_ApprovalNode> approvalNodes = _approvalNodeRepository.QueryData(x => x.FlowId == approvalFlow.Id); | 
|                 if (approvalNodes == null || approvalNodes.Count <= 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未定义该审批流程节点"); | 
|                 } | 
|   | 
|                 Dt_ApprovalNode? currentNode = approvalNodes.FirstOrDefault(x => x.ApproverRole == App.User.RoleId); | 
|                 if (currentNode == null) | 
|                 { | 
|                     return WebResponseContent.Instance.OK($"未找到当前角色审批节点"); | 
|                 } | 
|   | 
|                 Dt_ApprovalTask approvalTask = BaseDal.QueryFirst(x => x.SourceKey == sourceKey && x.NodeId == currentNode.Id); | 
|                 if (approvalTask == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该审批数据"); | 
|                 } | 
|   | 
|                 if (approvalTask.Status != AuditStatusEnum.Auditing.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该审批已完成"); | 
|                 } | 
|   | 
|                 Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == sourceKey); | 
|                 if (checkOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到来源数据(质检单)"); | 
|                 } | 
|   | 
|                 Dt_ApprovalNode? nextNode = approvalNodes.Where(x => x.NodeSequence > currentNode.NodeSequence).OrderBy(x => x.NodeSequence).FirstOrDefault(); | 
|                 if (nextNode == null)//审批流程结束 | 
|                 { | 
|                     approvalTask.Status = AuditStatusEnum.Agree.ObjToInt(); | 
|   | 
|                     checkOrder.AuditStatus = AuditStatusEnum.Agree.ObjToInt(); | 
|                     _unitOfWorkManage.BeginTran(); | 
|                     _checkOrderRepository.UpdateData(checkOrder); | 
|   | 
|                     BaseDal.UpdateData(approvalTask); | 
|                     //BaseDal.DeleteAndMoveIntoHty(approvalTask, WIDESEA_Core.Enums.OperateTypeEnum.自动完成); | 
|   | 
|                     WebSocketSession? webSocketSession = _webSocketServer.OnlineSessions.FirstOrDefault(x => x.Url.Contains(approvalTask.ApplicantUserName)); | 
|                     if (webSocketSession != null) | 
|                     { | 
|                         _webSocketServer.SendClientPayload(webSocketSession, "同意"); | 
|                     } | 
|                     _unitOfWorkManage.CommitTran(); | 
|                 } | 
|                 else//进入下一级审批节点 | 
|                 { | 
|                     object obj = new | 
|                     { | 
|                         title = "IQC质检结果审批", | 
|                         formData = checkOrder, | 
|                         tableData = checkOrder.Details, | 
|                         message = "推送测试信息体", | 
|                         date = DateTime.Now.ToString(), | 
|                     }; | 
|                     List<Dt_ApprovalTask> approvalTasks = new List<Dt_ApprovalTask>(); | 
|                     List<string> userNames = new List<string>(); | 
|                     List<Sys_User> users = _userRepository.QueryData(x => x.RoleId == nextNode.ApproverRole); | 
|                     foreach (Sys_User user in users) | 
|                     { | 
|                         Dt_ApprovalTask newApprovalTask = new Dt_ApprovalTask() | 
|                         { | 
|                             FlowId = approvalFlow.Id, | 
|                             NodeId = nextNode.Id, | 
|                             ApplicantUserId = App.User.UserId, | 
|                             ApplicantUserName = user.UserName, | 
|                             Status = AuditStatusEnum.Auditing.ObjToInt(), | 
|                             AuditUser = user.UserName, | 
|                             SourceKey = approvalTask.SourceKey | 
|                         }; | 
|                         approvalTasks.Add(newApprovalTask); | 
|                         userNames.Add(user.UserName); | 
|                     } | 
|   | 
|                     approvalTask.Status = AuditStatusEnum.Agree.ObjToInt(); | 
|                     BaseDal.UpdateData(approvalTask); | 
|                     BaseDal.AddData(approvalTasks); | 
|                     foreach (string userName in userNames) | 
|                     { | 
|                         WebSocketSession? socketSessions = _webSocketServer.OnlineSessions.FirstOrDefault(x => x.Url.Contains(userName)); | 
|                         if (socketSessions != null) | 
|                         { | 
|                             _webSocketServer.SendClientPayload(socketSessions, obj.Serialize()); | 
|                         } | 
|                     } | 
|                 } | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 审批驳回 | 
|         /// </summary> | 
|         /// <param name="sourceKey">源主键</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent AuditReject(int sourceKey) | 
|         { | 
|             try | 
|             { | 
|                 Dt_ApprovalFlow approvalFlow = _approvalFlowRepository.QueryFirst(x => x.FlowCode == "IQC"); | 
|                 if (approvalFlow == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未定义该审批流"); | 
|                 } | 
|                 List<Dt_ApprovalNode> approvalNodes = _approvalNodeRepository.QueryData(x => x.FlowId == approvalFlow.Id); | 
|                 if (approvalNodes == null || approvalNodes.Count <= 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未定义该审批流程节点"); | 
|                 } | 
|   | 
|                 Dt_ApprovalNode? currentNode = approvalNodes.FirstOrDefault(x => x.ApproverRole == App.User.RoleId); | 
|                 if (currentNode == null) | 
|                 { | 
|                     return WebResponseContent.Instance.OK($"未找到当前角色审批节点"); | 
|                 } | 
|   | 
|                 Dt_ApprovalTask approvalTask = BaseDal.QueryFirst(x => x.SourceKey == sourceKey); | 
|                 if (approvalTask == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该审批数据"); | 
|                 } | 
|   | 
|                 if (approvalTask.Status != AuditStatusEnum.Auditing.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该审批已完成"); | 
|                 } | 
|   | 
|                 Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == sourceKey); | 
|                 if (checkOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到来源数据(质检单)"); | 
|                 } | 
|   | 
|                 approvalTask.Status = AuditStatusEnum.Reject.ObjToInt(); | 
|   | 
|                 checkOrder.AuditStatus = AuditStatusEnum.Reject.ObjToInt(); | 
|                 _unitOfWorkManage.BeginTran(); | 
|                 _checkOrderRepository.UpdateData(checkOrder); | 
|   | 
|                 BaseDal.UpdateData(approvalTask); | 
|                 //BaseDal.DeleteAndMoveIntoHty(approvalTask, WIDESEA_Core.Enums.OperateTypeEnum.自动完成); | 
|   | 
|                 WebSocketSession? webSocketSession = _webSocketServer.OnlineSessions.FirstOrDefault(x => x.Url.Contains(approvalTask.ApplicantUserName)); | 
|                 if (webSocketSession != null) | 
|                 { | 
|                     _webSocketServer.SendClientPayload(webSocketSession, "驳回"); | 
|                 } | 
|                 _unitOfWorkManage.CommitTran(); | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|     } | 
| } |