package com.matrix.system.hive.service.imp; import cn.hutool.core.bean.BeanUtil; 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.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.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 com.matrix.system.hive.validation.ProjUseGroup; 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 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 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 @Transactional(rollbackFor = Exception.class) public void changeMoneyCard(List moneyCardPayDtoList) { // 判断商品是否在充值卡的限制购买 moneyCardPayDtoList.forEach(cardUse -> { VerificationResult verificationResult = checkIsBangding(cardUse.getCarUseId(), cardUse.getGoodsIds()); if (!verificationResult.isJudgeResult()) { throw new GlobleException(verificationResult.getMsg()); } }); moneyCardPayDtoList.forEach(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(-1); 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 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 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 id) { SysOrderItem item = orderItemDao.selectById(id); if (!Dictionary.ORDER_STATU_YFK.equals(item.getStatus())) { throw new GlobleException("该商品还存在欠款!"); } } }