| package com.matrix.system.hive.service.imp; | 
|   | 
| 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.WebUtil; | 
| 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.core.tools.DateUtil; | 
| import com.matrix.system.hive.plugin.util.MoneyUtil; | 
| import com.matrix.system.hive.pojo.MyBeauticianCount; | 
| import com.matrix.system.hive.service.*; | 
| import org.apache.commons.collections.CollectionUtils; | 
| import org.springframework.beans.BeanUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import javax.annotation.Resource; | 
| import java.util.ArrayList; | 
| import java.util.Date; | 
| import java.util.List; | 
| 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; | 
|   | 
|     /** | 
|      * 新增服务单 jyy | 
|      * | 
|      * @return | 
|      */ | 
|     @Transactional(rollbackFor = Exception.class) | 
|     @Override | 
|     public SysProjServices addSysProjServices(SysProjServices sysProjServices) throws GlobleException { | 
|   | 
|         //创建服务单 | 
|         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.setState(Dictionary.SERVICE_STATU_DYY); | 
|         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)); | 
|             //更新余次信息 | 
|             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())) { | 
|                     //任选套餐检查套餐整体剩余次数 | 
|                     int tcSurplusCount = taocan.getSurplusCount() - sysProjUse.getDeductionNum(); | 
|                     if (tcSurplusCount < 0) { | 
|                         throw new GlobleException(taocan.getProjName() + "已经达到最大使用次数"); | 
|                     } else { | 
|                         taocan.setSurplusCount(tcSurplusCount); | 
|                     } | 
|                 } | 
|                 sysProjUseDao.updateSurplusCount(taocan); | 
|             } | 
|   | 
|   | 
|             // 设置划扣价 | 
|             hkPrice = MoneyUtil.add(hkPrice, bcxfje); | 
|             //插入订单明细 | 
|             sysBeauticianState.setProjId(sysProjInfo.getId()); | 
|             sysBeauticianState.setServicesId(sysProjServices.getId()); | 
|             sysBeauticianState.setShopId(user.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 orderItem = sysOrderItemService.findById(sysProjUse.getOrderItemId()); | 
|             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() + "元 , 订单编号[ " + sysOrderService.findById(orderItem.getOrderId()).getOrderNo() + " ] "); | 
|                     } | 
|   | 
|   | 
|                 } | 
|             } else if ("赠送".equals(sysProjUse.getSource())) { | 
|                 if (orderItem!=null &&orderItem.getArrears() > 0) { | 
|                     return new VerifyResult(true, shoppingGoods.getName() + "存在欠款" + orderItem.getArrears() + "元 , 不能消费赠送项目,订单编号[ " + sysOrderService.findById(orderItem.getOrderId()).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.setState(Dictionary.BEATUI_STATE_YYY); | 
|             beauticianStateDao.update(beauticianState); | 
|   | 
|             if (beauticianState.getStaffId() == null || beauticianState.getStaffId().equals("")) { | 
|                 throw new GlobleException("美疗师至少分配一个项目!"); | 
|             } | 
|         } | 
|   | 
|   | 
|         // 设置成功状态 | 
|         projServices.setState(Dictionary.SERVICE_STATU_YYCG); | 
|         // 判断当前门店是否有历史美疗师 | 
|         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()); | 
|         // 回退项目余额 | 
|         for (SysBeauticianState beauticianState : beauticianStateList) { | 
|             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 更新套餐状态为有效 | 
|                     } | 
|                 } | 
|                 int surplus = sysProjUse.getSurplusCount() + beauticianState.getCount(); | 
|                 upProjUse.setSurplusCount(surplus); | 
|                 upProjUse.setBalance(MoneyUtil.add(sysProjUse.getBalance(), sysProjUse.getPrice())); | 
|                 sysProjUseDao.updateSurplusCount(upProjUse); | 
|             } | 
|         } | 
|     } | 
|   | 
|     // 划扣 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 { | 
|   | 
|             projServices.setState(Dictionary.SERVICE_STATU_FFJS); | 
|             projServices.setConsumeTime(new Date()); | 
|             return sysProjServicesDao.update(projServices); | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|     // 派单 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()); | 
|   | 
|         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{ | 
|                 SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); | 
|                 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() + "库存不足】"); | 
|                     } | 
|                     //循环获取所有批次产品,并扣减库存 | 
|                     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); | 
|         // 设置服务单操作流水 | 
|         // TODO 本功能待完善记录最新的排班员工 | 
|     /*    List<LastestWorkBeatuistaff> lastList = LastestWorkBeatuistaffDao.selectByModel(null); | 
|         LastestWorkBeatuistaff lastWork = new LastestWorkBeatuistaff(); | 
|         if (lastList.size() > 0) { | 
|             lastWork.setChangeDate(new Date()); | 
|             lastWork.setStaffId(projServices.getBeauticianId()); | 
|             LastestWorkBeatuistaffDao.insert(lastWork); | 
|         } else { | 
|   | 
|             //TODO 有bug集合为零了 | 
|             LastestWorkBeatuistaff modifyObj = lastList.get(0); | 
|             modifyObj.setChangeDate(new Date()); | 
|             modifyObj.setStaffId(projServices.getBeauticianId()); | 
|             LastestWorkBeatuistaffDao.update(modifyObj); | 
|         }*/ | 
|   | 
|         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); | 
|         checkBeauticianState.setStaffId(users.getSuId()); | 
|         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); | 
|   | 
|     } | 
|   | 
| } |