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<Long> list) {
|
|
return sysProjUseDao.deleteByIds(list);
|
|
}
|
|
@Override
|
public int removeById(Long id) {
|
|
return sysProjUseDao.deleteById(id);
|
|
}
|
|
@Override
|
public List<SysProjUse> findInPage(SysProjUse sysProjUse, PaginationVO pageVo) {
|
|
return sysProjUseDao.selectInPage(sysProjUse, pageVo);
|
|
}
|
|
@Override
|
public List<SysProjUse> 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<SysProjUse> 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<SysProjUse> priorList = sysProjUseDao.selectByModel(prior);
|
|
|
if (priorList.size() > 0) {
|
List<Long> ids = new ArrayList<Long>();
|
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<SysProjUse> 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<SysProjUse> 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<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) {
|
return sysProjUseDao.updateProjUseTck(projUse);
|
}
|
|
@Override
|
public List<SysProjUse> selectTaocanProjUse(Long taocanId, String status) {
|
SysProjUse projUse = new SysProjUse();
|
projUse.setTaocanId(taocanId);
|
projUse.setStatus(status);
|
return sysProjUseDao.selectByModel(projUse);
|
}
|
|
@Override
|
public List<SysProjUse> 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<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);
|
}
|
}
|
}
|