zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java
@@ -1,5 +1,7 @@
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;
@@ -7,20 +9,24 @@
import com.matrix.core.tools.ModelUtils;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.api.vo.UserAchieveVo;
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.AchieveNewDao;
import com.matrix.system.hive.dao.ShoppingGoodsDao;
import com.matrix.system.hive.dao.SysBeauticianStateDao;
import com.matrix.system.hive.dao.SysProjUseDao;
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.*;
/**
@@ -42,6 +48,9 @@
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    private SysProjServicesService projServicesService;
    @Override
    public int add(AchieveNew achieveNew) {
@@ -154,12 +163,18 @@
    @Override
    public void addAchieveByServiceOrder(SysProjServices projServices) {
    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);
        for (SysBeauticianState beauticianState : beauticianStateList) {
            // 是否第一次计算改美疗师
@@ -172,33 +187,61 @@
            achieveNew.setVipId(projServices.getVipId());
            // 是否为赠送业绩
            if (Dictionary.TAOCAN_SOURCE_ZS.equals(projUse.getSource())) {
                achieveNew.setFreeConsume(projUse.getPrice());
                achieveNew.setFreeConsume(projUse.getPrice()*beauticianState.getCount());
                //计算提成
                achieveNew.setProjPercentage(
                        calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_ZS,achieveNew.getFreeConsume(),beauticianState.getProjId()));
            } else {
                achieveNew.setHisConsume(projUse.getPrice());
                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());
            if (projServices.getCreateTime() != null) {
                achieveNew.setDatatime(projServices.getCreateTime());
            } else {
                achieveNew.setDatatime(new Date());
            }
            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());
            achieveNew.setNumberOfPeople(1D / size);
            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);
                }
//                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;
            }
            achieveNewList.add(achieveNew);
@@ -210,29 +253,64 @@
    }
    @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());
        }
    }
    @Override
    public void addAchaeveByOrder(SysOrder pageOrder) {
        List<AchieveNew> achieveNewList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(pageOrder.getItems())) {
            for (SysOrderItem orderItem : pageOrder.getItems()) {
                if (orderItem != null && CollectionUtils.isNotEmpty(orderItem.getAchaeveList())) {
                if (orderItem != null && CollectionUtils.isNotEmpty(orderItem.getAchieveList())) {
                    for (AchieveNew achieveNew : orderItem.getAchaeveList()) {
                        if (achieveNew !=null   && achieveNew.getT1()!=null) {
                    for (AchieveNew achieveNew : orderItem.getAchieveList()) {
                        if (achieveNew !=null   && achieveNew.getGoodsCash()!=null) {
                            buildAchieve(pageOrder,  orderItem, achieveNew);
                            // 新增美疗师业绩
                            achieveNewList.add(achieveNew);
                        }
                    }
                } else {
                    // 如果该订单明细没有设置美疗师则单独设置顾问业绩
                    AchieveNew achieveNew = new AchieveNew();
                    // 顾问业绩等于收款金额
                    achieveNew.setT1(orderItem.getPayMoney() + "");
                    buildAchieve(pageOrder, orderItem, achieveNew);
                    // 新增顾问业绩
                    achieveNewList.add(achieveNew);
                }
            }
        }
@@ -243,48 +321,49 @@
    @Autowired
    ShoppingGoodsDao shoppingGoodsDao;
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
    private void buildAchieve(SysOrder pageOrder, SysOrderItem orderItem, AchieveNew achieveNew) {
        achieveNew.setVipId(pageOrder.getVipId());
        achieveNew.setSaleId(pageOrder.getStaffId());
        BusParameterSettings shopManageJjcpasConsume =null;
        if (Dictionary.ORDER_STATU_TK.equals(pageOrder.getStatu())) {
            achieveNew.setId(null);
            achieveNew.setProjPercentage(0 - achieveNew.getProjPercentage());
            achieveNew.setGoodsCash(0 - achieveNew.getGoodsCash());
        }
        if (pageOrder.getOrderTime() != null) {
            achieveNew.setDatatime(pageOrder.getOrderTime());
        } else if (pageOrder.getOrderTime() != null) {
            achieveNew.setDatatime(pageOrder.getOrderTime());
        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());
        // 根据商品类型设置业绩类型
        String goodType = shoppingGoodsDao.selectById(orderItem.getGoodsId()).getGoodType();
        if (orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)
                && Dictionary.SHOPPING_GOODS_TYPE_XM.equals(goodType)) {
            // 现金支付设置现金单次
            achieveNew.setProjCash(Double.parseDouble(achieveNew.getT1()));
        } else if (orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)
                && Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(goodType)) {
            // 设置现金产品
            achieveNew.setGoodsCash(Double.parseDouble(achieveNew.getT1()));
        } else if (orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)
                && (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(goodType)
                || Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(goodType)
                || Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(goodType)
                || Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(goodType))) {
            // 设置卡项
            achieveNew.setCardCash(Double.parseDouble(achieveNew.getT1()));
        } else if (!orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_CARD)) {
            // 设置划扣金额
            achieveNew.setConsume(Double.parseDouble(achieveNew.getT1()));
        }
    }
    @Override
@@ -330,17 +409,17 @@
            // 本日
            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);
@@ -355,4 +434,9 @@
        return achieveNewDao.selectUserAchieveByTime(startTime, endTime, users.getSuId());
    }
    @Override
    public List<AchieveNew> findOrderItemAchieve(Long orderId) {
        return achieveNewDao.selectOrderItemAchieveByOrderId(orderId);
    }
}