Ver Fonte

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

# Conflicts:
#	src/main/java/com/mokamrp/privates/controller/CorpController.java
MOKASZ\wzk12044 há 5 anos atrás
pai
commit
5dd6d808e4
35 ficheiros alterados com 2139 adições e 395 exclusões
  1. 7 0
      pom.xml
  2. 83 0
      src/main/java/com/mokamrp/privates/config/OSSConfiguration.java
  3. 117 0
      src/main/java/com/mokamrp/privates/config/RedisConfig.java
  4. 29 17
      src/main/java/com/mokamrp/privates/controller/BaseController.java
  5. 1 2
      src/main/java/com/mokamrp/privates/controller/CorpController.java
  6. 20 0
      src/main/java/com/mokamrp/privates/controller/DownfileController.java
  7. 0 4
      src/main/java/com/mokamrp/privates/controller/UserCorpController.java
  8. 70 3
      src/main/java/com/mokamrp/privates/controller/WorkContactEmployeeController.java
  9. 9 15
      src/main/java/com/mokamrp/privates/controller/WorkContactRoomController.java
  10. 60 23
      src/main/java/com/mokamrp/privates/controller/WorkRoomController.java
  11. 26 0
      src/main/java/com/mokamrp/privates/entity/GetWorkContactEmployeeHandle.java
  12. 24 0
      src/main/java/com/mokamrp/privates/entity/GetWorkRoomHandle.java
  13. 1 1
      src/main/java/com/mokamrp/privates/entity/IndexHandle.java
  14. 55 0
      src/main/java/com/mokamrp/privates/entity/JobRedis.java
  15. 19 0
      src/main/java/com/mokamrp/privates/entity/JobRoomJobRedis.java
  16. 119 0
      src/main/java/com/mokamrp/privates/entity/JobWorkContactEmployeeRedis.java
  17. 16 0
      src/main/java/com/mokamrp/privates/mapper/DownfileMapper.java
  18. 26 0
      src/main/java/com/mokamrp/privates/mapper/DownfileMapper.xml
  19. 3 1
      src/main/java/com/mokamrp/privates/mapper/WorkContactEmployeeMapper.java
  20. 22 1
      src/main/java/com/mokamrp/privates/mapper/WorkContactEmployeeMapper.xml
  21. 155 0
      src/main/java/com/mokamrp/privates/mapper/pojo/Downfile.java
  22. 0 2
      src/main/java/com/mokamrp/privates/mapper/pojo/User.java
  23. 57 58
      src/main/java/com/mokamrp/privates/mapper/vo/WorkContactEmployeeVo.java
  24. 54 55
      src/main/java/com/mokamrp/privates/mapper/vo/WorkContactRoomByRoomIdVo.java
  25. 81 85
      src/main/java/com/mokamrp/privates/mapper/vo/WorkRoomVo.java
  26. 16 0
      src/main/java/com/mokamrp/privates/service/DownfileService.java
  27. 7 0
      src/main/java/com/mokamrp/privates/service/WorkContactEmployeeService.java
  28. 5 5
      src/main/java/com/mokamrp/privates/service/WorkRoomService.java
  29. 20 0
      src/main/java/com/mokamrp/privates/service/impl/DownfileServiceImpl.java
  30. 118 6
      src/main/java/com/mokamrp/privates/service/impl/WorkContactEmployeeServiceImpl.java
  31. 199 117
      src/main/java/com/mokamrp/privates/service/impl/WorkRoomServiceImpl.java
  32. 71 0
      src/main/java/com/mokamrp/privates/tast/ExportJobTask.java
  33. 72 0
      src/main/java/com/mokamrp/privates/utils/OssFile.java
  34. 568 0
      src/main/java/com/mokamrp/privates/utils/RedisUtil.java
  35. 9 0
      src/main/resources/application.properties

+ 7 - 0
pom.xml

@@ -105,6 +105,13 @@
       <artifactId>mybatis-ehcache</artifactId>
       <version>1.1.0</version>
     </dependency>
+
+    <dependency>
+      <groupId>com.aliyun.oss</groupId>
+      <artifactId>aliyun-sdk-oss</artifactId>
+      <version>3.8.0</version>
+    </dependency>
+
   </dependencies>
   <build>
     <resources>

+ 83 - 0
src/main/java/com/mokamrp/privates/config/OSSConfiguration.java

@@ -0,0 +1,83 @@
+package com.mokamrp.privates.config;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Configuration
+@Component
+public class OSSConfiguration {
+
+    public static final String DOWN_DIR = "mochat/down/";
+
+    private volatile static OSS ossClient;
+
+    private volatile static OSSClientBuilder ossClientBuilder;
+
+    private static String endpoint;
+
+    private static String accessKeyId;
+
+    private static String accessKeySecret;
+
+    @Value("${aliyun.bucketName}")
+    private String bucketName;
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    @Value("${aliyun.host}")
+    private String host;
+
+    @Value("${aliyun.endpoint}")
+    public void setEndpoint(String endpoint) {
+        OSSConfiguration.endpoint = endpoint;
+    }
+
+    @Value("${aliyun.accessKeyId}")
+    public void setAccessKeyId(String accessKeyId) {
+        OSSConfiguration.accessKeyId = accessKeyId;
+    }
+
+    @Value("${aliyun.accessKeySecret}")
+    public void setAccessKeySecret(String accessKeySecret) {
+        OSSConfiguration.accessKeySecret = accessKeySecret;
+    }
+
+    public String getBucketName() {
+        return bucketName;
+    }
+
+    @Bean
+    @Scope("prototype")
+    public static OSS initOSSClient() {
+        if (ossClient == null) {
+            synchronized (OSSConfiguration.class) {
+                if (ossClient == null) {
+                    ossClient = initOSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+                }
+            }
+        }
+        return ossClient;
+    }
+
+    public static OSSClientBuilder initOSSClientBuilder() {
+        if (ossClientBuilder == null) {
+            synchronized (OSSConfiguration.class) {
+                if (ossClientBuilder == null) {
+                    ossClientBuilder = new OSSClientBuilder();
+                }
+            }
+        }
+        return ossClientBuilder;
+    }
+}

+ 117 - 0
src/main/java/com/mokamrp/privates/config/RedisConfig.java

@@ -0,0 +1,117 @@
+package com.mokamrp.privates.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * redis配置类
+ * @program: springbootdemo
+ * @Date: 2021/04/23 15:20
+ * @Author: gy
+ * @Description:
+ */
+@Configuration
+@EnableCaching //开启注解
+public class RedisConfig extends CachingConfigurerSupport {
+
+    /**
+     * retemplate相关配置
+     * @param factory
+     * @return
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // 配置连接工厂
+        template.setConnectionFactory(factory);
+
+        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
+        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
+
+        ObjectMapper om = new ObjectMapper();
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jacksonSeial.setObjectMapper(om);
+
+        // 值采用json序列化
+        template.setValueSerializer(jacksonSeial);
+        //使用StringRedisSerializer来序列化和反序列化redis的key值
+        template.setKeySerializer(new StringRedisSerializer());
+
+        // 设置hash key 和value序列化模式
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(jacksonSeial);
+        template.afterPropertiesSet();
+
+        return template;
+    }
+
+    /**
+     * 对hash类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForHash();
+    }
+
+    /**
+     * 对redis字符串类型数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForValue();
+    }
+
+    /**
+     * 对链表类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForList();
+    }
+
+    /**
+     * 对无序集合类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForSet();
+    }
+
+    /**
+     * 对有序集合类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForZSet();
+    }
+
+}
+

+ 29 - 17
src/main/java/com/mokamrp/privates/controller/BaseController.java

@@ -82,41 +82,53 @@ public class BaseController<T> {
         if (bindingResult.hasErrors()) {
             return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
         }
-        Iterator fileterIt = indexHandle.getFilter().entrySet().iterator();
-        Wrapper<T> warpper = new EntityWrapper<T>();
+        Iterator<Map.Entry<String, String>> filterIt = indexHandle.getFilter().entrySet().iterator();
+        Wrapper<T> wrapper = new EntityWrapper<T>();
         //.@leon where like,=,<>
-        while (fileterIt.hasNext()) {
-            Map.Entry entray = (Map.Entry) fileterIt.next();
-            Object key = entray.getKey();
-            Object value = entray.getValue();
+        while (filterIt.hasNext()) {
+            Map.Entry<String, String> entry = filterIt.next();
+            String key = entry.getKey();
+            String value = entry.getValue();
             Map<String, String> op = indexHandle.getOp();
-            //.这里sql字段需要驼峰转下划线
-            if (op.get(key) == null || op.get(key).isEmpty() || op.get(key).toString().equals("=")) {
-                warpper = warpper.eq(StringUtils.humpToLine2(key.toString()), value.toString());
-            } else if (op.get(key).toString().equals("like")) {
-                warpper = warpper.like(StringUtils.humpToLine2(key.toString()), "%" + value.toString() + "%");
-            } else if (op.get(key).toString().equals("<>")) {
-                warpper = warpper.ne(StringUtils.humpToLine2(key.toString()), value.toString());
+            // 操作符为空,pass
+            if (op.get(key) == null || op.get(key).isEmpty()) {
+                continue;
+            }
+            // 这里sql字段需要驼峰转下划线
+            String columnName = StringUtils.humpToLine2(key);
+            switch (op.get(key)) {
+                case "=":
+                    wrapper = wrapper.eq(columnName, value);
+                    break;
+                case "LIKE":
+                    wrapper = wrapper.like(columnName, "%" + value + "%");
+                    break;
+                case "<>":
+                    wrapper = wrapper.ne(columnName, value);
+                    break;
+                case "IN(...)":
+                    wrapper = wrapper.in(columnName, value);
+                    break;
             }
         }
         //.统计数量
-        Integer total = service.selectCount(warpper);
+        Integer total = service.selectCount(wrapper);
         //.@leon order
         if (indexHandle.getOrder() != null && indexHandle.getSort() != null) {
             String order = indexHandle.getOrder();
             String sort = indexHandle.getSort();
             if (!order.isEmpty() && !sort.isEmpty()) {
                 if (order.equals("asc")) {
-                    warpper = warpper.orderBy(sort, true);
+                    wrapper = wrapper.orderBy(sort, true);
                 } else if (order.equals("desc")) {
-                    warpper = warpper.orderBy(sort, false);
+                    wrapper = wrapper.orderBy(sort, false);
                 }
             }
         }
 
         //.@leon offset limit
         Page<T> page = service.selectPage(
-                new Page<T>(indexHandle.getOffset(), indexHandle.getLimit()), warpper
+                new Page<T>(indexHandle.getOffset(), indexHandle.getLimit()), wrapper
         );
 
         Map<String, Object> resMap = new HashMap<String, Object>();

+ 1 - 2
src/main/java/com/mokamrp/privates/controller/CorpController.java

@@ -26,7 +26,6 @@ import java.util.List;
 @RestController
 @RequestMapping("/corp")
 public class CorpController extends BaseController<Corp>{
-
-
+    
 }
 

+ 20 - 0
src/main/java/com/mokamrp/privates/controller/DownfileController.java

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.controller;
+
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author gy
+ * @since 2021-04-22
+ */
+@RestController
+@RequestMapping("/downfile")
+public class DownfileController extends BaseController<Downfile> {
+
+}
+

+ 0 - 4
src/main/java/com/mokamrp/privates/controller/UserCorpController.java

@@ -11,12 +11,8 @@ import com.mokamrp.privates.mapper.pojo.UserCorp;
 import com.mokamrp.privates.service.UserCorpService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RestController;
-
 import java.util.List;
 import java.util.Map;
 

+ 70 - 3
src/main/java/com/mokamrp/privates/controller/WorkContactEmployeeController.java

@@ -4,22 +4,41 @@ package com.mokamrp.privates.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.PutObjectRequest;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
+import com.mokamrp.privates.config.OSSConfiguration;
+import com.mokamrp.privates.entity.JobRedis;
+import com.mokamrp.privates.entity.JobRoomJobRedis;
+import com.mokamrp.privates.entity.JobWorkContactEmployeeRedis;
 import com.mokamrp.privates.help.AjaxResult;
+import com.mokamrp.privates.interceptor.AuthUser;
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import com.mokamrp.privates.mapper.pojo.User;
 import com.mokamrp.privates.mapper.pojo.WorkContactEmployee;
+import com.mokamrp.privates.mapper.pojo.WorkEmployee;
 import com.mokamrp.privates.mapper.vo.WorkContactEmployeeVo;
+import com.mokamrp.privates.service.DownfileService;
 import com.mokamrp.privates.service.WorkContactEmployeeService;
+import com.mokamrp.privates.utils.OssFile;
+import com.mokamrp.privates.utils.RedisUtil;
 import io.netty.handler.codec.json.JsonObjectDecoder;
+import lombok.extern.flogger.Flogger;
 import org.apache.ibatis.annotations.Param;
+import org.apache.xerces.xs.datatypes.ObjectList;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.Max;
+import java.io.ByteArrayInputStream;
 import java.util.*;
 
 
@@ -31,16 +50,23 @@ import java.util.*;
  * @author gengyang
  * @since 2021-04-17
  */
-@Controller
+@RestController
 @RequestMapping("/workContactEmployee")
-public class WorkContactEmployeeController {
+public class WorkContactEmployeeController extends BaseController<WorkContactEmployee>{
 
     @Autowired
     private WorkContactEmployeeService WorkContactEmployeeService;
 
-    @RequestMapping("/index")
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private DownfileService downfileService;
+
+    @RequestMapping("/list")
     @ResponseBody
     public Object getList(
+            @AuthUser User authUser,
             Integer gender, Integer status,
             Integer pagesize, Integer page, String name,
             Integer start_deleted_at, Integer end_deleted_at,
@@ -58,4 +84,45 @@ public class WorkContactEmployeeController {
 
     }
 
+    @RequestMapping("/export")
+    @ResponseBody
+    public Object export(
+            Integer gender, Integer status,String name,
+            Integer start_deleted_at, Integer end_deleted_at,
+            Integer start_created_at, Integer end_created_at,
+            Integer group_id, Integer corp_id,@RequestParam List employee_id, @RequestParam List tag_id , Integer channel_code_id
+    ){
+
+        Downfile downObj = new Downfile();
+        downObj.setMsg(Downfile.DEFAULT_MSG);
+        downObj.setTitle(Downfile.WORK_CONTACT_EMPLOYEE);
+        downfileService.insert(downObj);
+
+        /*推送一个简单下载任务*/
+        JobRedis realJob = new JobRedis();
+        JobWorkContactEmployeeRedis job = new JobWorkContactEmployeeRedis();
+        job.setGender(gender);
+        job.setStatus(status);
+        job.setName(name);
+        job.setStartCreatedAt(start_created_at);
+        job.setEndCreatedAt(end_created_at);
+        job.setStartDeletedAt(start_deleted_at);
+        job.setEndDeletedAt(end_deleted_at);
+        job.setGroupId(group_id);
+        job.setCorpId(corp_id);
+        job.setEmployeeId(employee_id);
+        job.setTagId(tag_id);
+        job.setChannelCodeId(channel_code_id);
+
+        realJob.setJobWorkContactEmployeeRedis(job);
+        realJob.setJobName(JobWorkContactEmployeeRedis.TASK_NAME);
+        realJob.setDownFile(downObj);
+
+        redisUtil.leftPush(JobRedis.QUEUE_KEY,realJob);
+
+        return AjaxResult.success("正在异步生成请稍后");
+
+    }
+
+
 }

+ 9 - 15
src/main/java/com/mokamrp/privates/controller/WorkContactRoomController.java

@@ -1,39 +1,33 @@
 package com.mokamrp.privates.controller;
 
-import com.mokamrp.privates.entity.IndexHandle;
-import com.mokamrp.privates.help.AjaxResult;
-import com.mokamrp.privates.mapper.pojo.WorkContactRoom;
+import com.mokamrp.privates.mapper.pojo.*;
 import com.mokamrp.privates.service.WorkContactRoomService;
 import org.springframework.beans.factory.annotation.Autowired;
 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 org.springframework.web.bind.annotation.RestController;
-
-import javax.validation.Valid;
+import org.springframework.web.bind.annotation.*;
+import com.mokamrp.privates.help.AjaxResult;
+import com.mokamrp.privates.entity.IndexHandle;
 import java.util.Map;
 
 /**
  * <p>
- * 客户 - 客户群 关联表 前端控制器
+ * 企业分组绑定关系 前端控制器
  * </p>
  *
  * @author gy
- * @since 2021-04-21
+ * @since 2021-04-22
  */
 @RestController
 @RequestMapping("/workContactRoom")
 public class WorkContactRoomController extends BaseController<WorkContactRoom> {
 
     @Autowired
-    public WorkContactRoomService service;
+    public WorkContactRoomService workContactRoomService;
 
     @PostMapping("/search")
-    public Object index(@Valid @RequestBody IndexHandle indexHandle, BindingResult bindingResult) {
-        Map<String, Object> resMap = service.getPageList(indexHandle, bindingResult);
+    public Object search(@RequestBody IndexHandle indexHandle, BindingResult bindingResult) {
+        Map<String, Object> resMap = workContactRoomService.getPageList(indexHandle, bindingResult);
         return AjaxResult.success(resMap);
     }
-
 }
 

+ 60 - 23
src/main/java/com/mokamrp/privates/controller/WorkRoomController.java

@@ -1,19 +1,30 @@
 package com.mokamrp.privates.controller;
 
 
+import com.fasterxml.jackson.datatype.jdk8.Jdk8OptionalBeanPropertyWriter;
 import com.mokamrp.privates.constant.HttpStatus;
+import com.mokamrp.privates.entity.GetWorkRoomHandle;
+import com.mokamrp.privates.entity.JobRedis;
+import com.mokamrp.privates.entity.JobRoomJobRedis;
 import com.mokamrp.privates.entity.WorkRoomBandTagHandle;
 import com.mokamrp.privates.help.AjaxResult;
+import com.mokamrp.privates.mapper.pojo.Downfile;
 import com.mokamrp.privates.mapper.pojo.WorkRoom;
+import com.mokamrp.privates.service.DownfileService;
 import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.service.WorkRoomService;
+import com.mokamrp.privates.utils.RedisUtil;
+import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.validation.Valid;
-import java.util.List;
-import java.util.Map;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.*;
 
 /**
  * <p>
@@ -27,45 +38,71 @@ import java.util.Map;
 @RequestMapping("/workRoom")
 public class WorkRoomController extends BaseController<WorkRoom> {
 
+
     @Autowired
     private WorkRoomService workRoomService;
 
-    @RequestMapping("/list")
+    @Autowired
+    private DownfileService downfileService;
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    @PostMapping("/list")
     @ResponseBody
-    public Object getList(
-            Integer pagesize, Integer page,
-            String name, Integer corp_id,
-            String start_create_time, String end_create_time,
-            String wx_chat_id, Integer corp_group_id,
-            @RequestParam List owner_id, @RequestParam List tag_id
-    ) {
-
-        Map<String, Object> resMap = workRoomService.getPageList(pagesize, page, name, corp_id,
-                start_create_time, end_create_time,
-                wx_chat_id, corp_group_id,
-                owner_id, tag_id);//所有
+    public Object getList(@Valid @RequestBody GetWorkRoomHandle handle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+
+        Map<String, Object> resMap = workRoomService.getPageList(handle);//所有
 
         return AjaxResult.success(resMap);
     }
 
+    @PostMapping("/export")
+    @ResponseBody
+    public Object export(@Valid @RequestBody GetWorkRoomHandle handle, BindingResult bindingResult) {
+
+        JobRedis realJob = new JobRedis();
+        JobRoomJobRedis job = new JobRoomJobRedis();
+        Downfile downObj = new Downfile();
+
+        /*先生成下载记录*/
+        downObj.setMsg(Downfile.DEFAULT_MSG);
+        downObj.setTitle(Downfile.WORM_ROOM);
+        downfileService.insert(downObj);
+
+        /*推送简单任务*/
+        job.setWorkRoomHandle(handle);
+
+        realJob.setJobRoomJobRedis(job);
+        realJob.setDownFile(downObj);
+        realJob.setJobName(JobRoomJobRedis.TASK_NAME);
+
+        redisUtil.leftPush(JobRedis.QUEUE_KEY,realJob);
+
+        return AjaxResult.success("正在异步生成请稍后");
+    }
+
     @PostMapping("/band")
-    public Object band(@Valid @RequestBody WorkRoomBandTagHandle handle, BindingResult bindingResult){
-        if(bindingResult.hasErrors()){
-            return AjaxResult.error(HttpStatus.ERROR,bindingResult.getFieldError().getDefaultMessage());
+    public Object band(@Valid @RequestBody WorkRoomBandTagHandle handle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
         }
 
         //绑定关系用去吧
-        return workRoomService.bangTagIds(handle.getIds(),handle.getTag_ids());
+        return workRoomService.bangTagIds(handle.getIds(), handle.getTag_ids());
     }
 
     @PostMapping("/left")
-    public Object left(@Valid @RequestBody WorkRoomBandTagHandle handle, BindingResult bindingResult){
-        if(bindingResult.hasErrors()){
-            return AjaxResult.error(HttpStatus.ERROR,bindingResult.getFieldError().getDefaultMessage());
+    public Object left(@Valid @RequestBody WorkRoomBandTagHandle handle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
         }
 
         //绑定关系用去吧
-        return workRoomService.leftTagIds(handle.getIds(),handle.getTag_ids());
+        return workRoomService.leftTagIds(handle.getIds(), handle.getTag_ids());
     }
 
 }

+ 26 - 0
src/main/java/com/mokamrp/privates/entity/GetWorkContactEmployeeHandle.java

@@ -0,0 +1,26 @@
+package com.mokamrp.privates.entity;
+
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import java.util.List;
+
+@Data
+public class GetWorkContactEmployeeHandle {
+    @Min(value = 1,message = "页码错误")
+    private Integer pagesize;
+    @Min(value = 1,message = "页码错误")
+    private Integer page;
+    private Integer gender;
+    private Integer status;
+    private String name;
+    private Integer start_deleted_at;
+    private Integer end_deleted_at;
+    private Integer start_created_at;
+    private Integer end_created_at;
+    private Integer group_id;
+    private Integer corp_id;
+    private List employee_id;
+    private List tag_id;
+    private Integer channel_code_id;
+}

+ 24 - 0
src/main/java/com/mokamrp/privates/entity/GetWorkRoomHandle.java

@@ -0,0 +1,24 @@
+package com.mokamrp.privates.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import javax.validation.constraints.Min;
+import java.util.List;
+
+@Data
+public class GetWorkRoomHandle {
+    @Min(value = 1,message = "页码错误")
+    private Integer pagesize;
+    @Min(value = 1,message = "页码错误")
+    private Integer page;
+    private String name;
+    private Integer corpId;
+    private String startCreateTime;
+    private String endCreateTime;
+    private String wxChatId;
+    private Integer corpGroupId;
+    private List ownerId;
+    private List tagId;
+
+
+}

+ 1 - 1
src/main/java/com/mokamrp/privates/entity/IndexHandle.java

@@ -16,7 +16,7 @@ public class IndexHandle {
     private Integer limit = 10;
 
     //.@leon 条件字段
-    private Map<String, Object> filter;
+    private Map<String, String> filter;
 
     //.@leon 条件类型 =,like
     private Map<String, String> op;

+ 55 - 0
src/main/java/com/mokamrp/privates/entity/JobRedis.java

@@ -0,0 +1,55 @@
+package com.mokamrp.privates.entity;
+
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import com.sun.xml.internal.ws.api.ha.StickyFeature;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class JobRedis implements Serializable {
+
+    public final static String QUEUE_KEY = "java:job:mochat";
+
+    private Downfile downFile;
+
+
+
+    private String jobName;
+
+    private JobWorkContactEmployeeRedis jobWorkContactEmployeeRedis;
+
+    private JobRoomJobRedis jobRoomJobRedis;
+
+    public JobWorkContactEmployeeRedis getJobWorkContactEmployeeRedis() {
+        return jobWorkContactEmployeeRedis;
+    }
+
+    public void setJobWorkContactEmployeeRedis(JobWorkContactEmployeeRedis jobWorkContactEmployeeRedis) {
+        this.jobWorkContactEmployeeRedis = jobWorkContactEmployeeRedis;
+    }
+
+    public JobRoomJobRedis getJobRoomJobRedis() {
+        return jobRoomJobRedis;
+    }
+
+    public void setJobRoomJobRedis(JobRoomJobRedis jobRoomJobRedis) {
+        this.jobRoomJobRedis = jobRoomJobRedis;
+    }
+
+    public String getJobName() {
+        return jobName;
+    }
+
+    public void setJobName(String jobName) {
+        this.jobName = jobName;
+    }
+
+    public Downfile getDownFile() {
+        return downFile;
+    }
+
+    public void setDownFile(Downfile downFile) {
+        this.downFile = downFile;
+    }
+
+}

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

@@ -0,0 +1,19 @@
+package com.mokamrp.privates.entity;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+public class JobRoomJobRedis implements Serializable {
+
+    public final static String TASK_NAME = "Room";
+    private GetWorkRoomHandle workRoomHandle;
+
+    public GetWorkRoomHandle getWorkRoomHandle() {
+        return workRoomHandle;
+    }
+
+    public void setWorkRoomHandle(GetWorkRoomHandle workRoomHandle) {
+        this.workRoomHandle = workRoomHandle;
+    }
+}

+ 119 - 0
src/main/java/com/mokamrp/privates/entity/JobWorkContactEmployeeRedis.java

@@ -0,0 +1,119 @@
+package com.mokamrp.privates.entity;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+public class JobWorkContactEmployeeRedis{
+
+    public final static String TASK_NAME = "WorkContactEmployeeService";
+
+    private Integer gender;
+    private Integer status;
+    private String name;
+    private Integer startDeletedAt;
+    private Integer endDeletedAt;
+    private Integer startCreatedAt;
+    private Integer endCreatedAt;
+    private Integer groupId;
+    private Integer corpId;
+    private List employeeId;
+    private List tagId ;
+    private Integer channelCodeId;
+
+    public Integer getGender() {
+        return gender;
+    }
+
+    public void setGender(Integer gender) {
+        this.gender = gender;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getStartDeletedAt() {
+        return startDeletedAt;
+    }
+
+    public void setStartDeletedAt(Integer startDeletedAt) {
+        this.startDeletedAt = startDeletedAt;
+    }
+
+    public Integer getEndDeletedAt() {
+        return endDeletedAt;
+    }
+
+    public void setEndDeletedAt(Integer endDeletedAt) {
+        this.endDeletedAt = endDeletedAt;
+    }
+
+    public Integer getStartCreatedAt() {
+        return startCreatedAt;
+    }
+
+    public void setStartCreatedAt(Integer startCreatedAt) {
+        this.startCreatedAt = startCreatedAt;
+    }
+
+    public Integer getEndCreatedAt() {
+        return endCreatedAt;
+    }
+
+    public void setEndCreatedAt(Integer endCreatedAt) {
+        this.endCreatedAt = endCreatedAt;
+    }
+
+    public Integer getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Integer groupId) {
+        this.groupId = groupId;
+    }
+
+    public Integer getCorpId() {
+        return corpId;
+    }
+
+    public void setCorpId(Integer corpId) {
+        this.corpId = corpId;
+    }
+
+    public List getEmployeeId() {
+        return employeeId;
+    }
+
+    public void setEmployeeId(List employeeId) {
+        this.employeeId = employeeId;
+    }
+
+    public List getTagId() {
+        return tagId;
+    }
+
+    public void setTagId(List tagId) {
+        this.tagId = tagId;
+    }
+
+    public Integer getChannelCodeId() {
+        return channelCodeId;
+    }
+
+    public void setChannelCodeId(Integer channelCodeId) {
+        this.channelCodeId = channelCodeId;
+    }
+}

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

@@ -0,0 +1,16 @@
+package com.mokamrp.privates.mapper;
+
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author gy
+ * @since 2021-04-22
+ */
+public interface DownfileMapper extends BaseMapper<Downfile> {
+
+}

+ 26 - 0
src/main/java/com/mokamrp/privates/mapper/DownfileMapper.xml

@@ -0,0 +1,26 @@
+<?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.DownfileMapper">
+
+    <!-- 开启二级缓存 -->
+    <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mokamrp.privates.mapper.pojo.Downfile">
+        <id column="id" property="id" />
+        <result column="title" property="title" />
+        <result column="auth_id" property="auth_id" />
+        <result column="auth_name" property="auth_name" />
+        <result column="createtime" property="createtime" />
+        <result column="down_url" property="downUrl" />
+        <result column="msg" property="msg" />
+        <result column="filter_json" property="filterJson" />
+        <result column="status" property="status" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, title, auth_id, createtime, down_url, msg, filter_json, status
+    </sql>
+
+</mapper>

+ 3 - 1
src/main/java/com/mokamrp/privates/mapper/WorkContactEmployeeMapper.java

@@ -19,7 +19,9 @@ import java.util.List;
  * @since 2021-04-17
  */
 public interface WorkContactEmployeeMapper extends BaseMapper<WorkContactEmployee> {
-    List<WorkContactEmployeeVo> getVoList(Page<WorkContactEmployeeVo> page, @Param("ew") EntityWrapper<WorkContactEmployee> queryWrapper);
 
+    List<WorkContactEmployeeVo> getVoList(Page<WorkContactEmployeeVo> page, @Param("ew") EntityWrapper<WorkContactEmployee> queryWrapper);
+    List<WorkContactEmployeeVo> getAllVoList(@Param("ew") EntityWrapper<WorkContactEmployee> queryWrapper);
     Integer getVoListTotal(@Param("ew") EntityWrapper<WorkContactEmployee> queryWrapper);
+
 }

+ 22 - 1
src/main/java/com/mokamrp/privates/mapper/WorkContactEmployeeMapper.xml

@@ -51,7 +51,6 @@
                  LEFT JOIN mc_corp AS p ON p.id = a.corp_id
                  LEFT JOIN mc_channel_code AS l ON l.id = a.channel_code_id
         where 1 = 1 ${ew.sqlSegment}
-
     </select>
 
 
@@ -65,4 +64,26 @@
         where 1 = 1 ${ew.sqlSegment}
     </select>
 
+    <select id="getAllVoList" resultType="com.mokamrp.privates.mapper.vo.WorkContactEmployeeVo">
+        SELECT a.id,
+               c.`name`          AS client_name,
+               c.gender          AS client_gender,
+               a.`status`        AS client_status,
+               a.channel_code_id as channel_code_id,
+               c.deleted_at      AS client_deleted_at,
+               c.created_at      AS client_created_at,
+               c.unionid         AS client_unionid,
+               e.`name`          AS employee_name,
+               p.`name`          as company_name,
+               l.`name`          as channel_code_name,
+               a.state,
+               a.remark
+        FROM mc_work_contact_employee AS a
+                 LEFT JOIN mc_work_employee AS e ON a.employee_id = e.id
+                 LEFT JOIN mc_work_contact AS c ON a.contact_id = c.id
+                 LEFT JOIN mc_corp AS p ON p.id = a.corp_id
+                 LEFT JOIN mc_channel_code AS l ON l.id = a.channel_code_id
+        where 1 = 1 ${ew.sqlSegment}
+    </select>
+
 </mapper>

+ 155 - 0
src/main/java/com/mokamrp/privates/mapper/pojo/Downfile.java

@@ -0,0 +1,155 @@
+package com.mokamrp.privates.mapper.pojo;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import org.apache.tomcat.util.bcel.Const;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author gy
+ * @since 2021-04-22
+ */
+@TableName("private_downfile")
+public class Downfile extends Model<Downfile> {
+
+    public static final String WORK_CONTACT_EMPLOYEE = "客服信息下载.csv";
+    public static final String WORM_ROOM = "群数据下载.csv";
+
+    public static final String DEFAULT_MSG = "群数据下载中";
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 名称
+     */
+    private String title;
+    /**
+     * 下载人名称
+     */
+    private Integer authId;
+    /**
+     * 下载人名称
+     */
+    private String authName;
+    /**
+     * 创建时间
+     */
+    private String createtime;
+    /**
+     * 下载链接
+     */
+    private String downUrl;
+    /**
+     * 提示
+     */
+    private String msg;
+    private String filterJson;
+    /**
+     * 1-完成
+     */
+    private Integer status;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getAuthId() {
+        return authId;
+    }
+
+    public void setAuthId(Integer authId) {
+        this.authId = authId;
+    }
+
+    public String getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(String createtime) {
+        this.createtime = createtime;
+    }
+
+    public String getDownUrl() {
+        return downUrl;
+    }
+
+    public void setDownUrl(String downUrl) {
+        this.downUrl = downUrl;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public String getFilterJson() {
+        return filterJson;
+    }
+
+    public void setFilterJson(String filterJson) {
+        this.filterJson = filterJson;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getAuthName() {
+        return authName;
+    }
+
+    public void setAuthName(String authName) {
+        this.authName = authName;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Downfile{" +
+        ", id=" + id +
+        ", title=" + title +
+        ", authName=" + authId +
+        ", createtime=" + createtime +
+        ", downUrl=" + downUrl +
+        ", msg=" + msg +
+        ", filterJson=" + filterJson +
+        ", status=" + status +
+        "}";
+    }
+}

+ 0 - 2
src/main/java/com/mokamrp/privates/mapper/pojo/User.java

@@ -70,10 +70,8 @@ public class User extends Model<User> {
     /**
      * 是否为超级管理员 - 0否1是
      */
-    @TableField("isSuperAdmin")
     private Integer isSuperAdmin;
 
-
     public Integer getId() {
         return id;
     }

+ 57 - 58
src/main/java/com/mokamrp/privates/mapper/vo/WorkContactEmployeeVo.java

@@ -19,104 +19,96 @@ import java.util.Date;
 public class WorkContactEmployeeVo {
 
     private Integer id;
-    private String client_name;
-    private Integer client_status;
-    private Integer channel_code_id;
-    private Date client_deleted_at;
-    private Date client_created_at;
-    private Integer client_unionid;
-    private String employee_name;
-    private String company_name;
-    private String channel_code_name;
-    private String state;
+    private String clientName;
+    private Integer clientStatus;
+    private Integer channelCodeId;
+    private Date clientDeletedAt;
+    private Date clientCreatedAt;
+    private Integer clientUnionid;
+    private String employeeName;
+    private String companyName;
+    private String channelCodeName;
+    private String tate;
     private String remark;
 
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getClient_name() {
-        return client_name;
+    public String getClientName() {
+        return clientName;
     }
 
-    public void setClient_name(String client_name) {
-        this.client_name = client_name;
+    public void setClientName(String clientName) {
+        this.clientName = clientName;
     }
 
-    public Integer getClient_status() {
-        return client_status;
+    public Integer getClientStatus() {
+        return clientStatus;
     }
 
-    public void setClient_status(Integer client_status) {
-        this.client_status = client_status;
+    public void setClientStatus(Integer clientStatus) {
+        this.clientStatus = clientStatus;
     }
 
-    public Integer getChannel_code_id() {
-        return channel_code_id;
+    public Integer getChannelCodeId() {
+        return channelCodeId;
     }
 
-    public void setChannel_code_id(Integer channel_code_id) {
-        this.channel_code_id = channel_code_id;
+    public void setChannelCodeId(Integer channelCodeId) {
+        this.channelCodeId = channelCodeId;
     }
 
-    public Date getClient_deleted_at() {
-        return client_deleted_at;
+    public Date getClientDeletedAt() {
+        return clientDeletedAt;
     }
 
-    public void setClient_deleted_at(Date client_deleted_at) {
-        this.client_deleted_at = client_deleted_at;
+    public void setClientDeletedAt(Date clientDeletedAt) {
+        this.clientDeletedAt = clientDeletedAt;
     }
 
-    public Date getClient_created_at() {
-        return client_created_at;
+    public Date getClientCreatedAt() {
+        return clientCreatedAt;
     }
 
-    public void setClient_created_at(Date client_created_at) {
-        this.client_created_at = client_created_at;
+    public void setClientCreatedAt(Date clientCreatedAt) {
+        this.clientCreatedAt = clientCreatedAt;
     }
 
-    public Integer getClient_unionid() {
-        return client_unionid;
+    public Integer getClientUnionid() {
+        return clientUnionid;
     }
 
-    public void setClient_unionid(Integer client_unionid) {
-        this.client_unionid = client_unionid;
+    public void setClientUnionid(Integer clientUnionid) {
+        this.clientUnionid = clientUnionid;
     }
 
-    public String getEmployee_name() {
-        return employee_name;
+    public String getEmployeeName() {
+        return employeeName;
     }
 
-    public void setEmployee_name(String employee_name) {
-        this.employee_name = employee_name;
+    public void setEmployeeName(String employeeName) {
+        this.employeeName = employeeName;
     }
 
-    public String getCompany_name() {
-        return company_name;
+    public String getCompanyName() {
+        return companyName;
     }
 
-    public void setCompany_name(String company_name) {
-        this.company_name = company_name;
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName;
     }
 
-    public String getChannel_code_name() {
-        return channel_code_name;
+    public String getChannelCodeName() {
+        return channelCodeName;
     }
 
-    public void setChannel_code_name(String channel_code_name) {
-        this.channel_code_name = channel_code_name;
+    public void setChannelCodeName(String channelCodeName) {
+        this.channelCodeName = channelCodeName;
     }
 
-    public String getState() {
-        return state;
+    public String getTate() {
+        return tate;
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public void setTate(String tate) {
+        this.tate = tate;
     }
 
     public String getRemark() {
@@ -127,5 +119,12 @@ public class WorkContactEmployeeVo {
         this.remark = remark;
     }
 
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
 
 }

+ 54 - 55
src/main/java/com/mokamrp/privates/mapper/vo/WorkContactRoomByRoomIdVo.java

@@ -11,103 +11,106 @@ package com.mokamrp.privates.mapper.vo;
 public class WorkContactRoomByRoomIdVo {
 
     private Integer id;
-    private String wx_user_id;
-    private Integer contact_id;
-    private Integer employee_id;
+    private String wxUserId;
+    private Integer contactId;
+    private Integer employeeId;
     private String unionid;
-    private Integer room_id;
-    private Integer join_scene;
+    private Integer roomId;
+    private Integer joinScene;
     private Integer type;
     private Integer status;
-    private String join_time;
-    private String out_time;
+    private String joinTime;
 
-    public Integer getId() {
-        return id;
+    public String getWxUserId() {
+        return wxUserId;
     }
 
-    public void setId(Integer id) {
-        this.id = id;
+    public void setWxUserId(String wxUserId) {
+        this.wxUserId = wxUserId;
     }
 
-    public String getWx_user_id() {
-        return wx_user_id;
+    public Integer getContactId() {
+        return contactId;
     }
 
-    public void setWx_user_id(String wx_user_id) {
-        this.wx_user_id = wx_user_id;
+    public void setContactId(Integer contactId) {
+        this.contactId = contactId;
     }
 
-    public Integer getContact_id() {
-        return contact_id;
+    public Integer getEmployeeId() {
+        return employeeId;
     }
 
-    public void setContact_id(Integer contact_id) {
-        this.contact_id = contact_id;
+    public void setEmployeeId(Integer employeeId) {
+        this.employeeId = employeeId;
     }
 
-    public Integer getEmployee_id() {
-        return employee_id;
+    public Integer getRoomId() {
+        return roomId;
     }
 
-    public void setEmployee_id(Integer employee_id) {
-        this.employee_id = employee_id;
+    public void setRoomId(Integer roomId) {
+        this.roomId = roomId;
     }
 
-    public String getUnionid() {
-        return unionid;
+    public Integer getJoinScene() {
+        return joinScene;
     }
 
-    public void setUnionid(String unionid) {
-        this.unionid = unionid;
+    public void setJoinScene(Integer joinScene) {
+        this.joinScene = joinScene;
     }
 
-    public Integer getRoom_id() {
-        return room_id;
+    public String getJoinTime() {
+        return joinTime;
     }
 
-    public void setRoom_id(Integer room_id) {
-        this.room_id = room_id;
+    public void setJoinTime(String joinTime) {
+        this.joinTime = joinTime;
     }
 
-    public Integer getJoin_scene() {
-        return join_scene;
+    public String getOutTime() {
+        return outTime;
     }
 
-    public void setJoin_scene(Integer join_scene) {
-        this.join_scene = join_scene;
+    public void setOutTime(String outTime) {
+        this.outTime = outTime;
     }
 
-    public Integer getType() {
-        return type;
+    private String outTime;
+    private String nick_name;
+    private String avatar;
+
+    public Integer getId() {
+        return id;
     }
 
-    public void setType(Integer type) {
-        this.type = type;
+    public void setId(Integer id) {
+        this.id = id;
     }
 
-    public Integer getStatus() {
-        return status;
+    public String getUnionid() {
+        return unionid;
     }
 
-    public void setStatus(Integer status) {
-        this.status = status;
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
     }
 
-    public String getJoin_time() {
-        return join_time;
+    public Integer getType() {
+        return type;
     }
 
-    public void setJoin_time(String join_time) {
-        this.join_time = join_time;
+    public void setType(Integer type) {
+        this.type = type;
     }
 
-    public String getOut_time() {
-        return out_time;
+    public Integer getStatus() {
+        return status;
     }
 
-    public void setOut_time(String out_time) {
-        this.out_time = out_time;
+    public void setStatus(Integer status) {
+        this.status = status;
     }
 
     public String getNick_name() {
@@ -126,8 +129,4 @@ public class WorkContactRoomByRoomIdVo {
         this.avatar = avatar;
     }
 
-    private String nick_name;
-    private String avatar;
-
-
 }

+ 81 - 85
src/main/java/com/mokamrp/privates/mapper/vo/WorkRoomVo.java

@@ -13,161 +13,157 @@ import java.util.Date;
 public class WorkRoomVo {
 
     private Integer id;
-    private Integer corp_id;
-    private String wx_chat_id;
+    private Integer corpId;
+    private String wxChatId;
     private String name;
-    private Integer owner_id;
+    private Integer ownerId;
     private String notice;
     private Integer status;
-    private Date create_time;
-    private Integer room_max;
-    private Date deleted_at;
+    private Date createTime;
+    private Integer roomMax;
+    private Date deletedAt;
+    private Integer companyGroupId;
+    private String corpName;
+    private String employeeName;
+    private Integer totalNum;
+    private Integer addNum;
+    private Integer leftNum;
+    private String tagNames;
 
-    public Integer getTotal_num() {
-        return total_num;
+    public Integer getCorpId() {
+        return corpId;
     }
 
-    public void setTotal_num(Integer total_num) {
-        this.total_num = total_num;
+    public void setCorpId(Integer corpId) {
+        this.corpId = corpId;
     }
 
-    public Integer getAdd_num() {
-        return add_num;
+    public String getWxChatId() {
+        return wxChatId;
     }
 
-    public void setAdd_num(Integer add_num) {
-        this.add_num = add_num;
+    public void setWxChatId(String wxChatId) {
+        this.wxChatId = wxChatId;
     }
 
-    public Integer getLeft_num() {
-        return left_num;
+    public Integer getOwnerId() {
+        return ownerId;
     }
 
-    public void setLeft_num(Integer delete_num) {
-        this.left_num = delete_num;
+    public void setOwnerId(Integer ownerId) {
+        this.ownerId = ownerId;
     }
 
-    private Integer company_group_id;
-    private String corp_name;
-
-    private String employee_name;
-    private Integer total_num;
-    private Integer add_num;
-    private Integer left_num;
-
-    public String getTag_names() {
-        return tag_names;
+    public Date getCreateTime() {
+        return createTime;
     }
 
-    public void setTag_names(String tag_names) {
-        this.tag_names = tag_names;
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
-    private String tag_names;
-
-    public Integer getId() {
-        return id;
+    public Integer getRoomMax() {
+        return roomMax;
     }
 
-    public void setId(Integer id) {
-        this.id = id;
+    public void setRoomMax(Integer roomMax) {
+        this.roomMax = roomMax;
     }
 
-    public Integer getCorp_id() {
-        return corp_id;
+    public Date getDeletedAt() {
+        return deletedAt;
     }
 
-    public void setCorp_id(Integer corp_id) {
-        this.corp_id = corp_id;
+    public void setDeletedAt(Date deletedAt) {
+        this.deletedAt = deletedAt;
     }
 
-    public String getWx_chat_id() {
-        return wx_chat_id;
+    public Integer getCompanyGroupId() {
+        return companyGroupId;
     }
 
-    public void setWx_chat_id(String wx_chat_id) {
-        this.wx_chat_id = wx_chat_id;
+    public void setCompanyGroupId(Integer companyGroupId) {
+        this.companyGroupId = companyGroupId;
     }
 
-    public String getName() {
-        return name;
+    public String getCorpName() {
+        return corpName;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setCorpName(String corpName) {
+        this.corpName = corpName;
     }
 
-    public Integer getOwner_id() {
-        return owner_id;
+    public String getEmployeeName() {
+        return employeeName;
     }
 
-    public void setOwner_id(Integer owner_id) {
-        this.owner_id = owner_id;
+    public void setEmployeeName(String employeeName) {
+        this.employeeName = employeeName;
     }
 
-    public String getNotice() {
-        return notice;
+    public Integer getTotalNum() {
+        return totalNum;
     }
 
-    public void setNotice(String notice) {
-        this.notice = notice;
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
     }
 
-    public Integer getStatus() {
-        return status;
+    public Integer getAddNum() {
+        return addNum;
     }
 
-    public void setStatus(Integer status) {
-        this.status = status;
+    public void setAddNum(Integer addNum) {
+        this.addNum = addNum;
     }
 
-    public Date getCreate_time() {
-        return create_time;
+    public Integer getLeftNum() {
+        return leftNum;
     }
 
-    public void setCreate_time(Date create_time) {
-        this.create_time = create_time;
+    public void setLeftNum(Integer leftNum) {
+        this.leftNum = leftNum;
     }
 
-    public Integer getRoom_max() {
-        return room_max;
+    public String getTagNames() {
+        return tagNames;
     }
 
-    public void setRoom_max(Integer room_max) {
-        this.room_max = room_max;
+    public void setTagNames(String tagNames) {
+        this.tagNames = tagNames;
     }
 
-    public Date getDeleted_at() {
-        return deleted_at;
+    public Integer getId() {
+        return id;
     }
 
-    public void setDeleted_at(Date deleted_at) {
-        this.deleted_at = deleted_at;
+    public void setId(Integer id) {
+        this.id = id;
     }
 
-    public Integer getCompany_group_id() {
-        return company_group_id;
+    public String getName() {
+        return name;
     }
 
-    public void setCompany_group_id(Integer company_group_id) {
-        this.company_group_id = company_group_id;
+    public void setName(String name) {
+        this.name = name;
     }
 
-    public String getCorp_name() {
-        return corp_name;
+    public String getNotice() {
+        return notice;
     }
 
-    public void setCorp_name(String corp_name) {
-        this.corp_name = corp_name;
+    public void setNotice(String notice) {
+        this.notice = notice;
     }
 
-    public String getEmployee_name() {
-        return employee_name;
+    public Integer getStatus() {
+        return status;
     }
 
-    public void setEmployee_name(String employee_name) {
-        this.employee_name = employee_name;
+    public void setStatus(Integer status) {
+        this.status = status;
     }
 
-
 }

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

@@ -0,0 +1,16 @@
+package com.mokamrp.privates.service;
+
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author gy
+ * @since 2021-04-22
+ */
+public interface DownfileService extends IService<Downfile> {
+
+}

+ 7 - 0
src/main/java/com/mokamrp/privates/service/WorkContactEmployeeService.java

@@ -2,10 +2,12 @@ package com.mokamrp.privates.service;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
+import com.mokamrp.privates.mapper.pojo.Downfile;
 import com.mokamrp.privates.mapper.pojo.WorkContactEmployee;
 import com.baomidou.mybatisplus.service.IService;
 import com.mokamrp.privates.mapper.vo.WorkContactEmployeeVo;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -29,4 +31,9 @@ public interface WorkContactEmployeeService extends IService<WorkContactEmployee
                                     Integer group_id,
                                     Integer corp_id, List employee_id, List tag_id, Integer channel_code_id);
 
+    void export(Downfile downFile,Integer gender, Integer status, String name,
+                Integer start_deleted_at, Integer end_deleted_at,
+                Integer start_created_at, Integer end_created_at,
+                Integer group_id,
+                Integer corp_id, List employee_id, List tag_id , Integer channel_code_id);
 }

+ 5 - 5
src/main/java/com/mokamrp/privates/service/WorkRoomService.java

@@ -1,5 +1,7 @@
 package com.mokamrp.privates.service;
 
+import com.mokamrp.privates.entity.GetWorkRoomHandle;
+import com.mokamrp.privates.mapper.pojo.Downfile;
 import com.mokamrp.privates.mapper.pojo.WorkRoom;
 import com.baomidou.mybatisplus.service.IService;
 
@@ -15,12 +17,10 @@ import java.util.Map;
  * @since 2021-04-21
  */
 public interface WorkRoomService extends IService<WorkRoom> {
-    public Map<String, Object> getPageList(Integer pagesize, Integer page,
-                                           String name, Integer corp_id,
-                                           String start_create_time, String end_create_time,
-                                           String wx_chat_id, Integer corp_group_id,
-                                           List owner_id, List tag_id);
 
+    public Map<String, Object> getPageList(GetWorkRoomHandle handle);
+
+    public void export(Downfile downFile, GetWorkRoomHandle handle);
 
     public Object bangTagIds(Integer[] ids, Integer[] tagIds);
 

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

@@ -0,0 +1,20 @@
+package com.mokamrp.privates.service.impl;
+
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import com.mokamrp.privates.mapper.DownfileMapper;
+import com.mokamrp.privates.service.DownfileService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author gy
+ * @since 2021-04-22
+ */
+@Service
+public class DownfileServiceImpl extends ServiceImpl<DownfileMapper, Downfile> implements DownfileService {
+
+}

+ 118 - 6
src/main/java/com/mokamrp/privates/service/impl/WorkContactEmployeeServiceImpl.java

@@ -1,20 +1,28 @@
 package com.mokamrp.privates.service.impl;
 
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.PutObjectRequest;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
+import com.mokamrp.privates.config.OSSConfiguration;
 import com.mokamrp.privates.mapper.CorpMapper;
+import com.mokamrp.privates.mapper.DownfileMapper;
+import com.mokamrp.privates.mapper.pojo.Downfile;
 import com.mokamrp.privates.mapper.pojo.WorkContactEmployee;
 import com.mokamrp.privates.mapper.WorkContactEmployeeMapper;
 import com.mokamrp.privates.mapper.vo.WorkContactEmployeeVo;
 import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.mokamrp.privates.utils.OssFile;
 import org.apache.ibatis.annotations.Param;
+import org.apache.tomcat.util.bcel.Const;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.ByteArrayInputStream;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * <p>
@@ -29,7 +37,16 @@ public class WorkContactEmployeeServiceImpl extends ServiceImpl<WorkContactEmplo
 
 
     @Autowired
-    private WorkContactEmployeeMapper mapperObj;
+    private OSS ossClient;
+
+    @Autowired
+    private DownfileMapper downfileMapper;
+
+    @Autowired
+    private OSSConfiguration ossConfiguration;
+
+    @Autowired
+    private WorkContactEmployeeMapper mapperObj  ;
 
     @Override
     public Map<String, Object> getPageList(Integer gender, Integer status,
@@ -42,7 +59,7 @@ public class WorkContactEmployeeServiceImpl extends ServiceImpl<WorkContactEmplo
         Page<WorkContactEmployeeVo> pageObj = new Page<>(page, pagesize);
         EntityWrapper<WorkContactEmployee> obj = new EntityWrapper<WorkContactEmployee>();
 
-        if (name != "") {
+        if(name != null && !name.equals("")){
             obj.like("c.name", name);
         }
 
@@ -92,4 +109,99 @@ public class WorkContactEmployeeServiceImpl extends ServiceImpl<WorkContactEmplo
         return resMap;
     }
 
-}
+    @Override
+    public void export(Downfile downFile,Integer gender, Integer status, String name,
+                                           Integer start_deleted_at, Integer end_deleted_at,
+                                           Integer start_created_at, Integer end_created_at,
+                                           Integer group_id,
+                                           Integer corp_id, List employee_id, List tag_id , Integer channel_code_id){
+
+        EntityWrapper<WorkContactEmployee> obj = new EntityWrapper<WorkContactEmployee>();
+        List<Object> tempObj;
+
+        if(name != null && !name.equals("")){
+            obj.like("c.name",name);
+        }
+
+        if(gender != null){
+            obj.eq("c.gender",gender);
+        }
+
+        if(status != null) {
+            obj.eq("a.`status`", status);
+        }
+
+        if(channel_code_id != null) {
+            obj.eq("a.channel_code_id", channel_code_id);
+        }
+
+        if(start_deleted_at != null) {
+            obj.ge("c.deleted_at", start_deleted_at);
+        }
+
+        if(end_created_at != null) {
+            obj.le("c.deleted_at", end_deleted_at);
+        }
+
+        if(start_created_at != null) {
+            obj.ge("c.created_at", start_created_at);
+        }
+
+        if(end_created_at != null) {
+            obj.le("c.created_at", end_created_at);
+        }
+        if(corp_id != null) {
+            obj.eq("a.corp_id", corp_id);
+        }
+        if(employee_id !=null) {
+            obj.in("a.employee_id", employee_id);
+        }
+
+        List<WorkContactEmployeeVo> list = mapperObj.getAllVoList(obj);
+
+        //实现下载
+        List<List<Object>> resList = new ArrayList<List<Object>>();
+        Object[] head = { "id", "客户昵称", "状态","渠道码id","渠道名称","客户删除时间","客户创建时间","unionid","客服名称","公司名称" };
+        List<Object> headList = Arrays.asList(head);
+        resList.add(headList);
+
+        if(list.size() >=1){
+            for (WorkContactEmployeeVo o: list){
+                tempObj = new ArrayList<Object>() {//这个大括号 就相当于我们  new 接口
+                    {//这个大括号 就是 构造代码块 会在构造函数前 调用
+                        this.add(o.getId());
+                        this.add(o.getClientName());
+                        this.add(o.getClientStatus());
+                        this.add(o.getChannelCodeId());
+                        this.add(o.getChannelCodeName());
+                        this.add(o.getClientDeletedAt());
+                        this.add(o.getClientCreatedAt());
+                        this.add(o.getClientUnionid());
+                        this.add(o.getEmployeeName());
+                        this.add(o.getCompanyName());
+                    }
+                };
+                resList.add(tempObj);
+
+            }
+        }
+
+        StringBuffer content = OssFile.createCSV(resList);
+
+        /*上传到oss*/
+        Date currentTime = new Date();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(currentTime);
+        String filePath = OSSConfiguration.DOWN_DIR+dateString+"/"+downFile.getId().toString()+"_"+Downfile.WORK_CONTACT_EMPLOYEE;
+
+        PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfiguration.getBucketName(), filePath, new ByteArrayInputStream(content.toString().getBytes()));
+        ossClient.putObject(putObjectRequest);
+
+        downFile.setDownUrl(ossConfiguration.getHost()+filePath);
+        downFile.setStatus(1);
+        downfileMapper.updateById(downFile);
+
+        return;
+    }
+
+}

+ 199 - 117
src/main/java/com/mokamrp/privates/service/impl/WorkRoomServiceImpl.java

@@ -1,29 +1,29 @@
 package com.mokamrp.privates.service.impl;
 
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.PutObjectRequest;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
+import com.mokamrp.privates.config.OSSConfiguration;
 import com.mokamrp.privates.constant.HttpStatus;
+import com.mokamrp.privates.entity.GetWorkRoomHandle;
 import com.mokamrp.privates.help.AjaxResult;
-import com.mokamrp.privates.mapper.RoomTagMapper;
-import com.mokamrp.privates.mapper.TagMapper;
-import com.mokamrp.privates.mapper.WorkContactRoomMapper;
-import com.mokamrp.privates.mapper.pojo.RoomTag;
-import com.mokamrp.privates.mapper.pojo.Tag;
-import com.mokamrp.privates.mapper.pojo.WorkContactRoom;
-import com.mokamrp.privates.mapper.pojo.WorkRoom;
-import com.mokamrp.privates.mapper.WorkRoomMapper;
+import com.mokamrp.privates.mapper.*;
+import com.mokamrp.privates.mapper.pojo.*;
+import com.mokamrp.privates.mapper.vo.WorkContactEmployeeVo;
 import com.mokamrp.privates.mapper.vo.WorkContactRoomGroupDataVo;
 import com.mokamrp.privates.mapper.vo.WorkRoomVo;
 import com.mokamrp.privates.service.WorkRoomService;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.mokamrp.privates.utils.OssFile;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayInputStream;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -37,6 +37,16 @@ import java.util.stream.Collectors;
 @Service
 public class WorkRoomServiceImpl extends ServiceImpl<WorkRoomMapper, WorkRoom> implements WorkRoomService {
 
+
+    @Autowired
+    private OSS ossClient;
+
+    @Autowired
+    private DownfileMapper downfileMapper;
+
+    @Autowired
+    private OSSConfiguration ossConfiguration;
+
     @Autowired
     private WorkRoomMapper mapperObj;
 
@@ -46,118 +56,190 @@ public class WorkRoomServiceImpl extends ServiceImpl<WorkRoomMapper, WorkRoom> i
     @Autowired
     private TagMapper tagMapperObj;
 
-
     @Autowired
     private RoomTagMapper roomTagMapperObj;
 
     @Override
-    public Map<String, Object> getPageList(Integer pagesize, Integer page,
-                                           String name, Integer corp_id,
-                                           String start_create_time, String end_create_time,
-                                           String wx_chat_id, Integer corp_group_id,
-                                           List owner_id, List tag_id ){
-
-
+    public Map<String, Object> getPageList(GetWorkRoomHandle handle) {
 
+        Integer pagesize = handle.getPagesize();
+        Integer page = handle.getPage();
         Page<WorkRoom> pageObj = new Page<>(page, pagesize);
-        EntityWrapper<WorkRoom> obj = new EntityWrapper<WorkRoom>();
+        Map<String, Object> resMap = new HashMap<String, Object>();
+        resMap.put("list", null);
+        resMap.put("total", 0);
 
-        if(name != null && !"".equals(name)){
-            obj.like("a.name",name);
-        }
+        EntityWrapper<WorkRoom> obj = getWrapper(handle.getName(), handle.getCorpId(), handle.getStartCreateTime(),
+                handle.getEndCreateTime(), handle.getWxChatId(), handle.getCorpGroupId(), handle.getOwnerId(), handle.getTagId());
 
-        if(corp_id != null){
-            obj.eq("a.corp_id",corp_id);
+        Integer total = mapperObj.getVoListTotal(obj);
+        resMap.put("total", total);
+        if(total <=0){
+            return resMap;
         }
 
-        if(start_create_time != null && !"".equals(start_create_time)) {
-            obj.ge("a.create_time", start_create_time);
-        }
+        List<WorkRoomVo> list = mapperObj.getVoList(pageObj, obj);
+        getCommonList(pageObj, obj);
 
-        if(end_create_time != null && !"".equals(end_create_time)) {
-            obj.le("a.create_time", end_create_time);
-        }
+        resMap.put("list", list);
 
-        if(owner_id !=null) {
-            obj.in("a.owner_id", owner_id);
-        }
+        return resMap;
+    }
 
-        if(tag_id !=null) {
-            obj.in("f.tag_id", tag_id);
-        }
+    /**
+     * @TODO 稍后需要改参数以及做一个下载限制
+     */
+    @Override
+    public void export(Downfile downFile, GetWorkRoomHandle handle) {
 
-        if(corp_id != null){
-            obj.eq("a.corp_id",owner_id);
-        }
+        List<Object> tempObj;
+        List<List<Object>> resList = new ArrayList<List<Object>>();
+        Object[] head = {"id", "群id", "群名称", "群主", "所属主体", "客服", "群标签", "群人数", "当日入群", "当日退群", "创建时间"};
+        List<Object> headList = Arrays.asList(head);
+        Date currentTime = new Date();
 
-        if(corp_group_id != null){
-            obj.eq("c.group_id",corp_group_id);
+        EntityWrapper<WorkRoom> obj = getWrapper(handle.getName(), handle.getCorpId(), handle.getStartCreateTime(),
+                handle.getEndCreateTime(), handle.getWxChatId(), handle.getCorpGroupId(), handle.getOwnerId(), handle.getTagId());
+        Integer total = mapperObj.getVoListTotal(obj);
+        Page<WorkRoom> pageObj = new Page<>(1, total);
+        List<WorkRoomVo> list = getCommonList(pageObj, obj);
+
+        resList.add(headList);
+
+        if (list.size() >= 1) {
+            for (WorkRoomVo o : list) {
+                tempObj = new ArrayList<Object>() {//这个大括号 就相当于我们  new 接口
+                    {//这个大括号 就是 构造代码块 会在构造函数前 调用
+                        this.add(o.getId());
+                        this.add(o.getWxChatId());
+                        this.add(o.getName());
+                        this.add(o.getEmployeeName());
+                        this.add(o.getCorpName());
+                        this.add(o.getTagNames());
+                        this.add(o.getTotalNum());
+                        this.add(o.getAddNum());
+                        this.add(o.getLeftNum());
+                        this.add(o.getCreateTime());
+                    }
+                };
+                resList.add(tempObj);
+            }
         }
 
-        if(wx_chat_id != null && !"".equals(wx_chat_id)){
-            obj.eq("a.wx_chat_id",wx_chat_id);
-        }
+        StringBuffer content = OssFile.createCSV(resList);
 
-        List<WorkRoomVo> list = mapperObj.getVoList(pageObj,obj);
-        Integer total = mapperObj.getVoListTotal(obj);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(currentTime);
+        String filePath = OSSConfiguration.DOWN_DIR + dateString + "/" + downFile.getId().toString() + "_" + Downfile.WORM_ROOM;
+
+        PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfiguration.getBucketName(), filePath,
+                new ByteArrayInputStream(content.toString().getBytes()));
+        ossClient.putObject(putObjectRequest);
+
+        downFile.setDownUrl(ossConfiguration.getHost() + filePath);
+        downFile.setStatus(1);
+        downfileMapper.updateById(downFile);
 
-        if(list.size() > 0 ) {
+        return;
+    }
+
+    private List<WorkRoomVo> getCommonList(Page<WorkRoom> pageObj, EntityWrapper<WorkRoom> room) {
+
+        List<WorkRoomVo> list = mapperObj.getVoList(pageObj, room);
+
+        if (list.size() > 0) {
             List<Integer> ids = list.stream().map(WorkRoomVo -> WorkRoomVo.getId()).collect(Collectors.toList());
-            HashMap<Integer ,HashMap<String,Integer >> dataById  = getDataById(ids);
+            HashMap<Integer, HashMap<String, Integer>> dataById = getDataById(ids);
 
-            if(dataById.size() > 0){
-                list=list.stream().map(WorkRwoomVo -> {
+            if (dataById.size() > 0) {
+                list = list.stream().map(WorkRwoomVo -> {
                     WorkRoomVo detail = new WorkRoomVo();
                     BeanUtils.copyProperties(WorkRwoomVo, detail);
-                    if(dataById.get(detail.getId()) != null){
-                        ;
-                        detail.setTotal_num((dataById.get(detail.getId()).get("total")));
-                        detail.setAdd_num(dataById.get(detail.getId()).get("add_num"));
-                        detail.setLeft_num(dataById.get(detail.getId()).get("left_num"));
-
+                    if (dataById.get(detail.getId()) != null) {
+                        detail.setTotalNum((dataById.get(detail.getId()).get("total")));
+                        detail.setAddNum(dataById.get(detail.getId()).get("add_num"));
+                        detail.setLeftNum(dataById.get(detail.getId()).get("left_num"));
                     }
 
                     return detail;
                 }).collect(Collectors.toList());
             }
         }
+        return list;
 
+    }
 
-        Map<String, Object> resMap = new HashMap<String,Object>();
+    private EntityWrapper<WorkRoom> getWrapper(String name, Integer corp_id,
+                                               String start_create_time, String end_create_time,
+                                               String wx_chat_id, Integer corp_group_id,
+                                               List owner_id, List tag_id) {
 
-        resMap.put("list",list);
-        resMap.put("total",total);
+        EntityWrapper<WorkRoom> obj = new EntityWrapper<WorkRoom>();
 
-        return resMap;
-    }
+        if (name != null && !"".equals(name)) {
+            obj.like("a.name", name);
+        }
+
+        if (corp_id != null) {
+            obj.eq("a.corp_id", corp_id);
+        }
+
+        if (start_create_time != null && !"".equals(start_create_time)) {
+            obj.ge("a.create_time", start_create_time);
+        }
+
+        if (end_create_time != null && !"".equals(end_create_time)) {
+            obj.le("a.create_time", end_create_time);
+        }
+
+        if (owner_id != null) {
+            obj.in("a.owner_id", owner_id);
+        }
+
+        if (tag_id != null) {
+            obj.in("f.tag_id", tag_id);
+        }
 
+        if (corp_id != null) {
+            obj.eq("a.corp_id", owner_id);
+        }
+
+        if (corp_group_id != null) {
+            obj.eq("c.group_id", corp_group_id);
+        }
+
+        if (wx_chat_id != null && !"".equals(wx_chat_id)) {
+            obj.eq("a.wx_chat_id", wx_chat_id);
+        }
+
+        return obj;
+    }
 
     @Override
-    public Object bangTagIds(Integer[] ids,Integer[] tagIds){
+    public Object bangTagIds(Integer[] ids, Integer[] tagIds) {
 
         //1-先查room是否存在
-        Object res = checkOption(ids,tagIds);
-        if(res != null){
+        Object res = checkOption(ids, tagIds);
+        if (res != null) {
             return res;
         }
 
         //3-绑定插入但是要检测已经存在的
-        //roomTagMapperObj.
 
         EntityWrapper<RoomTag> obj = new EntityWrapper<RoomTag>();
-        obj.in("id",ids);
+        obj.in("id", ids);
         RoomTag roomTagObj;
 
-        Date nowDate =new Date();
-        for(Integer id : ids){
-            for(Integer tagId : tagIds){
+        Date nowDate = new Date();
+        for (Integer id : ids) {
+            for (Integer tagId : tagIds) {
                 //检测是否已经存在
                 obj = new EntityWrapper<RoomTag>();
-                obj.eq("room_id",id);
-                obj.eq("tag_id",tagId);
+                obj.eq("room_id", id);
+                obj.eq("tag_id", tagId);
 
 
-                if(roomTagMapperObj.selectCount(obj)<=0){//插入
+                if (roomTagMapperObj.selectCount(obj) <= 0) {//插入
                     roomTagObj = new RoomTag();
                     roomTagObj.setRoomId(id);
                     roomTagObj.setTagId(tagId);
@@ -171,28 +253,28 @@ public class WorkRoomServiceImpl extends ServiceImpl<WorkRoomMapper, WorkRoom> i
     }
 
     @Override
-    public Object leftTagIds(Integer[] ids,Integer[] tagIds){
+    public Object leftTagIds(Integer[] ids, Integer[] tagIds) {
 
         //1-先查room是否存在
-        Object res = checkOption(ids,tagIds);
-        if(res != null){
+        Object res = checkOption(ids, tagIds);
+        if (res != null) {
             return res;
         }
 
         //3-绑定插入但是要检测已经存在的
         //roomTagMapperObj.
         EntityWrapper<RoomTag> obj = new EntityWrapper<RoomTag>();
-        obj.in("id",ids);
+        obj.in("id", ids);
         RoomTag roomTagObj;
 
-        Date nowDate =new Date();
-        for(Integer id : ids){
-            for(Integer tagId : tagIds){
+        Date nowDate = new Date();
+        for (Integer id : ids) {
+            for (Integer tagId : tagIds) {
                 //检测是否已经存在
                 obj = new EntityWrapper<RoomTag>();
-                obj.eq("room_id",id);
-                obj.eq("tag_id",tagId);
-                if(roomTagMapperObj.selectCount(obj)>=0){//插入
+                obj.eq("room_id", id);
+                obj.eq("tag_id", tagId);
+                if (roomTagMapperObj.selectCount(obj) >= 0) {//插入
                     roomTagMapperObj.delete(obj);
                 }
             }
@@ -201,29 +283,29 @@ public class WorkRoomServiceImpl extends ServiceImpl<WorkRoomMapper, WorkRoom> i
         return AjaxResult.success("操作成功");
     }
 
-    private Object checkOption(Integer[] ids,Integer[] tagIds){
+    private Object checkOption(Integer[] ids, Integer[] tagIds) {
         //1-先查room是否存在
         EntityWrapper<WorkRoom> obj = new EntityWrapper<WorkRoom>();
-        obj.in("id",ids);
+        obj.in("id", ids);
 
         Integer total = mapperObj.selectCount(obj);
-        if(total != ids.length){
-            return AjaxResult.error(HttpStatus.ERROR,"room不全存在");
+        if (total != ids.length) {
+            return AjaxResult.error(HttpStatus.ERROR, "room不全存在");
         }
 
         //2-tag是否都存在
         EntityWrapper<Tag> tagWrapper = new EntityWrapper<Tag>();
-        tagWrapper.in("id",tagIds);
+        tagWrapper.in("id", tagIds);
         Integer tagTotal = tagMapperObj.selectCount(tagWrapper);
 
-        if(tagTotal != tagIds.length){
-            return AjaxResult.error(HttpStatus.ERROR,"tag不全存在");
+        if (tagTotal != tagIds.length) {
+            return AjaxResult.error(HttpStatus.ERROR, "tag不全存在");
         }
 
         return null;
     }
 
-    private HashMap<Integer ,HashMap<String,Integer >> getDataById(List<Integer> ids){
+    private HashMap<Integer, HashMap<String, Integer>> getDataById(List<Integer> ids) {
 
         String todayStartDate = (new SimpleDateFormat("yyyy-MM-dd 00:00:00")).format(new Date());
         String todayEndDate = (new SimpleDateFormat("yyyy-MM-dd 23:59:59")).format(new Date());
@@ -246,48 +328,48 @@ public class WorkRoomServiceImpl extends ServiceImpl<WorkRoomMapper, WorkRoom> i
         contactRoomEntityWrapperTodayLeft.le("out_time", todayEndDate);
         contactRoomEntityWrapperTodayLeft.ge("out_time", todayStartDate);//大于
 
-        List<WorkContactRoomGroupDataVo> todayLefts= contanctMapperObj.getNum(contactRoomEntityWrapperTodayLeft);
-        List<WorkContactRoomGroupDataVo> todayAdds= contanctMapperObj.getNum(contactRoomEntityWrapperTodayAdd);
-        List<WorkContactRoomGroupDataVo> totals= contanctMapperObj.getNum(contactRoomEntityWrapperTotal);
+        List<WorkContactRoomGroupDataVo> todayLefts = contanctMapperObj.getNum(contactRoomEntityWrapperTodayLeft);
+        List<WorkContactRoomGroupDataVo> todayAdds = contanctMapperObj.getNum(contactRoomEntityWrapperTodayAdd);
+        List<WorkContactRoomGroupDataVo> totals = contanctMapperObj.getNum(contactRoomEntityWrapperTotal);
 
 
-        HashMap<Integer ,HashMap<String,Integer >> dataById =
+        HashMap<Integer, HashMap<String, Integer>> dataById =
                 new HashMap<Integer, HashMap<String, Integer>>();
 
         HashMap<String, Integer> temp = new HashMap<String, Integer>();
         for (WorkContactRoomGroupDataVo o : totals) {
-            temp.put("total",o.getNum());
-            temp.put("add_num",0);
-            temp.put("left_num",0);
-            dataById.put(o.getRoom_id(),temp);
+            temp.put("total", o.getNum());
+            temp.put("add_num", 0);
+            temp.put("left_num", 0);
+            dataById.put(o.getRoom_id(), temp);
         }
 
         HashMap<String, Integer> tempSetLeft = new HashMap<String, Integer>();
         for (WorkContactRoomGroupDataVo o : todayLefts) {
-            if(dataById.get(o.getRoom_id())==null){//不存在
-                temp.put("total",0);
-                temp.put("left_num",o.getNum());
-                temp.put("add_num",0);
-                dataById.put(o.getRoom_id(),temp);
-            }else{
+            if (dataById.get(o.getRoom_id()) == null) {//不存在
+                temp.put("total", 0);
+                temp.put("left_num", o.getNum());
+                temp.put("add_num", 0);
+                dataById.put(o.getRoom_id(), temp);
+            } else {
                 tempSetLeft = dataById.get(o.getRoom_id());
-                tempSetLeft.put("left_num",o.getNum());
-                dataById.put(o.getRoom_id(),tempSetLeft);
+                tempSetLeft.put("left_num", o.getNum());
+                dataById.put(o.getRoom_id(), tempSetLeft);
             }
 
         }
 
         HashMap<String, Integer> tempSetAdd = new HashMap<String, Integer>();
         for (WorkContactRoomGroupDataVo o : todayAdds) {
-            if(dataById.get(o.getRoom_id())==null){//不存在
-                temp.put("total",0);
-                temp.put("add_num",o.getNum());
-                temp.put("left_num",0);
-                dataById.put(o.getRoom_id(),temp);
-            }else{
-                tempSetAdd =  dataById.get(o.getRoom_id());
-                tempSetAdd.put("add_num",o.getNum());
-                dataById.put(o.getRoom_id(),tempSetAdd);
+            if (dataById.get(o.getRoom_id()) == null) {
+                temp.put("total", 0);
+                temp.put("add_num", o.getNum());
+                temp.put("left_num", 0);
+                dataById.put(o.getRoom_id(), temp);
+            } else {
+                tempSetAdd = dataById.get(o.getRoom_id());
+                tempSetAdd.put("add_num", o.getNum());
+                dataById.put(o.getRoom_id(), tempSetAdd);
             }
         }
         return dataById;

+ 71 - 0
src/main/java/com/mokamrp/privates/tast/ExportJobTask.java

@@ -0,0 +1,71 @@
+package com.mokamrp.privates.tast;
+
+import com.mokamrp.privates.entity.JobRedis;
+import com.mokamrp.privates.entity.JobRoomJobRedis;
+import com.mokamrp.privates.entity.JobWorkContactEmployeeRedis;
+import com.mokamrp.privates.mapper.pojo.Downfile;
+import com.mokamrp.privates.service.WorkContactEmployeeService;
+import com.mokamrp.privates.service.WorkRoomService;
+import com.mokamrp.privates.utils.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Component
+public class ExportJobTask {
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private WorkRoomService workRoomService;
+
+
+    @Autowired
+    private WorkContactEmployeeService workContactEmployeeService;
+
+    /**
+     * 导出任务,单进程
+     */
+    @Scheduled(fixedDelay = 300000)
+    public void execute() {
+
+        System.out.println("下载任务执行中,当前时间"+(new Date())+",当前长度"+redisUtil.lGetListSize("java:job:mochat"));
+
+        while (redisUtil.lGetListSize("java:job:mochat") >=1){
+            JobRedis out = (JobRedis)redisUtil.rightPop(JobRedis.QUEUE_KEY);
+            Downfile downFile = out.getDownFile();
+
+            if(downFile.getId() == null || downFile.getId() <= 0){
+                continue;
+            }
+
+            switch(out.getJobName()){
+                case "Room":
+                    JobRoomJobRedis job= out.getJobRoomJobRedis();
+                    workRoomService.export(downFile,job.getWorkRoomHandle());
+                    break; //可选
+                case "WorkContactEmployeeService":
+                    JobWorkContactEmployeeRedis eJob= out.getJobWorkContactEmployeeRedis();
+                    System.out.println("=======WorkContactEmployeeService======");
+                    System.out.println(eJob.getName());
+
+                    workContactEmployeeService.export(downFile,eJob.getGender(),eJob.getStatus(),eJob.getName(),
+                            eJob.getStartDeletedAt(),eJob.getEndDeletedAt(),
+                            eJob.getStartCreatedAt(), eJob.getEndCreatedAt(),
+                            eJob.getGroupId(),eJob.getCorpId(),eJob.getEmployeeId(), eJob.getTagId(), eJob.getChannelCodeId()
+                    );
+
+                    //语句
+                    break; //可选
+                default : //可选
+            }
+        }
+
+    }
+
+}

+ 72 - 0
src/main/java/com/mokamrp/privates/utils/OssFile.java

@@ -0,0 +1,72 @@
+package com.mokamrp.privates.utils;
+
+import com.mokamrp.privates.utils.spring.SpringUtils;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 将list<map>转成csv模式
+ *
+ * @author gy
+ */
+public class OssFile
+{
+
+    public static StringBuffer createCSV(List<List<Object>> list) {
+
+        StringBuffer sb = new StringBuffer();
+        StringBuffer temp = new StringBuffer();
+
+        try {
+            for (List<Object> row : list) {
+                temp = new StringBuffer();
+                for (Object data : row) {
+                    temp.append("\"").append(data).append("\",");
+                }
+                temp.append("\n");
+                sb.append(temp);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+
+        }
+        return sb;
+    }
+
+         // 表格头
+        /*
+         Object[] head = { "客户姓名", "证件类型", "日期", };
+         List<Object> headList = Arrays.asList(head);
+
+         //数据
+         List<List<Object>> dataList = new ArrayList<List<Object>>();
+         List<Object> rowList = null;
+         for (int i = 0; i < 100; i++) {
+                 rowList = new ArrayList<Object>();
+                 rowList.add("张三" + i);
+                 rowList.add("263834194" + i);
+                 rowList.add(new Date());
+                 dataList.add(rowList);
+             }
+
+         File csvFile = null;
+         BufferedReader csvWtriter = null;
+         */
+
+
+         private static StringBuffer writeRow(List<Object> row) {
+             StringBuffer sb = new StringBuffer();
+             for (Object data : row) {
+                 sb.append("\"").append(data).append("\",");
+             }
+
+             return sb;
+        }
+}

+ 568 - 0
src/main/java/com/mokamrp/privates/utils/RedisUtil.java

@@ -0,0 +1,568 @@
+package com.mokamrp.privates.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * redisTemplate封装
+ *  @author gy
+ */
+@Component
+public class RedisUtil {
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    /**
+     * 指定缓存失效时间
+     * @param key 键
+     * @param time 时间(秒)
+     * @return
+     */
+    public boolean expire(String key,long time){
+        try {
+            if(time>0){
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据key 获取过期时间
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    public long getExpire(String key){
+        return redisTemplate.getExpire(key,TimeUnit.SECONDS);
+    }
+
+    /**
+     * 判断key是否存在
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    public boolean hasKey(String key){
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     * @param key 可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String ... key){
+        if(key!=null&&key.length>0){
+            if(key.length==1){
+                redisTemplate.delete(key[0]);
+            }else{
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    //============================String=============================
+    /**
+     * 普通缓存获取
+     * @param key 键
+     * @return 值
+     */
+    public Object get(String key){
+        return key==null?null:redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     * @param key 键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(String key,Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     * @param key 键
+     * @param value 值
+     * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(String key,Object value,long time){
+        try {
+            if(time>0){
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            }else{
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 递增
+     * @param key 键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    public long incr(String key, long delta){
+        if(delta<0){
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     * @param key 键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    public long decr(String key, long delta){
+        if(delta<0){
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    //================================Map=================================
+    /**
+     * HashGet
+     * @param key 键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    public Object hget(String key,String item){
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     * @param key 键
+     * @return 对应的多个键值
+     */
+    public Map<Object,Object> hmget(String key){
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(String key, Map<String,Object> map){
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     * @param key 键
+     * @param map 对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(String key, Map<String,Object> map, long time){
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if(time>0){
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     * @param key 键
+     * @param item 项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key,String item,Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     * @param key 键
+     * @param item 项
+     * @param value 值
+     * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key,String item,Object value,long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if(time>0){
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     * @param key 键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    public void hdel(String key, Object... item){
+        redisTemplate.opsForHash().delete(key,item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     * @param key 键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    public boolean hHasKey(String key, String item){
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     * @param key 键
+     * @param item 项
+     * @param by 要增加几(大于0)
+     * @return
+     */
+    public double hincr(String key, String item,double by){
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     * @param key 键
+     * @param item 项
+     * @param by 要减少记(小于0)
+     * @return
+     */
+    public double hdecr(String key, String item,double by){
+        return redisTemplate.opsForHash().increment(key, item,-by);
+    }
+
+    //============================set=============================
+    /**
+     * 根据key获取Set中的所有值
+     * @param key 键
+     * @return
+     */
+    public Set<Object> sGet(String key){
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     * @param key 键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    public boolean sHasKey(String key,Object value){
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     * @param key 键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(String key, Object...values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     * @param key 键
+     * @param time 时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(String key,long time,Object...values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if(time>0) {
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     * @param key 键
+     * @return
+     */
+    public long sGetSetSize(String key){
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     * @param key 键
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(String key, Object ...values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+    //===============================list=================================
+
+    /**
+     * 获取list缓存的内容
+     * @param key 键
+     * @param start 开始
+     * @param end 结束  0 到 -1代表所有值
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end){
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     * @param key 键
+     * @return
+     */
+    public long lGetListSize(String key){
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     * @param key 键
+     * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    public Object lGetIndex(String key,long index){
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     * @param key 键
+     * @return
+     */
+    public Object rightPop(String key) {
+        try {
+            return redisTemplate.opsForList().rightPop(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     * @param key 键
+     * @param value 值
+     * @return
+     */
+    public boolean leftPush(String key, Object value) {
+        try {
+            redisTemplate.opsForList().leftPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     * @param key 键
+     * @param value 值
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     * @param key 键
+     * @param value 值
+     * @param time 时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     * @param key 键
+     * @param value 值
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     * @param key 键
+     * @param value 值
+     * @param time 时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     * @param key 键
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index,Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     * @param key 键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(String key,long count,Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+}
+

+ 9 - 0
src/main/resources/application.properties

@@ -12,6 +12,7 @@ spring.datasource.min-idle=5
 spring.datasource.initial-size=5
 
 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+mybatis-plus.configuration.map-underscore-to-camel-case=true
 
 spring.redis.host=r-uf633f3f27aa2174pd.redis.rds.aliyuncs.com
 spring.redis.port=6379
@@ -23,6 +24,14 @@ spring.redis.jedis.pool.max-idle=8
 spring.redis.jedis.pool.max-active=20
 spring.redis.jedis.pool.max-wait=-1ms
 
+#阿里云oss配置(增加一个cdn地址配置)
+aliyun.host=https://mini-short-video-test.oss-cn-hangzhou.aliyuncs.com/
+aliyun.endpoint=https://oss-cn-hangzhou.aliyuncs.com
+aliyun.accessKeyId=LTAI4FnmkS1SNFkaKb4YZ1ga
+aliyun.accessKeySecret=irLfHOni7ffLU3yAf3LsKEXwQLfrNc
+aliyun.bucketName=mini-short-video-test
+spring.servlet.multipart.max-request-size=10MB
+spring.servlet.multipart.max-file-size=10MB
 
 xxl.sso.server=http://localhost:8888/sso
 xxl.sso.logout.path=/logout