package com.zteits.business.biz.impl; import org.apache.commons.collections4.CollectionUtils; import com.clouds.common.utils.ListCopyUtil; import com.github.pagehelper.PageInfo; import com.xiaoleilu.hutool.util.BeanUtil; import com.zteits.business.dao.OrderBusinessCouponSubDao; import com.zteits.business.dao.TdCBusinessCouponDao; import com.zteits.business.dao.TdCBusinessCouponRuleParkRelDao; import com.zteits.business.domain.*; import com.zteits.business.mapper.TdCBusinessCouponMapper; import com.zteits.business.mapper.TdCBusinessOrderParkRecordMapper; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.bean.PageBean; import com.zteits.clouds.api.apibase.constants.DataStatusEnum; import com.zteits.clouds.api.dto.business.dto.TdCBusinessCouponDTO; import com.zteits.clouds.api.dto.business.dto.TdCBusinessCouponDetailSummaryDTO; import com.zteits.clouds.api.dto.business.dto.TdCBusinessCouponSumStaDTO; import com.zteits.clouds.api.dto.business.dto.TdCBusinessOrderParkRecordDTO; import com.zteits.clouds.api.dto.business.param.*; import com.zteits.clouds.api.dto.clouds.param.BatchDeleteByPrimaryKeyRequest; import com.zteits.clouds.api.dto.clouds.param.BusinessCouponBatchSaveRequest; import com.zteits.clouds.api.dto.order.parkorder.dto.OrderParkDTO; import com.zteits.clouds.api.service.business.TdCBusinessCouponService; import com.zteits.sys.pagepaper.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 java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Component public class TdCBusinessCouponServiceImpl implements TdCBusinessCouponService { private static final Logger logger = LoggerFactory.getLogger(TdCBusinessCouponServiceImpl.class); @Autowired private TdCBusinessCouponDao tdCBusinessCouponDao; @Autowired private TdCBusinessCouponRuleParkRelDao tdCBusinessCouponRuleParkRelDao; @Autowired private OrderBusinessCouponSubDao orderBusinessCouponSubDao; // 对应 商户停车订单减免记录表 td_c_business_order_park_record @Autowired private TdCBusinessOrderParkRecordMapper businessOrderParkRecordMapper; @Autowired private TdCBusinessCouponMapper tdCBusinessCouponMapper; @Override public BizResult> queryTdCBusinessCoupon(TdCBusinessCouponRequest request) { List tdCBusinessCouponDTOS = new ArrayList<>(); List tdCBusinessCoupons = tdCBusinessCouponDao.queryTdCBusinessCoupon(request); if(CollectionUtils.isEmpty(tdCBusinessCoupons)){ return new BizResult<>(tdCBusinessCouponDTOS); } for (TdCBusinessCoupon source:tdCBusinessCoupons){ TdCBusinessCouponDTO dto = new TdCBusinessCouponDTO(); BeanUtils.copyProperties(source,dto); tdCBusinessCouponDTOS.add(dto); } return new BizResult<>(tdCBusinessCouponDTOS); } /** * 根据cardNo 查询信息 * * @param request * @return */ @Override public BizResult queryTdCBusinessCouponByCardNo(TdCBusinessCouponRequest request) { TdCBusinessCouponDTO dto = null; TdCBusinessCoupon entity = tdCBusinessCouponDao.queryByCardNo(request.getCardNo()); if(entity != null){ dto = new TdCBusinessCouponDTO(); BeanUtils.copyProperties(entity, dto); } return new BizResult<>(dto); } @Override public BizResult> queryTdCBusinessCouponForPage(TdCBusinessCouponRequest request) { PageBean pageBean = new PageBean<>(); PageInfo pageInfo = tdCBusinessCouponDao.queryTdCBusinessCouponForPage(request); if (pageInfo != null && pageInfo.getList() != null && pageInfo.getList().size() > 0) { PageBeanUtil.copyProperties(pageInfo, pageBean, TdCBusinessCouponDTO.class); } return new BizResult<>(pageBean); } @Override public BizResult batchDeleteTdCBusinessCouponByPrimaryKey(BatchDeleteByPrimaryKeyRequest request) { int delenum = tdCBusinessCouponDao.batchDeleteTdCBusinessCouponByPrimaryKey(request.getIds(),request.getOpId(),request.getsOpName()); return new BizResult<>(delenum>0); } @Override public BizResult saveTdCBusinessCoupon(TdCBusinessCouponRequest request) { TdCBusinessCoupon tdCBusinessCoupon = new TdCBusinessCoupon(); BeanUtils.copyProperties(request,tdCBusinessCoupon); int saveNum = tdCBusinessCouponDao.saveTdCBusinessCoupon(tdCBusinessCoupon); return new BizResult<>(saveNum>0); } /** * 批量根据卡号将状态修改为已使用 * * @param request */ @Override public BizResult batchUpdateCouponUsedStatus(BusinessCouponBatchSaveRequest request) { tdCBusinessCouponDao.batchUpdateCouponUsedStatus(request); return new BizResult<>(Boolean.TRUE); } /** * 批量保存 * * @param requests */ @Override public BizResult batchSaveTdCBusinessCoupon(BusinessCouponBatchSaveRequest requests) { int saveNum = tdCBusinessCouponDao.batchSaveTdCBusinessCoupon(requests.getRequests()); return new BizResult<>(saveNum>0); } @Override public BizResult updateByPrimaryKeySelective(TdCBusinessCouponRequest request) { TdCBusinessCoupon tdCBusinessCoupon = new TdCBusinessCoupon(); BeanUtils.copyProperties(request,tdCBusinessCoupon); int upNum = tdCBusinessCouponDao.updateByPrimaryKeySelective(tdCBusinessCoupon); return new BizResult<>(upNum>0); } /** * 车主领取完商户券 * 1、修改那张商户券使用状态和下发状态 * 2、修改该类别优惠券总的数量 * 3、记录到商户停车订单减免记录表 * @param businessCouponRequest * @param businessCouponRuleParkRelRequest * @param orderParkDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public BizResult handleBusinessCoupon(TdCBusinessCouponRequest businessCouponRequest, TdCBusinessCouponRuleParkRelRequest businessCouponRuleParkRelRequest, OrderParkDTO orderParkDTO) { // 更新优惠券使用状态为已使用和已下发 TdCBusinessCoupon tdCBusinessCoupon = new TdCBusinessCoupon(); BeanUtils.copyProperties(businessCouponRequest,tdCBusinessCoupon); int num1 = tdCBusinessCouponDao.updateByPrimaryKeySelective(tdCBusinessCoupon); logger.info("领取优惠券-修改优惠使用和下发状态, 更新数据个数:{}",num1); // 修改优惠券状态总和 TdCBusinessCouponRuleParkRel tdCBusinessCouponRuleParkRel = new TdCBusinessCouponRuleParkRel(); BeanUtils.copyProperties(businessCouponRuleParkRelRequest, tdCBusinessCouponRuleParkRel); int num2 = tdCBusinessCouponRuleParkRelDao.updateByPrimaryKeySelective(tdCBusinessCouponRuleParkRel); logger.info("领取优惠券-修改优惠券总和, 更新数据个数:{}",num2); // 增加商户停车订单减免记录表 TdCBusinessOrderParkRecord businessOrderParkRecord = new TdCBusinessOrderParkRecord(); businessOrderParkRecord.setOrderId(orderParkDTO.getOrderId()); businessOrderParkRecord.setPlNo(orderParkDTO.getPlNo()); businessOrderParkRecord.setPlName(orderParkDTO.getPlName()); businessOrderParkRecord.setCarNumber(orderParkDTO.getCarNumber()); businessOrderParkRecord.setParkInTime(orderParkDTO.getParkInTime()); businessOrderParkRecord.setBusinessId(businessCouponRequest.getBusinessId()); businessOrderParkRecord.setBusinessName(businessCouponRequest.getBusinessName()); businessOrderParkRecord.setbCouponId(businessCouponRequest.getId()); businessOrderParkRecord.setbCouponCode(businessCouponRequest.getCardNo()); businessOrderParkRecord.setType(businessCouponRequest.getCardType()); if(businessCouponRequest.getDiscValue() != null && !businessCouponRequest.getDiscValue().isEmpty()){ businessOrderParkRecord.setRealValue(Integer.valueOf(businessCouponRequest.getDiscValue())); } businessOrderParkRecord.setDataState(1); businessOrderParkRecord.setOrgId(orderParkDTO.getOrgId()); businessOrderParkRecord.setCreateEmpId(businessCouponRequest.getCreateEmpid()); businessOrderParkRecord.setCreateDate(new Date()); businessOrderParkRecord.setTypeName(businessCouponRequest.getCardRuleName()); int num3 = businessOrderParkRecordMapper.insertSelective(businessOrderParkRecord); logger.info("领取优惠券-增加商户停车订单减免记录表, 增加数据个数:{}",num3); return new BizResult<>(true); } /** * 卡券申领明细表 * @param request * @return */ @Override public BizResult> queryTdCBusinessCouponIssuedForPage(TdCBusinessCouponRequest request) { PageBean pageBean = new PageBean<>(); PageInfo pageInfo = tdCBusinessCouponDao.queryTdCBusinessCouponIssuedForPage(request); if (pageInfo != null && pageInfo.getList() != null && pageInfo.getList().size() > 0) { PageBeanUtil.copyProperties(pageInfo, pageBean, TdCBusinessCouponDTO.class); } return new BizResult<>(pageBean); } /** * 根据表td_c_business_coupon_rule_park_rel中的card_rel_park_no字段查询表td_c_business_coupon对应的没有使用的商券 仅返回一条 * * @param request * @return */ @Override public BizResult selectOneBusinessCouponByRelNo(TdCBusinessCouponRuleParkRelRequest request) { TdCBusinessCoupon businessCoupon = tdCBusinessCouponDao.selectOneBusinessCouponByRelNo(request.getCardRelParkNo()); TdCBusinessCouponDTO dto = new TdCBusinessCouponDTO(); if (businessCoupon != null) { BeanUtil.copyProperties(businessCoupon, dto); } return new BizResult<>(dto); } /** * 车辆出场未产生费用时候,将这个车下发的优惠券回收 */ @Override @Transactional(rollbackFor = Exception.class) public BizResult businessCouponCallBack(BusCouponCallBackRequest request) { // 根据停车场编号以及车牌号码,从 td_c_business_coupon 中获取已发放,未使用的列表 List couponList = getIssuedUnUsedCouponList(request.getPlNo(), request.getCarNumber()); if(CollectionUtils.isEmpty(couponList)){ return new BizResult<>(0); } logger.info("待回收的优惠券个数:{}", couponList.size()); // 回收下发的优惠券 this.callBackCoupon(couponList); // 根据优惠券购买的订单号,获取关联的 规则关联车场编码 集合 List cardRelParkNoList = this.queryCardRelParkNoListByOrderIds(couponList); // 修改 td_c_business_coupon_rule_park_rel card_num 增加 1 this.addBusinessCouponRuleParkRelCardNum(cardRelParkNoList); return new BizResult<>(couponList.size()); } /** * 卡券申领明细总览 * @param request * @return */ @Override public BizResult couponDetailSummary(TdCBusinessCouponRequest request) { // // 共18张券被领取,合计金额100.00元,其中已使用16张 TdCBusinessCouponDetailSummaryDTO dto = new TdCBusinessCouponDetailSummaryDTO(); /**被领取张数*/ int issuedCount = tdCBusinessCouponDao.getIssuedCount(request); /**使用张数*/ int usedCount = tdCBusinessCouponDao.getUsedCount(request); /**金额*/ String totalFee = tdCBusinessCouponDao.couponDetailSummary(request); if(totalFee!=null && !totalFee.equals("")){ dto.setTotalFee(totalFee); }else{ dto.setTotalFee("0"); } dto.setIssuedCount(issuedCount); dto.setUsedCount(usedCount); return new BizResult<>(dto); } /** * td_c_business_coupon_rule_park_rel card_num 增加1 */ private void addBusinessCouponRuleParkRelCardNum(List cardRelParkNoList) { if(CollectionUtils.isEmpty(cardRelParkNoList)){ return; } for(String relNo : cardRelParkNoList){ tdCBusinessCouponRuleParkRelDao.addBusinessCouponRuleParkRelCardNum(relNo, 1); } } /** * 根据优惠券购买的订单号,获取关联的 规则关联车场编码 集合 */ private List queryCardRelParkNoListByOrderIds( List couponList ) { // 根据优惠券购买的订单号,获取关联的 规则关联车场编码 集合 List orderCouponIds = couponList.stream().map(TdCBusinessCoupon::getOrderId).collect(Collectors.toList()); OrderBusinessCouponSubExample queryExample = new OrderBusinessCouponSubExample(); queryExample.createCriteria().andOrderNoIn(orderCouponIds); List orderBusinessCouponSubs = orderBusinessCouponSubDao.selectByExample(queryExample); return orderBusinessCouponSubs.stream().map(OrderBusinessCouponSub::getCardRelParkNo).collect(Collectors.toList()); } /** * 将已经发放 未使用的优惠券设置未 未发放、未使用的状态 * 修改 td_c_business_coupon 表 * `issued` 是否发放 0:未发放 1:已发放', 修改未 0 * `is_uesed` '是否已使用 1:已使用/绑定 0:未使用', 修改未 0 */ private void callBackCoupon(List couponList ) { // 获取优惠券ID集合 List ids = couponList.stream().map(TdCBusinessCoupon::getId).collect(Collectors.toList()); TdCBusinessCoupon record = new TdCBusinessCoupon(); // 设置是否发放 0:未发放 1:已发放 record.setIssued(0); // 设置是否已使用 1:已使用/绑定 0:未使用 record.setIsUesed(0); TdCBusinessCouponExample updateQuery = new TdCBusinessCouponExample(); updateQuery.createCriteria().andIdIn(ids); tdCBusinessCouponDao.updateByExampleSelective(record, updateQuery); } /** * 根据商户券卡编号 设置为已经使用 修改IsUesed为1 已使用状态 * @param request */ @Override public int setCouponUsed(TdCBusinessCouponRequest request) { TdCBusinessCoupon record = new TdCBusinessCoupon(); // 设置是否发放 0:未发放 1:已发放 record.setIssued(1); // 设置是否已使用 1:已使用/绑定 0:未使用 record.setIsUesed(1); TdCBusinessCouponExample updateQuery = new TdCBusinessCouponExample(); updateQuery.createCriteria().andCardNoEqualTo(request.getCardNo()); return tdCBusinessCouponDao.updateByExampleSelective(record, updateQuery); } /** * 设置 td_c_business_order_park_record 数据无效 * 更新商户券使用状态td_c_business_coupon * 修改 td_c_business_coupon_rule_park_rel card_num 增加 1 * @param request */ @Transactional(rollbackFor = Exception.class) @Override public int setBusinessOrderParkRecordDataInvalid(BusinessOrderParkRecordRequest request) { // 1、更新车辆券使用记录表td_c_business_order_park_record TdCBusinessOrderParkRecord businessOrderParkRecord = new TdCBusinessOrderParkRecord(); businessOrderParkRecord.setDataState(0); TdCBusinessOrderParkRecordExample example = new TdCBusinessOrderParkRecordExample(); example.createCriteria().andBCouponCodeEqualTo(request.getCouponCode()); businessOrderParkRecordMapper.updateByExampleSelective(businessOrderParkRecord,example); logger.info("商户券{}--更新车辆领取记录表",request.getCouponCode()); //2、更新商户券使用状态td_c_business_coupon TdCBusinessCoupon record = new TdCBusinessCoupon(); // 设置是否发放 0:未发放 1:已发放 record.setIssued(0); // 设置是否已使用 1:已使用/绑定 0:未使用 record.setIsUesed(0); TdCBusinessCouponExample updateQuery = new TdCBusinessCouponExample(); updateQuery.createCriteria().andCardNoEqualTo(request.getCouponCode()); tdCBusinessCouponDao.updateByExampleSelective(record, updateQuery); logger.info("商户券{}--更新商户券表",request.getCouponCode()); //3、根据优惠券购买的订单号,获取关联的 规则关联车场编码 集合 TdCBusinessCoupon businessCoupon = tdCBusinessCouponDao.queryByCardNo(request.getCouponCode()); List list = orderBusinessCouponSubDao.queryOrderBusinessCouponSubByOrderNo(businessCoupon.getOrderId()); if(list != null && list.size() > 0 ){ List cardRelParkNoList = new ArrayList<>(); cardRelParkNoList.add(list.get(0).getCardRelParkNo()); // 修改 td_c_business_coupon_rule_park_rel card_num 增加 1 this.addBusinessCouponRuleParkRelCardNum(cardRelParkNoList); logger.info("商户券{}--更新商户券数量",request.getCouponCode()); } return 1; } /** * 根据停车场编号以及车牌号码,从 td_c_business_coupon 中获取已发放,未使用的列表 */ private List getIssuedUnUsedCouponList(String plNo, String carNumber) { TdCBusinessCouponExample couponQuery = new TdCBusinessCouponExample(); couponQuery.createCriteria().andPlNoEqualTo(plNo) .andCarNumberEqualTo(carNumber) .andIsUesedEqualTo(0) .andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); return tdCBusinessCouponDao.selectByExample(couponQuery); } /** * 根据停车场编、车牌号码和领券时间条件,从 td_c_business_coupon中获取已领取但未使用的列表, */ @Override public List getIssuedAndUnUsedCouponList(TdCBusinessCouponRequest request) { // plNo在数据库存储的形式["P15040000000058"],此处进行转换 String plNoDTO = "[\"" + request.getPlNo() + "\"]"; TdCBusinessCouponExample couponQuery = new TdCBusinessCouponExample(); couponQuery.createCriteria() .andPlNoEqualTo(plNoDTO) .andCarNumberEqualTo(request.getCarNumber()) .andIsUesedEqualTo(0) .andIssuedEqualTo(1) .andIssuedEffDateGreaterThan(request.getEndTime()) .andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); List list = tdCBusinessCouponDao.selectByExample(couponQuery); List businessCoupons = new ArrayList<>(); ListCopyUtil.listCopyProperties(list, businessCoupons, TdCBusinessCouponDTO.class); return businessCoupons; } /** * 根据商户券编号couponCode 更新表 td_c_business_order_park_record 加入出场时间、实际金额、应付金额 * @param request * couponCode 商户券 * parkOutTime 出场时间 * orderActFee 实缴费用 * orderTotalFee 应付费用 */ @Override public int updateBusinessOrderParkRecord(BusinessOrderParkRecordRequest request){ TdCBusinessOrderParkRecord businessOrderParkRecord = new TdCBusinessOrderParkRecord(); businessOrderParkRecord.setParkOutTime(request.getParkOutTime()); businessOrderParkRecord.setOrderActFee(request.getOrderActFee()); businessOrderParkRecord.setOrderTotalFee(request.getOrderTotalFee()); businessOrderParkRecord.setParkingDuration(request.getParkingDuration()); if(request.getRealValue() != null && !request.getRealValue().isEmpty()){ businessOrderParkRecord.setRealValue(Integer.valueOf(request.getRealValue())); } TdCBusinessOrderParkRecordExample example = new TdCBusinessOrderParkRecordExample(); example.createCriteria().andBCouponCodeEqualTo(request.getCouponCode()) .andDataStateEqualTo(1); return businessOrderParkRecordMapper.updateByExampleSelective(businessOrderParkRecord,example); } /** * 根据商户券编号couponCode 更新表 td_c_business_order_park_record 加入出场时间、实际金额、应付金额 * * @param request * couponCode 商户券 * parkOutTime 出场时间 * orderActFee 实缴费用 * orderTotalFee 应付费用 * carNumber 车牌号码 */ @Override public int updateBusinessOrderParkRecord(BusinessOrderParkRecordRequest request,String carNumber){ TdCBusinessOrderParkRecord businessOrderParkRecord = new TdCBusinessOrderParkRecord(); businessOrderParkRecord.setParkOutTime(request.getParkOutTime()); businessOrderParkRecord.setOrderActFee(request.getOrderActFee()); businessOrderParkRecord.setOrderTotalFee(request.getOrderTotalFee()); businessOrderParkRecord.setParkingDuration(request.getParkingDuration()); businessOrderParkRecord.setCarType(request.getCarType()); if(request.getRealValue() != null && !request.getRealValue().isEmpty()){ businessOrderParkRecord.setRealValue(Integer.valueOf(request.getRealValue())); } TdCBusinessOrderParkRecordExample example = new TdCBusinessOrderParkRecordExample(); example.createCriteria().andBCouponCodeEqualTo(request.getCouponCode()) .andDataStateEqualTo(1) .andCarNumberEqualTo(carNumber); return businessOrderParkRecordMapper.updateByExampleSelective(businessOrderParkRecord,example); } /** * 20221214增加商户券使用统计表 */ @Override public BizResult> queryTdCBusinessCouponSumStaForPage(TdCBusinessCouponSumStaRequest request) { PageBean pageBean = new PageBean<>(); PageInfo pageInfo = tdCBusinessCouponDao.queryTdCBusinessCouponSumStaForPage(request); if (pageInfo != null && pageInfo.getList() != null && pageInfo.getList().size() > 0) { PageBeanUtil.copyProperties(pageInfo, pageBean, TdCBusinessCouponSumStaDTO.class); } return new BizResult<>(pageBean); } /** * 通过orderId获取一条商户停车订单减免记录表数据 * @param tdCBusinessCouponRequest * @return */ @Override public BizResult getBusinessOrderParkRecord(TdCBusinessCouponRequest tdCBusinessCouponRequest) { TdCBusinessOrderParkRecordExample tdCBusinessOrderParkRecordExample = new TdCBusinessOrderParkRecordExample(); tdCBusinessOrderParkRecordExample.createCriteria() .andOrderIdEqualTo(tdCBusinessCouponRequest.getOrderId()); List list = businessOrderParkRecordMapper.selectByExample(tdCBusinessOrderParkRecordExample); if (CollectionUtils.isEmpty(list)) { return new BizResult<>(null); } else { TdCBusinessOrderParkRecordDTO tdCBusinessOrderParkRecordDTO = new TdCBusinessOrderParkRecordDTO(); BeanUtils.copyProperties(list.get(0), tdCBusinessOrderParkRecordDTO); return new BizResult<>(tdCBusinessOrderParkRecordDTO); } } /** * 根据orderpark停车订单号查询领取优惠券的信息和使用状态 * @param tdCBusinessCouponRequest * @return */ @Override public BizResult getBusinessCouponByOrderId(TdCBusinessCouponRequest tdCBusinessCouponRequest) { TdCBusinessOrderParkRecordExample tdCBusinessOrderParkRecordExample = new TdCBusinessOrderParkRecordExample(); tdCBusinessOrderParkRecordExample.createCriteria() .andOrderIdEqualTo(tdCBusinessCouponRequest.getOrderId()); List list = businessOrderParkRecordMapper.selectByExample(tdCBusinessOrderParkRecordExample); if (CollectionUtils.isNotEmpty(list)) { TdCBusinessOrderParkRecord tdCBusinessOrderParkRecord = list.get(0); TdCBusinessCouponExample tdCBusinessCouponExample = new TdCBusinessCouponExample(); // 领取但是没有使用 tdCBusinessCouponExample.createCriteria() .andIdEqualTo(tdCBusinessOrderParkRecord.getbCouponId()) .andIssuedEqualTo(1) .andIsUesedEqualTo(0); List tdCBusinessCouponList = tdCBusinessCouponMapper.selectByExample(tdCBusinessCouponExample); if (CollectionUtils.isNotEmpty(tdCBusinessCouponList)) { TdCBusinessCoupon tdCBusinessCoupon = tdCBusinessCouponList.get(0); TdCBusinessCouponDTO tdCBusinessCouponDTO = new TdCBusinessCouponDTO(); BeanUtils.copyProperties(tdCBusinessCoupon, tdCBusinessCouponDTO); return new BizResult<>(tdCBusinessCouponDTO); } } return new BizResult<>(null); } }