package com.matrix.system.hive.service.imp; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.pojo.VerificationResult; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.LogUtil; import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.validate.GroupValidateStatusCheckUtil; 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.dto.MoneyCardOperationDto; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.service.MoneyCardUseService; import com.matrix.system.hive.service.ShoppingGoodsService; import com.matrix.system.hive.service.SysOrderService; import com.matrix.system.hive.validation.MoneyCardUseGroup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Objects; /** * @date 2016-09-17 10:17 */ @Service("moneyCardUseService") public class MoneyCardUseServiceImpl extends ServiceImpl implements MoneyCardUseService { @Autowired private MoneyCardUseDao moneyCardUseDao; @Autowired private MoneyCardUseFreezeDao moneyCardUseFreezeDao; @Autowired private SysVipInfoDao infoDao; @Autowired private SysOrderItemDao orderItemDao; @Autowired SysOrderService sysOrderService; @Autowired private SysVipLevelDao viplevelDao; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired MoneyCardAssembleDao moneyCardAssembleDao; @Autowired MoneyCardUseFlowDao moneyCardUseFlowDao; @Autowired SysUsersDao sysUsersDao; @Autowired private ShoppingGoodsService shoppingGoodsService; @Override @Transactional(rollbackFor = Exception.class) public void addVipMoneyCard(List moneyCardOperationDtos) { moneyCardOperationDtos.forEach(dto -> { //参数校验 GroupValidateStatusCheckUtil.check(dto,Group.ADD.class); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(dto.getGoodsId()); MoneyCardUse moneyCardUse = new MoneyCardUse(); BeanUtil.copyProperties(dto, moneyCardUse); moneyCardUse.setGiftMoney(shoppingGoods.getReferencePice()); moneyCardUse.setRealMoney(shoppingGoods.getSealPice()); moneyCardUse.setGoodsId(shoppingGoods.getId()); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N); moneyCardUse.setCardName(shoppingGoods.getName()); //余次处理 if (shoppingGoods.getCarUseCount() == null || shoppingGoods.getCarUseCount() == 0) { moneyCardUse.setUseTotal(999999999); moneyCardUse.setLastCount(999999999); } else { moneyCardUse.setUseTotal(shoppingGoods.getCarUseCount()); moneyCardUse.setLastCount(shoppingGoods.getCarUseCount()); } //失效时间处理 Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null); moneyCardUse.setFailTime(invalidTime); moneyCardUseDao.insert(moneyCardUse); }); } @Override public void deleteByOrderItemId(Long orderItemId) { List moneyCardUseList = getMoneyCardUseListByOrderItemId(orderItemId); moneyCardUseList.forEach(moneyCardUse -> { MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); int i = moneyCardUseFlowDao.selectTotalRecord(moneyCardUseFlow); if(i>0){ throw new GlobleException(moneyCardUse.getCardName()+"储值卡已经被启用无法删除"); }else { LogUtil.info("根据订单明细id{},删除储值卡:{}", orderItemId,moneyCardUse.getCardName()); moneyCardUseDao.deleteById(moneyCardUse.getId()); } }); } @Override public void moneyCardTk(List moneyCardOperationDtos) { moneyCardOperationDtos.forEach(moneyCardOperationDto -> { GroupValidateStatusCheckUtil.check(moneyCardOperationDto, MoneyCardUseGroup.moneyCardUseTk.class); List moneyCardUseList = getMoneyCardUseListByOrderItemId(moneyCardOperationDto.getOrderItemId()); for (MoneyCardUse moneyCardUse : moneyCardUseList) { //本金扣款 if (moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney() >= 0) { double surplus = MoneyUtil.add(moneyCardUse.getRealMoney(), moneyCardOperationDto.getRealMoney()); moneyCardUse.setRealMoney(surplus); } else { throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); } //余额为0时充值卡变为无效 if (moneyCardUse.getRealMoney().equals(0D)) { moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.TAOCAN_STATUS_TK); } moneyCardUse.setGiftMoney(0D); moneyCardUseDao.update(moneyCardUse); saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } }); } /** * 根据订单明细id查询会员卡 * @param orderItemId * @return */ private List getMoneyCardUseListByOrderItemId(Long orderItemId) { LambdaQueryWrapper lambdaQueryChainWrapper = new LambdaQueryWrapper(); lambdaQueryChainWrapper.eq(MoneyCardUse::getOrderItemId, orderItemId); List moneyCardUseList = list(lambdaQueryChainWrapper); return moneyCardUseList; } /** * 保存储值卡流水 * @param moneyCardOperationDto * @param moneyCardUse */ private void saveMoneyCardUseFlow(MoneyCardOperationDto moneyCardOperationDto,MoneyCardUse moneyCardUse){ MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); 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.setTotal(moneyCardUse.getRealMoney()); moneyCardUseFlow.setGiftMoney(moneyCardUse.getGiftMoney()); moneyCardUseFlow.setTotal(moneyCardOperationDto.getRealMoney()); moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); moneyCardUseFlow.setStaffName(sysUsersDao.selectById(moneyCardOperationDto.getUpdateUser()).getSuName()); moneyCardUseFlowDao.insert(moneyCardUseFlow); } @Override @Transactional(rollbackFor = Exception.class) public void changeMoneyCard(List moneyCardOperationDtoList) { moneyCardOperationDtoList.forEach(moneyCardOperationDto -> { if (MoneyCardUseFlow.USE_TYPE_CONSUMER.equals(moneyCardOperationDto.getType())) { //储值卡支付订单 扣减储值卡余额 GroupValidateStatusCheckUtil.check(moneyCardOperationDto,MoneyCardUseGroup.moneyCardUseOrderChange.class); moneyCardPayOrder(moneyCardOperationDto); } else if (MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL.equals(moneyCardOperationDto.getType())) { //回退储值卡余额 GroupValidateStatusCheckUtil.check(moneyCardOperationDto,MoneyCardUseGroup.moneyCardUseOrderChange.class); returnMoneyCard(moneyCardOperationDto); } else if (MoneyCardUseFlow.USE_TYPE_CZ.equals(moneyCardOperationDto.getType())) { //回退储值卡余额 GroupValidateStatusCheckUtil.check(moneyCardOperationDto,MoneyCardUseGroup.moneyCardUseCz.class); moneyCardCz(moneyCardOperationDto); } }); } /** * 会员卡充值 * @param moneyCardOperationDto */ private void moneyCardCz(MoneyCardOperationDto moneyCardOperationDto) { LogUtil.info("会员卡充值 {}", JSON.toJSONString(moneyCardOperationDto)); MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardOperationDto.getCarUseId()); if (Objects.nonNull(moneyCardOperationDto.getGiftMoney())) { //jyytodo 余额余次的修改和新增在数据库层面做加减 moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney() + moneyCardOperationDto.getGiftMoney()); } if (Objects.nonNull(moneyCardOperationDto.getRealMoney())) { moneyCardUse.setRealMoney(moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney()); } moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } /** * 回退储值卡余额 * * @param moneyCardOperationDto */ private void returnMoneyCard(MoneyCardOperationDto moneyCardOperationDto) { LogUtil.info("回退储值卡余额 {}", JSON.toJSONString(moneyCardOperationDto)); MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardOperationDto.getCarUseId()); MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); if (Objects.nonNull(moneyCardOperationDto.getGiftMoney())) { //jyytodo 余额余次的修改和新增在数据库层面做加减 moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney() + moneyCardOperationDto.getGiftMoney()); } if (Objects.nonNull(moneyCardOperationDto.getRealMoney())) { moneyCardUse.setRealMoney(moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney()); } moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } /** * 储值卡支付订单 扣减储值卡余额 * * @param moneyCardOperationDto */ private void moneyCardPayOrder(MoneyCardOperationDto moneyCardOperationDto) { // 判断商品是否在充值卡的限制购买 VerificationResult verificationResult = checkIsBangding(moneyCardOperationDto.getCarUseId(), moneyCardOperationDto.getGoodsIds()); if (!verificationResult.isJudgeResult()) { throw new GlobleException(verificationResult.getMsg()); } LogUtil.info("扣减储值卡余额 {}", JSON.toJSONString(moneyCardOperationDto)); MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardOperationDto.getCarUseId()); //欠款检查 checkOrderStatu(moneyCardUse.getOrderItemId()); //赠送金额扣款 if (moneyCardUse.getGiftMoney() + moneyCardOperationDto.getGiftMoney() >= 0) { double surplus = MoneyUtil.add(moneyCardUse.getGiftMoney(), moneyCardOperationDto.getGiftMoney()); moneyCardUse.setGiftMoney(surplus); } else { throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); } //本金扣款 if (moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney() >= 0) { double surplus = MoneyUtil.add(moneyCardUse.getRealMoney(), moneyCardOperationDto.getRealMoney()); moneyCardUse.setRealMoney(surplus); } 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() - moneyCardOperationDto.getCount()); // 更新充值卡信息 moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } /** * 检查商品是否在储值卡的消费范围内 * * @param moneyCardUseId 储值卡id * @param goodsIds 商品id集合 * @return */ private VerificationResult checkIsBangding(Long moneyCardUseId, List 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.getCarIsAll())) { return VerificationResult.success(); } } // 比较分类 MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble(); moneyCardAssemble.setCardId(moneyCardUse.getGoodsId()); List cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble); List 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) { return moneyCardUseDao.insert(moneyCardUse); } @Override public int modify(MoneyCardUse moneyCardUse) { return moneyCardUseDao.update(moneyCardUse); } @Override public int remove(List list) { return moneyCardUseDao.deleteByIds(list); } @Override public int removeById(Long id) { return moneyCardUseDao.deleteById(id); } @Override public List findInPage(MoneyCardUse moneyCardUse, PaginationVO pageVo) { return moneyCardUseDao.selectInPage(moneyCardUse, pageVo); } @Override public List findByModel(MoneyCardUse moneyCardUse) { return moneyCardUseDao.selectByModel(moneyCardUse); } @Override public int findTotal(MoneyCardUse moneyCardUse) { return moneyCardUseDao.selectTotalRecord(moneyCardUse); } @Override public MoneyCardUse findById(Long id) { return moneyCardUseDao.selectById(id); } @Override public MoneyCardUse findByVipId(Long id) { return moneyCardUseDao.selectVipCard(id); } @Override public List findVipCardUseInPage(MoneyCardUse moneyCardUse, PaginationVO pageVo) { return moneyCardUseDao.selectVipCardUseInPage(moneyCardUse, pageVo); } @Override public List findVipCardUse(MoneyCardUse moneyCardUse) { return moneyCardUseDao.selectVipCardUse(moneyCardUse); } @Override public Integer findTotalVipCardUse(MoneyCardUse moneyCardUse) { return moneyCardUseDao.selectVipCardUseTotal(moneyCardUse); } @Override @Transactional(rollbackFor = Exception.class) public int freeze(MoneyCardUse moneyCardUse) { // 态为有效的才能冻结 MoneyCardUse moneyCard = moneyCardUseDao.selectById(moneyCardUse.getId()); if (!moneyCard.getStatus().equals(Dictionary.TAOCAN_STATUS_YX)) { throw new GlobleException("不是有效充值卡"); } // 将充值卡的状态改为冻结 moneyCard.setStatus(Dictionary.TAOCAN_STATUS_DJ); moneyCardUseDao.update(moneyCard); // 冻结记录 MoneyCardUseFreeze freeze = new MoneyCardUseFreeze(); freeze.setFreezeTime(new Date()); freeze.setCardUseId(moneyCard.getId()); ; MoneyCardUseFreeze getfreeze = moneyCardUseFreezeDao.selectByMoneyCardUseId(moneyCard.getId()); //更新会员等级 moneyCard.getVipInfo().setLevelId(0L); infoDao.update(moneyCard.getVipInfo()); int i = 0; if (getfreeze != null) { freeze.setId(getfreeze.getId()); i = moneyCardUseFreezeDao.update(freeze); } else { i = moneyCardUseFreezeDao.insert(freeze); } //记录流水 String content = moneyCard.getCardName() + "冻结"; return i; } //转让充值卡 @Override @Transactional(rollbackFor = Exception.class) public void transfer(MoneyCardUse moneyCardUse, Long vipId2, Double money) { Long oldId = moneyCardUse.getId(); moneyCardUse = moneyCardUseDao.selectById(moneyCardUse.getId()); if (moneyCardUse.getVipId().equals(vipId2)) { throw new GlobleException("转让人不能是该充值卡拥有者!"); } System.out.println("id ====== " + moneyCardUse.getId()); // 查询要转让的充值卡 MoneyCardUse getObj = moneyCardUseDao.selectById(moneyCardUse.getId()); //检测商品是否已付款完成 if (getObj.getOrderItemId() != 1) {//不是数据迁移过来的判断付款状态 checkOrderStatu(getObj.getOrderItemId()); } if (!(getObj.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) { throw new GlobleException("不是有效的充值卡!"); } SysVipInfo info = infoDao.selectById(vipId2); if (money >= getObj.getRealMoney()) {//如果全部转让出去 //更新状态 moneyCardUse.setStatus(Dictionary.TAOCAN_SOURCE_ZR); moneyCardUseDao.update(moneyCardUse); } //更新会员等级 getObj.getVipInfo().setLevelId(0L); infoDao.update(getObj.getVipInfo()); //新增转让流水 StringBuilder content = new StringBuilder(); content.append(getObj.getCardName() + "转让给会员" + getObj.getCardName()); MoneyCardUse infoCard = moneyCardUseDao.selectVipCard(info.getId()); //清空content //判断会员没有会籍卡,或者该充值卡不为会籍卡 if (infoCard == null || Dictionary.FLAG_YES_Y.equals(getObj.getIsVipCar())) { //添加一条接受转让的记录到充值卡使用情况表中 if (!getObj.getSource().contains(Dictionary.TAOCAN_STATUS_ZR)) { getObj.setSource(getObj.getSource() + Dictionary.TAOCAN_STATUS_ZR); } getObj.setVipId(vipId2); getObj.setId(null); content = new StringBuilder(); moneyCardUseDao.insert(getObj); content.append("获取会员" + getObj.getVipInfo().getVipName() + "的" + getObj.getCardName()) .append(",余次:" + getObj.getLastCountName()) .append(",本金余额:" + getObj.getRealMoney()) .append(",有效期:" + DateUtil.dateToString(getObj.getFailTime(), DateUtil.DATE_FORMAT_MM)) .append(",是否赠送:" + getObj.getSourceName()); } } //设置为有效 @Override public void active(MoneyCardUse proj) { proj.setStatus(Dictionary.TAOCAN_STATUS_YX); if (Dictionary.FLAG_YES_Y.equals(proj.getIsVipCar())) { MoneyCardUse cardUse = moneyCardUseDao.selectVipCard(proj.getVipId()); if (cardUse != null && !cardUse.getId().equals(proj.getId())) { throw new GlobleException("该会员已经存在有效的会籍卡!"); } } moneyCardUseDao.update(proj); } //设置为失效 @Override public void invalid(MoneyCardUse proj) { proj.setStatus(Dictionary.TAOCAN_STATUS_WX); moneyCardUseDao.update(proj); StringBuilder content = new StringBuilder(); content.append(proj.getCardName() + "设置失效"); } /** * 检测订单条目是否已付款完毕 */ public void checkOrderStatu(Long orderItemId) { SysOrder order = sysOrderService.findById(orderItemDao.selectById(orderItemId).getOrderId()); if (!Dictionary.ORDER_STATU_YFK.equals(order.getStatu())) { throw new GlobleException("储值卡购买订单还存在欠款,在补交欠款后才能使用!"); } } }