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 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 taocanProjUses = sysProjUseDao.selectByModel(taocanQuery); List 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 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 list) { return sysProjServicesDao.deleteByIds(list); } @Override public int removeById(Long id) { return sysProjServicesDao.deleteById(id); } @Override public List 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 lastWorkList = LastestWorkBeatuistaffDao.selectByModel(lastWorkStaff); // 如果有数据,则先清空 if (lastWorkList.size() > 0) { // 清空排班员工 LastestWorkBeatuistaffDao.deleteByModel(lastWorkStaff); } // 排班后记录当前最新的排班员工 List 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 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 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 beauticianStateList = beauticianStateDao.selectBySerIds(projServices.getId()); Map> 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 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 sysProjUses = taocanMap.get(sysProjUse.getTaocanId()); if (CollectionUtils.isEmpty(sysProjUses)) { List 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> entry : taocanMap.entrySet()) { List 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 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 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 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 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 findInPage(SysProjServices sysProjServices, PaginationVO pageVo) { return sysProjServicesDao.selectInPage(sysProjServices, pageVo); } @Override public int findTotal(SysProjServices sysProjServices) { return sysProjServicesDao.selectTotalRecord(sysProjServices); } @Override public List 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 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; } }