/* Copyright (c) 2014 Holworth Software Co., Ltd. All rights reserved
*
* Create by huanglc@holworth.com at 2014-12-01 16:19:17
*
*/
using System;
using System.Text;
using System.Collections.Generic;
using Contract.IService;
using Framework;
using System.Collections;
using Contract.Domain;
using BaseService;
using Contract.IService;
using Contract.Domain.Enum.EnumList;
using Contract.Domain.Enum.EnumCommon;
using System.Linq;
using HRAModel.Sys.Enum;
namespace Bll
{
public class BasLimitConfigService : BaseService.EntityService<Contract.Domain.BasLimitConfig>, IBasLimitConfigService
{
private List<RskLimitObject> ProcessBusiStruc(string nodeId);
List<RskLimitObject> objList = new List<RskLimitObject>();
IList<BasLimitBusiStruc> list = BusiStructureService.GetParentList(int.Parse(nodeId));
foreach (var item in list)
{
RskLimitObject obj = new RskLimitObject();
obj.Topic = item.Name;
obj.LimitObjectId = int.Parse(item.Id);
obj.LimitObjectType = (int)Limit_Object.Limit_Object_BusiStruc;
objList.Add(obj);
}
return objList;
}
private List<RskLimitObject> ProcessProductGroup(string nodeId);
List<RskLimitObject> objList = new List<RskLimitObject>();
var root = new RskLimitObject() { Topic = "产品群", LimitObjectType = (int)Limit_Object.Limit_Object_BasProductGroup };
var rootExistInfo = new QueryInfo("RskLimitObject");
rootExistInfo.AddParam("LimitObjectType", (int)Limit_Object.Limit_Object_BasProductGroup);
rootExistInfo.Where.Add("exits", " and LimitObjectId is null");
var rootExists = Dao.GetTotalCount(rootExistInfo) > 0;
objList.Add(root);
IList<BasProductGroup> list = ProductGroupService.GetParentList(int.Parse(nodeId));
foreach (var item in list)
{
RskLimitObject obj = new RskLimitObject();
obj.Topic = item.ProductGroupName;
obj.LimitObjectId = int.Parse( item.Id);
obj.LimitObjectType =(int) Limit_Object.Limit_Object_BasProductGroup;
//if (root.Children == null)
//{
// root.Children = new List<RskLimitObject>();
//}
//if(item.Id==nodeId)
//root.Children.Add(obj);
objList.Add(obj);
}
if (list.Count == 0)
{
objList.Clear();
}
return objList;
}
public string TypeFilter(string type)
{
string result = "";
Limit_Object typeEnum = (Limit_Object)int.Parse(type);
switch (typeEnum)
{
case Limit_Object.Limit_Object_BusiStruc:
result += @"<option value='" + (int)Limit_Object.Limit_Object_BusiStruc + "'>" + Limit_Object.Limit_Object_BusiStruc.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCounterparty + "'>" + Limit_Object.Limit_Object_BasCounterparty.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasProductGroup + "'>" + Limit_Object.Limit_Object_BasProductGroup.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCurrency + "'>" + Limit_Object.Limit_Object_BasCurrency.GetEnumDefaultName() + "</option>";
break;
case Limit_Object.Limit_Object_BasCurrency:
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCurrency + "'>" + Limit_Object.Limit_Object_BasCurrency.GetEnumDefaultName() + "</option>";
break;
case Limit_Object.Limit_Object_BasProductGroup:
result += @"<option value='" + (int)Limit_Object.Credit_Rate + "'>" + Limit_Object.Credit_Rate.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasProductGroup + "'>" + Limit_Object.Limit_Object_BasProductGroup.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCurrency + "'>" + Limit_Object.Limit_Object_BasCurrency.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCounterparty + "'>" + Limit_Object.Limit_Object_BasCounterparty.GetEnumDefaultName() + "</option>";
break;
default:
result += @"<option value='" + (int)Limit_Object.Limit_Object_BusiStruc + "'>" + Limit_Object.Limit_Object_BusiStruc.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasProductGroup + "'>" + Limit_Object.Limit_Object_BasProductGroup.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCurrency + "'>" + Limit_Object.Limit_Object_BasCurrency.GetEnumDefaultName() + "</option>";
result += @"<option value='" + (int)Limit_Object.Limit_Object_BasCounterparty + "'>" + Limit_Object.Limit_Object_BasCounterparty.GetEnumDefaultName() + "</option>";
break;
}
return result;
}
public List<RskLimitObject> LoadNode();
public IList<RskLimitObject> AddNode(string nodeId, string nodeType,string selectedNodeTypeId, string selectedNodeId, string selectedNodeType)
{
List<RskLimitObject> objList = new List<RskLimitObject>();
List<RskLimitObject> limitList= LoadNode();
Limit_Object limitObj = (Limit_Object)(int.Parse(nodeType));
switch (limitObj)
{
case Limit_Object.Limit_Object_BusiStruc:
objList = ProcessBusiStruc(nodeId);
break;
case Limit_Object.Limit_Object_BasProductGroup:
objList = ProcessProductGroup(nodeId);
break;
case Limit_Object.Limit_Object_RskFactor:
objList = ProcessRskFactor(nodeId);
break;
case Limit_Object.Limit_Object_BasCurrency:
objList= ProcessBasCurrency(nodeId);
break;
case Limit_Object.Limit_Object_BasCounterparty:
objList = ProcessBasCounterparty(nodeId);
break;
case Limit_Object.Limit_Object_BasPortfolio:
objList= ProcessBasPortfolio(nodeId);
break;
case Limit_Object.Credit_Rate:
break;
default:
break;
}
int index=0;
int currentNopdeId = int.Parse(selectedNodeId);
if (string.IsNullOrEmpty(selectedNodeTypeId))
{
if (objList.Count>0)
{
objList = objList.FindAll((RskLimitObject n) => n.LimitObjectId != null);
}
}
else
{
if (nodeType == selectedNodeType)
{
for (int i = 0; i < objList.Count; i++)
{
if (objList[i].LimitObjectId == int.Parse(selectedNodeTypeId))
{
index = i + 1;
break;
}
}
}
}
index = MergeBranch(limitList, objList,int.Parse( selectedNodeId), index);
IList<RskLimitObject> resultList = new List<RskLimitObject>();
for (int j=index ; j < objList.Count; j++)
{
if (string.IsNullOrEmpty(objList[j].Id))
objList[j].State.MarkNew();
else
{
objList[j].State.MarkDirty();
}
objList[j] = Dao.SaveOrUpdate(objList[j]) as RskLimitObject;
resultList.Add(objList[j]);
if (j!= objList.Count-1)
{
objList[j + 1].Parentid = int.Parse(objList[j].Id);
}
}
return resultList;
}
private List<RskLimitObject> ProcessBasPortfolio(string nodeId);
private List<RskLimitObject> ProcessBasCounterparty(string nodeId);
var counterparty = Dao.FindById(typeof(BasCounterparty), nodeId, null, null) as BasCounterparty;
if (counterparty == null)
{
return new List<RskLimitObject>();
throw new Exception("节点可能已经被删除!");
}
var list = new List<RskLimitObject>();
var rootExistInfo = new QueryInfo("RskLimitObject");
rootExistInfo.AddParam("LimitObjectType", (int)Limit_Object.Limit_Object_BasCounterparty);
rootExistInfo.Where.Add("exits", " and LimitObjectId is null");
var rootExists = Dao.GetTotalCount(rootExistInfo) > 0;
if (!rootExists)
list.Add(new RskLimitObject() { Topic = "交易对手", LimitObjectType = (int)Limit_Object.Limit_Object_BasCounterparty });
list.Add(new RskLimitObject() { Topic = counterparty.CounterpartyName, LimitObjectType = (int)Limit_Object.Limit_Object_BasCounterparty, LimitObjectId = int.Parse(nodeId) });
return list;
}
private List<RskLimitObject> ProcessBasCurrency(string nodeId);
var currencyInfo = new QueryInfo("BasCurrency");
currencyInfo.AddParam("Id", nodeId);
var currency = Dao.FindOne(currencyInfo) as BasCurrency;
if (currency == null)
{
return new List<RskLimitObject>();
//throw new Exception("节点可能已经被删除!");
}
var list = new List<RskLimitObject>();
var rootExistInfo = new QueryInfo("RskLimitObject");
rootExistInfo.AddParam("LimitObjectType", (int)Limit_Object.Limit_Object_BasCurrency);
rootExistInfo.Where.Add("exits", " and LimitObjectId is null");
var rootExists = Dao.GetTotalCount(rootExistInfo) > 0;
if (!rootExists)
list.Add(new RskLimitObject() { Topic = "币种", LimitObjectType =(int) Limit_Object.Limit_Object_BasCurrency });
list.Add(new RskLimitObject() { Topic=currency.CurrencyName, LimitObjectType = (int)Limit_Object.Limit_Object_BasCurrency ,LimitObjectId=int.Parse(nodeId)});
return list;
}
private List<RskLimitObject> ProcessRskFactor(string nodeId);
var rskFactor = Dao.FindById(typeof(RskFactor), nodeId, null, null) as RskFactor;
if (rskFactor == null)
{
return new List<RskLimitObject>();
throw new Exception("节点可能已经被删除!");
}
var list = new List<RskLimitObject>();
var rootExistInfo = new QueryInfo("RskLimitObject");
rootExistInfo.AddParam("LimitObjectType", (int)Limit_Object.Limit_Object_RskFactor);
rootExistInfo.Where.Add("exits", " and LimitObjectId is null");
var rootExists = Dao.GetTotalCount(rootExistInfo) > 0;
if (!rootExists)
list.Add(new RskLimitObject() { Topic = "风险因子", LimitObjectType = (int)Limit_Object.Limit_Object_RskFactor });
list.Add(new RskLimitObject() { Topic = rskFactor.RiskFactorName, LimitObjectType = (int)Limit_Object.Limit_Object_RskFactor, LimitObjectId = int.Parse(nodeId) });
return list;
}
private int MergeBranch(List<RskLimitObject> limitList, IList<RskLimitObject> objList, int startNodeId, int index)
{
List<RskLimitObject> tmp = limitList.FindAll((RskLimitObject n) => n.Parentid == startNodeId).ToList();
if (index < objList.Count)
{
if (tmp.Count > 0)
{
RskLimitObject a = tmp.Find((RskLimitObject n) => n.LimitObjectId == objList[index].LimitObjectId && n.LimitObjectType == objList[index].LimitObjectType);
if (a == null)
{
objList[index].Parentid = startNodeId;
return index;
}
index += 1;
index = MergeBranch(limitList, objList, int.Parse(a.Id), index);
}
else if (tmp.Count == 0)
{
objList[index].Parentid = startNodeId;
}
}
return index;
}
public int DeleteBranch(int startNodeId);
private void Delete(List<RskLimitObject> limitList, int startNodeId);
private Contract.IService.IBasProductGroupService productGroupService;
Contract.IService.IBasProductGroupService ProductGroupService
{
get
{
if (productGroupService == null)
{
productGroupService = ctx.GetObject("BasProductGroupService") as Contract.IService.IBasProductGroupService;
}
return productGroupService;
}
}
private Contract.IService.IBasLimitBusiStrucService busiStructureService;
Contract.IService.IBasLimitBusiStrucService BusiStructureService
{
get
{
if (busiStructureService == null)
{
busiStructureService = (IBasLimitBusiStrucService)ctx.GetObject("BasLimitBusiStrucService");
}
return busiStructureService;
}
}
}
public class RiskLimitObjectDistict : IEqualityComparer<RskLimitObject>
{
public bool Equals(RskLimitObject x, RskLimitObject y)
{
return (x.LimitObjectId == y.LimitObjectId) && (x.LimitObjectType == y.LimitObjectType);
}
public int GetHashCode(RskLimitObject obj)
{
return 0;
}
}
}