699 lines
31 KiB
C#
699 lines
31 KiB
C#
using BaseOUDAL;
|
|
using DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle;
|
|
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
|
|
using OfficeOpenXml.FormulaParsing.ExpressionGraph;
|
|
using System.Linq;
|
|
using System.Linq.Expressions;
|
|
using YLErp.BLL.Eod;
|
|
using YLErp.DBModels;
|
|
using YLErp.Model.Enum;
|
|
|
|
namespace YLErp.Modules.SystemModule
|
|
{
|
|
/// <summary>
|
|
/// 审批流程业务服务
|
|
/// </summary>
|
|
public class ApprovalProcessService : YLBaseService
|
|
{
|
|
public ApprovalProcessService(OptUserInfo optUser) : base(optUser)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 添加审批流程(变更或删除)
|
|
/// </summary>
|
|
public int AddProcess(string type, List<ApprovalProcessAddRequest> data)
|
|
{
|
|
var clientQuery = DataCacheProvider.GetClientDataSource().AsQueryable();
|
|
|
|
var delList = DbContext.approvalprocess.Where(s => s.processType == type).ToArray();
|
|
|
|
DbContext.approvalprocess.RemoveRange(delList);
|
|
|
|
if (data != null && data.Count > 0)
|
|
{
|
|
data = data.OrderBy(s => s.Index).ToList();
|
|
|
|
var list = data.Select(item => new approvalprocess
|
|
{
|
|
processType = item.Type,
|
|
order = item.Index,
|
|
roleId = item.SelectValue,
|
|
ruleType = item.ApprovalRules,
|
|
approvalGroupId = item.approvalGroupId,
|
|
node = item.node,
|
|
parentNode = item.parentNode,
|
|
approvalCondition = item.approvalCondition
|
|
}).ToList();
|
|
|
|
DbContext.approvalprocess.AddRange(list);
|
|
}
|
|
|
|
if (type == "OpenProcess")
|
|
{
|
|
List<string> optTypes = new List<string>() { "提交开户审批", "重新提交开户审批" };
|
|
var clients = GetClients(optTypes);
|
|
if (data == null || data.Count == 0)
|
|
{
|
|
if (clients != null && clients.Count > 0)
|
|
{
|
|
throw new ServiceException("有用户在审批中,不能删除审批流程!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ChangeClientProcess(data, clients, delList);
|
|
}
|
|
}
|
|
else if (type == "TradeProcess")
|
|
{
|
|
|
|
if (data != null && data.Count > 0)
|
|
{
|
|
ChangeTradeProcess(data, delList);
|
|
}
|
|
else
|
|
{
|
|
var trade = DbContext.trade.Where(x => x.ValidState == "Valid" && (x.TradeStatus == ConsTrade.审批中 || x.TradeStatus == ConsTrade.平仓待复核 || x.TradeStatus == ConsTrade.行权待复核 || x.TradeStatus == ConsTrade.互换待复核)).ToList();
|
|
if (trade != null && trade.Count > 0)
|
|
{
|
|
throw new ServiceException("有交易在审批中,不能删除审批流程!");
|
|
}
|
|
}
|
|
}
|
|
else if (type == "CreditProcess")
|
|
{
|
|
if (data != null && data.Count == 0)
|
|
{
|
|
var credit = DbContext.credit.Where(x => x.ProcessOrderId > 1).ToList();
|
|
credit.ForEach(x => x.ProcessOrderId = 1);
|
|
var clientdb = DbContextFactory.GetClientDbContext(OptUser);
|
|
var clientrating = clientdb.Client_Rating.Where(x => !x.IsDeleted && x.ProcessOrderId > 1).ToList();
|
|
clientrating.ForEach(x => x.ProcessOrderId = 1);
|
|
clientdb.SaveChanges();
|
|
}
|
|
else
|
|
{
|
|
var credit = DbContext.credit.Where(x => x.ProcessStatus == "审批中").ToList();
|
|
if (credit != null && credit.Count > 0)
|
|
{
|
|
throw new ServiceException("有授信在审批中,不能删除审批流程!");
|
|
}
|
|
|
|
var clientrating = DbContextFactory.GetClientDbContext(OptUser).Client_Rating.Where(x => !x.IsDeleted && x.ProcessStatus == "审批中").ToList();
|
|
if (clientrating != null && clientrating.Count > 0)
|
|
{
|
|
throw new ServiceException("有资信评级在审批中,不能删除审批流程!");
|
|
}
|
|
}
|
|
}
|
|
else if (type == "OutCashProcess")
|
|
{
|
|
var clientCashs = DbContext.ClientCashInCashOut.Where(x => x.State == "审批中").ToList();
|
|
if (clientCashs != null && clientCashs.Count > 0)
|
|
{
|
|
if (data == null || data.Count == 0)
|
|
{
|
|
throw new ServiceException("有资金在审批中,不能删除审批流程!");
|
|
}
|
|
else
|
|
{
|
|
throw new ServiceException("有资金在审批中,不能修改审批流程!");
|
|
}
|
|
}
|
|
}
|
|
else if (type == "ClientProcess")
|
|
{
|
|
List<string> optTypes = new List<string>() { "提交信息变更审批" };
|
|
var clients = GetClients(optTypes);
|
|
if (data == null || data.Count == 0)
|
|
{
|
|
if (clients != null && clients.Count > 0)
|
|
{
|
|
throw new ServiceException("有用户在审批中,不能删除审批流程!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ChangeClientProcess(data, clients, delList);
|
|
}
|
|
}
|
|
return DbContext.SaveChanges();
|
|
}
|
|
#region 交易审批流程 私有方法
|
|
/// <summary>
|
|
/// 交易审批流程
|
|
/// </summary>
|
|
/// <param name="data">待保存数据</param>
|
|
/// <param name="delList">旧数据</param>
|
|
/// <param name="branchNode">分支节点</param>
|
|
/// <param name="processOrderId">节点</param>
|
|
/// <exception cref="ServiceException"></exception>
|
|
/// <exception cref="Exception"></exception>
|
|
private void ChangeTradeProcess(List<ApprovalProcessAddRequest> data, approvalprocess[] delList)
|
|
{
|
|
var trades = DbContext.trade.Where(x => x.ValidState == "Valid" && (x.TradeStatus == ConsTrade.审批中 || x.TradeStatus == ConsTrade.平仓待复核 || x.TradeStatus == ConsTrade.行权待复核 || x.TradeStatus == ConsTrade.互换待复核)).ToList();
|
|
var noGroupData = data.Where(x => x.approvalGroupId == 0);
|
|
var branch = data.Where(x => x.approvalGroupId != 0);//修改有分支
|
|
var groupId = UserBLL.GetApprovalProcessGroup(UserInfo.UserId);
|
|
var oldBranch = delList.Where(x => x.approvalGroupId != 0);//旧流程有分支
|
|
bool NotChange = false;//不允许修改
|
|
if (oldBranch.Count() == 0 && branch.Count() > 0)//旧流程无分支,新流程有分支
|
|
{
|
|
NotChange = true;
|
|
}
|
|
if (oldBranch.Count() > 0 && branch.Count() == 0)//旧流程有分支,新流程无分支
|
|
{
|
|
NotChange = true;
|
|
}
|
|
if (NotChange)
|
|
{
|
|
if (trades != null && trades.Count > 0)
|
|
{
|
|
throw new ServiceException("有交易在审批中,不能修改审批流程!");
|
|
}
|
|
}
|
|
|
|
if (branch.Count() > 0)//有分支情况
|
|
{
|
|
if (groupId == 0)
|
|
{
|
|
throw new Exception("该申请人不符合任何条件分支");
|
|
}
|
|
TradeProcessHasChange(data, delList, trades, groupId);
|
|
|
|
}
|
|
else //无分支情况直接修改
|
|
{
|
|
UpdateTradeAudit(ProcessTradeLog.审批中, 0);
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 回到审批初始节点
|
|
/// </summary>
|
|
/// <param name="processOrderId"></param>
|
|
/// <param name="branchNode"></param>
|
|
private void UpdateTradeAudit(int processOrderId, int oldBranchNode, bool all = false)
|
|
{
|
|
Expression<Func<trade, bool>> expression = x => x.ProcessOrderId >= ProcessTradeLog.审批中;
|
|
if (!all)
|
|
{
|
|
expression = expression.And(x => x.ProcessOrderBranch == oldBranchNode);
|
|
}
|
|
var trades = DbContext.trade.Where(expression).ToList();
|
|
trades.ForEach(x =>
|
|
{
|
|
x.ProcessOrderId = processOrderId;
|
|
x.CheckStatus = 0;
|
|
});
|
|
}
|
|
/// <summary>
|
|
/// 有分支情况有修改
|
|
/// </summary>
|
|
/// <param name="data">新数据</param>
|
|
/// <param name="delList">旧数据</param>
|
|
/// <param name="trades">交易数据</param>
|
|
/// <returns></returns>
|
|
private void TradeProcessHasChange(List<ApprovalProcessAddRequest> data, approvalprocess[] delList, List<trade> trades, int groupId)
|
|
{
|
|
|
|
var processOrderId = data.Min(s => s.Index);
|
|
var branchData = data.Where(x => x.approvalGroupId != 0);//修改有分支
|
|
var approvalConditionFirst = branchData.FirstOrDefault(x => x.approvalGroupId == groupId && x.approvalCondition == 1);//属于某个审批组
|
|
var approvalConditionSecend = branchData.FirstOrDefault(x => x.approvalGroupId != groupId && x.approvalCondition == 2);//不属于某个审批组
|
|
var approvalProcess = approvalConditionFirst == null ? approvalConditionSecend : approvalConditionFirst;
|
|
if (approvalProcess == null)
|
|
{
|
|
throw new Exception("该申请人不符合任何条件分支");
|
|
}
|
|
var branchNode = approvalProcess.node;
|
|
var branch = branchData.First();//分支节点所在位置
|
|
var dataIds = data.Where(x => x.id != 0).Select(s => s.id).ToList();
|
|
var changeNodeIndexs = ProcessChangeIndex(data, delList);
|
|
bool NotChange = false;//不允许修改
|
|
var firstBranchTrades = trades.Where(x => x.ProcessOrderBranch == 1).ToList();
|
|
var secondBranchTrades = trades.Where(x => x.ProcessOrderBranch == 2).ToList();
|
|
if (branch.Index == processOrderId)//跳过审批组流程
|
|
{
|
|
processOrderId = processOrderId + 1;
|
|
}
|
|
//判断数据是否有变更
|
|
if (changeNodeIndexs.Count > 0)
|
|
{
|
|
var firstChange = changeNodeIndexs.Any(x => x.node == 1);//分支1有修改
|
|
var secondChange = changeNodeIndexs.Any(x => x.node == 2);//分支2有修改
|
|
var main = data.Any(x => x.node == 0);//新流程有主干
|
|
var mainChange = changeNodeIndexs.Any(x => x.node == 0);//有主节点修改-包括新增&删除
|
|
if (main || mainChange)
|
|
{
|
|
if (firstChange || secondChange)// 分支不可修改
|
|
{
|
|
if (trades.Count > 0)//有交易审批,不允许修改
|
|
{
|
|
NotChange = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (mainChange && trades.Count > 0) //主节点修改回到初始
|
|
{
|
|
UpdateTradeAudit(processOrderId, 0, true);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (firstChange && secondChange)//分支1,2有修改
|
|
{
|
|
if (trades.Count > 0)//有交易审批,不允许修改
|
|
{
|
|
NotChange = true;
|
|
}
|
|
}
|
|
else if (firstChange && !secondChange)//只修改了分支1
|
|
{
|
|
if (firstBranchTrades.Count > 0)
|
|
{
|
|
NotChange = true;
|
|
}
|
|
|
|
}
|
|
else if (!firstChange && secondChange)//只修改了分支2
|
|
{
|
|
if (secondBranchTrades.Count > 0)
|
|
{
|
|
NotChange = true;
|
|
}
|
|
}
|
|
}
|
|
if (NotChange)
|
|
{
|
|
throw new ServiceException("有交易在审批中,不能修改审批流程!");
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
/// <summary>
|
|
/// 获取数据修改节点集合
|
|
/// </summary>
|
|
/// <param name="data">新数据</param>
|
|
/// <param name="oldList">旧数据</param>
|
|
/// <returns></returns>
|
|
private List<ApprovalProcessNode> ProcessChangeIndex(List<ApprovalProcessAddRequest> data, approvalprocess[] oldList)
|
|
{
|
|
List<ApprovalProcessNode> indexList = new List<ApprovalProcessNode>();
|
|
foreach (var item in oldList)//筛选删除的节点
|
|
{
|
|
ApprovalProcessNode upNode = new ApprovalProcessNode();
|
|
var addNode = data.FirstOrDefault(x => x.id == item.id);
|
|
if (addNode == null)
|
|
{
|
|
upNode.node = item.node ?? 0;
|
|
upNode.Index = item.order;
|
|
indexList.Add(upNode);
|
|
}
|
|
}
|
|
foreach (ApprovalProcessAddRequest item in data)//筛选新增及修改节点
|
|
{
|
|
ApprovalProcessNode upNode = new ApprovalProcessNode();
|
|
if (item.id == 0)
|
|
{
|
|
upNode.node = item.node;
|
|
upNode.Index = item.Index;
|
|
indexList.Add(upNode);
|
|
}
|
|
var oldData = oldList.FirstOrDefault(x => x.id == item.id);
|
|
if (oldData != null)
|
|
{
|
|
if (item.approvalGroupId != oldData.approvalGroupId
|
|
|| item.approvalCondition != oldData.approvalCondition
|
|
|| item.ApprovalRules != oldData.ruleType
|
|
|| item.SelectValue != oldData.roleId)
|
|
{
|
|
upNode.node = item.node;
|
|
upNode.Index = item.Index;
|
|
indexList.Add(upNode);
|
|
}
|
|
}
|
|
}
|
|
return indexList;
|
|
}
|
|
|
|
#endregion
|
|
#region 客户开户&客户信息
|
|
/// <summary>
|
|
/// 开户审批流程
|
|
/// </summary>
|
|
/// <param name="data">待保存数据</param>
|
|
/// <param name="delList">旧数据</param>
|
|
/// <param name="branchNode">分支节点</param>
|
|
/// <param name="processOrderId">节点</param>
|
|
/// <exception cref="ServiceException"></exception>
|
|
/// <exception cref="Exception"></exception>
|
|
private void ChangeClientProcess(List<ApprovalProcessAddRequest> data, List<Client> clients, approvalprocess[] delList)
|
|
{
|
|
var noGroupData = data.Where(x => x.approvalGroupId == 0);
|
|
var branch = data.Where(x => x.approvalGroupId != 0);//修改有分支
|
|
var groupId = UserBLL.GetApprovalProcessGroup(UserInfo.UserId);
|
|
var oldBranch = delList.Where(x => x.approvalGroupId != 0);//旧流程有分支
|
|
bool NotChange = false;//不允许修改
|
|
if (oldBranch.Count() == 0 && branch.Count() > 0)//旧流程无分支,新流程有分支
|
|
{
|
|
NotChange = true;
|
|
}
|
|
if (oldBranch.Count() > 0 && branch.Count() == 0)//旧流程有分支,新流程无分支
|
|
{
|
|
NotChange = true;
|
|
}
|
|
if (NotChange)
|
|
{
|
|
if (clients != null && clients.Count > 0)
|
|
{
|
|
throw new ServiceException("有用户在审批中,不能更改审批流程!");
|
|
}
|
|
}
|
|
|
|
if (branch.Count() > 0)//有分支情况
|
|
{
|
|
if (groupId == 0)
|
|
{
|
|
throw new Exception("该申请人不符合任何条件分支");
|
|
}
|
|
ClientProcessHasChange(data, delList, clients, groupId);
|
|
}
|
|
else //无分支情况直接修改
|
|
{
|
|
UpdateClientAudit(ProcessTradeLog.审批中, 0, clients);
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 回到审批初始节点
|
|
/// </summary>
|
|
/// <param name="processOrderId"></param>
|
|
/// <param name="branchNode"></param>
|
|
private void UpdateClientAudit(int processOrderId, int oldBranchNode, List<Client> clients, bool all = false)
|
|
{
|
|
var clientdb = DbContextFactory.GetClientDbContext(OptUser);
|
|
if (!all)
|
|
{
|
|
clients = clients.Where(x => x.ProcessOrderBranch == oldBranchNode).ToList();
|
|
}
|
|
var cids = clients.Select(x => x.id).ToList();
|
|
var range = clientdb.client_file_audit.Where(x => cids.Contains(x.ClientId)).ToList();
|
|
clientdb.client_file_audit.RemoveRange(range);
|
|
for (int i = 0; i < clients.Count; i++)
|
|
{
|
|
Client c = clientdb.client.Find(clients[i].id);
|
|
c.ApprovalOrderId = processOrderId;
|
|
}
|
|
clientdb.SaveChanges();
|
|
}
|
|
private List<Client> GetClients(List<string> optTypes)
|
|
{
|
|
var clientQuery = DataCacheProvider.GetClientDataSource().AsQueryable().Where(x => x.ApprovalOrderId >= ProcessTradeLog.审批中).ToList();
|
|
var clientdb = DbContextFactory.GetClientDbContext(OptUser);
|
|
var clientQuerys = from c in clientQuery
|
|
join audit in clientdb.ClientAuditLog.Where(x => optTypes.Contains(x.OptType)) on c.ApprovalLogId equals audit.id
|
|
select c;
|
|
var clients = clientQuerys.ToList();
|
|
return clients;
|
|
}
|
|
#endregion
|
|
/// <summary>
|
|
/// 有分支情况有修改
|
|
/// </summary>
|
|
/// <param name="data">新数据</param>
|
|
/// <param name="delList">旧数据</param>
|
|
/// <param name="trades">交易数据</param>
|
|
/// <returns></returns>
|
|
private void ClientProcessHasChange(List<ApprovalProcessAddRequest> data, approvalprocess[] delList, List<Client> clients, int groupId)
|
|
{
|
|
var processOrderId = data.Min(s => s.Index);
|
|
var branchData = data.Where(x => x.approvalGroupId != 0);//修改有分支
|
|
var approvalConditionFirst = branchData.FirstOrDefault(x => x.approvalGroupId == groupId && x.approvalCondition == 1);//属于某个审批组
|
|
var approvalConditionSecend = branchData.FirstOrDefault(x => x.approvalGroupId != groupId && x.approvalCondition == 2);//不属于某个审批组
|
|
var approvalProcess = approvalConditionFirst == null ? approvalConditionSecend : approvalConditionFirst;
|
|
if (approvalProcess == null)
|
|
{
|
|
throw new Exception("该申请人不符合任何条件分支");
|
|
}
|
|
var branchNode = approvalProcess.node;
|
|
var branch = branchData.First();//分支节点所在位置
|
|
var dataIds = data.Where(x => x.id != 0).Select(s => s.id).ToList();
|
|
var changeNodeIndexs = ProcessChangeIndex(data, delList);
|
|
bool NotChange = false;//不允许修改
|
|
var firstBranchClients = clients.Where(x => x.ProcessOrderBranch == 1).ToList();
|
|
var secondBranchClients = clients.Where(x => x.ProcessOrderBranch == 2).ToList();
|
|
if (branch.Index == processOrderId)//跳过审批组流程
|
|
{
|
|
processOrderId = processOrderId + 1;
|
|
}
|
|
//判断数据是否有变更
|
|
if (changeNodeIndexs.Count > 0)
|
|
{
|
|
var firstChange = changeNodeIndexs.Any(x => x.node == 1);//分支1有修改
|
|
var secondChange = changeNodeIndexs.Any(x => x.node == 2);//分支2有修改
|
|
var main = data.Any(x => x.node == 0);//新流程有主干
|
|
var mainChange = changeNodeIndexs.Any(x => x.node == 0);//有主节点修改-包括新增&删除
|
|
if (main || mainChange)
|
|
{
|
|
if (firstChange|| secondChange)// 分支不可修改
|
|
{
|
|
if (clients.Count > 0)//有交易审批,不允许修改
|
|
{
|
|
NotChange = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (mainChange&& clients.Count > 0) //主节点修改回到初始
|
|
{
|
|
UpdateClientAudit(processOrderId, 0, clients, true);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (firstChange && secondChange)//分支1,2有修改
|
|
{
|
|
if (clients.Count > 0)//有交易审批,不允许修改
|
|
{
|
|
NotChange = true;
|
|
}
|
|
}
|
|
else if (firstChange && !secondChange)//只修改了分支1
|
|
{
|
|
if (firstBranchClients.Count > 0)
|
|
{
|
|
NotChange = true;
|
|
}
|
|
|
|
}
|
|
else if (!firstChange && secondChange)//只修改了分支2
|
|
{
|
|
if (secondBranchClients.Count > 0)
|
|
{
|
|
NotChange = true;
|
|
}
|
|
}
|
|
}
|
|
if (NotChange)
|
|
{
|
|
throw new ServiceException("有用户在审批中,不能修改审批流程!");
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
/// <summary>
|
|
/// 投资规模审核
|
|
/// </summary>
|
|
public bool CheckTradeScale(trade trade)
|
|
{
|
|
var orderId = trade.ProcessOrderId;
|
|
var um = DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(trade.UnderlyingId);
|
|
if (um == null)
|
|
{
|
|
return true;
|
|
}
|
|
//2021/06/23 规模审批使用deltaCash
|
|
var UsedScale = 0.0;
|
|
// 如果是审批组
|
|
var tradeProcess = TradeProcess();
|
|
var orderIdCount = tradeProcess.Where(x => x.order == trade.ProcessOrderId);//判断是否有分支
|
|
int orderNode = orderIdCount.Count() > 1 ? trade.ProcessOrderBranch : 0;
|
|
if (orderIdCount.Count() == 1)
|
|
{
|
|
orderNode = orderIdCount.First().node ?? 0;
|
|
}
|
|
var roleId = tradeProcess.OrderBy(o => o.order).FirstOrDefault(o => o.order == orderId && o.node == orderNode && o.processType == "TradeProcess").roleId;
|
|
var approvalGrade = DbContext.approvalGrade.FirstOrDefault(o => o.RoleId == roleId && o.AssetId == trade.AssetId && o.Rule == RuleEnum.投资规模);
|
|
List<trade> trades;
|
|
var underlyingPrice = DataCacheProvider.GetUnderlyingDataSource();
|
|
|
|
trades = (from t in DbContext.trade
|
|
join u in DbContext.underlying_manager
|
|
on t.UnderlyingId equals u.id
|
|
where t.AssetId == trade.AssetId
|
|
&& t.TradeType != "结构化交易"
|
|
&& ConsTrade.PositionTradeStatusList.Contains(t.TradeStatus)
|
|
&& !ConsTrade.TradeTypesForHedge.Contains(t.TradeType)
|
|
&& t.ValidState != "InValid"
|
|
select t).ToList();
|
|
trades.Add(trade);
|
|
BLL.tradeBLL.SetFieldsByTradeType(trade);
|
|
if (trades != null && trades.Count > 0)
|
|
{
|
|
var riskList = RealtimePnlCalc.RealTimeRiskCalc(SystemValueDate, trades, underlyingPrice, new List<string> { "持仓" }, false, QdpModule.QdpPricingRequest.BASIC_PRICING);
|
|
UsedScale += riskList.Sum(o => (o.DeltaCash ?? 0));
|
|
}
|
|
if (approvalGrade != null)
|
|
{
|
|
return UsedScale <= (approvalGrade.DeltaCashScale ?? 0);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool CheckTradeScale(int enid)
|
|
{
|
|
var trade = DbContext.trade.FirstOrDefault(o => o.id == enid);
|
|
if (trade != null)
|
|
{
|
|
return CheckTradeScale(trade);
|
|
}
|
|
else
|
|
{
|
|
throw new ServiceException("未找到交易");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 仅审批投资规模的步骤
|
|
/// </summary>
|
|
/// <param name="trade"></param>
|
|
/// <returns>-2:该步骤存在字段审核没审核或者没有规模审核 -1:规模审核未过 0:审核直接通过 1:规模审核通过,之后的流程中存在字段审核</returns>
|
|
public int CheckTradeApprovalStep(trade trade, int userId, bool hadCheckParam = false)
|
|
{
|
|
var roles = UserBLL.GetRolesByUserId(userId).Select(o => o.Id);
|
|
var groupId = UserBLL.GetApprovalProcessGroup(userId);
|
|
var tradeProcess = TradeProcess();
|
|
bool approvalBranch = tradeProcess.Any(x => x.approvalGroupId != 0);//审批流程有分支情况
|
|
trade.ProcessOrderBranch = 0;
|
|
if (trade.ProcessOrderId <= 0)
|
|
{
|
|
if (approvalBranch)//审批流程有分支情况
|
|
{
|
|
//该审批组属于流程的审批组或该审批组不属于流程审批组
|
|
var tradeProessBranchQuery = tradeProcess.FirstOrDefault(x => (x.approvalGroupId == groupId && x.approvalCondition == 1) || (x.approvalGroupId != groupId && x.approvalCondition == 2));
|
|
if (tradeProessBranchQuery == null)//都没有情况
|
|
{
|
|
return -3;
|
|
}
|
|
trade.ProcessOrderId = ProcessTradeLog.审批中;
|
|
|
|
if (trade.ProcessOrderId >= tradeProessBranchQuery.order)
|
|
{
|
|
trade.ProcessOrderId = tradeProessBranchQuery.order + 1;//跳过审批组那一级
|
|
}
|
|
trade.ProcessOrderBranch = tradeProessBranchQuery.node ?? 1;//审批组分子
|
|
if (!tradeProcess.Any(x => x.order >= trade.ProcessOrderId && (x.node == trade.ProcessOrderBranch || x.node == 0)))//分支无需审批,直接通过
|
|
{
|
|
trade.ProcessOrderId = ProcessTradeLog.审批通过;
|
|
trade.CheckTradeUpdate = Convert.ToInt32(TradeCheckEnum.StatusOfNew);
|
|
trade.ProcessOptDate = DateTime.Now;
|
|
trade.ProcessStatus = ProcessTradeStatus.通过审批.ToString();
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
trade.ProcessOrderId = ProcessTradeLog.审批中;
|
|
}
|
|
}
|
|
// 如果是审批组
|
|
var orderIdCount = tradeProcess.Where(x => x.order == trade.ProcessOrderId);//判断是否有分支
|
|
int processOrderNode = orderIdCount.Count() > 1 ? trade.ProcessOrderBranch : 0;
|
|
if (orderIdCount.Count() == 1)
|
|
{
|
|
processOrderNode = orderIdCount.First().node ?? 0;
|
|
}
|
|
var NowProcess = tradeProcess.FirstOrDefault(o => o.order == trade.ProcessOrderId && o.node == processOrderNode && roles.Contains(o.roleId));
|
|
|
|
trade.TradeStatus = ConsTrade.审批中;
|
|
trade.ProcessStatus = ProcessTradeStatus.审批中.ToString();
|
|
trade.ProcessOptDate = DateTime.Now;
|
|
|
|
if (NowProcess != null && NowProcess.ruleType != null && (NowProcess.ruleType == "1" || (NowProcess.ruleType.Contains("1") && hadCheckParam)))
|
|
{
|
|
if (CheckTradeScale(trade))
|
|
{
|
|
var process = tradeProcess.FirstOrDefault(o => o.ruleType != null && o.ruleType.Contains("0") && o.order > NowProcess.order && o.node == processOrderNode);
|
|
if (process != null)
|
|
{
|
|
trade.ProcessOrderId = process.order;
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
trade.ProcessOrderId = ProcessTradeLog.审批通过;
|
|
trade.CheckTradeUpdate = Convert.ToInt32(TradeCheckEnum.StatusOfNew);
|
|
trade.ProcessOptDate = DateTime.Now;
|
|
trade.ProcessStatus = ProcessTradeStatus.通过审批.ToString();
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var lastScaleProcessOrder = tradeProcess.Where(o => o.ruleType.Contains("1")).Select(o => o.order).Max();
|
|
if (trade.ProcessOrderId >= lastScaleProcessOrder)
|
|
{
|
|
throw new ServiceException($"该交易'{trade.TradeNumber}'规模审批流程最后一步的审批角色对审批簿记的投资规模依然不足!");
|
|
}
|
|
trade.ProcessOrderId = trade.ProcessOrderId + 1;
|
|
}
|
|
return -1;
|
|
}
|
|
return -2;
|
|
|
|
}
|
|
/// <summary>
|
|
/// 获取所有交易审批节点
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<approvalprocess> TradeProcess()
|
|
{
|
|
var tradeOrders = DbContext.approvalprocess.Where(t => t.processType == "TradeProcess").OrderBy(o => o.order).ToList();
|
|
return tradeOrders;
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 添加审批流程请求
|
|
/// </summary>
|
|
public class ApprovalProcessAddRequest
|
|
{
|
|
public int id { get; set; }
|
|
public string Type { get; set; }
|
|
public int Index { get; set; }
|
|
public int SelectValue { get; set; }
|
|
public string ApprovalRules { get; set; }
|
|
|
|
public int approvalGroupId { get; set; }
|
|
|
|
public int node { get; set; }
|
|
public int parentNode { get; set; }
|
|
public int approvalCondition { get; set; }
|
|
}
|
|
/// <summary>
|
|
/// 审批流程修改节点
|
|
/// </summary>
|
|
public class ApprovalProcessNode
|
|
{
|
|
public int Index { get; set; }
|
|
public int node { get; set; }
|
|
}
|
|
}
|