RationInviteBiz.java 7.38 KB
package com.cjs.cms.biz.ration;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

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 com.cjs.cms.biz.trade.TradeBiz;
import com.cjs.cms.biz.user.fund.UserFinanceBiz;
import com.cjs.cms.dao.ration.RationInviteConfigDao;
import com.cjs.cms.dao.ration.RationInviteRecordDao;
import com.cjs.cms.dao.ration.RationInviteUserDao;
import com.cjs.cms.model.pub.ConstInfo;
import com.cjs.cms.model.pub.ResultInfo;
import com.cjs.cms.model.ration.RationInviteConfigInfo;
import com.cjs.cms.model.ration.RationInviteQualityInfo;
import com.cjs.cms.model.ration.RationInviteRecordInfo;
import com.cjs.cms.model.ration.RationInviteUserInfo;
import com.cjs.cms.util.t2.T2Result;
import com.cjs.cms.util.web.ActionUtil;

/**
 * 邀约配售
 * 
 * @author xiangwei
 *
 */
@Service
public class RationInviteBiz {

    Logger                        log = LogManager.getLogger();
    @Autowired
    private RationInviteConfigDao rationInviteConfigDao;
    @Autowired
    private RationInviteUserDao   rationInviteUserDao;
    @Autowired
    private RationInviteRecordDao rationInviteRecordDao;
    @Autowired
    private UserFinanceBiz        userFinanceBiz;
    @Autowired
    private TradeBiz              readeBiz;

    /**
     * 开始配售
     */
    public ResultInfo ration(Integer configId) {
        RationInviteConfigInfo configInfo = rationInviteConfigDao.queryAllById(configId);
        String message;
        List<T2Result> results = new ArrayList<T2Result>();

        try {
            if (configInfo == null) {
                return new ResultInfo(4, "配售设置信息不存在");
            }
            configInfo.setRationStatus("2");
            rationInviteConfigDao.update(configInfo);
            if (configInfo.getConfirmEndDate().getTime() > new Date().getTime()) {
                return this.rationResult(1, "用户确认配售日期尚未截止,不可以配售", configInfo);
            }
            List<RationInviteUserInfo> rationInviteUsers = rationInviteUserDao
                .queryByConfigId(configId);
            if (rationInviteUsers.isEmpty()) {
                return this.rationResult(1, "该配售设置信息下没有用户", configInfo);
            }

            //配售给机构总比例
            for (RationInviteUserInfo rationInviteUserInfo : rationInviteUsers) {
                Map<String, Object> balance = userFinanceBiz
                    .balance(rationInviteUserInfo.getUserId());
                Double needMoney = rationInviteUserInfo.getPercent() * configInfo.getRationAmount()
                                   * configInfo.getPrice() * 0.01;
                Double enableBalance = Double.parseDouble(balance.get("enable_balance").toString());
                if (needMoney > enableBalance) {
                    message = MessageFormat.format("用户[{0}]资金不足。可用余额:[{1}],需要[{2}]",
                        rationInviteUserInfo.getUserId(), enableBalance, needMoney);
                    return this.rationResult(1, message, configInfo);
                }
            }
            int count = 0;
            int total = 0;
            //开始配售,交割
            List<RationInviteQualityInfo> list = rationInviteConfigDao.queryQualityById(configId);
            List<RationInviteUserInfo> users = configInfo.getUsers();
            for (RationInviteQualityInfo qualityInfo : list) {
                for (int i = 0; i <= users.size() - 1; i++) {
                    RationInviteRecordInfo record = null;
                    RationInviteUserInfo userInfo = users.get(i);
                    if ((i + 1) == users.size()) {//为最和一个数据等于总数减去前面已经配售的数量
                        count = qualityInfo.getRationAmount() - total;
                    } else {
                        count = new BigDecimal(users.get(i).getPercent())
                            .divide(new BigDecimal(100))
                            .multiply(new BigDecimal(qualityInfo.getRationAmount()))
                            .setScale(0, RoundingMode.HALF_UP).intValue();
                    }
                    if (count > 0) {
                        record = new RationInviteRecordInfo();
                        record.setRationInviteConfigId(configInfo.getId());
                        record.setRationInviteQualityId(qualityInfo.getId());
                        record.setRationInviteUserId(userInfo.getId());
                        record.setSellUserId(qualityInfo.getUserId());
                        record.setSellOtcAccount(qualityInfo.getUserId());
                        record.setBuyUserId(userInfo.getUserId());
                        record.setBuyOtcAccount(userInfo.getOtcAccount());
                        record.setRationStatus("1");
                        record.setFund(count * configInfo.getPrice());
                        record.setCreateBy(ActionUtil.getUser().getUsername());
                        record.setStockAmount(count);
                        total = total + count;
                    }
                    if (!qualityInfo.getUserId().equals(userInfo.getUserId())) {
                        T2Result t2 = readeBiz.transfer(configInfo.getOtcCode(),
                            qualityInfo.getUserId(), userInfo.getUserId(), count, "用户数量为" + count);
                        results = userFinanceBiz.pay(userInfo.getId().toString(),
                            ConstInfo.Fund.INVITE_RATION, userInfo.getUserId(),
                            qualityInfo.getUserId(), count * configInfo.getPrice(),
                            ConstInfo.Fund.INVITE_RETION_REMARK);
                        if (count > 0) {
                            record = this.payResult(results, record);
                        }
                    }
                    rationInviteRecordDao.insert(record);
                }
                count = 0;
                total = 0;
            }
            return this.rationResult(4, "交割成功", configInfo);
        } catch (Exception e) {
            log.error("交割失败", e);
            return this.rationResult(5, e.getMessage(), configInfo);
        }
    }

    /**返回配售结果信息*/
    private ResultInfo rationResult(Integer code, String message,
                                    RationInviteConfigInfo configInfo) {
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.setCode(code);
        resultInfo.setMessage(message);
        configInfo.setRationStatus(code.toString());
        configInfo.setRationResult(message);
        rationInviteConfigDao.update(configInfo);
        return resultInfo;
    }

    /**处理支付结果*/
    private RationInviteRecordInfo payResult(List<T2Result> results,
                                             RationInviteRecordInfo record) {
        if (results.size() == 1) {
            record.setRemark(results.get(0).toString());
            record.setRationStatus("0");
        } else {
            StringBuilder sb = new StringBuilder();
            for (T2Result result : results) {
                sb.append(result.toString()).append("|");
            }
            record.setRemark(sb.toString());
        }
        return record;
    }
}