Ver código fonte

Merge branch 'master' of http://git.mokasz.com/marketing/moka-private

# Conflicts:
#	pom.xml
yang G 5 anos atrás
pai
commit
432cdd7ec1
76 arquivos alterados com 3696 adições e 64 exclusões
  1. 13 0
      pom.xml
  2. 0 22
      src/main/java/com/mokamrp/privates/config/CorsConfig.java
  3. 1 1
      src/main/java/com/mokamrp/privates/config/DataHubConfiguration.java
  4. 15 0
      src/main/java/com/mokamrp/privates/config/RequestConfig.java
  5. 13 0
      src/main/java/com/mokamrp/privates/constant/RedisKey.java
  6. 36 10
      src/main/java/com/mokamrp/privates/controller/BaseController.java
  7. 92 4
      src/main/java/com/mokamrp/privates/controller/pangu/CustserviceController.java
  8. 47 0
      src/main/java/com/mokamrp/privates/controller/pangu/CustserviceGroupController.java
  9. 37 0
      src/main/java/com/mokamrp/privates/controller/pangu/DomainFirstController.java
  10. 95 0
      src/main/java/com/mokamrp/privates/controller/pangu/DomainSecondController.java
  11. 48 0
      src/main/java/com/mokamrp/privates/controller/pangu/PlaybillController.java
  12. 46 0
      src/main/java/com/mokamrp/privates/controller/pangu/PlaybillGroupController.java
  13. 129 0
      src/main/java/com/mokamrp/privates/controller/pangu/PromoteCodeController.java
  14. 163 0
      src/main/java/com/mokamrp/privates/controller/pangu/PromoteQrcodePoolController.java
  15. 17 0
      src/main/java/com/mokamrp/privates/entity/pangu/CustserviceGroupListHandle.java
  16. 21 0
      src/main/java/com/mokamrp/privates/entity/pangu/CustserviceListHandle.java
  17. 17 0
      src/main/java/com/mokamrp/privates/entity/pangu/PlaybillGroupListHandle.java
  18. 20 0
      src/main/java/com/mokamrp/privates/entity/pangu/PlaybillListHandle.java
  19. 19 0
      src/main/java/com/mokamrp/privates/entity/pangu/PromoteCodeListHandle.java
  20. 20 0
      src/main/java/com/mokamrp/privates/entity/pangu/SetPromoteQrcodeHandle.java
  21. 27 11
      src/main/java/com/mokamrp/privates/interceptor/AuthIntercepotor.java
  22. 22 0
      src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceGroupMapper.java
  23. 22 0
      src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceGroupMapper.xml
  24. 7 1
      src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceMapper.java
  25. 11 0
      src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceMapper.xml
  26. 16 0
      src/main/java/com/mokamrp/privates/mapper/pangu/DomainFirstMapper.java
  27. 22 0
      src/main/java/com/mokamrp/privates/mapper/pangu/DomainFirstMapper.xml
  28. 16 0
      src/main/java/com/mokamrp/privates/mapper/pangu/DomainSecondMapper.java
  29. 22 0
      src/main/java/com/mokamrp/privates/mapper/pangu/DomainSecondMapper.xml
  30. 23 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillGroupMapper.java
  31. 22 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillGroupMapper.xml
  32. 23 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillMapper.java
  33. 30 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillMapper.xml
  34. 27 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PromoteCodeMapper.java
  35. 42 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PromoteCodeMapper.xml
  36. 24 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PromoteQrcodePoolMapper.java
  37. 42 0
      src/main/java/com/mokamrp/privates/mapper/pangu/PromoteQrcodePoolMapper.xml
  38. 12 8
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/Custservice.java
  39. 84 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/CustserviceGroup.java
  40. 133 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/CustserviceVo.java
  41. 147 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/DomainFirst.java
  42. 147 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/DomainSecond.java
  43. 135 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/Playbill.java
  44. 84 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PlaybillGroup.java
  45. 176 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteCode.java
  46. 192 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteCodeVo.java
  47. 117 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteQrcodePool.java
  48. 129 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteQrcodePoolVo.java
  49. 18 0
      src/main/java/com/mokamrp/privates/service/pangu/CustserviceGroupService.java
  50. 7 1
      src/main/java/com/mokamrp/privates/service/pangu/CustserviceService.java
  51. 16 0
      src/main/java/com/mokamrp/privates/service/pangu/DomainFirstService.java
  52. 16 0
      src/main/java/com/mokamrp/privates/service/pangu/DomainSecondService.java
  53. 19 0
      src/main/java/com/mokamrp/privates/service/pangu/PlaybillGroupService.java
  54. 19 0
      src/main/java/com/mokamrp/privates/service/pangu/PlaybillService.java
  55. 26 0
      src/main/java/com/mokamrp/privates/service/pangu/PromoteCodeService.java
  56. 27 0
      src/main/java/com/mokamrp/privates/service/pangu/PromoteQrcodePoolService.java
  57. 39 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/CustserviceGroupServiceImpl.java
  58. 68 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/CustserviceServiceImpl.java
  59. 20 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/DomainFirstServiceImpl.java
  60. 20 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/DomainSecondServiceImpl.java
  61. 39 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/PlaybillGroupServiceImpl.java
  62. 38 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/PlaybillServiceImpl.java
  63. 99 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteCodeServiceImpl.java
  64. 98 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteQrcodePoolServiceImpl.java
  65. 56 0
      src/main/java/com/mokamrp/privates/tast/pangu/CheckH5DomainStatus.java
  66. 236 0
      src/main/java/com/mokamrp/privates/tast/pangu/CheckWxDomainStatus.java
  67. 47 0
      src/main/java/com/mokamrp/privates/tast/pangu/PlaybillQrcodeXYTask.java
  68. 45 0
      src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceDayViewTask.java
  69. 53 0
      src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceViewTask.java
  70. 20 0
      src/main/java/com/mokamrp/privates/utils/Cmd.java
  71. 12 0
      src/main/java/com/mokamrp/privates/utils/http/HttpResponsePojo.java
  72. 48 0
      src/main/java/com/mokamrp/privates/utils/http/HttpUtils.java
  73. 2 2
      src/main/resources/application-local.properties
  74. 1 1
      src/main/resources/application-prod.properties
  75. 2 2
      src/main/resources/application-test.properties
  76. 2 1
      src/test/java/com/mokamrp/AutoMPPangu.java

+ 13 - 0
pom.xml

@@ -140,6 +140,19 @@
             <artifactId>poi-ooxml</artifactId>
             <version>3.16</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
+        <dependency>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-compiler-plugin</artifactId>
+            <version>3.5</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-maven-plugin -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-maven-plugin</artifactId>
+            <version>2.5.0</version>
+        </dependency>
+
     </dependencies>
     <profiles>
         <!--        <profile>-->

+ 0 - 22
src/main/java/com/mokamrp/privates/config/CorsConfig.java

@@ -1,22 +0,0 @@
-package com.mokamrp.privates.config;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-/**
- * 跨域配置文件
- */
-@Configuration
-public class CorsConfig implements WebMvcConfigurer {
-
-    @Override
-    public void addCorsMappings(CorsRegistry registry) {
-        registry.addMapping("/**") // 允许跨域访问的路径
-                .allowedOrigins("*")    // 允许跨域访问的源
-                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")    // 允许请求方法
-                .maxAge(168000)    // 预检间隔时间
-                .allowedHeaders("*")  // 允许头部设置
-                .allowCredentials(true);    // 是否发送cookie
-    }
-}

+ 1 - 1
src/main/java/com/mokamrp/privates/config/DataHubConfiguration.java

@@ -17,7 +17,7 @@ import org.springframework.stereotype.Component;
 @Component
 public class DataHubConfiguration {
 
-    private volatile static  DatahubClient datahubClient;
+    private volatile static DatahubClient datahubClient;
 
     private volatile static OSSClientBuilder ossClientBuilder;
 

+ 15 - 0
src/main/java/com/mokamrp/privates/config/RequestConfig.java

@@ -5,6 +5,7 @@ import com.mokamrp.privates.interceptor.AuthIntercepotor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -27,4 +28,18 @@ public class RequestConfig implements WebMvcConfigurer {
     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
         resolvers.add(new ArgumentResolver());
     }
+
+//    /**
+//     * 跨域
+//     * @param registry
+//     */
+//    @Override
+//    public void addCorsMappings(CorsRegistry registry) {
+//        registry.addMapping("/**") // 允许跨域访问的路径
+//                .allowedOrigins("*")    // 允许跨域访问的源
+//                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")    // 允许请求方法
+//                .maxAge(168000)    // 预检间隔时间
+//                .allowedHeaders("*")  // 允许头部设置
+//                .allowCredentials(true);    // 是否发送cookie
+//    }
 }

+ 13 - 0
src/main/java/com/mokamrp/privates/constant/RedisKey.java

@@ -7,4 +7,17 @@ public class RedisKey {
     public static final String CAPTCHA_CODE_KEY = "mmc_captcha_codes:";
     //.防重提交 redis key
     public static final String REPEAT_SUBMIT_KEY = "mmc_repeat_submit:";
+    //.盘古客服列表 ZSET 带阈值控制
+    public static final String PanCustServiceIdView = "pan_custservice_id_view:";
+    //.盘古客服列表 ZSET 全天打点数记录
+    public static final String PanCustServiceIdDayView = "pan_custservice_id_day_view:";
+    //.盘古客服信息 HASH
+    public static final String PanCustServiceInfo = "pan_custservice_info";
+    //.盘古活码二级域名列表 SET
+    public static final String PanSecondDomainList = "pan_second_domain_list";
+    //.盘古活码详细信息
+    public static final String PanPromoteCodeInfo = "pan_promote_code_info";
+    //.检测微信环境域名状态第三方登录token
+    public static final String CheckWxDomainToken = "check_wx_domain_token";
 }
+

+ 36 - 10
src/main/java/com/mokamrp/privates/controller/BaseController.java

@@ -12,6 +12,7 @@ import com.mokamrp.privates.entity.EditHandle;
 import com.mokamrp.privates.entity.IndexHandle;
 import com.mokamrp.privates.help.AjaxResult;
 import com.mokamrp.privates.utils.StringUtils;
+import org.apache.tomcat.jni.Local;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -20,10 +21,10 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.Valid;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+import java.util.*;
 
 /**
  * 一个粗糙的鸡肋
@@ -41,7 +42,8 @@ public class BaseController<T> {
             return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
         }
         QueryWrapper<T> QueryWrapper = new QueryWrapper<>();
-        QueryWrapper.in("id", delHandle.getIds());
+        String[] ids = delHandle.getIds().split(",");
+        QueryWrapper.in("id", ids);
         boolean res = service.remove(QueryWrapper);
         if (!res) {
             return AjaxResult.error("删除失败");
@@ -54,7 +56,7 @@ public class BaseController<T> {
         if (bindingResult.hasErrors()) {
             return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
         }
-        Date date = new Date();
+        this.onInsert(addHandle);
         Boolean res = service.save(addHandle.getRaw());
         if (res) {
             return AjaxResult.success(Constants.SUCCESS, res);
@@ -68,16 +70,17 @@ public class BaseController<T> {
         if (bindingResult.hasErrors()) {
             return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
         }
+        this.onUpdate(editHandle);
         service.update(editHandle.getRaw(), new QueryWrapper<T>().in("id", editHandle.getIds()));
         return AjaxResult.success(Constants.SUCCESS, true);
     }
 
-    @GetMapping("/edit")
+    @GetMapping("/info")
     public Object info(@RequestParam(name = "ids") String ids) {
-        if (ids == null || ids.isEmpty()){
+        if (ids == null || ids.isEmpty()) {
             return AjaxResult.error("ids null");
         }
-        T res = service.getOne(new QueryWrapper<T>().eq("id",ids));
+        T res = service.getOne(new QueryWrapper<T>().eq("id", ids));
         return AjaxResult.success(Constants.SUCCESS, res);
     }
 
@@ -106,7 +109,7 @@ public class BaseController<T> {
                     break;
                 case "RANGE":
                     String[] strArr = value.split(" - ");
-                    if(strArr.length <=1){
+                    if (strArr.length <= 1) {
                         break;
                     }
                     wrapper = wrapper.le(columnName, strArr[1]);
@@ -149,6 +152,29 @@ public class BaseController<T> {
         return AjaxResult.success(resMap);
     }
 
+    public Void onInsert(AddHandle<T> addHandle){
+        T raw = addHandle.getRaw();
+        Class<? extends Object> clazzUpdate = raw.getClass();
+        try {
+            Method setCreateAt = clazzUpdate.getMethod("setCreateAt", LocalDateTime.class);
+            setCreateAt.invoke(raw,LocalDateTime.now());
+            Method setUpdateAt = clazzUpdate.getMethod("setUpdateAt", LocalDateTime.class);
+            setUpdateAt.invoke(raw,LocalDateTime.now());
+        }catch (Exception e){
+            return null;
+        }
+        return null;
+    }
 
+    public Void onUpdate(EditHandle<T> editHandle){
+        Class<? extends Object> clazzUpdate = editHandle.getRaw().getClass();
+        try {
+            Method setUpdateAt = clazzUpdate.getMethod("setUpdateAt", LocalDateTime.class);
+            setUpdateAt.invoke(editHandle.getRaw(),LocalDateTime.now());
+        }catch (Exception e){
+            return null;
+        }
+        return null;
+    }
 }
 

+ 92 - 4
src/main/java/com/mokamrp/privates/controller/pangu/CustserviceController.java

@@ -1,15 +1,29 @@
 package com.mokamrp.privates.controller.pangu;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.Constants;
+import com.mokamrp.privates.constant.HttpStatus;
+import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.AddHandle;
+import com.mokamrp.privates.entity.DelHandle;
+import com.mokamrp.privates.entity.EditHandle;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
 import com.mokamrp.privates.service.pangu.CustserviceService;
 import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 
-import org.springframework.web.bind.annotation.RestController;
-
 import javax.validation.Valid;
+import java.awt.*;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -20,18 +34,92 @@ import java.util.List;
  * @since 2021-06-02
  */
 @RestController
-@RequestMapping("/custservice")
+@RequestMapping("/pangu/custservice")
 public class CustserviceController extends BaseController<Custservice> {
 
     @Autowired
     public CustserviceService custserviceService;
 
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
     /*
      * @fast
      * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
      * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
      */
+    @PostMapping("/list")
+    public Object list(@RequestBody CustserviceListHandle custserviceListHandle){
+        Object res = custserviceService.getlist(custserviceListHandle);
+        return AjaxResult.success(res);
+    }
+
+    /**
+     * (API)负载均衡获取个微客服码+海报底图
+     * @param promoteId
+     * @return
+     */
+    @GetMapping("/getRandCustservice")
+    public Object getRandCustservice(@RequestParam(name = "promoteId") String promoteId){
+        Map<String,Object> res = custserviceService.getRandCustservice(promoteId);
+        if (res.get("err") != null){
+            return AjaxResult.error(HttpStatus.ERROR,res.get("err").toString());
+        }
+        return AjaxResult.success(res.get("res"));
+    }
+
+    @PostMapping("/del")
+    public Object delete(@Valid @RequestBody DelHandle<Custservice> delHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        QueryWrapper<Custservice> QueryWrapper = new QueryWrapper<>();
+        String[] ids = delHandle.getIds().split(",");
+        QueryWrapper.in("id", ids);
+        boolean res = service.remove(QueryWrapper);
+        if (!res) {
+            this.sync();
+            return AjaxResult.error("删除失败");
+        }
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
 
+    @PostMapping("/add")
+    public Object add(@Valid @RequestBody AddHandle<Custservice> addHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        this.onInsert(addHandle);
+        Boolean res = service.save(addHandle.getRaw());
+        if (res) {
+            this.sync();
+            return AjaxResult.success(Constants.SUCCESS, res);
+        } else {
+            return AjaxResult.error("新增失败", res);
+        }
+    }
 
+    @PostMapping("/edit")
+    public Object edit(@Valid @RequestBody EditHandle<Custservice> editHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        this.onUpdate(editHandle);
+        service.update(editHandle.getRaw(), new QueryWrapper<Custservice>().in("id", editHandle.getIds()));
+        this.sync();
+        return AjaxResult.success(Constants.SUCCESS, true);
+    }
+
+    /**
+     * 同步到redis
+     * @return
+     */
+    public Boolean sync(){
+        List<Custservice> res = custserviceService.list(new QueryWrapper<Custservice>());
+        for (Custservice custservice : res) {
+            stringRedisTemplate.opsForHash().put(RedisKey.PanCustServiceInfo,Integer.toString(custservice.getId()),JSON.toJSONString(custservice));
+        }
+        return true;
+    }
 }
 

+ 47 - 0
src/main/java/com/mokamrp/privates/controller/pangu/CustserviceGroupController.java

@@ -0,0 +1,47 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.pangu.CustserviceGroupListHandle;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.mokamrp.privates.service.pangu.CustserviceGroupService;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceGroup;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古客服分组 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@RestController
+@RequestMapping("/pangu/custserviceGroup")
+public class CustserviceGroupController extends BaseController<CustserviceGroup> {
+
+    @Autowired
+    public CustserviceGroupService custserviceGroupService;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+
+    @PostMapping("/list")
+    public Object list(@RequestBody CustserviceGroupListHandle custserviceGroupListHandle){
+        Object res = custserviceGroupService.getlist(custserviceGroupListHandle);
+        return AjaxResult.success(res);
+    }
+
+}
+

+ 37 - 0
src/main/java/com/mokamrp/privates/controller/pangu/DomainFirstController.java

@@ -0,0 +1,37 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.mokamrp.privates.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.mokamrp.privates.service.pangu.DomainFirstService;
+import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * <p>
+ * 一级域名库 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+@RestController
+@RequestMapping("/pangu/domainFirst")
+public class DomainFirstController extends BaseController<DomainFirst> {
+
+    @Autowired
+    public DomainFirstService domainFirstService;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+
+
+}
+

+ 95 - 0
src/main/java/com/mokamrp/privates/controller/pangu/DomainSecondController.java

@@ -0,0 +1,95 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.Constants;
+import com.mokamrp.privates.constant.HttpStatus;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.AddHandle;
+import com.mokamrp.privates.entity.DelHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.mokamrp.privates.service.pangu.DomainSecondService;
+import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 二级域名库 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+@RestController
+@RequestMapping("/pangu/domainSecond")
+public class DomainSecondController extends BaseController<DomainSecond> {
+
+    @Autowired
+    public DomainSecondService domainSecondService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+
+    @PostMapping("/del")
+    public Object delete(@Valid @RequestBody DelHandle<DomainSecond> delHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        QueryWrapper<DomainSecond> QueryWrapper = new QueryWrapper<>();
+        String[] ids = delHandle.getIds().split(",");
+        QueryWrapper.in("id", ids);
+        this.delRedis(ids);
+        boolean res = service.remove(QueryWrapper);
+        if (!res) {
+            return AjaxResult.error("删除失败");
+        }
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
+
+    @PostMapping("/add")
+    public Object add(@Valid @RequestBody AddHandle<DomainSecond> addHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        this.onInsert(addHandle);
+        Boolean res = service.save(addHandle.getRaw());
+        if (res) {
+            this.addRedis(addHandle.getRaw().getDomain());
+            return AjaxResult.success(Constants.SUCCESS, res);
+        } else {
+            return AjaxResult.error("新增失败", res);
+        }
+    }
+
+    public Boolean addRedis(String domain){
+        stringRedisTemplate.opsForSet().add(RedisKey.PanSecondDomainList,domain);
+        return true;
+    }
+
+    public Boolean delRedis(String[] ids){
+        List<DomainSecond> list = domainSecondService.list(new QueryWrapper<DomainSecond>().in("id",ids));
+        for (DomainSecond domainSecond : list){
+            stringRedisTemplate.opsForSet().remove(RedisKey.PanSecondDomainList,domainSecond.getDomain());
+        }
+        return true;
+    }
+
+}
+

+ 48 - 0
src/main/java/com/mokamrp/privates/controller/pangu/PlaybillController.java

@@ -0,0 +1,48 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillGroupListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillListHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古海报库 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@RestController
+@RequestMapping("/pangu/playbill")
+public class PlaybillController extends BaseController<Playbill> {
+
+    @Autowired
+    public PlaybillService playbillService;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+
+    @PostMapping("/list")
+    public Object list(@RequestBody PlaybillListHandle playbillListHandle){
+        Object res = playbillService.getlist(playbillListHandle);
+        return AjaxResult.success(res);
+    }
+
+}
+

+ 46 - 0
src/main/java/com/mokamrp/privates/controller/pangu/PlaybillGroupController.java

@@ -0,0 +1,46 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.pangu.CustserviceGroupListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillGroupListHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.mokamrp.privates.service.pangu.PlaybillGroupService;
+import com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古海报分组 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@RestController
+@RequestMapping("/pangu/playbillGroup")
+public class PlaybillGroupController extends BaseController<PlaybillGroup> {
+
+    @Autowired
+    public PlaybillGroupService playbillGroupService;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+    @PostMapping("/list")
+    public Object list(@RequestBody PlaybillGroupListHandle playbillGroupListHandle){
+        Object res = playbillGroupService.getlist(playbillGroupListHandle);
+        return AjaxResult.success(res);
+    }
+
+}
+

+ 129 - 0
src/main/java/com/mokamrp/privates/controller/pangu/PromoteCodeController.java

@@ -0,0 +1,129 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.Constants;
+import com.mokamrp.privates.constant.HttpStatus;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.AddHandle;
+import com.mokamrp.privates.entity.DelHandle;
+import com.mokamrp.privates.entity.EditHandle;
+import com.mokamrp.privates.entity.pangu.PromoteCodeListHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘古活码库 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@RestController
+@RequestMapping("/pangu/promoteCode")
+public class PromoteCodeController extends BaseController<PromoteCode> {
+
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+    @Override
+    @GetMapping("/info")
+    public Object info(@RequestParam(name = "ids") String ids) {
+        if (ids == null || ids.isEmpty()) {
+            return AjaxResult.error("ids null");
+        }
+        Object res = promoteCodeService.getInfo(ids);
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
+
+    @Override
+    @PostMapping("/add")
+    public Object add(@Valid @RequestBody AddHandle<PromoteCode> addHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        this.onInsert(addHandle);
+        Map<String, Object> res = promoteCodeService.add(addHandle.getRaw());
+        if (res.get("err") == null) {
+            this.sync();
+            return AjaxResult.success(Constants.SUCCESS, res);
+        } else if (res.get("err").equals("noFirst")) {
+            return AjaxResult.error("一级域名可用数量不足");
+        }
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
+
+    @PostMapping("/del")
+    public Object delete(@Valid @RequestBody DelHandle<PromoteCode> delHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        QueryWrapper<PromoteCode> QueryWrapper = new QueryWrapper<>();
+        String[] ids = delHandle.getIds().split(",");
+        QueryWrapper.in("id", ids);
+        boolean res = service.remove(QueryWrapper);
+        if (!res) {
+            this.sync();
+            return AjaxResult.error("删除失败");
+        }
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
+
+    @PostMapping("/edit")
+    public Object edit(@Valid @RequestBody EditHandle<PromoteCode> editHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        this.onUpdate(editHandle);
+        service.update(editHandle.getRaw(), new QueryWrapper<PromoteCode>().in("id", editHandle.getIds()));
+        this.sync();
+        return AjaxResult.success(Constants.SUCCESS, true);
+    }
+
+    @PostMapping("/list")
+    public Object list(@RequestBody PromoteCodeListHandle promoteCodeListHandle) {
+        Object res = promoteCodeService.getlist(promoteCodeListHandle);
+        return AjaxResult.success(res);
+    }
+
+    /**
+     * (API)负载均衡获取活码内二级域名动态码
+     * @param promoteId
+     * @return
+     */
+    @GetMapping("/getRandPromoteCode")
+    public Object getRandPromoteCode(@RequestParam(name = "promoteId") String promoteId){
+        Object res = promoteCodeService.getRandPromoteCode(promoteId);
+        return AjaxResult.success(res);
+    }
+
+    public Boolean sync(){
+        List<PromoteCode> list = promoteCodeService.list();
+        for (PromoteCode promoteCode : list){
+            stringRedisTemplate.opsForHash().put(RedisKey.PanPromoteCodeInfo,Integer.toString(promoteCode.getId()),JSON.toJSONString(promoteCode));
+        }
+        return true;
+    }
+
+}
+

+ 163 - 0
src/main/java/com/mokamrp/privates/controller/pangu/PromoteQrcodePoolController.java

@@ -0,0 +1,163 @@
+package com.mokamrp.privates.controller.pangu;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.Constants;
+import com.mokamrp.privates.constant.HttpStatus;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.controller.BaseController;
+import com.mokamrp.privates.entity.AddHandle;
+import com.mokamrp.privates.entity.DelHandle;
+import com.mokamrp.privates.entity.EditHandle;
+import com.mokamrp.privates.entity.PostBasePageHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillListHandle;
+import com.mokamrp.privates.entity.pangu.SetPromoteQrcodeHandle;
+import com.mokamrp.privates.help.AjaxResult;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolVo;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.parsing.Location;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.text.DecimalFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古活码内 个微二维码池 前端控制器
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@RestController
+@RequestMapping("/pangu/promoteQrcodePool")
+public class PromoteQrcodePoolController extends BaseController<PromoteQrcodePool> {
+
+    @Autowired
+    public PromoteQrcodePoolService promoteQrcodePoolService;
+
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    /*
+     * @fast
+     * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
+     * 如果需要定制化,需要将BaseController中对应的方法复制到当前控制器,然后进行修改
+     */
+
+    @PostMapping("/list")
+    public Object list(@RequestBody PostBasePageHandle pageHandle) {
+        Object res = promoteQrcodePoolService.getlist(pageHandle);
+        return AjaxResult.success(res);
+    }
+
+    /**
+     * 设置活码内的客服和海报列表
+     *
+     * @param setPromoteQrcodeHandle
+     * @return
+     */
+    @PostMapping("/setPromoteQrcode")
+    public Object setPromoteQrcode(@RequestBody SetPromoteQrcodeHandle setPromoteQrcodeHandle) {
+        Boolean res = promoteQrcodePoolService.setPromoteQrcode(setPromoteQrcodeHandle);
+        if (res) {
+            return AjaxResult.success(Constants.SUCCESS);
+        }
+        return AjaxResult.success(Constants.ERROR);
+    }
+
+    @Override
+    @PostMapping("/del")
+    public Object delete(@Valid @RequestBody DelHandle<PromoteQrcodePool> delHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        this.delRedis(delHandle.getIds());
+        QueryWrapper<PromoteQrcodePool> QueryWrapper = new QueryWrapper<>();
+        String[] ids = delHandle.getIds().split(",");
+        QueryWrapper.in("id", ids);
+        boolean res = promoteQrcodePoolService.remove(QueryWrapper);
+        if (!res) {
+            return AjaxResult.error("删除失败");
+        }
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
+
+    @Override
+    @PostMapping("/add")
+    public Object add(@Valid @RequestBody AddHandle<PromoteQrcodePool> addHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        PromoteCode promoteCode = promoteCodeService.getOne(new QueryWrapper<PromoteCode>().eq("id", addHandle.getRaw().getPromoteId()));
+        PromoteQrcodePool promoteQrcodePool = promoteQrcodePoolService.getOne(
+                new QueryWrapper<PromoteQrcodePool>()
+                        .eq("promote_id", addHandle.getRaw().getPromoteId())
+                        .orderByDesc("weight")
+                        .last("limit 1")
+        );
+        if (promoteQrcodePool != null) {
+            addHandle.getRaw().setWeight(promoteQrcodePool.getWeight() + 1);
+        }
+        addHandle.getRaw().setDayUvMax(promoteCode.getDayUvMax());
+        addHandle.getRaw().setHourUvMax(promoteCode.getHourUvMax());
+        this.onInsert(addHandle);
+        Boolean res = promoteQrcodePoolService.save(addHandle.getRaw());
+        if (res) {
+            //.同步到redis
+            this.addRedis(addHandle.getRaw().getPromoteId(), addHandle.getRaw().getCustserviceId(), addHandle.getRaw().getWeight());
+            return AjaxResult.success(Constants.SUCCESS, res);
+        } else {
+            return AjaxResult.error("新增失败", res);
+        }
+    }
+
+    @Override
+    @PostMapping("/edit")
+    public Object edit(@Valid @RequestBody EditHandle<PromoteQrcodePool> editHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        onUpdate(editHandle);
+        promoteQrcodePoolService.update(editHandle.getRaw(), new QueryWrapper<PromoteQrcodePool>().in("id", editHandle.getIds()));
+        return AjaxResult.success(Constants.SUCCESS, true);
+    }
+
+    private Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight) {
+        Float score = weight.floatValue() / 10000;
+        Long index = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId));
+        if (index == null) {
+            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId), score);
+            return true;
+        }
+        return false;
+    }
+
+    private Boolean delRedis(String qrcodePoolIds) {
+        List<PromoteQrcodePool> res = promoteQrcodePoolService.list(new QueryWrapper<PromoteQrcodePool>().in("id", qrcodePoolIds));
+        if (res == null) {
+            return false;
+        }
+        for (PromoteQrcodePool promoteQrcodePool : res) {
+            stringRedisTemplate.opsForZSet().remove(RedisKey.PanCustServiceIdView + Integer.toString(promoteQrcodePool.getPromoteId()), Integer.toString(promoteQrcodePool.getCustserviceId()));
+        }
+        return true;
+    }
+}
+

+ 17 - 0
src/main/java/com/mokamrp/privates/entity/pangu/CustserviceGroupListHandle.java

@@ -0,0 +1,17 @@
+package com.mokamrp.privates.entity.pangu;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @param <T>
+ * @author leon 通用新增请求实体类
+ */
+@Data
+public class CustserviceGroupListHandle<T> {
+    @NotBlank(message = "page 不可为空")
+    private Integer page;
+    @NotBlank(message = "pagesize 不可为空")
+    private Integer pagesize;
+}

+ 21 - 0
src/main/java/com/mokamrp/privates/entity/pangu/CustserviceListHandle.java

@@ -0,0 +1,21 @@
+package com.mokamrp.privates.entity.pangu;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @param <T>
+ * @author leon 通用新增请求实体类
+ */
+@Data
+public class CustserviceListHandle<T> {
+    private Integer id;
+    private Integer groupId;
+    private String name;
+    @NotBlank(message = "page 不可为空")
+    private Integer page;
+    @NotBlank(message = "pagesize 不可为空")
+    private Integer pagesize;
+}

+ 17 - 0
src/main/java/com/mokamrp/privates/entity/pangu/PlaybillGroupListHandle.java

@@ -0,0 +1,17 @@
+package com.mokamrp.privates.entity.pangu;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @param <T>
+ * @author leon 通用新增请求实体类
+ */
+@Data
+public class PlaybillGroupListHandle<T> {
+    @NotBlank(message = "page 不可为空")
+    private Integer page;
+    @NotBlank(message = "pagesize 不可为空")
+    private Integer pagesize;
+}

+ 20 - 0
src/main/java/com/mokamrp/privates/entity/pangu/PlaybillListHandle.java

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.entity.pangu;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @param <T>
+ * @author leon 通用新增请求实体类
+ */
+@Data
+public class PlaybillListHandle<T> {
+    private Integer id;
+    private Integer groupId;
+    private String name;
+    @NotBlank(message = "page 不可为空")
+    private Integer page;
+    @NotBlank(message = "pagesize 不可为空")
+    private Integer pagesize;
+}

+ 19 - 0
src/main/java/com/mokamrp/privates/entity/pangu/PromoteCodeListHandle.java

@@ -0,0 +1,19 @@
+package com.mokamrp.privates.entity.pangu;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @param <T>
+ * @author leon 通用新增请求实体类
+ */
+@Data
+public class PromoteCodeListHandle<T> {
+    private Integer id;
+    private String name;
+    @NotBlank(message = "page 不可为空")
+    private Integer page;
+    @NotBlank(message = "pagesize 不可为空")
+    private Integer pagesize;
+}

+ 20 - 0
src/main/java/com/mokamrp/privates/entity/pangu/SetPromoteQrcodeHandle.java

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.entity.pangu;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+/**
+ * @param <T>
+ * @author leon 通用新增请求实体类
+ */
+@Data
+public class SetPromoteQrcodeHandle {
+    @NotBlank(message = "活码ID不可为空")
+    private Integer promoteId;
+    @NotBlank(message = "海报ID不可为空")
+    private Integer playbillId;
+    @NotBlank(message = "客服个微二维码不可为空")
+    private List<Integer> custserviceIds;
+}

+ 27 - 11
src/main/java/com/mokamrp/privates/interceptor/AuthIntercepotor.java

@@ -7,6 +7,7 @@ import com.mokamrp.privates.service.UserService;
 import com.xxl.sso.core.conf.Conf;
 import com.xxl.sso.core.user.XxlSsoUser;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
@@ -28,38 +29,53 @@ public class AuthIntercepotor extends HandlerInterceptorAdapter {
     @Autowired
     private ObjectMapper objectMapper;
 
+    @Value("${xxl-sso.excluded.paths}")
+    private String xxlSsoExcludedPaths;
+
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        //.跨域
+        String originHeader = request.getHeader("Origin");
+        response.addHeader("Access-Control-Allow-Origin", originHeader);
+        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+        response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");
         //.健康监测不验证用户信息
         String requestUrl = request.getContextPath() + request.getServletPath();
-        if (requestUrl.equals("/private/healthy")) {
-            return true;
-        }
-
-        if (requestUrl.equals("/mochat/weWork/callback")) {
-            return true;
+        String[] excludePathList = xxlSsoExcludedPaths.split(",");
+        for (String path : excludePathList){
+            String url = requestUrl.replaceAll("/private","");
+            if (url.equals(path)){
+                return true;
+            }
         }
+//        if (requestUrl.equals("/private/healthy")) {
+//            return true;
+//        }
+//
+//        if (requestUrl.equals("/mochat/weWork/callback")) {
+//            return true;
+//        }
 
         XxlSsoUser xxlSsoUser = (XxlSsoUser) request.getAttribute(Conf.SSO_USER);
-        Map<String, String> plugininfo=xxlSsoUser.getPlugininfo();
-        User user=new User();
+        Map<String, String> plugininfo = xxlSsoUser.getPlugininfo();
+        User user = new User();
         user.setId(Integer.valueOf(plugininfo.get("employeeNo")));
         user.setName(xxlSsoUser.getUsername());
         user.setUserId(xxlSsoUser.getUserid());
         String roles = plugininfo.get("roles");
         //.检查用户角色信息
         user.setIsSuperAdmin(0);
-        if (roles != null){
+        if (roles != null) {
             String[] roleList = roles.split(",");
             for (String role : roleList) {
                 //.角色权限包含私域运营超管
-                if (role.equals("10001007")){
+                if (role.equals("10001007")) {
                     user.setIsSuperAdmin(1);
                 }
             }
         }
         request.setAttribute("auth-user", user);
-        userService.Insert(xxlSsoUser.getPlugininfo(),xxlSsoUser.getUsername());
+        userService.Insert(xxlSsoUser.getPlugininfo(), xxlSsoUser.getUsername());
         return true;
     }
 }

+ 22 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceGroupMapper.java

@@ -0,0 +1,22 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古客服分组 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface CustserviceGroupMapper extends BaseMapper<CustserviceGroup> {
+    public List<CustserviceGroup> getlist(IPage<CustserviceGroup> page);
+}

+ 22 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceGroupMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.mokamrp.privates.mapper.pangu.CustserviceGroupMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.CustserviceGroup">
+        <id column="id" property="id" />
+        <result column="group_name" property="groupName" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, group_name, create_at, update_at
+    </sql>
+    <select id="getlist" resultType="com.mokamrp.privates.mapper.pangu.pojo.CustserviceGroup">
+        SELECT A.*,B.custservice_cnt,B.group_id FROM pan_custservice_group AS A
+        LEFT JOIN (SELECT COUNT(id) AS custservice_cnt,group_id from pan_custservice GROUP BY group_id) AS B ON A.id = B.group_id
+    </select>
+
+</mapper>

+ 7 - 1
src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceMapper.java

@@ -1,7 +1,13 @@
 package com.mokamrp.privates.mapper.pangu;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
 import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +18,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2021-06-02
  */
 public interface CustserviceMapper extends BaseMapper<Custservice> {
-
+    public List<CustserviceVo> getlist(IPage<CustserviceVo> page, @Param("custserviceListHandle") CustserviceListHandle custserviceListHandle);
 }

+ 11 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/CustserviceMapper.xml

@@ -16,5 +16,16 @@
     <sql id="Base_Column_List">
         id, group_id, name, qrcode, create_at, update_at
     </sql>
+    <!-- 盘古客服二维码库-->
+    <select id="getlist" resultType="com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo">
+        SELECT A.*,B.group_name FROM pan_custservice AS A
+        LEFT JOIN pan_custservice_group B ON A.group_id = B.id
+        <where>
+            <if test="custserviceListHandle.id != null">and A.id = #{custserviceListHandle.id}  </if>
+            <if test="custserviceListHandle.groupId != null">and A.group_id = #{custserviceListHandle.groupId}  </if>
+            <if test="custserviceListHandle.name != null">and A.name like CONCAT('%',#{custserviceListHandle.name},'%') </if>
+        </where>
+
+    </select>
 
 </mapper>

+ 16 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/DomainFirstMapper.java

@@ -0,0 +1,16 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 一级域名库 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+public interface DomainFirstMapper extends BaseMapper<DomainFirst> {
+
+}

+ 22 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/DomainFirstMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.mokamrp.privates.mapper.pangu.DomainFirstMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.DomainFirst">
+        <id column="id" property="id" />
+        <result column="domain" property="domain" />
+        <result column="is_record" property="isRecord" />
+        <result column="status" property="status" />
+        <result column="screen_city" property="screenCity" />
+        <result column="forbbiden_at" property="forbbidenAt" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, domain, is_record, status, screen_city, forbbiden_at, create_at, update_at
+    </sql>
+
+</mapper>

+ 16 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/DomainSecondMapper.java

@@ -0,0 +1,16 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 二级域名库 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+public interface DomainSecondMapper extends BaseMapper<DomainSecond> {
+
+}

+ 22 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/DomainSecondMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.mokamrp.privates.mapper.pangu.DomainSecondMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.DomainSecond">
+        <id column="id" property="id" />
+        <result column="domain" property="domain" />
+        <result column="is_record" property="isRecord" />
+        <result column="status" property="status" />
+        <result column="screen_city" property="screenCity" />
+        <result column="forbbiden_at" property="forbbidenAt" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, domain, is_record, status, screen_city, forbbiden_at, create_at, update_at
+    </sql>
+
+</mapper>

+ 23 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillGroupMapper.java

@@ -0,0 +1,23 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillGroupListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
+import com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古海报分组 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PlaybillGroupMapper extends BaseMapper<PlaybillGroup> {
+    public List<PlaybillGroup> getlist(IPage<PlaybillGroup> page, @Param("playbillGroupListHandle")PlaybillGroupListHandle playbillGroupListHandle);
+}

+ 22 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillGroupMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.mokamrp.privates.mapper.pangu.PlaybillGroupMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup">
+        <id column="id" property="id" />
+        <result column="group_name" property="groupName" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, group_name, create_at, update_at
+    </sql>
+    <select id="getlist" resultType="com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup">
+        SELECT A.*,B.playbill_cnt,B.group_id FROM pan_playbill_group AS A
+        LEFT JOIN (SELECT COUNT(id) AS playbill_cnt,group_id from pan_playbill GROUP BY group_id) AS B ON A.id = B.group_id
+    </select>
+
+</mapper>

+ 23 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillMapper.java

@@ -0,0 +1,23 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.mokamrp.privates.entity.pangu.PlaybillGroupListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古海报库 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PlaybillMapper extends BaseMapper<Playbill> {
+    public List<Playbill> getlist(IPage<Playbill> page, @Param("playbillListHandle") PlaybillListHandle playbillListHandle);
+}

+ 30 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PlaybillMapper.xml

@@ -0,0 +1,30 @@
+<?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="com.mokamrp.privates.mapper.pangu.PlaybillMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.Playbill">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="playbill" property="playbill" />
+        <result column="qrcode_x" property="qrcodeX" />
+        <result column="qrcode_y" property="qrcodeY" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, playbill, qrcode_x, qrcode_y, create_at, update_at
+    </sql>
+    <select id="getlist" resultType="com.mokamrp.privates.mapper.pangu.pojo.Playbill">
+        SELECT A.*,B.group_name FROM pan_playbill AS A
+        LEFT JOIN pan_playbill_group B ON A.group_id = B.id
+        <where>
+            <if test="playbillListHandle.id != null">and A.id = #{playbillListHandle.id}  </if>
+            <if test="playbillListHandle.groupId != null">and A.group_id = #{playbillListHandle.groupId}  </if>
+            <if test="playbillListHandle.name != null">and A.name like CONCAT('%',#{playbillListHandle.name},'%') </if>
+        </where>
+    </select>
+
+</mapper>

+ 27 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PromoteCodeMapper.java

@@ -0,0 +1,27 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.entity.pangu.PromoteCodeListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCodeVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古活码库 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PromoteCodeMapper extends BaseMapper<PromoteCode> {
+
+    public List<PromoteCodeVo> getlist(IPage<PromoteCodeVo> page, @Param("promoteCodeListHandle") PromoteCodeListHandle promoteCodeListHandle);
+
+    public PromoteCodeVo getInfo(@Param("id") String id);
+}

+ 42 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PromoteCodeMapper.xml

@@ -0,0 +1,42 @@
+<?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="com.mokamrp.privates.mapper.pangu.PromoteCodeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.PromoteCode">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="status" property="status" />
+        <result column="domain_id" property="domainId" />
+        <result column="take_qrcode_pv" property="takeQrcodePv" />
+        <result column="long_touch_pv" property="longTouchPv" />
+        <result column="day_uv_max" property="dayUvMax" />
+        <result column="hour_uv_max" property="hourUvMax" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, status, domain_id, take_qrcode_pv, long_touch_pv, day_uv_max, hour_uv_max, create_at, update_at
+    </sql>
+    <select id="getlist" resultType="com.mokamrp.privates.mapper.pangu.pojo.PromoteCodeVo">
+        SELECT
+        A.*,
+        C.playbill,
+        C.qrcode_x,
+        C.qrcode_y,
+        B1.domain,
+        CONCAT(B1.domain,'?promote_id=',A.id) AS qrcode
+        FROM pan_promote_code AS A
+        LEFT JOIN pan_domain_first AS B1 ON A.domain_id = B1.id
+        LEFT JOIN pan_domain_second AS B2 ON A.second_domain_id = B2.id
+        LEFT JOIN pan_playbill AS C ON A.playbill_id = C.id
+    </select>
+    <select id="getInfo" resultType="com.mokamrp.privates.mapper.pangu.pojo.PromoteCodeVo">
+        SELECT A.*,B.playbill FROM pan_promote_code AS A
+        LEFT JOIN pan_playbill AS B ON A.playbill_id = B.id
+        WHERE A.id = #{id}
+    </select>
+
+</mapper>

+ 24 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PromoteQrcodePoolMapper.java

@@ -0,0 +1,24 @@
+package com.mokamrp.privates.mapper.pangu;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.mokamrp.privates.entity.PostBasePageHandle;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 盘古活码内 个微二维码池 Mapper 接口
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PromoteQrcodePoolMapper extends BaseMapper<PromoteQrcodePool> {
+    public List<PromoteQrcodePoolVo> getlist(IPage<PromoteQrcodePoolVo> page, @Param("pageHandle") PostBasePageHandle pageHandle);
+}

+ 42 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PromoteQrcodePoolMapper.xml

@@ -0,0 +1,42 @@
+<?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="com.mokamrp.privates.mapper.pangu.PromoteQrcodePoolMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool">
+        <id column="id" property="id" />
+        <result column="key" property="key" />
+        <result column="custservice_id" property="custserviceId" />
+        <result column="playbill_id" property="playbillId" />
+        <result column="create_at" property="createAt" />
+        <result column="update_at" property="updateAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, key, custservice_id, playbill_id, create_at, update_at
+    </sql>
+    <select id="getlist" resultType="com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolVo">
+        SELECT
+            A.id,
+            A.promote_id,
+            A.custservice_id,
+            A.playbill_id,
+            A.day_uv_max,
+            A.hour_uv_max,
+            A.weight,
+            B.name AS playbill_name,
+            B.playbill,
+            B.qrcode_x,
+            B.qrcode_y,
+            C.name AS custservice_name,
+            C.qrcode
+         FROM pan_promote_qrcode_pool AS A
+         LEFT join pan_playbill AS B ON A.playbill_id = B.id
+         left join pan_custservice AS C ON A.custservice_id = C.id
+    <where>
+        <if test="pageHandle.id != null">and A.id = #{pageHandle.id}</if>
+    </where>
+    </select>
+
+</mapper>

+ 12 - 8
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/Custservice.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
 import java.time.LocalDateTime;
 import java.io.Serializable;
 
@@ -15,12 +17,13 @@ import java.io.Serializable;
  * @author leon
  * @since 2021-06-02
  */
+@Data
 @TableName("pan_custservice")
 public class Custservice extends Model<Custservice> {
 
     private static final long serialVersionUID = 1L;
 
-      @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -38,6 +41,7 @@ public class Custservice extends Model<Custservice> {
      */
     private String qrcode;
 
+
     private LocalDateTime createAt;
 
     private LocalDateTime updateAt;
@@ -99,12 +103,12 @@ public class Custservice extends Model<Custservice> {
     @Override
     public String toString() {
         return "Custservice{" +
-        "id=" + id +
-        ", groupId=" + groupId +
-        ", name=" + name +
-        ", qrcode=" + qrcode +
-        ", createAt=" + createAt +
-        ", updateAt=" + updateAt +
-        "}";
+                "id=" + id +
+                ", groupId=" + groupId +
+                ", name=" + name +
+                ", qrcode=" + qrcode +
+                ", createAt=" + createAt +
+                ", updateAt=" + updateAt +
+                "}";
     }
 }

+ 84 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/CustserviceGroup.java

@@ -0,0 +1,84 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 盘古客服分组
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_custservice_group")
+public class CustserviceGroup extends Model<CustserviceGroup> {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String groupName;
+
+    private Integer custserviceCnt;
+
+    private LocalDateTime createAt;
+
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "CustserviceGroup{" +
+        "id=" + id +
+        ", groupName=" + groupName +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 133 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/CustserviceVo.java

@@ -0,0 +1,133 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 盘古客服库
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-02
+ */
+@Data
+@TableName("pan_custservice")
+public class CustserviceVo extends Model<CustserviceVo> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 客服组
+     */
+    private Integer groupId;
+
+    /**
+     * 客服名称
+     */
+    private String name;
+
+    /**
+     * 客服个微二维码
+     */
+    private String qrcode;
+    /**
+     * 分组名称
+     */
+    private String groupName;
+
+//    /**
+//     * 海报名称
+//     */
+//    private String playbillName;
+//    /**
+//     * 海报地址
+//     */
+//    private String playbill;
+//    /**
+//     * 海报二维码坐标左上角
+//     */
+//    private String qrcodeX;
+//    /**
+//     * 海报二维码坐标右下角
+//     */
+//    private String qrcodeY;
+    private LocalDateTime createAt;
+
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Integer groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getQrcode() {
+        return qrcode;
+    }
+
+    public void setQrcode(String qrcode) {
+        this.qrcode = qrcode;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Custservice{" +
+                "id=" + id +
+                ", groupId=" + groupId +
+                ", name=" + name +
+                ", qrcode=" + qrcode +
+                ", createAt=" + createAt +
+                ", updateAt=" + updateAt +
+                "}";
+    }
+}

+ 147 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/DomainFirst.java

@@ -0,0 +1,147 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 一级域名库
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+@TableName("pan_domain_first")
+public class DomainFirst extends Model<DomainFirst> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 域名
+     */
+    private String domain;
+
+    /**
+     * 是否备案 1备案 2未备案
+     */
+    private Integer isRecord;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    /**
+     * 屏蔽城市
+     */
+    private String screenCity;
+
+    /**
+     * 封禁时间
+     */
+    private LocalDateTime forbbidenAt;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createAt;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public Integer getIsRecord() {
+        return isRecord;
+    }
+
+    public void setIsRecord(Integer isRecord) {
+        this.isRecord = isRecord;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getScreenCity() {
+        return screenCity;
+    }
+
+    public void setScreenCity(String screenCity) {
+        this.screenCity = screenCity;
+    }
+
+    public LocalDateTime getForbbidenAt() {
+        return forbbidenAt;
+    }
+
+    public void setForbbidenAt(LocalDateTime forbbidenAt) {
+        this.forbbidenAt = forbbidenAt;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DomainFirst{" +
+        "id=" + id +
+        ", domain=" + domain +
+        ", isRecord=" + isRecord +
+        ", status=" + status +
+        ", screenCity=" + screenCity +
+        ", forbbidenAt=" + forbbidenAt +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 147 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/DomainSecond.java

@@ -0,0 +1,147 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 二级域名库
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+@TableName("pan_domain_second")
+public class DomainSecond extends Model<DomainSecond> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 域名
+     */
+    private String domain;
+
+    /**
+     * 是否备案 1备案 2未备案
+     */
+    private Integer isRecord;
+
+    /**
+     * 状态 1正常 2异常
+     */
+    private Integer status;
+
+    /**
+     * 屏蔽城市
+     */
+    private String screenCity;
+
+    /**
+     * 封禁时间
+     */
+    private LocalDateTime forbbidenAt;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createAt;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public Integer getIsRecord() {
+        return isRecord;
+    }
+
+    public void setIsRecord(Integer isRecord) {
+        this.isRecord = isRecord;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getScreenCity() {
+        return screenCity;
+    }
+
+    public void setScreenCity(String screenCity) {
+        this.screenCity = screenCity;
+    }
+
+    public LocalDateTime getForbbidenAt() {
+        return forbbidenAt;
+    }
+
+    public void setForbbidenAt(LocalDateTime forbbidenAt) {
+        this.forbbidenAt = forbbidenAt;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DomainSecond{" +
+        "id=" + id +
+        ", domain=" + domain +
+        ", isRecord=" + isRecord +
+        ", status=" + status +
+        ", screenCity=" + screenCity +
+        ", forbbidenAt=" + forbbidenAt +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 135 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/Playbill.java

@@ -0,0 +1,135 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 盘古海报库
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_playbill")
+public class Playbill extends Model<Playbill> {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+
+    private Integer groupId;
+    /**
+     * 海报名称
+     */
+    private String name;
+
+    /**
+     * 海报Url
+     */
+    private String playbill;
+
+    /**
+     * 海报二维码左上角坐标
+     */
+    private String qrcodeX;
+
+    /**
+     * 海报二维码右下角坐标
+     */
+    private String qrcodeY;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createAt;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPlaybill() {
+        return playbill;
+    }
+
+    public void setPlaybill(String playbill) {
+        this.playbill = playbill;
+    }
+
+    public String getQrcodeX() {
+        return qrcodeX;
+    }
+
+    public void setQrcodeX(String qrcodeX) {
+        this.qrcodeX = qrcodeX;
+    }
+
+    public String getQrcodeY() {
+        return qrcodeY;
+    }
+
+    public void setQrcodeY(String qrcodeY) {
+        this.qrcodeY = qrcodeY;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Playbill{" +
+        "id=" + id +
+        ", name=" + name +
+        ", playbill=" + playbill +
+        ", qrcodeX=" + qrcodeX +
+        ", qrcodeY=" + qrcodeY +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 84 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PlaybillGroup.java

@@ -0,0 +1,84 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 盘古海报分组
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_playbill_group")
+public class PlaybillGroup extends Model<PlaybillGroup> {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String groupName;
+
+    private Integer playbillCnt;
+
+    private LocalDateTime createAt;
+
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "PlaybillGroup{" +
+        "id=" + id +
+        ", groupName=" + groupName +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 176 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteCode.java

@@ -0,0 +1,176 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 盘古活码库
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_promote_code")
+public class PromoteCode extends Model<PromoteCode> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String name;
+
+    /**
+     * 1正常 2失效
+     */
+    private Integer status;
+
+    /**
+     * 一级域名id
+     */
+    private Integer domainId;
+    /**
+     * 二级域名id
+     */
+    private Integer secondDomainId;
+
+    /**
+     * 扫码pv
+     */
+    private Integer takeQrcodePv;
+
+    /**
+     * 长按pv
+     */
+    private Integer longTouchPv;
+
+    /**
+     * 活码全天uv上限
+     */
+    private Integer dayUvMax;
+
+    /**
+     * 活码每小时uv上限
+     */
+    private Integer hourUvMax;
+
+    private Integer playbillId;
+
+    private LocalDateTime createAt;
+
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getDomainId() {
+        return domainId;
+    }
+
+    public void setDomainId(Integer domainId) {
+        this.domainId = domainId;
+    }
+
+
+    public Integer getTakeQrcodePv() {
+        return takeQrcodePv;
+    }
+
+    public void setTakeQrcodePv(Integer takeQrcodePv) {
+        this.takeQrcodePv = takeQrcodePv;
+    }
+
+    public Integer getLongTouchPv() {
+        return longTouchPv;
+    }
+
+    public void setLongTouchPv(Integer longTouchPv) {
+        this.longTouchPv = longTouchPv;
+    }
+
+    public Integer getDayUvMax() {
+        return dayUvMax;
+    }
+
+    public void setDayUvMax(Integer dayUvMax) {
+        this.dayUvMax = dayUvMax;
+    }
+
+    public Integer getHourUvMax() {
+        return hourUvMax;
+    }
+
+    public void setHourUvMax(Integer hourUvMax) {
+        this.hourUvMax = hourUvMax;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "PromoteCode{" +
+        "id=" + id +
+        ", name=" + name +
+        ", status=" + status +
+        ", domainId=" + domainId +
+        ", takeQrcodePv=" + takeQrcodePv +
+        ", longTouchPv=" + longTouchPv +
+        ", dayUvMax=" + dayUvMax +
+        ", hourUvMax=" + hourUvMax +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 192 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteCodeVo.java

@@ -0,0 +1,192 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 盘古活码库
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_promote_code")
+public class PromoteCodeVo extends Model<PromoteCodeVo> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String name;
+
+    /**
+     * 1正常 2失效
+     */
+    private Integer status;
+
+    /**
+     * 一级域名id
+     */
+    private Integer domainId;
+
+    /**
+     * 二级域名id
+     */
+    private Integer secondDomainId;
+
+    /**
+     * 扫码pv
+     */
+    private Integer takeQrcodePv;
+
+    /**
+     * 长按pv
+     */
+    private Integer longTouchPv;
+
+    /**
+     * 活码全天uv上限
+     */
+    private Integer dayUvMax;
+
+    /**
+     * 活码每小时uv上限
+     */
+    private Integer hourUvMax;
+
+    /**
+     * 一级域名
+     */
+    private String domain;
+    /**
+     * 活码二维码地址
+     */
+    private String qrcode;
+
+    private Integer playbillId;
+
+    private String playbill;
+
+    private String qrcodeX;
+
+    private String qrcodeY;
+
+    private LocalDateTime createAt;
+
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getDomainId() {
+        return domainId;
+    }
+
+    public void setDomainId(Integer domainId) {
+        this.domainId = domainId;
+    }
+
+
+    public Integer getTakeQrcodePv() {
+        return takeQrcodePv;
+    }
+
+    public void setTakeQrcodePv(Integer takeQrcodePv) {
+        this.takeQrcodePv = takeQrcodePv;
+    }
+
+    public Integer getLongTouchPv() {
+        return longTouchPv;
+    }
+
+    public void setLongTouchPv(Integer longTouchPv) {
+        this.longTouchPv = longTouchPv;
+    }
+
+    public Integer getDayUvMax() {
+        return dayUvMax;
+    }
+
+    public void setDayUvMax(Integer dayUvMax) {
+        this.dayUvMax = dayUvMax;
+    }
+
+    public Integer getHourUvMax() {
+        return hourUvMax;
+    }
+
+    public void setHourUvMax(Integer hourUvMax) {
+        this.hourUvMax = hourUvMax;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "PromoteCode{" +
+        "id=" + id +
+        ", name=" + name +
+        ", status=" + status +
+        ", domainId=" + domainId +
+        ", takeQrcodePv=" + takeQrcodePv +
+        ", longTouchPv=" + longTouchPv +
+        ", dayUvMax=" + dayUvMax +
+        ", hourUvMax=" + hourUvMax +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 117 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteQrcodePool.java

@@ -0,0 +1,117 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 盘古活码内 个微二维码池
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_promote_qrcode_pool")
+public class PromoteQrcodePool extends Model<PromoteQrcodePool> {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 活码Id
+     */
+    private Integer promoteId;
+
+    /**
+     * 个微Id
+     */
+    private Integer custserviceId;
+
+    /**
+     * 海报id
+     */
+    private Integer playbillId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createAt;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateAt;
+
+    private Integer weight = 0;
+
+    private Integer dayUvMax = 0;
+
+    private Integer hourUvMax = 0;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    public Integer getCustserviceId() {
+        return custserviceId;
+    }
+
+    public void setCustserviceId(Integer custserviceId) {
+        this.custserviceId = custserviceId;
+    }
+
+    public Integer getPlaybillId() {
+        return playbillId;
+    }
+
+    public void setPlaybillId(Integer playbillId) {
+        this.playbillId = playbillId;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "PromoteQrcodePool{" +
+        "id=" + id +
+        ", custserviceId=" + custserviceId +
+        ", playbillId=" + playbillId +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 129 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteQrcodePoolVo.java

@@ -0,0 +1,129 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 盘古活码内 个微二维码池
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Data
+@TableName("pan_promote_qrcode_pool")
+public class PromoteQrcodePoolVo extends Model<PromoteQrcodePoolVo> {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 活码Id
+     */
+    private Integer promoteId;
+
+    /**
+     * 个微Id
+     */
+    private Integer custserviceId;
+
+    /**
+     * 海报id
+     */
+    private Integer playbillId;
+
+    private String playbillName;
+
+    private String playbill;
+
+    private String qrcodeX;
+
+    private String qrcodeY;
+
+    private String custserviceName;
+
+    private String qrcode;
+
+    private Integer weight;
+
+    private Integer dayUvMax;
+
+    private Integer hourUvMax;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createAt;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateAt;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    public Integer getCustserviceId() {
+        return custserviceId;
+    }
+
+    public void setCustserviceId(Integer custserviceId) {
+        this.custserviceId = custserviceId;
+    }
+
+    public Integer getPlaybillId() {
+        return playbillId;
+    }
+
+    public void setPlaybillId(Integer playbillId) {
+        this.playbillId = playbillId;
+    }
+
+    public LocalDateTime getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(LocalDateTime createAt) {
+        this.createAt = createAt;
+    }
+
+    public LocalDateTime getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(LocalDateTime updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "PromoteQrcodePool{" +
+        "id=" + id +
+        ", custserviceId=" + custserviceId +
+        ", playbillId=" + playbillId +
+        ", createAt=" + createAt +
+        ", updateAt=" + updateAt +
+        "}";
+    }
+}

+ 18 - 0
src/main/java/com/mokamrp/privates/service/pangu/CustserviceGroupService.java

@@ -0,0 +1,18 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.entity.pangu.CustserviceGroupListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceGroup;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 盘古客服分组 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface CustserviceGroupService extends IService<CustserviceGroup> {
+    //.获取客服分组列表 带分组内客服数量
+    public Object getlist(CustserviceGroupListHandle custserviceGroupListHandle);
+}

+ 7 - 1
src/main/java/com/mokamrp/privates/service/pangu/CustserviceService.java

@@ -1,8 +1,11 @@
 package com.mokamrp.privates.service.pangu;
 
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
 import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.Map;
+
 /**
  * <p>
  * 盘古客服库 服务类
@@ -12,5 +15,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2021-06-02
  */
 public interface CustserviceService extends IService<Custservice> {
-
+    //.盘古客服库列表
+    public Object getlist(CustserviceListHandle custserviceListHandle);
+    //.按阈值大小获取客服码
+    public Map<String,Object> getRandCustservice(String promotePoolKey);
 }

+ 16 - 0
src/main/java/com/mokamrp/privates/service/pangu/DomainFirstService.java

@@ -0,0 +1,16 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 一级域名库 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+public interface DomainFirstService extends IService<DomainFirst> {
+
+}

+ 16 - 0
src/main/java/com/mokamrp/privates/service/pangu/DomainSecondService.java

@@ -0,0 +1,16 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 二级域名库 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+public interface DomainSecondService extends IService<DomainSecond> {
+
+}

+ 19 - 0
src/main/java/com/mokamrp/privates/service/pangu/PlaybillGroupService.java

@@ -0,0 +1,19 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.entity.pangu.CustserviceGroupListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillGroupListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 盘古海报分组 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PlaybillGroupService extends IService<PlaybillGroup> {
+    //.获取海报分组列表 带分组内海报数量
+    public Object getlist(PlaybillGroupListHandle playbillGroupListHandle);
+}

+ 19 - 0
src/main/java/com/mokamrp/privates/service/pangu/PlaybillService.java

@@ -0,0 +1,19 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.entity.pangu.PlaybillListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 盘古海报库 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PlaybillService extends IService<Playbill> {
+    //.盘古海报库列表
+    public Object getlist(PlaybillListHandle playbillListHandle);
+}

+ 26 - 0
src/main/java/com/mokamrp/privates/service/pangu/PromoteCodeService.java

@@ -0,0 +1,26 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.entity.pangu.PromoteCodeListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘古活码库 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PromoteCodeService extends IService<PromoteCode> {
+    //.获取活码列表
+    public Object getlist(PromoteCodeListHandle promoteCodeListHandle);
+    //.获取活码详细信息
+    public Object getInfo(String id);
+    //.新增活码
+    public Map<String,Object> add(PromoteCode promoteCode);
+    //.(API)负载均衡获取活码内二级域名动态码
+    public Object getRandPromoteCode(String promoteId);
+}

+ 27 - 0
src/main/java/com/mokamrp/privates/service/pangu/PromoteQrcodePoolService.java

@@ -0,0 +1,27 @@
+package com.mokamrp.privates.service.pangu;
+
+import com.mokamrp.privates.entity.PostBasePageHandle;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
+import com.mokamrp.privates.entity.pangu.SetPromoteQrcodeHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolVo;
+
+/**
+ * <p>
+ * 盘古活码内 个微二维码池 服务类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+public interface PromoteQrcodePoolService extends IService<PromoteQrcodePool> {
+    //.活码内个微海报码列表
+    public Object getlist(PostBasePageHandle pageHandle);
+
+    //.通过ID获取信息
+    public PromoteQrcodePoolVo getInfoById(String id);
+
+    //.设置活码内的客服和海报列表
+    public Boolean setPromoteQrcode(SetPromoteQrcodeHandle setPromoteQrcodeHandle);
+}

+ 39 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/CustserviceGroupServiceImpl.java

@@ -0,0 +1,39 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.entity.pangu.CustserviceGroupListHandle;
+import com.mokamrp.privates.mapper.pangu.CustserviceMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceGroup;
+import com.mokamrp.privates.mapper.pangu.CustserviceGroupMapper;
+import com.mokamrp.privates.service.pangu.CustserviceGroupService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘古客服分组 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Service
+public class CustserviceGroupServiceImpl extends ServiceImpl<CustserviceGroupMapper, CustserviceGroup> implements CustserviceGroupService {
+    @Autowired
+    CustserviceGroupMapper custserviceGroupMapper;
+
+    public Object getlist(CustserviceGroupListHandle custserviceGroupListHandle){
+        Page<CustserviceGroup> page = new Page<CustserviceGroup>(custserviceGroupListHandle.getPage(),custserviceGroupListHandle.getPagesize());
+        List<CustserviceGroup> custservices = custserviceGroupMapper.getlist(page);
+        Map<String,Object> res = new HashMap<>();
+        res.put("list",custservices);
+        res.put("total",page.getTotal());
+        return res;
+    }
+}

+ 68 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/CustserviceServiceImpl.java

@@ -1,11 +1,24 @@
 package com.mokamrp.privates.service.pangu.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.cache.RedisCache;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
 import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 import com.mokamrp.privates.mapper.pangu.CustserviceMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
 import com.mokamrp.privates.service.pangu.CustserviceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.omg.CORBA.PUBLIC_MEMBER;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+
 /**
  * <p>
  * 盘古客服库 服务实现类
@@ -17,4 +30,59 @@ import org.springframework.stereotype.Service;
 @Service
 public class CustserviceServiceImpl extends ServiceImpl<CustserviceMapper, Custservice> implements CustserviceService {
 
+    @Autowired CustserviceMapper custserviceMapper;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+    /**
+     * 盘古客服库列表
+     * @param custserviceListHandle
+     * @return
+     */
+    public Object getlist(CustserviceListHandle custserviceListHandle){
+        Page<CustserviceVo> page = new Page<CustserviceVo>(custserviceListHandle.getPage(),custserviceListHandle.getPagesize());
+        List<CustserviceVo> custservices = custserviceMapper.getlist(page,custserviceListHandle);
+        Map<String,Object> res = new HashMap<>();
+        res.put("list",custservices);
+        res.put("total",page.getTotal());
+        return res;
+    }
+
+    /**
+     * (API)按阈值大小获取客服码
+     * @param promoteId
+     * @return
+     */
+    public Map<String,Object> getRandCustservice(String promoteId){
+        Map<String,Object> res = new HashMap<>();
+        res.put("err",null);
+        //.获取活码小时访问量上限
+        String promoteInfoStr = stringRedisTemplate.opsForHash().get(RedisKey.PanPromoteCodeInfo,promoteId).toString();
+        PromoteCode promoteCode = JSON.parseObject(promoteInfoStr, PromoteCode.class);
+        Set<String> ids = stringRedisTemplate.opsForZSet().reverseRangeByScore(RedisKey.PanCustServiceIdView+promoteId,-1,promoteCode.getHourUvMax(),0,1);
+        if (ids == null || ids.size() == 0){
+            res.put("err","ids null");
+            return res;
+        }
+        //.校验当前客服ID全天访问量是否达到上限
+        String custserviceId = ids.toArray()[0].toString();
+        Double dayView = stringRedisTemplate.opsForZSet().score(RedisKey.PanCustServiceIdDayView+promoteId, custserviceId);
+        if (dayView == null){
+            dayView = 0.00;
+        }
+        if (dayView > promoteCode.getDayUvMax()){
+            res.put("err","custservice day view max");
+            return res;
+        }
+        //.获取个微客服相信信息
+        Object jsonStr = stringRedisTemplate.opsForHash().get(RedisKey.PanCustServiceInfo,custserviceId);
+        Custservice custservice = JSON.parseObject(jsonStr.toString(),Custservice.class);
+        //.记录打点数
+        stringRedisTemplate.opsForZSet().incrementScore(RedisKey.PanCustServiceIdView+promoteId,custserviceId,1);
+        //.记录全天打点数
+        stringRedisTemplate.opsForZSet().incrementScore(RedisKey.PanCustServiceIdDayView+promoteId,custserviceId,1);
+        res.put("res",custservice);
+        return res;
+    }
+
 }

+ 20 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/DomainFirstServiceImpl.java

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
+import com.mokamrp.privates.mapper.pangu.DomainFirstMapper;
+import com.mokamrp.privates.service.pangu.DomainFirstService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 一级域名库 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+@Service
+public class DomainFirstServiceImpl extends ServiceImpl<DomainFirstMapper, DomainFirst> implements DomainFirstService {
+
+}

+ 20 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/DomainSecondServiceImpl.java

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
+import com.mokamrp.privates.mapper.pangu.DomainSecondMapper;
+import com.mokamrp.privates.service.pangu.DomainSecondService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 二级域名库 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-15
+ */
+@Service
+public class DomainSecondServiceImpl extends ServiceImpl<DomainSecondMapper, DomainSecond> implements DomainSecondService {
+
+}

+ 39 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/PlaybillGroupServiceImpl.java

@@ -0,0 +1,39 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.entity.pangu.PlaybillGroupListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
+import com.mokamrp.privates.mapper.pangu.pojo.PlaybillGroup;
+import com.mokamrp.privates.mapper.pangu.PlaybillGroupMapper;
+import com.mokamrp.privates.service.pangu.PlaybillGroupService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘古海报分组 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Service
+public class PlaybillGroupServiceImpl extends ServiceImpl<PlaybillGroupMapper, PlaybillGroup> implements PlaybillGroupService {
+    @Autowired
+    public PlaybillGroupMapper playbillGroupMapper;
+
+    public Object getlist(PlaybillGroupListHandle playbillGroupListHandle){
+        Page<PlaybillGroup> page = new Page<>(playbillGroupListHandle.getPage(),playbillGroupListHandle.getPagesize());
+        List<PlaybillGroup> playbillGroups = playbillGroupMapper.getlist(page,playbillGroupListHandle);
+        Map<String,Object> res = new HashMap<>();
+        res.put("list",playbillGroups);
+        res.put("total",page.getTotal());
+        return res;
+    }
+}

+ 38 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/PlaybillServiceImpl.java

@@ -0,0 +1,38 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.entity.pangu.PlaybillListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
+import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
+import com.mokamrp.privates.mapper.pangu.PlaybillMapper;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘古海报库 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Service
+public class PlaybillServiceImpl extends ServiceImpl<PlaybillMapper, Playbill> implements PlaybillService {
+    @Autowired
+    public PlaybillMapper playbillMapper;
+
+    public Object getlist(PlaybillListHandle playbillListHandle){
+        Page<Playbill> page = new Page<>(playbillListHandle.getPage(),playbillListHandle.getPagesize());
+        List<Playbill> playbills = playbillMapper.getlist(page,playbillListHandle);
+        Map<String,Object> res = new HashMap<>();
+        res.put("list",playbills);
+        res.put("total",page.getTotal());
+        return res;
+    }
+}

+ 99 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteCodeServiceImpl.java

@@ -0,0 +1,99 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.entity.pangu.PromoteCodeListHandle;
+import com.mokamrp.privates.mapper.pangu.pojo.*;
+import com.mokamrp.privates.mapper.pangu.PromoteCodeMapper;
+import com.mokamrp.privates.service.pangu.DomainFirstService;
+import com.mokamrp.privates.service.pangu.DomainSecondService;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+/**
+ * <p>
+ * 盘古活码库 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Service
+public class PromoteCodeServiceImpl extends ServiceImpl<PromoteCodeMapper, PromoteCode> implements PromoteCodeService {
+    @Autowired
+    public PromoteCodeMapper promoteCodeMapper;
+
+    @Autowired
+    public DomainFirstService domainFirstService;
+
+    @Autowired
+    public DomainSecondService domainSecondService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    public Object getlist(PromoteCodeListHandle promoteCodeListHandle){
+        Page<PromoteCodeVo> page = new Page<PromoteCodeVo>(promoteCodeListHandle.getPage(),promoteCodeListHandle.getPagesize());
+        List<PromoteCodeVo> list = promoteCodeMapper.getlist(page,promoteCodeListHandle);
+        Map<String,Object> res = new HashMap<>();
+        res.put("list",list);
+        res.put("total",page.getTotal());
+        return res;
+    }
+
+    public Object getInfo(String id){
+        PromoteCodeVo info = promoteCodeMapper.getInfo(id);
+        return info;
+    }
+
+    public Map<String,Object> add(PromoteCode promoteCode){
+        List<DomainFirst> domainFirstList = domainFirstService.list();
+        List<DomainSecond> domainSecondList = domainSecondService.list();
+//        List<PromoteCode> promoteCodeList = this.list();
+        Integer firstDomainId = 0;
+        //.随机抽取一个一级域名
+        if (domainFirstList.size() > 0){
+            Random random = new Random();
+            int n = random.nextInt(domainFirstList.size());
+            firstDomainId = domainFirstList.get(n).getId();
+        }
+        //.检测是否还有可用的一级域名 (一个域名对应一个活码版本)
+//        for (DomainFirst domainFirst : domainFirstList){
+//            Boolean domainIsON = false;
+//            for (PromoteCode info : promoteCodeList){
+//                if(info.getDomainId() == domainFirst.getId()){
+//                    domainIsON = true;
+//                }
+//            }
+//            if (domainIsON == false){
+//                firstDomainId = domainFirst.getId();
+//            }
+//        }
+        Map<String,Object> res = new HashMap<>();
+        if (firstDomainId == 0){
+            res.put("err","noFirst");
+        }else{
+            promoteCode.setDomainId(firstDomainId);
+            this.save(promoteCode);
+            res.put("err",null);
+        }
+        return res;
+    }
+
+    public Object getRandPromoteCode(String promoteId){
+        String domain = stringRedisTemplate.opsForSet().randomMember(RedisKey.PanSecondDomainList);
+        if (domain == null || domain.equals("")){
+            return "";
+        }
+        return domain+"/pangu/custservice/qr-pool?promoteId="+promoteId;
+    }
+}

+ 98 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteQrcodePoolServiceImpl.java

@@ -0,0 +1,98 @@
+package com.mokamrp.privates.service.pangu.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.entity.PostBasePageHandle;
+import com.mokamrp.privates.entity.pangu.SetPromoteQrcodeHandle;
+import com.mokamrp.privates.mapper.pangu.PromoteCodeMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
+import com.mokamrp.privates.mapper.pangu.PromoteQrcodePoolMapper;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolVo;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.function.Function;
+
+/**
+ * <p>
+ * 盘古活码内 个微二维码池 服务实现类
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-11
+ */
+@Service
+public class PromoteQrcodePoolServiceImpl extends ServiceImpl<PromoteQrcodePoolMapper, PromoteQrcodePool> implements PromoteQrcodePoolService {
+
+    @Autowired
+    public PromoteQrcodePoolMapper promoteQrcodePoolMapper;
+
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    /**
+     * 活码内个微海报码列表
+     * @param pageHandle
+     * @return
+     */
+    public Object getlist(PostBasePageHandle pageHandle){
+        Page<PromoteQrcodePoolVo> page = new Page<PromoteQrcodePoolVo>(pageHandle.getPage(),pageHandle.getPagesize());
+        List<PromoteQrcodePoolVo> list = promoteQrcodePoolMapper.getlist(page,pageHandle);
+        Map<String,Object> res = new HashMap<>();
+        res.put("list",list);
+        res.put("total",page.getTotal());
+        return res;
+    }
+
+    /**
+     * 设置活码内的客服和海报列表
+     * @param setPromoteQrcodeHandle
+     * @return
+     */
+    public Boolean setPromoteQrcode(SetPromoteQrcodeHandle setPromoteQrcodeHandle){
+        this.remove(new QueryWrapper<PromoteQrcodePool>().eq("promote_id",setPromoteQrcodeHandle.getPromoteId()));
+        List<PromoteQrcodePool> add = new ArrayList<>();
+        for (Integer custserviceId : setPromoteQrcodeHandle.getCustserviceIds()){
+            PromoteQrcodePool info = new PromoteQrcodePool();
+            info.setPromoteId(setPromoteQrcodeHandle.getPromoteId());
+            info.setCustserviceId(custserviceId);
+            info.setPlaybillId(setPromoteQrcodeHandle.getPlaybillId());
+            info.setCreateAt(LocalDateTime.now());
+            info.setUpdateAt(info.getCreateAt());
+            add.add(info);
+        }
+        this.saveBatch(add);
+        PromoteCode promoteCode = new PromoteCode();
+        promoteCode.setPlaybillId(setPromoteQrcodeHandle.getPlaybillId());
+        promoteCodeService.update(promoteCode,new QueryWrapper<PromoteCode>().eq("id",setPromoteQrcodeHandle.getPromoteId()));
+        return true;
+    }
+
+    /**
+     * 通过ID获取信息
+     * @param id
+     * @return
+     */
+    public PromoteQrcodePoolVo getInfoById(String id){
+        PostBasePageHandle pageHandle = new PostBasePageHandle();
+        pageHandle.setId(Integer.parseInt(id));
+        pageHandle.setPage(1);
+        pageHandle.setPage(1);
+        Page<PromoteQrcodePoolVo> page = new Page<PromoteQrcodePoolVo>(pageHandle.getPage(),pageHandle.getPagesize());
+        List<PromoteQrcodePoolVo> list = promoteQrcodePoolMapper.getlist(page,pageHandle);
+        if (list.get(0) == null){
+            return null;
+        }
+        PromoteQrcodePoolVo res = list.get(0);
+        return res;
+    }
+}

+ 56 - 0
src/main/java/com/mokamrp/privates/tast/pangu/CheckH5DomainStatus.java

@@ -0,0 +1,56 @@
+package com.mokamrp.privates.tast.pangu;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
+import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
+import com.mokamrp.privates.service.pangu.DomainFirstService;
+import com.mokamrp.privates.service.pangu.DomainSecondService;
+import com.mokamrp.privates.utils.Cmd;
+import com.mokamrp.privates.utils.http.HttpUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Component
+public class CheckH5DomainStatus {
+    @Autowired
+    public DomainFirstService domainFirstService;
+
+    @Autowired
+    public DomainSecondService domainSecondService;
+
+    private final String feishu = "https://open.feishu.cn/open-apis/bot/v2/hook/d2b5556d-30fb-400e-b10f-cb9310dbc705";
+
+    @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    public void execute() {
+        System.out.println("[cronjob]:检测域名备案状态");
+        List<DomainFirst> domainFirstList = domainFirstService.list(new QueryWrapper<DomainFirst>().eq("is_record", 1));
+        List<DomainSecond> domainSecondList = domainSecondService.list(new QueryWrapper<DomainSecond>().eq("is_record", 1));
+        for (DomainFirst domainFirst : domainFirstList) {
+            String res = HttpUtils.sendGet(domainFirst.getDomain(), "");
+            if (res.contains("JSJENRU281J40AS78ZHZBAB3I49193H2N") == false) {
+                //.更新状态为域名未备案
+                DomainFirst save = new DomainFirst();
+                save.setIsRecord(2);
+                save.setForbbidenAt(LocalDateTime.now());
+                domainFirstService.update(save, new QueryWrapper<DomainFirst>().eq("id", domainFirst.getId()));
+                Cmd.sendFeishuMsg(feishu, "[警告]:一级域名" + domainFirst.getDomain() + "页面无法访问");
+            }
+        }
+        for (DomainSecond domainSecond : domainSecondList) {
+            String res = HttpUtils.sendGet(domainSecond.getDomain(), "");
+            if (res.contains("JSJENRU281J40AS78ZHZBAB3I49193H2N") == false) {
+                //.更新备案状态
+                DomainSecond save = new DomainSecond();
+                save.setIsRecord(2);
+                save.setForbbidenAt(LocalDateTime.now());
+                domainSecondService.update(save, new QueryWrapper<DomainSecond>().eq("id", domainSecond.getId()));
+                Cmd.sendFeishuMsg(feishu, "[警告]:二级域名" + domainSecond.getDomain() + "页面无法访问");
+            }
+        }
+    }
+}

+ 236 - 0
src/main/java/com/mokamrp/privates/tast/pangu/CheckWxDomainStatus.java

@@ -0,0 +1,236 @@
+package com.mokamrp.privates.tast.pangu;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
+import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
+import com.mokamrp.privates.service.pangu.DomainFirstService;
+import com.mokamrp.privates.service.pangu.DomainSecondService;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.utils.Cmd;
+import com.mokamrp.privates.utils.http.HttpResponsePojo;
+import com.mokamrp.privates.utils.http.HttpUtils;
+import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class CheckWxDomainStatus {
+
+    @Autowired
+    public DomainFirstService domainFirstService;
+
+    @Autowired
+    public DomainSecondService domainSecondService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    private final String domain = "open.weixin.qq.com";
+    private final String homepageurl = "https://open.weixin.qq.com/";
+    private final String loginurl = "https://open.weixin.qq.com/cgi-bin/login";
+    private final String checkdomianurl = "https://open.weixin.qq.com/cgi-bin/component_acct";
+    private final String feishu = "https://open.feishu.cn/open-apis/bot/v2/hook/d2b5556d-30fb-400e-b10f-cb9310dbc705";
+
+    private final String account = "kaifa01@hzlomo.cn";
+    private final String passwd = "b95495d2b655e0cd832244427261b76a";
+
+    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
+
+    @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    public void execute() {
+        System.out.println("[cronjob]:检测域名微信内封禁状态");
+        List<DomainFirst> domainFirstList = domainFirstService.list(new QueryWrapper<DomainFirst>().ne("status",3));
+        List<DomainSecond> domainSecondList = domainSecondService.list(new QueryWrapper<DomainSecond>().ne("status",2));
+        for (DomainFirst domainFirst : domainFirstList){
+            Boolean res = this.checkDomain(domainFirst.getDomain());
+            if (res == false){
+                //.更新状态为域名封禁
+                DomainFirst save = new DomainFirst();
+                save.setStatus(3);
+                save.setForbbidenAt(LocalDateTime.now());
+                domainFirstService.update(save,new QueryWrapper<DomainFirst>().eq("id",domainFirst.getId()));
+                Cmd.sendFeishuMsg(feishu,"[警告]:一级域名"+domainFirst.getDomain()+"被封禁");
+            }
+        }
+        for (DomainSecond domainSecond : domainSecondList){
+            Boolean res = this.checkDomain(domainSecond.getDomain());
+            if (res == false){
+                //.更新状态 同时去除redis
+                stringRedisTemplate.opsForZSet().remove(RedisKey.PanSecondDomainList,domainSecond.getDomain());
+                DomainSecond save = new DomainSecond();
+                save.setStatus(2);
+                save.setForbbidenAt(LocalDateTime.now());
+                domainSecondService.update(save,new QueryWrapper<DomainSecond>().eq("id",domainSecond.getId()));
+                Cmd.sendFeishuMsg(feishu,"[警告]:二级域名"+domainSecond.getDomain()+"被封禁");
+            }
+        }
+    }
+
+    public Boolean checkDomain(String domain){
+        String checkDomain = domain;
+        Map<String, Object> tokenRes = this.getToken();
+        if (tokenRes.get("token") == null) {
+            //.登录失败
+            return true;
+        }
+        String cookie = "data_bizuin=" + tokenRes.get("dataBizuin") +
+                ";data_ticket=" + tokenRes.get("dataTicket") +
+                ";ticket=ab8b1f3f74f3594bc7541689dd673ec452e0b3a6;cert=pp3fphHQZw07bwrLrnebTgMiciggnp0d" +
+                ";fake_id=" + tokenRes.get("fakeId") +
+                ";master_sid=" + tokenRes.get("masterSid");
+        Map<String, String> header = this.buildHeader();
+        header.put("Cookie", cookie);
+        String params = "wxa_server_domain=&" +
+                "jump_h5_domain=&" +
+                "appid=wx5bafb2538d3d9402&" +
+                "action=check_domain_by_scene&" +
+                "key=check_domain_by_scene&" +
+                "lang=zh_CN&" +
+                "f=json&" +
+                "token=" + tokenRes.get("token") + "&" +
+                "sns_domain=" + checkDomain;
+        HttpResponsePojo checkRes = sendPost(this.checkdomianurl, header, params);
+        JSONObject body = JSON.parseObject(checkRes.getBody());
+        JSONObject baseResp = JSON.parseObject(body.getJSONObject("base_resp").toString());
+        if (Integer.parseInt(baseResp.get("ret").toString()) == 1053) {
+            //.域名封禁
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 获取登录token
+     *
+     * @return
+     */
+    public Map<String, Object> getToken() {
+        Map<String, Object> res = new HashMap<>();
+        String jsonStr = stringRedisTemplate.opsForValue().get(RedisKey.CheckWxDomainToken);
+        if (jsonStr != null && !jsonStr.isEmpty()){
+            res = JSON.parseObject(jsonStr,Map.class);
+            return res;
+        }
+        Map<String, String> header = this.buildHeader();
+        String params = "token=&" +
+                "lang=zh_CN&" +
+                "f=json&" +
+                "ajax=1&" +
+                "key=1&" +
+                "account=" + account + "&" +
+                "passwd=" + passwd + "&";
+        HttpResponsePojo httpResponsePojo = this.sendPost(this.loginurl, header, params);
+        List<String> setCookie = httpResponsePojo.getResponseHeader().get("Set-Cookie");
+        List<String> cookies = new ArrayList<>(setCookie);
+        for (int i = 0; i < cookies.size(); i++) {
+            cookies.set(i, cookies.get(i).split(";")[0]);
+            cookies.set(i, cookies.get(i).split("=")[1]);
+        }
+        JSONObject body = JSON.parseObject(httpResponsePojo.getBody());
+        JSONObject baseResp = JSON.parseObject(body.getJSONObject("base_resp").toString());
+        if (Integer.parseInt(baseResp.get("ret").toString()) == 0) {
+            res.put("token", baseResp.get("token").toString());
+            res.put("dataBizuin", cookies.get(3));
+            res.put("dataTicket", cookies.get(2));
+            res.put("fakeId", cookies.get(1));
+            res.put("masterSid", cookies.get(0));
+            stringRedisTemplate.opsForValue().set(RedisKey.CheckWxDomainToken,JSON.toJSONString(res));
+            stringRedisTemplate.expire(RedisKey.CheckWxDomainToken,3600, TimeUnit.SECONDS);
+        }
+        return res;
+    }
+
+    public Map<String, String> buildHeader() {
+        Map<String, String> header = new HashMap<>();
+        header.put("Referer", "https://open.weixin.qq.com/cgi-bin/frame?t=home/mp_tmpl&lang=zh_CN");
+        header.put("Host", "open.weixin.qq.com");
+        header.put("Origin", "https://mp.weixin.qq.com");
+        header.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36");
+        header.put("X-Requested-With", "XMLHttpRequest");
+        header.put("Connection","keep-alive");
+        header.put("Accept", "application/json, text/javascript, */*; q=0.01");
+        header.put("Accept-Encoding", "gzip, deflate, br");
+        header.put("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
+        header.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+        header.put("Cookie", "pgv_pvi=2698027008; ptui_loginuin=1935951743; pt2gguin=o1935951743; RK=tmwoZCHVY0; ptcz=0323743c131b12434561be1c3136cd79bf79d526ac7f6e0dd935c6e73e74013f; pgv_pvid=6597685168; data_bizuin=3508179233; _qpsvr_localtk=1533696622886; data_ticket=i/mHR9mcpIYcoKi37t5TbUz3IrlSD25lQ8SFa7fp27rAL0w7xNxgvQsvUfvt1w6r; ticket_id=0; ticket=a88ec404a133959fc82c23293d077b843c43f9de; cert=pc9NWFBxXQWyb3Ih8s0Zy1Z4Fo2on3DD");
+        return header;
+    }
+
+    public static HttpResponsePojo sendPost(String url, Map<String, String> header, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        Map<String, List<String>> responseHeader = new HashMap<>();
+        try {
+            String urlNameString = url;
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            for (Map.Entry<String, String> entry : header.entrySet()) {
+                conn.setRequestProperty(entry.getKey(), entry.getValue());
+            }
+//            conn.setRequestProperty("accept", "*/*");
+//            conn.setRequestProperty("connection", "Keep-Alive");
+//            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+//            conn.setRequestProperty("Accept-Charset", "utf-8");
+//            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
+            String line;
+            responseHeader = conn.getHeaderFields();
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        } catch (ConnectException e) {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        } catch (SocketTimeoutException e) {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        } catch (IOException e) {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        } catch (Exception e) {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        HttpResponsePojo httpResponsePojo = new HttpResponsePojo();
+        httpResponsePojo.setBody(result.toString());
+        httpResponsePojo.setResponseHeader(responseHeader);
+        return httpResponsePojo;
+    }
+}
+

+ 47 - 0
src/main/java/com/mokamrp/privates/tast/pangu/PlaybillQrcodeXYTask.java

@@ -0,0 +1,47 @@
+package com.mokamrp.privates.tast.pangu;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
+import com.mokamrp.privates.service.WorkEmployeeService;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import com.mokamrp.privates.utils.http.HttpUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class PlaybillQrcodeXYTask {
+
+    @Autowired
+    public PlaybillService playbillService;
+
+    @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    public void execute() {
+        System.out.println("[cronjob]:海报二维码坐标识别任务开始执行");
+        List<Playbill> list = playbillService.list(new QueryWrapper<Playbill>().eq("qrcode_x",""));
+        for (Playbill playbill : list){
+            String body = "url="+playbill.getPlaybill();
+            String res = HttpUtils.sendPost("http://47.96.125.56:10010/coralapi/image/qrdetect",body);
+            JSONObject object = JSON.parseObject(res);
+            if (object.get("code") != null && object.get("code").toString().equals("0")){
+                List<String> xy = new ArrayList<>();
+                xy = JSON.parseArray(object.getJSONArray("data").toString(),String.class);
+                String leftTop = xy.get(0)+","+xy.get(1);
+                String rightBottom = xy.get(2)+","+xy.get(3);
+                //.更新坐标值
+                Playbill save = new Playbill();
+                save.setQrcodeX(leftTop);
+                save.setQrcodeY(rightBottom);
+                save.setUpdateAt(LocalDateTime.now());
+                playbillService.update(save,new QueryWrapper<Playbill>().eq("id",playbill.getId()));
+            }
+        }
+    }
+}

+ 45 - 0
src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceDayViewTask.java

@@ -0,0 +1,45 @@
+package com.mokamrp.privates.tast.pangu;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.utils.http.HttpUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Component
+public class ResetCustserviceDayViewTask {
+
+    @Autowired
+    public PlaybillService playbillService;
+
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    @Scheduled(cron = "0 0 0 * * ?") //.每天0点重置每日个微客服访问量
+    public void execute() {
+        System.out.println("[cronjob]:盘古活码个微每日访问量清空");
+        List<PromoteCode> promoteCodeList = promoteCodeService.list();
+        for (PromoteCode promoteCode : promoteCodeList) {
+            Set<String> members = stringRedisTemplate.opsForZSet().range(RedisKey.PanCustServiceIdDayView+Integer.toString(promoteCode.getId()),0,-1);
+            for (String member : members){
+                stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdDayView+Integer.toString(promoteCode.getId()), member, 0);
+            }
+        }
+    }
+}

+ 53 - 0
src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceViewTask.java

@@ -0,0 +1,53 @@
+package com.mokamrp.privates.tast.pangu;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
+import com.mokamrp.privates.service.pangu.PlaybillService;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class ResetCustserviceViewTask {
+
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    @Autowired
+    public PromoteQrcodePoolService promoteQrcodePoolService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    @Scheduled(cron = "0 */1 * * * ?") //.每小时重置个微客户访问量
+    public void execute() {
+        System.out.println("[cronjob]:盘古活码个微每小时访问量清空");
+        List<PromoteCode> promoteCodeList = promoteCodeService.list();
+        for (PromoteCode promoteCode : promoteCodeList) {
+            List<PromoteQrcodePool> promoteQrcodePoolList = promoteQrcodePoolService.list(new QueryWrapper<PromoteQrcodePool>().eq("promote_id", promoteCode.getId()));
+            for (PromoteQrcodePool promoteQrcodePool : promoteQrcodePoolList){
+                this.addRedis(promoteCode.getId(),promoteQrcodePool.getCustserviceId(),promoteQrcodePool.getWeight());
+            }
+        }
+    }
+
+    private Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight) {
+        Float score = weight.floatValue() / 10000;
+        Long index = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId));
+        //.redis存在记录时才做更新
+        if (index != null) {
+            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId), score);
+            return true;
+        }
+        return false;
+    }
+
+}

+ 20 - 0
src/main/java/com/mokamrp/privates/utils/Cmd.java

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.mokamrp.privates.utils.http.HttpUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Cmd {
+    public static Boolean sendFeishuMsg(String url,String msg){
+        Map<String,Object> body = new HashMap<>();
+        Map<String,Object> content = new HashMap<>();
+        content.put("text",msg);
+        body.put("msg_type","text");
+        body.put("content",content);
+        String res = HttpUtils.sendPost(url,JSON.toJSONString(body),"utf-8");
+        return true;
+    }
+}

+ 12 - 0
src/main/java/com/mokamrp/privates/utils/http/HttpResponsePojo.java

@@ -0,0 +1,12 @@
+package com.mokamrp.privates.utils.http;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class HttpResponsePojo {
+    private String body;
+    private Map<String, List<String>> responseHeader;
+}

+ 48 - 0
src/main/java/com/mokamrp/privates/utils/http/HttpUtils.java

@@ -1,6 +1,15 @@
 package com.mokamrp.privates.utils.http;
 
 import com.mokamrp.privates.constant.Constants;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -11,6 +20,7 @@ import java.net.SocketTimeoutException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.security.cert.X509Certificate;
+import java.text.ParseException;
 import java.util.Map;
 
 /**
@@ -133,6 +143,44 @@ public class HttpUtils {
         return result.toString();
     }
 
+    public static String sendPost(String url, String jsonStr, String encoding) {
+        String body = "";
+        try {
+            //创建httpclient对象
+            CloseableHttpClient client = HttpClients.createDefault();
+            //创建post方式请求对象
+            HttpPost httpPost = new HttpPost(url);
+            //装填参数
+            StringEntity s = new StringEntity(jsonStr, "utf-8");
+            s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
+                    "application/json"));
+            //设置参数到请求对象中
+            httpPost.setEntity(s);
+            //        System.out.println("请求地址:"+url);
+            //        System.out.println("请求参数:"+nvps.toString());
+            //设置header信息
+            //指定报文头【Content-type】、【User-Agent】
+            //        httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
+            httpPost.setHeader("Content-type", "application/json");
+            httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+            //执行请求操作,并拿到结果(同步阻塞)
+            CloseableHttpResponse response = client.execute(httpPost);
+            //获取结果实体
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                //按指定编码转换结果实体为String类型
+                body = EntityUtils.toString(entity, encoding);
+            }
+            EntityUtils.consume(entity);
+            //释放链接
+            response.close();
+        }catch (Exception e){
+            return "send error";
+        }
+        return body;
+    }
+
+
     public static String sendSSLPost(String url, String param) {
         StringBuilder result = new StringBuilder();
         String urlNameString = url + "?" + param;

+ 2 - 2
src/main/resources/application-local.properties

@@ -35,9 +35,9 @@ aliyun.bucketName=mini-short-video-test
 spring.servlet.multipart.max-request-size=10MB
 spring.servlet.multipart.max-file-size=10MB
 
-xxl.sso.server=https://sso.mokamrp.com/sso 
+xxl.sso.server=https://sso.mokamrp.com/sso
 xxl.sso.logout.path=/logout
-xxl-sso.excluded.paths=/healthy
+xxl-sso.excluded.paths=/healthy,/pangu/custservice/getRandCustservice,/pangu/promoteCode/getRandPromoteCode,/mochat/weWork/callback
 #xxl.sso.redis.address=redis://xxl-sso:Jch9shshl@r-uf633f3f27aa2174pd.redis.rds.aliyuncs.com:6379/0
 xxl.sso.redis.address=redis://xxl-sso:MokaSapce666$%25_RediS@r-uf6727zrr24ioihy72pd.redis.rds.aliyuncs.com:23563/0
 

+ 1 - 1
src/main/resources/application-prod.properties

@@ -35,7 +35,7 @@ spring.servlet.multipart.max-file-size=10MB
 
 xxl.sso.server=https://sso.mokamrp.com/sso
 xxl.sso.logout.path=/logout
-xxl-sso.excluded.paths=/healthy
+xxl-sso.excluded.paths=/healthy,/pangu/custservice/getRandCustservice,/pangu/promoteCode/getRandPromoteCode,/mochat/weWork/callback
 xxl.sso.redis.address=redis://xxl-sso:MokaSapce666$%25_RediS@r-uf6727zrr24ioihy72.redis.rds.aliyuncs.com:6379/0
 
 menu.host=http://space-server-in-svc/space/menu/getMenuInterface?sysCode=1006&userId=

+ 2 - 2
src/main/resources/application-test.properties

@@ -27,7 +27,7 @@ spring.redis.jedis.pool.max-wait=-1ms
 #阿里云oss配置(增加一个cdn地址配置)
 aliyun.host=http://mini-short-video-oss.lushenjin.cn/
 aliyun.endpoint=https://oss-cn-hangzhou.aliyuncs.com
-aliyun.accessKeyId=LTAI4FnmkS1SNFkaKb4YZ1ga
+aliyun.accessKeyId=LTAI4FnmkS1SNFkaKb4YZ1ga 
 aliyun.accessKeySecret=irLfHOni7ffLU3yAf3LsKEXwQLfrNc
 aliyun.bucketName=mini-short-video-test
 spring.servlet.multipart.max-request-size=10MB
@@ -35,7 +35,7 @@ spring.servlet.multipart.max-file-size=10MB
 
 xxl.sso.server=https://sso.mokamrp.com/sso
 xxl.sso.logout.path=/logout
-xxl-sso.excluded.paths=/healthy
+xxl-sso.excluded.paths=/healthy,/pangu/custservice/getRandCustservice,/pangu/promoteCode/getRandPromoteCode,/mochat/weWork/callback
 #xxl.sso.redis.address=redis://xxl-sso:Jch9shshl@r-uf633f3f27aa2174pd.redis.rds.aliyuncs.com:6379/0
 xxl.sso.redis.address=redis://xxl-sso:MokaSapce666$%25_RediS@r-uf6727zrr24ioihy72pd.redis.rds.aliyuncs.com:23563/0
 

+ 2 - 1
src/test/java/com/mokamrp/AutoMPPangu.java

@@ -47,13 +47,14 @@ public class AutoMPPangu {
 				.setColumnNaming(NamingStrategy.underline_to_camel)
 				.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略,下划线转驼峰命名
 				.setTablePrefix("pan_") //表名前缀
-				.setInclude("pan_custservice");  //生成的表
+				.setInclude("pan_domain_second");  //生成的表
 		
 		//4. 包名策略配置 
 		PackageConfig pkConfig = new PackageConfig();
 		pkConfig.setParent("com.mokamrp.privates")
 				.setMapper("mapper.pangu")
 				.setService("service.pangu")
+				.setServiceImpl("service.pangu.impl")
 				.setController("controller.pangu")
 				.setEntity("mapper.pangu.pojo")
 				.setXml("mapper.pangu");