浏览代码

Merge remote-tracking branch 'origin/test' into test

xuzuoyun 5 年之前
父节点
当前提交
6cd0656748
共有 54 个文件被更改,包括 2682 次插入181 次删除
  1. 24 10
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java
  2. 7 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  3. 33 28
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CallbackController.java
  4. 40 20
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectController.java
  5. 2 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java
  6. 9 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/Project.java
  7. 4 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ProjectMember.java
  8. 4 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/performanceappraisal/aa.java
  9. 181 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/performanceappraisal/controller/OptimizerRoleInfoController.java
  10. 2 2
      jeecg-boot-module-system/src/main/resources/jeecg/jeecg_database.properties
  11. 23 2
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  12. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/BindAccountAuthServiceImpl.java
  13. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/StatusCode.java
  14. 40 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/BatchController.java
  15. 248 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouGroupTargetController.java
  16. 10 6
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroup.java
  17. 203 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroupTarget.java
  18. 19 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupTargetMapper.java
  19. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouAppInfoMapper.xml
  20. 16 5
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml
  21. 67 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupTargetMapper.xml
  22. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouRegionListChildrenMapper.xml
  23. 15 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouGroupTargetService.java
  24. 19 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupTargetServiceImpl.java
  25. 99 13
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  26. 1 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  27. 1 1
      module-toutiao/src/main/resources/bytedance_config.properties
  28. 248 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/OptimizerConfigController.java
  29. 9 80
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceController.java
  30. 278 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceOptimizerController.java
  31. 81 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/OptimizerConfig.java
  32. 81 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/OptimizerRoleInfo.java
  33. 102 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/PerformanceOptimizer.java
  34. 6 2
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/RolePerformancRraise.java
  35. 4 3
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/RolePerformanceCommission.java
  36. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/OptimizerConfigMapper.java
  37. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/OptimizerRoleInfoMapper.java
  38. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/PerformanceMapper.java
  39. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/PerformanceOptimizerMapper.java
  40. 5 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/OptimizerConfigMapper.xml
  41. 5 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/OptimizerRoleInfoMapper.xml
  42. 175 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/PerformanceMapper.xml
  43. 5 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/PerformanceOptimizerMapper.xml
  44. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IOptimizerConfigService.java
  45. 18 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IOptimizerRoleInfoService.java
  46. 22 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IPerformanceOptimizerService.java
  47. 21 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IPerformanceService.java
  48. 26 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/OptimizerConfigServiceImpl.java
  49. 50 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/OptimizerRoleInfoServiceImpl.java
  50. 157 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/PerformanceOptimizerServiceImpl.java
  51. 158 1
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/PerformanceServiceImpl.java
  52. 25 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/vo/DesignerCostDetailVO.java
  53. 47 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/vo/OptimizerCostDetailVO.java
  54. 12 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/vo/OptimizerVO.java

+ 24 - 10
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -534,11 +534,6 @@ public class DateUtils extends PropertyEditorSupport {
         return 0;
     }
 
-
-    public static void main(String[] args) throws ParseException {
-        getStartEndTime("2019-11-25 00:00:00");
-    }
-
     public static Map<String, Object> getStartEndTime(String createTime) throws ParseException {
 
         SimpleDateFormat smf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -558,7 +553,29 @@ public class DateUtils extends PropertyEditorSupport {
         return map;
     }
 
+    public static String getQuarterStartDate(Date date) {
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        Integer month = calendar.get(Calendar.MONTH);
+        Integer compare = month % 3;
+        calendar.add(Calendar.MONTH, -compare);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        Date getDate = calendar.getTime();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        return dateFormat.format(getDate);
+    }
 
+    public static String getQuarterEndDate(Date date) {
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        Integer month = calendar.get(Calendar.MONTH);
+        Integer compare = month % 3;
+        calendar.add(Calendar.MONTH, (3 - compare));
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        Date getDate = calendar.getTime();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        return dateFormat.format(getDate);
+    }
     /**
      * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd
      * HH:mm:ss“ * @param text String类型的时间值
@@ -586,9 +603,9 @@ public class DateUtils extends PropertyEditorSupport {
         }
     }
 
-    public static int getYear() {
+    public static int getYear(Date date) {
         GregorianCalendar calendar = new GregorianCalendar();
-        calendar.setTime(getDate());
+        calendar.setTime(date);
         return calendar.get(Calendar.YEAR);
     }
 
@@ -864,11 +881,9 @@ public class DateUtils extends PropertyEditorSupport {
      * @throws ParseException
      */
     public static String getMonth(String format, String date) throws ParseException {
-
         SimpleDateFormat df = new SimpleDateFormat(format);
         Date parse = df.parse(date);
         return String.format("%tm", parse);
-
     }
 
     /**
@@ -884,7 +899,6 @@ public class DateUtils extends PropertyEditorSupport {
         SimpleDateFormat df = new SimpleDateFormat(format);
         Date parse = df.parse(date);
         return String.format("%td", parse);
-
     }
 
     /**

+ 7 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -75,6 +75,13 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/template/creative/words/get", "anon");
         filterChainDefinitionMap.put("/appium/crawler/startJob", "anon");
 
+		//优化师相关
+		filterChainDefinitionMap.put("/ctop/performanceOptimizer/detail", "anon");
+		filterChainDefinitionMap.put("/ctop/performanceOptimizer/ranking/list", "anon");
+		filterChainDefinitionMap.put("/ctop/performance/project/list", "anon");
+		filterChainDefinitionMap.put("/ctop/performance/account/list", "anon");
+
+
         filterChainDefinitionMap.put("/generic/**", "anon");
 		filterChainDefinitionMap.put("/", "anon");
 		filterChainDefinitionMap.put("/doc.html", "anon");

+ 33 - 28
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CallbackController.java

@@ -9,7 +9,6 @@ import cn.com.ctop.common.module.utils.*;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouAccessToken;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResultToken;
-import cn.com.ctop.toutiao.entity.ByteDanceAdvertiser;
 import cn.com.ctop.toutiao.service.IByteDanceAdvertiserDataService;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -141,15 +140,8 @@ public class CallbackController {
                     if (Check.isNull(accountId)) {
                         return "授权绑定失败!";
                     }
-                    QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
-                    userAllocationQueryWrapper.eq("account_id", accountId);
-                    userAllocationQueryWrapper.eq("media_id", 2);
-                    userAllocationQueryWrapper.orderByDesc("create_time");
-                    userAllocationQueryWrapper.last("limit 1");
-                    UserAllocation checkUserAllocation = allocationMapper.selectOne(userAllocationQueryWrapper);
-                    if (!Check.isNull(checkUserAllocation)) {
-                        return "授权失败,该账号已被:" + checkUserAllocation.getAuthName() + "绑定!";
-                    }
+
+
                     String advertiserId = json.getString("advertiserId");
                     //指定分配人姓名
                     String userName = json.getString("userName");
@@ -160,6 +152,34 @@ public class CallbackController {
                     //创建人
                     String userId = json.getString("userId");
                     Long projectId = json.getLong("projectId");
+
+                    CtopOauthToken topOauthToken = new CtopOauthToken();
+                    topOauthToken.setId(accountId + "");
+                    topOauthToken.setAccountId(accountId);
+                    topOauthToken.setMediaId("2");
+                    topOauthToken.setAdvertiserId(advertiserId);
+                    topOauthToken.setAccessToken(token.getAccessToken());
+                    long accessTokenExpireIn = token.getAccessTokenExpiresIn() * 1000L;
+                    long now = System.currentTimeMillis();
+                    Date accessTokenExpireInDate = new Date(now + accessTokenExpireIn);
+                    topOauthToken.setAccessTokenExpiresIn(accessTokenExpireInDate);
+                    topOauthToken.setRefreshToken(token.getRefreshToken());
+                    long refreshTokenExpireIn = token.getRefreshTokenExpiresIn() * 1000L;
+                    Date refreshTokenExpireInDate = new Date(now + refreshTokenExpireIn);
+                    topOauthToken.setRefreshTokenExpiresIn(refreshTokenExpireInDate);
+                    topOauthToken.setUpdateTime(new Date());
+                    ctopOauthTokenService.saveOrUpdate(topOauthToken);
+
+
+                    QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
+                    userAllocationQueryWrapper.eq("account_id", accountId);
+                    userAllocationQueryWrapper.eq("media_id", 2);
+                    userAllocationQueryWrapper.orderByDesc("create_time");
+                    userAllocationQueryWrapper.last("limit 1");
+                    UserAllocation checkUserAllocation = allocationMapper.selectOne(userAllocationQueryWrapper);
+                    if (!Check.isNull(checkUserAllocation)) {
+                        return "授权失败,该账号已被:" + checkUserAllocation.getUserName() + " 绑定!";
+                    }
                     String projectName = json.getString("projectName");
                     UserAllocation userAllocation = new UserAllocation();
                     userAllocation.setUserName(userName);
@@ -186,22 +206,7 @@ public class CallbackController {
                     if (i > 0) {
                         logger.info("同步分配用户表完成,task_id:{},accountId:{}", state, accountId);
                     }
-                    CtopOauthToken topOauthToken = new CtopOauthToken();
-                    topOauthToken.setId(accountId + "");
-                    topOauthToken.setAccountId(accountId);
-                    topOauthToken.setMediaId("2");
-                    topOauthToken.setAdvertiserId(advertiserId);
-                    topOauthToken.setAccessToken(token.getAccessToken());
-                    long accessTokenExpireIn = token.getAccessTokenExpiresIn() * 1000L;
-                    long now = System.currentTimeMillis();
-                    Date accessTokenExpireInDate = new Date(now + accessTokenExpireIn);
-                    topOauthToken.setAccessTokenExpiresIn(accessTokenExpireInDate);
-                    topOauthToken.setRefreshToken(token.getRefreshToken());
-                    long refreshTokenExpireIn = token.getRefreshTokenExpiresIn() * 1000L;
-                    Date refreshTokenExpireInDate = new Date(now + refreshTokenExpireIn);
-                    topOauthToken.setRefreshTokenExpiresIn(refreshTokenExpireInDate);
-                    topOauthToken.setUpdateTime(new Date());
-                    ctopOauthTokenService.saveOrUpdate(topOauthToken);
+
                     //账号绑定
                     bindAccountAuthService.addBindAccount(accountId, KuaishouInterfaceConstant.LOGIN_TYPE_KUAISHOU, advertiserId);
                     Thread t = new Thread() {
@@ -287,7 +292,7 @@ public class CallbackController {
                 logger.info("获取广告主信息失败,accountId:{},message:{}", token.getAccountId(), (String) advertiserDataMap.get("message"));
                 throw new Exception("获取广告主信息失败");
             }
-            ByteDanceAdvertiser advertiserData = (ByteDanceAdvertiser) advertiserDataMap.get("data");
+
             Long accountId = token.getAccountId();
             QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
             userAllocationQueryWrapper.eq("account_id", accountId);
@@ -308,7 +313,7 @@ public class CallbackController {
             userAllocation.setMediaId(mediaId);
             userAllocation.setProjectId(projectId);
             userAllocation.setProjectName(projectName);
-            userAllocation.setAuthName(advertiserData.getName());
+            userAllocation.setAuthName((String) advertiserDataMap.get("name"));
             userAllocation.setAdvertiserId(advertiserId);
             userAllocation.setCreateTime(new Date());
             userAllocation.setUpdateTime(new Date());

+ 40 - 20
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectController.java

@@ -87,19 +87,20 @@ public class ProjectController {
     @GetMapping(value = "/responsibleList")
     public Map<String, Object> responsibleList(String userId) {
         Map<String, Object> map = new HashMap<>();
-
         String roleCode = materialReportMapper.getRoleCodeByUserId(userId);
         QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
         if (!"admin".equals(roleCode)) {
-            queryWrapper.eq("responsible_id", userId);
-            queryWrapper.orderByDesc("create_time");
+            if ("designTeamLeader".equals(roleCode)) {
+                queryWrapper.eq("design_responsible_id", userId);
+            } else {
+                queryWrapper.eq("responsible_id", userId);
+            }
         }
+        queryWrapper.orderByDesc("create_time");
         List<Project> projects = projectMapper.selectList(queryWrapper);
         map.put("success", true);
         map.put("code", 0);
         map.put("result", projects);
-
-
         return map;
     }
 
@@ -158,31 +159,50 @@ public class ProjectController {
         try {
             String advertiserId = project.getAdvertiserId();
             Advertiser advertiser = advertiserService.getById(advertiserId);
+            Map<String, String> memberMap = new HashMap<>();
             if (!Check.isNull(advertiser)) {
                 project.setCompanyId(advertiser.getCompanyId());
+
             }
             SysUser sysUser = sysUserService.getById(project.getResponsibleId());
             if (!Check.isNull(sysUser)) {
                 project.setResponsibleName(sysUser.getRealname());
+                memberMap.put(sysUser.getId(), sysUser.getRealname());
+            }
+
+
+            SysUser designSysUser = sysUserService.getById(project.getDesignResponsibleId());
+            if (!Check.isNull(designSysUser)) {
+                project.setDesignResponsibleName(designSysUser.getRealname());
+                memberMap.put(designSysUser.getId(), designSysUser.getRealname());
             }
+
             projectService.save(project);
+
+
             Long id = project.getId();
-            Map<String, Object> map = new HashMap<>();
-            map.put("project_id", id);
-            map.put("user_id", project.getResponsibleId());
-            projectMemberService.removeByMap(map);
-            ProjectMember member = new ProjectMember();
-            member.setProjectId(id);
-            member.setProjectName(project.getProjectName());
-            member.setUserId(project.getResponsibleId());
-            if (!Check.isNull(sysUser)) {
-                member.setUserName(sysUser.getRealname());
-            }
-            String roleCode = materialReportMapper.getRoleCodeByUserId(project.getUserId());
-            if (!Check.isNull(roleCode)) {
-                member.setRoleCode(roleCode);
+            for (Map.Entry<String, String> projectMember : memberMap.entrySet()) {
+
+                String userId = projectMember.getKey();
+                String userName = projectMember.getValue();
+
+                Map<String, Object> map = new HashMap<>();
+                map.put("project_id", id);
+                map.put("user_id", userId);
+                projectMemberService.removeByMap(map);
+                ProjectMember member = new ProjectMember();
+                member.setProjectId(id);
+                member.setProjectName(project.getProjectName());
+                member.setUserId(userId);
+                member.setUserName(userName);
+                String roleCode = materialReportMapper.getRoleCodeByUserId(userId);
+                if (!Check.isNull(roleCode)) {
+                    member.setRoleCode(roleCode);
+                }
+                projectMemberService.save(member);
             }
-            projectMemberService.save(member);
+
+
             result.success("添加成功!");
         } catch (Exception e) {
             e.printStackTrace();

+ 2 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java

@@ -65,7 +65,7 @@ public class ProjectMemberController {
 
 
     /**
-     * 我参与项目
+     * 查看项目成员
      *
      * @param projectId
      * @return
@@ -119,6 +119,7 @@ public class ProjectMemberController {
                     Project project = projectService.getById(projectMember.getProjectId());
                     if (!Check.isNull(project)) {
                         projectMember.setResponsibleName(project.getResponsibleName());
+                        projectMember.setDesignResponsibleName(project.getDesignResponsibleName());
                         projectMember.setAdvertiserName(project.getAdvertiserName());
                         projectMember.setAdvertiserId(project.getAdvertiserId());
                         projectMember.setMediaId(project.getMediaId());

+ 9 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/Project.java

@@ -68,6 +68,15 @@ public class Project {
     @ApiModelProperty(value = "负责人名称")
     private String responsibleName;
 
+    @Excel(name = "设计负责人", width = 15)
+    @ApiModelProperty(value = "设计负责人")
+    private String designResponsibleId;
+
+    @Excel(name = "设计负责人名称", width = 15)
+    @ApiModelProperty(value = "设计负责人名称")
+    private String designResponsibleName;
+
+
     @Excel(name = "公司id", width = 15)
     @ApiModelProperty(value = "公司id")
     private String companyId;

+ 4 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ProjectMember.java

@@ -66,6 +66,10 @@ public class ProjectMember {
     @TableField(exist = false)
     private String responsibleName;
 
+
+    @TableField(exist = false)
+    private String designResponsibleName;
+
     @TableField(exist = false)
     private String advertiserName;
     @TableField(exist = false)

+ 4 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/performanceappraisal/aa.java

@@ -0,0 +1,4 @@
+package org.jeecg.modules.performanceappraisal;
+
+public class aa {
+}

+ 181 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/performanceappraisal/controller/OptimizerRoleInfoController.java

@@ -0,0 +1,181 @@
+package org.jeecg.modules.performanceappraisal.controller;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerRoleInfo;
+import cn.com.ctop.performanceappraisal.service.IOptimizerRoleInfoService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * 优化师角色关系表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+@Slf4j
+@Api(tags = "优化师角色关系表")
+@RestController
+@RequestMapping("/ctop/optimizerRoleInfo")
+public class OptimizerRoleInfoController {
+    @Autowired
+    private IOptimizerRoleInfoService optimizerRoleInfoService;
+    @Autowired
+    private ISysUserService sysUserService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param optimizerRoleInfo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "优化师角色关系表-分页列表查询")
+    @ApiOperation(value = "优化师角色关系表-分页列表查询", notes = "优化师角色关系表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<OptimizerRoleInfo>> queryPageList(OptimizerRoleInfo optimizerRoleInfo,
+                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                          HttpServletRequest req) {
+        Result<IPage<OptimizerRoleInfo>> result = new Result<>();
+        optimizerRoleInfo.setType(1);
+        QueryWrapper<OptimizerRoleInfo> queryWrapper = QueryGenerator.initQueryWrapper(optimizerRoleInfo, req.getParameterMap());
+        Page<OptimizerRoleInfo> page = new Page<>(pageNo, pageSize);
+        IPage<OptimizerRoleInfo> pageList = optimizerRoleInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+
+    @AutoLog(value = "优化师角色关系表-添加")
+    @ApiOperation(value = "优化师角色关系表-添加", notes = "优化师角色关系表-添加")
+    @PostMapping(value = "/add")
+    public Result<OptimizerRoleInfo> add(String belongerId, String userId, String orgCode) {
+        Result<OptimizerRoleInfo> result = new Result<OptimizerRoleInfo>();
+        try {
+            SysUser user = sysUserService.getById(userId);
+            OptimizerRoleInfo roleInfo = new OptimizerRoleInfo();
+            roleInfo.setType(2);
+            roleInfo.setBelongerId(belongerId);
+            roleInfo.setUserId(userId);
+            roleInfo.setRealname(user.getRealname());
+            roleInfo.setOrgCode(orgCode);
+            roleInfo.setEnabled(1);
+            optimizerRoleInfoService.save(roleInfo);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param optimizerRoleInfo
+     * @return
+     */
+    @AutoLog(value = "优化师角色关系表-编辑")
+    @ApiOperation(value = "优化师角色关系表-编辑", notes = "优化师角色关系表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<OptimizerRoleInfo> edit(@RequestBody OptimizerRoleInfo optimizerRoleInfo) {
+        Result<OptimizerRoleInfo> result = new Result<OptimizerRoleInfo>();
+        OptimizerRoleInfo optimizerRoleInfoEntity = optimizerRoleInfoService.getById(optimizerRoleInfo.getId());
+        if (optimizerRoleInfoEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = optimizerRoleInfoService.updateById(optimizerRoleInfo);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "优化师角色关系表-通过id删除")
+    @ApiOperation(value = "优化师角色关系表-通过id删除", notes = "优化师角色关系表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            optimizerRoleInfoService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "优化师角色关系表-批量删除")
+    @ApiOperation(value = "优化师角色关系表-批量删除", notes = "优化师角色关系表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<OptimizerRoleInfo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<OptimizerRoleInfo> result = new Result<OptimizerRoleInfo>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.optimizerRoleInfoService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "优化师角色关系表-通过id查询")
+    @ApiOperation(value = "优化师角色关系表-通过id查询", notes = "优化师角色关系表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<OptimizerRoleInfo> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<OptimizerRoleInfo> result = new Result<OptimizerRoleInfo>();
+        OptimizerRoleInfo optimizerRoleInfo = optimizerRoleInfoService.getById(id);
+        if (optimizerRoleInfo == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(optimizerRoleInfo);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 获取优化师经理的统计数据
+     */
+    @GetMapping("manager/detail")
+    public Map<String, Object> managerDetail(Integer appType) {
+        return optimizerRoleInfoService.getmanagerDetail(appType);
+    }
+}

+ 2 - 2
jeecg-boot-module-system/src/main/resources/jeecg/jeecg_database.properties

@@ -1,4 +1,4 @@
-#mysql 
+#mysql
 diver_name=com.mysql.jdbc.Driver
 url=jdbc:mysql://39.106.184.70:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8
 username=root
@@ -21,4 +21,4 @@ database_name=jeecg-boot
 #url=jdbc:sqlserver://192.168.1.200:1433;DatabaseName=jeecg
 #username=sa
 #password=SA
-#database_name=jeecg
+#database_name=jeecg

+ 23 - 2
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -1,8 +1,12 @@
 package org.jeecg;
 
+import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.common.module.utils.HttpUtils2;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
 import cn.com.ctop.crawler.modules.appium.service.IAppiumJobService;
 import cn.com.ctop.crawler.modules.appium.service.IAppiumTaskService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.impl.client.BasicCookieStore;
 import org.jeecg.modules.ctop.service.IBidWarningService;
@@ -21,7 +25,10 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
@@ -133,9 +140,13 @@ public class SampleTest {
 
     }
 
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+
     @Test
     public void testMail() throws Exception {
-
+        // String accessToken, Long advertiserId, Date startDate, Date endDate, Integer page
+        kuaishouInterfaceService.getGroupList("adf659b9b43e8952f9a3f0c5269505ca", 35675L, null, null, 1);
     }
 
 
@@ -144,7 +155,17 @@ public class SampleTest {
 
     @Test
     public void testMa() throws Exception {
-        bidWarningService.BidWarning();
+        //String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_advertiser_info");
+        String url = "https://ad.oceanengine.com/open_api/2/advertiser/public_info/";
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", "7827db33fe53348e935706250a991461e7cffda2");
+        TreeMap<String, Object> params = new TreeMap<>();
+        //TODO jsonArray
+        params.put("advertiser_ids", "[" + 111463131228L+ "]");
+        String result = HttpUtils.httpGetRequest(url, headers, params);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        System.err.println(jsonObject);
     }
 
 

+ 1 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/impl/BindAccountAuthServiceImpl.java

@@ -81,7 +81,7 @@ public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMappe
                 .append(BytedanceInterfaceConstant.AUTH_PATH)
                 .append("?app_id=" + PropertiesUtils.getValue("bytedance_config", "bytedance_appid"))
                 .append("&state=" + URLEncoder.encode(state))
-                .append("&scope=" + jsonArray)
+              //  .append("&scope=" + jsonArray)
                 .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("bytedance_config", "bytedance_callback_url"), "UTF-8"));
         return sb.toString();
     }

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/StatusCode.java

@@ -38,6 +38,8 @@ public enum StatusCode {
     KUAISHOU_CRAWLER_APP_MOBILE_CODE_IS_NULL("短信验证码未获取到", -1004, false),
     KUAISHOU_CRAWLER_APP_ELEMENT_DETAIL_ERROR("快手元素内容异常", -1005, false),
     KUAISHOU_CRAWLER_APP_NO_ENABLED_DEVICE("暂无可用设备", -2001, false),
+    KUAISHOU_OPTINIZER_CONFIG_IS_NULL("快手媒体优化师配置信息不全", -3001, false),
+    KUAISHOU_OPTINIZER_PERSONNAL_DATA_IS_NULL("快手媒体优化师个人消耗数据不存在", -3002, false),
     KUAISHOU_CRAWLER_APP_SUCCESS("爬虫运行正常", 0, true),
     KUAISHOU_CRAWLER_APP_TASK_END("爬虫任务运行结束", 1, true),
     KUAISHOU_CRAWLER_APP_JOB_StART("任务开始执行开始", 0, true),

+ 40 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/BatchController.java

@@ -6,7 +6,9 @@ import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouCampaign;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouRegionListParent;
 import cn.com.ctop.kuaishou.modules.batch.entity.vo.SpendVo;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouRegionListParentMapper;
 import cn.com.ctop.kuaishou.modules.batch.service.*;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -22,6 +24,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.util.List;
 
 @Slf4j
 @Api(tags = "快手-批量工具")
@@ -43,6 +46,8 @@ public class BatchController {
 
     @Autowired
     private IKuaiShouGroupService kuaiShouGroupService;
+    @Autowired
+    private KuaiShouRegionListParentMapper regionListParentMapper;
 
 
     /**
@@ -148,7 +153,16 @@ public class BatchController {
     }
 
 
-    @PostMapping(value = "/getUnitList")
+    /**
+     * 查询广告组列表
+     *
+     * @param kuaiShouGroup
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/getUnitList")
     public Result<IPage<KuaiShouGroup>> getUnitList(KuaiShouGroup kuaiShouGroup,
                                                     @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                     @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
@@ -162,4 +176,29 @@ public class BatchController {
         return result;
     }
 
+
+    /**
+     * 获取区域列表
+     *
+     * @param kuaiShouRegionListParent
+     * @return
+     */
+    @GetMapping(value = "/getRegion")
+    public Result<List<KuaiShouRegionListParent>> getRegion(KuaiShouRegionListParent kuaiShouRegionListParent, HttpServletRequest req) {
+        Result<List<KuaiShouRegionListParent>> result = new Result<>();
+
+        try {
+            QueryWrapper<KuaiShouRegionListParent> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouRegionListParent, req.getParameterMap());
+
+            List<KuaiShouRegionListParent> regionListParents = regionListParentMapper.selectList(queryWrapper);
+            result.setSuccess(true);
+            result.setResult(regionListParents);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+
+        }
+        return result;
+    }
+
 }

+ 248 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouGroupTargetController.java

@@ -0,0 +1,248 @@
+package cn.com.ctop.kuaishou.modules.batch.controller;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroupTarget;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouGroupTargetService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 快手-定向信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+@Slf4j
+@Api(tags = "快手-定向信息")
+@RestController
+@RequestMapping("/ctop/kuaiShouGroupTarget")
+public class KuaiShouGroupTargetController {
+    @Autowired
+    private IKuaiShouGroupTargetService kuaiShouGroupTargetService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param kuaiShouGroupTarget
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "快手-定向信息-分页列表查询")
+    @ApiOperation(value = "快手-定向信息-分页列表查询", notes = "快手-定向信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<KuaiShouGroupTarget>> queryPageList(KuaiShouGroupTarget kuaiShouGroupTarget,
+                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                            HttpServletRequest req) {
+        Result<IPage<KuaiShouGroupTarget>> result = new Result<IPage<KuaiShouGroupTarget>>();
+        QueryWrapper<KuaiShouGroupTarget> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouGroupTarget, req.getParameterMap());
+        Page<KuaiShouGroupTarget> page = new Page<KuaiShouGroupTarget>(pageNo, pageSize);
+        IPage<KuaiShouGroupTarget> pageList = kuaiShouGroupTargetService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param kuaiShouGroupTarget
+     * @return
+     */
+    @AutoLog(value = "快手-定向信息-添加")
+    @ApiOperation(value = "快手-定向信息-添加", notes = "快手-定向信息-添加")
+    @PostMapping(value = "/add")
+    public Result<KuaiShouGroupTarget> add(@RequestBody KuaiShouGroupTarget kuaiShouGroupTarget) {
+        Result<KuaiShouGroupTarget> result = new Result<KuaiShouGroupTarget>();
+        try {
+            kuaiShouGroupTargetService.save(kuaiShouGroupTarget);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param kuaiShouGroupTarget
+     * @return
+     */
+    @AutoLog(value = "快手-定向信息-编辑")
+    @ApiOperation(value = "快手-定向信息-编辑", notes = "快手-定向信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<KuaiShouGroupTarget> edit(@RequestBody KuaiShouGroupTarget kuaiShouGroupTarget) {
+        Result<KuaiShouGroupTarget> result = new Result<KuaiShouGroupTarget>();
+        KuaiShouGroupTarget kuaiShouGroupTargetEntity = kuaiShouGroupTargetService.getById(kuaiShouGroupTarget.getId());
+        if (kuaiShouGroupTargetEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = kuaiShouGroupTargetService.updateById(kuaiShouGroupTarget);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "快手-定向信息-通过id删除")
+    @ApiOperation(value = "快手-定向信息-通过id删除", notes = "快手-定向信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            kuaiShouGroupTargetService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "快手-定向信息-批量删除")
+    @ApiOperation(value = "快手-定向信息-批量删除", notes = "快手-定向信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<KuaiShouGroupTarget> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<KuaiShouGroupTarget> result = new Result<KuaiShouGroupTarget>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.kuaiShouGroupTargetService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "快手-定向信息-通过id查询")
+    @ApiOperation(value = "快手-定向信息-通过id查询", notes = "快手-定向信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<KuaiShouGroupTarget> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<KuaiShouGroupTarget> result = new Result<KuaiShouGroupTarget>();
+        KuaiShouGroupTarget kuaiShouGroupTarget = kuaiShouGroupTargetService.getById(id);
+        if (kuaiShouGroupTarget == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(kuaiShouGroupTarget);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<KuaiShouGroupTarget> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                KuaiShouGroupTarget kuaiShouGroupTarget = JSON.parseObject(deString, KuaiShouGroupTarget.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouGroupTarget, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<KuaiShouGroupTarget> pageList = kuaiShouGroupTargetService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "快手-定向信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, KuaiShouGroupTarget.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("快手-定向信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<KuaiShouGroupTarget> listKuaiShouGroupTargets = ExcelImportUtil.importExcel(file.getInputStream(), KuaiShouGroupTarget.class, params);
+                kuaiShouGroupTargetService.saveBatch(listKuaiShouGroupTargets);
+                return Result.ok("文件导入成功!数据行数:" + listKuaiShouGroupTargets.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 10 - 6
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroup.java

@@ -62,6 +62,8 @@ public class KuaiShouGroup {
     @Excel(name = "广告组状态", width = 15)
     @ApiModelProperty(value = "广告组状态")
     private Integer status;
+    private Integer putStatus;
+    private Integer createChannel;
     /**
      * 审核拒绝理由
      */
@@ -86,6 +88,10 @@ public class KuaiShouGroup {
     @Excel(name = "OCPC出价", width = 15)
     @ApiModelProperty(value = "OCPC出价")
     private Long cpaBid;
+
+    private Integer deepConversionType;
+    private Long deepConversionBid;
+
     /**
      * OCPX行为类型   1: CPM, 2: CPC,
      */
@@ -116,18 +122,16 @@ public class KuaiShouGroup {
     @Excel(name = "投放结束时间", width = 15)
     @ApiModelProperty(value = "投放结束时间")
     private String endTime;
-    /**
-     * 投放时段
-     */
-    @Excel(name = "投放时段", width = 15)
-    @ApiModelProperty(value = "投放时段")
-    private String schedule;
+    private String scheduleTime;
+    private String sceneId;
+
     /**
      * 创意展现方式  0:未知, 1:轮播,
      */
     @Excel(name = "创意展现方式  0:未知, 1:轮播,", width = 15)
     @ApiModelProperty(value = "创意展现方式  0:未知, 1:轮播,")
     private Integer showModel;
+    private Integer unitType;
     /**
      * url类型
      */

+ 203 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroupTarget.java

@@ -0,0 +1,203 @@
+package cn.com.ctop.kuaishou.modules.batch.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 快手-定向信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+@Data
+@TableName("ctop_kuaishou_group_target")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_kuaishou_group_target对象", description = "快手-定向信息")
+public class KuaiShouGroupTarget {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 账户ID
+     */
+    @Excel(name = "账户ID", width = 15)
+    @ApiModelProperty(value = "账户ID")
+    private Long accountId;
+    /**
+     * 广告组ID
+     */
+    @Excel(name = "广告组ID", width = 15)
+    @ApiModelProperty(value = "广告组ID")
+    private Long unitId;
+    /**
+     * 地域
+     */
+    @Excel(name = "地域", width = 15)
+    @ApiModelProperty(value = "地域")
+    private String region;
+    /**
+     * 年龄最小限制
+     */
+    @Excel(name = "年龄最小限制", width = 15)
+    @ApiModelProperty(value = "年龄最小限制")
+    private Integer ageMin;
+    /**
+     * 年龄最大限制
+     */
+    @Excel(name = "年龄最大限制", width = 15)
+    @ApiModelProperty(value = "年龄最大限制")
+    private Integer ageMax;
+    /**
+     * 固定年龄段 【0:表示0-11岁】【12:表示12-17岁】【18:表示18-23岁】【24:表示24-30岁】【31:表示31-40岁】【41:表示41-49岁】【50:表示50-100岁】
+     */
+    @Excel(name = "固定年龄段 【0:表示0-11岁】【12:表示12-17岁】【18:表示18-23岁】【24:表示24-30岁】【31:表示31-40岁】【41:表示41-49岁】【50:表示50-100岁】", width = 15)
+    @ApiModelProperty(value = "固定年龄段 【0:表示0-11岁】【12:表示12-17岁】【18:表示18-23岁】【24:表示24-30岁】【31:表示31-40岁】【41:表示41-49岁】【50:表示50-100岁】")
+    private String agesRange;
+    /**
+     * 性别 1:女性, 2:男性, 0:不限
+     */
+    @Excel(name = "性别 1:女性, 2:男性, 0:不限", width = 15)
+    @ApiModelProperty(value = "性别 1:女性, 2:男性, 0:不限")
+    private Integer gender;
+    /**
+     * 操作系统 1: Android, 2: iOS, 0:不限
+     */
+    @Excel(name = "操作系统 1: Android, 2: iOS, 0:不限", width = 15)
+    @ApiModelProperty(value = "操作系统 1: Android, 2: iOS, 0:不限")
+    private Integer platformOs;
+    /**
+     * 安卓版本  3:不限, 4: 4.x+, 5: 5.x+, 6: 6.x+, 7: 7.x+;
+     */
+    @Excel(name = "安卓版本  3:不限, 4: 4.x+, 5: 5.x+, 6: 6.x+, 7: 7.x+;", width = 15)
+    @ApiModelProperty(value = "安卓版本  3:不限, 4: 4.x+, 5: 5.x+, 6: 6.x+, 7: 7.x+;")
+    private Integer androidOsv;
+    /**
+     * ios版本  6:不限, 7: 7.x+, 8: 8.x+,9: 9.x+, 10: 10.x+
+     */
+    @Excel(name = "ios版本  6:不限, 7: 7.x+, 8: 8.x+,9: 9.x+, 10: 10.x+", width = 15)
+    @ApiModelProperty(value = "ios版本  6:不限, 7: 7.x+, 8: 8.x+,9: 9.x+, 10: 10.x+")
+    private Integer iosOsv;
+    /**
+     * 网络环境 1: Wi-Fi, 2:移动网络,0:表示不限
+     */
+    @Excel(name = "网络环境 1: Wi-Fi, 2:移动网络,0:表示不限", width = 15)
+    @ApiModelProperty(value = "网络环境 1: Wi-Fi, 2:移动网络,0:表示不限")
+    private Integer network;
+    /**
+     * 设备品牌 1: OPPO, 2: VIVO,3:华为, 4:小米,5:荣耀, 6:三星,7:金立, 8:魅族,9:乐视, 10:其他,11 : 苹 果
+     */
+    @Excel(name = "设备品牌 1: OPPO, 2: VIVO,3:华为, 4:小米,5:荣耀, 6:三星,7:金立, 8:魅族,9:乐视, 10:其他,11 : 苹 果", width = 15)
+    @ApiModelProperty(value = "设备品牌 1: OPPO, 2: VIVO,3:华为, 4:小米,5:荣耀, 6:三星,7:金立, 8:魅族,9:乐视, 10:其他,11 : 苹 果")
+    private String deviceBrand;
+    /**
+     * 设备价格 1: 1500 元以下,2: 1501~2000,3: 2001~2500,4: 2501~3000,5: 3001~3500,6: 3501~4000,7: 4001~4500,8: 4501~5000,9: 5001~5500,10: 5500 元以上
+     */
+    @Excel(name = "设备价格 1: 1500 元以下,2: 1501~2000,3: 2001~2500,4: 2501~3000,5: 3001~3500,6: 3501~4000,7: 4001~4500,8: 4501~5000,9: 5001~5500,10: 5500 元以上", width = 15)
+    @ApiModelProperty(value = "设备价格 1: 1500 元以下,2: 1501~2000,3: 2001~2500,4: 2501~3000,5: 3001~3500,6: 3501~4000,7: 4001~4500,8: 4501~5000,9: 5001~5500,10: 5500 元以上")
+    private String devicePrice;
+    /**
+     * 商业兴趣类型 0:不限,2:按照兴趣标签
+     */
+    @Excel(name = "商业兴趣类型 0:不限,2:按照兴趣标签", width = 15)
+    @ApiModelProperty(value = "商业兴趣类型 0:不限,2:按照兴趣标签")
+    private Integer businessInterestType;
+    /**
+     * 商业兴趣
+     */
+    @Excel(name = "商业兴趣", width = 15)
+    @ApiModelProperty(value = "商业兴趣")
+    private String businessInterest;
+    /**
+     * 网红粉丝
+     */
+    @Excel(name = "网红粉丝", width = 15)
+    @ApiModelProperty(value = "网红粉丝")
+    private String fansStar;
+    /**
+     * 兴趣视频用户
+     */
+    @Excel(name = "兴趣视频用户", width = 15)
+    @ApiModelProperty(value = "兴趣视频用户")
+    private String interestVideo;
+    /**
+     * APP行为-按分类
+     */
+    @Excel(name = "APP行为-按分类", width = 15)
+    @ApiModelProperty(value = "APP行为-按分类")
+    private String appInterest;
+    /**
+     * APP行为-按APP名称
+     */
+    @Excel(name = "APP行为-按APP名称", width = 15)
+    @ApiModelProperty(value = "APP行为-按APP名称")
+    private String appIds;
+    /**
+     * 人群包定向
+     */
+    @Excel(name = "人群包定向", width = 15)
+    @ApiModelProperty(value = "人群包定向")
+    private String population;
+    /**
+     * 人群包排除
+     */
+    @Excel(name = "人群包排除", width = 15)
+    @ApiModelProperty(value = "人群包排除")
+    private String excludePopulation;
+    /**
+     * 0:关闭智能扩量,1:打开智能扩量
+     */
+    @Excel(name = "0:关闭智能扩量,1:打开智能扩量", width = 15)
+    @ApiModelProperty(value = "0:关闭智能扩量,1:打开智能扩量")
+    private Integer isOpen;
+    /**
+     * 不可突破年龄 0:可突破/无需控制,1:不可突破
+     */
+    @Excel(name = "不可突破年龄 0:可突破/无需控制,1:不可突破", width = 15)
+    @ApiModelProperty(value = "不可突破年龄 0:可突破/无需控制,1:不可突破")
+    private Integer noAgeBreak;
+    /**
+     * 不可突破性别 0:可突破/无需控制,1:不可突破
+     */
+    @Excel(name = "不可突破性别 0:可突破/无需控制,1:不可突破", width = 15)
+    @ApiModelProperty(value = "不可突破性别 0:可突破/无需控制,1:不可突破")
+    private Integer noGenderBreak;
+    /**
+     * 不可突破地域 0:可突破/无需控制,1:不可突破
+     */
+    @Excel(name = "不可突破地域 0:可突破/无需控制,1:不可突破", width = 15)
+    @ApiModelProperty(value = "不可突破地域 0:可突破/无需控制,1:不可突破")
+    private Integer noAreaBreak;
+    /**
+     * 创建时间
+     */
+    @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @Excel(name = "修改时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+}

+ 19 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupTargetMapper.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.kuaishou.modules.batch.mapper;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroupTarget;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 快手-定向信息
+ *
+ * @author: jeecg-boot
+ * @date: 2019-12-17
+ * @cersion: V1.0
+ */
+public interface KuaiShouGroupTargetMapper extends BaseMapper<KuaiShouGroupTarget> {
+
+    void replaceBatch(@Param("targets") List<KuaiShouGroupTarget> targets);
+}

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouAppInfoMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouAppInfoMapper">
     <insert id="replaceBatch">
         replace into ctop_kuaishou_app_info(
-        account_id ,
+        account_id,
         unit_id,
         app_package_name,
         app_name,

+ 16 - 5
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml

@@ -9,17 +9,23 @@
         unit_id,
         unit_name,
         status,
+        put_status,
+        create_channel,
         review_detail,
         bid_type,
         bid,
         cpa_bid,
         ocpx_action_type,
+        deep_conversion_type,
+        deep_conversion_bid,
         day_budget,
         speed,
         begin_time,
         end_time,
-        schedule,
+        schedule_time,
+        scene_id,
         show_model,
+        unit_type,
         url_type,
         url,
         app_id,
@@ -28,23 +34,30 @@
         update_time)
         values
         <foreach collection="groups" item="getGroup" separator=",">
-            (#{getGroup.id},
+            (
+            #{getGroup.id},
             #{getGroup.accountId},
             #{getGroup.campaignId},
             #{getGroup.unitId},
             #{getGroup.unitName},
             #{getGroup.status},
+            #{getGroup.putStatus},
+            #{getGroup.createChannel},
             #{getGroup.reviewDetail},
             #{getGroup.bidType},
             #{getGroup.bid},
             #{getGroup.cpaBid},
             #{getGroup.ocpxActionType},
+            #{getGroup.deepConversionType},
+            #{getGroup.deepConversionBid},
             #{getGroup.dayBudget},
             #{getGroup.speed},
             #{getGroup.beginTime},
             #{getGroup.endTime},
-            #{getGroup.schedule},
+            #{getGroup.scheduleTime},
+            #{getGroup.sceneId},
             #{getGroup.showModel},
+            #{getGroup.unitType},
             #{getGroup.urlType},
             #{getGroup.url},
             #{getGroup.appId},
@@ -56,8 +69,6 @@
 
 
     <select id="selectWarningGroup" resultType="java.lang.String">
-
-
    SELECT
    unit_name
    FROM ctop_kuaishou_group

+ 67 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupTargetMapper.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupTargetMapper">
+
+
+    <insert id="replaceBatch">
+        replace into ctop_kuaishou_group_target(
+        account_id ,
+        unit_id,
+        region,
+        age_min,
+        age_max,
+        ages_range,
+        gender,
+        platform_os,
+        android_osv,
+        ios_osv,
+        network,
+        device_brand,
+        device_price,
+        business_interest_type,
+        business_interest,
+        fans_star,
+        interest_video,
+        app_interest,
+        app_ids,
+        population,
+        exclude_population,
+        is_open,
+        no_age_break,
+        no_gender_break,
+        no_area_break
+        )
+        values
+        <foreach collection="targets" item="targets" separator=",">
+            (
+
+            #{targets.accountId},
+            #{targets.unitId},
+            #{targets.region},
+            #{targets.ageMin},
+            #{targets.ageMax},
+            #{targets.agesRange},
+            #{targets.gender},
+            #{targets.platformOs},
+            #{targets.androidOsv},
+            #{targets.iosOsv},
+            #{targets.network},
+            #{targets.deviceBrand},
+            #{targets.devicePrice},
+            #{targets.businessInterestType},
+            #{targets.businessInterest},
+            #{targets.fansStar},
+            #{targets.interestVideo},
+            #{targets.appInterest},
+            #{targets.appIds},
+            #{targets.population},
+            #{targets.excludePopulation},
+            #{targets.isOpen},
+            #{targets.noAgeBreak},
+            #{targets.noGenderBreak},
+            #{targets.noAreaBreak}
+            )
+        </foreach>
+    </insert>
+
+</mapper>

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouRegionListChildrenMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouRegionListChildrenMapper">
     <delete id="deleteAll">
-        delete from ctop_kuaishou_region_list_children;
+        delete from ctop_kuaishou_region_list_parent;
     </delete>
 
 </mapper>

+ 15 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouGroupTargetService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.kuaishou.modules.batch.service;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroupTarget;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 快手-定向信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+public interface IKuaiShouGroupTargetService extends IService<KuaiShouGroupTarget> {
+
+}

+ 19 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupTargetServiceImpl.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.kuaishou.modules.batch.service.impl;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroupTarget;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupTargetMapper;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouGroupTargetService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 快手-定向信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+@Service
+public class KuaiShouGroupTargetServiceImpl extends ServiceImpl<KuaiShouGroupTargetMapper, KuaiShouGroupTarget> implements IKuaiShouGroupTargetService {
+
+}

+ 99 - 13
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java

@@ -1443,41 +1443,52 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
 
     }
 
+    @Autowired
+    private KuaiShouGroupTargetMapper groupTargetMapper;
+
     private void addGroup(Long advertiserId, JSONArray details) {
         if (!Check.isNull(details)) {
             List<KuaiShouGroup> groups = new ArrayList<>();
             List<KuaiShouAppInfo> appInfos = new ArrayList<>();
-            List<KuaiShouSchedule> shouSchedules = new ArrayList<>();
+            List<KuaiShouSchedule> schedules = new ArrayList<>();
+            List<KuaiShouGroupTarget> targets = new ArrayList<>();
             for (int i = 0; i < details.size(); i++) {
                 JSONObject detail = JSONObject.parseObject(details.get(i).toString());
                 if (!Check.isNull(detail)) {
                     KuaiShouGroup group = new KuaiShouGroup();
+                    Long unitId = detail.getLong("unit_id");
+                    group.setId("" + advertiserId + unitId);
                     group.setAccountId(advertiserId);
-                    group.setStatus(detail.getInteger("status"));
-                    group.setBid(detail.getLong("bid"));
-                    group.setSpeed(detail.getInteger("speed"));
-                    group.setSchedule(detail.getString("schedule"));
-                    group.setUrl(detail.getString("url"));
                     group.setCampaignId(detail.getLong("campaign_id"));
-                    Long unitId = detail.getLong("unit_id");
                     group.setUnitId(unitId);
-                    group.setId("" + advertiserId + unitId);
                     group.setUnitName(detail.getString("unit_name"));
-                    group.setBidType(detail.getInteger("bid_type"));
+                    group.setStatus(detail.getInteger("status"));
+                    group.setPutStatus(detail.getInteger("put_status"));
+                    group.setCreateChannel(detail.getInteger("create_channel"));
                     group.setReviewDetail(detail.getString("review_detail"));
+                    group.setBidType(detail.getInteger("bid_type"));
+                    group.setBid(detail.getLong("bid"));
                     group.setCpaBid(detail.getLong("cpa_bid"));
                     group.setOcpxActionType(detail.getInteger("ocpx_action_type"));
+                    group.setDeepConversionType(detail.getInteger("deep_conversion_type"));
+                    group.setDeepConversionBid(detail.getLong("deep_conversion_bid"));
                     group.setDayBudget(detail.getLong("day_budget"));
+                    group.setSpeed(detail.getInteger("speed"));
                     group.setBeginTime(detail.getString("begin_time"));
                     group.setEndTime(detail.getString("end_time"));
+                    group.setScheduleTime(detail.getString("schedule_time"));
+                    group.setSceneId(detail.getJSONArray("scene_id") + "");
                     group.setShowModel(detail.getInteger("show_mode"));
+                    group.setUnitType(detail.getInteger("unit_type"));
                     group.setUrlType(detail.getInteger("url_type"));
+                    group.setUrl(detail.getString("url"));
                     group.setAppId(detail.getLong("app_id"));
                     group.setAppIconUrl(detail.getString("app_icon_url"));
                     group.setCreateTime(new Date());
                     group.setUpdateTime(new Date());
                     groups.add(group);
                     // 添加应用信息
+
                     JSONObject diverseJson = detail.getJSONObject("diverse_data");
                     if (!Check.isNull(diverseJson)) {
                         KuaiShouAppInfo appInfo = new KuaiShouAppInfo();
@@ -1505,19 +1516,94 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                         schedule.setSun(scheduleJson.getJSONArray("sun").toJSONString());
                         schedule.setCreateTime(new Date());
                         schedule.setUpdateTime(new Date());
-                        shouSchedules.add(schedule);
+                        schedules.add(schedule);
+                    }
+
+                    JSONObject targetJson = detail.getJSONObject("target");
+                    if (!Check.isNull(targetJson)) {
+                        KuaiShouGroupTarget groupTarget = new KuaiShouGroupTarget();
+                        groupTarget.setAccountId(advertiserId);
+                        groupTarget.setUnitId(unitId);
+
+                        if (!Check.isNull(targetJson.getJSONArray("region"))) {
+                            groupTarget.setRegion(targetJson.getJSONArray("region").toJSONString());
+                        }
+
+                        JSONObject age = targetJson.getJSONObject("age");
+                        if (!Check.isNull(age)) {
+                            groupTarget.setAgeMin(age.getInteger("min"));
+                            groupTarget.setAgeMax(age.getInteger("max"));
+                        }
+                        if (!Check.isNull(targetJson.getJSONArray("ages_range"))) {
+                            groupTarget.setAgesRange(targetJson.getJSONArray("ages_range").toJSONString());
+                        }
+
+                        groupTarget.setGender(targetJson.getInteger("gender"));
+                        groupTarget.setPlatformOs(targetJson.getInteger("platform_os"));
+                        groupTarget.setAndroidOsv(targetJson.getInteger("android_osv"));
+                        groupTarget.setIosOsv(targetJson.getInteger("ios_osv"));
+                        groupTarget.setNetwork(targetJson.getInteger("network"));
+                        if (!Check.isNull(targetJson.getJSONArray("device_brand"))) {
+                            groupTarget.setDeviceBrand(targetJson.getJSONArray("device_brand").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("device_price"))) {
+                            groupTarget.setDevicePrice(targetJson.getJSONArray("device_price").toJSONString());
+                        }
+
+                        groupTarget.setBusinessInterestType(targetJson.getInteger("business_interest_type"));
+                        if (!Check.isNull(targetJson.getJSONArray("business_interest"))) {
+                            groupTarget.setBusinessInterest(targetJson.getJSONArray("business_interest").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("fans_star"))) {
+                            groupTarget.setFansStar(targetJson.getJSONArray("fans_star").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("interest_video"))) {
+                            groupTarget.setInterestVideo(targetJson.getJSONArray("interest_video").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("app_interest"))) {
+                            groupTarget.setAppInterest(targetJson.getJSONArray("app_interest").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("app_ids"))) {
+                            groupTarget.setAppIds(targetJson.getJSONArray("app_ids").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("population"))) {
+                            groupTarget.setPopulation(targetJson.getJSONArray("population").toJSONString());
+                        }
+
+                        if (!Check.isNull(targetJson.getJSONArray("exclude_population"))) {
+                            groupTarget.setExcludePopulation(targetJson.getJSONArray("exclude_population").toJSONString());
+                        }
+
+                        JSONObject intelliExtend = targetJson.getJSONObject("intelli_extend");
+                        if (!Check.isNull(intelliExtend)) {
+                            groupTarget.setIsOpen(intelliExtend.getInteger("is_open"));
+                            groupTarget.setNoAgeBreak(intelliExtend.getInteger("no_age_break"));
+                            groupTarget.setNoGenderBreak(intelliExtend.getInteger("no_gender_break"));
+                            groupTarget.setNoAreaBreak(intelliExtend.getInteger("no_area_break"));
+
+                        }
+                        targets.add(groupTarget);
                     }
                 }
             }
             if (!Check.isNull(groups)) {
                 groupMapper.replaceBatch(groups);
             }
-            if (!Check.isNull(shouSchedules)) {
-                shouScheduleMapper.replaceBatch(shouSchedules);
+            if (!Check.isNull(schedules)) {
+                shouScheduleMapper.replaceBatch(schedules);
             }
             if (!Check.isNull(appInfos)) {
                 appInfoMapper.replaceBatch(appInfos);
             }
+            if (!Check.isNull(targets)) {
+                groupTargetMapper.replaceBatch(targets);
+            }
         }
     }
 
@@ -2041,7 +2127,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                             }
                         }
                     }
-                    log.info("获取视频信息完成,advertiserId:{},返回信息:{}", advertiserId,resultJson);
+                    log.info("获取视频信息完成,advertiserId:{},返回信息:{}", advertiserId, resultJson);
                 } else {
                     log.error("获取广告视频失败,advertiser_id:{},返回信息:{}", advertiserId, resultJson);
                 }

+ 1 - 3
module-toutiao/src/main/java/cn/com/ctop/toutiao/service/impl/ByteDanceAdvertiserDataServiceImpl.java

@@ -71,9 +71,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         }
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObject = data.getJSONObject(i);
-            ByteDanceAdvertiser advertiser = new ByteDanceAdvertiser(dataObject, accountId);
-            advertiserService.saveOrUpdate(advertiser);
-            resultMap.put("data", advertiser);
+            resultMap.put("name", dataObject.getString("name"));
         }
         resultMap.put("success", true);
         resultMap.put("code", 0);

+ 1 - 1
module-toutiao/src/main/resources/bytedance_config.properties

@@ -11,7 +11,7 @@ bytedance_auth_url=https://ad.oceanengine.com/openapi
 #bytedance_auth_url=https://test-ad.toutiao.com/open_api
 #bytedance_callback_url=http://callback.c-top.com.cn/bytedance
 bytedance_callback_url=http://adsp.c-top.com.cn:8080/jeecg-boot/bytedance
-bytedance_v2_advertiser_info=/2/advertiser/info
+bytedance_v2_advertiser_info=/2/advertiser/public_info/
 bytedance_v2_ad_get=/2/ad/get
 bytedance_v2_ad_create=/2/ad/create/
 bytedance_v2_ad_update_status=/2/ad/update/status

+ 248 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/OptimizerConfigController.java

@@ -0,0 +1,248 @@
+package cn.com.ctop.performanceappraisal.controller;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
+import cn.com.ctop.performanceappraisal.service.IOptimizerConfigService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 优化师配置信息表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+@Slf4j
+@Api(tags = "优化师配置信息表")
+@RestController
+@RequestMapping("/ctop/optimizerConfig")
+public class OptimizerConfigController {
+    @Autowired
+    private IOptimizerConfigService optimizerConfigService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param optimizerConfig
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "优化师配置信息表-分页列表查询")
+    @ApiOperation(value = "优化师配置信息表-分页列表查询", notes = "优化师配置信息表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<OptimizerConfig>> queryPageList(OptimizerConfig optimizerConfig,
+                                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                        HttpServletRequest req) {
+        Result<IPage<OptimizerConfig>> result = new Result<IPage<OptimizerConfig>>();
+        QueryWrapper<OptimizerConfig> queryWrapper = QueryGenerator.initQueryWrapper(optimizerConfig, req.getParameterMap());
+        Page<OptimizerConfig> page = new Page<OptimizerConfig>(pageNo, pageSize);
+        IPage<OptimizerConfig> pageList = optimizerConfigService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param optimizerConfig
+     * @return
+     */
+    @AutoLog(value = "优化师配置信息表-添加")
+    @ApiOperation(value = "优化师配置信息表-添加", notes = "优化师配置信息表-添加")
+    @PostMapping(value = "/add")
+    public Result<OptimizerConfig> add(@RequestBody OptimizerConfig optimizerConfig) {
+        Result<OptimizerConfig> result = new Result<OptimizerConfig>();
+        try {
+            optimizerConfigService.save(optimizerConfig);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param optimizerConfig
+     * @return
+     */
+    @AutoLog(value = "优化师配置信息表-编辑")
+    @ApiOperation(value = "优化师配置信息表-编辑", notes = "优化师配置信息表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<OptimizerConfig> edit(@RequestBody OptimizerConfig optimizerConfig) {
+        Result<OptimizerConfig> result = new Result<OptimizerConfig>();
+        OptimizerConfig optimizerConfigEntity = optimizerConfigService.getById(optimizerConfig.getId());
+        if (optimizerConfigEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = optimizerConfigService.updateById(optimizerConfig);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "优化师配置信息表-通过id删除")
+    @ApiOperation(value = "优化师配置信息表-通过id删除", notes = "优化师配置信息表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            optimizerConfigService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "优化师配置信息表-批量删除")
+    @ApiOperation(value = "优化师配置信息表-批量删除", notes = "优化师配置信息表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<OptimizerConfig> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<OptimizerConfig> result = new Result<OptimizerConfig>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.optimizerConfigService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "优化师配置信息表-通过id查询")
+    @ApiOperation(value = "优化师配置信息表-通过id查询", notes = "优化师配置信息表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<OptimizerConfig> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<OptimizerConfig> result = new Result<OptimizerConfig>();
+        OptimizerConfig optimizerConfig = optimizerConfigService.getById(id);
+        if (optimizerConfig == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(optimizerConfig);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<OptimizerConfig> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                OptimizerConfig optimizerConfig = JSON.parseObject(deString, OptimizerConfig.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(optimizerConfig, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<OptimizerConfig> pageList = optimizerConfigService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "优化师配置信息表列表");
+        mv.addObject(NormalExcelConstants.CLASS, OptimizerConfig.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("优化师配置信息表列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<OptimizerConfig> listOptimizerConfigs = ExcelImportUtil.importExcel(file.getInputStream(), OptimizerConfig.class, params);
+                optimizerConfigService.saveBatch(listOptimizerConfigs);
+                return Result.ok("文件导入成功!数据行数:" + listOptimizerConfigs.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 9 - 80
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceController.java

@@ -1,8 +1,7 @@
 package cn.com.ctop.performanceappraisal.controller;
 
-import cn.com.ctop.performanceappraisal.service.IPerformanceService;
 import cn.com.ctop.performanceappraisal.entity.Performance;
-import com.alibaba.fastjson.JSON;
+import cn.com.ctop.performanceappraisal.service.IPerformanceService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,25 +11,11 @@ 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.oConvertUtils;
-import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
-import org.jeecgframework.poi.excel.entity.ImportParams;
-import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -178,71 +163,15 @@ public class PerformanceController {
         return result;
     }
 
-    /**
-     * 导出excel
-     *
-     * @param request
-     * @param response
-     */
-    @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
-        // Step.1 组装查询条件
-        QueryWrapper<Performance> queryWrapper = null;
-        try {
-            String paramsStr = request.getParameter("paramsStr");
-            if (oConvertUtils.isNotEmpty(paramsStr)) {
-                String deString = URLDecoder.decode(paramsStr, "UTF-8");
-                Performance performance = JSON.parseObject(deString, Performance.class);
-                queryWrapper = QueryGenerator.initQueryWrapper(performance, request.getParameterMap());
-            }
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        //Step.2 AutoPoi 导出Excel
-        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-        List<Performance> pageList = performanceService.list(queryWrapper);
-        //导出文件名称
-        mv.addObject(NormalExcelConstants.FILE_NAME, "设计师季度绩效表列表");
-        mv.addObject(NormalExcelConstants.CLASS, Performance.class);
-        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("设计师季度绩效表列表数据", "导出人:Jeecg", "导出信息"));
-        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
-        return mv;
+    @GetMapping("/project/list")
+    public Map<String, Object> projectList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                           @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        return performanceService.getUserOptimizerProjectList(pageNo, pageSize);
     }
 
-    /**
-     * 通过excel导入数据
-     *
-     * @param request
-     * @param response
-     * @return
-     */
-    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
-        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();
-            ImportParams params = new ImportParams();
-            params.setTitleRows(2);
-            params.setHeadRows(1);
-            params.setNeedSave(true);
-            try {
-                List<Performance> listPerformances = ExcelImportUtil.importExcel(file.getInputStream(), Performance.class, params);
-                performanceService.saveBatch(listPerformances);
-                return Result.ok("文件导入成功!数据行数:" + listPerformances.size());
-            } catch (Exception e) {
-                log.error(e.getMessage(), e);
-                return Result.error("文件导入失败:" + e.getMessage());
-            } finally {
-                try {
-                    file.getInputStream().close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-        return Result.ok("文件导入失败!");
+    @GetMapping("/account/list")
+    public Map<String, Object> accountList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                           @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, Long projectId) {
+        return performanceService.getUserOptimizerAccountList(projectId, pageNo, pageSize);
     }
-
 }

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

@@ -0,0 +1,278 @@
+package cn.com.ctop.performanceappraisal.controller;
+
+import cn.com.ctop.performanceappraisal.entity.PerformanceOptimizer;
+import cn.com.ctop.performanceappraisal.service.IPerformanceOptimizerService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 优化师绩效信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+@Slf4j
+@Api(tags = "优化师绩效信息")
+@RestController
+@RequestMapping("/ctop/performanceOptimizer")
+public class PerformanceOptimizerController {
+    @Autowired
+    private IPerformanceOptimizerService performanceOptimizerService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param performanceOptimizer
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "优化师绩效信息-分页列表查询")
+    @ApiOperation(value = "优化师绩效信息-分页列表查询", notes = "优化师绩效信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<PerformanceOptimizer>> queryPageList(PerformanceOptimizer performanceOptimizer,
+                                                             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                             HttpServletRequest req) {
+        Result<IPage<PerformanceOptimizer>> result = new Result<IPage<PerformanceOptimizer>>();
+        QueryWrapper<PerformanceOptimizer> queryWrapper = QueryGenerator.initQueryWrapper(performanceOptimizer, req.getParameterMap());
+        Page<PerformanceOptimizer> page = new Page<PerformanceOptimizer>(pageNo, pageSize);
+        IPage<PerformanceOptimizer> pageList = performanceOptimizerService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    @GetMapping(value = "/detail")
+    @ResponseBody
+    public Map<String, Object> getPerformanceDetail(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                    HttpServletRequest req, @RequestParam(name = "mediaType", defaultValue = "2") String mediaType) {
+        return performanceOptimizerService.getPerformanceDetail(mediaType, pageNo, pageSize);
+    }
+
+    @GetMapping(value = "/ranking/list")
+    @ResponseBody
+    public Map<String, Object> getRankingList(@RequestParam(name = "mediaType", defaultValue = "2") String mediaType,
+                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                              @RequestParam(name = "pageSize", defaultValue = "3") Integer pageSize,
+                                              HttpServletRequest req) {
+        return performanceOptimizerService.getRankingList(mediaType, pageNo, pageSize);
+    }
+
+    /**
+     * 获取项目经理相关数据
+     *
+     * @param req
+     * @param mediaType
+     * @return
+     */
+    @GetMapping(value = "/manager/detail")
+    @ResponseBody
+    public Map<String, Object> getManagerPerformanceDetail(HttpServletRequest req, @RequestParam(name = "mediaType", defaultValue = "2") String mediaType) {
+        return performanceOptimizerService.getManagerPerformanceDetail(mediaType);
+    }
+
+    /**
+     * 添加
+     *
+     * @param performanceOptimizer
+     * @return
+     */
+    @AutoLog(value = "优化师绩效信息-添加")
+    @ApiOperation(value = "优化师绩效信息-添加", notes = "优化师绩效信息-添加")
+    @PostMapping(value = "/add")
+    public Result<PerformanceOptimizer> add(@RequestBody PerformanceOptimizer performanceOptimizer) {
+        Result<PerformanceOptimizer> result = new Result<PerformanceOptimizer>();
+        try {
+            performanceOptimizerService.save(performanceOptimizer);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param performanceOptimizer
+     * @return
+     */
+    @AutoLog(value = "优化师绩效信息-编辑")
+    @ApiOperation(value = "优化师绩效信息-编辑", notes = "优化师绩效信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<PerformanceOptimizer> edit(@RequestBody PerformanceOptimizer performanceOptimizer) {
+        Result<PerformanceOptimizer> result = new Result<PerformanceOptimizer>();
+        PerformanceOptimizer performanceOptimizerEntity = performanceOptimizerService.getById(performanceOptimizer.getId());
+        if (performanceOptimizerEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = performanceOptimizerService.updateById(performanceOptimizer);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "优化师绩效信息-通过id删除")
+    @ApiOperation(value = "优化师绩效信息-通过id删除", notes = "优化师绩效信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            performanceOptimizerService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "优化师绩效信息-批量删除")
+    @ApiOperation(value = "优化师绩效信息-批量删除", notes = "优化师绩效信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<PerformanceOptimizer> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<PerformanceOptimizer> result = new Result<PerformanceOptimizer>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.performanceOptimizerService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "优化师绩效信息-通过id查询")
+    @ApiOperation(value = "优化师绩效信息-通过id查询", notes = "优化师绩效信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<PerformanceOptimizer> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<PerformanceOptimizer> result = new Result<PerformanceOptimizer>();
+        PerformanceOptimizer performanceOptimizer = performanceOptimizerService.getById(id);
+        if (performanceOptimizer == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(performanceOptimizer);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<PerformanceOptimizer> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                PerformanceOptimizer performanceOptimizer = JSON.parseObject(deString, PerformanceOptimizer.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(performanceOptimizer, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<PerformanceOptimizer> pageList = performanceOptimizerService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "优化师绩效信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, PerformanceOptimizer.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("优化师绩效信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<PerformanceOptimizer> listPerformanceOptimizers = ExcelImportUtil.importExcel(file.getInputStream(), PerformanceOptimizer.class, params);
+                performanceOptimizerService.saveBatch(listPerformanceOptimizers);
+                return Result.ok("文件导入成功!数据行数:" + listPerformanceOptimizers.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 81 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/OptimizerConfig.java

@@ -0,0 +1,81 @@
+package cn.com.ctop.performanceappraisal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 优化师配置信息表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+@Data
+@TableName("ctop_optimizer_config")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_optimizer_config对象", description = "优化师配置信息表")
+public class OptimizerConfig {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * 媒体类型
+     */
+    @Excel(name = "媒体类型", width = 15)
+    @ApiModelProperty(value = "媒体类型")
+    private Integer appType;
+    /**
+     * 媒体任务
+     */
+    @Excel(name = "媒体任务", width = 15)
+    @ApiModelProperty(value = "媒体任务")
+    private java.math.BigDecimal mediaTask;
+    /**
+     * personalTask
+     */
+    @Excel(name = "personalTask", width = 15)
+    @ApiModelProperty(value = "personalTask")
+    private java.math.BigDecimal personalTask;
+    /**
+     * 媒体任务完成下的提成比例 (千分之n)
+     */
+    @Excel(name = "媒体任务完成下的提成比例 (千分之n)", width = 15)
+    @ApiModelProperty(value = "媒体任务完成下的提成比例 (千分之n)")
+    private java.math.BigDecimal mediaTaskFinishRate;
+    /**
+     * 媒体任务未完成下的提成比例 (千分之n)
+     */
+    @Excel(name = "媒体任务未完成下的提成比例 (千分之n)", width = 15)
+    @ApiModelProperty(value = "媒体任务未完成下的提成比例 (千分之n)")
+    private java.math.BigDecimal mediaTaskNoFinishRate;
+    /**
+     * 是否有效
+     */
+    @Excel(name = "是否有效", width = 15)
+    @ApiModelProperty(value = "是否有效")
+    private Integer enabled;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 81 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/OptimizerRoleInfo.java

@@ -0,0 +1,81 @@
+package cn.com.ctop.performanceappraisal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 优化师角色关系表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+@Data
+@TableName("ctop_optimizer_role_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_optimizer_role_info对象", description = "优化师角色关系表")
+public class OptimizerRoleInfo {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * 部门代码
+     */
+    @Excel(name = "部门代码", width = 15)
+    @ApiModelProperty(value = "部门代码")
+    private String orgCode;
+    /**
+     * 角色类型 1:运营经理 2:运营专员
+     */
+    @Excel(name = "角色类型 1:运营经理 2:运营专员", width = 15)
+    @ApiModelProperty(value = "角色类型 1:运营经理 2:运营专员")
+    @Dict(dicCode = "optimizer_type")
+    private Integer type;
+    /**
+     * 用户id
+     */
+    @Excel(name = "用户id", width = 15)
+    @ApiModelProperty(value = "用户id")
+    @Dict(dicCode = "id", dictTable = "sys_user", dicText = "realname")
+    private String userId;
+    private String realname;
+    /**
+     * 归属人id
+     */
+    @Excel(name = "归属人id", width = 15)
+    @ApiModelProperty(value = "归属人id")
+    @Dict(dicCode = "id", dictTable = "sys_user", dicText = "realname")
+    private String belongerId;
+    /**
+     * enabled
+     */
+    @Excel(name = "enabled", width = 15)
+    @ApiModelProperty(value = "enabled")
+    @Dict(dicCode = "valid_status")
+    private Integer enabled;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 102 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/PerformanceOptimizer.java

@@ -0,0 +1,102 @@
+package cn.com.ctop.performanceappraisal.entity;
+
+import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 优化师绩效信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+@Data
+@TableName("ctop_performance_optimizer")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_performance_optimizer对象", description = "优化师绩效信息")
+public class PerformanceOptimizer {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 总消耗
+     */
+    @Excel(name = "总消耗", width = 15)
+    @ApiModelProperty(value = "总消耗")
+    private java.math.BigDecimal totalCost;
+    /**
+     * 总提成
+     */
+    @Excel(name = "总提成", width = 15)
+    @ApiModelProperty(value = "总提成")
+    private java.math.BigDecimal totalRoyalty;
+    /**
+     * 年
+     */
+    @Excel(name = "年", width = 15)
+    @ApiModelProperty(value = "年")
+    private String year;
+    /**
+     * 季度
+     */
+    @Excel(name = "季度", width = 15)
+    @ApiModelProperty(value = "季度")
+    private String quarter;
+    /**
+     * 用户id
+     */
+    @Excel(name = "用户id", width = 15)
+    @ApiModelProperty(value = "用户id")
+    private String userId;
+    /**
+     * 用户名称
+     */
+    @Excel(name = "用户名称", width = 15)
+    @ApiModelProperty(value = "用户名称")
+    private String realname;
+    /**
+     * 媒体类型
+     */
+    @Excel(name = "媒体类型", width = 15)
+    @ApiModelProperty(value = "媒体类型")
+    private Integer appType;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public PerformanceOptimizer() {
+    }
+
+    public PerformanceOptimizer(OptimizerCostDetailVO vo) {
+        this.appType = vo.getAppType();
+        this.totalCost = vo.getTotalCost();
+        this.totalRoyalty = vo.getTotalRoyalty();
+        this.year = vo.getYear();
+        this.quarter = vo.getQuarter();
+        this.userId = vo.getUserId();
+        this.realname = vo.getRealName();
+        this.appType = vo.getAppType();
+    }
+}

+ 6 - 2
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/RolePerformancRraise.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
 import java.util.Date;
@@ -37,6 +38,7 @@ public class RolePerformancRraise {
      */
     @Excel(name = "角色id", width = 15)
     @ApiModelProperty(value = "角色id")
+    @Dict(dicCode = "id", dictTable = "sys_role", dicText = "role_name")
     private String roleId;
     /**
      * 提点梯度级别
@@ -59,14 +61,16 @@ public class RolePerformancRraise {
     /**
      * 1:快手 2:头条
      */
-    @Excel(name = "1:快手 2:头条", width = 15)
-    @ApiModelProperty(value = "1:快手 2:头条")
+    @Excel(name = "媒体类型", width = 15)
+    @ApiModelProperty(value = "媒体类型")
+    @Dict(dicCode = "media_type")
     private Integer appType;
     /**
      * 是否可用
      */
     @Excel(name = "是否可用", width = 15)
     @ApiModelProperty(value = "是否可用")
+    @Dict(dicCode = "valid_status")
     private Integer enabled;
     /**
      * createTime

+ 4 - 3
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/RolePerformanceCommission.java

@@ -49,14 +49,15 @@ public class RolePerformanceCommission {
     /**
      * 是否可用 1:可用 2:不可用
      */
-    @Excel(name = "是否可用 1:可用 2:不可用", width = 15)
+    @Excel(name = "是否可用", width = 15)
     @ApiModelProperty(value = "是否可用 1:可用 2:不可用")
+    @Dict(dicCode = "valid_status")
     private Integer enabled;
     /**
      * 1:快手  2:头条
      */
-    @Excel(name = "1:快手  2:头条", width = 15)
-    @ApiModelProperty(value = "1:快手  2:头条")
+    @Excel(name = "媒体类型", width = 15)
+    @ApiModelProperty(value = "媒体类型")
     @Dict(dicCode = "media_type")
     private Integer appType;
     /**

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/OptimizerConfigMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.performanceappraisal.mapper;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 优化师配置信息表
+ *
+ * @author: jeecg-boot
+ * @date: 2019-12-13
+ * @cersion: V1.0
+ */
+public interface OptimizerConfigMapper extends BaseMapper<OptimizerConfig> {
+
+}

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/OptimizerRoleInfoMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.performanceappraisal.mapper;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerRoleInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 优化师角色关系表
+ *
+ * @author: jeecg-boot
+ * @date: 2019-12-17
+ * @cersion: V1.0
+ */
+public interface OptimizerRoleInfoMapper extends BaseMapper<OptimizerRoleInfo> {
+
+}

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/PerformanceMapper.java

@@ -1,7 +1,11 @@
 package cn.com.ctop.performanceappraisal.mapper;
 
 import cn.com.ctop.performanceappraisal.entity.Performance;
+import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 设计师季度绩效表
@@ -12,4 +16,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface PerformanceMapper extends BaseMapper<Performance> {
 
+    List<OptimizerCostDetailVO> getOptimizerTotalCostDetailGroupByUserId(@Param(value = "startDate") String startDate, @Param(value = "endDate") String endDate, @Param(value = "year") String year, @Param(value = "quarter") String quarter, @Param(value = "userId") String userId, @Param(value = "startIndex") Integer startIndex, @Param(value = "pageSize") Integer pageSize);
+
+    List<OptimizerCostDetailVO> getOptimizerTotalCostDetailGroupByAccountId(@Param(value = "startDate") String startDate, @Param(value = "endDate") String endDate, @Param(value = "year") String year, @Param(value = "quarter") String quarter, @Param(value = "userId") String userId, @Param(value = "startIndex") Integer startIndex, @Param(value = "pageSize") Integer pageSize);
+
+    List<OptimizerCostDetailVO> getUserOptimizerTotalCostGroupByProjectId(@Param(value = "startDate") String startDate, @Param(value = "endDate") String endDate, @Param(value = "year") String year, @Param(value = "quarter") String quarter, @Param(value = "userId") String userId, @Param(value = "startIndex") Integer startIndex, @Param(value = "pageSize") Integer pageSize, @Param(value = "projectId") Long projectId);
+
+    List<OptimizerCostDetailVO> getUserOptimizerTotalCostGroupByAccountId(@Param(value = "startDate") String startDate, @Param(value = "endDate") String endDate, @Param(value = "year") String year, @Param(value = "quarter") String quarter, @Param(value = "userId") String userId, @Param(value = "startIndex") Integer startIndex, @Param(value = "pageSize") Integer pageSize, @Param(value = "projectId") Long projectId, @Param(value = "accountId") Long accountId);
+
+    List<OptimizerCostDetailVO> getMemberPerformanceByUserId(@Param(value = "startDate") String startDate, @Param(value = "endDate") String endDate, @Param(value = "year") String year, @Param(value = "quarter") String quarter, @Param(value = "userId") String userId);
+
+    OptimizerCostDetailVO getOptimizerTotalCost(@Param(value = "startDate") String startDate, @Param(value = "endDate") String endDate, @Param(value = "year") String year, @Param(value = "quarter") String quarter);
 }

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/PerformanceOptimizerMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.performanceappraisal.mapper;
+
+import cn.com.ctop.performanceappraisal.entity.PerformanceOptimizer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 优化师绩效信息
+ *
+ * @author: jeecg-boot
+ * @date: 2019-12-13
+ * @cersion: V1.0
+ */
+public interface PerformanceOptimizerMapper extends BaseMapper<PerformanceOptimizer> {
+
+}

+ 5 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/OptimizerConfigMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.performanceappraisal.mapper.OptimizerConfigMapper">
+
+</mapper>

+ 5 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/OptimizerRoleInfoMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.performanceappraisal.mapper.OptimizerRoleInfoMapper">
+
+</mapper>

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

@@ -1,5 +1,180 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.performanceappraisal.mapper.PerformanceMapper">
+    <resultMap id="OptimizerTotalCostDetail" type="cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO">
+        <result column="realName" property="realName"/>
+        <result column="totalCost" property="totalCost"/>
+        <result column="year" property="year"/>
+        <result column="quarter" property="quarter"/>
+        <result column="userId" property="userId"/>
+        <result column="appType" property="appType"/>
+        <result column="projectId" property="projectId"/>
+        <result column="projectName" property="projectName"/>
+    </resultMap>
+    <select id="getOptimizerTotalCostDetailGroupByUserId" resultMap="OptimizerTotalCostDetail">
+        SELECT
+        sysUser.id as userId,sysUser.realname as realName,SUM(charge) as totalCost,#{year} AS year,#{quarter} as
+        quarter,2 as appType
+        FROM
+        ctop_kuaishou_report_daily_account dailiAccount
+        LEFT JOIN
+        ctop_user_allocation allocation ON dailiAccount.account_id = allocation.account_id
+        LEFT JOIN
+        sys_user_role userRole ON userRole.user_id = allocation.user_id
+        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
+        dailiAccount.stat_date &gt;= #{startDate}
+        AND
+        dailiAccount.stat_date &lt; #{endDate}
+        GROUP BY
+        sysUser.id
+        ORDER BY
+        SUM(charge) DESC
+        limit #{startIndex},#{pageSize}
+    </select>
 
+    <select id="getOptimizerTotalCostDetailGroupByAccountId" resultMap="OptimizerTotalCostDetail">
+        SELECT
+        dailiAccount.account_id,sysUser.id as userId,sysUser.realname as realName,SUM(charge) as totalCost,#{year} AS
+        year,#{quarter} as quarter,2 as appType
+        FROM
+        ctop_kuaishou_report_daily_account dailiAccount
+        LEFT JOIN
+        ctop_user_allocation allocation ON dailiAccount.account_id = allocation.account_id
+        LEFT JOIN
+        sys_user_role userRole ON userRole.user_id = allocation.user_id
+        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
+        dailiAccount.stat_date &gt;= #{startDate}
+        AND
+        dailiAccount.stat_date &lt; #{endDate}
+        GROUP BY
+        dailiAccount.account_id
+        ORDER BY
+        SUM(charge) DESC
+        limit #{startIndex},#{pageSize}
+    </select>
+
+    <select id="getUserOptimizerTotalCostGroupByProjectId" resultMap="OptimizerTotalCostDetail">
+        SELECT
+        allocation.project_id as projectId,allocation.project_name as projectName,dailiAccount.account_id,sysUser.id as
+        userId,sysUser.realname as realName,SUM(charge) as totalCost,#{year} AS year,#{quarter} as quarter,2 as appType
+        FROM
+        ctop_kuaishou_report_daily_account dailiAccount
+        LEFT JOIN
+        ctop_user_allocation allocation ON dailiAccount.account_id = allocation.account_id
+        LEFT JOIN
+        sys_user_role userRole ON userRole.user_id = allocation.user_id
+        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>
+        <if test="projectId != null">
+            and allocation.project_id = #{projectId}
+        </if>
+        AND
+        dailiAccount.stat_date &gt;= #{startDate}
+        AND
+        dailiAccount.stat_date &lt; #{endDate}
+        GROUP BY
+        allocation.project_id
+        ORDER BY
+        SUM(charge) DESC
+        limit #{startIndex},#{pageSize}
+    </select>
+    <select id="getUserOptimizerTotalCostGroupByAccountId" resultMap="OptimizerTotalCostDetail">
+        SELECT
+        allocation.project_id as projectId,allocation.project_name as projectName,dailiAccount.account_id,sysUser.id as
+        userId,sysUser.realname as realName,SUM(charge) as totalCost,#{year} AS year,#{quarter} as quarter,2 as appType
+        FROM
+        ctop_kuaishou_report_daily_account dailiAccount
+        LEFT JOIN
+        ctop_user_allocation allocation ON dailiAccount.account_id = allocation.account_id
+        LEFT JOIN
+        sys_user_role userRole ON userRole.user_id = allocation.user_id
+        LEFT JOIN
+        sys_user sysUser ON sysUser.id = userRole.user_id
+        WHERE
+        1=1
+        and
+        userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771'
+        <if test="projectId != null">
+            and allocation.project_id = #{projectId}
+        </if>
+        <if test="userId != null">
+            and sysUser.id = #{userId}
+        </if>
+        AND
+        dailiAccount.stat_date &gt;= #{startDate}
+        AND
+        dailiAccount.stat_date &lt; #{endDate}
+        GROUP BY
+        allocation.account_id
+        ORDER BY
+        SUM(charge) DESC
+        limit #{startIndex},#{pageSize}
+    </select>
+
+    <select id="getOptimizerTotalCost" resultMap="OptimizerTotalCostDetail">
+        SELECT
+            '账户总计' as realname,SUM(charge) as totalCost,#{year} AS year,#{quarter} as quarter,2 as appType
+        FROM
+            ctop_kuaishou_report_daily_account dailiAccount
+        LEFT JOIN
+            ctop_user_allocation allocation ON dailiAccount.account_id = allocation.account_id
+        LEFT JOIN
+            sys_user_role userRole ON userRole.user_id = allocation.user_id
+        LEFT JOIN
+            sys_user sysUser ON sysUser.id = userRole.user_id
+        WHERE
+            userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771'
+        AND
+            dailiAccount.stat_date &gt;= #{startDate}
+        AND
+            dailiAccount.stat_date &lt; #{endDate}
+        GROUP BY userRole.role_id
+    </select>
+
+    <select id="getMemberPerformanceByUserId" resultMap="OptimizerTotalCostDetail">
+        SELECT
+            sysUser.id as userId,sysUser.realname as realName,SUM(charge) as totalCost,#{year} AS year,#{quarter} as quarter,2 as appType
+        FROM
+            ctop_kuaishou_report_daily_account dailiAccount
+        LEFT JOIN
+            ctop_user_allocation allocation ON dailiAccount.account_id = allocation.account_id
+        LEFT JOIN
+            sys_user_role userRole ON userRole.user_id = allocation.user_id
+        LEFT JOIN
+            sys_user sysUser ON sysUser.id = userRole.user_id
+		LEFT JOIN
+			ctop_optimizer_role_info roleInfo ON roleInfo.user_id = sysUser.id
+        WHERE
+            userRole.role_id = '79fba4f45f1b8e284af9c68311c6c771'
+		AND
+			roleInfo.belonger_id = #{userId}
+		AND
+            dailiAccount.stat_date &gt;= #{startDate}
+        AND
+            dailiAccount.stat_date &lt; #{endDate}
+        GROUP BY
+            sysUser.id
+        ORDER BY
+            SUM(charge) DESC
+
+    </select>
 </mapper>

+ 5 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/mapper/xml/PerformanceOptimizerMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.performanceappraisal.mapper.PerformanceOptimizerMapper">
+
+</mapper>

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IOptimizerConfigService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.performanceappraisal.service;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 优化师配置信息表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+public interface IOptimizerConfigService extends IService<OptimizerConfig> {
+    OptimizerConfig getEnabledConfigByMediaType(String mediaType);
+}

+ 18 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IOptimizerRoleInfoService.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.performanceappraisal.service;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerRoleInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * 优化师角色关系表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+public interface IOptimizerRoleInfoService extends IService<OptimizerRoleInfo> {
+
+    Map<String, Object> getmanagerDetail(Integer appType);
+}

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

@@ -0,0 +1,22 @@
+package cn.com.ctop.performanceappraisal.service;
+
+import cn.com.ctop.performanceappraisal.entity.PerformanceOptimizer;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * 优化师绩效信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+public interface IPerformanceOptimizerService extends IService<PerformanceOptimizer> {
+
+    Map<String, Object> getPerformanceDetail(String mediaType, Integer pageNo, Integer pageSize);
+
+    Map<String, Object> getRankingList(String mediaType, Integer pageNo, Integer pageSize);
+
+    Map<String, Object> getManagerPerformanceDetail(String mediaType);
+}

+ 21 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IPerformanceService.java

@@ -1,8 +1,13 @@
 package cn.com.ctop.performanceappraisal.service;
 
 import cn.com.ctop.performanceappraisal.entity.Performance;
+import cn.com.ctop.performanceappraisal.vo.DesignerCostDetailVO;
+import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 设计师季度绩效表
  *
@@ -11,5 +16,21 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @date 2019-12-10
  */
 public interface IPerformanceService extends IService<Performance> {
+    /**
+     * 1:根据角色获取用户当前季度的所有视频消耗相关数据
+     */
+    List<DesignerCostDetailVO> getTotalCostDetailByRoleId(String roleId);
+
+    /**
+     * 获取优化师总消耗数据信息
+     */
+    List<OptimizerCostDetailVO> getOptimizerTotalCostDetailGroupByUserId(String userId, Integer startIndex, Integer pageSize);
+
+    OptimizerCostDetailVO getOptimizerTotalCost();
+
+    Map<String, Object> getUserOptimizerProjectList(Integer pageNo, Integer pageSize);
+
+    Map<String, Object> getUserOptimizerAccountList(Long projectId, Integer pageNo, Integer pageSize);
 
+    List<OptimizerCostDetailVO> getMemberPerformanceByUserId();
 }

+ 26 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/OptimizerConfigServiceImpl.java

@@ -0,0 +1,26 @@
+package cn.com.ctop.performanceappraisal.service.impl;
+
+import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
+import cn.com.ctop.performanceappraisal.mapper.OptimizerConfigMapper;
+import cn.com.ctop.performanceappraisal.service.IOptimizerConfigService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 优化师配置信息表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+@Service
+public class OptimizerConfigServiceImpl extends ServiceImpl<OptimizerConfigMapper, OptimizerConfig> implements IOptimizerConfigService {
+
+    @Override
+    public OptimizerConfig getEnabledConfigByMediaType(String mediaType) {
+        QueryWrapper<OptimizerConfig> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("enabled", "1").eq("app_type", mediaType).orderByDesc("id").last(" limit 1");
+        return this.getOne(queryWrapper);
+    }
+}

+ 50 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/OptimizerRoleInfoServiceImpl.java

@@ -0,0 +1,50 @@
+package cn.com.ctop.performanceappraisal.service.impl;
+
+import cn.com.ctop.common.module.utils.ResultMapUtils;
+import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.performanceappraisal.entity.OptimizerRoleInfo;
+import cn.com.ctop.performanceappraisal.mapper.OptimizerRoleInfoMapper;
+import cn.com.ctop.performanceappraisal.mapper.PerformanceMapper;
+import cn.com.ctop.performanceappraisal.service.IOptimizerRoleInfoService;
+import cn.com.ctop.performanceappraisal.service.IPerformanceService;
+import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 优化师角色关系表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-17
+ */
+@Service
+public class OptimizerRoleInfoServiceImpl extends ServiceImpl<OptimizerRoleInfoMapper, OptimizerRoleInfo> implements IOptimizerRoleInfoService {
+    @Autowired
+    private IPerformanceService performanceService;
+    @Autowired
+    private PerformanceMapper performanceMapper;
+
+    @Override
+    public Map<String, Object> getmanagerDetail(Integer appType) {
+        Map<String, Object> result = new HashMap<>();
+        //        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser sysUser = new LoginUser();
+        sysUser.setId("fcb3fbf6192640adaadb2a7df9c02dae");
+        //1:查询媒体任务
+        OptimizerCostDetailVO totalCostVo = performanceService.getOptimizerTotalCost();
+        //查询经理所属人员任务完成信息列表
+        List<OptimizerCostDetailVO> detailVOS = performanceService.getMemberPerformanceByUserId();
+        result.put("data", detailVOS);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+        return result;
+    }
+}

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

@@ -0,0 +1,157 @@
+package cn.com.ctop.performanceappraisal.service.impl;
+
+import cn.com.ctop.common.module.utils.ResultMapUtils;
+import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
+import cn.com.ctop.performanceappraisal.entity.PerformanceOptimizer;
+import cn.com.ctop.performanceappraisal.mapper.PerformanceOptimizerMapper;
+import cn.com.ctop.performanceappraisal.service.IOptimizerConfigService;
+import cn.com.ctop.performanceappraisal.service.IPerformanceOptimizerService;
+import cn.com.ctop.performanceappraisal.service.IPerformanceService;
+import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.system.vo.LoginUser;
+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;
+
+/**
+ * 优化师绩效信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-13
+ */
+@Service
+public class PerformanceOptimizerServiceImpl extends ServiceImpl<PerformanceOptimizerMapper, PerformanceOptimizer> implements IPerformanceOptimizerService {
+    @Autowired
+    IPerformanceService performanceService;
+    @Autowired
+    private IOptimizerConfigService optimizerConfigService;
+
+    @Override
+    public Map<String, Object> getPerformanceDetail(String mediaType, Integer pageNo, Integer pageSize) {
+        Map<String, Object> result = new HashMap<>();
+        Integer startIndex = (pageNo - 1) * pageSize;
+        //查询当前登录人信息
+//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser sysUser = new LoginUser();
+        sysUser.setId("fcb3fbf6192640adaadb2a7df9c02dae");
+        //查询当前媒体配置信息
+        OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType(mediaType);
+        if (null == config) {
+            ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_OPTINIZER_CONFIG_IS_NULL.getCode());
+            return result;
+        }
+        //:查询当前用户截止到目前当前季度的消耗统计数据
+        List<OptimizerCostDetailVO> vos = performanceService.getOptimizerTotalCostDetailGroupByUserId(sysUser.getId(), startIndex, pageSize);
+        if (null == vos || vos.size() <= 0) {
+            ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_OPTINIZER_PERSONNAL_DATA_IS_NULL.getCode());
+            return result;
+        }
+        //2: 查询媒体季度任务完成情况
+        OptimizerCostDetailVO totalCostVo = performanceService.getOptimizerTotalCost();
+        OptimizerCostDetailVO detailVO = vos.get(0);
+        detailVO.setTotalRoyalty(getTotalRoyalty(config, detailVO, totalCostVo));
+        JSONObject detail = new JSONObject();
+        detail.put("realName", detailVO.getRealName());
+        detail.put("totalCost", detailVO.getTotalCost());
+        detail.put("totalRoyalty", detailVO.getTotalRoyalty());
+        detail.put("mediaTask", config.getMediaTask());
+        detail.put("personalTask", config.getPersonalTask());
+
+        detail.put("year", detailVO.getYear());
+        detail.put("quarter", detailVO.getQuarter());
+        detail.put("royaltyRatio", getRate(config, detailVO, totalCostVo).toString() + "‰");
+        result.put("userDetail", detail);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> getRankingList(String mediaType, Integer pageNo, Integer pageSize) {
+        Map<String, Object> result = new HashMap<>();
+        Integer startIndex = (pageNo - 1) * pageSize;
+        List<OptimizerCostDetailVO> vos = performanceService.getOptimizerTotalCostDetailGroupByUserId(null, startIndex, pageSize);
+        if (null == vos || vos.size() <= 0) {
+            ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_CRAWLER_APP_ELEMENT_IS_NULL.getCode());
+            return result;
+        }
+        //查询优化师系统设置数据
+        OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType("2");
+        //2: 查询媒体季度任务完成情况
+        OptimizerCostDetailVO totalCostVo = performanceService.getOptimizerTotalCost();
+        //3:计算单个优化师提成总额
+        List<OptimizerCostDetailVO> getDetailVos = new ArrayList<>();
+        if (null != vos && vos.size() > 0) {
+            for (OptimizerCostDetailVO vo : vos) {
+                vo.setTotalRoyalty(getTotalRoyalty(config, vo, totalCostVo));
+                getDetailVos.add(vo);
+            }
+        }
+        result.put("data", getDetailVos);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> getManagerPerformanceDetail(String mediaType) {
+        //获取经理相关信息
+        //查询当前登录人信息
+//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser sysUser = new LoginUser();
+        sysUser.setId("fcb3fbf6192640adaadb2a7df9c02dae");
+        //查询优化师系统设置数据
+        OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType("2");
+        //2: 查询媒体季度任务完成情况
+        OptimizerCostDetailVO totalCostVo = performanceService.getOptimizerTotalCost();
+        return null;
+    }
+
+    private BigDecimal getTotalRoyalty(OptimizerConfig config, OptimizerCostDetailVO vo, OptimizerCostDetailVO quarterCost) {
+        BigDecimal royalty = BigDecimal.ZERO;
+        //个人总消耗
+        BigDecimal totalCost = vo.getTotalCost();
+        //个人季度任务
+        BigDecimal personalTask = config.getPersonalTask();
+        //媒体季度任务
+        BigDecimal mediaTask = config.getMediaTask();
+        //个人任务未完成
+        if (totalCost.compareTo(personalTask) < 0) {
+            return royalty;
+        }
+        //季度任务未完成
+        if (totalCost.compareTo(mediaTask) < 0) {
+            return totalCost.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+        }
+
+        return totalCost.multiply(config.getMediaTaskFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal getRate(OptimizerConfig config, OptimizerCostDetailVO vo, OptimizerCostDetailVO quarterCost) {
+        BigDecimal royalty = BigDecimal.ZERO;
+        //个人总消耗
+        BigDecimal totalCost = vo.getTotalCost();
+        //个人季度任务
+        BigDecimal personalTask = config.getPersonalTask();
+        //媒体季度任务
+        BigDecimal mediaTask = config.getMediaTask();
+        //个人任务未完成
+        if (totalCost.compareTo(personalTask) < 0) {
+            return BigDecimal.ZERO;
+        }
+        //季度任务未完成
+        if (totalCost.compareTo(mediaTask) < 0) {
+            return config.getMediaTaskNoFinishRate().setScale(2, RoundingMode.HALF_UP);
+        }
+
+        return config.getMediaTaskFinishRate().setScale(2, RoundingMode.HALF_UP);
+    }
+}

+ 158 - 1
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/PerformanceServiceImpl.java

@@ -1,11 +1,26 @@
 package cn.com.ctop.performanceappraisal.service.impl;
 
-import cn.com.ctop.performanceappraisal.service.IPerformanceService;
+import cn.com.ctop.common.module.utils.ResultMapUtils;
+import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
 import cn.com.ctop.performanceappraisal.entity.Performance;
+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.IPerformanceService;
+import cn.com.ctop.performanceappraisal.vo.DesignerCostDetailVO;
+import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.*;
+
 /**
  * 设计师季度绩效表
  *
@@ -15,5 +30,147 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PerformanceServiceImpl extends ServiceImpl<PerformanceMapper, Performance> implements IPerformanceService {
+    @Autowired
+    private PerformanceMapper performanceMapper;
+    @Autowired
+    private PerformanceOptimizerMapper optimizerMapper;
+    @Autowired
+    private IOptimizerConfigService optimizerConfigService;
+    /**
+     * 计算设计岗位绩效逻辑
+     * 1:查询用户总消耗以及总视频数
+     * 2:查询视频有效率排行榜
+     * 3:根据视频有效率分配提点比例
+     * 4:计算个人总绩效
+     */
+    @Override
+    public List<DesignerCostDetailVO> getTotalCostDetailByRoleId(String roleId) {
+        return null;
+    }
+
+    @Override
+    public List<OptimizerCostDetailVO> getOptimizerTotalCostDetailGroupByUserId(String userId, Integer startIndex, Integer pageSize) {
+        Date date = new Date();
+        Date getDate = DateUtils.addDay(date, -1);
+        String startDate = DateUtils.getQuarterStartDate(getDate);
+        String endDate = DateUtils.getQuarterEndDate(getDate);
+        String year = DateUtils.getYear(getDate) + "";
+        String quarter = DateUtils.getQuarter(getDate) + "";
+        return performanceMapper.getOptimizerTotalCostDetailGroupByUserId(startDate, endDate, year, quarter, userId, startIndex, pageSize);
+    }
+
+    /**
+     * 计算优化师岗位绩效逻辑
+     * 1:查询所有优化师总消耗数据
+     * 2:查询媒体季度任务完成情况
+     * 3:计算单个优化师提成总额
+     */
+    public List<OptimizerCostDetailVO> getOptimizerPerformance() {
+        //1:查询所有优化师总消耗数据
+        List<OptimizerCostDetailVO> detailVOS = getOptimizerTotalCostDetailGroupByUserId(null, 1, 10);
+        //查询优化师系统设置数据
+        OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType("2");
+        //2: 查询媒体季度任务完成情况
+        OptimizerCostDetailVO totalCostVo = getOptimizerTotalCost();
+        //3:计算单个优化师提成总额
+        List<OptimizerCostDetailVO> getDetailVos = new ArrayList<>();
+        if (null != detailVOS && detailVOS.size() > 0) {
+            for (OptimizerCostDetailVO vo : detailVOS) {
+                vo.setTotalRoyalty(getTotalRoyalty(config, vo, totalCostVo));
+                PerformanceOptimizer optimizer = new PerformanceOptimizer(vo);
+                optimizerMapper.insert(optimizer);
+            }
+        }
+        return getDetailVos;
+    }
+
+    @Override
+    public OptimizerCostDetailVO getOptimizerTotalCost() {
+        Date date = new Date();
+        Date getDate = DateUtils.addDay(date, -1);
+        String startDate = DateUtils.getQuarterStartDate(getDate);
+        String endDate = DateUtils.getQuarterEndDate(getDate);
+        String year = DateUtils.getYear(getDate) + "";
+        String quarter = DateUtils.getQuarter(getDate) + "";
+        return performanceMapper.getOptimizerTotalCost(startDate, endDate, year, quarter);
+    }
+
+    @Override
+    public Map<String, Object> getUserOptimizerProjectList(Integer pageNo, Integer pageSize) {
+        Map<String, Object> result = new HashMap<>();
+        //        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser sysUser = new LoginUser();
+        sysUser.setId("fcb3fbf6192640adaadb2a7df9c02dae");
+        Integer startIndex = (pageNo - 1) * pageSize;
+        Date date = new Date();
+        Date getDate = DateUtils.addDay(date, -1);
+        String startDate = DateUtils.getQuarterStartDate(getDate);
+        String endDate = DateUtils.getQuarterEndDate(getDate);
+        String year = DateUtils.getYear(getDate) + "";
+        String quarter = DateUtils.getQuarter(getDate) + "";
+        List<OptimizerCostDetailVO> detailVOS = performanceMapper.getUserOptimizerTotalCostGroupByProjectId(startDate, endDate, year, quarter, sysUser.getId(), startIndex, pageSize, null);
+        result.put("data", detailVOS);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> getUserOptimizerAccountList(Long projectId, Integer pageNo, Integer pageSize) {
+        Map<String, Object> result = new HashMap<>();
+        //        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser sysUser = new LoginUser();
+        sysUser.setId("fcb3fbf6192640adaadb2a7df9c02dae");
+        Integer startIndex = (pageNo - 1) * pageSize;
+        Date date = new Date();
+        Date getDate = DateUtils.addDay(date, -1);
+        String startDate = DateUtils.getQuarterStartDate(getDate);
+        String endDate = DateUtils.getQuarterEndDate(getDate);
+        String year = DateUtils.getYear(getDate) + "";
+        String quarter = DateUtils.getQuarter(getDate) + "";
+        List<OptimizerCostDetailVO> detailVOS = performanceMapper.getUserOptimizerTotalCostGroupByAccountId(startDate, endDate, year, quarter, sysUser.getId(), startIndex, pageSize, projectId, null);
+        result.put("data", detailVOS);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+        return result;
+    }
+
+    @Override
+    public List<OptimizerCostDetailVO> getMemberPerformanceByUserId() {
+        Map<String, Object> result = new HashMap<>();
+        //        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser sysUser = new LoginUser();
+        sysUser.setId("fcb3fbf6192640adaadb2a7df9c02dae");
+        Date date = new Date();
+        Date getDate = DateUtils.addDay(date, -1);
+        String startDate = DateUtils.getQuarterStartDate(getDate);
+        String endDate = DateUtils.getQuarterEndDate(getDate);
+        String year = DateUtils.getYear(getDate) + "";
+        String quarter = DateUtils.getQuarter(getDate) + "";
+        List<OptimizerCostDetailVO> detailVOS = performanceMapper.getMemberPerformanceByUserId(startDate, endDate, year, quarter, sysUser.getId());
+        return detailVOS;
+    }
+
+    private BigDecimal getTotalRoyalty(OptimizerConfig config, OptimizerCostDetailVO vo, OptimizerCostDetailVO quarterCost) {
+        BigDecimal royalty = BigDecimal.ZERO;
+        //个人总消耗
+        BigDecimal totalCost = vo.getTotalCost();
+        //个人季度任务
+        BigDecimal personalTask = config.getPersonalTask();
+        //媒体季度任务
+        BigDecimal mediaTask = config.getMediaTask();
+        //媒体任务未完成提点
+        BigDecimal mediaTaskNoFinishRate = config.getMediaTaskNoFinishRate();
+        //媒体任务未完成提点
+        BigDecimal mediaTaskFinishRate = config.getMediaTaskFinishRate();
+        //个人任务未完成
+        if (totalCost.compareTo(personalTask) < 0) {
+            return royalty;
+        }
+        //季度任务未完成
+        if (totalCost.compareTo(mediaTask) < 0) {
+            return totalCost.multiply(mediaTaskNoFinishRate).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+        }
+
+        return totalCost.multiply(mediaTaskFinishRate).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+    }
 
 }

+ 25 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/vo/DesignerCostDetailVO.java

@@ -0,0 +1,25 @@
+package cn.com.ctop.performanceappraisal.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author jeecg-boot
+ */
+@Data
+public class DesignerCostDetailVO implements Serializable {
+    /**
+     * 设计师姓名
+     */
+    private String realName;
+    /**
+     * 视频总消耗
+     */
+    private BigDecimal totalCost;
+    /**
+     * 总视频数
+     */
+    private Long totalVideoNum;
+}

+ 47 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/vo/OptimizerCostDetailVO.java

@@ -0,0 +1,47 @@
+package cn.com.ctop.performanceappraisal.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author jeecg-boot
+ */
+
+@Data
+public class OptimizerCostDetailVO implements Serializable {
+    /**
+     * 优化师姓名
+     */
+    private String realName;
+    /**
+     * 账户总消耗
+     */
+    private BigDecimal totalCost;
+    /**
+     * 年
+     */
+    private String year;
+    /**
+     * 季度
+     */
+    private String quarter;
+    /**
+     * 总提成
+     */
+    private BigDecimal totalRoyalty;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 平台类型
+     */
+    private Integer appType;
+
+    private Long projectId;
+
+    private String projectName;
+
+}

+ 12 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/vo/OptimizerVO.java

@@ -0,0 +1,12 @@
+package cn.com.ctop.performanceappraisal.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OptimizerVO implements Serializable {
+    private Long id;
+    private String realName;
+    private String userId;
+}