SpecialCarnumberBillingServiceImpl.java 14.6 KB
package com.zteits.pay.biz.impl;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.clouds.common.constants.ExamineStateEnum;
import com.github.pagehelper.PageInfo;
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.DataStatusEnum;
import com.zteits.clouds.api.dto.clouds.param.BatchDeleteByPrimaryKeyRequest;
import com.zteits.clouds.api.dto.clouds.param.DeleteByPrimaryKeyRequest;
import com.zteits.clouds.api.dto.pay.TdCAcctNoSecretDTO;
import com.zteits.clouds.api.dto.pay.car.param.CustCarInfoQueryReq;
import com.zteits.clouds.api.dto.pay.dto.SpecialCarnumberBillingDTO;
import com.zteits.clouds.api.dto.pay.param.SaveCustPersonRequest;
import com.zteits.clouds.api.dto.pay.param.SpecialCarnumberBillingRequest;
import com.zteits.clouds.api.dto.pay.param.TdCAcctNoSecretRequest;
import com.zteits.clouds.api.service.pay.SpecialCarnumberBillingService;
import com.zteits.clouds.api.service.pay.TdCAcctNoSecretService;
import com.zteits.clouds.api.service.pay.TdCCustPersonService;
import com.zteits.pay.dao.SpecialCarnumberBillingDao;
import com.zteits.pay.dao.TdCAcctPersonDao;
import com.zteits.pay.dao.TdCCarDao;
import com.zteits.pay.dao.TdCCustPersonDao;
import com.zteits.pay.domain.SpecialCarnumberBilling;
import com.zteits.pay.domain.TdCCar;
import com.zteits.pay.domain.TdCCustPerson;
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.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

@Component
public class SpecialCarnumberBillingServiceImpl implements SpecialCarnumberBillingService {

    private static final Logger logger = LoggerFactory.getLogger(SpecialCarnumberBillingServiceImpl.class);

    @Autowired
    private SpecialCarnumberBillingDao specialCarnumberBillingDao;

    @Autowired
    private TdCCustPersonDao tdCCustPersonDao;

    @Autowired
    private TdCCustPersonService tdCCustPersonService;

    @Autowired
    private TdCAcctPersonDao tdCAcctPersonDao;

    @Resource(name="tdCAcctNoSecretServiceImpl")
    private TdCAcctNoSecretService tdCAcctNoSecretService;

    @Autowired
    private TdCCarDao tdCCarDao;

    @Override
    public BizResult<List<SpecialCarnumberBillingDTO>> querySpecialCarnumberBilling(SpecialCarnumberBillingRequest request) {
        List<SpecialCarnumberBillingDTO> specialCarnumberBillingDTOS = new ArrayList<>();
        List<SpecialCarnumberBilling> specialCarnumberBillings = specialCarnumberBillingDao.querySpecialCarnumberBilling(request);
        if (CollectionUtils.isEmpty(specialCarnumberBillings)) {
            return new BizResult<>(specialCarnumberBillingDTOS);
        }
        for (SpecialCarnumberBilling source : specialCarnumberBillings) {
            SpecialCarnumberBillingDTO dto = new SpecialCarnumberBillingDTO();
            BeanUtils.copyProperties(source, dto);
            specialCarnumberBillingDTOS.add(dto);
        }
        return new BizResult<>(specialCarnumberBillingDTOS);
    }

    @Override
    public BizResult<PageBean<SpecialCarnumberBillingDTO>> querySpecialCarnumberBillingForPage(SpecialCarnumberBillingRequest request) {
        PageBean<SpecialCarnumberBillingDTO> pageBean = new PageBean<>();
        PageInfo<SpecialCarnumberBilling> pageInfo = specialCarnumberBillingDao.querySpecialCarnumberBillingForPage(request);
        if (pageInfo != null && pageInfo.getList() != null && pageInfo.getList().size() > 0) {
            PageBeanUtil.copyProperties(pageInfo, pageBean, SpecialCarnumberBillingDTO.class);
        }
        return new BizResult<>(pageBean);
    }

    @Override
    public BizResult<Boolean> batchDeleteSpecialCarnumberBillingByPrimaryKey(BatchDeleteByPrimaryKeyRequest request) {
        int delenum = specialCarnumberBillingDao.batchDeleteSpecialCarnumberBillingByPrimaryKey(request.getIds(), request.getOpId(), request.getsOpName());
        return new BizResult<>(delenum > 0);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public BizResult<Boolean> delSpecialCarnumberBillingByPrimaryKey(DeleteByPrimaryKeyRequest request) {
        SpecialCarnumberBilling specialCarnumberBilling = specialCarnumberBillingDao.queryByPrimaryKey(request.getId());
        int delenum = specialCarnumberBillingDao.delSpecialCarnumberBillingByPrimaryKey(request.getId(), request.getOpId(), request.getsOpName());
        logger.info("西城特殊车-逻辑删除special_carnumber_billing, id:{}", request.getId());
        if (StringUtils.isNotEmpty(specialCarnumberBilling.getCustId())) {
            // 关闭该账户自动扣费
            TdCAcctNoSecretRequest acctNoSecretRequest = new TdCAcctNoSecretRequest();
            acctNoSecretRequest.setCustId(specialCarnumberBilling.getCustId());
            acctNoSecretRequest.setIsOpen(0);
            acctNoSecretRequest.setAcctType(5);
            tdCAcctNoSecretService.switchPaymentState(acctNoSecretRequest);
            logger.info("西城特殊车-关闭td_c_acct_no_secret, custid:{}", specialCarnumberBilling.getCustId());
        }
        return new BizResult<>(delenum > 0);
    }


    @Transactional(rollbackFor = Exception.class)
    @Override
    public BizResult<Boolean> saveSpecialCarnumberBilling(SpecialCarnumberBillingRequest request) {
        logger.info("西城特殊车-添加, custidrequest:{}", JSONObject.toJSONString(request));
        SpecialCarnumberBilling specialCarnumberBilling = new SpecialCarnumberBilling();
        BeanUtils.copyProperties(request, specialCarnumberBilling);
        specialCarnumberBilling.setOrgId(String.valueOf(request.getOrgId()));
        specialCarnumberBilling.setCreateEmpid(request.getCreateEmpId());
        specialCarnumberBilling.setCreateName(request.getCreateEmpName());
        specialCarnumberBilling.setCreateDate(new Date());
        if (StringUtils.isNotEmpty(request.getPhoneNum())) {
            TdCCustPerson custPerson = tdCCustPersonDao.selectByUserPhone(request.getPhoneNum());
            if (custPerson != null && StringUtils.isNotEmpty(custPerson.getCustId())) {
                String custId = custPerson.getCustId();
                // 添加td_c_acct_person
                tdCAcctPersonDao.addFeeForCustPresentAcct(request.getOrgId(), 0L, AccountTypeEnum.ACCT_RECHARGE.value(), custId);
                logger.info("西城特殊车-添加td_c_acct_person, custid:{}", custId);
                // 添加td_c_acct_no_secret
                addAcctNoSecret(custId);
                // 添加车牌到td_c_car
                addTdCCar(request, custId);
                specialCarnumberBilling.setCustId(custId);
            } else {
                // 添加td_c_cust_person
                SaveCustPersonRequest saveCustPersonRequest = new SaveCustPersonRequest();
                saveCustPersonRequest.setCustName(request.getName());
                saveCustPersonRequest.setUserPhone(request.getPhoneNum());
                String custId = tdCCustPersonService.saveCustPerson(saveCustPersonRequest).getData();
                logger.info("西城特殊车-添加td_c_cust_person成功, custid:{}", custId);
                // 添加td_c_acct_person
                tdCAcctPersonDao.addFeeForCustPresentAcct(request.getOrgId(), 0L, AccountTypeEnum.ACCT_RECHARGE.value(), custId);
                logger.info("西城特殊车-添加td_c_acct_person, custid:{}", custId);
                // 添加td_c_acct_no_secret
                addAcctNoSecret(custId);
                // 添加车牌到td_c_car
                addTdCCar(request, custId);
                specialCarnumberBilling.setCustId(custId);
            }
        }
        int saveNum = specialCarnumberBillingDao.saveSpecialCarnumberBilling(specialCarnumberBilling);
        logger.info("西城特殊车-添加special_carnumber_billing, custid:{}", specialCarnumberBilling.getCustId());
        return new BizResult<>(saveNum > 0);
    }

    /**
     * 判断有没有绑定该车
     * 绑定了则datastate改为0
     * 然后添加绑定车辆
     * @param request
     * @param custId
     */
    private void addTdCCar(SpecialCarnumberBillingRequest request, String custId) {
        // 查询车牌号之前有没有绑定过
        TdCCar reqCar = new TdCCar();
        reqCar.setCarNumber(request.getCarNumber());
        List<TdCCar> cars = tdCCarDao.selectCustInfo(reqCar);
        if (CollectionUtils.isNotEmpty(cars)) {
            for (TdCCar car : cars) {
                // 修改 datastate = 0
                tdCCarDao.deleteCars(car);
            }
        }
        // 添加车牌到td_c_car
        TdCCar tdCCar = new TdCCar();
        tdCCar.setCarNumber(request.getCarNumber());
        tdCCar.setCustId(custId);
        tdCCar.setDataState(DataStatusEnum.DATA_STATUS_VALID.value());
        tdCCar.setCarNumberColor(Integer.valueOf(Optional.ofNullable(request.getCarNumberColor()).orElse("0")));
        tdCCar.setPlateTypeId(1);
        tdCCar.setExamineState(ExamineStateEnum.ReviewPass.getValue());
        tdCCar.setCardCheckState(0);
        tdCCar.setCreditScore(0);
        tdCCar.setCreateDate(new Date());
        tdCCar.setCreateEmpid(request.getCreateEmpId());
        tdCCarDao.insertCars(tdCCar);
    }

    /**
     * 添加td_c_acct_no_secret
     * @param custId
     */
    private void addAcctNoSecret(String custId) {
        TdCAcctNoSecretRequest acctNoSecretRequest = new TdCAcctNoSecretRequest();
        acctNoSecretRequest.setCustId(custId);
        acctNoSecretRequest.setAcctType(5);
        acctNoSecretRequest.setAcctOrder(1);
        acctNoSecretRequest.setIsOpen(1);
        boolean isOpen = false;
        List<TdCAcctNoSecretDTO> tdCAcctNoSecrets = tdCAcctNoSecretService.queryInFoByCustIdAndType(acctNoSecretRequest).getData();
        logger.info("西城特殊车-查询是否开通自动扣费,{}", JSONObject.toJSONString(tdCAcctNoSecrets));
        for (TdCAcctNoSecretDTO tdCAcctNoSecret : tdCAcctNoSecrets) {
            // 如果已经开通了并且优先扣费则返回
            if (tdCAcctNoSecret.getIsOpen() == 1 && tdCAcctNoSecret.getAcctOrder() == 1) {
                logger.info("西城特殊车-已经添加过td_c_acct_no_secrety, custid:{}", custId);
            } else {
                tdCAcctNoSecretService.switchPaymentState(acctNoSecretRequest);
                logger.info("西城特殊车-修改并保存td_c_acct_no_secrety:custid:{}", custId);
            }
            isOpen = true;
        }
        if (!isOpen) {
            tdCAcctNoSecretService.insertNonSensePayment(acctNoSecretRequest);
            logger.info("西城特殊车-添加td_c_acct_no_secret, custid:{}", custId);
        }
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public BizResult<Boolean> updateByPrimaryKeySelective(SpecialCarnumberBillingRequest request) {
        SpecialCarnumberBilling oriSpecialCarnumberBilling = specialCarnumberBillingDao.queryByPrimaryKey(request.getId());
        if(!oriSpecialCarnumberBilling.getPhoneNum().equals(request.getPhoneNum())) {
            TdCCustPerson custPerson = new TdCCustPerson();
            custPerson.setCustId(oriSpecialCarnumberBilling.getCustId());
            custPerson.setUserPhone(request.getPhoneNum());
            tdCCustPersonDao.updateByCustId(custPerson);
            logger.info("西城特殊车-更新td_c_cust_person, 手机号:{}", request.getPhoneNum());
        }
        if(!oriSpecialCarnumberBilling.getCarNumber().equals(request.getCarNumber())) {
            CustCarInfoQueryReq custCarInfoQueryReq = new CustCarInfoQueryReq();
            custCarInfoQueryReq.setCarNumber(oriSpecialCarnumberBilling.getCarNumber());
            List<TdCCar> cars = tdCCarDao.selectCustInfoByCarNumber(custCarInfoQueryReq);
            for ( TdCCar car: cars) {
                car.setCarNumber(request.getCarNumber());
                car.setModfiyDate(new Date());
                car.setModfiyEmpid(request.getModifyEmpId());
                tdCCarDao.updateCars(car);
                logger.info("西城特殊车-更新td_c_car, 车牌号:{}", request.getCarNumber());
            }
        }
        SpecialCarnumberBilling specialCarnumberBilling = new SpecialCarnumberBilling();
        BeanUtils.copyProperties(request, specialCarnumberBilling);
        int upNum = specialCarnumberBillingDao.updateByPrimaryKeySelective(specialCarnumberBilling);
        logger.info("西城特殊车-更新special_carnumber_billing, id:{}", request.getId());
        return new BizResult<>(upNum > 0);
    }

    /**
     * 根据手机号动态查询
     *
     * @param request
     * @return
     */
    @Override
    public BizResult<List<SpecialCarnumberBillingDTO>> querySpecialCarnumberBillingByPhone(SpecialCarnumberBillingRequest request) {
        List<SpecialCarnumberBillingDTO> specialCarnumberBillingDTOS = new ArrayList<>();
        List<SpecialCarnumberBilling> specialCarnumberBillings = specialCarnumberBillingDao.querySpecialCarnumberBillingByPhone(request);
        if (CollectionUtils.isEmpty(specialCarnumberBillings)) {
            return new BizResult<>(specialCarnumberBillingDTOS);
        }
        for (SpecialCarnumberBilling source : specialCarnumberBillings) {
            SpecialCarnumberBillingDTO dto = new SpecialCarnumberBillingDTO();
            BeanUtils.copyProperties(source, dto);
            specialCarnumberBillingDTOS.add(dto);
        }
        return new BizResult<>(specialCarnumberBillingDTOS);
    }

    /**
     * 根据车牌号动态查询
     *
     * @param request
     * @return
     */
    @Override
    public BizResult<List<SpecialCarnumberBillingDTO>> querySpecialCarnumberBillingByCarNum(SpecialCarnumberBillingRequest request) {
        List<SpecialCarnumberBillingDTO> specialCarnumberBillingDTOS = new ArrayList<>();
        List<SpecialCarnumberBilling> specialCarnumberBillings = specialCarnumberBillingDao.querySpecialCarnumberBillingByCarNum(request);
        if (CollectionUtils.isEmpty(specialCarnumberBillings)) {
            return new BizResult<>(specialCarnumberBillingDTOS);
        }
        for (SpecialCarnumberBilling source : specialCarnumberBillings) {
            SpecialCarnumberBillingDTO dto = new SpecialCarnumberBillingDTO();
            BeanUtils.copyProperties(source, dto);
            specialCarnumberBillingDTOS.add(dto);
        }
        return new BizResult<>(specialCarnumberBillingDTOS);
    }
}