QuotaConfigBiz.java 12.7 KB
package com.cjs.cms.biz.quota;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.cjs.cms.biz.ServiceException;
import com.cjs.cms.dao.quota.ConfigRecordDao;
import com.cjs.cms.dao.quota.OtcStockRealDao;
import com.cjs.cms.dao.quota.QuotaConfigDao;
import com.cjs.cms.dao.quota.QuotaUserDao;
import com.cjs.cms.dao.quota.QuotaUserRecordDao;
import com.cjs.cms.dao.report.OtcRealTimeDao;
import com.cjs.cms.model.quota.OtcStockRealInfo;
import com.cjs.cms.model.quota.QuotaConfigInfo;
import com.cjs.cms.model.quota.QuotaRecordInfo;
import com.cjs.cms.model.quota.QuotaUserInfo;
import com.cjs.cms.model.quota.QuotaUserRecordInfo;
import com.cjs.cms.model.user.UserInfo;
import com.cjs.cms.util.lang.DateEnum;
import com.cjs.cms.util.lang.DateUtil;
import com.cjs.cms.util.lang.JsonUtil;
import com.cjs.cms.util.lang.PageUtils;
import com.cjs.cms.util.lang.StringUtil;
import com.cjs.cms.util.t2.T2Result;
import com.cjs.cms.util.t2.T2Util;
import com.cjs.cms.util.web.ActionUtil;

/**
 * 权益分配
 * @author tongxiaochuan
 *
 */
@Service
public class QuotaConfigBiz {

    Logger                     log = LogManager.getLogger();
    @Autowired
    private QuotaConfigDao     quotaConfigDao;
    @Autowired
    private QuotaUserDao       quotaUserDao;
    @Autowired
    private QuotaUserRecordDao quotaUserRecordDao;
    @Autowired
    private ConfigRecordDao    configRecordDao;
    @Autowired
    private OtcStockRealDao    otcStockRealDao;
    @Autowired
    private OtcRealTimeDao     otcRealTimeDao;

    /**
     * 根据藏品编号查询藏品名称
     * @param otcCode
     * @return
     */
    public String getOtcNameByOtcCode(String otcCode) {
        Map<String, Object> params = new HashMap<String, Object>();
        String otcName = "";
        params.put("otc_code", otcCode);
        T2Result result = T2Util.request(params, "619000");
        log.info("根据藏品编号查询藏品名称[619000]:" + result);
        if (result.getCode().toString().equals("0") && result.getData().size() > 0) {
            otcName = result.getData().get(0).get("otc_name").toString();
        } else {
            otcName = "";
        }
        return otcName;
    }

    /**
     * 变更权益分配信息
     * @param quotaConfig
     */
    @Transactional
    public void add(QuotaConfigInfo quotaConfig) {
        this.valiaAdd(quotaConfig);
        UserInfo userInfo = ActionUtil.getUser();
        String validEndDate = DateUtil.parseDate(quotaConfig.getValidEndDate(), DateEnum.DATE)
                              + " 23:59:59";
        String tradeEndDate = DateUtil.parseDate(quotaConfig.getTradeEndDate(), DateEnum.DATE)
                              + " 23:59:59";

        quotaConfig.setValidEndDate(DateUtil.parseDate(validEndDate, DateEnum.DATETIME));
        quotaConfig.setTradeEndDate(DateUtil.parseDate(tradeEndDate, DateEnum.DATETIME));
        //新增
        if (quotaConfig.getId() == null) {
            quotaConfig.setCreateBy(userInfo.getTruename());
            quotaConfigDao.insertQuotaConfig(quotaConfig);
        } else { //修改
            QuotaConfigInfo quota = quotaConfigDao.getConfigById(quotaConfig.getId());
            if (quota.getAllot() != 0) {
                throw new ServiceException("只能修改未分配的记录,请刷新后确认");
            }
            quotaConfig.setUpdateBy(userInfo.getTruename());
            quotaConfigDao.updateConfig(quotaConfig);
        }
    }

    /**
     * 作废
     * @param id
     */
    @Transactional
    public int invalid(Integer id) {
        Map<String, Object> params = new HashMap<String, Object>();
        UserInfo userInfo = ActionUtil.getUser();
        params.put("updateBy", userInfo.getTruename());
        params.put("id", id);
        params.put("allot", 2);
        return quotaConfigDao.updateAllotById(params);
    }

    /**
     * 分配额度
     * @param id
     */
    @Transactional
    public void allot(final Integer id) {
        //查询用户有效持仓
        final QuotaConfigInfo quotaConfig = quotaConfigDao.getConfigById(id);
        if (quotaConfig == null) {
            throw new ServiceException("分配设置记录不存在");
        }
        if (new Date().getTime() > quotaConfig.getValidEndDate().getTime()) {
            throw new ServiceException("分配记录已过期,请确认有效期");
        }
        if (quotaConfig.getAllot() != 0) {
            throw new ServiceException("该记录状态不是未分配,请确认");
        }

        //累计买入量
        Map<String, Object> stockParam = new HashMap<String, Object>();
        stockParam.put("otc_code", quotaConfig.getTrustOtcCode());
        List<Map<String, Object>> buyTotals = otcRealTimeDao.queryBuyTotal(stockParam);
        //当前持仓
        List<OtcStockRealInfo> stockList = otcStockRealDao.queryList(quotaConfig.getTrustOtcCode());
        final Map<String, OtcStockRealInfo> stockMap = new HashMap<String, OtcStockRealInfo>();
        for (OtcStockRealInfo otcStock : stockList) {
            stockMap.put(otcStock.getFundAccount(), otcStock);
        }

        //先将状态改为已分配
        Map<String, Object> params = new HashMap<String, Object>();
        UserInfo userInfo = ActionUtil.getUser();
        params.put("updateBy", userInfo.getTruename());
        params.put("id", id);
        params.put("allot", 1);
        quotaConfigDao.updateAllotById(params);

        //分配所有用户权益
        for (Map<String, Object> buy : buyTotals) {
            String fund_account = buy.get("FUND_ACCOUNT").toString();
            OtcStockRealInfo otcStock = stockMap.get(fund_account);
            int buyTotal = Integer.valueOf(buy.get("BUY_TOTAL").toString());
            if (otcStock == null) {
                log.info("========用户有累计买入量,当前持仓为空:" + buy);
                continue;
            }
            allotQuotaUser(buyTotal, otcStock, quotaConfig, userInfo.getTruename());
        }
    }

    /**
     * 分配单个用户权益
     * @param id
     */
    private void allotQuotaUser(int buyTotal, OtcStockRealInfo otcStockInfo,
                                QuotaConfigInfo quotaConfig, String createBy) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("userId", otcStockInfo.getFundAccount());
        params.put("otcCode", quotaConfig.getOtcCode());

        //分配基数
        int realAmount = otcStockInfo.getEnableAmount();
        if (realAmount > buyTotal) {
            realAmount = buyTotal;
        }
        int quota = (int) (realAmount * (quotaConfig.getPercent() / 100.00));

        params.put("quota", quota);
        params.put("otcName", quotaConfig.getOtcName());
        params.put("createBy", createBy);
        params.put("quotaConfigId", quotaConfig.getId());
        params.put("realAmount", realAmount); //有效持仓
        params.put("buyTotal", buyTotal); //累计买入量
        params.put("enableAmount", otcStockInfo.getEnableAmount()); //当前持仓
        params.put("source", 1);

        updateQuota(params);

        //额度流水
        QuotaRecordInfo quotaRecord = new QuotaRecordInfo();
        quotaRecord.setQuotaConfigId(Integer.parseInt(params.get("quotaConfigId").toString()));
        quotaRecord.setUserId(params.get("userId").toString());
        quotaRecord.setBuyTotal(Integer.parseInt(params.get("buyTotal").toString()));
        quotaRecord.setPosition(Integer.parseInt(params.get("enableAmount").toString()));
        quotaRecord.setQuota(quota);
        quotaRecord.setCreateBy(params.get("createBy").toString());
        quotaRecord.setUpdateBy(params.get("createBy").toString());
        configRecordDao.insert(quotaRecord);
    }

    /**
     * 变更权益数量
     * @param params
     * @return
     */
    protected void updateQuota(Map<String, Object> params) {
        QuotaUserInfo quotaUserInfo = quotaUserDao.queryByUserId(params);
        if (quotaUserInfo == null) {
            quotaUserInfo = new QuotaUserInfo();
            quotaUserInfo.setUserId(params.get("userId").toString());
            quotaUserInfo.setOtcCode(params.get("otcCode").toString());
            quotaUserInfo.setOtcName(params.get("otcName").toString());
            quotaUserInfo.setCreateBy(params.get("createBy").toString());
            quotaUserDao.insert(quotaUserInfo);
            quotaUserInfo = quotaUserDao.queryByUserId(params);
        }

        //发生额度
        int quota = Integer.parseInt(params.get("quota").toString());
        //发生前额度
        int beforeQuota = quotaUserInfo.getQuota();

        quotaUserInfo.setQuota(quotaUserInfo.getQuota() + quota);
        quotaUserInfo.setUpdateBy(params.get("createBy").toString());
        quotaUserDao.updateQuota(quotaUserInfo);

        //托管额度变更记录
        QuotaUserRecordInfo recored = new QuotaUserRecordInfo();
        recored.setUserId(params.get("userId").toString());
        recored.setOtcCode(params.get("otcCode").toString());
        recored.setOtcName(params.get("otcName").toString());
        recored.setQuota(quota);
        recored.setPostQuota(quota + beforeQuota);
        recored.setSource(Integer.parseInt(params.get("source").toString()));
        recored.setCreateBy(params.get("createBy").toString());
        quotaUserRecordDao.insert(recored);

    }

    /**
     * 分页查询列表
     * @param params
     * @return
     */
    public String getConfigList(Map<String, Object> params) {
        if (!StringUtil.isBlank(params.get("startDate"))) {
            String startDate = params.get("startDate") + " 00:00:00";
            params.put("validStartDate", DateUtil.parseDate(startDate, DateEnum.DATETIME));
        }
        if (!StringUtil.isBlank(params.get("endDate"))) {
            String endDate = params.get("endDate") + " 23:59:59";
            params.put("validEndDate", DateUtil.parseDate(endDate, DateEnum.DATETIME));
        }
        PageUtils.processPage(params);
        return JsonUtil.toPageJson(quotaConfigDao.search(params),
            quotaConfigDao.searchTotal(params));
    }

    /**
     * 根据id查询信息
     * @param id
     * @return
     */
    public QuotaConfigInfo getConfigById(String id) {
        QuotaConfigInfo quotaConfig = quotaConfigDao.getConfigById(Integer.parseInt(id));
        return quotaConfig;
    }

    /**
     * 验证权益分配信息时间
     */
    private void valiaAdd(QuotaConfigInfo quotaConfig) {
        QuotaConfigInfo quota = quotaConfigDao.queryByOtcCode(quotaConfig.getOtcCode());
        if (quotaConfig.getTradeEndDate().getTime() <= quotaConfig.getTradeStartDate().getTime()) {
            throw new ServiceException("交易结束时间不能早于有效期开始时间");
        }
        if (quotaConfig.getValidEndDate().getTime() <= quotaConfig.getValidStartDate().getTime()) {
            throw new ServiceException("有效期开始时间不能早于有效期结束时间");
        }
        if (quotaConfig.getTradeStartDate().getTime() <= quotaConfig.getValidStartDate()
            .getTime()) {
            throw new ServiceException("交易开始时间不能早于有效期开始时间");
        }
        if (quotaConfig.getValidEndDate().getTime() <= quotaConfig.getTradeEndDate().getTime()) {
            throw new ServiceException("交易结束时间不能晚于有效期结束时间");
        }
        if (quota == null) {
            return;
        }
        //新增
        if (quotaConfig.getId() == null) {
            if (quotaConfig.getValidStartDate().getTime() <= quota.getValidEndDate().getTime()) {
                throw new ServiceException("有效期开始时间不能与之前的配置重叠");
            }
        } else {
            //修改
            QuotaConfigInfo quotaC = quotaConfigDao.queryByOtcCode2(quotaConfig.getOtcCode());
            if (quotaC != null) {
                if (quotaConfig.getValidStartDate().getTime() <= quotaC.getValidEndDate().getTime())
                    throw new ServiceException("有效期开始时间不能与之前的配置重叠");
            }
        }
        String otcName = this.getOtcNameByOtcCode(quotaConfig.getOtcCode());
        if (!StringUtils.equals(otcName, quotaConfig.getOtcName())) {
            throw new ServiceException("额度藏品代码不存在");
        }
        otcName = this.getOtcNameByOtcCode(quotaConfig.getTrustOtcCode());
        if (!StringUtils.equals(otcName, quotaConfig.getTrustOtcName())) {
            throw new ServiceException("托管藏品代码不存在");
        }
    }

}