using HslCommunication.WebSocket; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_External.ERPService; using WIDESEA_External.Model; using WIDESEA_IApprovalRepository; using WIDESEA_ICheckRepository; using WIDESEA_ICheckService; using WIDESEA_ISystemRepository; using WIDESEA_Model.Models; namespace WIDESEA_CheckService { public class CheckOrderService : ServiceBase, ICheckOrderService { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IApprovalFlowRepository _approvalFlowRepository; private readonly IApprovalNodeRepository _approvalNodeRepository; private readonly IApprovalTaskRepository _approvalTaskRepository; private readonly ISys_UserRepository _userRepository; private readonly WebSocketServer _webSocketServer; private readonly IInvokeERPService _invokeERPService; public CheckOrderService(ICheckOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IApprovalFlowRepository approvalFlowRepository, IApprovalNodeRepository approvalNodeRepository, IApprovalTaskRepository approvalTaskRepository, ISys_UserRepository userRepository, WebSocketServer webSocketServer, IInvokeERPService invokeERPService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _approvalFlowRepository = approvalFlowRepository; _approvalNodeRepository = approvalNodeRepository; _approvalTaskRepository = approvalTaskRepository; _userRepository = userRepository; _webSocketServer = webSocketServer; _invokeERPService = invokeERPService; } public WebResponseContent CommitAudit(int checkOrderId) { try { Dt_CheckOrder checkOrder = BaseDal.Db.Queryable().Where(x => x.CheckOrderId == checkOrderId).Includes(x => x.Details).First(); if (checkOrder == null) { return WebResponseContent.Instance.Error($"未找到该质检单"); } if (checkOrder.CheckOrderStatus != CheckOrderStatusEnum.Checked.ObjToInt()) { return WebResponseContent.Instance.Error($"该质检单还未检验完成"); } if (checkOrder.AuditStatus != AuditStatusEnum.NotCommited.ObjToInt()) { return WebResponseContent.Instance.Error($"该数据不可再次提交审批"); } 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? approvalNode = approvalNodes.OrderBy(x => x.NodeSequence).FirstOrDefault(); if (approvalNode == null) { return WebResponseContent.Instance.Error($"数据错误"); } List approvalTasks = new List(); List userNames = new List(); List users = _userRepository.QueryData(x => x.RoleId == approvalNode.ApproverRole); foreach (Sys_User user in users) { Dt_ApprovalTask approvalTask = new Dt_ApprovalTask() { FlowId = approvalFlow.Id, NodeId = approvalNode.Id, ApplicantUserId = App.User.UserId, ApplicantUserName = user.UserName, Status = AuditStatusEnum.Auditing.ObjToInt(), AuditUser = user.UserName }; approvalTasks.Add(approvalTask); userNames.Add(user.UserName); } _unitOfWorkManage.BeginTran(); _approvalTaskRepository.AddData(approvalTasks); checkOrder.AuditStatus = AuditStatusEnum.Auditing.ObjToInt(); BaseDal.UpdateData(checkOrder); object obj = new { title = "IQC质检结果审批", formData = checkOrder, tableData = checkOrder.Details, message = "推送测试信息体", date = DateTime.Now.ToString(), }; foreach (string userName in userNames) { WebSocketSession? socketSessions = _webSocketServer.OnlineSessions.FirstOrDefault(x => x.Url.Contains(userName)); if (socketSessions != null) { _webSocketServer.SendClientPayload(socketSessions, obj.Serialize()); } } _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent FeedbackCheckResult(int id) { try { Dt_CheckOrder checkOrder = Db.Queryable().Where(x => x.CheckOrderId == id).Includes(x => x.Details).First(); if (checkOrder == null) { return WebResponseContent.Instance.Error($"未找到质检单据"); } if(checkOrder.AuditStatus != AuditStatusEnum.Agree.ObjToInt()) { return WebResponseContent.Instance.Error($"审批未通过"); } List checkResults = new List(); foreach (var item in checkOrder.Details) { ERPCheckResult checkResult = new ERPCheckResult() { DefectCode = item.DefectCode, Note = item.Note, Quantity = item.Quantity.ToString(), Result = item.Result }; checkResults.Add(checkResult); } ERPCheckModel model = new ERPCheckModel() { Code = checkOrder.CheckOrderNo, CompanyId = "", Result = checkOrder.Result, CreatorCode = checkOrder.Creater, DefectedNote = checkOrder.DefectedNote, MaterialsCode = checkOrder.MaterielCode, PlantsId = "", QtyDefected = checkOrder.DefectedQuantity.GetValueOrDefault().ToString(), QtyInspected = checkOrder.ReceivedQuantity.ToString(), QtyQualified = checkOrder.QualifiedQuantity.GetValueOrDefault().ToString(), QtyReturn = checkOrder.ReturnQuantity.GetValueOrDefault().ToString(), QtyScrapped = checkOrder.ScrappedQuantity.GetValueOrDefault().ToString(), ReceiptCode = checkOrder.ReceiveOrderNo, ReceiveDate = "", SerNo = checkOrder.ReceiveDetailRowNo.ToString(), TestDate = "", UniqueTag = checkOrder.CheckOrderId.ToString(), Way = 1, Details = checkResults }; string response = _invokeERPService.InvokeCheckOrderApi(model); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } } }