package com.matrix.system.hive.service.imp;
|
|
import cn.hutool.core.collection.CollUtil;
|
import com.matrix.component.rabbitmq.RabiitMqTemplate;
|
import com.matrix.core.constance.MatrixConstance;
|
import com.matrix.core.exception.GlobleException;
|
import com.matrix.core.pojo.PaginationVO;
|
import com.matrix.core.pojo.VerifyResult;
|
import com.matrix.core.tools.DateUtil;
|
import com.matrix.core.tools.LogUtil;
|
import com.matrix.core.tools.StringUtils;
|
import com.matrix.core.tools.WebUtil;
|
import com.matrix.system.app.dto.ServiceOrderListDto;
|
import com.matrix.system.app.vo.ServiceOrderListVo;
|
import com.matrix.system.common.bean.SysUsers;
|
import com.matrix.system.common.dao.SysUsersDao;
|
import com.matrix.system.constance.Dictionary;
|
import com.matrix.system.hive.bean.*;
|
import com.matrix.system.hive.dao.*;
|
import com.matrix.system.hive.plugin.util.MoneyUtil;
|
import com.matrix.system.hive.service.*;
|
import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
|
import com.matrix.system.wechart.templateMsg.UniformMsgParam;
|
import org.apache.commons.collections.CollectionUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @date 2016-07-03 20:57
|
*/
|
@Service("sysProjServicesService")
|
public class SysProjServicesServiceImpl implements SysProjServicesService {
|
|
@Autowired
|
SysBedStateDao sysBedStateDao;
|
@Autowired
|
private SysProjServicesDao sysProjServicesDao;
|
@Resource
|
private SysOrderItemService sysOrderItemService;
|
|
@Autowired
|
private SysBedStateDao bedStateDao;
|
|
@Autowired
|
private SysBeauticianStateDao beauticianStateDao;
|
@Autowired
|
private SysProjUseDao sysProjUseDao;
|
|
|
@Autowired
|
private SysOutStoreDao sysOutStoreDao;
|
|
@Autowired
|
private SysOutStoreItemDao sysOutStoreItemDao;
|
@Autowired
|
private SysBedInfoDao sysBedInfoDao;
|
|
|
@Autowired
|
private SysStoreInfoDao storeInfoDao;
|
|
|
@Autowired
|
private CodeService codeService;
|
|
@Autowired
|
ServicesFlowDao servicesFlowDao;
|
|
@Autowired
|
private LastestWorkBeatuistaffDao LastestWorkBeatuistaffDao;
|
|
@Autowired
|
SysUsersDao userDao;
|
|
@Autowired
|
private MyBeauticianCountDao myBeauticianCountDao;
|
|
@Autowired
|
private ParameterSettingsDao parameterSettingsDao;
|
|
@Autowired
|
private MyBeaticianDao myBeaticianDao;
|
@Autowired
|
private AchieveNewService achieveNewService;
|
|
@Autowired
|
private ShoppingGoodsDao shoppingGoodsDao;
|
|
@Autowired
|
ShoppingGoodsAssembleDao shoppingGoodsAssembleDao;
|
@Resource
|
private SysProjUseService projUseService;
|
@Resource
|
private SysOrderService sysOrderService;
|
@Autowired
|
WarehouseDao warehouseDao;
|
@Resource
|
private ShoppingGoodsService shoppingGoodsService;
|
|
@Autowired
|
private RabiitMqTemplate rabiitMqTemplate;
|
|
@Value("${evn}")
|
private String evn;
|
|
|
/**
|
* 新增服务单 jyy
|
*
|
* @return
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public SysProjServices addSysProjServices(SysProjServices sysProjServices) throws GlobleException {
|
|
//创建服务单
|
if(WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY)!=null){
|
SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
|
sysProjServices.setCreateStaffId(user.getSuId());
|
sysProjServices.setShopId(user.getShopId());
|
sysProjServices.setCompanyId(user.getCompanyId());
|
}
|
|
|
sysProjServices.setCreateTime(new Date());
|
sysProjServices.setServiceNo(codeService.getServiceOrderCode());
|
Double hkPrice = 0.0;
|
int i = sysProjServicesDao.insert(sysProjServices);
|
// 计算项目总时长
|
int totalTime = 0;
|
//处理订单明细
|
for (SysBeauticianState sysBeauticianState : sysProjServices.getServiceItems()) {
|
|
SysProjUse sysProjUse = projUseService.findById(sysBeauticianState.getPuseId());
|
ShoppingGoods sysProjInfo = shoppingGoodsDao.selectById(sysProjUse.getProjId());
|
|
totalTime = totalTime + (sysProjInfo.getTimeLength() == null ? 0 : sysProjInfo.getTimeLength());
|
//更新余次
|
SysProjUse upProjUse = new SysProjUse();
|
// 如果该使用情况不为套餐卡,则修改单个项目余次信息
|
upProjUse.setId(sysBeauticianState.getPuseId());
|
|
//扣减次数
|
int surplus = sysProjUse.getSurplusCount() - sysBeauticianState.getCount();
|
upProjUse.setSurplusCount(surplus);
|
// 项目使用完了
|
if (surplus <= 0) {
|
upProjUse.setIsOver(Dictionary.FLAG_YES_Y);
|
upProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
|
}
|
//本次消费金额
|
Double bcxfje = MoneyUtil.mul(sysProjUse.getPrice(), Double.valueOf(sysBeauticianState.getCount()));
|
upProjUse.setBalance(MoneyUtil.sub(sysProjUse.getBalance(), bcxfje));
|
|
// 判断是否第一次使用该项目, 若是则根据商品消耗有效期更新到期时间
|
List<SysBeauticianState> sysBeauticianStates = beauticianStateDao.selectBeauticianStateByPuseIdAndNoStatus(sysBeauticianState.getPuseId(), Dictionary.SERVICE_STATU_YYQX);
|
if (CollectionUtils.isEmpty(sysBeauticianStates)) {
|
Date useInvalidTime = shoppingGoodsService.calInvalidTime(sysProjInfo, 2, sysProjUse.getFailTime());
|
upProjUse.setFailTime(useInvalidTime);
|
}
|
|
//更新余次信息
|
sysProjUseDao.updateSurplusCount(upProjUse);
|
//如果项目是套餐 中项目则判断套餐是否失效
|
if (sysProjUse.getTaocanId() != null) {
|
SysProjUse taocan = sysProjUseDao.selectById(sysProjUse.getTaocanId());
|
SysProjUse taocanQuery = new SysProjUse();
|
taocanQuery.setTaocanId(sysProjUse.getTaocanId());
|
List<SysProjUse> taocanProjUses = sysProjUseDao.selectByModel(taocanQuery);
|
List<SysProjUse> activeProjUse = taocanProjUses.stream().filter(item -> item.getIsOver().equals(Dictionary.FLAG_NO_N)).collect(Collectors.toList());
|
if (CollectionUtils.isEmpty(activeProjUse)) {
|
//全部使用完成
|
taocan.setIsOver(Dictionary.FLAG_YES_Y);
|
taocan.setSurplusCount(0);
|
taocan.setStatus(Dictionary.TAOCAN_STATUS_WX);
|
} else if (Dictionary.FLAG_YES_Y.equals(taocan.getIsCourse())) {
|
if (StringUtils.isBlank(taocan.getIsInfinite()) || Dictionary.FLAG_NO_N.equals(taocan.getIsInfinite())) {
|
//任选套餐检查套餐整体剩余次数
|
int tcSurplusCount = taocan.getSurplusCount() - sysBeauticianState.getCount();
|
if (tcSurplusCount < 0) {
|
throw new GlobleException(taocan.getProjName() + "已经达到最大使用次数");
|
} else {
|
taocan.setSurplusCount(tcSurplusCount);
|
}
|
|
if (tcSurplusCount == 0) {
|
taocan.setIsOver(Dictionary.FLAG_YES_Y);
|
taocan.setStatus(Dictionary.TAOCAN_STATUS_WX);
|
}
|
}
|
}
|
|
// 根据套餐内所有项目查询该套餐是否第一次使用,若第一次使用则更新该套餐有效期
|
List<SysBeauticianState> taocanHas = beauticianStateDao.selectByProjUse(taocanProjUses, Dictionary.SERVICE_STATU_YYQX);
|
if (CollectionUtils.isEmpty(taocanHas)) {
|
ShoppingGoods taocanInfo = shoppingGoodsDao.selectById(taocan.getProjId());
|
Date useInvalidTime = shoppingGoodsService.calInvalidTime(taocanInfo, 2, sysProjUse.getFailTime());
|
taocan.setFailTime(useInvalidTime);
|
}
|
sysProjUseDao.updateSurplusCount(taocan);
|
}
|
|
|
// 设置划扣价
|
hkPrice = MoneyUtil.add(hkPrice, bcxfje);
|
//插入订单明细
|
sysBeauticianState.setProjId(sysProjInfo.getId());
|
sysBeauticianState.setServicesId(sysProjServices.getId());
|
sysBeauticianState.setShopId(sysProjServices.getShopId());
|
sysBeauticianState.setState(Dictionary.BEATUI_STATE_DYY);
|
beauticianStateDao.insert(sysBeauticianState);
|
}
|
// 设置项目总时长
|
sysProjServices.setTotalTime(totalTime);
|
sysProjServices.setMoney(hkPrice);
|
sysProjServicesDao.update(sysProjServices);
|
return sysProjServices;
|
}
|
|
|
/**
|
* 校验服务单中的项目是否存在欠款
|
*
|
* @param sysProjServices
|
* @return
|
*/
|
@Override
|
public VerifyResult checkBalance(SysProjServices sysProjServices) {
|
//检测欠款
|
for (SysBeauticianState sysBeauticianState : sysProjServices.getServiceItems()) {
|
|
SysProjUse sysProjUse = projUseService.findById(sysBeauticianState.getPuseId());
|
int kjcs = 1;
|
if (sysProjUse.getTaocanId() != null) {
|
kjcs = sysBeauticianState.getCount() * sysProjUse.getDeductionNum();
|
}
|
int surplusCount = sysProjUse.getSurplusCount() - kjcs;
|
if (surplusCount < 0) {
|
if (!Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(sysProjUse.getType())) {
|
return new VerifyResult(true, sysProjUse.getProjName() + "余次不足");
|
} else {
|
return new VerifyResult(true, sysProjUse.getProjName() + "余次不足");
|
}
|
}
|
}
|
return new VerifyResult(false);
|
}
|
|
|
@Override
|
public int modify(SysProjServices sysProjServices) {
|
|
return sysProjServicesDao.update(sysProjServices);
|
|
}
|
|
@Override
|
public int remove(List<Long> list) {
|
|
return sysProjServicesDao.deleteByIds(list);
|
|
}
|
|
@Override
|
public int removeById(Long id) {
|
|
return sysProjServicesDao.deleteById(id);
|
|
}
|
|
|
@Override
|
public List<SysProjServices> findByModel(SysProjServices sysProjServices) {
|
|
return sysProjServicesDao.selectByModel(sysProjServices);
|
|
}
|
|
|
@Override
|
public SysProjServices findById(Long id) {
|
|
return sysProjServicesDao.selectById(id);
|
|
}
|
|
|
/**
|
* TODO 做成配置项目 校验服务单中的项目是否存在欠款
|
*
|
* @param sysProjServices
|
* @return
|
*/
|
@Override
|
public VerifyResult checkArrears(SysProjServices sysProjServices) {
|
// 检测欠款
|
for (SysBeauticianState sysBeauticianState : sysProjServices.getServiceItems()) {
|
SysProjUse sysProjUse = projUseService.findById(sysBeauticianState.getPuseId());
|
|
ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(sysProjUse.getProjId());
|
SysOrderItem item = sysOrderItemService.findById(sysProjUse.getOrderItemId());
|
SysOrder orderItem = sysOrderService.findById(item.getOrderId());
|
if ("购买".equals(sysProjUse.getSource())) {
|
// 如果用户有欠款,服务单总价不能超过已付金额
|
if (orderItem!=null && orderItem.getArrears() > 0) {
|
// 本金-余额=已消费金额
|
double bj = shoppingGoods.getSealPice();
|
//单价* 单次划扣次数* 本次下单数 TODO 单次划扣数量存到projuse表中
|
double bcxfje = sysProjUse.getPrice() * sysBeauticianState.getCount();
|
|
|
// 计算消费金额
|
double yxfje = MoneyUtil.sub(bj, sysProjUse.getBalance());
|
// 本金-欠款=已付金额
|
double money = MoneyUtil.sub((bj - orderItem.getArrears()), (yxfje + bcxfje));
|
// 如果 已付金额 - (已消费金额+本次消费金额)<0 则不能再消费
|
if (money < 0) {
|
return new VerifyResult(true, shoppingGoods.getName() + "存在欠款" + orderItem.getArrears() + "元 , 订单编号[ " + orderItem.getOrderNo() + " ] ");
|
}
|
|
|
}
|
} else if ("赠送".equals(sysProjUse.getSource())) {
|
if (orderItem!=null &&orderItem.getArrears() > 0) {
|
return new VerifyResult(true, shoppingGoods.getName() + "存在欠款" + orderItem.getArrears() + "元 , 不能消费赠送项目,订单编号[ " + orderItem.getOrderNo() + " ] ");
|
}
|
}
|
}
|
return new VerifyResult(false);
|
}
|
|
// 排班 jyy
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int paiban(SysProjServices projServices, String dateTime2) throws GlobleException {
|
/** 验证数据是否正确 */
|
SysProjServices checkProjServices = sysProjServicesDao.selectById(projServices.getId());
|
// 验证服务单是否存在或者取消
|
if (!checkProjServices.getState().equals(Dictionary.SERVICE_STATU_DYY)
|
&& !checkProjServices.getState().equals(Dictionary.SERVICE_STATU_YYCG)) {
|
throw new GlobleException("该服务单已被取消或者不存在!");
|
}
|
// 验证是否选择床位
|
if (sysBedInfoDao.selectById(projServices.getBedId()) == null) {
|
throw new GlobleException("请选择床位!");
|
}
|
String dateTime = DateUtil.dateToString(projServices.getYyTime(), DateUtil.DATE_FORMAT_DD);
|
// 设置床位排班时间
|
|
|
/***********************************************/
|
// 验证床位排班时间是否正确
|
|
SysBedState sysBedState = projServices.getBedState();
|
sysBedState.setEndTime(DateUtil.getNextNMinute(sysBedState.getStartTime(), projServices.getTotalTime()));
|
sysBedState.setBedId(projServices.getBedId());
|
sysBedState.setServiceId((projServices.getId()));
|
sysBedState.setBedState(Dictionary.BED_STATE_SYZ);
|
|
for (SysBeauticianState beauticianState : projServices.getServiceItems()) {
|
if (DateUtil.isAffterDate(beauticianState.getEndTime(), beauticianState.getBeginTime())) {
|
throw new GlobleException("美疗师的排班结束时间不能晚于美疗师排班的开始时间!");
|
}
|
}
|
|
// 判断是否是编辑,还是新增,编辑则需要先释放资源
|
if (checkProjServices.getState().equals(Dictionary.SERVICE_STATU_YYCG)) {
|
// 释放床位资源
|
bedStateDao.deleteByServiceId(checkProjServices.getId());
|
}
|
// 检测床位与美疗师占用情况
|
if (bedStateDao.checkBedClash(sysBedState) > 0) {
|
throw new GlobleException("该床位已被占用,请重新分配!");
|
}
|
bedStateDao.insert(sysBedState);
|
|
// 排美疗师并且分配项目
|
int projCount = 0;
|
for (SysBeauticianState beauticianState : projServices.getServiceItems()) {
|
|
|
if (beauticianStateDao.checkBeauticianClash(beauticianState) > 0) {
|
throw new GlobleException("该美疗师已被占用,请重新分配!");
|
}
|
// beauticianState.setExcTime(beauticianState.getProjInfo().getTimeLength());
|
beauticianState.setState(Dictionary.BEATUI_STATE_YYY);
|
beauticianStateDao.update(beauticianState);
|
|
if (beauticianState.getStaffId() == null || beauticianState.getStaffId().equals("")) {
|
throw new GlobleException("美疗师至少分配一个项目!");
|
}
|
}
|
|
|
// 设置成功状态
|
projServices.setState(Dictionary.SERVICE_STATU_XPL);
|
// 判断当前门店是否有历史美疗师
|
LastestWorkBeatuistaff lastWorkStaff = new LastestWorkBeatuistaff();
|
lastWorkStaff.setShopId(checkProjServices.getShopId());
|
List<LastestWorkBeatuistaff> lastWorkList = LastestWorkBeatuistaffDao.selectByModel(lastWorkStaff);
|
// 如果有数据,则先清空
|
if (lastWorkList.size() > 0) {
|
// 清空排班员工
|
LastestWorkBeatuistaffDao.deleteByModel(lastWorkStaff);
|
}
|
// 排班后记录当前最新的排班员工
|
List<LastestWorkBeatuistaff> lastList = new ArrayList<>();
|
|
for (SysBeauticianState beauticianState : projServices.getServiceItems()) {
|
LastestWorkBeatuistaff lastWork = new LastestWorkBeatuistaff();
|
lastWork.setChangeDate(new Date());
|
lastWork.setStaffId(beauticianState.getStaffId());
|
lastWork.setShopId(checkProjServices.getShopId());
|
lastList.add(lastWork);
|
}
|
LastestWorkBeatuistaffDao.batchInsert(lastList);
|
return sysProjServicesDao.update(projServices);
|
}
|
|
|
@Override
|
public int add(SysProjServices sysProjServices) {
|
return sysProjServicesDao.insert(sysProjServices);
|
}
|
|
// 取消服务单 jyy
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int modifyCancelProjServices(SysProjServices projServices) throws GlobleException {
|
|
SysProjServices checkProjServices = sysProjServicesDao.selectById(projServices.getId());
|
if (checkProjServices.getState().equals(Dictionary.SERVICE_STATU_YYQX)) {
|
throw new GlobleException("不能重复取消同一个订单");
|
} else if (checkProjServices.getState().equals(Dictionary.SERVICE_STATU_DYY)) {
|
// 回退项目余次
|
backProjCount(checkProjServices);
|
} else {
|
|
// 释放床位资源
|
SysBedState checkBedState = sysBedStateDao.selectBySerIdAndBedId(checkProjServices.getBedId(), checkProjServices.getId());
|
if (checkBedState != null) {
|
checkBedState.setBedState(Dictionary.BED_STATE_YYQX);
|
bedStateDao.update(checkBedState);
|
}
|
|
List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(checkProjServices.getId());
|
|
for (SysBeauticianState checkbeauticianState : beauticianStateList) {
|
// 释放美疗师
|
checkbeauticianState.setState(Dictionary.BEATUI_STATE_YYQX);
|
beauticianStateDao.update(checkbeauticianState);
|
}
|
// 回退项目余次
|
backProjCount(checkProjServices);
|
}
|
checkProjServices.setState(Dictionary.SERVICE_STATU_YYQX);
|
|
// 删除订单业绩
|
AchieveNew achieveNew = new AchieveNew();
|
achieveNew.setServiceOrderId(projServices.getId());
|
achieveNewService.removeByModel(achieveNew);
|
|
//删除出库单
|
SysOutStore sysOutStore = sysOutStoreDao.selectByServiceId(projServices.getId());
|
if (sysOutStore != null) {
|
List<SysOutStoreItem> outStoreItemList = sysOutStoreItemDao.selectByOrderId(sysOutStore.getId());
|
for (SysOutStoreItem item : outStoreItemList) {
|
SysStoreInfo sysStoreInfo = storeInfoDao.selectById(item.getStoreId());
|
ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(sysStoreInfo.getSkuId());
|
sysStoreInfo.setStoreTotal(sysStoreInfo.getStoreTotal() + item.getAmount());
|
//更新库存
|
storeInfoDao.update(sysStoreInfo);
|
|
}
|
sysOutStoreDao.deleteById(sysOutStore.getId());
|
sysOutStoreItemDao.deleteByOrderId(sysOutStore.getId());
|
}
|
//更新服务单状态
|
return sysProjServicesDao.update(checkProjServices);
|
}
|
|
|
/**
|
* @Title: backProjCount 回退项目余次 @author:jyy @param projServices
|
* void 返回类型 @date 2016年8月4日 上午11:30:42 @throws
|
*/
|
private void backProjCount(SysProjServices projServices) {
|
List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(projServices.getId());
|
|
Map<Long ,List<SysProjUse>> taocanMap = new HashMap<>();
|
// 回退项目余额
|
for (SysBeauticianState beauticianState : beauticianStateList) {
|
// 该修改为 有效日期判断更新所有
|
beauticianState.setState(Dictionary.BEATUI_STATE_YYQX);
|
beauticianStateDao.update(beauticianState);
|
|
SysProjUse sysProjUse = sysProjUseDao.selectById(beauticianState.getPuseId());
|
if (sysProjUse != null && sysProjUse.getId() != null) {
|
sysProjUse = sysProjUseDao.selectById(sysProjUse.getId());
|
|
SysProjUse upProjUse = new SysProjUse();
|
upProjUse.setId(sysProjUse.getId());
|
// 项目如果已使用完,将使用完成状态改为未使用完
|
if (sysProjUse.getSurplusCount() == 0) {
|
upProjUse.setIsOver(Dictionary.DELETED_N);
|
upProjUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
|
if (sysProjUse.getTaocanId() != null) {
|
//TODO 更新套餐状态为有效
|
SysProjUse taocanProjUse = sysProjUseDao.selectById(sysProjUse.getTaocanId());
|
taocanProjUse.setIsOver(Dictionary.DELETED_N);
|
taocanProjUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
|
|
if (Dictionary.FLAG_YES_Y.equals(taocanProjUse.getIsCourse())) {
|
if (StringUtils.isBlank(taocanProjUse.getIsInfinite()) || Dictionary.FLAG_NO_N.equals(taocanProjUse.getIsInfinite())) {
|
taocanProjUse.setSurplusCount(taocanProjUse.getSurplusCount() + beauticianState.getCount());
|
}
|
}
|
sysProjUseDao.update(taocanProjUse);
|
}
|
}
|
int surplus = sysProjUse.getSurplusCount() + beauticianState.getCount();
|
upProjUse.setSurplusCount(surplus);
|
upProjUse.setBalance(MoneyUtil.add(sysProjUse.getBalance(), sysProjUse.getPrice()));
|
|
// 取消时,判断该项目之前是否有使用过,若使用过则非第一次使用,则不更新有效日期,若未使用表明此次为第一次使用,则更新有效日期为购买日期或统一失效日期
|
List<SysBeauticianState> hasBeautician = beauticianStateDao.selectBeauticianStateByPuseIdAndNoStatus(beauticianState.getPuseId(), Dictionary.BEATUI_STATE_YYQX);
|
if (hasBeautician.isEmpty()) {
|
ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(beauticianState.getProjId());
|
Date useInvalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null);
|
upProjUse.setFailTime(useInvalidTime);
|
}
|
|
if (sysProjUse.getTaocanId() != null) {
|
List<SysProjUse> sysProjUses = taocanMap.get(sysProjUse.getTaocanId());
|
if (CollectionUtils.isEmpty(sysProjUses)) {
|
List<SysProjUse> taocanItems = new ArrayList<>();
|
taocanItems.add(sysProjUse);
|
taocanMap.put(sysProjUse.getTaocanId(), taocanItems);
|
} else {
|
sysProjUses.add(sysProjUse);
|
taocanMap.put(sysProjUse.getTaocanId(), sysProjUses);
|
}
|
}
|
sysProjUseDao.updateSurplusCount(upProjUse);
|
}
|
}
|
|
if (taocanMap.size() != 0) {
|
for (Map.Entry<Long, List<SysProjUse>> entry : taocanMap.entrySet()) {
|
List<SysBeauticianState> taocanUse = beauticianStateDao.selectByProjUse(entry.getValue(), Dictionary.BEATUI_STATE_YYQX);
|
if (CollectionUtils.isEmpty(taocanUse)) {
|
SysProjUse taocan = sysProjUseDao.selectById(entry.getKey());
|
ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(taocan.getProjId());
|
Date buyInvalidDate = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null);
|
taocan.setFailTime(buyInvalidDate);
|
|
sysProjUseDao.update(taocan);
|
}
|
}
|
}
|
}
|
|
// 划扣 jyy
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int modifyHKProjServices(SysProjServices projServices) throws GlobleException {
|
projServices = sysProjServicesDao.selectById(projServices.getId());
|
if (!projServices.getState().equals(Dictionary.SERVICE_STATU_FWWC)) {
|
throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!");
|
} else {
|
SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
|
if (skipServiceOrderStep(Dictionary.SERVICE_OVER_BEGIN_END)) {
|
SysBeauticianState checkBeauticianState = new SysBeauticianState();
|
checkBeauticianState.setServicesId(projServices.getId());
|
checkBeauticianState.setState(Dictionary.BEATUI_STATE_FWJS);
|
beauticianStateDao.chengItemState(checkBeauticianState);
|
|
// 释放床位资源
|
SysBedState checkBedState = sysBedStateDao.selectBySerIdAndBedId(projServices.getId(), projServices.getBedId());
|
if (checkBedState != null) {
|
checkBedState.setBedState(Dictionary.BED_STATE_SYJS);
|
bedStateDao.update(checkBedState);
|
}
|
projServices.setEndTime(new Date());
|
// 计算时差
|
long minspace = DateUtil.getDifTimeMin(projServices.getStartTime(), projServices.getEndTime()) - projServices.getTotalTime();
|
// 判断是服务超时还是服务提前结束,如果minspace大于0则是超时服务,小于0则是提前结束服务
|
projServices.setIsOverTime(minspace + "");
|
projServices.setState(Dictionary.SERVICE_STATU_FWWC);
|
sysProjServicesDao.update(projServices);
|
}
|
|
projServices.setState(Dictionary.SERVICE_STATU_FFJS);
|
projServices.setConsumeTime(new Date());
|
int result=sysProjServicesDao.update(projServices);
|
achieveNewService.addAchieveByServiceOrder(projServices);
|
|
//发送微信公众号提醒
|
UniformMsgParam uniformMsgParam=new UniformMsgParam(projServices.getCompanyId(),UniformMsgParam.GZH_FWWC);
|
uniformMsgParam.put("serviceId",projServices.getId());
|
rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,uniformMsgParam.toJSONString());
|
|
return result;
|
}
|
}
|
|
|
|
// 派单 jyy
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int modifyPDProjServices(SysProjServices projServices) throws GlobleException {
|
|
SysProjServices services = sysProjServicesDao.selectById(projServices.getId());
|
if (!services.getState().equals(Dictionary.SERVICE_STATU_YYCG)) {
|
throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!");
|
} else {
|
|
// TODO 更新服务单状态 可配置
|
services.setState(Dictionary.SERVICE_STATU_XPL);
|
// 派单就设置业绩
|
achieveNewService.addAchieveByServiceOrder(projServices);
|
return sysProjServicesDao.update(services);
|
}
|
}
|
|
/**
|
* 配料
|
*
|
* @author 姜友瑶
|
* @time 2018-08-03
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int modifyPLProjServices(SysProjServices projServicesVo) throws GlobleException {
|
SysProjServices projServices = sysProjServicesDao.selectById(projServicesVo.getId());
|
SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
|
if (!projServices.getState().equals(Dictionary.SERVICE_STATU_XPL)) {
|
throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!");
|
}
|
if (isNeedOutStore(projServicesVo)) {
|
|
// 生成出库单
|
Long warehouseId = warehouseDao.findShopWarehouse(projServices.getShopId()).get(0).getId();
|
SysOutStore outStore = new SysOutStore();
|
|
outStore.setOutStoreNo(codeService.getOutStoreCode());
|
outStore.setShopId(projServices.getShopId());
|
if(projServices.getDevisionId()!=null){
|
outStore.setStaffId(projServices.getDevisionId());
|
}else{
|
|
outStore.setStaffId(sysUsers.getSuId());
|
}
|
outStore.setServiceId(projServices.getId());
|
outStore.setType(Dictionary.OUT_STORE_XHCPCK);
|
outStore.setTime(new Date());
|
outStore.setCompanyId(projServices.getCompanyId());
|
sysOutStoreDao.insert(outStore);
|
//出库明细,根据批次维度定义
|
List<SysOutStoreItem> realOutStoreItemList = new ArrayList<>();
|
|
// 生成出库单明细
|
for (SysOutStoreItem item : projServicesVo.getOutStoreItem()) {
|
if (item.getAmount() != null && item.getAmount() > 0) {
|
|
SysOutStoreItem sysOutStoreItem = new SysOutStoreItem();
|
|
|
ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(item.getSkuId());
|
|
List<SysStoreInfo> stores = storeInfoDao.selectStoInfoBySku(item.getSkuId(), warehouseId);
|
double sum = stores.stream().mapToDouble(item2 -> item2.getStoreTotal()).sum();
|
Double needAmount = MoneyUtil.div(item.getAmount(), Double.valueOf(shoppingGoods.getVolume()));
|
if (sum < needAmount) {
|
throw new GlobleException("出库失败:【" + shoppingGoods.getName()+"-"+shoppingGoods.getCode()+ "库存不足】");
|
}
|
//循环获取所有批次产品,并扣减库存
|
for (SysStoreInfo storeInfo : stores) {
|
Double oldStoreTotal = storeInfo.getStoreTotal();
|
Double surplus = storeInfo.getStoreTotal() - needAmount;
|
//更新库存
|
storeInfo.setStoreTotal(surplus < 0 ? 0 : surplus);
|
|
item.setId(null);
|
//每次扣减库存都创建一个出库记录
|
BeanUtils.copyProperties(item, sysOutStoreItem);
|
sysOutStoreItem.setOutStoreId(outStore.getId());
|
sysOutStoreItem.setStoreId(storeInfo.getId());
|
sysOutStoreItem.setAmount(oldStoreTotal - storeInfo.getStoreTotal());
|
realOutStoreItemList.add(sysOutStoreItem);
|
storeInfoDao.update(storeInfo);
|
//扣除后剩余库存大于0则跳出扣除,否则剩余数量的负数的绝对值就是再次扣减的数量
|
if (surplus > 0) {
|
break;
|
} else {
|
needAmount = Math.abs(surplus);
|
}
|
}
|
|
} else {
|
LogUtil.debug("未选择配料跳过sku={},amount={}", item.getSkuId(), item.getAmount());
|
}
|
}
|
sysOutStoreItemDao.batchInsert(realOutStoreItemList);
|
}
|
// 设置服务单状态
|
// projServices.setState(Dictionary.SERVICE_STATU_PLWC);
|
|
if(projServices.getDevisionId()==null){
|
//如果没有设置配料师则默认为操作配料的人为配料师
|
projServices.setDevisionId(sysUsers.getSuId());
|
}
|
|
// 判断是否跳过开始/结束服务
|
if (skipServiceOrderStep(Dictionary.SERVICE_OVER_BEGIN_END)) {
|
projServices.setStartTime(new Date());
|
projServices.setState(Dictionary.SERVICE_STATU_FWWC);
|
}
|
// 释放床位资源
|
// SysBedState checkBedState = sysBedStateDao.selectBySerIdAndBedId(projServices.getBedId(), projServices.getId());
|
// if (checkBedState != null) {
|
// checkBedState.setBedState(Dictionary.BED_STATE_SYJS);
|
// bedStateDao.update(checkBedState);
|
// }
|
// projServices.setStartTime(new Date());
|
// projServices.setEndTime(new Date());
|
// // 计算时差
|
// long minspace = DateUtil.getDifTimeMin(projServices.getStartTime(), projServices.getEndTime())
|
// - projServices.getTotalTime();
|
// // 判断是服务超时还是服务提前结束,如果minspace大于0则是超时服务,小于0则是提前结束服务
|
// projServices.setIsOverTime(minspace + "");
|
// projServices.setState(Dictionary.SERVICE_STATU_FWWC);
|
return sysProjServicesDao.update(projServices);
|
}
|
|
/**
|
* 服务单收费需要生成出库记录
|
* @param projServicesVo
|
* @return
|
*/
|
private boolean isNeedOutStore(SysProjServices projServicesVo) {
|
if(CollectionUtils.isNotEmpty(projServicesVo.getOutStoreItem())){
|
for (SysOutStoreItem item : projServicesVo.getOutStoreItem()) {
|
if (item.getAmount() != null && item.getAmount() > 0) {
|
return true;
|
}
|
}
|
}
|
return false;
|
}
|
|
// 服务开始 jyy
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int modifyFWKSProjServices(SysProjServices projServices) throws GlobleException {
|
// 验证操作人
|
projServices = sysProjServicesDao.selectById(projServices.getId());
|
SysUsers users = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
|
SysBeauticianState checkBeauticianState = null;
|
|
List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(projServices.getId());
|
|
for (SysBeauticianState beauticianState : beauticianStateList) {
|
if (users.getSuId().equals(beauticianState.getStaffId())) {
|
checkBeauticianState = beauticianState;
|
break;
|
}
|
}
|
if (checkBeauticianState == null) {
|
throw new GlobleException("无权限开始服务!");
|
}
|
|
if ((!projServices.getState().equals(Dictionary.SERVICE_STATU_PLWC)
|
&& !(projServices.getState().equals(Dictionary.SERVICE_STATU_FWZ)))) {
|
throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!");
|
} else if (projServices.getState().equals(Dictionary.SERVICE_STATU_PLWC)) {
|
projServices.setStartTime(new Date());
|
projServices.setState(Dictionary.SERVICE_STATU_FWZ);
|
sysProjServicesDao.update(projServices);
|
}
|
// 设置美疗师实际开始时间
|
checkBeauticianState.setState(Dictionary.BEATUI_STATE_SYZ);
|
projServices.getVipId();
|
return beauticianStateDao.update(checkBeauticianState);
|
}
|
|
// 服务结束 jyy
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int modifyFWJSrojServices(SysProjServices projServices) throws GlobleException {
|
SysUsers users = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
|
SysProjServices checkprojServices = sysProjServicesDao.selectById(projServices.getId());
|
if (!checkprojServices.getState().equals(Dictionary.SERVICE_STATU_FWZ)) {
|
throw new GlobleException("该服务单状态为" + checkprojServices.getState() + ",不可以进行当前操作!");
|
}
|
SysBeauticianState checkBeauticianState = new SysBeauticianState();
|
checkBeauticianState.setServicesId(projServices.getId());
|
checkBeauticianState.setState(Dictionary.BEATUI_STATE_FWJS);
|
int rerunlt = beauticianStateDao.chengItemState(checkBeauticianState);
|
|
// 验证是否是最后一个美疗师结束服务
|
boolean isOver = true;
|
List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(checkprojServices.getId());
|
for (SysBeauticianState beauticianState : beauticianStateList) {
|
if (!beauticianState.getState().equals(Dictionary.BEATUI_STATE_FWJS)) {
|
isOver = false;
|
break;
|
}
|
}
|
if (isOver) {
|
// 释放床位资源
|
SysBedState checkBedState = sysBedStateDao.selectBySerIdAndBedId(checkprojServices.getBedId(), checkprojServices.getId());
|
if (checkBedState != null) {
|
checkBedState.setBedState(Dictionary.BED_STATE_SYJS);
|
bedStateDao.update(checkBedState);
|
}
|
checkprojServices.setEndTime(new Date());
|
// 计算时差
|
long minspace = DateUtil.getDifTimeMin(checkprojServices.getStartTime(), checkprojServices.getEndTime())
|
- checkprojServices.getTotalTime();
|
// 判断是服务超时还是服务提前结束,如果minspace大于0则是超时服务,小于0则是提前结束服务
|
checkprojServices.setIsOverTime(minspace + "");
|
checkprojServices.setState(Dictionary.SERVICE_STATU_FWWC);
|
sysProjServicesDao.update(checkprojServices);
|
}
|
|
return rerunlt;
|
}
|
|
@Override
|
public List<SysProjServices> findInPage(SysProjServices sysProjServices, PaginationVO pageVo) {
|
return sysProjServicesDao.selectInPage(sysProjServices, pageVo);
|
}
|
|
@Override
|
public int findTotal(SysProjServices sysProjServices) {
|
|
return sysProjServicesDao.selectTotalRecord(sysProjServices);
|
|
}
|
|
@Override
|
public List<ServiceOrderListVo> findApiServiceOrderListInPage(ServiceOrderListDto serviceOrderListDto, PaginationVO pageVo) {
|
return sysProjServicesDao.selectApiServiceOrderListInPage(serviceOrderListDto, pageVo);
|
}
|
|
@Override
|
public int findApiServiceOrderListTotal(ServiceOrderListDto serviceOrderListDto) {
|
return sysProjServicesDao.selectApiServiceOrderListTotal(serviceOrderListDto);
|
}
|
|
/**
|
* 跳过服务单某步骤
|
*/
|
private boolean skipServiceOrderStep(String step) {
|
SysUsers users = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
|
ParameterSettings ps = new ParameterSettings();
|
ps.setCompanyId(users.getCompanyId());
|
ps.setCategory("店务配置");
|
List<ParameterSettings> settings = parameterSettingsDao.getByCategory(ps);
|
|
boolean flag = false;
|
if (CollUtil.isNotEmpty(settings)) {
|
for (ParameterSettings setting : settings) {
|
if (step.equals(setting.getCode()) && Dictionary.FLAG_YES.equals(setting.getUserValue())) {
|
flag = true;
|
break;
|
}
|
}
|
}
|
|
return flag;
|
}
|
}
|