Files
zszq-trs/YLErpDAL/Modules/ApprovalModule/ApprovalService.cs
T
2024-05-09 14:06:26 +08:00

465 lines
20 KiB
C#

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)
{
}
/// <summary>
/// 查询接口审批记录
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public SearchListResult<ApprovalResult> 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);
}
/// <summary>
/// 执行交易审批操作
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
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<int> { req.tradeId }, contractType);
}
}
}
return tradeResult;
}
/// <summary>
/// 接口审批自动关联系统记录
/// </summary>
/// <param name="obj"></param>
/// <param name="message"></param>
/// <returns></returns>
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();
}
}
}
/// <summary>
/// 接口审批手动关联系统记录
/// </summary>
/// <param name="approvalResultId">接口审批记录Id</param>
/// <param name="code">要关联的系统记录代码</param>
/// <returns></returns>
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;
}
/// <summary>
/// 交易审批状态
/// </summary>
/// <param name="approvalInfo">接口审批信息</param>
/// <param name="code">要关联的系统记录代码</param>
/// <returns></returns>
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;
}
/// <summary>
/// 客户审批状态
/// </summary>
/// <param name="approvalInfo">接口审批信息</param>
/// <param name="code">要关联的系统记录代码</param>
/// <returns></returns>
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;
}
/// <summary>
/// 资金审批状态
/// </summary>
/// <param name="approvalInfo">接口审批信息</param>
/// <param name="code">要关联的系统记录代码</param>
/// <returns></returns>
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}");
}
}
}
}
}