| | |
| | | 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.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @date 2016-07-03 20:53 |
| | |
| | | |
| | | @Autowired |
| | | private SysProjUseDao sysProjUseDao; |
| | | @Autowired |
| | | SysProjServicesService projServicesService; |
| | | |
| | | @Autowired |
| | | SysBeauticianStateService sysBeauticianStateService; |
| | | |
| | | @Autowired |
| | | private SysProjuseFreezeDao sysProjuseFreezeDao; |
| | |
| | | @Autowired |
| | | SysVipInfoDao sysVipInfoDao; |
| | | |
| | | @Autowired |
| | | ShoppingGoodsService shoppingGoodsService; |
| | | |
| | | @Autowired |
| | | BusParameterSettingsDao busParameterSettingsDao; |
| | | |
| | | @Autowired |
| | | SysUsersDao sysUsersDao; |
| | | |
| | | @Override |
| | | public int add(SysProjUse sysProjUse) { |
| | |
| | | @Override |
| | | public int modify(SysProjUse sysProjUse) { |
| | | //插入套餐项目操作记录 |
| | | |
| | | |
| | | |
| | | return sysProjUseDao.update(sysProjUse); |
| | |
| | | if (Dictionary.TAOCAN_SOURCE_QY.equals(projuse.getSource())) { |
| | | return; |
| | | } |
| | | if (projuse.getPlatformFlag().contains(Dictionary.SHOPPING_GOODS_SALE_PLATFORM_XX)) { |
| | | SysOrderItem orderItem = orderItemDao.selectById(projuse.getOrderItemId()); |
| | | if (!Dictionary.ORDER_STATU_YFK.equals(orderItem.getStatus())) { |
| | | throw new GlobleException("该商品存在欠款!"); |
| | | } |
| | | String orderStatus = orderItemDao.selectOrderStatusByItemId(projuse.getOrderItemId()); |
| | | if (!Dictionary.ORDER_STATU_YFK.equals(orderStatus)) { |
| | | throw new GlobleException(projuse.getProjName()+"的购买订单存在欠款!"); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | return i; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /*********************以下为项目使用情况操作***********************/ |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 设置为有效套餐 |
| | | * |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 项目套餐退款 |
| | | * @param projUseDtoList |
| | | */ |
| | | @Override |
| | | public void projectTk(List<ProjUseOperationDto> projUseDtoList) { |
| | | |
| | | List<ShoppingGoods> shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList())); |
| | | Map<Long, ShoppingGoods> 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<SysProjUse> projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId()); |
| | | |
| | | List<SysProjUse> 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<SysProjUse> 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<ProjUseOperationDto> projUseDtoList) { |
| | | |
| | | if(CollUtil.isEmpty(projUseDtoList)){ |
| | | throw new GlobleException("projUseDtoList 不能为空"); |
| | | } |
| | | |
| | | List<ShoppingGoods> shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList())); |
| | | Map<Long, ShoppingGoods> 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<ShoppingGoodsAssemble> 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) { |
| | |
| | | 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<SysProjUse> 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); |
| | | } |
| | | } |
| | | } |