From 560228ac3c15cccce0b2a5994d44e4e81b5b3b73 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Tue, 24 May 2022 11:12:22 +0800 Subject: [PATCH] 合并服务单订单改造分支 --- zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java | 319 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 298 insertions(+), 21 deletions(-) diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java index b30f76c..788d974 100644 --- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java +++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java @@ -1,24 +1,35 @@ 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 @@ -28,7 +39,11 @@ @Autowired private SysProjUseDao sysProjUseDao; + @Autowired + SysProjServicesService projServicesService; + @Autowired + SysBeauticianStateService sysBeauticianStateService; @Autowired private SysProjuseFreezeDao sysProjuseFreezeDao; @@ -49,6 +64,14 @@ @Autowired SysVipInfoDao sysVipInfoDao; + @Autowired + ShoppingGoodsService shoppingGoodsService; + + @Autowired + BusParameterSettingsDao busParameterSettingsDao; + + @Autowired + SysUsersDao sysUsersDao; @Override public int add(SysProjUse sysProjUse) { @@ -60,7 +83,6 @@ @Override public int modify(SysProjUse sysProjUse) { //插入套餐项目操作记录 - return sysProjUseDao.update(sysProjUse); @@ -221,7 +243,7 @@ freeze.setVipId(taocan.getVipId()); SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze); // todo 因为目前没有在冻结的时候插入冻结记录,所以这里暂时这样处理 - if(freezeProj!=null){ + if (freezeProj != null) { Date dateAfter = DateUtil.nextNDate(taocan.getFailTime(), freezeProj.getGapDays()); taocan.setFailTime(dateAfter); } @@ -232,7 +254,7 @@ taocan.setStatus(Dictionary.TAOCAN_STATUS_YX); sysProjUseDao.updateProjStatus(taocan); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); - SysProjUseFlow useFlow=new SysProjUseFlow(); + SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(taocan.getProjName()); useFlow.setProjUseId(taocan.getId()); useFlow.setOptionType("人工修改"); @@ -273,7 +295,7 @@ } SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); - SysProjUseFlow useFlow=new SysProjUseFlow(); + SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(taocan.getProjName()); useFlow.setProjUseId(taocan.getId()); useFlow.setOptionType("人工修改"); @@ -339,11 +361,9 @@ 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()+"的购买订单存在欠款!"); } } @@ -364,7 +384,7 @@ int i = sysProjUseDao.updateTcStatus(sysProjUse.getId(), "无效"); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); - SysProjUseFlow useFlow=new SysProjUseFlow(); + SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(taocan.getProjName()); useFlow.setProjUseId(taocan.getId()); useFlow.setOptionType("人工修改"); @@ -378,8 +398,6 @@ return i; } - - /*********************以下为项目使用情况操作***********************/ @@ -468,7 +486,7 @@ SysProjuseFreeze freeze = new SysProjuseFreeze(); freeze.setFreezeTime(new Date()); freeze.setVipId(sysProjUse.getVipId()); - freeze.setOrderItemId(sysProjUse.getId()+""); + freeze.setOrderItemId(sysProjUse.getId() + ""); SysProjuseFreeze getfreeze = sysProjuseFreezeDao.selectByOrderItemId(freeze); int i = 0; if (getfreeze != null) { @@ -478,7 +496,7 @@ i = sysProjuseFreezeDao.insert(freeze); } SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); - SysProjUseFlow useFlow=new SysProjUseFlow(); + SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(sysProjUse.getProjName()); useFlow.setProjUseId(sysProjUse.getId()); useFlow.setOptionType("人工修改"); @@ -515,7 +533,7 @@ sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); - SysProjUseFlow useFlow=new SysProjUseFlow(); + SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(sysProjUse.getProjName()); useFlow.setProjUseId(sysProjUse.getId()); useFlow.setOptionType("人工修改"); @@ -528,8 +546,6 @@ sysProjUseDao.insertFlow(useFlow); return sysProjUseDao.update(sysProjUse); } - - /** @@ -574,7 +590,7 @@ sysProjUseDao.update(proj); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); - SysProjUseFlow useFlow=new SysProjUseFlow(); + SysProjUseFlow useFlow = new SysProjUseFlow(); useFlow.setProjName(proj.getProjName()); useFlow.setProjUseId(proj.getId()); useFlow.setOptionType("人工修改"); @@ -589,6 +605,250 @@ return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功"); } + + /** + * 项目套餐退款 + * @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 @@ -613,4 +873,21 @@ 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); + } + } } \ No newline at end of file -- Gitblit v1.9.1