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.hive.vo.DailyBeautyListVo; 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 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 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 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 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 findInPage(AchieveNew achieveNew, PaginationVO pageVo) { return achieveNewDao.selectInPage(achieveNew, pageVo); } @Override public List 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 achieveNewList = new ArrayList<>(); List beauticianStateList = sysBeauticianStateDao.selectBySerIds(projServices.getId()); int size = beauticianStateList.size(); Long achieveId = projServices.getCreateStaffId(); // 下单人是否计算消耗业绩 boolean flag = projServicesService.skipServiceOrderStep(Dictionary.SALE_MAN_IS_CONSUME_ACHIEVE); Set 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 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 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 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 beautyIds, Long vipId) { for (Long userId : beautyIds) { double num; List achieveNewList = achieveNewDao.selectBeautyManAchieveList(userId, vipId, new Date()); if (CollUtil.isEmpty(achieveNewList)) { num = 1D; } else { num = 1D / achieveNewList.size(); } if (CollUtil.isNotEmpty(achieveNewList)) { achieveNewDao.updateAchieveNumOfPeople(achieveNewList, num); } } } @Override public void addAchaeveByOrder(SysOrder pageOrder) { List achieveNewList = new ArrayList<>(); Set 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 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 findSumDailyInfoNew(AchieveNew achieveNew, PaginationVO pageVo) { return achieveNewDao.findSumDailyInfoNew(achieveNew, pageVo); } @Override public void modifyAchieveTime(AchieveNew achieveNew) { achieveNewDao.updateAchieveTime(achieveNew); } @Override public List> 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 findOrderItemAchieve(Long orderId) { return achieveNewDao.selectOrderItemAchieveByOrderId(orderId); } @Override public List findDailyBeautyList(AchieveNew achieveNew, PaginationVO pageVo) { List list = achieveNewDao.selectDailyBeautyList(achieveNew, pageVo); if (CollUtil.isNotEmpty(list)) { for (DailyBeautyListVo item : list) { String pl = achieveNewDao.selectPlInfoByVipIdAndDate(item.getDatatime(), item.getVipId()); item.setProjInfo(pl); } } return list; } @Override public int findDailyBeautyListTotal(AchieveNew achieveNew) { return achieveNewDao.selectDailyBeautyListTotal(achieveNew); } }