Bläddra i källkod

转户逻辑修改

hcst_sunzhen 5 år sedan
förälder
incheckning
9878c7bf16

+ 10 - 8
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java

@@ -103,13 +103,15 @@ public class TestController {
             System.err.println(endDateStr);
 
 
-            List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(tokenQueryWrapper);
-            if (!Check.isNull(ctopOauthTokens)) {
-                for (CtopOauthToken token : ctopOauthTokens) {
-                    historyReportTaskService.createTask(token.getAccountId(), token.getAccessToken(), startDate, endDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_HISTORY);
-                }
-
-            }
+            //List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(tokenQueryWrapper);
+            //if (!Check.isNull(ctopOauthTokens)) {
+                //for (CtopOauthToken token : ctopOauthTokens) {
+                    //if ("3768019".equals(token.getAccountId())) {
+                        historyReportTaskService.createTask(3768019L, "0fb5f7dadd26b265979b1a8956950008", startDate, endDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_HISTORY);
+
+                    //}
+                //}
+            //}
         } catch (Exception e) {
             e.printStackTrace();
             result.setSuccess(false);
@@ -185,7 +187,7 @@ public class TestController {
                 @Override
                 public void run() {
                     kuaishouInterfaceService.getVideoList2(token, null, null, 1);
-                    kuaishouInterfaceService.getImageList2(token, null, null, 1);
+                    //kuaishouInterfaceService.getImageList2(token, null, null, 1);
                     //   kuaishouInterfaceService.getCreativeList2(token, null, null, 1);
                 }
             });

+ 0 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/PerformanceServiceImpl2.java

@@ -23,7 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.security.Signature;
 import java.text.ParseException;
 import java.util.*;
 

+ 26 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceOptimizerController.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
@@ -292,4 +293,29 @@ public class PerformanceOptimizerController {
         return performanceOptimizerService.getManagerPerformanceDetail(mediaType, orgCode);
     }
 
+
+    /**
+     * 计算运营绩效
+     */
+    @GetMapping(value = "/yunyingPerformance")
+    @ResponseBody
+    public void yunyingPerformance(@RequestParam(name = "year") Integer year,
+                                                           @RequestParam(name = "quarter") Integer quarter) {
+
+        Map<String,String> map = DateUtils.quarterStartEndDate(year, quarter);
+        performanceOptimizerService.toutiaoYunyingQuarterPerformance(year, quarter, map.get("startDate"), map.get("endDate"));
+    }
+
+    /**
+     * 计算运营绩效
+     */
+    @GetMapping(value = "/kuaishouYunyingLeaderQuarterPerformance")
+    @ResponseBody
+    public void kuaishouYunyingLeaderQuarterPerformance(@RequestParam(name = "year") Integer year,
+                                                  @RequestParam(name = "quarter") Integer quarter) {
+
+        Map<String,String> map = DateUtils.quarterStartEndDate(year, quarter);
+        performanceOptimizerService.kuaishouYunyingLeaderQuarterPerformance(year, quarter);
+    }
+
 }

+ 10 - 10
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/PerformanceMapper.xml

@@ -25,19 +25,20 @@
         LEFT JOIN
         sys_user sysUser ON sysUser.id = userRole.user_id
         WHERE
-        userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771'
+        <!-- userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771' -->
+        dailiAccount.stat_date &gt;= #{startDate}
+        AND
+        dailiAccount.stat_date &lt;= #{endDate}
         <if test="userId != null">
             and sysUser.id = #{userId}
         </if>
-        AND
-        dailiAccount.stat_date &gt;= #{startDate}
-        AND
-        dailiAccount.stat_date &lt; #{endDate}
         GROUP BY
         sysUser.id
         ORDER BY
         SUM(charge) DESC
+        <if test="startIndex != null and startIndex != '' and pageSize !=null and pageSize!=''">
         limit #{startIndex},#{pageSize}
+        </if>
     </select>
 
     <select id="getBytedanceOptimizerTotalCostDetailGroupByUserId" resultMap="OptimizerTotalCostDetail">
@@ -53,14 +54,13 @@
         LEFT JOIN
         sys_user sysUser ON sysUser.id = userRole.user_id
         WHERE
-        userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771'
-        <if test="userId != null">
-            and sysUser.id = #{userId}
-        </if>
-        AND
+        <!-- userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771' -->
         dailyAccount.stat_datetime &gt;= #{startDate}
         AND
         dailyAccount.stat_datetime &lt; #{endDate}
+        <if test="userId != null">
+            and sysUser.id = #{userId}
+        </if>
         GROUP BY
         sysUser.id
         ORDER BY

+ 6 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IPerformanceOptimizerService.java

@@ -19,4 +19,10 @@ public interface IPerformanceOptimizerService extends IService<PerformanceOptimi
     Map<String, Object> getRankingList(String mediaType, Integer pageNo, Integer pageSize, String orgCode);
 
     Map<String, Object> getManagerPerformanceDetail(String mediaType, String orgCode);
+
+    Map<String, Object> kuaishouYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate);
+
+    void kuaishouYunyingLeaderQuarterPerformance(Integer year, Integer quarter);
+
+    void toutiaoYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate);
 }

+ 346 - 12
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/PerformanceOptimizerServiceImpl.java

@@ -6,6 +6,7 @@ import cn.com.ctop.common.module.utils.StatusCode;
 import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
 import cn.com.ctop.performanceappraisal.entity.PerformanceConfig;
 import cn.com.ctop.performanceappraisal.entity.PerformanceOptimizer;
+import cn.com.ctop.performanceappraisal.mapper.PerformanceMapper;
 import cn.com.ctop.performanceappraisal.mapper.PerformanceOptimizerMapper;
 import cn.com.ctop.performanceappraisal.service.IOptimizerConfigService;
 import cn.com.ctop.performanceappraisal.service.IPerformanceConfigService;
@@ -13,18 +14,20 @@ import cn.com.ctop.performanceappraisal.service.IPerformanceOptimizerService;
 import cn.com.ctop.performanceappraisal.service.IPerformanceService;
 import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
 import cn.com.ctop.performanceappraisal.vo.UserPerformanceDetailVO;
+import cn.com.ctop.userefficientvideomap.entity.TransferorAccountDTO;
+import cn.com.ctop.userefficientvideomap.entity.UserDto2;
+import cn.com.ctop.userefficientvideomap.mapper.UserEfficientVideoMapMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 优化师绩效信息
@@ -34,11 +37,340 @@ import java.util.Map;
  * @date 2019-12-13
  */
 @Service
+@Slf4j
 public class PerformanceOptimizerServiceImpl extends ServiceImpl<PerformanceOptimizerMapper, PerformanceOptimizer> implements IPerformanceOptimizerService {
     @Autowired
     IPerformanceService performanceService;
     @Autowired
     private IOptimizerConfigService optimizerConfigService;
+    @Autowired
+    private UserEfficientVideoMapMapper userEfficientVideoMapMapper;
+    @Autowired
+    PerformanceMapper performanceMapper;
+    @Autowired
+    PerformanceOptimizerMapper performanceOptimizerMapper;
+
+
+    public void YunyingPerformance(Integer year, Integer quarter, String startDate, String endDate){
+        //Map<String,String> map = DateUtils.quarterStartEndDate(year, quarter);
+
+
+
+
+    }
+
+
+    //快手运营季度绩效计算
+    public Map<String, Object> kuaishouYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate){
+        Map<String, Object> result = new HashMap<>();
+        //获取快手所有运营的数据
+        List<UserDto2> userList = userEfficientVideoMapMapper.getAllKuaishouYunyingDepartUserInfo();
+        Integer mediaType = 2;
+        //循环所有快手运营
+        for(UserDto2 userDto:userList){
+            //userDto.setUserId("ce2cb485afd44d0e8563b4daa5ea6fcb");
+            //String orgCode = userEfficientVideoMapMapper.getDepartIdByUserId(userDto.getUserId());
+            //华北
+            //查询当前媒体配置信息
+            OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType(mediaType + "", CtopAdConstant.CTOP_ORGCODE_NORTH_CHINA_PREFIX);
+
+            if (null == config) {
+                ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_OPTINIZER_CONFIG_IS_NULL.getCode());
+                return result;
+            }
+            //:查询当前用户截止到目前当前季度的消耗统计数据
+            List<OptimizerCostDetailVO> vos = getOptimizerTotalCostDetailGroupByUserId(mediaType + "", userDto.getUserId(), year, quarter, startDate, endDate);
+            //if (null == vos || vos.size() <= 0) {
+            //    ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_OPTINIZER_PERSONNAL_DATA_IS_NULL.getCode());
+            //    return result;
+            //}
+            //2: 查询媒体季度任务完成情况
+            //UserPerformanceDetailVO performanceDetailVO = getPerformanceDetailVO(mediaType, vos.get(0), config);
+            //result.put("userDetail", performanceDetailVO);
+            //ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+
+            //获取消耗统计数据信息--该统计是按照user_allocation来统计的数据,不包含转户的情况
+            log.info(userDto.getUserId());
+            //增加转户的情况
+            //原则a:1. 该季度内最终转给此运营的户,将该户在本季度中不在的时间计算出来,然后计算这段时间内的总消耗,并在总数中减去
+            //2. 季度期间在过此运营负责过的户,将在本季度中在的时间计算出来,然后计算总消耗并在总数中增加上
+
+            //原则b:1.找出改运营手下所有账户,循环每一个账户,然后进行转户判断
+            //2.将该账户下所有转户信息拉取出来,去除受让时间小于季度开始时间 以及 转让时间大于季度结束时间的条目(sql去掉),得到该账户所有信息
+            //3. 创建userMap,根据userId获取自己季度内的各时间段
+            BigDecimal totalRoyal = BigDecimal.ZERO;
+            BigDecimal totalRoyalty = BigDecimal.ZERO;
+            BigDecimal totalCost = BigDecimal.ZERO;
+            if(vos.size() != 0){
+                OptimizerCostDetailVO vo = vos.get(0);
+                //循环accountId
+                List<String> accountList = userEfficientVideoMapMapper.getAccountIdByUserId(userDto.getUserId());
+                Map<String, List<Map<String, String>>> accountRangeMap = new HashMap<>();
+
+                for(int i=0; i<accountList.size();i++){
+                    List<TransferorAccountDTO> transferorAccountDTOList = userEfficientVideoMapMapper.accountTransforerListByUserId(accountList.get(i), startDate, endDate);
+
+                    if(transferorAccountDTOList.size() == 0){
+                        accountRangeMap.put(accountList.get(i),null);
+                        continue;
+                    }
+                    Map<String, String> DateMap = new HashMap<>();
+
+                    for(int j=0; j<transferorAccountDTOList.size(); j++){
+                        String transferor = transferorAccountDTOList.get(j).getTransferor();
+                        //String assignee = transferorAccountDTOList.get(j).getAssignee();
+                        //如果转让人不是本人,则跳过;按照转让人的逻辑走,因为受让人在下一次转户的时候也会变成转让人
+                        if( transferor.equals(userDto.getUserId()) ){
+                            if (j==0){
+                                DateMap.put("startDate", startDate);
+                            }else {
+                                DateMap.put("startDate", transferorAccountDTOList.get(j-1).getAssigneeDate());
+                            }
+                            DateMap.put("endDate",transferorAccountDTOList.get(j).getTransferorDate());
+                        }
+
+                        //判断:如果转让人不是本人,受让人也不是,则跳过
+                        if(DateMap.size() == 0 &&  j != (transferorAccountDTOList.size()-1)     ){   //!assignee.equals(userDto.getUserId())
+                            continue;
+                        }
+
+                        if (accountRangeMap.get(accountList.get(i)) != null){
+                            accountRangeMap.get(accountList.get(i)).add(DateMap);
+
+                            if(j == (transferorAccountDTOList.size()-1)){
+                                DateMap.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                                DateMap.put("endDate", endDate);
+                            }
+                        }else{
+                            List<Map<String, String>> userAccountList = new ArrayList<>();
+                            if(DateMap.size()!= 0 ){
+                                userAccountList.add(DateMap);
+                            }
+
+                            Map<String, String> DateMap2 = new HashMap<>();
+                            if(j == (transferorAccountDTOList.size()-1)){
+                                DateMap2.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                                DateMap2.put("endDate", endDate);
+                                userAccountList.add(DateMap2);
+                            }
+                            accountRangeMap.put(accountList.get(i), userAccountList);
+                        }
+                    }
+                }
+
+                for(Map.Entry<String, List<Map<String, String>>> entry : accountRangeMap.entrySet()){
+                    String mapKey = entry.getKey();
+                    List<Map<String, String>> mapValue = entry.getValue();
+                    if (mapValue == null){
+                        totalRoyal = totalRoyal.add( userEfficientVideoMapMapper.getAccountSumCharge(mapKey,startDate,endDate)==null?BigDecimal.ZERO: userEfficientVideoMapMapper.getAccountSumCharge(mapKey,startDate,endDate));
+                    }else{
+                        for (Map<String, String> map:mapValue){
+                            totalRoyal = totalRoyal.add( userEfficientVideoMapMapper.getAccountSumCharge(mapKey,map.get("startDate"),map.get("endDate"))==null?BigDecimal.ZERO: userEfficientVideoMapMapper.getAccountSumCharge(mapKey,startDate,endDate));
+                        }
+                    }
+                }
+
+                //BigDecimal totalCost = vo.getTotalCost();
+                totalCost = totalRoyal;//新增
+                //个人季度任务
+                BigDecimal personalTask = config.getPersonalTask();
+                //判断个人任务是否完成 ,如果完成则给到千分之5,如果未完成,则给到千分之3的绩效
+
+                if(!userDto.getRoleCode().equals("operationAssistant")){
+                    if (totalCost.compareTo(personalTask) > 0 ) {
+                        totalRoyalty = totalCost.multiply(config.getMediaTaskFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                    } else {
+                        totalRoyalty = totalCost.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                    }
+                }
+            }
+
+            //运营绩效数据入库
+            PerformanceOptimizer performanceOptimizer = new PerformanceOptimizer();
+            performanceOptimizer.setAppType(mediaType);
+            performanceOptimizer.setQuarter(quarter + "");
+            performanceOptimizer.setYear(year + "");
+            performanceOptimizer.setRealname(userDto.getRealname());
+            performanceOptimizer.setTotalCost(totalCost);
+            performanceOptimizer.setTotalRoyalty(totalRoyalty);
+            performanceOptimizer.setUserId(userDto.getUserId());
+            performanceOptimizerMapper.insert(performanceOptimizer);
+        }
+        return result;
+    }
+
+    //头条运营季度绩效计算
+    public void toutiaoYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate){
+        Map<String, Object> result = new HashMap<>();
+        //获取快手所有运营的数据
+        List<UserDto2> userList = userEfficientVideoMapMapper.getAllToutiaoYunyingDepartUserInfo();
+        Integer mediaType = 1;
+        //循环所有toutiao运营
+        for(UserDto2 userDto:userList){
+            //查询当前媒体配置信息
+            OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType(mediaType + "", CtopAdConstant.CTOP_ORGCODE_NORTH_CHINA_PREFIX);
+
+            if (null == config) {
+                ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_OPTINIZER_CONFIG_IS_NULL.getCode());
+                return ;
+            }
+
+            log.info(userDto.getUserId());
+            //增加转户的情况
+            //原则a:1. 该季度内最终转给此运营的户,将该户在本季度中不在的时间计算出来,然后计算这段时间内的总消耗,并在总数中减去
+            //2. 季度期间在过此运营负责过的户,将在本季度中在的时间计算出来,然后计算总消耗并在总数中增加上
+
+            //原则b:1.找出改运营手下所有账户,循环每一个账户,然后进行转户判断
+            //2.将该账户下所有转户信息拉取出来,去除受让时间小于季度开始时间 以及 转让时间大于季度结束时间的条目(sql去掉),得到该账户所有信息
+            //3. 创建userMap,根据userId获取自己季度内的各时间段
+            BigDecimal totalRoyal = BigDecimal.ZERO;
+            BigDecimal totalRoyalty = BigDecimal.ZERO;
+            BigDecimal totalCost = BigDecimal.ZERO;
+
+            //循环accountId
+            List<String> accountList = userEfficientVideoMapMapper.getAccountIdByUserId(userDto.getUserId());
+            Map<String, List<Map<String, String>>> accountRangeMap = new HashMap<>();
+            if(accountList.size()!=0){
+                for(int i=0; i<accountList.size();i++){
+                    List<TransferorAccountDTO> transferorAccountDTOList = userEfficientVideoMapMapper.accountTransforerListByUserId(accountList.get(i), startDate, endDate);
+
+                    if(transferorAccountDTOList.size() == 0){
+                        accountRangeMap.put(accountList.get(i),null);
+                        continue;
+                    }
+                    Map<String, String> DateMap = new HashMap<>();
+
+                    for(int j=0; j<transferorAccountDTOList.size(); j++){
+                        String transferor = transferorAccountDTOList.get(j).getTransferor();
+                        //如果转让人不是本人,则跳过;按照转让人的逻辑走,因为受让人在下一次转户的时候也会变成转让人
+                        if( transferor.equals(userDto.getUserId()) ){
+                            if (j==0){
+                                DateMap.put("startDate", startDate);
+                            }else {
+                                DateMap.put("startDate", transferorAccountDTOList.get(j-1).getAssigneeDate());
+                            }
+                            DateMap.put("endDate",transferorAccountDTOList.get(j).getTransferorDate());
+                        }
+
+                        //判断:如果转让人不是本人,受让人也不是,则跳过
+                        if(DateMap.size() == 0 &&  j != (transferorAccountDTOList.size()-1)     ){
+                            continue;
+                        }
+
+                        if (accountRangeMap.get(accountList.get(i)) != null){
+                            accountRangeMap.get(accountList.get(i)).add(DateMap);
+
+                            if(j == (transferorAccountDTOList.size()-1)){
+                                DateMap.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                                DateMap.put("endDate", endDate);
+                            }
+                        }else{
+                            List<Map<String, String>> userAccountList = new ArrayList<>();
+                            if(DateMap.size()!= 0 ){
+                                userAccountList.add(DateMap);
+                            }
+
+                            Map<String, String> DateMap2 = new HashMap<>();
+                            if(j == (transferorAccountDTOList.size()-1)){
+                                DateMap2.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                                DateMap2.put("endDate", endDate);
+                                userAccountList.add(DateMap2);
+                            }
+                            accountRangeMap.put(accountList.get(i), userAccountList);
+                        }
+                    }
+                }
+            }else{
+                continue;
+            }
+
+                for(Map.Entry<String, List<Map<String, String>>> entry : accountRangeMap.entrySet()){
+                    String mapKey = entry.getKey();
+                    List<Map<String, String>> mapValue = entry.getValue();
+                    if (mapValue == null){
+                        totalRoyal = totalRoyal.add( userEfficientVideoMapMapper.getToutiaoAccountSumCharge(mapKey,startDate,endDate)==null?BigDecimal.ZERO : userEfficientVideoMapMapper.getToutiaoAccountSumCharge(mapKey,startDate,endDate) );
+                    }else{
+                        for (Map<String, String> map:mapValue){
+                            totalRoyal = totalRoyal.add( userEfficientVideoMapMapper.getToutiaoAccountSumCharge(mapKey,map.get("startDate"),map.get("endDate"))==null?BigDecimal.ZERO: userEfficientVideoMapMapper.getToutiaoAccountSumCharge(mapKey,startDate,endDate));
+                        }
+                    }
+                }
+
+                totalCost = totalRoyal;//新增
+                //个人季度任务
+                BigDecimal personalTask = config.getPersonalTask();
+                //判断个人任务是否完成 ,如果完成则给到千分之5,如果未完成,则给到千分之3的绩效
+
+                if(!userDto.getRoleCode().equals("operationAssistant")){
+                    if (totalCost.compareTo(personalTask) > 0 ) {
+                        totalRoyalty = totalCost.multiply(config.getMediaTaskFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                    } else {
+                        totalRoyalty = totalCost.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                    }
+                }
+
+
+            //运营绩效数据入库
+            PerformanceOptimizer performanceOptimizer = new PerformanceOptimizer();
+            performanceOptimizer.setAppType(mediaType);
+            performanceOptimizer.setQuarter(quarter + "");
+            performanceOptimizer.setYear(year + "");
+            performanceOptimizer.setRealname(userDto.getRealname());
+            performanceOptimizer.setTotalCost(totalCost);
+            performanceOptimizer.setTotalRoyalty(totalRoyalty);
+            performanceOptimizer.setUserId(userDto.getUserId());
+            performanceOptimizerMapper.insert(performanceOptimizer);
+        }
+        return;
+    }
+
+    //快手运营leader绩效计算
+    public void kuaishouYunyingLeaderQuarterPerformance(Integer year, Integer quarter){
+        Integer mediaType = 2;
+        //获取快手组下所有运营组长信息列表
+        List<UserDto2> yunyingLeaderList = userEfficientVideoMapMapper.getKuaishouYunyingLeaderUserInfo();
+        for(UserDto2 userDto2:yunyingLeaderList){
+            BigDecimal royalty = BigDecimal.ZERO;
+            List<UserDto2> userList = userEfficientVideoMapMapper.getYunyingLeaderMember(userDto2.getDepId());
+
+            for (UserDto2 user:userList){
+                BigDecimal userRoality = userEfficientVideoMapMapper.getYunyingRoyalty(user.getUserId(), year, quarter);
+                if (userRoality == null){
+                    userRoality= BigDecimal.ZERO;
+                }
+                royalty =  royalty.add(userRoality);
+            }
+            //运营leader绩效数据入库
+            PerformanceOptimizer performanceOptimizer = new PerformanceOptimizer();
+            performanceOptimizer.setAppType(mediaType);
+            performanceOptimizer.setQuarter(quarter + "");
+            performanceOptimizer.setYear(year + "");
+            performanceOptimizer.setRealname(userDto2.getRealname());
+            performanceOptimizer.setTotalCost(royalty);
+            performanceOptimizer.setTotalRoyalty( royalty.multiply(new BigDecimal("0.2")) );
+            performanceOptimizer.setUserId(userDto2.getUserId());
+            performanceOptimizerMapper.insert(performanceOptimizer);
+        }
+    }
+
+    //TODO 头条运营leader绩效计算
+    public void toutiaoYunyingLeaderQuarterPerformance(){
+
+
+    }
+
+
+    private List<OptimizerCostDetailVO> getOptimizerTotalCostDetailGroupByUserId(String mediaType, String userId, Integer year, Integer quarter, String startDate, String endDate) {
+        if (null != mediaType && mediaType.equals(CtopAdConstant.PLATFORM_TYPE_KUAISHOU)) {
+            //快手
+            return performanceMapper.getKuaishouOptimizerTotalCostDetailGroupByUserId(startDate, endDate, year+"", quarter+"", userId, null, null);
+        } else {
+            //头条
+            return performanceMapper.getBytedanceOptimizerTotalCostDetailGroupByUserId(startDate, endDate, year+"", quarter+"", userId, null, null);
+        }
+    }
+
+
 
     @Override
     public Map<String, Object> getPerformanceDetail(String mediaType, Integer pageNo, Integer pageSize) {
@@ -205,6 +537,7 @@ public class PerformanceOptimizerServiceImpl extends ServiceImpl<PerformanceOpti
     private UserPerformanceDetailVO getPerformanceDetailVO(String appType, OptimizerCostDetailVO kuaishouCostVo, OptimizerConfig kuaishouConfig) {
         OptimizerCostDetailVO totalCostVo = performanceService.getOptimizerTotalCost(appType);
         UserPerformanceDetailVO performanceDetailVO = new UserPerformanceDetailVO();
+        //计算绩效
         kuaishouCostVo.setTotalRoyalty(getTotalRoyalty(kuaishouConfig, kuaishouCostVo, totalCostVo));
         performanceDetailVO.setRealName(kuaishouCostVo.getRealName());
         performanceDetailVO.setTotalPersonalCost(kuaishouCostVo.getTotalCost());
@@ -275,16 +608,17 @@ public class PerformanceOptimizerServiceImpl extends ServiceImpl<PerformanceOpti
         //个人季度任务
         BigDecimal personalTask = config.getPersonalTask();
         //媒体季度任务
-        BigDecimal mediaTask = config.getMediaTask();
+        //BigDecimal mediaTask = config.getMediaTask();
         //个人任务未完成
-        if (totalCost.compareTo(personalTask) < 0) {
-            return royalty;
-        }
-        //季度任务未完成
-        if (quarterCost.getTotalCost().compareTo(mediaTask) < 0) {
-            return totalCost.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
-        }
+        //if (totalCost.compareTo(personalTask) < 0) {
+        //    return royalty;
+        //}
+        //季度任务不在普通运营的业务范围内
+        //if (quarterCost.getTotalCost().compareTo(mediaTask) < 0) {
+        //    return totalCost.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+        //}
         PerformanceConfig performanceConfig = performanceConfigService.getNowConfig();
+        //判断个人任务是否完成 ,如果完成则给到千分之5,如果未完成,则给到千分之3的绩效
         if (null != performanceConfig && performanceConfig.getMediaTaskRaise() == 1) {
             return totalCost.multiply(config.getMediaTaskFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
         } else {

+ 34 - 0
performance-appraisal/src/main/java/cn/com/ctop/userefficientvideomap/entity/TransferorAccountDTO.java

@@ -0,0 +1,34 @@
+package cn.com.ctop.userefficientvideomap.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class TransferorAccountDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long accountId;
+
+    private Long projectId;
+
+    private String transferor;
+
+    private String assignee;
+
+    private String transferorDate;
+
+    private String assigneeDate;
+
+    private String auditor;
+
+    private Integer status;
+
+    private String remarks;
+
+
+}

+ 21 - 0
performance-appraisal/src/main/java/cn/com/ctop/userefficientvideomap/mapper/UserEfficientVideoMapMapper.java

@@ -126,8 +126,12 @@ public interface UserEfficientVideoMapMapper extends BaseMapper<UserEfficientVid
 
     List<UserDto2> getKuaishouYunyingDepartUserInfo();
 
+    List<UserDto2> getAllKuaishouYunyingDepartUserInfo();
+
     List<UserDto2> getToutiaoYunyingDepartUserInfo();
 
+    List<UserDto2> getAllToutiaoYunyingDepartUserInfo();
+
     //获取快手单个优化师当前账户下的总消耗
     BigDecimal getKuaishouYunyingTotalCost(@Param("userId") String userId, @Param("appType") Integer appType, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
@@ -183,5 +187,22 @@ public interface UserEfficientVideoMapMapper extends BaseMapper<UserEfficientVid
     Integer toutiaoCreativeLtCount(@Param("signature")String signature, @Param("date")String date);
 
     String toutiaoCreativeEarlistDate(@Param("signature")String singature);
+
+    List<String> getAccountIdByUserId(@Param("userId")String userId);
+
+    List<TransferorAccountDTO> accountTransforerListByUserId(@Param("accountId")String accountId, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    BigDecimal getAccountSumCharge(@Param("accountId")String accountId, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    BigDecimal getToutiaoAccountSumCharge(@Param("accountId")String accountId, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    List<UserDto2> getKuaishouYunyingLeaderUserInfo();
+
+    List<UserDto2> getToutiaoYunyingLeaderUserInfo();
+
+    List<UserDto2> getYunyingLeaderMember(@Param("depId")String depId);
+
+    BigDecimal getYunyingRoyalty(@Param("userId")String userId, @Param("year")Integer year, @Param("quarter")Integer quarter);
+
 }
 

+ 145 - 0
performance-appraisal/src/main/java/cn/com/ctop/userefficientvideomap/mapper/xml/UserEfficientVideoMapMapper.xml

@@ -856,6 +856,22 @@
         left join sys_user_role ur on u.id = ur.user_id
         left join sys_role r on ur.role_id = r.id
         WHERE b.parent_id = '024b0dc0840045afb048022a8c61253f'  <!-- 快手运营部 -->
+        and r.role_code = 'operator'
+    </select>
+
+    <!-- 获取北京快手运营部所有人的信息 -->
+    <select id="getAllKuaishouYunyingDepartUserInfo" resultType="cn.com.ctop.userefficientvideomap.entity.UserDto2">
+        select u.id as userId,
+        u.realname as realname,
+        r.role_name as roleName,
+        r.role_code as roleCode,
+        r.id as roleId
+        FROM sys_user_depart ud
+        left join sys_depart b on ud.dep_id = b.id
+        left join sys_user u on ud.user_id = u.id
+        left join sys_user_role ur on u.id = ur.user_id
+        left join sys_role r on ur.role_id = r.id
+        WHERE b.parent_id = '024b0dc0840045afb048022a8c61253f'  <!-- 快手运营部 -->
     </select>
 
     <!-- 获取北京头条运营部所有优化师得信息 -->
@@ -871,6 +887,22 @@
         left join sys_user_role ur on u.id = ur.user_id
         left join sys_role r on ur.role_id = r.id
         WHERE b.parent_id = 'c869de6bedc44a50803e45a4611df05e'  <!-- 头条运营部 -->
+        and r.role_code = 'operator'
+    </select>
+
+    <!-- 获取北京头条运营部所有优化师得信息 -->
+    <select id="getAllToutiaoYunyingDepartUserInfo" resultType="cn.com.ctop.userefficientvideomap.entity.UserDto2">
+        select u.id as userId,
+        u.realname as realname,
+        r.role_name as roleName,
+        r.role_code as roleCode,
+        r.id as roleId
+        FROM sys_user_depart ud
+        left join sys_depart b on ud.dep_id = b.id
+        left join sys_user u on ud.user_id = u.id
+        left join sys_user_role ur on u.id = ur.user_id
+        left join sys_role r on ur.role_id = r.id
+        WHERE b.parent_id = 'c869de6bedc44a50803e45a4611df05e'  <!-- 头条运营部 -->
     </select>
 
     <!-- 获取快手单个优化师当前账户下的总消耗 -->
@@ -1255,4 +1287,117 @@
         m.app_type = #{appType}
     </select>
 
+    <select id="getAccountIdByUserId" resultType="string">
+        select
+        account_id
+        from
+        ctop_user_allocation
+        where
+        user_id = #{userId}
+    </select>
+
+    <select id="accountTransforerListByUserId" resultType="cn.com.ctop.userefficientvideomap.entity.TransferorAccountDTO">
+            select
+            account_id as accountId,
+            project_id as projectId,
+            transferor,
+            assignee,
+            transferor_date as transferorDate,
+            assignee_date as assigneeDate
+        from ctop_transfer_account
+        where
+        account_id = #{accountId}
+        and assignee_date &gt;= #{startDate}
+        and transferor_date &lt;= #{endDate}
+        order by transferor_date asc
+    </select>
+
+    <select id="getAccountSumCharge" resultType="java.math.BigDecimal">
+        select
+        sum(charge)
+        from
+        ctop_kuaishou_report_daily_account
+        where
+        account_id = #{accountId}
+        and
+        stat_date &lt;= #{endDate}
+        and
+        stat_date &gt;= #{startDate}
+    </select>
+
+    <select id="getToutiaoAccountSumCharge" resultType="java.math.BigDecimal">
+        select
+        sum(cost)
+        from
+        ctop_bytedance_report_advertiser_daily
+        where
+        advertiser_id = #{accountId}
+        and
+        date_format(stat_datetime, '%Y-%m-%d') &lt;= #{endDate}
+        and
+        date_format(stat_datetime, '%Y-%m-%d') &gt;= #{startDate}
+    </select>
+
+    <!-- 获取北京快手运营部所有运营经理的信息 -->
+    <select id="getKuaishouYunyingLeaderUserInfo" resultType="cn.com.ctop.userefficientvideomap.entity.UserDto2">
+        select u.id as userId,
+        u.realname as realname,
+        r.role_name as roleName,
+        r.role_code as roleCode,
+        r.id as roleId,
+        ud.dep_id as depId
+        FROM sys_user_depart ud
+        left join sys_depart b on ud.dep_id = b.id
+        left join sys_user u on ud.user_id = u.id
+        left join sys_user_role ur on u.id = ur.user_id
+        left join sys_role r on ur.role_id = r.id
+        WHERE b.parent_id = '024b0dc0840045afb048022a8c61253f'  <!-- 快手运营部 -->
+        and r.role_code = 'kuaishouOperationManager'
+    </select>
+
+    <!-- 获取北京头条运营部所有优化师得信息 -->
+    <select id="getToutiaoYunyingLeaderUserInfo" resultType="cn.com.ctop.userefficientvideomap.entity.UserDto2">
+        select u.id as userId,
+        u.realname as realname,
+        r.role_name as roleName,
+        r.role_code as roleCode,
+        r.id as roleId,
+        ud.dep_id as depId
+        FROM sys_user_depart ud
+        left join sys_depart b on ud.dep_id = b.id
+        left join sys_user u on ud.user_id = u.id
+        left join sys_user_role ur on u.id = ur.user_id
+        left join sys_role r on ur.role_id = r.id
+        WHERE b.parent_id = 'c869de6bedc44a50803e45a4611df05e'  <!-- 头条运营部 -->
+        and r.role_code = 'toutiaoOperationManager'
+    </select>
+
+    <!-- 获取运营组下所有运营 -->
+    <select id="getYunyingLeaderMember" resultType="cn.com.ctop.userefficientvideomap.entity.UserDto2">
+        select u.id as userId,
+        u.realname as realname,
+        r.role_name as roleName,
+        r.role_code as roleCode,
+        r.id as roleId,
+        ud.dep_id as depId
+        FROM sys_user_depart ud
+        left join sys_depart b on ud.dep_id = b.id
+        left join sys_user u on ud.user_id = u.id
+        left join sys_user_role ur on u.id = ur.user_id
+        left join sys_role r on ur.role_id = r.id
+        WHERE b.id = #{depId}
+        and r.role_code = 'operator'
+    </select>
+
+    <!-- 获取运营绩效 -->
+    <select id="getYunyingRoyalty" resultType="java.math.BigDecimal">
+        select
+        total_royalty
+        from
+        ctop_performance_optimizer
+        where user_id = #{userId}
+        and year = #{year}
+        and quarter = #{quarter}
+    </select>
+
 </mapper>