AccountRechargeServiceImpl.java 9.85 KB
/**
 *
 */
package com.zteits.pay.biz;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import com.clouds.common.cache.sys.SysCodeValueCacheUtil;
import com.clouds.common.constants.CodeValKindEnum;
import com.clouds.common.constants.RechargeCardEnum;
import com.clouds.common.utils.AmountUtils;
import com.clouds.common.utils.DateUtil;
import com.clouds.common.utils.SequenceUtil;
import com.github.pagehelper.PageInfo;
import com.xiaoleilu.hutool.util.CollectionUtil;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.apibase.bean.PageBean;
import com.zteits.clouds.api.apibase.constants.AccountTypeEnum;
import com.zteits.clouds.api.apibase.constants.PayTypeEnum;
import com.zteits.clouds.api.apibase.constants.SequenceTypeEnum;
import com.zteits.clouds.api.dto.pay.AccountDetailsDTO;
import com.zteits.clouds.api.dto.pay.AcctPersonDTO;
import com.zteits.clouds.api.dto.pay.account.dto.AccountInOutDetailForPageDTO;
import com.zteits.clouds.api.dto.pay.account.dto.AccountRecordDetailDTO;
import com.zteits.clouds.api.dto.pay.account.param.AccoutRecordDetailRequest;
import com.zteits.clouds.api.dto.pay.account.param.AcctInOutDetailForPageRequest;
import com.zteits.clouds.api.dto.pay.param.AccountDetailsRequest;
import com.zteits.clouds.api.dto.pay.param.AcctPayoutForPageRequest;
import com.zteits.clouds.api.dto.pay.param.AcctPersonRequest;
import com.zteits.clouds.api.service.pay.AccountRechargeService;
import com.zteits.pay.dao.TdCAcctPayoutDao;
import com.zteits.pay.dao.TdCAcctPersonDao;
import com.zteits.pay.dao.TdCAcctSourceDao;
import com.zteits.pay.domain.TdCAcctPayout;
import com.zteits.pay.domain.TdCAcctPerson;
import com.zteits.pay.domain.TdCAcctSource;
import com.zteits.pay.pagepager.PageBeanUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

/**
 * @author hxz
 *
 */
@Service("com.zteits.pay.biz.AccountRechargeServiceImpl")
public class AccountRechargeServiceImpl implements AccountRechargeService {
    private static final Logger logger = LoggerFactory.getLogger(AccountRechargeServiceImpl.class);

    /**
     * account person
     */
    @Autowired
    private TdCAcctPersonDao tdCAcctPersonDao;

    @Autowired
    private TdCAcctPayoutDao tdCAcctPayoutDao;

    /**
     * 充值流水
     */
    @Autowired
    private TdCAcctSourceDao tdCAcctSourceDao;

    @Override
    public BizResult<AccountDetailsDTO> getAccountDetails(AccountDetailsRequest accountDetailsRequest) {

        List<Map<String, String>> mapList = new ArrayList<>();
        TdCAcctSource tdCAcctSource = new TdCAcctSource();
        tdCAcctSource.setCustId(accountDetailsRequest.getCustId());
        tdCAcctSource.setAcctType(accountDetailsRequest.getAcctType());
        tdCAcctSource.setOrgId(accountDetailsRequest.getOrgId());
        List<TdCAcctSource> acctSourceDOList = tdCAcctSourceDao.getAcctSource(tdCAcctSource);
        if (CollectionUtil.isNotEmpty(acctSourceDOList)) {
            for (TdCAcctSource sourceDo : acctSourceDOList) {
                Map<String, String> detail = new HashMap<String, String>();
                if(AccountTypeEnum.ACCT_SEND_RECHARGE.value().equals(sourceDo.getAcctType())) {
                    detail.put("payType","充值赠送");
                }else{
                    detail.put("payType",
                            SysCodeValueCacheUtil.getCodeValueName(CodeValKindEnum.PAY_TYPE, sourceDo.getRechargeType() + "")
                                    + "");
                }
                detail.put("payFee", "+¥" + AmountUtils.changeF2Y(sourceDo.getRechargeFee() + ""));
                detail.put("optTime", DateUtil.getDateString(sourceDo.getCreateDate(), DateUtil.DATETIME_FORMAT) + "");
                detail.put("desc", "成功");
                mapList.add(detail);
            }
        }
        AcctPayoutForPageRequest request = new AcctPayoutForPageRequest();
        request.setCustId(accountDetailsRequest.getCustId());
        if(accountDetailsRequest.getAcctType() != null) {
            List<Integer> acctTypeList = new ArrayList<>();
            acctTypeList.add(accountDetailsRequest.getAcctType());
            request.setAcctTypeList(acctTypeList);
        }
        request.setOrgId(accountDetailsRequest.getOrgId());
        List<TdCAcctPayout> acctPayoutDOList = tdCAcctPayoutDao.getAcctPayoutList(request);
        if (CollectionUtil.isNotEmpty(acctPayoutDOList)) {
            for (TdCAcctPayout payout : acctPayoutDOList) {
                Map<String, String> detail = new HashMap<String, String>();
                detail.put("payType", SysCodeValueCacheUtil
                    .getCodeValueName(CodeValKindEnum.SYS_CODE_TRADE_TYPE, payout.getTradeType() + "") + "");
                detail.put("payFee", "-¥" + AmountUtils.changeF2Y(payout.getTradeFee() + ""));
                detail.put("optTime", DateUtil.getDateString(payout.getCreateDate(), DateUtil.DATETIME_FORMAT) + "");
                detail.put("desc", "成功");
                mapList.add(detail);
            }
        }
        AccountDetailsDTO accountDetailsDTO = new AccountDetailsDTO();
        accountDetailsDTO.setMapList(mapList);
        return new BizResult<AccountDetailsDTO>(accountDetailsDTO);
    }

    @Override
    public BizResult<AcctPersonDTO> openAccount(AcctPersonRequest acctPersonRequest) {
        // 1 创建充值赠送账户
        Integer acc = AccountTypeEnum.ACCT_SEND_RECHARGE.value();
        openInnerAccount(acctPersonRequest, acc);
        // 2 创建充值账户
        Integer account = AccountTypeEnum.ACCT_RECHARGE.value();
        AcctPersonDTO acctPersonDTO = openInnerAccount(acctPersonRequest, account);
        return new BizResult<>(acctPersonDTO);
    }

    @Override
    public BizResult<PageBean<AccountInOutDetailForPageDTO>> queryAccountInOutDetailsForPage(AcctInOutDetailForPageRequest requestQ) {
        PageInfo<AccountInOutDetailForPageDTO> pageInfo = tdCAcctPersonDao.queryAccountInOutDetailsForPage(requestQ);
        PageBean<AccountInOutDetailForPageDTO> pageBean = new PageBean<>();
        PageBeanUtil.copyProperties(pageInfo, pageBean, AccountInOutDetailForPageDTO.class);
        if(pageBean != null && CollectionUtil.isNotEmpty(pageBean.getDataList())){
            for(AccountInOutDetailForPageDTO dto : pageBean.getDataList()){
                if(dto.getType() == 1){
                    if(AccountTypeEnum.ACCT_SEND_RECHARGE.value().equals(dto.getAcctType())) {
                        dto.setPayDetail("充值赠送");
                    }else if(AccountTypeEnum.ACCT_SEND_RECHARGE_ABC.value().equals(dto.getAcctType())) {
                        dto.setPayDetail("农行补贴");
                    }else {
                        dto.setPayDetail(SysCodeValueCacheUtil.getCodeValueName(CodeValKindEnum.PAY_TYPE, dto.getPayType() + ""));
                    }
                    dto.setPayState(-5 == dto.getPayType() ? "退款成功" : "充值成功");
                    dto.setChangeFeeDetail("+" + AmountUtils.changeF2Y(dto.getChangeFee() + ""));
                    dto.setOpTime(DateUtil.getDateString(dto.getCreateDate(), DateUtil.DATETIME_FORMAT) + "");
                }else{
                    dto.setPayState(6 == dto.getPayType() ? "提现成功" : "支付成功");
                    dto.setPayDetail(SysCodeValueCacheUtil.getCodeValueName(CodeValKindEnum.SYS_CODE_TRADE_TYPE, dto.getPayType() + ""));
                    dto.setChangeFeeDetail("-" + AmountUtils.changeF2Y(dto.getChangeFee() + ""));
                    dto.setOpTime(DateUtil.getDateString(dto.getCreateDate(), DateUtil.DATETIME_FORMAT) + "");
                }
            }
        }
        return new BizResult<>(pageBean);
    }

    @Override
    public BizResult<AccountRecordDetailDTO> queryAccountRecordDetails(AccoutRecordDetailRequest req) {
        //根据订单编号查询记录
        List<AccountInOutDetailForPageDTO> list = tdCAcctPersonDao.queryAccountRecordDetails(req);
        if(CollectionUtils.isEmpty(list)){
            return new BizResult<>();
        }
        //数据封装
        AccountRecordDetailDTO dto = new AccountRecordDetailDTO();
        String paymentDetails = "";
        for(AccountInOutDetailForPageDTO acctDto : list){
            paymentDetails += AccountTypeEnum.getDesc(acctDto.getAcctType()) + "-" + acctDto.getChangeFee().divide(new BigDecimal("100")) + " ";
        }
        dto.setOrderId(req.getOrderId());
        dto.setPayTime(list.get(0).getTradeTime());
        dto.setPaymentDetails(paymentDetails);
        dto.setTradeType(list.get(0).getTradeType());
        return new BizResult<>(dto);
    }

    private AcctPersonDTO openInnerAccount(AcctPersonRequest acctPersonRequest, Integer acc) {
        TdCAcctPerson acctPersonDo = new TdCAcctPerson();
        BeanUtils.copyProperties(acctPersonRequest, acctPersonDo);
        // 账户id
        acctPersonDo.setAcctId(SequenceUtil.getNextId(SequenceTypeEnum.ACCOUNT_ID_P_SQE));
        //账户类型
        acctPersonDo.setAcctType(acc);
        // 账户顺序 默认为 1
        if (acctPersonRequest.getAcctBalance() == null) {
            acctPersonDo.setAcctBalance(new BigDecimal(0));
        } else {
            acctPersonDo.setAcctBalance(acctPersonRequest.getAcctBalance());
        }
        acctPersonDo.setAcctOrder(1);
        acctPersonDo.setAcctBalance(new BigDecimal(0));
        acctPersonDo.setAcctOrder(acc);
        acctPersonDo.setDataState(1);
        acctPersonDo.setCreateDate(new Date());
        Integer i = tdCAcctPersonDao.insertAcctPerson(acctPersonDo);
        AcctPersonDTO acctPersonDTO = new AcctPersonDTO();
        BeanUtils.copyProperties(acctPersonDo, acctPersonDTO);
        return acctPersonDTO;
    }

}