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, 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; } public WebResponseContent AuditAgree(int sourceKey) { try { Dt_ApprovalFlow approvalFlow = _approvalFlowRepository.QueryFirst(x => x.FlowCode == "IQC"); if (approvalFlow == null) { return WebResponseContent.Instance.Error($"未定义该审批流"); } List 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 approvalTasks = new List(); List userNames = new List(); List 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); } } public WebResponseContent AuditReject(int sourceKey) { try { Dt_ApprovalFlow approvalFlow = _approvalFlowRepository.QueryFirst(x => x.FlowCode == "IQC"); if (approvalFlow == null) { return WebResponseContent.Instance.Error($"未定义该审批流"); } List 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); } } } }