Quellcode durchsuchen

Merge remote-tracking branch 'origin/test'

songyh vor 4 Jahren
Ursprung
Commit
4a6b7b33de
20 geänderte Dateien mit 613 neuen und 66 gelöschten Zeilen
  1. 2 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingService.java
  2. 5 4
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingServiceImpl.java
  3. 86 39
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
  4. 61 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/entity/BytedanceOperationLog.java
  5. 17 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/mapper/BytedanceOperationLogMapper.java
  6. 5 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/mapper/xml/BytedanceOperationLogMapper.xml
  7. 14 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/IBytedanceOperationLogService.java
  8. 19 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/impl/BytedanceOperationLogServiceImpl.java
  9. 1 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/impl/FileInfoServiceImpl.java
  10. 1 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/GetCampaignNum.java
  11. 30 17
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java
  12. 10 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java
  13. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceGeneralCopywriterController.java
  14. 102 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceVideoSlogenInfoController.java
  15. 120 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
  16. 30 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUser.java
  17. 4 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
  18. 56 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
  19. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
  20. 43 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

+ 2 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingService.java

@@ -9,13 +9,14 @@ import org.jeecg.modules.bytedance.advertise.vo.ByteDanceSearchVo;
 import org.jeecg.modules.bytedance.advertise.vo.PlanSearchVo;
 import org.jeecg.modules.bytedance.common.entity.CtopOauthToken;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
 public interface MarketingService {
     Result getBudget(CtopOauthToken token, List<Long> advertiser_ids);
 
-    Result updateBudget(CtopOauthToken token, String budgetMode, String budget);
+    Result updateBudget(CtopOauthToken token, String budgetMode, BigDecimal budget);
 
     Result selectCustomAudience(CtopOauthToken token);
 

+ 5 - 4
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.stereotype.Service;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.math.BigDecimal;
 import java.net.URI;
 import java.util.HashMap;
 import java.util.List;
@@ -83,7 +84,7 @@ public class MarketingServiceImpl implements MarketingService{
      * @return: java.util.Map<java.lang.String,java.lang.Object>
      */
     @Override
-    public Result updateBudget(CtopOauthToken token, String budgetMode, String budget) {
+    public Result updateBudget(CtopOauthToken token, String budgetMode, BigDecimal budget) {
         JSONObject params = new JSONObject();
         //广告主ID
         params.put("advertiser_id", token.getAccountId());
@@ -102,7 +103,7 @@ public class MarketingServiceImpl implements MarketingService{
             log.info("修改计划预算接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
             return Result.error(jsonObject.getString("message"));
         }
-        return Result.successMsg("修改计划预算成功",null);
+        return Result.successMsg("修改账户预算成功",null);
     }
 
 
@@ -891,12 +892,12 @@ public class MarketingServiceImpl implements MarketingService{
         String message = jsonObject.getString("message");
         if (null == code || !code.equals(0)) {
             log.info("获取行业类别信息接口异常==》accountId:{},message:{}", token.getAccountId(), message);
-            return Result.errorMsg(message);
+            return Result.error(message);
         }
         JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
         if (null == data || data.isEmpty()) {
             log.info("行业类别信息不存在==》accountId:{},message:{}", token.getAccountId(), message);
-            return Result.errorMsg("行业类别信息不存在");
+            return Result.error("行业类别信息不存在");
         }
 
         return Result.successMsg("行业类别信息获取成功",data);

+ 86 - 39
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java

@@ -145,22 +145,32 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 if(null == adId){
                     continue;
                 }
-                adDplinkInfo.setAdId(adId);
-                adDplinkInfo.setAccountId(strategy.getAccountId());
-                adDplinkInfo.setStatus(1);
-                adDplinkInfo.setStrategyId(strategy.getId());
-                adDplinkInfoService.save(adDplinkInfo);
+
                 //3:创建创意
                 JSONObject creativeParams = getCreativeParams(strategy,adId,video,token);
                 log.info("账户id:{};创意创建参数:{}",strategy.getAccountId(),creativeParams);
                 JSONObject creativeObject =  marketingService.creativeCreate(token,adId,creativeParams);
                 if(null!=creativeObject.getInteger("code")&&creativeObject.getInteger("code")!=0){
+                    List<Long> adIds = new ArrayList<>();
+                    adIds.add(adId);
+                    Result resultDeletePlan = marketingService.updPlanStatus(token,adIds,"delete");
+                    if (!resultDeletePlan.isSuccess()){
+                        log.info("广告计划删除失败:message==>{}",resultDeletePlan.getMessage());
+                    }
+
                     String message = creativeObject.getString("message");
                     Integer code = creativeObject.getInteger("code");
                     //创建创意失败
                     log.info("账户id:{};创意创建失败:code==>{};message==>{}",strategy.getAccountId(),code,message);
                     continue;
                 }
+
+                adDplinkInfo.setAdId(adId);
+                adDplinkInfo.setAccountId(strategy.getAccountId());
+                adDplinkInfo.setStatus(1);
+                adDplinkInfo.setStrategyId(strategy.getId());
+                adDplinkInfoService.save(adDplinkInfo);
+
                 BytedanceAiVideoCreativeLog creativeLog = new BytedanceAiVideoCreativeLog(strategy,adId,campaignId,video);
                 videoCreativeLogService.saveOrUpdate(creativeLog);
                 videoCnt --;
@@ -207,23 +217,30 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 if(null == adId){
                     continue;
                 }
-                adDplinkInfo.setAdId(adId);
-                adDplinkInfo.setAccountId(strategy.getAccountId());
-                adDplinkInfo.setStatus(1);
-                adDplinkInfo.setStrategyId(strategy.getId());
-                adDplinkInfoService.save(adDplinkInfo);
                 //3:创建创意
                 JSONObject creativeParams = getCreativeParams(strategy,adId,video,token);
                 log.info("创意创建参数:{}",creativeParams);
                 JSONObject creativeObject =  marketingService.creativeCreate(token,adId,creativeParams);
                 log.info("创意创建返回数据:{}",creativeObject);
                 if(null!=creativeObject.getInteger("code")&&creativeObject.getInteger("code")!=0){
+                    List<Long> adIds = new ArrayList<>();
+                    adIds.add(adId);
+                    Result resultDeletePlan = marketingService.updPlanStatus(token,adIds,"delete");
+                    if (!resultDeletePlan.isSuccess()){
+                        log.info("广告计划删除失败:message==>{}",resultDeletePlan.getMessage());
+                    }
                     String message = creativeObject.getString("message");
                     Integer code = creativeObject.getInteger("code");
                     //创建创意失败
                     log.info("账户id:{};创意创建失败:code==>{};message==>{}",strategy.getAccountId(),code,message);
                     continue;
                 }
+
+                adDplinkInfo.setAdId(adId);
+                adDplinkInfo.setAccountId(strategy.getAccountId());
+                adDplinkInfo.setStatus(1);
+                adDplinkInfo.setStrategyId(strategy.getId());
+                adDplinkInfoService.save(adDplinkInfo);
                 BytedanceAiVideoCreativeLog creativeLog = new BytedanceAiVideoCreativeLog(strategy,adId,campaignId,video);
                 videoCreativeLogService.saveOrUpdate(creativeLog);
                 videoCnt --;
@@ -368,6 +385,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             params.put("action_text",actionText);
         }
 
+        //搭配试玩素材url
         String playableUrl = strategy.getCreativePlayableUrl();
         if(!Check.isNull(playableUrl)){
             params.put("playable_url",playableUrl);
@@ -510,7 +528,9 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         //竞价策略 默认优先跑量
         params.put("flow_control_mode","FLOW_CONTROL_MODE_FAST");
         //投放范围
-        params.put("delivery_range",strategy.getAdDeliveryRange());
+        if(null!=strategy.getAdDeliveryRange()&&!"".equals(strategy.getAdDeliveryRange().trim())){
+            params.put("delivery_range",strategy.getAdDeliveryRange());
+        }
         if(!Check.isNull(strategy.getAdUnionVideoType())){
             params.put("union_video_type",strategy.getAdUnionVideoType());
         }
@@ -718,6 +738,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 params.put("exclude_flow_package",excludeFlowPackage);
             }
         }
+
         if(!Check.isNull(strategy.getAdPlatform())){
             String[] platform = strategy.getAdPlatform().split(",");
             if(platform.length>0){
@@ -825,6 +846,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         if(!Check.isNull(strategy.getAdAutoExtendEnabled())){
             params.put("auto_extend_enabled",strategy.getAdAutoExtendEnabled());
         }
+        //可放开定向
         if(!Check.isNull(strategy.getAdAutoExtendTargets())){
             String[] autoExtendTargets = strategy.getAdAutoExtendTargets().split(",");
             if(autoExtendTargets.length>0){
@@ -982,7 +1004,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         if(result.contains("{{序号}}")){
             //查询当天已有计划数量
             int i = adDplinkInfoService.getDpLinkInfoCount(strategy.getAccountId());
-            Long num = GetCampaignNum.getCampaignNameNum(strategy.getCampaignCnt(),strategy.getCampaignAdCnt(),i);
+            Long num = GetCampaignNum.getCampaignNameNum(strategy.getCampaignCnt(),strategy.getCampaignAdCnt(), i == 0 ? i+1 : i);
             result = result.replace("{{序号}}",String.valueOf(num));
         }
 
@@ -1069,6 +1091,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
      */
     @Override
     public Result updStaOrCpaOrBudgetById(UpdAdStaOrCpaOrBudget updAdStaOrCpaOrBudget) {
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(updAdStaOrCpaOrBudget.getAccountId()));
         //1-修改出价
         if (BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType())) {
             //查询计划预算
@@ -1105,6 +1128,16 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 }
             }
             aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(), updAdStaOrCpaOrBudget.getBudget(),updAdStaOrCpaOrBudget.getBudgetType());
+
+            //账户预算 同步 头条
+            //BUDGET_MODE_DAY-日预算
+            // BUDGET_MODE_INFINITE-不限
+            String accountBudgetMode = updAdStaOrCpaOrBudget.getBudgetType().equals("1") ? "BUDGET_MODE_INFINITE" : "BUDGET_MODE_DAY";
+            Result resultBudget = marketingService.updateBudget(token,accountBudgetMode,new BigDecimal(updAdStaOrCpaOrBudget.getBudget()));
+           /* if (!resultBudget.isSuccess()){
+                return Result.error(resultBudget.getMessage());
+            }*/
+
         }
         return Result.successMsg("修改"+(BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType()) ? "出价" : "预算")+"成功。",null);
     }
@@ -1314,7 +1347,9 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
      * @author zianY
      */
     @Override
+    @Transactional
     public Result addBytedanceStrategy(AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(aiBytedanceAdvertiserStrategy.getAccountId()));
         //预算金额不能低于当前已消费金额的105%
         QueryWrapper<RuleDataAccount> ruleDataAccountQueryWrapper = new QueryWrapper<>();
         ruleDataAccountQueryWrapper.eq("account_id",aiBytedanceAdvertiserStrategy.getAccountId());
@@ -1330,7 +1365,6 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             }
         }
 
-
         // 数据入库 string[] 转 string
         //商品卖点
         aiBytedanceAdvertiserStrategy.setCreativeProductSellingPoints(org.apache.commons.lang3.StringUtils.join(aiBytedanceAdvertiserStrategy.getProductSellingPoints(), ","));
@@ -1356,6 +1390,15 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
 
         aiBytedanceAdvertiserStrategyMapper.insert(aiBytedanceAdvertiserStrategy);
 
+
+        //账户预算 同步 头条
+        //BUDGET_MODE_DAY-日预算
+        // BUDGET_MODE_INFINITE-不限
+        String accountBudgetMode = aiBytedanceAdvertiserStrategy.getAccountBudgetMode().equals("1") ? "BUDGET_MODE_INFINITE" : "BUDGET_MODE_DAY";
+        Result resultBudget = marketingService.updateBudget(token,accountBudgetMode,aiBytedanceAdvertiserStrategy.getAccountBudget());
+       /* if (!resultBudget.isSuccess()){
+            return Result.error(resultBudget.getMessage());
+        }*/
         return Result.successMsg("新增成功。",aiBytedanceAdvertiserStrategy);
     }
 
@@ -1376,32 +1419,36 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     private IByteDanceAdvertisePlanService planService;
     @Override
     public void customCreativeSupplement(AiBytedanceAdvertiserStrategy strategy, Integer hour,String openUrl) {
-        Long customUnitCnt = strategy.getCampaignAdCnt()*strategy.getCampaignCnt();
-        Long unitNum = customUnitCnt * hour / 19;
-        log.info("{}当前时间内需要创建计划总数:{}", strategy.getAccountId(), unitNum);
-        //查询当前账户创建自定义类型计划数量
-        int unitCreateCnt = planService.queryToDayBuiltCount(strategy.getAccountId());
-        log.info("{}截止目前创建组总数:{}", strategy.getAccountId(), unitCreateCnt);
-        long remindCnt = unitNum - unitCreateCnt;
-        if (remindCnt >= 1) {
-            log.info("{}计划创建不足,剩余需要创建个数{},使用上新素材创建", strategy.getAccountId(), remindCnt);
-            //优先创建历史遗漏素材
-            remindCnt = this.createCreative(strategy, 1, remindCnt,openUrl);
-        }
-        if (remindCnt >= 1) {
-            log.info("{}计划创建不足,剩余需要创建个数{},使用历史遗漏素材创建", strategy.getAccountId(), remindCnt);
-            //优先创建历史遗漏素材
-            remindCnt = this.createCreative(strategy, 3, remindCnt,openUrl);
-        }
-        if (remindCnt >= 1) {
-            log.info("{}计划创建不足,剩余需要创建个数{},使用高质量素材创建", strategy.getAccountId(), remindCnt);
-            //高质量素材
-            remindCnt = this.createCreative(strategy, 2, remindCnt,openUrl);
-        }
-        if (remindCnt >= 1) {
-            //历史打捞素材
-            log.info("{}计划创建不足,剩余需要创建个数{},使用历史打捞素材创建", strategy.getAccountId(), remindCnt);
-            this.createCreative(strategy, 4, remindCnt,openUrl);
+        try{
+            Long customUnitCnt = strategy.getCampaignAdCnt()*strategy.getCampaignCnt();
+            Long unitNum = customUnitCnt * hour / 19;
+            log.info("{}当前时间内需要创建计划总数:{}", strategy.getAccountId(), unitNum);
+            //查询当前账户创建自定义类型计划数量
+            int unitCreateCnt = planService.queryToDayBuiltCount(strategy.getAccountId());
+            log.info("{}截止目前创建组总数:{}", strategy.getAccountId(), unitCreateCnt);
+            long remindCnt = unitNum - unitCreateCnt;
+            if (remindCnt >= 1) {
+                log.info("{}计划创建不足,剩余需要创建个数{},使用上新素材创建", strategy.getAccountId(), remindCnt);
+                //优先创建历史遗漏素材
+                remindCnt = this.createCreative(strategy, 1, remindCnt,openUrl);
+            }
+            if (remindCnt >= 1) {
+                log.info("{}计划创建不足,剩余需要创建个数{},使用历史遗漏素材创建", strategy.getAccountId(), remindCnt);
+                //优先创建历史遗漏素材
+                remindCnt = this.createCreative(strategy, 3, remindCnt,openUrl);
+            }
+            if (remindCnt >= 1) {
+                log.info("{}计划创建不足,剩余需要创建个数{},使用高质量素材创建", strategy.getAccountId(), remindCnt);
+                //高质量素材
+                remindCnt = this.createCreative(strategy, 2, remindCnt,openUrl);
+            }
+            if (remindCnt >= 1) {
+                //历史打捞素材
+                log.info("{}计划创建不足,剩余需要创建个数{},使用历史打捞素材创建", strategy.getAccountId(), remindCnt);
+                this.createCreative(strategy, 4, remindCnt,openUrl);
+            }
+        }catch (Exception e){
+            log.info(e.getMessage());
         }
     }
 

+ 61 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/entity/BytedanceOperationLog.java

@@ -0,0 +1,61 @@
+package org.jeecg.modules.bytedance.common.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 操作日志
+ * @author jeecg-boot
+ * @date   2021-06-17
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_bytedance_operation_log")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_bytedance_operation_log对象", description="操作日志")
+public class BytedanceOperationLog {
+    
+	/**id*/
+	@TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+	private Integer id;
+	/**原始数据*/
+	@Excel(name = "原始数据", width = 15)
+    @ApiModelProperty(value = "原始数据")
+	private Object oldData;
+	/**修改后的数据*/
+	@Excel(name = "修改后的数据", width = 15)
+    @ApiModelProperty(value = "修改后的数据")
+	private Object newData;
+	/**操作类型*/
+	@Excel(name = "操作类型", width = 15)
+    @ApiModelProperty(value = "操作类型")
+	private String operationType;
+	/**操作内容*/
+	@Excel(name = "操作内容", width = 15)
+    @ApiModelProperty(value = "操作内容")
+	private Object operationContent;
+	/**创建人id*/
+	@Excel(name = "创建人id", width = 15)
+    @ApiModelProperty(value = "创建人id")
+	private String createById;
+	/**创建时间*/
+	@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;
+}

+ 17 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/mapper/BytedanceOperationLogMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.bytedance.common.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.bytedance.common.entity.BytedanceOperationLog;
+
+/**
+ * 操作日志
+ * @author jeecg-boot
+ * 2021-06-17
+ * @version V1.0
+ */
+public interface BytedanceOperationLogMapper extends BaseMapper<BytedanceOperationLog> {
+
+}

+ 5 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/mapper/xml/BytedanceOperationLogMapper.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="org.jeecg.modules.bytedance.common.mapper.BytedanceOperationLogMapper">
+
+</mapper>

+ 14 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/IBytedanceOperationLogService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.bytedance.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.bytedance.common.entity.BytedanceOperationLog;
+
+/**
+ * 操作日志
+ * @author jeecg-boot
+ * 2021-06-17
+ * @version V1.0
+ */
+public interface IBytedanceOperationLogService extends IService<BytedanceOperationLog> {
+
+}

+ 19 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/impl/BytedanceOperationLogServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.bytedance.common.service.impl;
+
+import org.jeecg.modules.bytedance.common.entity.BytedanceOperationLog;
+import org.jeecg.modules.bytedance.common.mapper.BytedanceOperationLogMapper;
+import org.jeecg.modules.bytedance.common.service.IBytedanceOperationLogService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 操作日志
+ * @author jeecg-boot
+ * 2021-06-17
+ * @version V1.0
+ */
+@Service
+public class BytedanceOperationLogServiceImpl extends ServiceImpl<BytedanceOperationLogMapper, BytedanceOperationLog> implements IBytedanceOperationLogService {
+
+}

+ 1 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/impl/FileInfoServiceImpl.java

@@ -81,6 +81,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         String result = null;
         for(int i=0;i<3;i++){
             JSONObject resultObject = marketingService.getSuggestImageId(token, vid);
+            log.info("获取推荐封面返回结果:{}",resultObject);
             if(null==resultObject||null==resultObject.getInteger("code")||0!=resultObject.getInteger("code")){
                 continue;
             }

+ 1 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/GetCampaignNum.java

@@ -27,7 +27,7 @@ public class GetCampaignNum {
         // 整除 组 = 商
         Long count = yu != 0 ? zu.intValue()+1 : zu;
        // 账户配置中的组数量 < 当前 组序号
-        if (count.intValue() < campaignCnt){
+        if (count.intValue() <= campaignCnt){
             System.out.println("序号----------"+count);
         }else {
             System.out.println("序号-超过了最大值-----"+count);

+ 30 - 17
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java

@@ -73,6 +73,8 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
         DecimalFormat df = new DecimalFormat("0.00%");
         Map<String,Object> resultMap = new HashMap<>();
         double compare = 0;
+        double lastCost = 0;
+        double nowCost = 0;
         List<ReportCostVo> nowCostList = new ArrayList<>();
         List<ReportCostVo> lastCostList = new ArrayList<>();
 
@@ -88,34 +90,46 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
             // 账户 日报 阶段 数据
             nowCostList = bytedanceAdvertiserHourlyReportMapper.selectPlanCostInfoCount(accountId,null,startTime,endTime);
             lastCostList = bytedanceAdvertiserHourlyReportMapper.selectPlanCostInfoCount(accountId,null,lastTimeMap.get("lastTimeStart"),lastTimeMap.get("lastTimeEnd"));
+            //当前阶段 总花费
+            nowCost = nowCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
+            resultMap.put("nowCost", String.format("%.2f", nowCost));
+            //上阶段花费
+            lastCost = lastCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
+            resultMap.put("lastCost", String.format("%.2f", lastCost));
+            //环比 =(当前花费 - 上阶段 同时段 花费 )/ 上阶段花费
+            compare = (nowCost - lastCost) / lastCost;
+            //resultMap.put("compare", Double.isNaN(compare) ? "0" : df.format(compare));
+            resultMap.put("compare", new Double(lastCost).intValue() == 0 ? "0" : String.format("%.2f", compare*100));
+
         }else{
             // 账户 当前时间段数据
             nowCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfoStage(accountId,startTime,endTime);
+            //上阶段数据
+            lastCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfoStageLast(accountId,lastTimeMap.get("lastTimeStart"),lastTimeMap.get("lastTimeEnd"),null);
+            //计算环比 =(当前花费 - 上阶段 同时段 花费 )/ 上阶段花费
+            //获取 同时段 的花费
             ReportCostVo statHourVo = new ReportCostVo();
             if (nowCostList.size() > 0){
                 statHourVo = nowCostList.get(nowCostList.size()-1);
             }
-            //上阶段数据
-            lastCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfoStageLast(accountId,lastTimeMap.get("lastTimeStart"),lastTimeMap.get("lastTimeEnd"),statHourVo.getTime());
+            List<ReportCostVo> compareCost = bytedanceAdvertiserHourlyReportMapper.getReportCostInfoStageLast(accountId,lastTimeMap.get("lastTimeStart"),lastTimeMap.get("lastTimeEnd"),statHourVo.getTime());
+            double lastCompareCost = compareCost.stream().mapToDouble(ReportCostVo::getCost).sum();
+            //当前阶段 总花费
+            nowCost = nowCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
+            resultMap.put("nowCost", String.format("%.2f", nowCost));
+            //上阶段花费
+            lastCost = lastCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
+            resultMap.put("lastCost", String.format("%.2f", lastCost));
+            //环比 =(当前花费 - 上阶段 同时段 花费 )/ 上阶段花费
+            compare = (nowCost - lastCompareCost) / lastCompareCost;
+            //resultMap.put("compare", Double.isNaN(compare) ? "0" : df.format(compare));
+            resultMap.put("compare", new Double(lastCompareCost).intValue() == 0 ? "0" : String.format("%.2f", compare*100));
         }
 
         //更新时间
         List<ReportCostVo> updTimeList = nowCostList.stream().sorted(Comparator.comparing(ReportCostVo::getCreateTime)).collect(Collectors.toList());
         resultMap.put("updTime",Check.isNull(updTimeList) ? new Date() : updTimeList.get(0).getCreateTime());
 
-        //当前阶段 总花费
-        double nowCost = nowCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
-        resultMap.put("nowCost", String.format("%.2f", nowCost));
-
-        //上阶段花费
-        double lastCost = lastCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
-        resultMap.put("lastCost", String.format("%.2f", lastCost));
-
-        //环比 =(当前花费 - 上阶段花费 )/ 上阶段花费
-        compare = (nowCost - lastCost) / lastCost;
-        //resultMap.put("compare", Double.isNaN(compare) ? "0" : df.format(compare));
-        resultMap.put("compare", new Double(lastCost).intValue() == 0 ? "0" : String.format("%.2f", compare*100));
-
         //花费占比 = 花费 / 账户预算
         //获取账户预算
         QueryWrapper<AiBytedanceAdvertiserStrategy> strategyQueryWrapper = new QueryWrapper<>();
@@ -148,10 +162,8 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
             lastMap.put("costList",Arrays.asList());
         }
 
-
         resultMap.put("nowMap", nowMap);
         resultMap.put("lastMap", lastMap);
-
         return Result.successMsg("成功。",resultMap);
     }
 
@@ -225,6 +237,7 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
         if (!Check.isNull(reduceList)){
             reduceList.forEach(reduce ->{
                 ReportCostVo vo = new ReportCostVo();
+                vo.setStatDatetime(startTime);
                 vo.setTime(reduce);
                 vo.setConver("0");//转化成本
                 vo.setConvertNum(0);//转化数

+ 10 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java

@@ -140,6 +140,7 @@ public class AiBytedanceAdvertiserStrategyController {
 	@ApiOperation(value="头条智能投放账户配置信息表-编辑", notes="头条智能投放账户配置信息表-编辑")
 	@PutMapping(value = "/edit")
 	public Result<AiBytedanceAdvertiserStrategy> edit(@RequestBody AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
+		CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(aiBytedanceAdvertiserStrategy.getAccountId()));
 		//修改后预算金额不能低于当前已消费金额的105%
 		QueryWrapper<RuleDataAccount> ruleDataAccountQueryWrapper = new QueryWrapper<>();
 		ruleDataAccountQueryWrapper.eq("account_id",aiBytedanceAdvertiserStrategy.getAccountId());
@@ -176,6 +177,15 @@ public class AiBytedanceAdvertiserStrategyController {
 			if (!ok) {
 				return Result.errorMsg("修改失败!");
 			}
+			//账户预算 同步 头条
+			//BUDGET_MODE_DAY-日预算
+			// BUDGET_MODE_INFINITE-不限
+			String accountBudgetMode = aiBytedanceAdvertiserStrategy.getAccountBudgetMode().equals("1") ? "BUDGET_MODE_INFINITE" : "BUDGET_MODE_DAY";
+			Result resultBudget = marketingService.updateBudget(token,accountBudgetMode,aiBytedanceAdvertiserStrategy.getAccountBudget());
+			/*if (!resultBudget.isSuccess()){
+				return Result.errorMsg(resultBudget.getMessage());
+			}*/
+
 		}
 		return Result.successMsg("修改成功!", null);
 

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceGeneralCopywriterController.java

@@ -77,7 +77,7 @@ public class BytedanceGeneralCopywriterController {
                     int len = StringUtils.lengthAsSlogan(str);
                     int left = str.indexOf("{");
                     int right = str.indexOf("}");
-                    if(left >= 0 && right >= 0){
+                    if(left >= 0 || right >= 0){
                         List<String> strs = new ArrayList<>();
                         ByteDanceCreativeWordPackage creativeWordPackage = byteDanceGeneralCopywriterService.selectCreativeWordPackageByName(str.substring(left+1, right));
                         strs.add(creativeWordPackage.getCreativeWordId().toString());
@@ -85,7 +85,7 @@ public class BytedanceGeneralCopywriterController {
                         String nextStr = str.substring(right+1,str.length());
                         left = nextStr.indexOf("{");
                         right = nextStr.indexOf("}");
-                        if(left >= 0 && right >= 0){
+                        if(left >= 0 || right >= 0){
                             ByteDanceCreativeWordPackage creativeWordPackage2 = byteDanceGeneralCopywriterService.selectCreativeWordPackageByName(nextStr.substring(left+1, right));
                             strs.add(creativeWordPackage2.getCreativeWordId().toString());
                             len = len - (right - left) + creativeWordPackage2.getMaxWordLen();

+ 102 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceVideoSlogenInfoController.java

@@ -12,20 +12,26 @@ import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.bytedance.advertise.entity.ByteDanceCreativeWordPackage;
 import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
+import org.jeecg.modules.bytedance.advertise.service.IByteDanceGeneralCopywriterService;
 import org.jeecg.modules.bytedance.advertise.service.IBytedanceVideoSlogenInfoService;
 import org.jeecg.modules.bytedance.advertise.service.impl.BytedanceVideoSlogenInfoServiceImpl;
 import org.jeecg.modules.bytedance.common.entity.MaterialInfo;
 import org.jeecg.modules.bytedance.common.service.IMaterialInfoService;
 import org.jeecg.modules.bytedance.common.utils.Check;
+import org.jeecg.modules.bytedance.common.utils.StringUtils;
 import org.jeecg.modules.system.service.ISysRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 头条视频文案信息
@@ -44,6 +50,8 @@ public class BytedanceVideoSlogenInfoController {
 	private IMaterialInfoService materialInfoService;
 	@Autowired
 	private ISysRoleService sysRoleService;
+	@Autowired
+	private IByteDanceGeneralCopywriterService byteDanceGeneralCopywriterService;
 	/**
 	  * 分页列表查询
 	 * @param slogenInfo
@@ -119,7 +127,7 @@ public class BytedanceVideoSlogenInfoController {
 	 *   添加
 	 * @param
 	 * @param
-	 * @param userId
+	 * @param
 	 * @return
 	 */
 	@ApiOperation(value="头条视频文案信息-批量添加", notes="头条视频文案信息-批量添加")
@@ -129,6 +137,50 @@ public class BytedanceVideoSlogenInfoController {
 		try {
 			String userId = materialInfo.getUserId();
 			JSONArray slogenArray = materialInfo.getSlogans();
+			for (int i = 0;i<slogenArray.size();i++) {
+				JSONObject slogenInfo = slogenArray.getJSONObject(i);
+				String title = slogenInfo.getString("title");
+				title = title.trim().replaceAll("[\\{]{2,}","{");
+				title = title.trim().replaceAll("[\\}]{2,}","}");
+                slogenInfo.put("title",title);
+				String reg = "\\{[\\u4e00-\\u9fa5\\-]{2,6}\\}";
+				Pattern pattern = Pattern.compile(reg);
+				Matcher matcher = pattern.matcher(title);
+				JSONArray creativeWordIdsArray = new JSONArray();
+
+				int len = StringUtils.lengthAsSlogan(title);
+				int left = title.indexOf("{");
+				int right = title.indexOf("}");
+				if(left >= 0 || right >= 0){
+				int times = 0;
+					while (matcher.find()) { //此处find()每次被调用后,会偏移到下一个匹配
+						times++;
+						if(times>=3){
+							return  Result.errorMsg("动态词包不合法,词包数量超过2个");
+						}
+						String matchStr = matcher.group();//获取当前匹配的值
+						title = title.replace(matchStr,"");
+
+						ByteDanceCreativeWordPackage creativeWordPackage = byteDanceGeneralCopywriterService.selectCreativeWordPackageByName(matchStr.substring(1,matchStr.length()-1));
+						if(Check.isNull(creativeWordPackage)){
+							return  Result.errorMsg("动态词包不合法,词包不存在或者含有单独的非词包大括号");
+						}
+						creativeWordIdsArray.add(creativeWordPackage.getCreativeWordId());
+						len = len - (right - left) + creativeWordPackage.getMaxWordLen();
+						left = title.indexOf("{");
+						right = title.indexOf("}");
+					}
+					if(title.contains("{") || title.contains("}")){
+						return result.error500("大括号单独出现或大括号中内容不合法");
+					}
+					slogenInfo.put("creative_word_ids",creativeWordIdsArray.toJSONString());
+				}
+				//校验标题长度,长度小于5和大于30的全部过滤
+				if(len<5 || len>30){
+					return result.error500("文案长度不合法,小于5或大于30");
+				}
+			}
+
 			JSONArray materialIds = materialInfo.getMaterialIds();
 			for(int i=0;i<materialIds.size();i++){
 				MaterialInfo materialInfo2 = materialInfoService.getById(materialIds.get(i).toString());
@@ -155,6 +207,7 @@ public class BytedanceVideoSlogenInfoController {
 	@PostMapping(value = "/edit")
 	public Result<BytedanceVideoSlogenInfo> edit(@RequestBody BytedanceVideoSlogenInfo slogenInfo) {
 		Result<BytedanceVideoSlogenInfo> result = new Result<>();
+		try{
 		BytedanceVideoSlogenInfo bytedanceVideoSlogenInfoEntity = bytedanceVideoSlogenInfoService.getById(slogenInfo.getId());
 		if(bytedanceVideoSlogenInfoEntity==null) {
 			result.error500("未找到对应实体");
@@ -163,9 +216,57 @@ public class BytedanceVideoSlogenInfoController {
 		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
 		slogenInfo.setUpdateBy(user.getId());
 		slogenInfo.setUpdateTime(new Date());
+
+		String title = slogenInfo.getSlogan();
+		title = title.trim().replaceAll("[\\{]{2,}", "{");
+		title = title.trim().replaceAll("[\\}]{2,}", "}");
+
+		String reg = "\\{[\\u4e00-\\u9fa5\\-]{2,6}\\}";
+		Pattern pattern = Pattern.compile(reg);
+		Matcher matcher = pattern.matcher(title);
+		JSONArray creativeWordIdsArray = new JSONArray();
+
+		int len = StringUtils.lengthAsSlogan(title);
+		int left = title.indexOf("{");
+		int right = title.indexOf("}");
+		if (left >= 0 || right >= 0) {
+			int times = 0;
+			while (matcher.find()) { //此处find()每次被调用后,会偏移到下一个匹配
+				times++;
+				if (times >= 3) {
+					return Result.errorMsg("动态词包不合法,词包数量超过2个");
+				}
+				String matchStr = matcher.group();//获取当前匹配的值
+				title = title.replace(matchStr,"");
+
+				ByteDanceCreativeWordPackage creativeWordPackage = byteDanceGeneralCopywriterService.selectCreativeWordPackageByName(matchStr.substring(1, matchStr.length() - 1));
+				if (Check.isNull(creativeWordPackage)) {
+					return Result.errorMsg("动态词包不合法,词包不存在或者含有单独的非词包大括号");
+				}
+				creativeWordIdsArray.add(creativeWordPackage.getCreativeWordId());
+				len = len - (right - left) + creativeWordPackage.getMaxWordLen();
+				left = title.indexOf("{");
+				right = title.indexOf("}");
+			}
+			if(title.contains("{") || title.contains("}")){
+				return result.error500("文案含有词包特殊字符,请检查");
+			}
+			slogenInfo.setCreativeWordIds(creativeWordIdsArray.toJSONString());
+		}
+		//校验标题长度,长度小于5和大于30的全部过滤
+		if (len < 5 || len > 30) {
+			return result.error500("文案长度不合法,小于5或大于30");
+		}
+
 		bytedanceVideoSlogenInfoService.updateById(slogenInfo);
 		result.success("修改成功!");
+		result.setCode(0);
 		return result;
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+			return result;
+		}
 	}
 
 	/**

+ 120 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java

@@ -10,6 +10,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
@@ -24,6 +28,8 @@ import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.*;
+import org.jeecg.modules.bytedance.advertise.vo.IndustryVo;
+import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.system.entity.*;
 import org.jeecg.modules.system.model.DepartIdModel;
 import org.jeecg.modules.system.model.SysUserSysDepartModel;
@@ -57,6 +63,7 @@ import java.util.stream.Collectors;
  * @Author scott
  * @since 2018-12-20
  */
+@Api(tags="用户管理")
 @Slf4j
 @RestController
 @RequestMapping("/sys/user")
@@ -93,7 +100,8 @@ public class SysUserController {
 
     @Resource
     private BaseCommonService baseCommonService;
-
+    @Autowired
+    private ISysRoleService sysRoleService;
     /**
      * 获取用户列表数据
      * @param user
@@ -129,6 +137,117 @@ public class SysUserController {
 		return result;
 	}
 
+
+    /**
+     * 获取用户列表数据
+     *
+     * @param user
+     * @param pageNo
+     * @param pageSize
+     * @param
+     * @return
+     */
+    @ApiOperation(value="用户管理(运营)", notes="用户管理(运营)")
+    @RequestMapping(value = "/listV2", method = RequestMethod.GET)
+    public Result<Object> queryPageListV2(SysUser user, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+
+            String userId = user.getId();
+            String roleCode = sysRoleService.getRoleCodeByUserId(userId);
+            if (Check.isNull(roleCode)){
+                return Result.errorMsg("请输入正确的用户id。");
+            }
+            //角色为 管理员并且projectId是空表示:全量查询
+
+            if (!"admin".equals(roleCode)) {
+                List<SysUser> list = sysUserService.queryPageList(user);
+                //1.根据搜索框过滤数据
+                if(!Check.isNull(user.getUsername())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        if(!it.next().getUsername().contains(user.getUsername())) {
+                            it.remove();
+                        }
+                    }
+                }
+                if(!Check.isNull(user.getRealname())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        if(!it.next().getRealname().contains(user.getRealname())) {
+                            it.remove();
+                        }
+                    }
+                }
+                if(!Check.isNull(user.getLeaderName())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        if(!it.next().getLeaderName().contains(user.getLeaderName())) {
+                            it.remove();
+                        }
+                    }
+                }
+                if(!Check.isNull(user.getRoleName())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        if(!it.next().getRoleName().contains(user.getRoleName())) {
+                            it.remove();
+                        }
+                    }
+                }
+                if(!Check.isNull(user.getDepartId())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        SysUser user2 = it.next();
+                        if(Check.isNull(user2.getDepartId2()) || !user2.getDepartId2().equals(user.getDepartId())) {
+                            it.remove();
+                        }
+                    }
+                }
+                if(!Check.isNull(user.getEmail())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        if(!it.next().getEmail().contains(user.getEmail())) {
+                            it.remove();
+                        }
+                    }
+                }
+                if(!Check.isNull(user.getStatus())){
+                    Iterator<SysUser> it = list.iterator();
+                    while(it.hasNext()){
+                        if(!it.next().getStatus().equals(user.getStatus())) {
+                            it.remove();
+                        }
+                    }
+                }
+                //2.根据分页页数和条数来筛选数据
+                int total = list.size();
+                int beginIndex = (pageNo - 1) * pageSize + 1;
+                int endIndex = beginIndex + pageSize;
+                if(list.size() > beginIndex){
+                    list = list.subList(beginIndex-1,list.size() > endIndex ? endIndex : list.size());
+                }
+
+                PageInfo<SysUser> pageInfo = new PageInfo<>(list);
+                pageInfo.setTotal(total);
+                return Result.ok(pageInfo);
+            }else{
+                user.setId(null);
+                PageHelper.startPage(pageNo, pageSize);
+                List<SysUser> list = sysUserService.queryAdminPageList(user);
+                PageInfo<SysUser> pageInfo = new PageInfo<>(list);
+                return Result.ok(pageInfo);
+            }
+
+
+        } catch (Exception e) {
+            log.error("获取用户列表数据-分页列表查询异常", e);
+        }
+        return Result.error("查询失败");
+    }
+
+
+
     //@RequiresRoles({"admin"})
     //@RequiresPermissions("user:add")
 	@RequestMapping(value = "/add", method = RequestMethod.POST)

+ 30 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUser.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.system.entity;
 
 import java.util.Date;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -40,6 +41,10 @@ public class SysUser implements Serializable {
     @TableId(type = IdType.ASSIGN_ID)
     private String id;
 
+    private String departId;
+
+    private String departId2;
+
     /**
      * 登录账号
      */
@@ -182,4 +187,29 @@ public class SysUser implements Serializable {
 
     /**设备id uniapp推送用*/
     private String clientId;
+
+    /**
+     * 领导 ID
+     */
+    private String leaderId;
+
+    /**
+     * 领导姓名
+     */
+    private String leaderName;
+
+    /**
+     * 角色
+     */
+    @TableField(exist = false)
+    private String roleName;
+
+    /**
+     * 组织机构名称
+     */
+    @TableField(exist = false)
+    private String departName;
+
+
+
 }

+ 4 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java

@@ -139,4 +139,8 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
 	 * @return
 	 */
 	List<SysUser> queryByDepIds(@Param("departIds")List<String> departIds,@Param("username") String username);
+
+	List<SysUser> queryPageList(SysUser user);
+
+	List<SysUser> selectAllUser();
 }

+ 56 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml

@@ -162,4 +162,60 @@
 			and username != #{username}
 		</if>
 	</select>
+
+	<!-- 查询用户列表-->
+	<select id="queryPageList" resultType="org.jeecg.modules.system.entity.SysUser">
+		SELECT t4.* from (
+		SELECT t1.*,t3.depart_name ,role.role_name,t2.create_time AS updTime,t3.id as departId2
+		FROM sys_user t1
+		LEFT JOIN sys_user_depart t2 ON t1.id = t2.user_id
+		LEFT JOIN sys_depart t3 ON t2.dep_id = t3.id
+		LEFT JOIN sys_user_role userRole ON t1.id = userRole.user_id
+		LEFT JOIN sys_role role ON userRole.role_id = role.id
+		where t1.del_flag = 0
+		<if test="realname != null and realname != ''">
+			AND t1.realname LIKE CONCAT(CONCAT('%',#{realname}),'%')
+		</if>
+		<if test="username != null and username != ''">
+			AND t1.username LIKE CONCAT(CONCAT('%',#{username}),'%')
+		</if>
+		<if test="email != null and email != ''">
+			AND t1.email LIKE CONCAT(CONCAT('%',#{email}),'%')
+		</if>
+		<if test="phone != null and phone != ''">
+			AND t1.phone LIKE CONCAT(CONCAT('%',#{phone}),'%')
+		</if>
+		<if test="status != null and status != ''">
+			AND t1.`status` = #{status}
+		</if>
+		<if test="leaderName != null and leaderName != ''">
+			AND t1.leader_name LIKE CONCAT(CONCAT('%',#{leaderName}),'%')
+		</if>
+		<if test="departId != null and departId != ''">
+			AND t3.id =#{departId}
+		</if>
+		<if test="roleName != null and roleName != ''">
+			AND role.role_name LIKE CONCAT(CONCAT('%',#{roleName}),'%')
+		</if>
+		<if test="sex != null and sex != ''">
+			AND t1.sex =#{sex}
+		</if>
+		<if test="id != null and id!=''">
+			and t1.id = #{id}
+		</if>
+
+		) t4
+		GROUP BY t4.id
+	</select>
+
+	<select id="selectAllUser" resultType="org.jeecg.modules.system.entity.SysUser">
+		SELECT t1.*,t3.depart_name ,role.role_name,t2.create_time AS updTime,t3.id as departId2
+		FROM sys_user t1
+		LEFT JOIN sys_user_depart t2 ON t1.id = t2.user_id
+		LEFT JOIN sys_depart t3 ON t2.dep_id = t3.id
+		LEFT JOIN sys_user_role userRole ON t1.id = userRole.user_id
+		LEFT JOIN sys_role role ON userRole.role_id = role.id
+		where t1.del_flag = 0
+	</select>
+
 </mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@@ -233,4 +233,9 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @return
 	 */
 	List<SysUser> queryByDepIds(List<String> departIds, String username);
+
+	List<SysUser> queryPageList(SysUser user);
+
+	List<SysUser> queryAdminPageList(SysUser user);
+
 }

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

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CacheConstant;
@@ -16,6 +18,7 @@ import org.jeecg.common.system.vo.SysUserCacheInfo;
 import org.jeecg.common.util.PasswordUtil;
 import org.jeecg.common.util.UUIDGenerator;
 import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.system.entity.*;
 import org.jeecg.modules.system.mapper.*;
 import org.jeecg.modules.system.model.SysUserSysDepartModel;
@@ -439,4 +442,44 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		return userMapper.queryByDepIds(departIds,username);
 	}
 
+
+	@Override
+	public List<SysUser> queryPageList(SysUser user) {
+		SysUser sysUser = queryUserInfoById(user.getId());
+		if(Check.isNull(sysUser.getLeaderId())){
+			List<SysUser>  mulUserList = new ArrayList<>();
+			mulUserList.add(sysUser);
+			return mulUserList;
+		}
+		List<SysUser> allList = userMapper.selectAllUser();
+		List<SysUser>  mulUserList = treeCategoryData(allList, sysUser.getId());
+		mulUserList.add(sysUser);
+		return mulUserList;
+	}
+
+	@Override
+	public List<SysUser> queryAdminPageList(SysUser user) {
+		return userMapper.queryPageList(user);
+	}
+
+
+	public SysUser queryUserInfoById(String id){
+		SysUser nullValueUser = new SysUser();
+		nullValueUser.setId(id);
+		List<SysUser> mulUserList = userMapper.queryPageList(nullValueUser);
+		return Check.isNull(mulUserList) ? null : mulUserList.get(0);
+	}
+
+	public List<SysUser> treeCategoryData(List<SysUser> allList, String leaderId) {
+		List<SysUser> mapList = new ArrayList<>();
+		for (SysUser vo : allList) {
+			if (leaderId.equals(vo.getLeaderId())){
+				mapList.add(vo);
+				mapList.addAll(treeCategoryData(allList,vo.getId()));
+			}
+		}
+		return mapList;
+
+	}
+
 }