using BaseOUDAL; using YLErp.BLL; using YLErp.DBModels.Enums; using YLErp.Model; using YLErp.Modules.ClientModule; using YLErp.Modules.SalesModule; using YLErp.Modules.TradeModule.DealModule; namespace YLErp.Modules.ApprovalModule { public class ApprovalService : YLBaseService { public ApprovalService(OptUserInfo userInfo) : base(userInfo) { } /// /// 查询接口审批记录 /// /// /// public SearchListResult QueryInterfaceApproval(ApprovalReq req) { if (req.optDateEnd < DateTime.MaxValue.Date) { req.optDateEnd = req.optDateEnd.AddDays(1); } var query = DbContext.ApprovalResult.Where(O => O.OptDate >= req.optDateStart && O.OptDate < req.optDateEnd); if (req.type != 0) { query = query.Where(O => O.type == req.type); } if (req.linkStatus.HasValue) { if (req.linkStatus.Value) { query = query.Where(O => O.LinkCode != ""); } else { query = query.Where(O => O.LinkCode == ""); } } if (!string.IsNullOrWhiteSpace(req.linkCode)) { query = query.Where(O => O.LinkCode == req.linkCode); } return query.ToSearchList(req); } /// /// 执行交易审批操作 /// /// /// private TradeOpenResult TradeApproval(TradeOpenReqModel req) { var tradeResult = new TradeOpenService(UserInfo).UpdateTradeProcessLog(req); if ((tradeResult.RetCode == TradeOpenRetCode.None && string.IsNullOrWhiteSpace(tradeResult.ErrorMsg)) || tradeResult.RetCode == TradeOpenRetCode.Success) { if (req.status == "pass") { var trade = tradeResult.Trade; //生成确认书 if (PS.Config.IsAutoGenerateContracts && (trade.TradeStatus == ConsTrade.确认成交 || ConsTrade.TradeCompleteStatus.Contains(trade.TradeStatus))) { var contractType = "其它"; if (trade.TradeStatus == ConsTrade.确认成交 && trade.HasPartialUnWind != 1) { contractType = "确认书"; } //修改销售提成的状态 new SalesCommissionDataService(this).SetCommissionVaild(trade.id); new TradeContractGenerateService(this).GenerateContractsAsync(new List { req.tradeId }, contractType); } } } return tradeResult; } /// /// 接口审批自动关联系统记录 /// /// /// /// public bool ApprovalResult(ApprovalResult obj, out string message) { var optStatus = true; var useSave = true; try { switch (obj.type) { case 1://交易审批状态变更 var tradeInfo = base.DbContext.trade.Where(O => O.TradeNumber == obj.code).FirstOrDefault(); if (tradeInfo == null || tradeInfo.id <= 0) { throw new ServiceException("未查询到匹配的编号,请确保交易编号正确"); } if (tradeInfo.TradeStatus != ConsTrade.审批中 && tradeInfo.TradeStatus != ConsTrade.行权待复核 && tradeInfo.TradeStatus != ConsTrade.平仓待复核 && tradeInfo.TradeStatus != ConsTrade.互换待复核) { throw new ServiceException($"当前交易状态为:{tradeInfo.TradeStatus},不可操作"); } var tradeResult = TradeApproval(new TradeOpenReqModel { tradeId = tradeInfo.id, status = obj.status ? "pass" : "reject", comments = "", ignoreMoneyCheck = false, }); if ((tradeResult.RetCode == TradeOpenRetCode.None && string.IsNullOrWhiteSpace(tradeResult.ErrorMsg)) || tradeResult.RetCode == TradeOpenRetCode.Success) { message = "操作成功"; //记录审核日志 DbContext.TradeAuditLog.Add(new TradeAuditLog { TradeId = tradeInfo.id, Changes = $"历史备注:{tradeInfo.Comments}", DataType = "00", OptId = UserId, OptName = UserName, OptDate = OptDate, OptType = "关联审批", AuditFlag = TradeAuditFlag.operation }); tradeInfo.Comments = obj.remark; return optStatus; } throw new ServiceException(tradeResult.ErrorMsg); case 2://客户审批状态变更 using (var db = DbContextFactory.GetClientDbContext(UserInfo)) { var clientInfo = db.client.Where(O => O.Name == obj.code).FirstOrDefault(); if (clientInfo == null) { throw new ServiceException("未查询到匹配的客户,请确保客户名称正确"); } if (clientInfo.ApprovalStatus != "审批中") { throw new ServiceException($"当前客户状态为:{clientInfo.ProcessStatus},审批状态为:{clientInfo.ApprovalStatus}不可操作"); } var msg = new ClientProcessLogService(UserInfo).UpdateProcessLog(clientInfo.id, obj.status ? "pass" : "reject", ""); if (msg?.Trim() != "提交成功") { throw new ServiceException(msg); } message = "操作成功"; //记录审核日志 db.ClientAuditLog.Add(new ClientAuditLog { ClientId = clientInfo.id, Changes = $"历史备注:{clientInfo.Remark}", OptId = UserId, OptName = UserName, OptDate = OptDate, DataType = "00", OptType = "关联审批" }); clientInfo.Remark = obj.remark; db.SaveChanges(); return optStatus; } case 3://资金审批状态变更 var cashInfo = DbContext.ClientCashInCashOut.Where(e => e.ValidState != "InValid" && e.Number == obj.code).FirstOrDefault(); if (cashInfo == null) { throw new ServiceException("未查询到匹配的资金记录,请确保资金编号正确"); } if (cashInfo.State != "未确认") { throw new ServiceException($"当前资金状态为:{cashInfo.State},不可操作"); } executeCashApproval(cashInfo, obj.status); DbContext.clientcash_log.Add(new ClientCashLog { CashId = cashInfo.id, OptType = "关联审批", Changes = $"历史备注:{cashInfo.Comments}", OptId = UserId, OptName = UserName, OptDate = DateTime.Now, }); cashInfo.Comments = obj.remark; message = "操作成功"; return optStatus; default: useSave = false; throw new ServiceException("未知操作类型"); } } catch (Exception ex) { optStatus = false; obj.errorMsg = ex.Message.Length > 200 ? ex.Message.Substring(0, 200) : ex.Message; message = useSave ? "信息已接收" : ex.Message; return optStatus; } finally { if (useSave) { obj.LinkCode = optStatus ? obj.code : ""; obj.errorMsg = obj.errorMsg ?? ""; obj.OptDate = DateTime.Now; obj.OptId = UserInfo.UserId; obj.OptName = UserInfo.UserName; DbContext.ApprovalResult.Add(obj); DbContext.SaveChanges(); } } } /// /// 接口审批手动关联系统记录 /// /// 接口审批记录Id /// 要关联的系统记录代码 /// public TradeCheckResult ApprovalResult(int approvalResultId, string code, string additionalProcessing) { TradeCheckResult result = null; var approvalInfo = DbContext.ApprovalResult.Where(O => O.id == approvalResultId).FirstOrDefault(); if (approvalInfo == null) { throw new ServiceException("审批记录不存在,请刷新后重试"); } switch (approvalInfo.type) { case 1: result = TradeApproval(approvalInfo, code, additionalProcessing); break; case 2: result = ClientApproval(approvalInfo, code); break; case 3: result = CashApproval(approvalInfo, code); break; default: result = new TradeCheckResult() { success = false, message = "未知操作类型" }; break; } return result; } /// /// 交易审批状态 /// /// 接口审批信息 /// 要关联的系统记录代码 /// private TradeCheckResult TradeApproval(ApprovalResult approvalInfo, string code, string additionalProcessing) { TradeCheckResult result = null; var trade = DbContext.trade.Where(O => O.TradeNumber == code).FirstOrDefault(); if (trade == null) { throw new ServiceException("未查询到匹配的交易记录,请确保交易编号正确"); } try { if (trade.TradeStatus == ConsTrade.审批中 || trade.TradeStatus == ConsTrade.行权待复核 || trade.TradeStatus == ConsTrade.平仓待复核 || trade.TradeStatus == ConsTrade.互换待复核) { var tradeResult = TradeApproval(new TradeOpenReqModel { tradeId = trade.id, status = approvalInfo.status ? "pass" : "reject", comments = "", ignoreMoneyCheck = additionalProcessing == tradeBLL.LackOfMoney, }); //如果客户缺少资金而交易特批已开启 if (tradeResult.RetCode == TradeOpenRetCode.LackOfMoney && (valuedateBLL.SystemDate.SpecialOperateForTrade == 1)) { result = new TradeCheckResult() { proccessType = "AdditionalProcessing", type = tradeBLL.LackOfMoney, message = tradeResult.ErrorMsg, success = false }; } else if ((tradeResult.RetCode == TradeOpenRetCode.None && string.IsNullOrWhiteSpace(tradeResult.ErrorMsg)) || tradeResult.RetCode == TradeOpenRetCode.Success) { result = new TradeCheckResult() { success = true }; } else { result = new TradeCheckResult() { success = false, message = tradeResult.ErrorMsg }; } } else { result = new TradeCheckResult() { success = true }; } } finally { if (result.success) { //记录审核日志 DbContext.TradeAuditLog.Add(new TradeAuditLog { TradeId = trade.id, Changes = $"历史备注:{trade.Comments}", DataType = "00", OptId = UserId, OptName = UserName, OptDate = OptDate, OptType = "关联审批", AuditFlag = TradeAuditFlag.operation }); approvalInfo.LinkCode = code; trade.Comments = approvalInfo.remark; DbContext.SaveChanges(); } } return result; } /// /// 客户审批状态 /// /// 接口审批信息 /// 要关联的系统记录代码 /// private TradeCheckResult ClientApproval(ApprovalResult approvalInfo, string code) { TradeCheckResult result = null; try { using (var db = DbContextFactory.GetClientDbContext(UserInfo)) { var clientInfo = db.client.Where(O => O.Name == code).FirstOrDefault(); if (clientInfo == null) { throw new ServiceException("未查询到匹配的客户,请确保客户名称正确"); } if (clientInfo.ApprovalStatus == "审批中") { var msg = new ClientProcessLogService(UserInfo).UpdateProcessLog(clientInfo.id, approvalInfo.status ? "pass" : "reject", ""); result = new TradeCheckResult { success = msg?.Trim() == "提交成功", message = msg }; if (!result.success) { throw new ServiceException(msg); } } else { result = new TradeCheckResult() { success = true }; //记录审核日志 db.ClientAuditLog.Add(new ClientAuditLog { ClientId = clientInfo.id, Changes = $"历史备注:{clientInfo.Remark}", OptId = UserId, OptName = UserName, OptDate = OptDate, DataType = "00", OptType = "关联审批" }); } approvalInfo.LinkCode = code; clientInfo.Remark = approvalInfo.remark; db.SaveChanges(); DbContext.SaveChanges(); } } catch (Exception ex) { result = new TradeCheckResult() { success = false, message = ex.Message }; } return result; } /// /// 资金审批状态 /// /// 接口审批信息 /// 要关联的系统记录代码 /// private TradeCheckResult CashApproval(ApprovalResult approvalInfo, string code) { TradeCheckResult result = null; try { var cashInfo = DbContext.ClientCashInCashOut.Where(e => e.ValidState != "InValid" && e.Number == code).FirstOrDefault(); if (cashInfo == null) { throw new ServiceException("未查询到匹配的资金记录,请确保资金编号正确"); } if (cashInfo.State == "未确认") { executeCashApproval(cashInfo, approvalInfo.status); } DbContext.clientcash_log.Add(new ClientCashLog { CashId = cashInfo.id, OptType = "关联审批", Changes = $"历史备注:{cashInfo.Comments}", OptId = UserId, OptName = UserName, OptDate = DateTime.Now, }); cashInfo.Comments = approvalInfo.remark; approvalInfo.LinkCode = code; DbContext.SaveChanges(); result = new TradeCheckResult() { success = true }; } catch (Exception ex) { result = new TradeCheckResult() { success = false, message = ex.Message }; } return result; } private void executeCashApproval(ClientCashInCashOut cashInfo, bool status) { var service = new ClientCashInCashOutDataService(UserInfo); var ids = new[] { cashInfo.id }; if (status) { service.ExcuteEntryExit(ids,null); if (cashInfo.Action == ClientCashInCashOut.人工操作_其他) { var tradeBuySell = DbContext.trade.Where(O => O.id == cashInfo.TradeId).Select(O => O.BuySell).FirstOrDefault(); var tc = new trade_cash { ValidState = "Valid", Status = TradeCashStatusEnum.已执行, ValueDate = cashInfo.HappenDate.Value, TradeId = cashInfo.TradeId ?? 0, TradeType = tradeBuySell, ExceciseType = "现金", Amount = cashInfo.Money.Value * -1, HappenedDate = cashInfo.HappenDate, OptId = UserId, OptName = UserName, OptDate = DateTime.Now, Action = ClientCashInCashOut.人工操作_其他 }; DbContext.trade_cash.Add(tc); //记录审核日志 DbContext.TradeAuditLog.Add(new TradeAuditLog { TradeId = cashInfo.TradeId ?? 0, DataType = "00", OptId = UserId, OptName = UserName, OptDate = OptDate, OptType = "关联审批", AuditFlag = TradeAuditFlag.operation }); } } else { var msg = service.ClientCashInCashOutReject(ids).ToString(); if (msg.Contains("拒绝失败")) { throw new ServiceException($"{msg}"); } } } } }