Пример #1
0
 /// <summary>
 /// 修改数据
 /// </summary>
 /// <param name="model">实体</param>
 /// <returns>影响行数</returns>
 public int Update(FnStockRecord model)
 {
     return(DBContext.Update(StrTableName, model)
            .AutoMap(x => x.SysNo)
            .Where(x => x.SysNo)
            .Execute());
 }
Пример #2
0
        /// <summary>
        /// 获取销售股权交易日志列表
        /// </summary>
        /// <param name="nowStockAmount">当前股权金额</param>
        /// <param name="buyStockRecord">购买方股权记录</param>
        /// <param name="saleStockRecordList">销售股权记录列表</param>
        /// <returns>销售股权交易日志列表</returns>
        public List <FnTradeLog> GetSaleStockTradeLog(decimal nowStockAmount, FnStockRecord buyStockRecord, List <FnStockRecord> saleStockRecordList)
        {
            var tradeLogList = new List <FnTradeLog>();

            foreach (var item in saleStockRecordList)
            {
                //销售方交易记录
                tradeLogList.Add(new FnTradeLog()
                {
                    SourceType         = TradeLogEnum.SourceTypeEnum.股权记录.GetHashCode(),
                    SourceSysNo        = item.SysNo,
                    OutOperatorType    = OperatorTypeEnum.会员.GetHashCode(),
                    OutOperatorSysNo   = item.OperatorSysNo,
                    InOperatorType     = buyStockRecord.OperatorType,
                    InOperatorSysNo    = buyStockRecord.OperatorSysNo,
                    TradeAmount        = item.TradedStockNum * item.CurrentStockAmount,
                    CurrentStockAmount = item.CurrentStockAmount,
                    Remarks            = string.Format("卖家卖出{0}股", item.TradedStockNum),
                    CreatedDate        = DateTime.Now
                });
                //购买方交易记录
                tradeLogList.Add(new FnTradeLog()
                {
                    SourceType         = TradeLogEnum.SourceTypeEnum.股权记录.GetHashCode(),
                    SourceSysNo        = buyStockRecord.SysNo,
                    OutOperatorType    = OperatorTypeEnum.会员.GetHashCode(),
                    OutOperatorSysNo   = item.OperatorSysNo,
                    InOperatorType     = buyStockRecord.OperatorType,
                    InOperatorSysNo    = buyStockRecord.OperatorSysNo,
                    TradeAmount        = item.TradedStockNum * nowStockAmount,
                    CurrentStockAmount = nowStockAmount,
                    Remarks            = string.Format("买家买入{0}股", item.TradedStockNum),
                    CreatedDate        = DateTime.Now
                });
            }

            var surplusTradedStockNum = buyStockRecord.TradedStockNum - saleStockRecordList.Sum(p => p.TradedStockNum);

            if (surplusTradedStockNum > 0)
            {
                //购买方交易记录
                tradeLogList.Add(new FnTradeLog()
                {
                    SourceType         = TradeLogEnum.SourceTypeEnum.股权记录.GetHashCode(),
                    SourceSysNo        = buyStockRecord.SysNo,
                    OutOperatorType    = OperatorTypeEnum.管理员.GetHashCode(),
                    OutOperatorSysNo   = 0,
                    InOperatorType     = buyStockRecord.OperatorType,
                    InOperatorSysNo    = buyStockRecord.OperatorSysNo,
                    TradeAmount        = surplusTradedStockNum * nowStockAmount,
                    CurrentStockAmount = nowStockAmount,
                    Remarks            = string.Format("买家系统买入{0}股", surplusTradedStockNum),
                    CreatedDate        = DateTime.Now
                });
            }

            return(tradeLogList);
        }
Пример #3
0
 /// <summary>
 /// 更新取消股权销售
 /// </summary>
 /// <param name="model">实体</param>
 /// <returns>影响行数</returns>
 public int UpdateCancelSaleStock(FnStockRecord model)
 {
     return(DBContext.Sql(string.Format("update {0} set StockNum=StockNum-@StockNum,Status=@Status,Remarks=CONCAT(Remarks,@Remarks) where SysNo=@SysNo", StrTableName))
            .Parameter("StockNum", model.StockNum)
            .Parameter("Status", model.Status)
            .Parameter("Remarks", model.Remarks)
            .Parameter("SysNo", model.SysNo)
            .Execute());
 }
Пример #4
0
        /// <summary>
        /// 获取需更新股权挂售记录
        /// </summary>
        /// <param name="buyCustomerSysNo">购买会员编码</param>
        /// <param name="getStockNum">购买股权数</param>
        /// <param name="nowStockAmount">当前股权金额</param>
        /// <returns>需更新股权挂售记录列表</returns>
        public List <FnStockRecord> GetUpdateHangSaleStock(int buyCustomerSysNo, int getStockNum, decimal nowStockAmount)
        {
            var stockRecordList = new List <FnStockRecord>();
            //获取未处理的挂售股权
            var saleStockRecordList = Using <IFnStockRecord>().GetList(new StockRecordRequest()
            {
                Type       = StockRecordEnum.TypeEnum.股权挂售.GetHashCode(),
                StatusList = new List <int>()
                {
                    StockRecordEnum.StatusEnum.待处理.GetHashCode(), StockRecordEnum.StatusEnum.部分处理.GetHashCode()
                }
            }).OrderBy(p => p.CreatedDate);

            //进行挂售的股权处理
            foreach (var item in saleStockRecordList)
            {
                FnStockRecord stockRecord;
                if (getStockNum <= 0)
                {
                    break;
                }
                if (getStockNum >= item.StockNum)
                {
                    stockRecord = new FnStockRecord()
                    {
                        SysNo              = item.SysNo,
                        OperatorSysNo      = item.OperatorSysNo,
                        TradedStockNum     = item.StockNum - item.TradedStockNum,
                        CurrentStockAmount = item.CurrentStockAmount,
                        Status             = StockRecordEnum.StatusEnum.已处理.GetHashCode(),
                        Remarks            = string.Format("买入方[{0}]以当前股权价格:{1},股权数:{2}买入;", buyCustomerSysNo, nowStockAmount, item.StockNum - item.TradedStockNum)
                    };

                    getStockNum -= item.StockNum;
                }
                else
                {
                    stockRecord = new FnStockRecord()
                    {
                        SysNo              = item.SysNo,
                        OperatorSysNo      = item.OperatorSysNo,
                        TradedStockNum     = getStockNum,
                        CurrentStockAmount = item.CurrentStockAmount,
                        Status             = StockRecordEnum.StatusEnum.部分处理.GetHashCode(),
                        Remarks            = string.Format("买入方[{0}]以当前股权价格:{1},股权数:{2}买入部分;", buyCustomerSysNo, nowStockAmount, getStockNum)
                    };

                    getStockNum = 0;
                }

                stockRecordList.Add(stockRecord);
            }

            return(stockRecordList);
        }
Пример #5
0
        /// <summary>
        /// 修改数据
        /// </summary>
        /// <param name="model">实体</param>
        /// <returns>影响行数</returns>
        public JResult Update(FnStockRecord model)
        {
            var result = new JResult();

            try
            {
                var row = Using <IFnStockRecord>().Update(model);
                if (row <= 0)
                {
                    throw new Exception("修改数据失败");
                }

                result.Status = true;
            }
            catch (Exception ex) { result.Message = ex.Message; }

            return(result);
        }
Пример #6
0
        /// <summary>
        /// 新增数据
        /// </summary>
        /// <param name="model">实体</param>
        /// <returns>系统编号</returns>
        public JResult <int> Insert(FnStockRecord model)
        {
            var result = new JResult <int>();

            try
            {
                var row = Using <IFnStockRecord>().Insert(model);
                if (row <= 0)
                {
                    throw new Exception("添加数据失败");
                }

                result.Status = true;
                result.Data   = row;
            }
            catch (Exception ex) { result.Message = ex.Message; }

            return(result);
        }
Пример #7
0
        /// <summary>
        /// 平台购股权
        /// </summary>
        /// <param name="userSysNo">用户编号</param>
        /// <returns>JResult</returns>
        public JResult PlatformBuyStock(int userSysNo)
        {
            var result = new JResult();

            try
            {
                var codeList = Using <IBsCode>().GetListByTypeList(new List <int>()
                {
                    CodeEnum.CodeTypeEnum.股权价格.GetHashCode(),
                    CodeEnum.CodeTypeEnum.购股手续费率.GetHashCode(),
                });
                //固定数据
                var stockPrice = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.股权价格.GetHashCode()).Value);
                var rate       = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.购股手续费率.GetHashCode()).Value);

                var stockRecordList = GetUpdateHangSaleStock(userSysNo, int.MaxValue, stockPrice);

                if (!stockRecordList.Any())
                {
                    throw new Exception("无挂售信息");
                }

                var getStockNum    = stockRecordList.Sum(p => p.TradedStockNum);
                var saleAmountList = GetSaleAmount(rate, stockRecordList);
                //购买方股权记录
                var buyStockRecord = new FnStockRecord()
                {
                    Type               = StockRecordEnum.TypeEnum.股权申购.GetHashCode(),
                    OperatorType       = OperatorTypeEnum.管理员.GetHashCode(),
                    OperatorSysNo      = userSysNo,
                    StockNum           = getStockNum,
                    TradedStockNum     = getStockNum,
                    CurrentStockAmount = stockPrice,
                    Status             = StockRecordEnum.StatusEnum.已处理.GetHashCode(),
                    Remarks            = "管理员进行平台收购",
                    CreatedDate        = DateTime.Now
                };

                var changeStockAccountList = GetSaleStockAccount(new List <FnStockAccount>(), stockRecordList);


                using (var tran = new TransactionScope())
                {
                    try
                    {
                        if (Using <ICrCustomer>().BatchUpdate(saleAmountList) <= 0)
                        {
                            throw new Exception("金额写入失败");
                        }
                        //更新股权账户
                        if (Using <IFnStockAccount>().BatchUpdateSaleStockNum(changeStockAccountList) <= 0)
                        {
                            throw new Exception("更新股权账户失败");
                        }
                        //新增申购用户股权记录
                        buyStockRecord.SysNo = Using <IFnStockRecord>().Insert(buyStockRecord);
                        if (buyStockRecord.SysNo <= 0)
                        {
                            throw new Exception("新增股权记录失败");
                        }
                        //更新挂售用户股权记录
                        if (Using <IFnStockRecord>().BatchUpdateSaleRecord(stockRecordList) <= 0)
                        {
                            throw new Exception("更新销售股权记录失败");
                        }
                        //获取交易日志
                        var tradeLogList = GetSaleStockTradeLog(stockPrice, buyStockRecord, stockRecordList);
                        if (Using <IFnTradeLog>().BatchInsert(tradeLogList) <= 0)
                        {
                            throw new Exception("新增交易日志失败");
                        }

                        result.Status = true;
                        tran.Complete();
                    }
                    catch (Exception ex)
                    {
                        tran.Dispose();
                        throw ex;
                    }
                }
            }
            catch (Exception exx)
            {
                result.Message = exx.Message;
            }

            return(result);
        }
Пример #8
0
        /// <summary>
        /// 申购股权
        /// </summary>
        /// <param name="buyCustomerSysNo">申购会员编号</param>
        /// <returns>申购结果</returns>
        public JResult ApplyBuyStock(int buyCustomerSysNo)
        {
            var result = new JResult();

            try
            {
                var codeList = Using <IBsCode>().GetListByTypeList(new List <int>()
                {
                    CodeEnum.CodeTypeEnum.股权价格.GetHashCode(),
                    CodeEnum.CodeTypeEnum.固定购股金额.GetHashCode(),
                    CodeEnum.CodeTypeEnum.股权增值金额.GetHashCode(),
                    CodeEnum.CodeTypeEnum.购股有效金额.GetHashCode(),
                    CodeEnum.CodeTypeEnum.购股手续费率.GetHashCode(),
                });
                //固定数据
                var stockPrice         = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.股权价格.GetHashCode()).Value);
                var fixedStockAmount   = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.固定购股金额.GetHashCode()).Value);
                var addStockPoolAmount = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.股权增值金额.GetHashCode()).Value);
                var usefulStockAmount  = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.购股有效金额.GetHashCode()).Value);
                var rate = Convert.ToDecimal(codeList.First(p => p.Type == CodeEnum.CodeTypeEnum.购股手续费率.GetHashCode()).Value);

                //获取用户信息
                var customer = Using <ICrCustomer>().Get(buyCustomerSysNo);

                if (customer == null)
                {
                    throw new Exception("用户信息不存在");
                }
                if (customer.UpgradeFundAmount < fixedStockAmount)
                {
                    result.StatusCode = ErrorEnum.余额不足.GetHashCode().ToString(CultureInfo.InvariantCulture);
                    throw new Exception(string.Format("用户升级基金{0}余额不足,请充值", customer.UpgradeFundAmount));
                }

                //用户资金变动列表
                var batchRequestList = new List <CustomerExtBatchRequest>();
                //用户股权账户变动列表
                var batchStockAccountList = new List <FnStockAccount>();
                //实际可获股权数
                var getStockNum = Convert.ToInt32(usefulStockAmount / stockPrice);

                //用户购买金额从升级基金扣除
                batchRequestList.Add(new CustomerExtBatchRequest()
                {
                    CustomerSysNo     = buyCustomerSysNo,
                    UpgradeFundAmount = -fixedStockAmount
                });
                //用户获取的股权数
                batchStockAccountList.Add(new FnStockAccount()
                {
                    CustomerSysNo = buyCustomerSysNo,
                    StockNum      = getStockNum
                });

                //销售股权记录
                var saleStockRecordList = GetUpdateHangSaleStock(buyCustomerSysNo, getStockNum, stockPrice);
                //购买方股权记录
                var buyStockRecord = new FnStockRecord()
                {
                    Type               = StockRecordEnum.TypeEnum.股权申购.GetHashCode(),
                    OperatorType       = OperatorTypeEnum.会员.GetHashCode(),
                    OperatorSysNo      = buyCustomerSysNo,
                    StockNum           = getStockNum,
                    TradedStockNum     = getStockNum,
                    CurrentStockAmount = stockPrice,
                    Status             = StockRecordEnum.StatusEnum.已处理.GetHashCode(),
                    Remarks            = string.Format("当前股权价格:{0}", stockPrice),
                    CreatedDate        = DateTime.Now
                };
                //新增股权池金额
                var newAddStockPoolAmount = decimal.Round(Convert.ToDecimal(0), 8);
                //获取新增股权池数
                var newAddStockPoolNum = getStockNum - saleStockRecordList.Sum(p => p.TradedStockNum);
                if (newAddStockPoolNum > 0)
                {
                    if (newAddStockPoolNum == getStockNum)
                    {
                        newAddStockPoolAmount = addStockPoolAmount;
                    }
                    else
                    {
                        var stockAmount = decimal.Round(addStockPoolAmount / getStockNum, 8);
                        newAddStockPoolAmount = decimal.Round(newAddStockPoolNum * stockAmount, 8);
                    }
                }
                //销售用户销售金额
                batchRequestList.AddRange(GetSaleAmount(rate, saleStockRecordList));
                //用户股权账户变动列表
                batchStockAccountList = GetSaleStockAccount(batchStockAccountList, saleStockRecordList);

                using (var tran = new TransactionScope())
                {
                    try
                    {
                        if (Using <ICrCustomer>().BatchUpdate(batchRequestList) <= 0)
                        {
                            throw new Exception("金额写入失败");
                        }
                        //更新股权账户
                        if (Using <IFnStockAccount>().BatchUpdateSaleStockNum(batchStockAccountList) <= 0)
                        {
                            throw new Exception("更新股权账户失败");
                        }
                        //新增申购用户股权记录
                        buyStockRecord.SysNo = Using <IFnStockRecord>().Insert(buyStockRecord);
                        if (buyStockRecord.SysNo <= 0)
                        {
                            throw new Exception("新增股权记录失败");
                        }
                        //更新挂售用户股权记录
                        if (saleStockRecordList.Any() && Using <IFnStockRecord>().BatchUpdateSaleRecord(saleStockRecordList) <= 0)
                        {
                            throw new Exception("更新销售股权记录失败");
                        }

                        //获取交易日志
                        var tradeLogList = GetSaleStockTradeLog(stockPrice, buyStockRecord, saleStockRecordList);
                        if (Using <IFnTradeLog>().BatchInsert(tradeLogList) <= 0)
                        {
                            throw new Exception("新增交易日志失败");
                        }
                        //股东见点奖励
                        var seeBonusResult = SeeBonusPoints(buyCustomerSysNo);
                        if (!seeBonusResult.Status)
                        {
                            throw new Exception(seeBonusResult.Message);
                        }
                        //股权池变动更新
                        var changeStockPool = ChangeStock(newAddStockPoolNum, newAddStockPoolAmount);
                        if (!changeStockPool.Status)
                        {
                            throw new Exception(changeStockPool.Message);
                        }

                        result.Status = true;
                        tran.Complete();
                    }
                    catch (Exception ex)
                    {
                        tran.Dispose();
                        throw ex;
                    }
                }
            }
            catch (Exception exx)
            {
                result.Message = exx.Message;
            }

            return(result);
        }
Пример #9
0
 /// <summary>
 /// 新增数据
 /// </summary>
 /// <param name="model">实体</param>
 /// <returns>系统编号</returns>
 public int Insert(FnStockRecord model)
 {
     return(DBContext.Insert(StrTableName, model)
            .AutoMap(x => x.SysNo)
            .ExecuteReturnLastId <int>("SysNo"));
 }