草稿

/* 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;
        }
    }
}

 

posted on 2016-07-03 19:46  听哥哥的话  阅读(149)  评论(0编辑  收藏  举报

导航