package com.matrix.system.hive.service.imp; import cn.hutool.core.collection.CollUtil; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.WebUtil; import com.matrix.system.app.mapper.SysProjUseMapper; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.common.dao.BusParameterSettingsDao; import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.validate.GroupValidateStatusCheckUtil; import com.matrix.system.constance.Dictionary; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.ProjUseOperationDto; import com.matrix.system.hive.hievEnum.OrderOperationEnum; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.service.ShoppingGoodsService; import com.matrix.system.hive.service.SysBeauticianStateService; import com.matrix.system.hive.service.SysProjServicesService; import com.matrix.system.hive.service.SysProjUseService; 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.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @date 2016-07-03 20:53 */ @Service("sysProjUseService") public class SysProjUseServiceImpl implements SysProjUseService { @Autowired private SysProjUseDao sysProjUseDao; @Autowired SysProjServicesService projServicesService; @Autowired SysBeauticianStateService sysBeauticianStateService; @Autowired private SysProjuseFreezeDao sysProjuseFreezeDao; @Autowired private MoneyCardUseDao moneyCardUseDao; @Autowired private SysVipInfoDao infoDao; @Autowired private SysOrderItemDao orderItemDao; @Autowired ShoppingGoodsAssembleDao shoppingGoodsAssembleDao; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired SysVipInfoDao sysVipInfoDao; @Autowired ShoppingGoodsService shoppingGoodsService; @Autowired BusParameterSettingsDao busParameterSettingsDao; @Autowired SysUsersDao sysUsersDao; @Override public int add(SysProjUse sysProjUse) { return sysProjUseDao.insert(sysProjUse); } @Override public int modify(SysProjUse sysProjUse) { //插入套餐项目操作记录 return sysProjUseDao.update(sysProjUse); } @Override public int remove(List list) { return sysProjUseDao.deleteByIds(list); } @Override public int removeById(Long id) { return sysProjUseDao.deleteById(id); } @Override public List findInPage(SysProjUse sysProjUse, PaginationVO pageVo) { return sysProjUseDao.selectInPage(sysProjUse, pageVo); } @Override public List findByModel(SysProjUse sysProjUse) { return sysProjUseDao.selectByModel(sysProjUse); } @Override public int findTotal(SysProjUse sysProjUse) { return sysProjUseDao.selectTotalRecord(sysProjUse); } @Override public SysProjUse findById(Long id) { return sysProjUseDao.selectById(id); } @Override @Transactional(rollbackFor = Exception.class) public int transferTc(SysProjUse sysProjUse, Long vipId2) { if (sysProjUse.getVipId().equals(vipId2)) { throw new GlobleException("转让人不能是该套餐拥有者!"); } // 通过客户ID和订单ID获取被转让的套餐下的项目集合,给接受转让的客户,并且来源为转让 List list = sysProjUseDao.selectByModel(sysProjUse); //判断套餐是否存在退款 if (list.size() > 0) { SysProjUse projuse = list.get(0); checkOrderStatu(projuse); } //套餐卡为一个整体只需要一笔流水,而套餐相当于多个项目使用情况 boolean temp = true; int j = 0; SysVipInfo vipinfo = infoDao.selectById(vipId2); for (SysProjUse projuse : list) { if (!(projuse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) { throw new GlobleException("不是有效套餐!"); } j++; if (temp) { if (Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(sysProjUse.getType())) { temp = false; } String conent = "转让给会员" + vipinfo.getVipName(); projuse.setVipId(vipId2); if (!projuse.getSource().contains(Dictionary.TAOCAN_STATUS_ZR)) { sysProjUse.setSource(projuse.getSource() + Dictionary.TAOCAN_STATUS_ZR); } StringBuilder contentZr = new StringBuilder(); SysVipInfo vipInfo = sysVipInfoDao.selectById(projuse.getVipId()); contentZr.append("获取会员" + vipInfo.getVipName() + "的") .append(",余额:" + projuse.getBalance()) .append(",余次:") .append(",有效期:" + DateUtil.dateToString(projuse.getFailTime(), DateUtil.DATE_FORMAT_MM)) .append(",是否赠送:"); } } //判断是否是转给原来的人,是的话,那么需要删除之前的记录 SysProjUse prior = new SysProjUse(); prior.setVipId(vipId2); prior.setOrderItemId(sysProjUse.getOrderItemId()); prior.setPlatformFlag(sysProjUse.getPlatformFlag()); List priorList = sysProjUseDao.selectByModel(prior); if (priorList.size() > 0) { List ids = new ArrayList(); for (SysProjUse delProjUser : priorList) { ids.add(delProjUser.getId()); } sysProjUseDao.deleteByIds(ids); } for (SysProjUse projuse : list) { //注意:清空原来的id projuse.setId(null); sysProjUseDao.insert(projuse); } // 将被转让的套餐下的所有项目状态设置为转让 SysProjUse modifyProjUse = new SysProjUse(); modifyProjUse.setPlatformFlag(sysProjUse.getPlatformFlag()); modifyProjUse.setOrderItemId(sysProjUse.getOrderItemId()); modifyProjUse.setVipId(sysProjUse.getVipId()); modifyProjUse.setStatus(Dictionary.TAOCAN_STATUS_ZR); sysProjUseDao.updateProjStatus(modifyProjUse); return j; } @Override public AjaxResult activeTc(SysProjUse proj) { Date newDate = proj.getFailTime(); Date today = new Date(); SysProjUse taocan = sysProjUseDao.selectById(proj.getId()); switch (taocan.getStatus()) { case Dictionary.TAOCAN_STATUS_WX: // 如果到期,需要重新设置有效期 if (newDate != null && !newDate.equals("")) { taocan.setFailTime(newDate); if (newDate.before(today)) { return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期"); } } if (newDate == null && (taocan.getFailTime() == null || taocan.getFailTime().before(today))) { return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期"); } break; case Dictionary.TAOCAN_STATUS_DJ: SysProjuseFreeze freeze = new SysProjuseFreeze(); freeze.setOrderItemId(taocan.getId().toString()); freeze.setVipId(taocan.getVipId()); SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze); // todo 因为目前没有在冻结的时候插入冻结记录,所以这里暂时这样处理 if (freezeProj != null) { Date dateAfter = DateUtil.nextNDate(taocan.getFailTime(), freezeProj.getGapDays()); taocan.setFailTime(dateAfter); } break; default: return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择无效或者冻结的套餐"); } taocan.setStatus(Dictionary.TAOCAN_STATUS_YX); sysProjUseDao.updateProjStatus(taocan); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(taocan.getProjName()); useFlow.setProjUseId(taocan.getId()); useFlow.setOptionType("人工修改"); useFlow.setRemark("设置为有效状态"); useFlow.setFailTime(taocan.getFailTime()); useFlow.setStatus(Dictionary.TAOCAN_STATUS_YX); useFlow.setCreateBy(sysUsers.getSuName()); useFlow.setUpdateBy(sysUsers.getSuName()); sysProjUseDao.insertFlow(useFlow); return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功"); } @Override public int freezeTc(SysProjUse sysProjUse) { SysProjUse taocan = sysProjUseDao.selectById(sysProjUse.getId()); if (taocan != null) { if (!taocan.getStatus().equals(Dictionary.TAOCAN_STATUS_YX)) { throw new GlobleException("不是有效套餐"); } sysProjUseDao.updateTcStatus(sysProjUse.getId(), "冻结"); // 冻结记录 SysProjuseFreeze freeze = new SysProjuseFreeze(); freeze.setFreezeTime(new Date()); freeze.setVipId(taocan.getVipId()); freeze.setOrderItemId(taocan.getId() + ""); SysProjuseFreeze getfreeze = sysProjuseFreezeDao.selectByOrderItemId(freeze); int i = 0; if (getfreeze != null) { freeze.setId(getfreeze.getId()); i = sysProjuseFreezeDao.update(freeze); } else { i = sysProjuseFreezeDao.insert(freeze); } SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(taocan.getProjName()); useFlow.setProjUseId(taocan.getId()); useFlow.setOptionType("人工修改"); useFlow.setStatus(Dictionary.TAOCAN_STATUS_DJ); useFlow.setRemark("冻结项目"); useFlow.setCreateBy(sysUsers.getSuName()); useFlow.setUpdateBy(sysUsers.getSuName()); sysProjUseDao.insertFlow(useFlow); return i; } else { throw new GlobleException("未找到套餐"); } } @Override public double getTotalMoneyTc(SysProjUse sysProjUse) { List list = sysProjUseDao.selectByModel(sysProjUse); double money = 0; if (list.size() > 0) { SysProjUse projuse = list.get(0); checkOrderStatu(projuse); if (!(projuse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) { throw new GlobleException("不是有效套餐"); } if (projuse.getSource().contains(Dictionary.TAOCAN_SOURCE_ZR)) { throw new GlobleException("转让的套餐不能退款"); } if (projuse.getSource().contains(Dictionary.TAOCAN_SOURCE_ZS)) { throw new GlobleException("赠送的套餐不能退款"); } //如果是套餐卡,则返回单条记录余额 if (Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(projuse.getType())) { return projuse.getBalance(); } } //如果是普通项目则返回所有记录余额之和 for (SysProjUse projuse : list) { //如果是套餐卡直接返回金额 if (Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(projuse.getType())) { return projuse.getBalance(); } else if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(projuse.getType())) { return projuse.getBalance(); } Double emoney = MoneyUtil.mul(Double.parseDouble(projuse.getSurplusCount() + ""), projuse.getPrice()); money = MoneyUtil.add(emoney, money); } return money; } /** * 检测是否存在欠款 * * @param projuse */ private void checkOrderStatu(SysProjUse projuse) { if (Dictionary.TAOCAN_SOURCE_QY.equals(projuse.getSource())) { return; } String orderStatus = orderItemDao.selectOrderStatusByItemId(projuse.getOrderItemId()); if (!Dictionary.ORDER_STATU_YFK.equals(orderStatus)) { throw new GlobleException(projuse.getProjName()+"的购买订单存在欠款!"); } } @Override public int invalidTc(SysProjUse sysProjUse) { SysProjUse taocan = sysProjUseDao.selectById(sysProjUse.getId()); //以及转让或者退款的不能在设置为无效 switch (taocan.getStatus()) { case Dictionary.TAOCAN_STATUS_TK: throw new GlobleException("套餐已退款"); case Dictionary.TAOCAN_STATUS_ZR: throw new GlobleException("套餐已转让"); case Dictionary.TAOCAN_STATUS_DJ: throw new GlobleException("套餐已冻结"); } taocan.setStatus(Dictionary.TAOCAN_STATUS_WX); int i = sysProjUseDao.updateTcStatus(sysProjUse.getId(), "无效"); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(taocan.getProjName()); useFlow.setProjUseId(taocan.getId()); useFlow.setOptionType("人工修改"); useFlow.setStatus(Dictionary.TAOCAN_STATUS_WX); useFlow.setRemark("设置为无效状态"); useFlow.setFailTime(taocan.getFailTime()); useFlow.setCreateBy(sysUsers.getSuName()); useFlow.setUpdateBy(sysUsers.getSuName()); sysProjUseDao.insertFlow(useFlow); return i; } /*********************以下为项目使用情况操作***********************/ /** * @param sysProjUse 被转让的套餐信息,其中含客户id,和订单id */ @Override public int transferProj(SysProjUse sysProjUse, Long vipId) { // 通过客户ID和订单ID获取被转让的套餐下的项目集合,给接受转让的客户,并且来源为转让 sysProjUse = sysProjUseDao.selectById(sysProjUse.getId()); if (sysProjUse.getVipId().equals(vipId)) { throw new GlobleException("转让人不能是该项目拥有者!"); } //判断项目是否存在退款 checkOrderStatu(sysProjUse); SysVipInfo vipinfo = infoDao.selectById(vipId); if (!(sysProjUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) { throw new GlobleException("不是有效套餐!"); } ShoppingGoodsAssemble shoppingGoodsAssemble = shoppingGoodsAssembleDao.selectById(sysProjUse.getAssembleId()); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(shoppingGoodsAssemble.getShoppingGoodsId()); //添加转让流水 String conent = shoppingGoods.getName() + "转让给会员" + vipinfo.getVipName(); //将被转让的项目状态至为转让状态 if (!sysProjUse.getSource().contains(Dictionary.TAOCAN_STATUS_ZR)) { sysProjUse.setSource(sysProjUse.getSource() + Dictionary.TAOCAN_STATUS_ZR); } sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_ZR); sysProjUseDao.update(sysProjUse); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX); sysProjUse.setVipId(vipId); //判断是否是转给原来的人,是的话,那么需要删除之前的那条记录并新增 SysProjUse prior = new SysProjUse(); prior.setVipId(vipId); prior.setOrderItemId(sysProjUse.getOrderItemId()); prior.setPlatformFlag(sysProjUse.getPlatformFlag()); List priorList = sysProjUseDao.selectByModel(prior); if (priorList.size() > 0) { sysProjUseDao.deleteById(priorList.get(0).getId()); } //注意:清空原来的id sysProjUse.setId(null); sysProjUseDao.insert(sysProjUse); StringBuilder contentZr = new StringBuilder(); SysVipInfo vipInfo = sysVipInfoDao.selectById(sysProjUse.getVipId()); contentZr.append("获取会员" + vipInfo.getVipName() + "的" + shoppingGoods.getName()) .append(",余额:" + sysProjUse.getBalance()) .append(",余次:" + sysProjUse.getSurplusCount()) .append(",有效期:" + DateUtil.dateToString(sysProjUse.getFailTime(), DateUtil.DATE_FORMAT_MM)) .append(",是否赠送:"); return 1; } /** * 冻结项目 * * @param sysProjUse * @return */ @Override public int freezeProj(SysProjUse sysProjUse) { // 套餐状态为有效的才能冻结 sysProjUse = sysProjUseDao.selectById(sysProjUse.getId()); if (!sysProjUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX)) { throw new GlobleException("不是有效套餐"); } //余次使用流水操作 ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(sysProjUse.getProjId()); String content = shoppingGoods.getName() + "冻结"; // 将套餐的状态改为冻结 sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_DJ); sysProjUseDao.updateProjStatus(sysProjUse); // 冻结记录 SysProjuseFreeze freeze = new SysProjuseFreeze(); freeze.setFreezeTime(new Date()); freeze.setVipId(sysProjUse.getVipId()); freeze.setOrderItemId(sysProjUse.getId() + ""); SysProjuseFreeze getfreeze = sysProjuseFreezeDao.selectByOrderItemId(freeze); int i = 0; if (getfreeze != null) { freeze.setId(getfreeze.getId()); i = sysProjuseFreezeDao.update(freeze); } else { i = sysProjuseFreezeDao.insert(freeze); } SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(sysProjUse.getProjName()); useFlow.setProjUseId(sysProjUse.getId()); useFlow.setOptionType("人工修改"); useFlow.setStatus(Dictionary.TAOCAN_STATUS_DJ); useFlow.setRemark("冻结项目"); useFlow.setCreateBy(sysUsers.getSuName()); useFlow.setUpdateBy(sysUsers.getSuName()); sysProjUseDao.insertFlow(useFlow); return i; } /** * 改变套餐下所有项目的状态,设置为无效 * * @param sysProjUse * @return */ @Override public int invalidProj(SysProjUse sysProjUse) { sysProjUse = sysProjUseDao.selectById(sysProjUse.getId()); //以及转让或者退款的不能在设置为无效 String status = sysProjUse.getStatus(); switch (status) { case Dictionary.TAOCAN_STATUS_TK: throw new GlobleException("套餐已退款"); case Dictionary.TAOCAN_STATUS_ZR: throw new GlobleException("套餐已转让"); case Dictionary.TAOCAN_STATUS_DJ: throw new GlobleException("套餐已冻结"); } sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(sysProjUse.getProjName()); useFlow.setProjUseId(sysProjUse.getId()); useFlow.setOptionType("人工修改"); useFlow.setStatus(Dictionary.TAOCAN_STATUS_WX); useFlow.setRemark("设置为无效状态"); useFlow.setFailTime(sysProjUse.getFailTime()); useFlow.setCreateBy(sysUsers.getSuName()); useFlow.setUpdateBy(sysUsers.getSuName()); sysProjUseDao.insertFlow(useFlow); return sysProjUseDao.update(sysProjUse); } /** * 设置为有效套餐 * * @param proj * @return */ @Override public AjaxResult activeProj(SysProjUse proj) { Date today = new Date(); Date newDate = proj.getFailTime(); proj = sysProjUseDao.selectById(proj.getId()); switch (proj.getStatus()) { case Dictionary.TAOCAN_STATUS_WX: // 如果到期,需要重新设置有效期 if (newDate != null && !newDate.equals("")) { proj.setFailTime(newDate); if (newDate.before(today)) { return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期"); } } if (newDate == null && (proj.getFailTime() == null || proj.getFailTime().before(today))) { return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期"); } break; //如果是冻结状态则要算出冻结的天数,延长有效期 case Dictionary.TAOCAN_STATUS_DJ: SysProjuseFreeze freeze = new SysProjuseFreeze(); freeze.setOrderItemId(proj.getId().toString()); freeze.setVipId(proj.getVipId()); SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze); Date dateAfter = DateUtil.nextNDate(proj.getFailTime(), freezeProj.getGapDays()); proj.setFailTime(dateAfter); break; default: return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择无效或者冻结的套餐"); } proj.setStatus(Dictionary.TAOCAN_STATUS_YX); sysProjUseDao.update(proj); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(proj.getProjName()); useFlow.setProjUseId(proj.getId()); useFlow.setOptionType("人工修改"); useFlow.setStatus(Dictionary.TAOCAN_STATUS_YX); useFlow.setRemark("设置为有效状态"); useFlow.setFailTime(proj.getFailTime()); useFlow.setCreateBy(sysUsers.getSuName()); useFlow.setUpdateBy(sysUsers.getSuName()); sysProjUseDao.insertFlow(useFlow); return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功"); } /** * 项目套餐退款 * @param projUseDtoList */ @Override public void projectTk(List projUseDtoList) { List shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList())); Map shoppingGoodsMap = shoppingGoodsList.stream().collect(Collectors.toMap(ShoppingGoods::getId, Function.identity())); projUseDtoList.forEach(projUseOperationDto -> { //校验参数 GroupValidateStatusCheckUtil.check(projUseOperationDto, ProjUseGroup.projectTk.class); ShoppingGoods shoppingGoods = shoppingGoodsMap.get(projUseOperationDto.getGoodsId()); if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) { doProjectTk(projUseOperationDto); } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) { taocanTk(projUseOperationDto); } }); } /** * 套餐退款 * @param projUseOperationDto */ private void taocanTk(ProjUseOperationDto projUseOperationDto) { List projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId()); List tcList = projUseList.stream().filter(item -> Objects.isNull(item.getTaocanId()) && item.getStatus().equals(Dictionary.TAOCAN_STATUS_YX) ).collect(Collectors.toList()); if (tcList.size() < projUseOperationDto.getCount()) { throw new GlobleException("套餐余次不足"); } projUseOperationDto.setOrderOperationType(OrderOperationEnum.RETURN); for (int i = 0; i < projUseOperationDto.getCount(); i++) { SysProjUse sysProjUse = tcList.get(i); setTaocanTk(sysProjUse,projUseOperationDto); //设置套餐下的项目无效 projUseList.stream().filter(item->Objects.equals(sysProjUse.getId(),item.getTaocanId())).collect(Collectors.toList()) .forEach(item-> setTaocanTk(item,projUseOperationDto)); } } private void setTaocanTk(SysProjUse sysProjUse, ProjUseOperationDto projUseOperationDto) { sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK); sysProjUse.setSurplusCount(0); sysProjUseDao.update(sysProjUse); saveProjUseFlow(projUseOperationDto,sysProjUse); } /** * 项目退款 * @param projUseOperationDto */ private void doProjectTk(ProjUseOperationDto projUseOperationDto) { List projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId()); if(projUseList.size()==1){ SysProjUse sysProjUse = projUseList.get(0); int sub = sysProjUse.getSurplusCount() - projUseOperationDto.getCount(); if (sub < 0) { throw new GlobleException("项目余次不足"); } else if (sub == 0) { sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK); } sysProjUse.setSurplusCount(sub); sysProjUseDao.update(sysProjUse); projUseOperationDto.setOrderOperationType(OrderOperationEnum.RETURN); //保存操作流水 saveProjUseFlow(projUseOperationDto,sysProjUse); }else{ throw new GlobleException("查询项目余次异常"); } } /** * 保存项目操作流水 * @param projUseOperationDto * @param sysProjUse */ private void saveProjUseFlow(ProjUseOperationDto projUseOperationDto, SysProjUse sysProjUse) { SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse); sysProjUseFlow.setOptionType(projUseOperationDto.getOrderOperationType().getDisplayName()); SysUsers user = sysUsersDao.selectById(projUseOperationDto.getUpdateUserId()); sysProjUseFlow.setUpdateBy(user.getSuName()); sysProjUseFlow.setCreateBy(user.getSuName()); sysProjUseDao.insertFlow(sysProjUseFlow); } /** * 添加用户套餐 * * @param projUseDtoList * @return */ @Override public void addUserProjUse(List projUseDtoList) { if(CollUtil.isEmpty(projUseDtoList)){ throw new GlobleException("projUseDtoList 不能为空"); } List shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList())); Map shoppingGoodsMap = shoppingGoodsList.stream().collect(Collectors.toMap(ShoppingGoods::getId, Function.identity())); for (ProjUseOperationDto projUseOperationDto : projUseDtoList) { ShoppingGoods shoppingGoods = shoppingGoodsMap.get(projUseOperationDto.getGoodsId()); if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) { createProjectUse(projUseOperationDto, shoppingGoods); } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) { //每个套餐独立生成一个明细 int orderCount = projUseOperationDto.getCount(); while (orderCount > 0) { createTaocanProjUse(projUseOperationDto, shoppingGoods); orderCount--; } } } } private void createTaocanProjUse(ProjUseOperationDto projUseOperationDto, ShoppingGoods shoppingGoods) { GroupValidateStatusCheckUtil.check(projUseOperationDto,ProjUseGroup.addTc.class); //新建套餐 SysProjUse taocanProjUse = new SysProjUse(); ShoppingGoods taocanShoppingGoods = shoppingGoods; Long projId = shoppingGoods.getId(); taocanProjUse.setProjId(projId); taocanProjUse.setIsOver(Dictionary.DELETED_N); taocanProjUse.setOrderItemId(projUseOperationDto.getOrderItemId()); taocanProjUse.setProjName(taocanShoppingGoods.getName()); taocanProjUse.setVipId(projUseOperationDto.getVipId()); taocanProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX); taocanProjUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC); taocanProjUse.setIsCourse(taocanShoppingGoods.getIsCourse()); taocanProjUse.setIsInfinite(taocanShoppingGoods.getIsInfinite()); // 赠送和打折后金额为0的都视为赠送项目 if (projUseOperationDto.isFree()) { taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_ZS); } else { taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_GM); } // 失效时间 Date invalidTime = shoppingGoodsService.calInvalidTime(taocanShoppingGoods, 1, null); taocanProjUse.setFailTime(invalidTime); sysProjUseDao.insert(taocanProjUse); //计划次数 int surplusCount = 0; //总余额 Double sumBanance = 0D; //创建套餐绑定的项目 List assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(projId, ShoppingGoods.SHOPPING_GOODS_TYPE_XM); for (ShoppingGoodsAssemble assemble : assembleList) { ProjUseOperationDto projUseDto = new ProjUseOperationDto(); projUseDto.setCount(assemble.getTotal()); projUseDto.setGoodsId(assemble.getShoppingGoodsId()); projUseDto.setFree(projUseOperationDto.isFree()); projUseDto.setPayMoney(MoneyUtil.mul(assemble.getPrice(), projUseOperationDto.getTcZk())); projUseDto.setOrderItemId(projUseOperationDto.getOrderItemId()); projUseDto.setVipId(projUseOperationDto.getVipId()); projUseDto.setTcId(taocanProjUse.getId()); projUseDto.setUpdateUserId(projUseOperationDto.getUpdateUserId()); projUseDto.setDeductionNum(assemble.getDeductionNum()); SysProjUse tempUse = createProjectUse(projUseDto, assemble.getShoppingGoods()); sumBanance += tempUse.getBalance(); surplusCount += tempUse.getSurplusCount(); } if (Dictionary.FLAG_NO_N.equals(taocanShoppingGoods.getIsCourse())) { //固定套餐,剩余次数等于绑定项目的次数 taocanProjUse.setSurplusCount(surplusCount); //合计套餐余额 taocanProjUse.setBalance(sumBanance); } else { //任选套餐剩余次数等于最大使用次数 taocanProjUse.setSurplusCount(taocanShoppingGoods.getCarUseCount()); taocanProjUse.setBalance(projUseOperationDto.getPayMoney()); } sysProjUseDao.update(taocanProjUse); } private SysProjUse createProjectUse(ProjUseOperationDto projUseOperationDto, ShoppingGoods shoppingGoods) { GroupValidateStatusCheckUtil.check(projUseOperationDto,ProjUseGroup.addProject.class); SysProjUse puse = new SysProjUse(); puse.setIsOver(Dictionary.DELETED_N); puse.setOrderItemId(projUseOperationDto.getOrderItemId()); puse.setProjId(projUseOperationDto.getGoodsId()); puse.setSurplusCount(projUseOperationDto.getCount()); puse.setVipId(projUseOperationDto.getVipId()); puse.setStatus(Dictionary.TAOCAN_STATUS_YX); puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM); puse.setProjName(shoppingGoods.getName()); puse.setTaocanId(projUseOperationDto.getTcId()); puse.setDeductionNum(projUseOperationDto.getDeductionNum()); // 赠送和打折后金额为0的都视为赠送项目 if (!projUseOperationDto.isFree()) { puse.setSource(Dictionary.TAOCAN_SOURCE_GM); puse.setPrice(projUseOperationDto.getPayMoney()); } else { puse.setSource(Dictionary.TAOCAN_SOURCE_ZS); //赠送项目是否计算消耗业绩否则 赠送产品按原价计算消耗 boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE); if (zsConsumeAchieve) { //赠送情况下,如果收款金额大于0,就是赠送金额划扣的情况,金额即为划扣的折扣金额 if (projUseOperationDto.getPayMoney() > 0) { puse.setPrice(projUseOperationDto.getPayMoney()); } else { puse.setPrice(shoppingGoods.getSealPice()); } } else { puse.setPrice(0D); } } // 设置失效时间 Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null); puse.setFailTime(invalidTime); puse.setBalance(puse.getPrice() * puse.getSurplusCount()); sysProjUseDao.insert(puse); return puse; } @Override public int updateProjUseTck(SysProjUse projUse) { return sysProjUseDao.updateProjUseTck(projUse); } @Override public List selectTaocanProjUse(Long taocanId, String status) { SysProjUse projUse = new SysProjUse(); projUse.setTaocanId(taocanId); projUse.setStatus(status); return sysProjUseDao.selectByModel(projUse); } @Override public List findTaocaoProjUseWithProj(SysProjUse sysProjUse) { return sysProjUseDao.selectTaoCanListWithProj(sysProjUse); } @Override public int findTaocanCountForCourseAndInfinite(Long taocanId, Long vipId) { return sysProjUseDao.selectTaocanCountForCourseAndInfinite(taocanId, vipId); } @Override public void deleteByOrderItemId(Long id) { int count=sysProjUseDao.selectUseCountByOrderItemId(id); if(count>0){ SysProjUse query=new SysProjUse(); query.setOrderItemId(id); List sysProjUses = sysProjUseDao.selectByModel(query); if(sysProjUses.size()>1){ throw new GlobleException(sysProjUses.get(0).getProjName()+"套餐已经被使用无法删除"); }else { throw new GlobleException(sysProjUses.get(0).getProjName()+"项目已经被使用无法删除"); } }else { sysProjUseDao.deleteByOrderItemId(id); } } }