InOutParkStatisticServiceImpl.java 7.26 KB
package com.zteits.park.biz;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.alibaba.fastjson.JSONObject;
import com.clouds.common.utils.ResultUtils;
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.ErrorType;
import com.zteits.clouds.api.apibase.exception.BizException;
import com.zteits.clouds.api.dto.pay.TdACardCouponsOutDTO;
import com.zteits.clouds.api.dto.pay.param.TdACardCouponsOutRequest;
import com.zteits.clouds.api.dto.park.dto.InOutParkDTO;
import com.zteits.clouds.api.dto.park.param.InOutParkRequest;
import com.zteits.clouds.api.service.clouds.InOutParkStatisticService;
import com.zteits.clouds.api.service.pay.TdACardCouponsService;
import com.zteits.park.constant.ParkConstant;
import com.zteits.park.dao.InOutParkDao;
import com.zteits.park.domain.InOutParkDO;
import com.zteits.park.pagepager.PageBeanUtil;

/**
 * 企业云平台->数据统计->进出场上报服务实现。
 *
 * <p>存量 `zteits-park` 的 `InOutParkStatisticServiceImpl` 在主干上整类被注释、Dubbo provider
 * 也早已注释掉(`dubbo-park-provider.xml`),但 `InOutParkDao` + `InOutParkSMapper.xml` 一直活着。
 * 本类按 `git show 550cba464e^:zteits-park/src/main/java/com/zteits/park/biz/InOutParkStatisticServiceImpl.java`
 * 的原始实现逐行搬运,**唯一的替换**是:存量依赖的 `TdACardCouponsService` 已随那批注释代码
 * 一起被删,本次按原实现补回(见 `parking-module-pay` 的 `TdACardCouponsServiceImpl`),
 * 仍然走「本模块 DAO 只查本模块库」的分层,不在 park 里直连 pay 库。</p>
 *
 * <h2>固定车复判的存量怪癖(照搬,红线⑥)</h2>
 * <ol>
 *   <li>`isFixedCar` 为空 → **每个车牌都复判**;非空 → **也每个都复判**,再把与入参不一致的行移除。
 *       两条分支的复判调用是同一句,存量就是重复写了两遍,**照搬**。</li>
 *   <li>复判后只有「查到卡 → `FIXEDCAR("1")`」这一条赋值;查不到卡**不改**原值
 *       (而不是像 catch 分支那样置 `TMPCAR`)—— 存量如此,照搬。</li>
 *   <li>`catch (Exception)` 里把固定车标记置 `TMPCAR("0")` 并 `printStackTrace()`,**照搬**。</li>
 *   <li>入参 `sysCode` 固定写死 `"zteits-park"`(不是请求里的 sysCode),**照搬**。</li>
 * </ol>
 */
@Service("com.zteits.park.biz.InOutParkStatisticServiceImpl")
public class InOutParkStatisticServiceImpl implements InOutParkStatisticService {

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

    @Autowired
    private InOutParkDao inOutParkDao;

    @Autowired
    private TdACardCouponsService tdACardCouponsService;

    @Override
    public BizResult<PageBean<InOutParkDTO>> queryInOutParkForList(InOutParkRequest inOutParkRequest)
        throws Exception {
        PageBean<InOutParkDTO> pageBean = new PageBean<InOutParkDTO>();
        if (inOutParkRequest == null) {
            throw new BizException(ErrorType.PARAMM_NULL, "入参不能为空!");
        }
        PageInfo<InOutParkDO> pageInfo = inOutParkDao.queryInOutParkForList(
            inOutParkRequest.getBaseRequest().getPageNum(), inOutParkRequest.getBaseRequest().getPageSize(),
            inOutParkRequest.getInOutStatus(), inOutParkRequest.getBeginTime(), inOutParkRequest.getEndTime(),
            inOutParkRequest.getPlNos(), inOutParkRequest.getIsFixedCar());
        if (pageInfo != null && pageInfo.getList() != null && pageInfo.getList().size() > 0) {
            PageBeanUtil.copyProperties(pageInfo, pageBean, InOutParkDTO.class);
            List<InOutParkDTO> list = pageBean.getDataList();
            List<InOutParkDTO> removeList = new ArrayList<>();
            for (InOutParkDTO inOutParkDTO : list) {
                if (StringUtils.isBlank(inOutParkRequest.getIsFixedCar())) {
                    //判断该车牌是否是固定车辆(包月,包年)
                    this.isFixedCar(inOutParkDTO);
                } else {
                    //判断该车牌是否是固定车辆(包月,包年)
                    this.isFixedCar(inOutParkDTO);
                    if (!inOutParkRequest.getIsFixedCar().equals(inOutParkDTO.getIsFixedCar())) {
                        removeList.add(inOutParkDTO);
                    }
                }
            }
            list.removeAll(removeList);
        } else {
            logger.info("没有查询到企业云平台数据统计进出场上报信息...");
        }
        logger.info("---end---企业云平台数据统计进出场上报分页查询,结果={}", JSONObject.toJSON(pageBean));

        return new BizResult<PageBean<InOutParkDTO>>(pageBean);
    }

    /**
     * 判断是否为固定车或临时车.
     *
     * @param inOutParkDTO 进出场上报行
     */
    private void isFixedCar(InOutParkDTO inOutParkDTO) {
        if (StringUtils.isBlank(inOutParkDTO.getIsFixedCar())
            || inOutParkDTO.getIsFixedCar().equals(ParkConstant.InterfaceLog.isFixedCar.ISFIX_ERROR)) {
            //调用接口判断
            String carNumber = inOutParkDTO.getCarNumber();
            List<String> carNumbers = new ArrayList<>();
            carNumbers.add(carNumber);
            TdACardCouponsOutRequest request = new TdACardCouponsOutRequest();
            request.setSysCode("zteits-park");
            request.setCarNumbers(carNumbers);
            //TODO 入参增加时间
            BizResult<List<TdACardCouponsOutDTO>> bizResult = null;
            logger.info("判断车牌号是否为包月或包年 请求入参为:" + JSONObject.toJSONString(request));
            try {
                bizResult = tdACardCouponsService.queryCardCouponsByCarNumbers(request);
                if (ResultUtils.isError(bizResult)) {
                    logger.info("通过车牌号查询是否为包月或包年车失败:");
                    logger.info("响应信息为:" + JSONObject.toJSONString(bizResult));
                    throw new BizException(bizResult.getErrCode(), bizResult.getErrMsg());
                }
                List<TdACardCouponsOutDTO> couponsOutDTOs = ResultUtils.getBizResultData(bizResult);
                if (!CollectionUtils.isEmpty(couponsOutDTOs)) {
                    //1 办理了包月,否则没有办理
                    String isFixedCar = couponsOutDTOs.get(0).getCoupons().equals("1")
                        ? ParkConstant.InterfaceLog.isFixedCar.FIXEDCAR
                        : ParkConstant.InterfaceLog.isFixedCar.ISFIX_ERROR;
                    inOutParkDTO.setIsFixedCar(isFixedCar);
                    //TODO 更新该进出场上报的固定车辆值

                }
            } catch (Exception e) {
                logger.info("通过车牌号查询是否为包月或包年车失败");
                //默认临时车
                inOutParkDTO.setIsFixedCar(ParkConstant.InterfaceLog.isFixedCar.TMPCAR);
                e.printStackTrace();
            }
        }
    }
}