| | |
| | | package com.matrix.system.hive.service.imp; |
| | | |
| | | import com.matrix.core.constance.MatrixConstance; |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.matrix.core.exception.GlobleException; |
| | | import com.matrix.core.pojo.PaginationVO; |
| | | import com.matrix.core.tools.WebUtil; |
| | | import com.matrix.system.common.bean.SysUsers; |
| | | import com.matrix.core.pojo.VerificationResult; |
| | | import com.matrix.core.tools.DateUtil; |
| | | import com.matrix.core.tools.LogUtil; |
| | | import com.matrix.system.common.validate.ParameterValidate; |
| | | import com.matrix.system.common.validate.group.Group; |
| | | import com.matrix.system.constance.Dictionary; |
| | | import com.matrix.system.hive.bean.*; |
| | | import com.matrix.system.hive.dao.*; |
| | | import com.matrix.system.hive.plugin.util.DateUtils; |
| | | import com.matrix.system.hive.dto.MoneyCardOperationDto; |
| | | import com.matrix.system.hive.dto.MoneyCardPayDto; |
| | | import com.matrix.system.hive.plugin.util.MoneyUtil; |
| | | import com.matrix.system.hive.service.MoneyCardUseService; |
| | | import com.matrix.system.hive.service.ShoppingGoodsService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.text.DecimalFormat; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | |
| | | |
| | | /** |
| | | * @date 2016-09-17 10:17 |
| | | */ |
| | | @Service("moneyCardUseService") |
| | | public class MoneyCardUseServiceImpl implements MoneyCardUseService { |
| | | public class MoneyCardUseServiceImpl extends ServiceImpl<MoneyCardUseDao, MoneyCardUse> implements MoneyCardUseService { |
| | | |
| | | |
| | | @Autowired |
| | |
| | | |
| | | @Autowired |
| | | private SysVipLevelDao viplevelDao; |
| | | |
| | | @Autowired |
| | | ShoppingGoodsDao shoppingGoodsDao; |
| | | |
| | | @Autowired |
| | | MoneyCardAssembleDao moneyCardAssembleDao; |
| | | @Autowired |
| | | MoneyCardUseFlowDao moneyCardUseFlowDao; |
| | | |
| | | @Autowired |
| | | private ShoppingGoodsService shoppingGoodsService; |
| | | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) { |
| | | moneyCardOperationDtos.forEach(dto -> { |
| | | //参数校验 |
| | | ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(dto, Group.ADD.class); |
| | | if (baseIdResult.hasErrors()) { |
| | | throw new GlobleException(baseIdResult.getErrors()); |
| | | } |
| | | ShoppingGoods moneyCar = shoppingGoodsDao.selectById(dto.getGoodsId()); |
| | | MoneyCardUse moneyCardUse = new MoneyCardUse(); |
| | | BeanUtil.copyProperties(dto, moneyCardUse); |
| | | moneyCardUse.setVipId(dto.getVipId()); |
| | | moneyCardUse.setGiftMoney(moneyCar.getReferencePice()); |
| | | moneyCardUse.setRealMoney(moneyCar.getSealPice()); |
| | | moneyCardUse.setGoodsId(moneyCar.getId()); |
| | | moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); |
| | | moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N); |
| | | |
| | | //余次处理 |
| | | if (moneyCar.getCarUseCount() == null || moneyCar.getCarUseCount() == 0) { |
| | | moneyCardUse.setUseTotal(999999999); |
| | | moneyCardUse.setLastCount(999999999); |
| | | } else { |
| | | moneyCardUse.setUseTotal(moneyCar.getCarUseCount()); |
| | | moneyCardUse.setLastCount(moneyCar.getCarUseCount()); |
| | | } |
| | | //失效时间处理 |
| | | Date invalidTime = shoppingGoodsService.calInvalidTime(moneyCar, 1, null); |
| | | moneyCardUse.setFailTime(invalidTime); |
| | | moneyCardUseDao.insert(moneyCardUse); |
| | | |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteByOrderItemId(Long id) { |
| | | MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); |
| | | moneyCardUseFlow.setCarUseId(id); |
| | | int i = moneyCardUseFlowDao.selectTotalRecord(moneyCardUseFlow); |
| | | if(i>0){ |
| | | MoneyCardUse one = getOne(lambdaQuery().eq(MoneyCardUse::getOrderItemId,id)); |
| | | throw new GlobleException(one.getCardName()+"储值卡已经被启用无法删除"); |
| | | }else { |
| | | moneyCardUseDao.deleteByOrderItemId(id); |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void moneyCardTk(List<MoneyCardOperationDto> moneyCardOperationDtos) { |
| | | |
| | | MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); |
| | | |
| | | moneyCardOperationDtos.forEach(moneyCardOperationDto -> { |
| | | |
| | | List<MoneyCardUse> moneyCardUseList = list(lambdaQuery().eq(MoneyCardUse::getOrderItemId, moneyCardOperationDto.getOrderItemId())); |
| | | for (MoneyCardUse moneyCardUse : moneyCardUseList) { |
| | | |
| | | moneyCardUse.setStatus(Dictionary.TAOCAN_STATUS_TK); |
| | | moneyCardUseDao.update(moneyCardUse); |
| | | |
| | | |
| | | //设置卡项使用流水 |
| | | moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); |
| | | moneyCardUseFlow.setOrderNo(moneyCardOperationDto.getOrderNo()); |
| | | moneyCardUseFlow.setVipId(moneyCardUse.getVipId()); |
| | | moneyCardUseFlow.setTimes(moneyCardUse.getLastCount()); |
| | | moneyCardUseFlow.setType(moneyCardOperationDto.getType()); |
| | | moneyCardUseFlow.setCreateTime(new Date()); |
| | | moneyCardUseFlow.setOperationId(moneyCardOperationDto.getUpdateUser()); |
| | | moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); |
| | | moneyCardUseFlowDao.insert(moneyCardUseFlow); |
| | | } |
| | | |
| | | }); |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void changeMoneyCard(List<MoneyCardPayDto> moneyCardPayDtoList) { |
| | | moneyCardPayDtoList.forEach(moneyCardPayDto -> { |
| | | if (MoneyCardUseFlow.USE_TYPE_CONSUMER.equals(moneyCardPayDto.getType())) { |
| | | //扣减储值卡余额 |
| | | deductMoneyCard(moneyCardPayDto); |
| | | } else if (MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL.equals(moneyCardPayDto.getType())) { |
| | | //回退储值卡余额 |
| | | returnMoneyCard(moneyCardPayDto); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 回退储值卡余额 |
| | | * |
| | | * @param moneyCardPayDto |
| | | */ |
| | | private void returnMoneyCard(MoneyCardPayDto moneyCardPayDto) { |
| | | LogUtil.info("回退储值卡余额 {}", JSON.toJSONString(moneyCardPayDto)); |
| | | MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardPayDto.getCarUseId()); |
| | | MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); |
| | | |
| | | if (Objects.nonNull(moneyCardPayDto.getGiftMoney())) { |
| | | //jyytodo 余额余次的修改和新增在数据库层面做加减 |
| | | moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney() + moneyCardPayDto.getGiftMoney()); |
| | | } |
| | | if (Objects.nonNull(moneyCardPayDto.getRealMoney())) { |
| | | moneyCardUse.setRealMoney(moneyCardUse.getRealMoney() + moneyCardPayDto.getRealMoney()); |
| | | } |
| | | moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); |
| | | moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); |
| | | moneyCardUseDao.update(moneyCardUse); |
| | | |
| | | |
| | | //设置卡项使用流水 |
| | | moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); |
| | | moneyCardUseFlow.setOrderNo(moneyCardPayDto.getOrderNo()); |
| | | moneyCardUseFlow.setVipId(moneyCardUse.getVipId()); |
| | | moneyCardUseFlow.setTimes(moneyCardUse.getLastCount()); |
| | | moneyCardUseFlow.setType(moneyCardPayDto.getType()); |
| | | moneyCardUseFlow.setCreateTime(new Date()); |
| | | moneyCardUseFlow.setOperationId(moneyCardPayDto.getUpdateUser()); |
| | | moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); |
| | | moneyCardUseFlowDao.insert(moneyCardUseFlow); |
| | | } |
| | | |
| | | /** |
| | | * 扣减储值余额 |
| | | * |
| | | * @param moneyCardPayDto |
| | | */ |
| | | private void deductMoneyCard(MoneyCardPayDto moneyCardPayDto) { |
| | | // 判断商品是否在充值卡的限制购买 |
| | | VerificationResult verificationResult = checkIsBangding(moneyCardPayDto.getCarUseId(), moneyCardPayDto.getGoodsIds()); |
| | | if (!verificationResult.isJudgeResult()) { |
| | | throw new GlobleException(verificationResult.getMsg()); |
| | | } |
| | | LogUtil.info("扣减储值卡余额 {}", JSON.toJSONString(moneyCardPayDto)); |
| | | MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardPayDto.getCarUseId()); |
| | | MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); |
| | | if (Objects.nonNull(moneyCardPayDto.getGiftMoney()) && moneyCardPayDto.getGiftMoney() > 0) { |
| | | if (moneyCardUse.getGiftMoney() >= moneyCardPayDto.getGiftMoney()) { |
| | | double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), moneyCardPayDto.getGiftMoney()); |
| | | moneyCardUse.setGiftMoney(surplus); |
| | | moneyCardUseFlow.setGiftMoney(0D - moneyCardPayDto.getGiftMoney()); |
| | | } else { |
| | | throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); |
| | | } |
| | | } else { |
| | | if (moneyCardUse.getRealMoney() >= moneyCardPayDto.getRealMoney()) { |
| | | double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(), moneyCardPayDto.getRealMoney()); |
| | | moneyCardUse.setRealMoney(surplus); |
| | | moneyCardUseFlow.setTotal(0 - moneyCardPayDto.getRealMoney()); |
| | | } else { |
| | | throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); |
| | | } |
| | | } |
| | | |
| | | if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) { |
| | | //余额为0时充值卡变为无效 |
| | | if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) { |
| | | moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); |
| | | moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX); |
| | | } |
| | | } |
| | | |
| | | ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId()); |
| | | if (shoppingGoods != null) { |
| | | Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime()); |
| | | moneyCardUse.setFailTime(invalidTime); |
| | | } |
| | | |
| | | moneyCardUse.setLastCount(moneyCardUse.getLastCount() - moneyCardPayDto.getCount()); |
| | | |
| | | // 更新充值卡信息 |
| | | moneyCardUseDao.update(moneyCardUse); |
| | | |
| | | //设置卡项使用流水 |
| | | moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); |
| | | moneyCardUseFlow.setOrderNo(moneyCardPayDto.getOrderNo()); |
| | | moneyCardUseFlow.setVipId(moneyCardUse.getVipId()); |
| | | moneyCardUseFlow.setTimes(moneyCardUse.getLastCount()); |
| | | moneyCardUseFlow.setType(moneyCardPayDto.getType()); |
| | | moneyCardUseFlow.setCreateTime(new Date()); |
| | | moneyCardUseFlow.setOperationId(moneyCardPayDto.getUpdateUser()); |
| | | moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); |
| | | moneyCardUseFlowDao.insert(moneyCardUseFlow); |
| | | } |
| | | |
| | | /** |
| | | * 检查商品是否在储值卡的消费范围内 |
| | | * |
| | | * @param moneyCardUseId 储值卡id |
| | | * @param goodsIds 商品id集合 |
| | | * @return |
| | | */ |
| | | private VerificationResult checkIsBangding(Long moneyCardUseId, List<Long> goodsIds) { |
| | | // 如果是一卡通则肯定在绑定范围内 |
| | | MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardUseId); |
| | | //默认储值卡可以购买所有产品 |
| | | if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) { |
| | | return VerificationResult.success(); |
| | | } else { |
| | | // 不是默认储值卡判断卡是否可应用于所有产品 |
| | | ShoppingGoods cardGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId()); |
| | | if (cardGoods != null) { |
| | | if (Dictionary.FLAG_YES.equals(cardGoods.getGoodType())) { |
| | | return VerificationResult.success(); |
| | | } |
| | | } |
| | | // 比较分类 |
| | | MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble(); |
| | | moneyCardAssemble.setCardId(moneyCardUse.getGoodsId()); |
| | | List<MoneyCardAssemble> cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble); |
| | | List<ShoppingGoods> yhGoods = shoppingGoodsDao.selectByIds(goodsIds); |
| | | |
| | | StringBuilder msgBuilder = new StringBuilder(); |
| | | |
| | | for (ShoppingGoods goods : yhGoods) { |
| | | boolean isMatch = false; |
| | | for (MoneyCardAssemble cardAssemble : cardAssembleList) { |
| | | // 比较类型 |
| | | if (cardAssemble.getType().equals(Dictionary.CZK_ASSEMBLE_FL)) { |
| | | |
| | | if (goods.getCateId().equals(cardAssemble.getCateId())) { |
| | | isMatch = true; |
| | | break; |
| | | } |
| | | } else { |
| | | // 比较绑定 |
| | | if (goods.getId().equals(cardAssemble.getGoodsId())) { |
| | | isMatch = true; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | if (!isMatch) { |
| | | msgBuilder.append(goods.getName() + "不在" + moneyCardUse.getCardName() + "优惠中 "); |
| | | } |
| | | } |
| | | if (msgBuilder.length() > 0) { |
| | | return VerificationResult.fail(msgBuilder.toString()); |
| | | } else { |
| | | return VerificationResult.success(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public int add(MoneyCardUse moneyCardUse) { |
| | |
| | | content.append("获取会员" + getObj.getVipInfo().getVipName() + "的" + getObj.getCardName()) |
| | | .append(",余次:" + getObj.getLastCountName()) |
| | | .append(",本金余额:" + getObj.getRealMoney()) |
| | | .append(",有效期:" + DateUtils.dateToString(getObj.getFailTime(), DateUtils.DATE_FORMAT_MM)) |
| | | .append(",有效期:" + DateUtil.dateToString(getObj.getFailTime(), DateUtil.DATE_FORMAT_MM)) |
| | | .append(",是否赠送:" + getObj.getSourceName()); |
| | | } |
| | | } |
| | | |
| | | //退款 |
| | | @Override |
| | | public int returnMoney(MoneyCardUse moneyCardUse, Long hjkId) { |
| | | |
| | | |
| | | MoneyCardUse realObj = moneyCardUseDao.selectById(moneyCardUse.getId()); |
| | | |
| | | //检测商品是否已付款完成 |
| | | if (realObj.getOrderItemId() != 1) {//不是数据迁移过来的判断付款状态 |
| | | checkOrderStatu(realObj.getOrderItemId()); |
| | | } |
| | | |
| | | if (!realObj.getStatus().equals(Dictionary.TAOCAN_STATUS_YX)) { |
| | | throw new GlobleException("不是有效充值卡"); |
| | | } |
| | | |
| | | if (realObj.getSource().contains(Dictionary.TAOCAN_SOURCE_ZR)) { |
| | | throw new GlobleException("转让的充值卡不能退款"); |
| | | } |
| | | if (realObj.getSource().contains(Dictionary.TAOCAN_SOURCE_ZS)) { |
| | | throw new GlobleException("赠送的充值卡不能退款"); |
| | | } |
| | | |
| | | if (Dictionary.FLAG_YES_Y.equals(realObj.getIsVipCar())) { |
| | | //更新会员等级 |
| | | realObj.getVipInfo().setLevelId(0L); |
| | | infoDao.update(realObj.getVipInfo()); |
| | | } |
| | | StringBuilder content = new StringBuilder(); |
| | | |
| | | //有会籍卡退到会籍卡中,无则退了现金 |
| | | if (hjkId != null && !hjkId.equals("")) { |
| | | MoneyCardUse vipCard = moneyCardUseDao.selectById(hjkId); |
| | | vipCard.setRealMoney(vipCard.getRealMoney() + realObj.getRealMoney()); |
| | | moneyCardUseDao.update(vipCard); |
| | | content.append(realObj.getCardName() + "退款¥" + realObj.getRealMoney() + "到会籍卡") |
| | | .append(vipCard.getCardName()) |
| | | .append(",余次:" + vipCard.getLastCountName()) |
| | | .append(",本金余额:" + vipCard.getRealMoney()) |
| | | .append(",有效期:" + DateUtils.dateToString(vipCard.getFailTime(), DateUtils.DATE_FORMAT_MM)) |
| | | .append(",是否赠送:" + vipCard.getSourceName()); |
| | | } else { |
| | | content.append(realObj.getCardName() + "退款现金¥" + moneyCardUse.getReturnMonery() + ""); |
| | | } |
| | | DecimalFormat df = new DecimalFormat("#.00"); |
| | | double d = Double.valueOf(df.format(realObj.getRealMoney() - Double.valueOf(moneyCardUse.getReturnMonery()))); |
| | | //退款的本金为零,状态为已退款 |
| | | realObj.setRealMoney(d); |
| | | //赠送金额也清零 |
| | | realObj.setGiftMoney(0.0); |
| | | if (d <= 0) { |
| | | realObj.setStatus(Dictionary.TAOCAN_STATUS_TK); |
| | | } |
| | | int i = moneyCardUseDao.update(realObj); |
| | | SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); |
| | | //新增退款流水 |
| | | return i; |
| | | } |
| | | |
| | | //设置为有效 |
| | | @Override |
| | |
| | | } |
| | | } |
| | | moneyCardUseDao.update(proj); |
| | | StringBuilder content = new StringBuilder(); |
| | | content.append(proj.getCardName() + "设置有效"); |
| | | |
| | | } |
| | | |
| | | //设置为失效 |