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); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |