| package com.matrix.system.hive.service.imp; | 
|   | 
| import cn.hutool.core.collection.CollUtil; | 
| import cn.hutool.json.JSONUtil; | 
| import com.matrix.core.constance.MatrixConstance; | 
| import com.matrix.core.exception.GlobleException; | 
| import com.matrix.core.pojo.PaginationVO; | 
| import com.matrix.core.tools.DateUtil; | 
| import com.matrix.core.tools.ModelUtils; | 
| import com.matrix.core.tools.StringUtils; | 
| import com.matrix.core.tools.WebUtil; | 
| import com.matrix.system.app.vo.UserAchieveVo; | 
| import com.matrix.system.common.bean.BusParameterSettings; | 
| import com.matrix.system.common.bean.SysUsers; | 
| import com.matrix.system.common.constance.AppConstance; | 
| import com.matrix.system.common.dao.BusParameterSettingsDao; | 
| 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.CollectionUtils; | 
| import com.matrix.system.hive.service.AchieveNewService; | 
| import com.matrix.system.hive.service.SysProjServicesService; | 
| import com.matrix.system.hiveErp.pojo.AchieveRuleItem; | 
| import org.springframework.beans.BeanUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.math.BigDecimal; | 
| import java.util.*; | 
|   | 
| /** | 
|  * This field was generated by Zking.software.Codegen. | 
|  * | 
|  * @date 2019-03-24 16:01 | 
|  */ | 
| @Service("achieveNewService") | 
| public class AchieveNewServiceImpl implements AchieveNewService { | 
|   | 
|     @Autowired | 
|     private AchieveNewDao achieveNewDao; | 
|   | 
|     @Autowired | 
|     private SysUsersDao shopstaffInfoDao; | 
|   | 
|     @Autowired | 
|     SysBeauticianStateDao sysBeauticianStateDao; | 
|   | 
|     @Autowired | 
|     private SysProjUseDao sysProjUseDao; | 
|   | 
|     @Autowired | 
|     private SysProjServicesService projServicesService; | 
|   | 
|     @Override | 
|     public int add(AchieveNew achieveNew) { | 
|   | 
|         return achieveNewDao.insert(achieveNew); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int batchAdd(List<AchieveNew> achieveNewList) { | 
|         int num = 0; | 
|   | 
|         int c = 10000; | 
|         int size = achieveNewList.size() / c + 1; | 
|         for (int i = 0; i < size; i++) { | 
|             int begin = i * c; | 
|             int end = (i + 1) * c; | 
|             end = end >= achieveNewList.size() ? achieveNewList.size() : end; | 
|             List<AchieveNew> insertList = achieveNewList.subList(begin, end); | 
|             num += achieveNewDao.batchInsert(insertList); | 
|         } | 
|         return num; | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int modifyByMap(AchieveNew oldAchieveNew, AchieveNew newAchieveNew) { | 
|   | 
|         try { | 
|             if (!ModelUtils.isModified(oldAchieveNew, newAchieveNew)) { | 
|                 return 1; | 
|             } | 
|         } catch (NoSuchFieldException e1) { | 
|             e1.printStackTrace(); | 
|         } | 
|         Map<String, Object> modifyMap = null; | 
|         try { | 
|             modifyMap = ModelUtils.comparePojo2Map(oldAchieveNew, newAchieveNew); | 
|         } catch (Exception e) { | 
|             throw new GlobleException("数据对比失败"); | 
|         } | 
|         if (modifyMap.size() > 0) { | 
|             modifyMap.put("id", oldAchieveNew.getId()); | 
|             achieveNewDao.updateByMap(modifyMap); | 
|         } | 
|         return 1; | 
|     } | 
|   | 
|     @Override | 
|     public int modifyByModel(AchieveNew achieveNew) { | 
|   | 
|         return achieveNewDao.updateByModel(achieveNew); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int remove(List<Long> list) { | 
|   | 
|         return achieveNewDao.deleteByIds(list); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int removeById(Long id) { | 
|   | 
|         return achieveNewDao.deleteById(id); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int removeByModel(AchieveNew achieveNew) { | 
|   | 
|         return achieveNewDao.deleteByModel(achieveNew); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public List<AchieveNew> findInPage(AchieveNew achieveNew, PaginationVO pageVo) { | 
|   | 
|         return achieveNewDao.selectInPage(achieveNew, pageVo); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public List<AchieveNew> findByModel(AchieveNew achieveNew) { | 
|   | 
|         return achieveNewDao.selectByModel(achieveNew); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int findTotal(AchieveNew achieveNew) { | 
|   | 
|         return achieveNewDao.selectTotalRecord(achieveNew); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public AchieveNew findById(Long id) { | 
|   | 
|         return achieveNewDao.selectById(id); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int modify(AchieveNew obje) { | 
|   | 
|         return 0; | 
|     } | 
|   | 
|   | 
|     @Override | 
|     public void     addAchieveByServiceOrder(SysProjServices projServices) { | 
|         List<AchieveNew> achieveNewList = new ArrayList<>(); | 
|         List<SysBeauticianState> beauticianStateList = sysBeauticianStateDao.selectBySerIds(projServices.getId()); | 
|         int size = beauticianStateList.size(); | 
|   | 
|         Long achieveId = projServices.getCreateStaffId(); | 
|   | 
|         // 下单人是否计算消耗业绩 | 
|         boolean flag = projServicesService.skipServiceOrderStep(Dictionary.SALE_MAN_IS_CONSUME_ACHIEVE); | 
|   | 
|   | 
|         Set<Long> beautyIds = new HashSet<>(); | 
|         for (SysBeauticianState beauticianState : beauticianStateList) { | 
|             // 是否第一次计算改美疗师 | 
|             boolean isFirst = true; | 
|             SysProjUse projUse = sysProjUseDao.selectById(beauticianState.getPuseId()); | 
|             AchieveNew achieveNew = new AchieveNew(); | 
|             // 设置顾问id | 
|             achieveNew.setSaleId(achieveId); | 
|             achieveNew.setBeaultId(beauticianState.getStaffId()); | 
|             achieveNew.setVipId(projServices.getVipId()); | 
|             // 是否为赠送业绩 | 
|             if (Dictionary.TAOCAN_SOURCE_ZS.equals(projUse.getSource())) { | 
|   | 
|                 achieveNew.setFreeConsume(projUse.getPrice()*beauticianState.getCount()); | 
|                 //计算提成 | 
|                 achieveNew.setProjPercentage( | 
|                         calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_ZS,achieveNew.getFreeConsume(),beauticianState.getProjId())); | 
|   | 
|             } else { | 
|                 achieveNew.setHisConsume(new BigDecimal(projUse.getPrice()*beauticianState.getCount()).setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue()); | 
|                 //计算提成 | 
|                 achieveNew.setProjPercentage( | 
|                         calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_BJ,achieveNew.getHisConsume(),beauticianState.getProjId())); | 
|             } | 
|             achieveNew.setT2(projUse.getSource()); | 
|             achieveNew.setDatatime(new Date()); | 
|             achieveNew.setOrderType(Dictionary.ORDER_TYPE_SERVICE); | 
|             achieveNew.setServiceOrderId(projServices.getId()); | 
|             achieveNew.setOrderItemId(beauticianState.getId()); | 
|             achieveNew.setShopId(projServices.getShopId()); | 
|             achieveNew.setCompanyId(projServices.getCompanyId()); | 
|             achieveNew.setShoppingGoodsId(projUse.getProjId()); | 
|   | 
|   | 
|             if (flag) { | 
| //                if (!achieveId.equals(beauticianState.getStaffId())) { | 
|                     AchieveNew saleManAchieve = new AchieveNew(); | 
|                     BeanUtils.copyProperties(achieveNew, saleManAchieve); | 
|                     saleManAchieve.setBeaultId(achieveId); | 
|   | 
|                     saleAchieveNumOfPeople(saleManAchieve); | 
|                     //销售人员不计算项目提成 | 
|                     saleManAchieve.setProjPercentage(0D); | 
|                     achieveNewList.add(saleManAchieve); | 
| //                } | 
|             } | 
|   | 
| //            List<AchieveNew> beautyList = achieveNewDao.selectBeautyManAchieveList(beauticianState.getStaffId(), projServices.getVipId(), new Date()); | 
| //            if (CollUtil.isEmpty(beautyList)) { | 
| //                achieveNew.setNumberOfPeople(1D / size); | 
| //            } else { | 
| //                achieveNew.setNumberOfPeople(1D / (size + beautyList.size())); | 
| //                achieveNewDao.updateAchieveNumOfPeople(beautyList, achieveNew.getNumberOfPeople()); | 
| //            } | 
|   | 
|             achieveNew.setProjNum(1); | 
|             if (StringUtils.isNotBlank(beauticianState.getExtract())) { | 
|                 achieveNew.setProjPercentage(Double.parseDouble(beauticianState.getExtract())); | 
|             } | 
|             if (isFirst && beauticianState.getEndTime() != null && beauticianState.getBeginTime() != null) { | 
| //                long timeSpace = beauticianState.getEndTime().getTime() - beauticianState.getBeginTime().getTime(); | 
| //                if (timeSpace > 0) { | 
| //                    achieveNew.setProjTime((int) (timeSpace / 1000 / 60)); | 
| //                } else { | 
| //                    achieveNew.setProjTime(1); | 
| //                } | 
|                 achieveNew.setProjTime(beauticianState.getExcTime()); | 
|                 isFirst = false; | 
|             } | 
|   | 
|             beautyIds.add(achieveNew.getBeaultId()); | 
|             achieveNewList.add(achieveNew); | 
|         } | 
|   | 
|         if (CollectionUtils.isNotEmpty(achieveNewList)) { | 
|             achieveNewDao.batchInsert(achieveNewList); | 
|             achieveNumOfPeople(beautyIds, projServices.getVipId()); | 
|         } | 
|   | 
|     } | 
|   | 
|     @Autowired | 
|     AchieveRuleDao achieveRuleDao; | 
|   | 
|     private Double calculationProjPercentage(int type, Double consume, Long goodsId) { | 
|          ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(goodsId); | 
|          if(shoppingGoods.getAchieveRuleId()!=null){ | 
|   | 
|              AchieveRule achieveRule = achieveRuleDao.selectById(shoppingGoods.getAchieveRuleId()); | 
|              if(achieveRule!=null){ | 
|                  List<AchieveRuleItem> achieveRuleItems = JSONUtil.toList(JSONUtil.parseArray(achieveRule.getRules()), AchieveRuleItem.class); | 
|                  double percentage=0D; | 
|                  for(AchieveRuleItem item:achieveRuleItems){ | 
|                      if(item.getAchieveType()==type | 
|                         && (item.getLower() == consume | 
|                              || (item.getLower()< consume && consume < item.getUpper() ))){ | 
|   | 
|                          if(AchieveRuleItem.ACHIEVE_TYPE_FIXED==item.getCalculationType()){ | 
|                              percentage=item.getAchieve(); | 
|                          }else{ | 
|                              percentage= consume * (item.getAchieve()/100); | 
|                          } | 
|                          break; | 
|                      } | 
|                  } | 
|                  return percentage; | 
|              } | 
|          } | 
|         return 0D; | 
|     } | 
|   | 
|     /** | 
|      * 顾问人头业绩 | 
|      * @param achieveNew | 
|      */ | 
|     private void saleAchieveNumOfPeople(AchieveNew achieveNew) { | 
|         List<AchieveNew> saleList = achieveNewDao.selectSaleManAchieveList(achieveNew.getSaleId(), achieveNew.getVipId(), new Date()); | 
|         if (CollUtil.isEmpty(saleList)) { | 
|             achieveNew.setNumberOfPeople(1D); | 
|         } else { | 
|             achieveNew.setNumberOfPeople(1D / (1D + saleList.size())); | 
|             achieveNewDao.updateAchieveNumOfPeople(saleList, achieveNew.getNumberOfPeople()); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * | 
|      * 合并订单与服务单人头逻辑,即每一个客户对美疗师/顾问来说,每一天同一个客户只算一个人头。 | 
|      * 如若A给客户X下订单,并给客户X服务,对A来说只算一个人头 | 
|      */ | 
|     private void achieveNumOfPeople(Set<Long> beautyIds, Long vipId) { | 
|         for (Long userId : beautyIds) { | 
|             double num; | 
|             List<AchieveNew> achieveNewList = achieveNewDao.selectBeautyManAchieveList(userId, vipId, new Date()); | 
|   | 
|             if (CollUtil.isEmpty(achieveNewList)) { | 
|                 num = 1D; | 
|             } else { | 
|                 num = 1D / achieveNewList.size(); | 
|             } | 
|   | 
|             achieveNewDao.updateAchieveNumOfPeople(achieveNewList, num); | 
|         } | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public void addAchaeveByOrder(SysOrder pageOrder) { | 
|         List<AchieveNew> achieveNewList = new ArrayList<>(); | 
|         Set<Long> beautyIds = new HashSet<>(); | 
|         if (CollectionUtils.isNotEmpty(pageOrder.getItems())) { | 
|             for (SysOrderItem orderItem : pageOrder.getItems()) { | 
|   | 
|                 if (orderItem != null && CollectionUtils.isNotEmpty(orderItem.getAchieveList())) { | 
|   | 
|                     for (AchieveNew achieveNew : orderItem.getAchieveList()) { | 
|                         if (achieveNew !=null   && achieveNew.getGoodsCash()!=null) { | 
|                             buildAchieve(pageOrder,  orderItem, achieveNew); | 
|                             achieveNewList.add(achieveNew); | 
|   | 
|                             beautyIds.add(achieveNew.getBeaultId()); | 
|                         } | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         if (CollectionUtils.isNotEmpty(achieveNewList)) { | 
|             achieveNewDao.batchInsert(achieveNewList); | 
|             if (!beautyIds.isEmpty()) { | 
|                 achieveNumOfPeople(beautyIds, pageOrder.getVipId()); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @Autowired | 
|     ShoppingGoodsDao shoppingGoodsDao; | 
|     @Autowired | 
|     BusParameterSettingsDao busParameterSettingsDao; | 
|   | 
|     private void buildAchieve(SysOrder pageOrder, SysOrderItem orderItem, AchieveNew achieveNew) { | 
|         BusParameterSettings shopManageJjcpasConsume =null; | 
|         if (Dictionary.ORDER_STATU_TK.equals(pageOrder.getStatu())) { | 
|             achieveNew.setId(null); | 
|             achieveNew.setProjPercentage(0 - achieveNew.getProjPercentage()); | 
|             achieveNew.setGoodsCash(0 - achieveNew.getGoodsCash()); | 
|         } | 
|   | 
|         achieveNew.setVipId(pageOrder.getVipId()); | 
|         if(achieveNew.getSaleId()==null){ | 
|             achieveNew.setSaleId(pageOrder.getStaffId()); | 
|         } | 
|   | 
|   | 
|         if (pageOrder.getPayTime() != null) { | 
|             achieveNew.setDatatime(pageOrder.getPayTime()); | 
|         } else { | 
|             achieveNew.setDatatime(new Date()); | 
|         } | 
|         if(Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(orderItem.getShoppingGoods().getGoodType())){ | 
|             if(shopManageJjcpasConsume==null){ | 
|                 shopManageJjcpasConsume = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.SHOP_MANAGE_JJCPAS_CONSUME, pageOrder.getCompanyId()); | 
|             } | 
|             if(AppConstance.IS_Y.equals(shopManageJjcpasConsume.getParamValue())){ | 
|                 achieveNew.setHisConsume(achieveNew.getGoodsCash()); | 
|             } | 
|   | 
|         } | 
|   | 
|         // 设置顾问人头业绩 | 
| //        saleAchieveNumOfPeople(achieveNew); | 
|   | 
|         achieveNew.setOrderType(Dictionary.ORDER_TYPE_SEAL); | 
|         achieveNew.setOrderId(pageOrder.getId()); | 
|         achieveNew.setOrderItemId(orderItem.getId()); | 
|         achieveNew.setShopId(pageOrder.getShopId()); | 
|         achieveNew.setCompanyId(pageOrder.getCompanyId()); | 
|         achieveNew.setShoppingGoodsId(orderItem.getGoodsId()); | 
|         // 是否赠送 | 
|         achieveNew.setT2(orderItem.getIsFree()); | 
|     } | 
|   | 
|     @Override | 
|     public List<AchieveNew> findDayFlow(AchieveNew achieveNew, PaginationVO pageVo) { | 
|   | 
|         return achieveNewDao.findDayFlow(achieveNew, pageVo); | 
|     } | 
|   | 
|     @Override | 
|     public int findDayFlowTotal(AchieveNew achieveNew, PaginationVO pageVo) { | 
|         return achieveNewDao.findDayFlowTotal(achieveNew, pageVo); | 
|     } | 
|   | 
|     @Override | 
|     public List<AchieveNew> findSumDailyInfoNew(AchieveNew achieveNew, PaginationVO pageVo) { | 
|   | 
|         return achieveNewDao.findSumDailyInfoNew(achieveNew, pageVo); | 
|     } | 
|   | 
|   | 
|     @Override | 
|     public void modifyAchieveTime(AchieveNew achieveNew) { | 
|         achieveNewDao.updateAchieveTime(achieveNew); | 
|     } | 
|   | 
|     @Override | 
|     public List<Map<String, Object>> findVipConsumeStatisticsList(AchieveNew achieveNew, PaginationVO pageVo) { | 
|         return achieveNewDao.selectVipConsumeStatisticsList(achieveNew, pageVo); | 
|     } | 
|   | 
|     @Override | 
|     public int findVipConsumeStatisticsTotal(AchieveNew achieveNew) { | 
|         return achieveNewDao.selectVipConsumeStatisticsTotal(achieveNew); | 
|     } | 
|   | 
|     @Override | 
|     public UserAchieveVo findUserAchieveByTime(int type) { | 
|         SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); | 
|         Calendar calendar = Calendar.getInstance(); | 
|         Date startTime = calendar.getTime(); | 
|         Date endTime = calendar.getTime(); | 
|         switch (type) { | 
|             // 本日 | 
|             case 1 : | 
|                 break; | 
|             // 昨日 | 
|             case 2: | 
|                 startTime = DateUtil.previousNDate(startTime, 1); | 
|                 endTime = startTime; | 
|                 break; | 
|             // 本月 | 
|             case 3: | 
|                 calendar.set(Calendar.DAY_OF_MONTH, 1); | 
|                 startTime = calendar.getTime(); | 
|                 break; | 
|             // 上月 | 
|             case 4: | 
|                 calendar.add(Calendar.MONTH, -1); | 
|                 calendar.set(Calendar.DAY_OF_MONTH, 1); | 
|                 startTime = calendar.getTime(); | 
|                 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); | 
|                 endTime = calendar.getTime(); | 
|                 break; | 
|             default: | 
|                 break; | 
|   | 
|         } | 
|   | 
|         return achieveNewDao.selectUserAchieveByTime(startTime, endTime, users.getSuId()); | 
|     } | 
|   | 
|     @Override | 
|     public List<AchieveNew> findOrderItemAchieve(Long orderId) { | 
|         return achieveNewDao.selectOrderItemAchieveByOrderId(orderId); | 
|     } | 
| } |