瀏覽代碼

页面统计

huangzhiguo 1 年之前
父節點
當前提交
7cbd689f6b
共有 43 個文件被更改,包括 3411 次插入123 次删除
  1. 13 0
      pom.xml
  2. 44 0
      src/main/java/com/caimei365/manager/FastDFS/FastDFSClient.java
  3. 24 0
      src/main/java/com/caimei365/manager/config/CorsConfig.java
  4. 101 1
      src/main/java/com/caimei365/manager/controller/caimei/keyword/KeyWordApi.java
  5. 241 0
      src/main/java/com/caimei365/manager/controller/caimei/user/CmClubRemarksApi.java
  6. 37 32
      src/main/java/com/caimei365/manager/controller/caimei/user/CustomerApi.java
  7. 69 0
      src/main/java/com/caimei365/manager/dao/KeyWordDao.java
  8. 185 0
      src/main/java/com/caimei365/manager/dao/user/CmClubRemarksDao.java
  9. 7 5
      src/main/java/com/caimei365/manager/dao/user/CustomerServiceDao.java
  10. 52 0
      src/main/java/com/caimei365/manager/entity/caimei/CmPriorKeyword.java
  11. 17 1
      src/main/java/com/caimei365/manager/entity/caimei/KeyWord.java
  12. 225 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmClubRemarks.java
  13. 37 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmConsulttype.java
  14. 6 2
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShop.java
  15. 4 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShopInfo.java
  16. 4 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShopKeyword.java
  17. 7 3
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShopProduct.java
  18. 77 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmReport.java
  19. 1 5
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmRoosInformation.java
  20. 38 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmSaleMan.java
  21. 3 1
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmShopAdvertisingImage.java
  22. 5 1
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmShopInfo.java
  23. 2 2
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmShopKeyword.java
  24. 1 1
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmUserSearchFrequency.java
  25. 8 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/Info.java
  26. 27 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/RemarksFileVo.java
  27. 49 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/ServiceProviderModel.java
  28. 169 0
      src/main/java/com/caimei365/manager/entity/caimei/cmUser/VisitRemarkVo.java
  29. 114 0
      src/main/java/com/caimei365/manager/service/caimei/CmOssArchiveService.java
  30. 62 0
      src/main/java/com/caimei365/manager/service/caimei/KeyWordService.java
  31. 156 0
      src/main/java/com/caimei365/manager/service/caimei/impl/KeyWordServiceImpl.java
  32. 141 0
      src/main/java/com/caimei365/manager/service/caimei/user/CmClubRemarksService.java
  33. 9 6
      src/main/java/com/caimei365/manager/service/caimei/user/CustomerService.java
  34. 417 0
      src/main/java/com/caimei365/manager/service/caimei/user/impl/CmClubRemarksServiceImpl.java
  35. 103 29
      src/main/java/com/caimei365/manager/service/caimei/user/impl/CustomerServiceImpl.java
  36. 259 0
      src/main/java/com/caimei365/manager/utils/OSSUtils.java
  37. 62 0
      src/main/java/com/caimei365/manager/utils/formDataUtils.java
  38. 9 0
      src/main/resources/config/beta/application-beta.yml
  39. 9 0
      src/main/resources/config/dev/application-dev.yml
  40. 9 0
      src/main/resources/config/prod/application-prod.yml
  41. 109 9
      src/main/resources/mapper/KeyWordDao.xml
  42. 443 0
      src/main/resources/mapper/user/CmClubRemarksDao.xml
  43. 56 25
      src/main/resources/mapper/user/CustomerServiceDao.xml

+ 13 - 0
pom.xml

@@ -99,6 +99,19 @@
             <version>2.3</version>
         </dependency>
 
+        <!--dfs-->
+        <dependency>
+            <groupId>com.github.tobato</groupId>
+            <artifactId>fastdfs-client</artifactId>
+            <version>1.26.4</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <!-- jxls end -->
         <dependency>
             <groupId>com.caimei</groupId>

+ 44 - 0
src/main/java/com/caimei365/manager/FastDFS/FastDFSClient.java

@@ -0,0 +1,44 @@
+package com.caimei365.manager.FastDFS;
+
+import com.github.tobato.fastdfs.domain.StorePath;
+import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
+import com.github.tobato.fastdfs.service.FastFileStorageClient;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.*;
+
+@Component
+public class FastDFSClient {
+    @Resource
+    private FastFileStorageClient storageClient;
+
+
+    // 文件上传
+    public String uploadFile(String path) throws FileNotFoundException {
+        File file = new File(path);
+        InputStream input = new FileInputStream(file);
+        long size = FileUtils.sizeOf(file);
+        String name = file.getName();
+        String fileName = name.substring(name.lastIndexOf("/") + 1);
+        StorePath storePath = storageClient.uploadFile(input, size, FilenameUtils.getExtension(fileName), null);
+        return storePath.getFullPath();
+    }
+
+    // 文件下载
+    public boolean downloadFile(String path, String downloadFilePath) throws IOException {
+        File file = new File(downloadFilePath);
+        FileOutputStream outputStream = null;
+        // fastdfs 文件读取
+        String filepath = path.substring(path.lastIndexOf("group1/") + 7);
+        DownloadByteArray callback = new DownloadByteArray();
+        byte[] content = storageClient.downloadFile("group1", filepath, callback);
+        // 数据写入指定文件夹中
+        outputStream = new FileOutputStream(file);
+        outputStream.write(content);
+        return true;
+    }
+
+}

+ 24 - 0
src/main/java/com/caimei365/manager/config/CorsConfig.java

@@ -0,0 +1,24 @@
+package com.caimei365.manager.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CorsConfig {
+    @Bean
+    public WebMvcConfigurer corsConfigurer() {
+        return new WebMvcConfigurer() {
+            @Override
+            public void addCorsMappings(CorsRegistry registry) {
+                registry.addMapping("/**")
+                        .allowedOrigins("*")
+                        .allowedMethods("GET", "POST", "PUT", "DELETE")
+                        .allowedHeaders("*")
+                        .allowedOriginPatterns("*")
+                        .maxAge(3600);
+            }
+        };
+    }
+}

+ 101 - 1
src/main/java/com/caimei365/manager/controller/caimei/keyword/KeyWordApi.java

@@ -3,15 +3,19 @@ package com.caimei365.manager.controller.caimei.keyword;
 import com.alibaba.excel.EasyExcel;
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.CmPriorKeyword;
 import com.caimei365.manager.entity.caimei.KeyWord;
+import com.caimei365.manager.entity.caimei.cmUser.ServiceProviderModel;
 import com.caimei365.manager.service.caimei.KeyWordService;
 import com.caimei365.manager.service.caimei.listener.KeywordListener;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 
 
 /**
@@ -35,7 +39,7 @@ public class KeyWordApi {
      * beginTime  自定义时间查询起始时间
      * endTime    自定义时间查询终止时间
      * labelStatus  标签库状态 0未添加 1已添加 传1即是标签列表
-     * fromSearch 标签库数据来源(1:手动添加;2:用户关键词统计;3:导入)
+     * fromSearch 标签库数据来源(1:手动添加;2:用户关键词统计;3:导入 4:协销填写
      */
     @GetMapping("/keyword/list")
     public ResponseJson<PaginationVo<KeyWord>> getKeyWordList(String keyword, String beginTime, String endTime,
@@ -118,4 +122,100 @@ public class KeyWordApi {
     public ResponseJson delLabel(String id) {
         return keyWordService.deleteLabel(id);
     }
+
+    /**
+     * 协销列表
+     * @return
+     */
+    @GetMapping("/getServiceList")
+    public ResponseJson<List<ServiceProviderModel>> getServiceList() { return keyWordService.getServiceList(); }
+
+    /**
+     * 静态标签列表
+     * keyword 关键词
+     * beginTime  自定义时间查询起始时间
+     * endTime    自定义时间查询终止时间
+     * labelStatus  标签库状态 0未添加 1已添加 传1即是标签列表
+     * fromSearch 标签库数据来源(1:手动添加;2:用户关键词统计;3:导入 4:协销填写)
+     */
+    @GetMapping("/statekeyword/list")
+    public ResponseJson<PaginationVo<KeyWord>> getStateKeyWordList(String keyword, String beginTime, String endTime,
+                                                                   Integer fromSearch,  Integer serviceProviderId,
+                                                              @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                              @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+        return keyWordService.getStateKeyWordList(keyword, fromSearch, beginTime, endTime, serviceProviderId, pageNum, pageSize);
+    }
+
+    /**
+     * 保存静态标签
+     * @param keyword
+     * @return
+     */
+    @GetMapping("/saveLabelByState")
+    public ResponseJson saveLabelByState(String keyword) {
+        if (StringUtils.isBlank(keyword)) {
+            return ResponseJson.error(-1, "标签不能为空", null);
+        }
+        return keyWordService.insertLabelByState(keyword);
+    }
+
+    /**
+     * 优先展示标签列表
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+     @GetMapping("/getPriorKeywordList")
+     public ResponseJson<PaginationVo<CmPriorKeyword>> getPriorKeywordList(String keyword, Integer fromSearch, Integer dynamicStatus,
+                                                                           @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                           @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+
+        return keyWordService.getPriorKeywordList(keyword, fromSearch, dynamicStatus, pageNum, pageSize);
+     }
+
+    /**
+     * 选择标签
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus 0 为动态标签 1 静态标签
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+     @GetMapping("/getPickKeyword")
+     public ResponseJson<PaginationVo<KeyWord>> getPickKeyword(String keyword, Integer fromSearch, Integer dynamicStatus,
+                                                                      @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                      @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+
+         return keyWordService.getPickKeyword(keyword, fromSearch, dynamicStatus, pageNum, pageSize);
+     }
+
+    /**
+     * 保存优先展示标签
+     * @param searchIds
+     * @return
+     */
+     @GetMapping("/savePriorKeyword")
+     public ResponseJson savePriorKeyword(String searchIds) {
+        if (StringUtils.isBlank(searchIds)) {
+            return ResponseJson.error(-1, "需优先展示的标签不能为空", null);
+        }
+        return keyWordService.savePriorKeyword(searchIds);
+     }
+
+    /**
+     * 删除优先展示标签
+     * @param ids
+     * @return
+     */
+     @GetMapping("/delPriorKeyword")
+     public ResponseJson delPriorKeyword(String ids) {
+         if ( StringUtils.isBlank(ids)) {
+             return ResponseJson.error(-1, "Id不能为空", null);
+         }
+         return keyWordService.delPriorKeyword(ids);
+     }
 }

+ 241 - 0
src/main/java/com/caimei365/manager/controller/caimei/user/CmClubRemarksApi.java

@@ -0,0 +1,241 @@
+package com.caimei365.manager.controller.caimei.user;
+
+import com.caimei365.manager.config.security.ConstantKey;
+import com.caimei365.manager.config.security.JwtService;
+import com.caimei365.manager.config.security.SecurityConfig;
+import com.caimei365.manager.entity.PaginationVo;
+import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.cmUser.CmClubRemarks;
+import com.caimei365.manager.entity.caimei.cmUser.CmConsulttype;
+import com.caimei365.manager.entity.caimei.cmUser.CmReport;
+import com.caimei365.manager.entity.caimei.cmUser.VisitRemarkVo;
+import com.caimei365.manager.service.caimei.user.CmClubRemarksService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@RestController
+@RequestMapping("/user/remarks")
+public class CmClubRemarksApi {
+
+    @Autowired private CmClubRemarksService cmClubRemarksService;
+    @Resource private JwtService jwtService;
+
+    /**
+     * 咨询记录类别
+     * @return
+     */
+    @GetMapping("/getClassName")
+    public ResponseJson<List<CmConsulttype>> getClassName() {
+        return cmClubRemarksService.getClassName();
+    }
+
+    /**
+     * 获取当天协销咨询记录信息
+     * @return
+     */
+    @GetMapping("/getServiceList")
+    public ResponseJson<Map<String, Object>> getServiceList(String accessDate) {
+        return cmClubRemarksService.getServiceList(accessDate);
+    }
+
+    /**
+     * 已注册用户咨询记录
+     *
+     * @param cmClubRemarks
+     * @return
+     */
+    @GetMapping("/registList")
+    public ResponseJson<PaginationVo<CmClubRemarks>> registList(CmClubRemarks cmClubRemarks,
+                                                 @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                 @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+        if (null == cmClubRemarks)  {
+            return ResponseJson.error(-1, "参数为空", null);
+        }
+        if (null == cmClubRemarks.getServiceProviderId())  {
+            return ResponseJson.error(-1, "协销Id为空", null);
+        }
+        if (null == cmClubRemarks.getTodayTime())  {
+            return ResponseJson.error(-1, "咨询记录时间为空", null);
+        }
+        return cmClubRemarksService.findRegistList(cmClubRemarks, pageNum, pageSize);
+    }
+
+    /**
+     * 资料备注文件下载
+     */
+    @GetMapping("/remarks/download")
+    public void downloadRemarks(String fileName, String ossName, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        cmClubRemarksService.downloadRemarks(fileName, ossName, request, response);
+    }
+    /**
+     * 报备列表
+     * @param cmReport
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/ReportList")
+    public ResponseJson<PaginationVo<CmReport>> getReportList(CmReport cmReport,
+                                                              @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                              @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+
+        return cmClubRemarksService.getReportList(cmReport, pageNum, pageSize);
+    }
+
+    /**
+     * 报备列表查看详情
+     * @param cmClubRemarks
+     * @return
+     */
+    @GetMapping("/cmRegistReportList")
+    public ResponseJson<List<CmClubRemarks>> cmRegistReportList(CmClubRemarks cmClubRemarks) {
+        if (null == cmClubRemarks.getReportId()) {
+            return ResponseJson.error(-1, "报备记录Id不能为空", null);
+        }
+        return cmClubRemarksService.cmRegistReportList(cmClubRemarks);
+    }
+
+    /**
+     * 取消关联
+     * @param remarksId
+     * @param type
+     * @return
+     */
+    @GetMapping("/audit")
+    public ResponseJson audit(Integer remarksId, Integer type) {
+        if (null == remarksId) {
+            return ResponseJson.error(-1, "报备记录Id不能为空", null);
+        }
+        if (null == type) {
+            return ResponseJson.error(-1, "报备记录类型不能为空", null);
+        }
+        return cmClubRemarksService.audit(remarksId, type);
+    }
+
+    /**
+     * 删除报备列表
+     * @param reportId
+     * @return
+     */
+    @GetMapping("/deleteReport/{reportId}")
+    public ResponseJson deleteReport(@PathVariable("reportId") Integer reportId) {
+        if (null == reportId) {
+            return ResponseJson.error(-1, "报备记录Id不能为空", null);
+        }
+        return cmClubRemarksService.deleteReport(reportId);
+    }
+
+    /**
+     * 审核报备记录
+     * @param reportId
+     * @param auditText
+     * @param status
+     * @param request
+     * @return
+     */
+    @GetMapping("/reportCount")
+    public ResponseJson reportCount(Integer reportId, String auditText, Integer status, HttpServletRequest request) {
+        String token = request.getHeader(ConstantKey.TOKEN_NAME);
+        String userName = jwtService.getUsername(token);
+        return cmClubRemarksService.reportCount(reportId, userName, auditText, status);
+    }
+
+    /**
+     * 咨询记录类别
+     * @param cmConsulttype
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/getConsultList")
+    public ResponseJson<PaginationVo<CmConsulttype>> getConsultList(CmConsulttype cmConsulttype,
+                                                                    @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                    @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+        return cmClubRemarksService.getConsultList(cmConsulttype, pageNum, pageSize);
+    }
+
+    /**
+     * 保存咨询记录类别
+     * @param cmConsulttype
+     * @return
+     */
+    @PostMapping("/saveConsult")
+    public ResponseJson saveConsult(@RequestBody CmConsulttype cmConsulttype) {
+
+        return cmClubRemarksService.saveConsult(cmConsulttype);
+    }
+
+
+    /**
+     * 删除咨询记录类别
+     * @param id
+     * @return
+     */
+    @GetMapping("/deleteConsult/{id}")
+    public ResponseJson deleteConsult(@PathVariable("id") Integer id) {
+        if (null == id) {
+            return ResponseJson.error(-1, "咨询类别Id不能为空", null);
+        }
+        return cmClubRemarksService.deleteConsult(id);
+    }
+
+    /**
+     * 排序
+     * @param id
+     * @param sortNumber
+     * @return
+     */
+    @GetMapping("/sort")
+    public ResponseJson sort(Integer id, Integer sortNumber) {
+        if (null == id) {
+            return ResponseJson.error(-1, "id不能为空", null);
+        }
+        if (null == sortNumber) {
+            return ResponseJson.error(-1, "排序不能为空", null);
+        }
+        return cmClubRemarksService.sort(id, sortNumber);
+    }
+
+    /**
+     * 未注册用户咨询记录
+     * @param visit
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/visitRemarkList")
+    public ResponseJson<PaginationVo<VisitRemarkVo>> visitRemarkList(VisitRemarkVo visit,
+                                                                     @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                     @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+
+        return cmClubRemarksService.visitRemarkList(visit, pageNum, pageSize);
+    }
+
+    /**
+     * 未注册用户数据详情
+     */
+    @GetMapping("/remarksList")
+    public ResponseJson<PaginationVo<CmClubRemarks>> remarksList(VisitRemarkVo visitRemarkVo,
+                              @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                              @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+
+        return cmClubRemarksService.remarksList(visitRemarkVo, pageNum, pageSize);
+    }
+
+}

+ 37 - 32
src/main/java/com/caimei365/manager/controller/caimei/user/CustomerApi.java

@@ -7,6 +7,7 @@ import com.caimei365.manager.entity.caimei.cmUser.*;
 import com.caimei365.manager.service.caimei.user.CustomerService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -182,8 +183,8 @@ public class CustomerApi {
      * @param id
      * @return
      */
-    @GetMapping("/delShopInfo")
-    public ResponseJson delShopInfo(Integer id) {
+    @GetMapping("/delShopInfo/{id}")
+    public ResponseJson delShopInfo(@PathVariable("id") Integer id) {
         if (null == id) {
             return ResponseJson.error(-1, "id不能为空", null);
         }
@@ -208,7 +209,7 @@ public class CustomerApi {
     }
 
     /**
-     * 选择文章
+     * 选择搜索词
      * @param keyword
      * @param pageNum
      * @param pageSize
@@ -222,7 +223,7 @@ public class CustomerApi {
     }
 
     /**
-     * 添加文章统计
+     * 添加搜索词统计
      * @param shopId
      * @param keyWordIds
      * @return
@@ -233,7 +234,7 @@ public class CustomerApi {
             return ResponseJson.error(-1, "供应商Id不能为空", null);
         }
         if (null == keyWordIds) {
-            return ResponseJson.error(-1, "选择文章不能为空", null);
+            return ResponseJson.error(-1, "选择搜索词不能为空", null);
         }
         return customerService.saveShopKeyword(shopId, keyWordIds);
     }
@@ -256,12 +257,12 @@ public class CustomerApi {
     }
 
     /**
-     * 删除统计文章
+     * 删除统计搜索词
      * @param id
      * @return
      */
-    @GetMapping("/delShopKeyword")
-    public ResponseJson delShopKeyword(Integer id) {
+    @GetMapping("/delShopKeyword/{id}")
+    public ResponseJson delShopKeyword(@PathVariable("id") Integer id) {
         if (null == id) {
             return ResponseJson.error(-1, "id不能为空", null);
         }
@@ -282,12 +283,12 @@ public class CustomerApi {
     }
 
     /**
-     * 弹框信息回显
+     * 弹框信息保存
      * @param cmShopPopUp
      * @return
      */
     @PostMapping("/saveShopPopUp")
-    public ResponseJson saveShopPopUp(CmShopPopUp cmShopPopUp) {
+    public ResponseJson saveShopPopUp(@RequestBody CmShopPopUp cmShopPopUp) {
         if (null == cmShopPopUp.getShopId()) {
             return ResponseJson.error(-1, "供应商Id不能为空", null);
         }
@@ -314,9 +315,7 @@ public class CustomerApi {
     public ResponseJson<PaginationVo<CmShopAdvertisingImage>> getShopAdvertisingImage(CmShopAdvertisingImage cmShopAdvertisingImage,
                                                                                       @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                                                       @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
-        if (null == cmShopAdvertisingImage.getShopId()) {
-            return ResponseJson.error(-1, "供应商Id不能为空", null);
-        }
+
         return customerService.getShopAdvertisingImage(cmShopAdvertisingImage, pageNum, pageSize);
     }
 
@@ -325,8 +324,8 @@ public class CustomerApi {
      * @param id
      * @return
      */
-    @GetMapping("/getShopAdvertisingImageById")
-    public ResponseJson<CmShopAdvertisingImage> getShopAdvertisingImageById(Integer id) {
+    @GetMapping("/getShopAdvertisingImageById/{id}")
+    public ResponseJson<CmShopAdvertisingImage> getShopAdvertisingImageById(@PathVariable("id") Integer id) {
         if (null == id) {
             return ResponseJson.error(-1, "Id不能为空", null);
         }
@@ -339,22 +338,26 @@ public class CustomerApi {
      * @return
      */
     @PostMapping("/saveShopAdvertisingImage")
-    public ResponseJson saveShopAdvertisingImage(CmShopAdvertisingImage cmShopAdvertisingImage) {
+    public ResponseJson saveShopAdvertisingImage(@RequestBody CmShopAdvertisingImage cmShopAdvertisingImage) {
 
         return customerService.saveShopAdvertisingImage(cmShopAdvertisingImage);
     }
 
     /**
      * 一键排序
-     * @param advertisingImages
+     * @param id
+     * @param sort
      * @return
      */
     @GetMapping("/renewShopAdvertisingImageSort")
-    public ResponseJson renewShopAdvertisingImageSort(String advertisingImages) {
-        if (StringUtils.isBlank(advertisingImages)) {
-            return ResponseJson.error(-1, "排序数据不能为空", null);
+    public ResponseJson renewShopAdvertisingImageSort(Integer id, Integer sort) {
+        if (null == id) {
+            return ResponseJson.error(-1, "排序数据id不能为空", null);
+        }
+        if (null == sort) {
+            return ResponseJson.error(-1, "排序指不能为空", null);
         }
-        return customerService.renewShopAdvertisingImageSort(advertisingImages);
+        return customerService.renewShopAdvertisingImageSort(id, sort);
     }
 
     /**
@@ -379,8 +382,8 @@ public class CustomerApi {
      * @param id
      * @return
      */
-    @GetMapping("/delShopAdvertisingImage")
-    public ResponseJson delShopAdvertisingImage(Integer id) {
+    @GetMapping("/delShopAdvertisingImage/{id}")
+    public ResponseJson delShopAdvertisingImage(@PathVariable("id") Integer id) {
         if (null == id) {
             return ResponseJson.error(-1, "id不能为空", null);
         }
@@ -390,16 +393,18 @@ public class CustomerApi {
     /**
      * 供应商主页统计
      * @param shopId
+     * @param startTime
+     * @param endTime
      * @return
      */
     @GetMapping("/getPageShop")
-    ResponseJson<PaginationVo<CmPageShop>> getPageShop(Integer shopId,
+    ResponseJson<PaginationVo<CmPageShop>> getPageShop(Integer shopId, String startTime, String endTime,
                                                        @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                        @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
         if (null == shopId) {
             return ResponseJson.error(-1, "供应商Id不能为空", null);
         }
-        return customerService.getPageShop(shopId, pageNum, pageSize);
+        return customerService.getPageShop(shopId, startTime, endTime, pageNum, pageSize);
     }
 
     /**
@@ -408,28 +413,28 @@ public class CustomerApi {
      * @return
      */
     @GetMapping("/getPageShopProduct")
-    public ResponseJson<PaginationVo<CmPageShopProduct>> getPageShopProduct(Integer shopId,
+    public ResponseJson<PaginationVo<CmPageShopProduct>> getPageShopProduct(Integer shopId, String startTime, String endTime,
                                                                      @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                                      @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
         if (null == shopId) {
             return ResponseJson.error(-1, "供应商Id不能为空", null);
         }
-        return customerService.getPageShopProduct(shopId, pageNum, pageSize);
+        return customerService.getPageShopProduct(shopId, startTime, endTime, pageNum, pageSize);
     }
 
     /**
-     * 供应商文章
+     * 供应商文章统计
      * @param shopId
      * @return
      */
     @GetMapping("/getPageShopInfo")
-    public ResponseJson<PaginationVo<CmPageShopInfo>> getPageShopInfo(Integer shopId,
+    public ResponseJson<PaginationVo<CmPageShopInfo>> getPageShopInfo(Integer shopId, String startTime, String endTime,
                                                                @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                                @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
         if (null == shopId) {
             return ResponseJson.error(-1, "供应商Id不能为空", null);
         }
-        return customerService.getPageShopInfo(shopId, pageNum, pageSize);
+        return customerService.getPageShopInfo(shopId, startTime, endTime, pageNum, pageSize);
     }
 
     /**
@@ -438,12 +443,12 @@ public class CustomerApi {
      * @return
      */
     @GetMapping("/getPageShopKeyword")
-    public ResponseJson<PaginationVo<CmPageShopKeyword>> getPageShopKeyword(Integer shopId,
+    public ResponseJson<PaginationVo<CmPageShopKeyword>> getPageShopKeyword(Integer shopId, String startTime, String endTime,
                                                                      @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                                      @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
         if (null == shopId) {
             return ResponseJson.error(-1, "供应商Id不能为空", null);
         }
-        return customerService.getPageShopKeyword(shopId, pageNum, pageSize);
+        return customerService.getPageShopKeyword(shopId, startTime, endTime, pageNum, pageSize);
     }
 }

+ 69 - 0
src/main/java/com/caimei365/manager/dao/KeyWordDao.java

@@ -1,7 +1,10 @@
 package com.caimei365.manager.dao;
 
+import com.caimei365.manager.entity.caimei.CmPriorKeyword;
 import com.caimei365.manager.entity.caimei.KeyWord;
+import com.caimei365.manager.entity.caimei.cmUser.ServiceProviderModel;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -25,4 +28,70 @@ public interface KeyWordDao {
     Integer findKeywordExist(String keyword);
 
     void updateDelFlag(String id);
+
+    /**
+     * 协销列表
+     * @return
+     */
+    List<ServiceProviderModel> getServiceList();
+
+    /**
+     * 静态标签列表
+     * @param keyword
+     * @param fromSearch
+     * @param beginTime
+     * @param endTime
+     * @param serviceProviderId
+     * @return
+     */
+    List<KeyWord> getStateKeyWordList(String keyword, Integer fromSearch, String beginTime, String endTime, Integer serviceProviderId);
+
+    /**
+     * 插入静态标签
+     * @param keyword
+     */
+    void insertLabelByState(String keyword);
+
+    /**
+     * 优先展示标签
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus
+     * @return
+     */
+    List<CmPriorKeyword> getPriorKeywordList(String keyword, Integer fromSearch, Integer dynamicStatus);
+
+    /**
+     * 选择标签
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus 0 为动态标签 1 静态标签
+     * @return
+     */
+    List<KeyWord> getPickKeyword(String keyword, Integer fromSearch, Integer dynamicStatus);
+
+    /**
+     * 优先展示标签数量
+     * @return
+     */
+    Integer getPriorCount();
+
+    /**
+     * 标签是否已经是优先展示标签
+     * @param searchId
+     * @return
+     */
+    Integer getPrior(@Param("searchId") Integer searchId);
+
+    /**
+     * 插入优先展示标签
+     * @param searchId
+     */
+    void insertPriorKeyword(@Param("searchId") Integer searchId);
+
+    /**
+     * 删除状态更改
+     * @param id
+     */
+    void delPriorKeyword(@Param("id") Integer id);
 }

+ 185 - 0
src/main/java/com/caimei365/manager/dao/user/CmClubRemarksDao.java

@@ -0,0 +1,185 @@
+package com.caimei365.manager.dao.user;
+
+import com.caimei365.manager.entity.caimei.cmUser.*;
+import com.caimei365.manager.entity.caimei.product.Product;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Mapper
+public interface CmClubRemarksDao {
+    /**
+     * 协销数据
+     * @return
+     */
+    List<ServiceProviderModel> getServiceList();
+
+    /**
+     * 协销已注册用户数
+     * @param serviceProviderId
+     * @return
+     */
+    Integer getRegisteredNumber(@Param("serviceProviderId") Integer serviceProviderId,@Param("addTime") String addTime);
+
+    /**
+     * 协销未注册用户数
+     * @param serviceProviderId
+     * @return
+     */
+    Integer getUnregisteredNumber(@Param("serviceProviderId") Integer serviceProviderId);
+
+    /**
+     * 咨询记录类别
+     * @return
+     */
+    List<CmConsulttype> getClassName();
+    /**
+     * 已注册用户咨询记录
+     * @param cmClubRemarks
+     * @return
+     */
+    List<CmClubRemarks> findRegistList(CmClubRemarks cmClubRemarks);
+
+    /**
+     * 根据商品Id 查询商品信息
+     * @param productId
+     * @return
+     */
+    List<Product> getProduct(@Param("productId") Integer productId);
+
+    /**
+     * 根据id查询报备记录
+     * @param reportId
+     * @return
+     */
+    List<CmReport> getReportById(@Param("reportId") Integer reportId);
+
+    /**
+     * 咨询类别
+     * @param id
+     * @return
+     */
+    String findClassName(String id);
+
+    /**
+     * 图片信息
+     * @param remarksId
+     * @return
+     */
+    List<String> getRemarksImageList(Integer remarksId);
+
+    /**
+     * 文件信息
+     * @param remarksId
+     * @return
+     */
+    List<RemarksFileVo> getRemarksFileList(Integer remarksId);
+
+    /**
+     * 报备列表
+     * @param cmReport
+     * @return
+     */
+    List<CmReport> getReportList(CmReport cmReport);
+
+    /**
+     * 已注册用户咨询记录数
+     * @param reportId
+     * @return
+     */
+    Integer clubRemarksConut(Integer reportId);
+
+    /**
+     * 未注册用户咨询记录数
+     * @param reportId
+     * @return
+     */
+    Integer visitorRemarksConut(Integer reportId);
+
+    /**
+     * 已注册咨询记录取消关联
+     * @param remarksId
+     */
+    void updateClubRemarks(Integer remarksId);
+
+    /**
+     * 未注册咨询记录取消关联
+     * @param remarksId
+     */
+    void updateVisitorRemarks(Integer remarksId);
+
+    /**
+     * 删除报备记录
+     * @param reportId
+     */
+    void deleteClubRemarks(Integer reportId);
+
+    /**
+     * 审核报备记录
+     * @param reportId
+     * @param auditName
+     * @param auditText
+     * @param status
+     */
+    void updateAuditRemarks(@Param("reportId") Integer reportId, @Param("auditName") String auditName, @Param("auditText") String auditText, @Param("status") Integer status);
+
+    /**
+     * 咨询记录类别
+     * @param cmConsulttype
+     * @return
+     */
+    List<CmConsulttype> getConsultList(CmConsulttype cmConsulttype);
+
+    /**
+     * 添加咨询记录类别
+     * @param cmConsulttype
+     */
+    void insertConsult(CmConsulttype cmConsulttype);
+
+    /**
+     * 修改咨询记录类别
+     * @param cmConsulttype
+     */
+    void updateConsult(CmConsulttype cmConsulttype);
+
+    /**
+     * 删除咨询记录类别
+     * @param id
+     */
+    void deleteConsult(@Param("id") Integer id);
+
+    /**
+     * 未注册咨询记录列表
+     * @param visitRemarkVo
+     * @return
+     */
+    List<VisitRemarkVo> getVisitRemarkList(VisitRemarkVo visitRemarkVo);
+
+    /**
+     * 未注册用户已同步数据详情
+     * @param visitRemarkVo
+     * @return
+     */
+    List<CmClubRemarks> getClubRemarksList(VisitRemarkVo visitRemarkVo);
+
+    /**
+     * 未注册用户图片信息
+     * @param remarksId
+     * @return
+     */
+    List<String> getVisitorImageList(Integer remarksId);
+
+    /**
+     * 未注册用户文件信息
+     * @param remarksId
+     * @return
+     */
+    List<RemarksFileVo> getVisitorFileList(Integer remarksId);
+}

+ 7 - 5
src/main/java/com/caimei365/manager/dao/user/CustomerServiceDao.java

@@ -33,7 +33,7 @@ public interface CustomerServiceDao {
      * @param shopName
      * @return
      */
-    List<CmShop> getShopList(@Param("shopName") String shopName);
+    List<CmShop> getShopList(@Param("shopName") String shopName, @Param("shopId") Integer shopId);
 
     /**
      * 添加供应商
@@ -208,28 +208,30 @@ public interface CustomerServiceDao {
     /**
      * 供应商主页统计
      * @param shopId
+     * @param startTime
+     * @param endTime
      * @return
      */
-    List<CmPageShop> getPageShop(@Param("shopId") Integer shopId);
+    List<CmPageShop> getPageShop(@Param("shopId") Integer shopId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
     /**
      * 供应商商品统计
      * @param shopId
      * @return
      */
-    List<CmPageShopProduct> getPageShopProduct(@Param("shopId") Integer shopId);
+    List<CmPageShopProduct> getPageShopProduct(@Param("shopId") Integer shopId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
     /**
      * 供应商文章
      * @param shopId
      * @return
      */
-    List<CmPageShopInfo> getPageShopInfo(@Param("shopId") Integer shopId);
+    List<CmPageShopInfo> getPageShopInfo(@Param("shopId") Integer shopId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
     /**
      * 供应商搜索词统计
      * @param shopId
      * @return
      */
-    List<CmPageShopKeyword> getPageShopKeyword(@Param("shopId") Integer shopId);
+    List<CmPageShopKeyword> getPageShopKeyword(@Param("shopId") Integer shopId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

+ 52 - 0
src/main/java/com/caimei365/manager/entity/caimei/CmPriorKeyword.java

@@ -0,0 +1,52 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/12
+ */
+@Data
+public class CmPriorKeyword {
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 标签Id
+     */
+    private Integer searchId;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+    /**
+     * 删除标记 0:为删除,1:已删除
+     */
+    private Integer delFlag;
+    /**
+     * 关键词
+     */
+    private String keyword;
+    /**
+     * 标签库数据来源(1:手动添加;2:用户关键词统计;3:导入,4:协销填写)
+     */
+    private Integer fromSearch;
+    /**
+     * 协销Id 当 fromSearch 为 4的时候有值
+     */
+    private Integer serviceProviderId;
+    /**
+     * 协销名称
+     */
+    private String name;
+    /**
+     * 0:动态标签;1:静态标签
+     */
+    private Integer dynamicStatus;
+
+}

+ 17 - 1
src/main/java/com/caimei365/manager/entity/caimei/KeyWord.java

@@ -21,10 +21,22 @@ public class KeyWord implements Serializable {
     @ExcelProperty(value = "关键词", index = 0)
     private String keyword;
     /**
-     * 标签库数据来源(1:手动添加;2:用户关键词统计;3:导入)
+     * 标签库数据来源(1:手动添加;2:用户关键词统计;3:导入,4:协销填写
      */
     @ExcelIgnore
     private Integer fromSearch;
+    /**
+     * 协销Id 当 fromSearch 为 4的时候有值
+     */
+    private Integer serviceProviderId;
+    /**
+     * 协销名称
+     */
+    private String name;
+    /**
+     * 0:动态标签;1:静态标签
+     */
+    private Integer dynamicStatus;
     /**
      * 0:未加入关键词库;1:已加入关键词库
      */
@@ -54,4 +66,8 @@ public class KeyWord implements Serializable {
     @ExcelIgnore
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date searchTime;
+    /**
+     * shi发支持选择
+     */
+    private Boolean flag;
 }

+ 225 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmClubRemarks.java

@@ -0,0 +1,225 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import com.caimei365.manager.entity.caimei.product.Product;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Data
+public class CmClubRemarks {
+    /**
+     * 机构id
+     */
+    private Integer clubId;
+
+    /**
+     * 备注id
+     */
+    private Integer remarksId;
+
+    /**
+     * 协销姓名
+     */
+    private String spName;
+    /**
+     * 机构名称
+     */
+    private String clubName;
+    /**
+     * 总咨询类别
+     */
+    private List<CmConsulttype> consults;
+    /**
+     * 记录的咨询类别
+     */
+    private String consultType;
+
+    /**
+     * 手机号
+     */
+    private String contractMobile;
+    /**
+     * 咨询类别
+     */
+    private String consult;
+
+    /**
+     * 协销id
+     */
+    private Integer serviceProviderId;
+
+    /**
+     * 总小组
+     */
+    private List<CmSaleMan> teams;
+    /**
+     * 组长id/管理员id
+     */
+    private Integer leaderId;
+    /**
+     * 管理员姓名
+     */
+    private String leaderName;
+    /**
+     * 文字备注/关键词
+     */
+    private String remarks;
+    /**
+     * 1 已注册记录  2  未注册记录
+     */
+    private Integer type;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addTime;
+
+    private String todayTime;
+
+    private String startAddTime;
+
+
+    private String endAddTime;
+    /**
+     * 咨询人
+     */
+    private String questionMan;
+    /**
+     * 图片列表
+     */
+    private List<String> imageList;
+
+    /**
+     * 文件列表
+     */
+    private List<RemarksFileVo> fileList;
+    /**
+     * 时分 时间
+     */
+    private String divisionTime;
+
+    /**
+     * 机构类型
+     */
+    private String clubType;
+    /**
+     * 价格敏感度
+     */
+    private Integer pinceSensitve;
+    /**
+     * 意向程度
+     */
+    private Integer satisfied;
+    /**
+     * 跟进状态
+     */
+    private Integer followup;
+    /**
+     * 额外说明
+     */
+    private String extra;
+    /**
+     * 非持久化字段旧协销名
+     */
+    private String oldName;
+    /**
+     * 新分配机构状态 0.全部 1.是 2否,
+     */
+    private Integer newDeal;
+    /**
+     * 咨询商品Id
+     */
+    private Integer productId;
+    /**
+     * 咨询商品名称
+     */
+    private String productName;
+    /**
+     * 咨询商品主图
+     */
+    private String mainImage;
+    /**
+     * 商品信息
+     */
+    private List<Product> product;
+    /**
+     * 供应商名称
+     */
+    private String shopName;
+    /**
+     * 关联报备商品主图
+     */
+    private String productMainImage;
+    /**
+     * //关联报备商品名称
+     */
+    private String proName;
+    /**
+     * 关联事由
+     */
+    private String reportText;
+
+    private String auditName;
+    /**
+     * 状态 1.已审核 2.待审核 3.审核未通过
+     */
+    private Integer reportStatus;
+    /**
+     * 审核时间
+     */
+    private String auditTime;
+    /**
+     * 报备记录id
+     */
+    private Integer reportId;
+
+    private List<CmReport> reports;
+
+    private Integer number;
+
+    private Integer numbers;
+    /**
+     * 是否注册 0 全部 1 未注册 2已注册
+     */
+    private Integer isRegister;
+    /**
+     * 沟通情况 0 已沟通 1联系不上
+     */
+    private Integer communicationSituation;
+    /**
+     * 沟通方式 0:电话,微信 1:电话 2:微信
+     */
+    private String communicationMethods;
+    /**
+     * 客户来源 0 公众号 1 小红书 2 微博 3 搜狐 4 其他
+     */
+    private Integer customerSource;
+    /**
+     * 客户性别 0 男 1 女
+     */
+    private Integer customerGender;
+    /**
+     * 客户年龄
+     */
+    private String customerAge;
+    /**
+     * 加群情况 0 以加群 1 未加群
+     */
+    private Integer groupAddition;
+    /**
+     * 动态标签
+     */
+    private String trendsKeyword;
+    /**
+     * 静态标签
+     */
+    private String stateKeyword;
+}

+ 37 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmConsulttype.java

@@ -0,0 +1,37 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Data
+public class CmConsulttype {
+
+    private Integer id;
+    /**
+     * 咨询类别名称
+     */
+    private String className;
+    /**
+     * 状态 1启用,2停用,默认1
+     */
+    private Integer status;
+    /**
+     * 咨询类别排序 正整数值大小排序
+     */
+    private Integer sortNumber;
+    /**
+     * 创建时间
+     */
+    private Date createdTime;
+    /**
+     * 删除标记 0未删除,1删除,默认0
+     */
+    private String delFlag;
+}

+ 6 - 2
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShop.java

@@ -20,11 +20,11 @@ public class CmPageShop {
     /**
      * 供应商名称
      */
-    private Integer shopName;
+    private String shopName;
     /**
      * 跳转链接
      */
-    private Integer shopLink;
+    private String shopLink;
     /**
      * 访问次数
      */
@@ -37,6 +37,10 @@ public class CmPageShop {
      * 平均访问时长
      */
     private Double averageDuration;
+    /**
+     * 平均访问时长 格式化
+     */
+    private String average;
     /**
      * 时间
      */

+ 4 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShopInfo.java

@@ -47,6 +47,10 @@ public class CmPageShopInfo {
      * 平均时长
      */
     private Double averageDuration;
+    /**
+     * 平均访问时长 格式化
+     */
+    private String average;
     /**
      * 时间
      */

+ 4 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShopKeyword.java

@@ -35,6 +35,10 @@ public class CmPageShopKeyword {
      * 平均访问时长
      */
     private Double averageDuration;
+    /**
+     * 平均访问时长 格式化
+     */
+    private String average;
     /**
      * 时间
      */

+ 7 - 3
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmPageShopProduct.java

@@ -22,11 +22,11 @@ public class CmPageShopProduct {
     /**
      * 商品名称
      */
-    private Integer productName;
+    private String productName;
     /**
      * 商品主图
      */
-    private Integer mainImage;
+    private String mainImage;
     /**
      * 商品状态
      */
@@ -34,7 +34,7 @@ public class CmPageShopProduct {
     /**
      * 链接
      */
-    private Integer link;
+    private String link;
     /**
      * 访问次数
      */
@@ -47,6 +47,10 @@ public class CmPageShopProduct {
      * 平均访问时长
      */
     private Double averageDuration;
+    /**
+     * 平均访问时长 格式化
+     */
+    private String average;
     /**
      * 时间
      */

+ 77 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmReport.java

@@ -0,0 +1,77 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/11
+ */
+@Data
+public class CmReport {
+    private Integer reportId;
+    /**
+     * 咨询记录ID
+     */
+    private Integer remarksId;
+    /**
+     * 关联商品
+     */
+    private Integer productId;
+    /**
+     * 报备机构ID
+     */
+    private Integer clubId;
+    /**
+     * 未注册机构咨询ID
+     */
+    private Integer visitorId;
+    /**
+     * 报备人
+     */
+    private String reportName;
+    /**
+     * 报备事由
+     */
+    private String reportText;
+    /**
+     * 创建时间
+     */
+    private String addTime;
+    /**
+     * 状态 1.已审核 2.待审核 3.审核未通过
+     */
+    private Integer status;
+    /**
+     * 审核人
+     */
+    private String auditName;
+    /**
+     * 审核时间
+     */
+    private String auditTime;
+    /**
+     * 咨询商品名称
+     */
+    private String productName;
+    /**
+     * 咨询商品主图
+     */
+    private String mainImage;
+    /**
+     * 机构名称
+     */
+    private String clubName;
+
+    private String startAddTime;
+
+
+    private String endAddTime;
+    /**
+     * 新分配机构状态 0.否,1.是
+     */
+    private Integer newDeal;
+
+    private String auditText;
+}

+ 1 - 5
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmRoosInformation.java

@@ -14,11 +14,7 @@ public class CmRoosInformation {
     /**
      * IP
      */
-    private Integer IP;
-    /**
-     * 用户ID
-     */
-    private Integer userID;
+    private String IP;
     /**
      * 供应商Id
      */

+ 38 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmSaleMan.java

@@ -0,0 +1,38 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Data
+public class CmSaleMan {
+    /**
+     * 协销组员
+     */
+    private List<ServiceProviderModel> groups;
+    /**
+     * 协销组长id
+     */
+    private Integer leaderId;
+    /**
+     * 协销组长姓名
+     */
+    private String leaderName;
+    /**
+     * 管理标记 1是,2不是
+     */
+    private String manager;
+    /**
+     * 小组创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+}

+ 3 - 1
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmShopAdvertisingImage.java

@@ -3,6 +3,8 @@ package com.caimei365.manager.entity.caimei.cmUser;
 import com.caimei365.manager.entity.caimei.CmShop;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * Description
  *
@@ -51,5 +53,5 @@ public class CmShopAdvertisingImage {
     /**
      * 供应商信息
      */
-    private CmShop shop;
+    private List<CmShopStatistics> shops;
 }

+ 5 - 1
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmShopInfo.java

@@ -24,7 +24,7 @@ public class CmShopInfo {
     /**
      * 引导图
      */
-    private Integer guidanceImage;
+    private String guidanceImage;
     /**
      * 标题
      */
@@ -33,6 +33,10 @@ public class CmShopInfo {
      * 发布时间
      */
     private Date pubdate;
+    /**
+     * 发布时间格式化
+     */
+    private String pubdateString;
     /**
      * 统计状态 0 统计 1 不统计
      */

+ 2 - 2
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmShopKeyword.java

@@ -28,7 +28,7 @@ public class CmShopKeyword {
     /**
      * 添加时间
      */
-    private Integer addTime;
+    private String addTime;
     /**
      * 删除标记:0未删除,1已删除
      */
@@ -44,5 +44,5 @@ public class CmShopKeyword {
     /**
      * 搜索时间
      */
-    private Date searchTime;
+    private String searchTime;
 }

+ 1 - 1
src/main/java/com/caimei365/manager/entity/caimei/cmUser/CmUserSearchFrequency.java

@@ -40,7 +40,7 @@ public class CmUserSearchFrequency {
     /**
      * 搜索时间
      */
-    private Date searchTime;
+    private String searchTime;
     /**
      * 推荐状态:0未推荐,1已推荐
      */

+ 8 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/Info.java

@@ -65,6 +65,10 @@ public class Info {
      * 发布时间
      */
     private Date pubdate;
+    /**
+     * 发布时间 格式化
+     */
+    private String pubdateString;
     /**
      * 推荐状态 0停用 1启用
      */
@@ -109,6 +113,10 @@ public class Info {
      * 创建时间
      */
     private Date createDate;
+    /**
+     * 创建时间格式化
+     */
+    private String createDateString;
     /**
      * 最后更新人
      */

+ 27 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/RemarksFileVo.java

@@ -0,0 +1,27 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Data
+public class RemarksFileVo {
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * oss名称
+     */
+    private String ossName;
+
+    /**
+     * 文件链接
+     */
+    private String fileUrl;
+}

+ 49 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/ServiceProviderModel.java

@@ -0,0 +1,49 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Data
+public class ServiceProviderModel {
+    /**
+     * 协销Id
+     */
+    private Integer serviceProviderId;
+    /**
+     * 协销名称
+     */
+    private String name;
+    /**
+     * 协销联系人名称
+     */
+    private String linkMan;
+    /**
+     * 协销用户Id
+     */
+    private Integer userId;
+    /**
+     * 协销组长Id
+     */
+    private Integer mainServiceProviderId;
+    /**
+     * 协销组长名称
+     */
+    private String mainName;
+    /**
+     * 已注册客户数
+     */
+    private Integer registeredNumber;
+    /**
+     * 未注册客户数
+     */
+    private Integer unregisteredNumber;
+    /**
+     * 协销小组编辑页面回显标记,后台取数据的时候给1
+     */
+    private Integer teamFlag;
+}

+ 169 - 0
src/main/java/com/caimei365/manager/entity/caimei/cmUser/VisitRemarkVo.java

@@ -0,0 +1,169 @@
+package com.caimei365.manager.entity.caimei.cmUser;
+
+import com.caimei365.manager.entity.caimei.product.Product;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/11
+ */
+@Data
+public class VisitRemarkVo {
+
+    /**
+     * 潜在用户备注id
+     */
+    private Integer remarksId;
+    /**
+     * 咨询人id
+     */
+    private String questionManId;
+
+    /**
+     * 协销id
+     */
+    private Integer serviceProviderId;
+    /**
+     * 协销姓名
+     */
+    private String serviceName;
+    /**
+     * 同步机构名称
+     */
+    private String clubName;
+    /**
+     * 同步 clubid
+     */
+    private Integer clubId;
+    /**
+     * 总咨询类别
+     */
+    private List<CmConsulttype> consults;
+    /**
+     * 记录的咨询类别
+     */
+    private String consultType;
+    /**
+     * 咨询类别
+     */
+    private String consult;
+    /**
+     * 总小组
+     */
+    private List<CmSaleMan> teams;
+    /**
+     * 组长id/管理员id
+     */
+    private Integer leaderId;
+    /**
+     * 管理员姓名
+     */
+    private String leaderName;
+
+    private String startAddTime;
+
+    private String endAddTime;
+    /**
+     * 备注/关键词
+     */
+    private String remarks;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addTime;
+    /**
+     * 咨询人名字
+     */
+    private String questionMan;
+    /**
+     * 同步时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date concactTime;
+
+    /**
+     * 图片列表
+     */
+    private List<String> imageList;
+
+    /**
+     * 文件列表
+     */
+    private List<RemarksFileVo> fileList;
+
+    /**
+     * 是否同步 1已同步2未同步
+     */
+    private String concat;
+
+    /**
+     * cm_visitor_remarks协销列表
+     */
+    private List<ServiceProviderModel> serverList;
+
+    /**
+     * 机构类型
+     */
+    private String clubType;
+    /**
+     * 价格敏感度
+     */
+    private String pinceSensitve;
+    /**
+     * 意向程度
+     */
+    private String satisfied;
+    /**
+     * 跟进状态
+     */
+    private String followup;
+    /**
+     * 额外说明
+     */
+    private String extra;
+
+    /**
+     * 非持久化字段旧协销名
+     */
+    private String oldName;
+    /**
+     * 商品Id
+     */
+    private Integer productId;
+
+    /**
+     * 商品信息
+     */
+    private List<Product> product;
+    private String productName; //咨询商品名称
+
+    private String mainImage;//咨询商品主图
+
+    private String shopName;//供应商名称
+
+    private String productMainImage;//关联报备商品主图
+
+    private String proName;//关联报备商品名称
+
+    private String reportText;//关联事由
+
+    private String auditName;
+
+    private Integer reportStatus;//状态 1.已审核 2.待审核 3.审核未通过
+
+    private String auditTime;//审核时间
+
+    /**
+     * 报备记录id
+     */
+    private Integer reportId;
+
+    private List<CmReport> reports;
+}

+ 114 - 0
src/main/java/com/caimei365/manager/service/caimei/CmOssArchiveService.java

@@ -0,0 +1,114 @@
+package com.caimei365.manager.service.caimei;
+
+import com.caimei365.manager.utils.OSSUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/18
+ */
+@Service
+@Slf4j
+public class CmOssArchiveService {
+
+    @Resource private OSSUtils ossUtils;
+
+    public void download(HttpServletRequest request, HttpServletResponse response, String fileName) throws IOException {
+        File file = new File("./" + fileName);
+        //  文件存在才下载
+        if (file.exists()) {
+            OutputStream out = null;
+            FileInputStream in = null;
+            try {
+                // 1.读取要下载的内容
+                in = new FileInputStream(file);
+
+                // 2. 告诉浏览器下载的方式以及一些设置
+                // 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
+                String agent = request.getHeader("user-agent");
+                if (agent.contains("FireFox")) {
+                    fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
+                } else {
+                    fileName = URLEncoder.encode(fileName, "UTF-8");
+                }
+                // 设置下载文件的mineType,告诉浏览器下载文件类型
+                String mineType = request.getServletContext().getMimeType(fileName);
+                response.setContentType(mineType);
+                // 设置一个响应头,无论是否被浏览器解析,都下载
+                response.setHeader("Content-disposition", "attachment; filename=" + fileName);
+                // 将要下载的文件内容通过输出流写到浏览器
+                out = response.getOutputStream();
+                int len = 0;
+                byte[] buffer = new byte[1024];
+                while ((len = in.read(buffer)) > 0) {
+                    out.write(buffer, 0, len);
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            } finally {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+                file.delete();
+            }
+        }
+    }
+
+    public Map<String, Object> fileUpload(MultipartFile multipartFile) {
+        Map<String, Object> map = new HashMap<>();
+        String fileAllName = multipartFile.getOriginalFilename();
+        String fileType = fileAllName.substring(fileAllName.lastIndexOf(".") + 1);
+        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+        String filePath = uuid + "." + fileType;
+        String contentType = ossUtils.getContentType(fileAllName);
+        try {
+            //保存本地
+            File file = ossUtils.ossUpload(multipartFile);
+            log.info("默认路径>>>" + file.getAbsolutePath());
+            //上传oss
+            String url = ossUtils.ossUpload(filePath, file, contentType);
+            //删除本地文件
+            ossUtils.deleteFile(file);
+            map.put("success", true);
+            map.put("msg", "操作成功");
+            map.put("url", url);
+            map.put("fileName", fileAllName);
+            map.put("ossName", filePath);
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("success", false);
+            map.put("msg", "操作失败");
+            log.info("上传异常!!!");
+        }
+        return map;
+    }
+
+    public void fileDownload(String ossName, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        ossUtils.downFile(ossName, fileName);
+        download(request, response, fileName);
+    }
+
+    public void deleteOssFile(String ossName) {
+        //删除oss服务器上的文件
+        ossUtils.deleteSingleFile(ossName);
+    }
+}

+ 62 - 0
src/main/java/com/caimei365/manager/service/caimei/KeyWordService.java

@@ -2,7 +2,9 @@ package com.caimei365.manager.service.caimei;
 
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.CmPriorKeyword;
 import com.caimei365.manager.entity.caimei.KeyWord;
+import com.caimei365.manager.entity.caimei.cmUser.ServiceProviderModel;
 
 import java.util.List;
 
@@ -21,4 +23,64 @@ public interface KeyWordService {
     ResponseJson insertLabel(String keyword);
 
     ResponseJson deleteLabel(String id);
+
+    /**
+     * 协销列表
+     * @return
+     */
+    ResponseJson<List<ServiceProviderModel>> getServiceList();
+
+    /**
+     * 静态标签列表
+     * @param keyword
+     * @param fromSearch
+     * @param beginTime
+     * @param endTime
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<KeyWord>> getStateKeyWordList(String keyword, Integer fromSearch, String beginTime, String endTime, Integer serviceProviderId, int pageNum, int pageSize);
+
+    /**
+     * 插入静态标签
+     * @param keyword
+     * @return
+     */
+    ResponseJson insertLabelByState(String keyword);
+
+    /**
+     * 优先展示标签列表
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<CmPriorKeyword>> getPriorKeywordList(String keyword, Integer fromSearch, Integer dynamicStatus, int pageNum, int pageSize);
+
+    /**
+     * 选择标签
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus 0 为动态标签 1 静态标签
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<KeyWord>> getPickKeyword(String keyword, Integer fromSearch, Integer dynamicStatus, int pageNum, int pageSize);
+    /**
+     * 保存优先展示标签
+     * @param searchIds
+     * @return
+     */
+    ResponseJson savePriorKeyword(String searchIds);
+
+    /**
+     * 删除优先展示标签
+     * @param ids
+     * @return
+     */
+    ResponseJson delPriorKeyword(String ids);
 }

+ 156 - 0
src/main/java/com/caimei365/manager/service/caimei/impl/KeyWordServiceImpl.java

@@ -5,7 +5,9 @@ import com.alibaba.excel.util.StringUtils;
 import com.caimei365.manager.dao.KeyWordDao;
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.CmPriorKeyword;
 import com.caimei365.manager.entity.caimei.KeyWord;
+import com.caimei365.manager.entity.caimei.cmUser.ServiceProviderModel;
 import com.caimei365.manager.entity.caimei.enums.KeyWordEnum;
 import com.caimei365.manager.service.caimei.KeyWordService;
 import com.github.pagehelper.PageHelper;
@@ -14,8 +16,11 @@ import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author zzj
@@ -113,4 +118,155 @@ public class KeyWordServiceImpl implements KeyWordService {
         }
         return ResponseJson.success();
     }
+
+    /**
+     * 协销列表
+     *
+     * @return
+     */
+    @Override
+    public ResponseJson<List<ServiceProviderModel>> getServiceList() {
+        return ResponseJson.success(keyWordDao.getServiceList());
+    }
+
+    /**
+     * 静态标签列表
+     * @param keyword
+     * @param fromSearch
+     * @param beginTime
+     * @param endTime
+     * @param serviceProviderId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<KeyWord>> getStateKeyWordList(String keyword, Integer fromSearch, String beginTime, String endTime, Integer serviceProviderId, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<KeyWord> keyWords = keyWordDao.getStateKeyWordList(keyword, fromSearch, beginTime, endTime, serviceProviderId);
+        PaginationVo<KeyWord> pageData = new PaginationVo<>(keyWords);
+        return ResponseJson.success(pageData);
+    }
+
+    /**
+     * 插入静态标签
+     *
+     * @param keyword
+     * @return
+     */
+    @Override
+    public ResponseJson insertLabelByState(String keyword) {
+        Integer keywordExist = keyWordDao.findKeywordExist(keyword);
+        if (null == keywordExist) {
+            keyWordDao.insertLabelByState(keyword);
+            return ResponseJson.success();
+        } else {
+            return ResponseJson.success("关键词已存在");
+        }
+    }
+
+    /**
+     * 优先展示标签列表
+     *
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmPriorKeyword>> getPriorKeywordList(String keyword, Integer fromSearch, Integer dynamicStatus, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmPriorKeyword> priorKeywordList = keyWordDao.getPriorKeywordList(keyword, fromSearch, dynamicStatus);
+
+        PaginationVo<CmPriorKeyword> page = new PaginationVo<>(priorKeywordList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 选择标签
+     *
+     * @param keyword
+     * @param fromSearch
+     * @param dynamicStatus 0 为动态标签 1 静态标签
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<KeyWord>> getPickKeyword(String keyword, Integer fromSearch, Integer dynamicStatus, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<KeyWord> priorKeywordList = keyWordDao.getPickKeyword(keyword, fromSearch, dynamicStatus);
+        List<CmPriorKeyword> keywordList = keyWordDao.getPriorKeywordList("",null,null);
+        List<Integer> searchIds = new ArrayList<>();
+        if (null != keywordList && keywordList.size()>0) {
+            searchIds = keywordList.stream().map(CmPriorKeyword::getSearchId).collect(Collectors.toList());
+        }
+        for (KeyWord key : priorKeywordList) {
+            if (searchIds.contains(key.getId())) {
+                key.setFlag(false);
+            } else {
+                key.setFlag(true);
+            }
+        }
+        PaginationVo<KeyWord> page = new PaginationVo<>(priorKeywordList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 保存优先展示标签
+     *
+     * @param searchIds
+     * @return
+     */
+    @Override
+    public ResponseJson savePriorKeyword(String searchIds) {
+        List<Integer> searchIdList = new ArrayList<>();
+        if (searchIds.contains(",")) {
+            String[] split = searchIds.split(",");
+            for (String s : split) {
+                searchIdList.add(Integer.parseInt(s));
+            }
+        } else {
+            searchIdList.add(Integer.parseInt(searchIds));
+        }
+        Integer count = keyWordDao.getPriorCount();
+        if (count > 50) {
+            return ResponseJson.error(-1, "只支持展示50个标签,请删减再添加。", null);
+        }
+        if ((count + searchIdList.size()) > 50) {
+            int num = (count + searchIdList.size()) - 50;
+            return ResponseJson.error(-1, "只支持展示50个标签,已超出"+ num +"(个),请删减再添加。", null);
+        }
+        // 保存优先展示标签
+        for (Integer id : searchIdList) {
+            Integer prior = keyWordDao.getPrior(id);
+            if (null == prior) {
+                keyWordDao.insertPriorKeyword(id);
+            } else {
+                return ResponseJson.success("关键词已存在");
+            }
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 删除优先展示标签
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public ResponseJson delPriorKeyword(String ids) {
+        if (ids.contains(",")) {
+            String[] split = ids.split(",");
+            for (String id : split) {
+                keyWordDao.delPriorKeyword(Integer.parseInt(id));
+            }
+        } else {
+            keyWordDao.delPriorKeyword(Integer.parseInt(ids));
+        }
+        return ResponseJson.success();
+    }
 }

+ 141 - 0
src/main/java/com/caimei365/manager/service/caimei/user/CmClubRemarksService.java

@@ -0,0 +1,141 @@
+package com.caimei365.manager.service.caimei.user;
+
+import com.caimei365.manager.entity.PaginationVo;
+import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.cmUser.CmClubRemarks;
+import com.caimei365.manager.entity.caimei.cmUser.CmConsulttype;
+import com.caimei365.manager.entity.caimei.cmUser.CmReport;
+import com.caimei365.manager.entity.caimei.cmUser.VisitRemarkVo;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+public interface CmClubRemarksService {
+    /**
+     * 咨询记录类别
+     * @return
+     */
+    ResponseJson<List<CmConsulttype>> getClassName();
+    /**
+     * 获取当天协销咨询记录信息
+     * @param time
+     * @return
+     */
+    ResponseJson<Map<String, Object>> getServiceList(String time);
+    /**
+     * 已注册用户咨询记录
+     * @param cmClubRemarks
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<CmClubRemarks>> findRegistList(CmClubRemarks cmClubRemarks, Integer pageNum, Integer pageSize);
+
+    /**
+     * 文件下载
+     * @param fileName
+     * @param ossName
+     * @param request
+     * @param response
+     * @return
+     */
+    void downloadRemarks(String fileName, String ossName, HttpServletRequest request, HttpServletResponse response)  throws IOException;
+    /**
+     * 报备列表
+     * @param cmReport
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<CmReport>> getReportList(CmReport cmReport, Integer pageNum, Integer pageSize);
+
+    /**
+     * 报备列表查看详情
+     * @param cmClubRemarks
+     * @return
+     */
+    ResponseJson<List<CmClubRemarks>> cmRegistReportList(CmClubRemarks cmClubRemarks);
+
+    /**
+     * 取消关联
+     * @param remarksId
+     * @param type
+     * @return
+     */
+    ResponseJson audit(Integer remarksId, Integer type);
+    /**
+     * 删除报备列表
+     * @param reportId
+     * @return
+     */
+    ResponseJson deleteReport(Integer reportId);
+
+    /**
+     * 审核
+     * @param reportId
+     * @param auditName
+     * @param auditText
+     * @param status
+     * @return
+     */
+    ResponseJson reportCount(Integer reportId, String auditName, String auditText, Integer status);
+
+    /**
+     * 咨询记录类别
+     * @param cmConsulttype
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<CmConsulttype>> getConsultList(CmConsulttype cmConsulttype, Integer pageNum, Integer pageSize);
+
+    /**
+     * 保存咨询记录类别
+     * @param cmConsulttype
+     * @return
+     */
+    ResponseJson saveConsult(CmConsulttype cmConsulttype);
+
+
+    /**
+     * 删除咨询记录类别
+     * @param id
+     * @return
+     */
+    ResponseJson deleteConsult(Integer id);
+
+    /**
+     * 排序
+     * @param sortNumber
+     * @return
+     */
+    ResponseJson sort(Integer id, Integer sortNumber);
+
+    /**
+     * 未注册用户咨询记录
+     * @param visit
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<VisitRemarkVo>> visitRemarkList(VisitRemarkVo visit, Integer pageNum, Integer pageSize);
+
+    /**
+     * 未注册用户数据详情
+     * @param visitRemarkVo
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<CmClubRemarks>> remarksList(VisitRemarkVo visitRemarkVo, Integer pageNum, Integer pageSize);
+
+}

+ 9 - 6
src/main/java/com/caimei365/manager/service/caimei/user/CustomerService.java

@@ -181,10 +181,11 @@ public interface CustomerService {
 
     /**
      * 一键排序
-     * @param advertisingImages
+     * @param id
+     * @param sort
      * @return
      */
-    ResponseJson renewShopAdvertisingImageSort(String advertisingImages);
+    ResponseJson renewShopAdvertisingImageSort(Integer id, Integer sort);
 
     /**
      * 修改上下架状态
@@ -204,28 +205,30 @@ public interface CustomerService {
     /**
      * 供应商主页统计
      * @param shopId
+     * @param startTime
+     * @param endTime
      * @return
      */
-    ResponseJson<PaginationVo<CmPageShop>> getPageShop(Integer shopId, Integer pageNum, Integer pageSize);
+    ResponseJson<PaginationVo<CmPageShop>> getPageShop(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize);
 
     /**
      * 供应商商品统计
      * @param shopId
      * @return
      */
-    ResponseJson<PaginationVo<CmPageShopProduct>> getPageShopProduct(Integer shopId, Integer pageNum, Integer pageSize);
+    ResponseJson<PaginationVo<CmPageShopProduct>> getPageShopProduct(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize);
 
     /**
      * 供应商文章
      * @param shopId
      * @return
      */
-    ResponseJson<PaginationVo<CmPageShopInfo>> getPageShopInfo(Integer shopId, Integer pageNum, Integer pageSize);
+    ResponseJson<PaginationVo<CmPageShopInfo>> getPageShopInfo(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize);
 
     /**
      * 供应商搜索词统计
      * @param shopId
      * @return
      */
-    ResponseJson<PaginationVo<CmPageShopKeyword>> getPageShopKeyword(Integer shopId, Integer pageNum, Integer pageSize);
+    ResponseJson<PaginationVo<CmPageShopKeyword>> getPageShopKeyword(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize);
 }

+ 417 - 0
src/main/java/com/caimei365/manager/service/caimei/user/impl/CmClubRemarksServiceImpl.java

@@ -0,0 +1,417 @@
+package com.caimei365.manager.service.caimei.user.impl;
+
+import com.caimei.utils.AppUtils;
+import com.caimei.utils.MathUtil;
+import com.caimei365.manager.dao.user.CmClubRemarksDao;
+import com.caimei365.manager.entity.PaginationVo;
+import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.cmUser.*;
+import com.caimei365.manager.service.caimei.CmOssArchiveService;
+import com.caimei365.manager.service.caimei.user.CmClubRemarksService;
+import com.caimei365.manager.utils.OSSUtils;
+import com.github.pagehelper.PageHelper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/9/7
+ */
+@Service
+public class CmClubRemarksServiceImpl implements CmClubRemarksService {
+
+    @Resource private CmClubRemarksDao cmClubRemarksDao;
+    @Resource private CmOssArchiveService cmOssArchiveService;
+    @Resource private OSSUtils ossUtils;
+
+    /**
+     * 咨询记录类别
+     * @return
+     */
+    @Override
+    public ResponseJson<List<CmConsulttype>> getClassName() {
+        List<CmConsulttype> className = cmClubRemarksDao.getClassName();
+        return ResponseJson.success(className);
+    }
+
+    /**
+     * 获取当天协销咨询记录信息
+     * @param time
+     * @return
+     */
+    @Override
+    public ResponseJson<Map<String, Object>> getServiceList(String time) {
+        // 协销数据
+        List<ServiceProviderModel> serviceList = cmClubRemarksDao.getServiceList();
+        AtomicInteger registeredNumber = new AtomicInteger(0);
+        AtomicInteger unRegisteredNumber = new AtomicInteger(0);
+        serviceList.forEach( s -> {
+            // 已注册用户咨询记录
+            s.setRegisteredNumber(cmClubRemarksDao.getRegisteredNumber(s.getServiceProviderId(), time));
+            // 未注册用户咨询记录
+            s.setUnregisteredNumber(cmClubRemarksDao.getUnregisteredNumber(s.getServiceProviderId()));
+            registeredNumber.set(MathUtil.add(registeredNumber.get(), s.getRegisteredNumber()).intValue());
+            unRegisteredNumber.set(MathUtil.add(unRegisteredNumber.get(), s.getUnregisteredNumber()).intValue());
+        });
+        Map<String, Object> map = new HashMap<>();
+        map.put("serviceList", serviceList);
+        map.put("registeredNumber", registeredNumber);
+        map.put("unRegisteredNumber", unRegisteredNumber);
+        map.put("number", MathUtil.add(registeredNumber, unRegisteredNumber).intValue());
+        return ResponseJson.success(map);
+    }
+
+    /**
+     * 已注册用户咨询记录
+     *
+     * @param cmClubRemarks
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmClubRemarks>> findRegistList(CmClubRemarks cmClubRemarks, Integer pageNum, Integer pageSize) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmClubRemarks> remarksList = cmClubRemarksDao.findRegistList(cmClubRemarks);
+        remarksList.forEach(remarks -> {
+            if (StringUtils.isNotBlank(remarks.getConsult())) {
+                StringBuilder cons = new StringBuilder();
+                if (remarks.getConsult().contains(",")) {
+                    String[] split = remarks.getConsult().split(",");
+                    for (String string : split) {
+                        cons.append(cmClubRemarksDao.findClassName(string)).append(",");
+                    }
+                    cons = new StringBuilder(cons.substring(0, cons.length() - 1));
+                } else {
+                    cons = new StringBuilder(cmClubRemarksDao.findClassName(remarks.getConsult()));
+                }
+                remarks.setConsultType(cons.toString());
+            }
+            List<String> remarkList = new ArrayList<>();
+            // 合并标签
+            if (StringUtils.isNotBlank(remarks.getRemarks())) {
+                if (remarks.getRemarks().contains(",")) {
+                    String[] split = remarks.getRemarks().split(",");
+                    remarkList.addAll(Arrays.asList(split));
+                } else {
+                    remarkList.add(remarks.getRemarks());
+                }
+            }
+            if (StringUtils.isNotBlank(remarks.getTrendsKeyword())) {
+                if (remarks.getTrendsKeyword().contains(",")) {
+                    String[] split = remarks.getTrendsKeyword().split(",");
+                    remarkList.addAll(Arrays.asList(split));
+                } else {
+                    remarkList.add(remarks.getTrendsKeyword());
+                }
+            }
+            if (StringUtils.isNotBlank(remarks.getStateKeyword())) {
+                if (remarks.getStateKeyword().contains(",")) {
+                    String[] split = remarks.getStateKeyword().split(",");
+                    remarkList.addAll(Arrays.asList(split));
+                } else {
+                    remarkList.add(remarks.getStateKeyword());
+                }
+            }
+            remarks.setRemarks(StringUtils.strip(remarkList.toString(), "[]"));
+            List<String> imageList = cmClubRemarksDao.getRemarksImageList(remarks.getRemarksId());
+            List<RemarksFileVo> fileList = cmClubRemarksDao.getRemarksFileList(remarks.getRemarksId());
+            fileList.forEach(f -> f.setFileUrl(ossUtils.getOssUrl(f.getOssName())));
+            if (StringUtils.isNotBlank(remarks.getMainImage())) {
+                remarks.setMainImage(AppUtils.getImageURL("product", remarks.getMainImage(), 0, ""));
+            }
+            remarks.setImageList(imageList);
+            remarks.setFileList(fileList);
+            // 咨询商品信息
+            if (null != remarks.getProductId()) {
+                remarks.setProduct(cmClubRemarksDao.getProduct(remarks.getProductId()));
+            }
+            // 报备记录
+            if (null != remarks.getReportId()) {
+                remarks.setReports(cmClubRemarksDao.getReportById(remarks.getReportId()));
+            }
+            // 处理时间
+            if (null != remarks.getAddTime()) {
+                remarks.setDivisionTime(dateFormat.format(remarks.getAddTime()));
+            }
+        });
+        PaginationVo<CmClubRemarks> page = new PaginationVo<>(remarksList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 文件下载
+     *
+     * @param fileName
+     * @param ossName
+     * @param request
+     * @param response
+     * @return
+     */
+    @Override
+    public void downloadRemarks(String fileName, String ossName, HttpServletRequest request, HttpServletResponse response)  throws IOException {
+        ossUtils.downFile(ossName, fileName);
+        cmOssArchiveService.download(request, response, fileName);
+    }
+
+    /**
+     * 报备列表
+     *
+     * @param cmReport
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmReport>> getReportList(CmReport cmReport, Integer pageNum, Integer pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmReport> list = cmClubRemarksDao.getReportList(cmReport);
+        PaginationVo<CmReport> page = new PaginationVo<>(list);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 报备列表查看详情
+     *
+     * @param cmClubRemarks
+     * @return
+     */
+    @Override
+    public ResponseJson<List<CmClubRemarks>> cmRegistReportList(CmClubRemarks cmClubRemarks) {
+        List<CmClubRemarks> registList = cmClubRemarksDao.findRegistList(cmClubRemarks);
+        registList.forEach(remarks -> {
+            if (StringUtils.isNotBlank(remarks.getConsult())) {
+                StringBuilder cons = new StringBuilder();
+                if (remarks.getConsult().contains(",")) {
+                    String[] split = remarks.getConsult().split(",");
+                    for (String string : split) {
+                        cons.append(cmClubRemarksDao.findClassName(string)).append(",");
+                    }
+                    cons = new StringBuilder(cons.substring(0, cons.length() - 1));
+                } else {
+                    cons = new StringBuilder(cmClubRemarksDao.findClassName(remarks.getConsult()));
+                }
+                remarks.setConsultType(cons.toString());
+            }
+            List<String> imageList = cmClubRemarksDao.getRemarksImageList(remarks.getRemarksId());
+            List<RemarksFileVo> fileList = cmClubRemarksDao.getRemarksFileList(remarks.getRemarksId());
+            fileList.forEach(f -> f.setFileUrl(ossUtils.getOssUrl(f.getOssName())));
+            if (StringUtils.isNotBlank(remarks.getMainImage())) {
+                remarks.setMainImage(AppUtils.getImageURL("product", remarks.getMainImage(), 0, ""));
+            }
+            remarks.setImageList(imageList);
+            remarks.setFileList(fileList);
+            // 咨询商品信息
+            if (null != remarks.getProductId()) {
+                remarks.setProduct(cmClubRemarksDao.getProduct(remarks.getProductId()));
+            }
+            // 报备记录
+            if (null != remarks.getReportId()) {
+                remarks.setReports(cmClubRemarksDao.getReportById(remarks.getReportId()));
+            }
+        });
+        return ResponseJson.success(registList);
+    }
+
+    /**
+     * 取消关联
+     *
+     * @param remarksId
+     * @param type
+     * @return
+     */
+    @Override
+    public ResponseJson audit(Integer remarksId, Integer type) {
+        if (type == 1) {
+            cmClubRemarksDao.updateClubRemarks(remarksId);
+        } else {
+            cmClubRemarksDao.updateVisitorRemarks(remarksId);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 删除报备列表
+     *
+     * @param reportId
+     * @return
+     */
+    @Override
+    public ResponseJson deleteReport(Integer reportId) {
+        // 已注册咨询记录数
+        Integer clubCount = cmClubRemarksDao.clubRemarksConut(reportId);
+        // 未注册咨询记录数
+        Integer visitorCount = cmClubRemarksDao.visitorRemarksConut(reportId);
+        if (MathUtil.add(clubCount, visitorCount).intValue() > 0) {
+            return ResponseJson.error(-1, "请将该报备关联的全部咨询记录取消关联后再删除", null);
+        } else {
+            cmClubRemarksDao.deleteClubRemarks(reportId);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param reportId
+     * @param auditName
+     * @param auditText
+     * @param status
+     * @return
+     */
+    @Override
+    public ResponseJson reportCount(Integer reportId, String auditName, String auditText, Integer status) {
+        // 已注册咨询记录数
+        Integer clubCount = cmClubRemarksDao.clubRemarksConut(reportId);
+        // 未注册咨询记录数
+        Integer visitorCount = cmClubRemarksDao.visitorRemarksConut(reportId);
+        if (MathUtil.add(clubCount, visitorCount).intValue() > 0) {
+            cmClubRemarksDao.updateAuditRemarks(reportId, auditName, auditText, status);
+        } else {
+            return ResponseJson.error(-1, "该报备未关联任何咨询记录,无需审核。", null);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 咨询记录类别
+     *
+     * @param cmConsulttype
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmConsulttype>> getConsultList(CmConsulttype cmConsulttype, Integer pageNum, Integer pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmConsulttype> consultList = cmClubRemarksDao.getConsultList(cmConsulttype);
+        PaginationVo<CmConsulttype> page = new PaginationVo<>(consultList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 保存咨询记录类别
+     *
+     * @param cmConsulttype
+     * @return
+     */
+    @Override
+    public ResponseJson saveConsult(CmConsulttype cmConsulttype) {
+        if (null == cmConsulttype.getId()) {
+            // 添加
+            cmClubRemarksDao.insertConsult(cmConsulttype);
+        } else {
+            // 修改
+            cmClubRemarksDao.updateConsult(cmConsulttype);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 删除咨询记录类别
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseJson deleteConsult(Integer id) {
+        cmClubRemarksDao.deleteConsult(id);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 排序
+     *
+     * @param sortNumber
+     * @return
+     */
+    @Override
+    public ResponseJson sort(Integer id, Integer sortNumber) {
+        CmConsulttype cmConsulttype = new CmConsulttype();
+        cmConsulttype.setId(id);
+        cmConsulttype.setSortNumber(sortNumber);
+        cmClubRemarksDao.updateConsult(cmConsulttype);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 未注册用户咨询记录
+     *
+     * @param visit
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<VisitRemarkVo>> visitRemarkList(VisitRemarkVo visit, Integer pageNum, Integer pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<VisitRemarkVo> visitRemarkList = cmClubRemarksDao.getVisitRemarkList(visit);
+        PaginationVo<VisitRemarkVo> page = new PaginationVo<>(visitRemarkList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 未注册用户数据详情
+     *
+     * @param visitRemarkVo
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmClubRemarks>> remarksList(VisitRemarkVo visitRemarkVo, Integer pageNum, Integer pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmClubRemarks> remarksList = cmClubRemarksDao.getClubRemarksList(visitRemarkVo);
+        remarksList.forEach(remarks -> {
+            if (StringUtils.isNotBlank(remarks.getConsult())) {
+                StringBuilder cons = new StringBuilder();
+                if (remarks.getConsult().contains(",")) {
+                    String[] split = remarks.getConsult().split(",");
+                    for (String string : split) {
+                        cons.append(cmClubRemarksDao.findClassName(string)).append(",");
+                    }
+                    cons = new StringBuilder(cons.substring(0, cons.length() - 1));
+                } else {
+                    cons = new StringBuilder(cmClubRemarksDao.findClassName(remarks.getConsult()));
+                }
+                remarks.setConsultType(cons.toString());
+            }
+            List<String> imageList = null;
+            List<RemarksFileVo> fileList = null;
+            if (1 == remarks.getType()) {
+                // 已注册用户
+                imageList = cmClubRemarksDao.getRemarksImageList(remarks.getRemarksId());
+                fileList = cmClubRemarksDao.getRemarksFileList(remarks.getRemarksId());
+            } else {
+                // 未注册用户
+                imageList = cmClubRemarksDao.getVisitorImageList(remarks.getRemarksId());
+                fileList = cmClubRemarksDao.getVisitorFileList(remarks.getRemarksId());
+            }
+            fileList.forEach(f -> f.setFileUrl(ossUtils.getOssUrl(f.getOssName())));
+            remarks.setImageList(imageList);
+            remarks.setFileList(fileList);
+            // 咨询商品信息
+            if (null != remarks.getProductId()) {
+                remarks.setProduct(cmClubRemarksDao.getProduct(remarks.getProductId()));
+            }
+            // 报备记录
+            if (null != remarks.getReportId()) {
+                remarks.setReports(cmClubRemarksDao.getReportById(remarks.getReportId()));
+            }
+        });
+        PaginationVo<CmClubRemarks> page = new PaginationVo<>(remarksList);
+        return ResponseJson.success(page);
+    }
+
+}

+ 103 - 29
src/main/java/com/caimei365/manager/service/caimei/user/impl/CustomerServiceImpl.java

@@ -12,9 +12,11 @@ import com.github.pagehelper.PageHelper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -52,12 +54,14 @@ public class CustomerServiceImpl implements CustomerService {
     @Override
     public ResponseJson<PaginationVo<CmShop>> getShopLiat(String shopName, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
-        List<CmShop> shopList = customerServiceDao.getShopList(shopName);
+        List<CmShop> shopList = customerServiceDao.getShopList(shopName, null);
         // 是否支持选择
         List<Integer> customerShopId = customerServiceDao.getCustomerShopId();
         shopList.forEach( s -> {
             if (customerShopId.contains(s.getShopId())) {
                 s.setFlag(false);
+            } else {
+                s.setFlag(true);
             }
         });
         PaginationVo<CmShop> page = new PaginationVo<>(shopList);
@@ -140,8 +144,14 @@ public class CustomerServiceImpl implements CustomerService {
      */
     @Override
     public ResponseJson<PaginationVo<CmShopInfo>> getShopInfoList(CmShopInfo cmShopInfo, Integer pageNum, Integer pageSize) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         PageHelper.startPage(pageNum, pageSize);
         List<CmShopInfo> shopInfoList = customerServiceDao.getShopInfoList(cmShopInfo);
+        for (CmShopInfo shopInfo : shopInfoList) {
+            if (null != shopInfo.getPubdate()) {
+                shopInfo.setPubdateString(dateFormat.format(shopInfo.getPubdate()));
+            }
+        }
         PaginationVo<CmShopInfo> page = new PaginationVo<>(shopInfoList);
         return ResponseJson.success(page);
     }
@@ -157,13 +167,24 @@ public class CustomerServiceImpl implements CustomerService {
      */
     @Override
     public ResponseJson<PaginationVo<Info>> getInfoList(Integer id, String title, Integer pageNum, Integer pageSize) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         PageHelper.startPage(pageNum, pageSize);
         List<Info> infoList = customerServiceDao.getInfoList(id, title);
         List<Integer> shopInfoId = customerServiceDao.getShopInfoId();
         infoList.forEach( i -> {
             if (shopInfoId.contains(i.getId())) {
                 i.setFlag(false);
+            } else {
+                i.setFlag(true);
+            }
+
+            if (null != i.getCreateDate()) {
+                i.setCreateDateString(dateFormat.format(i.getCreateDate()));
             }
+            if (null != i.getPubdate()) {
+                i.setPubdateString(dateFormat.format(i.getPubdate()));
+            }
+
         });
         PaginationVo<Info> page = new PaginationVo<>(infoList);
         return ResponseJson.success(page);
@@ -221,7 +242,7 @@ public class CustomerServiceImpl implements CustomerService {
     }
 
     /**
-     * 相关文章列表
+     * 相关搜索词列表
      *
      * @param cmShopKeyword
      * @param pageNum
@@ -237,7 +258,7 @@ public class CustomerServiceImpl implements CustomerService {
     }
 
     /**
-     * 选择文章
+     * 选择搜索词
      *
      * @param keyword
      * @param pageNum
@@ -252,6 +273,8 @@ public class CustomerServiceImpl implements CustomerService {
         searchFrequencyList.forEach( s -> {
             if (shopKeywordId.contains(s.getId())) {
                 s.setFlag(false);
+            } else {
+                s.setFlag(true);
             }
         });
         PaginationVo<CmUserSearchFrequency> page = new PaginationVo<>(searchFrequencyList);
@@ -259,7 +282,7 @@ public class CustomerServiceImpl implements CustomerService {
     }
 
     /**
-     * 添加文章统计
+     * 添加搜索词统计
      *
      * @param shopId
      * @param keyWordIds
@@ -298,7 +321,7 @@ public class CustomerServiceImpl implements CustomerService {
     }
 
     /**
-     * 删除统计文章
+     * 删除统计搜索词
      *
      * @param id
      * @return
@@ -321,7 +344,7 @@ public class CustomerServiceImpl implements CustomerService {
     }
 
     /**
-     * 谈款数据保存
+     * 弹框数据保存
      *
      * @param cmShopPopUp
      * @return
@@ -364,9 +387,18 @@ public class CustomerServiceImpl implements CustomerService {
     public ResponseJson<CmShopAdvertisingImage> getShopAdvertisingImageById(Integer id) {
         CmShopAdvertisingImage shopAdvertisingImage = customerServiceDao.getShopAdvertisingImageById(id);
         // 设置供应商信息
-        List<CmShop> shopList = customerServiceDao.getShopList("");
+        List<CmShop> shopList = customerServiceDao.getShopList("",shopAdvertisingImage.getShopId());
+        List<CmShopStatistics> shops = new ArrayList<>();
         CmShop shop = shopList.stream().filter(s -> s.getShopId().equals(shopAdvertisingImage.getShopId())).collect(Collectors.toList()).get(0);
-        shopAdvertisingImage.setShop(shop);
+        // 回显设置
+        CmShopStatistics cmShopStatistics = new CmShopStatistics();
+        cmShopStatistics.setShopId(shop.getShopId());
+        cmShopStatistics.setShopName(shop.getName());
+        cmShopStatistics.setLinkMan(shop.getLinkMan());
+        cmShopStatistics.setMobile(shop.getContractMobile());
+        cmShopStatistics.setStatus(shop.getStatus());
+        shops.add(cmShopStatistics);
+        shopAdvertisingImage.setShops(shops);
         return ResponseJson.success(shopAdvertisingImage);
     }
 
@@ -379,6 +411,8 @@ public class CustomerServiceImpl implements CustomerService {
     @Override
     public ResponseJson saveShopAdvertisingImage(CmShopAdvertisingImage cmShopAdvertisingImage) {
         if (null == cmShopAdvertisingImage.getId()) {
+            cmShopAdvertisingImage.setSort(0);
+            cmShopAdvertisingImage.setDelFlag(0);
             // 插入
             customerServiceDao.insertShopAdvertisingImage(cmShopAdvertisingImage);
         } else {
@@ -391,22 +425,13 @@ public class CustomerServiceImpl implements CustomerService {
     /**
      * 一键排序
      *
-     * @param advertisingImages
+     * @param id
+     * @param sort
      * @return
      */
     @Override
-    public ResponseJson renewShopAdvertisingImageSort(String advertisingImages) {
-        try {
-            JSONArray parseArray = JSONArray.parseArray(advertisingImages);
-            for (Object object : parseArray) {
-                JSONObject parseObject = (JSONObject) object;
-                Integer id = (Integer) parseObject.get("id");
-                Integer sort = (Integer) parseObject.get("sort");
-                customerServiceDao.updateShopAdvertisingImageSort(id, sort);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+    public ResponseJson renewShopAdvertisingImageSort(Integer id, Integer sort) {
+        customerServiceDao.updateShopAdvertisingImageSort(id, sort);
         return ResponseJson.success();
     }
 
@@ -444,9 +469,12 @@ public class CustomerServiceImpl implements CustomerService {
      * @return
      */
     @Override
-    public ResponseJson<PaginationVo<CmPageShop>> getPageShop(Integer shopId, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PaginationVo<CmPageShop>> getPageShop(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
-        List<CmPageShop> pageShop = customerServiceDao.getPageShop(shopId);
+        List<CmPageShop> pageShop = customerServiceDao.getPageShop(shopId, startTime, endTime);
+        pageShop.forEach(shop -> {
+            shop.setAverage(calculationTime(shop.getAverageDuration().toString()));
+        });
         PaginationVo<CmPageShop> page = new PaginationVo<>(pageShop);
         return ResponseJson.success(page);
     }
@@ -460,9 +488,12 @@ public class CustomerServiceImpl implements CustomerService {
      * @return
      */
     @Override
-    public ResponseJson<PaginationVo<CmPageShopProduct>> getPageShopProduct(Integer shopId, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PaginationVo<CmPageShopProduct>> getPageShopProduct(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
-        List<CmPageShopProduct> pageShopProduct = customerServiceDao.getPageShopProduct(shopId);
+        List<CmPageShopProduct> pageShopProduct = customerServiceDao.getPageShopProduct(shopId, startTime, endTime);
+        pageShopProduct.forEach(shop -> {
+            shop.setAverage(calculationTime(shop.getAverageDuration().toString()));
+        });
         PaginationVo<CmPageShopProduct> page = new PaginationVo<>(pageShopProduct);
         return ResponseJson.success(page);
     }
@@ -476,9 +507,12 @@ public class CustomerServiceImpl implements CustomerService {
      * @return
      */
     @Override
-    public ResponseJson<PaginationVo<CmPageShopInfo>> getPageShopInfo(Integer shopId, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PaginationVo<CmPageShopInfo>> getPageShopInfo(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
-        List<CmPageShopInfo> pageShopInfo = customerServiceDao.getPageShopInfo(shopId);
+        List<CmPageShopInfo> pageShopInfo = customerServiceDao.getPageShopInfo(shopId, startTime, endTime);
+        pageShopInfo.forEach(shop -> {
+            shop.setAverage(calculationTime(shop.getAverageDuration().toString()));
+        });
         PaginationVo<CmPageShopInfo> page = new PaginationVo<>(pageShopInfo);
         return ResponseJson.success(page);
     }
@@ -492,10 +526,50 @@ public class CustomerServiceImpl implements CustomerService {
      * @return
      */
     @Override
-    public ResponseJson<PaginationVo<CmPageShopKeyword>> getPageShopKeyword(Integer shopId, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PaginationVo<CmPageShopKeyword>> getPageShopKeyword(Integer shopId, String startTime, String endTime, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
-        List<CmPageShopKeyword> pageShopKeyword = customerServiceDao.getPageShopKeyword(shopId);
+        List<CmPageShopKeyword> pageShopKeyword = customerServiceDao.getPageShopKeyword(shopId, startTime, endTime);
+        pageShopKeyword.forEach(shop -> {
+            shop.setAverage(calculationTime(shop.getAverageDuration().toString()));
+        });
         PaginationVo<CmPageShopKeyword> page = new PaginationVo<>(pageShopKeyword);
         return ResponseJson.success(page);
     }
+
+
+    /**
+     * 时间计算
+     * @param recordTime
+     * @return
+     */
+    public String calculationTime(String recordTime){
+        double doc = Double.parseDouble(recordTime);
+        int num = (int)doc;
+        //小时
+        int HH = 0;
+        // 分钟
+        int mm = 0;
+        //秒
+        int ss = 0;
+        int item = num / 1000;
+        if ((item / 60) >0) {
+            mm = item / 60;
+            ss = item % 60;
+        } else {
+            ss = item;
+        }
+        if ((mm / 60) >0) {
+            HH = mm / 60;
+            mm = mm % 60;
+        }
+        String  str= HH+":"+mm+":"+ss;
+        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
+        Date parse = null;
+        try {
+            parse = dateFormat.parse(str);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return dateFormat.format(parse);
+    }
 }

+ 259 - 0
src/main/java/com/caimei365/manager/utils/OSSUtils.java

@@ -0,0 +1,259 @@
+package com.caimei365.manager.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.UploadFileRequest;
+import com.caimei365.manager.config.thinkgem.Global;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+@Component
+public class OSSUtils {
+
+    @Resource private Environment environment;
+
+    private String endpoint; // = "https://oss-cn-shenzhen.aliyuncs.com";
+    private String accessKeyId; // = "LTAI4GBL3o4YkWnbKYgf2Xia";
+    private String accessKeySecret;//  = "dBjAXqbYiEPP6Ukuk2ZsXQeET7FVkK";
+    private String privateBucket; // = "caimei-oss";
+    private String config; // = Global.getConfig("cm.config");
+
+    public void setValue() {
+        endpoint = environment.getProperty("aliyun.endpoint");
+        accessKeyId = environment.getProperty("aliyun.accessKeyId");
+        accessKeySecret = environment.getProperty("aliyun.accessKeySecret");
+        privateBucket = environment.getProperty("aliyun.bucketName");
+        config = environment.getProperty("cm.config");
+    }
+
+    public  String ossUpload(String fileName, File file, String contentType) {
+        setValue();
+        String url = null;
+        try {
+            if ("product".equals(config)) {
+                fileName = "prod/" + fileName;
+            } else {
+                fileName = config + "/" + fileName;
+            }
+            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+            ObjectMetadata meta = new ObjectMetadata();
+            meta.setContentType(contentType);
+            UploadFileRequest uploadFileRequest = new UploadFileRequest(privateBucket, fileName);
+            // 指定上传的本地文件。
+            uploadFileRequest.setUploadFile(file.toString());
+            // 指定上传并发线程数,默认为1。
+            uploadFileRequest.setTaskNum(10);
+            // 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
+            uploadFileRequest.setPartSize(1024 * 1024);
+            // 开启断点续传,默认关闭。
+            uploadFileRequest.setEnableCheckpoint(true);
+            uploadFileRequest.setCheckpointFile(file.getAbsolutePath() + "uploadFile.ucp");
+            // 文件的元数据。
+            uploadFileRequest.setObjectMetadata(meta);
+            // 设置上传成功回调,参数为Callback类型。
+            //uploadFileRequest.setCallback("<yourCallbackEvent>");
+            // 断点续传上传。
+            ossClient.uploadFile(uploadFileRequest);
+            Date expiration = new Date(new Date().getTime() + 3600L * 1000);
+            url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
+            // 关闭OSSClient。
+            ossClient.shutdown();
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+        return url;
+    }
+
+
+    /**
+     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
+     */
+    public String getContentType(String fileName) {
+        setValue();
+        String fileExtension = fileName.substring(fileName.lastIndexOf("."));
+        if (".bmp".equalsIgnoreCase(fileExtension)) {
+            return "image/bmp";
+        }
+        if (".gif".equalsIgnoreCase(fileExtension)) {
+            return "image/gif";
+        }
+        if (".jpeg".equalsIgnoreCase(fileExtension)) {
+            return "image/jpeg";
+        }
+        if (".jpg".equalsIgnoreCase(fileExtension)) {
+            return "image/jpg";
+        }
+        if (".png".equalsIgnoreCase(fileExtension)) {
+            return "image/png";
+        }
+        if (".html".equalsIgnoreCase(fileExtension)) {
+            return "text/html";
+        }
+        if (".txt".equalsIgnoreCase(fileExtension)) {
+            return "text/plain";
+        }
+        if (".vsd".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.visio";
+        }
+        if (".ppt".equalsIgnoreCase(fileExtension)  ) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if (".pptx".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
+        }
+        if (".doc".equalsIgnoreCase(fileExtension)) {
+            return "application/msword";
+        }
+        if ("docx".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+        }
+        if (".xml".equalsIgnoreCase(fileExtension)) {
+            return "text/xml";
+        }
+        if (".mp4".equalsIgnoreCase(fileExtension)) {
+            return "video/mp4";
+        }
+        if (".mp3".equalsIgnoreCase(fileExtension)) {
+            return "audio/mp3";
+        }
+        if (".pdf".equalsIgnoreCase(fileExtension)) {
+            return "application/pdf";
+        }
+        return "text/html";
+    }
+
+    public void deleteFile(File... files) {
+        setValue();
+        for (File file : files) {
+            //logger.info("File:[{}]",file.getAbsolutePath());
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+    }
+
+    public File ossUpload(MultipartFile file) throws IOException {
+        setValue();
+        // 获取文件名
+        String fileName = file.getOriginalFilename();
+        // 获取文件后缀
+        String prefix = fileName.substring(fileName.lastIndexOf("."));
+        // 用uuid作为文件名,防止生成的临时文件重复
+        File excelFile = File.createTempFile(UUID.randomUUID().toString(), prefix);
+        // MultipartFile to File
+        file.transferTo(excelFile);
+        //程序结束时,删除临时文件
+        return excelFile;
+    }
+
+    /**
+     * 授权生成签名URL临时访问
+     *
+     * @param fileName 文件名称
+     */
+    public String getOssUrl(String fileName) {
+        setValue();
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 设置URL过期时间为1个小时
+        Date expiration = new Date(new Date().getTime() + 3600L * 1000);
+        if ("product".equals(config)) {
+            fileName = "prod/" + fileName;
+        } else {
+            fileName = config + "/" + fileName;
+        }
+        String url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
+        // 关闭OSSClient。
+        ossClient.shutdown();
+        return url;
+    }
+
+    /**
+     * 生成商品资料库链接
+     * @param ossName
+     * @param uploadTime
+     * @return
+     */
+    public String generateProductArchiveUrl(String ossName, Date uploadTime) {
+        setValue();
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 设置URL过期时间为1个小时
+        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            Date dateOne = format.parse("2021-06-01 00:00:00");
+            Date dateTwo = format.parse("2021-09-17 18:00:00");
+            String active = "product".equals(config) ? "prod" : config;
+            if (uploadTime != null && uploadTime.compareTo(dateOne) > 0 && uploadTime.compareTo(dateTwo) < 0) {
+                ossName = active + "/" + ossName;
+            } else if (uploadTime != null && uploadTime.compareTo(dateTwo) > 0) {
+                ossName = active + "/archiveFile/" + ossName;
+            }
+        } catch (ParseException e) {
+        }
+        String url = ossClient.generatePresignedUrl(privateBucket, ossName, expiration).toString();
+        ossClient.shutdown();
+        return url;
+    }
+
+    /**
+     * oss单个文件删除
+     *
+     * @param fileName 文件名称或文件夹名称
+     */
+    public void deleteSingleFile(String fileName) {
+        setValue();
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。
+        // 如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
+        try {
+            //之前的文件没有放进文件夹
+            ossClient.deleteObject(privateBucket, fileName);
+        } catch (Exception e) {
+            if ("product".equals(config)) {
+                fileName = "prod/" + fileName;
+            } else {
+                fileName = config + "/" + fileName;
+            }
+            ossClient.deleteObject(privateBucket, fileName);
+        }
+        // 关闭OSSClient。
+        ossClient.shutdown();
+    }
+
+    /**
+     * oss单个文件下载
+     */
+    public void downFile(String ossName, String fileName) {
+        setValue();
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
+        try {
+            //之前的文件没有放进文件夹
+            ossClient.getObject(new GetObjectRequest(privateBucket, ossName), new File("./" + fileName));
+        } catch (Exception e) {
+            if ("product".equals(config)) {
+                ossName = "prod/" + ossName;
+            } else {
+                ossName = config + "/" + ossName;
+            }
+            ossClient.getObject(new GetObjectRequest(privateBucket, ossName), new File("./" + fileName));
+        }
+        // 关闭OSSClient。
+        ossClient.shutdown();
+    }
+
+}

+ 62 - 0
src/main/java/com/caimei365/manager/utils/formDataUtils.java

@@ -0,0 +1,62 @@
+package com.caimei365.manager.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import com.caimei365.manager.FastDFS.FastDFSClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@Controller
+@RequestMapping("formData")
+@Slf4j
+public class formDataUtils {
+    @Resource
+    private FastDFSClient client;
+    @Value("${caimei.imageDomain}")
+    private String imageDomain;
+
+    @ResponseBody
+    @RequestMapping("/MultiPictareaddData")
+    public Map<String, Object> MultiPictareaddData(MultipartFile[] file, HttpServletRequest request) throws IOException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        String saveFile = null;
+        if (file != null && file.length > 0) {
+            for (int i = 0; i < file.length; i++) {
+                MultipartFile filex = file[i];
+                // 保存文件
+                saveFile = saveFile(request, filex);
+                saveFile = imageDomain + "/" + saveFile;
+            }
+            map.put("data", saveFile);
+            map.put("msg", "上传成功");
+            log.info(">>>>>>>>>>>>>>>>图片上传成功:" + saveFile);
+        } else {
+            map.put("msg", "上传失败");
+            log.info(">>>>>>>>>>>>>>>>图片上传失败:");
+        }
+        return map;
+    }
+
+    private String saveFile(HttpServletRequest request, MultipartFile file) throws IOException {
+        String originalFilename = file.getOriginalFilename();
+        String randomUUID = UUID.randomUUID().toString();
+        int index = originalFilename.lastIndexOf(".");
+        String exet = originalFilename.substring(index);
+        String filePath = "/mnt/newdatadrive/data/runtime/jar-instance/mall/tempImage/";
+        filePath += "\\" + randomUUID + exet;
+        file.transferTo(new File(filePath));
+        log.info(">>>>>>>>>>>>>>>>图片上传路径:" + filePath);
+        String file1 = client.uploadFile(filePath);
+        return file1;
+    }
+}

+ 9 - 0
src/main/resources/config/beta/application-beta.yml

@@ -48,6 +48,15 @@ caimei:
   coreDomain: https://core-b.caimei365.com
   imageDomain: https://img-b.caimei365.com
 
+cm:
+  config: beta
+
+aliyun:
+  accessKeyId: LTAI4GBL3o4YkWnbKYgf2Xia
+  accessKeySecret: dBjAXqbYiEPP6Ukuk2ZsXQeET7FVkK
+  bucketName: caimei-oss
+  endpoint: https://oss-cn-shenzhen.aliyuncs.com
+
 # 微信公众号
 wechat:
   apiUrl: https://api.weixin.qq.com

+ 9 - 0
src/main/resources/config/dev/application-dev.yml

@@ -48,6 +48,15 @@ caimei:
   coreDomain: https://core-b.caimei365.com
   imageDomain: https://img-b.caimei365.com
 
+cm:
+  config: dev
+
+aliyun:
+  accessKeyId: LTAI4GBL3o4YkWnbKYgf2Xia
+  accessKeySecret: dBjAXqbYiEPP6Ukuk2ZsXQeET7FVkK
+  bucketName: caimei-oss
+  endpoint: https://oss-cn-shenzhen.aliyuncs.com
+
 # 微信公众号
 wechat:
   apiUrl: https://api.weixin.qq.com

+ 9 - 0
src/main/resources/config/prod/application-prod.yml

@@ -50,6 +50,15 @@ caimei:
   coreDomain: https://core.caimei365.com
   imageDomain: https://img.caimei365.com
 
+cm:
+  config: product
+
+aliyun:
+  accessKeyId: LTAI4GBL3o4YkWnbKYgf2Xia
+  accessKeySecret: dBjAXqbYiEPP6Ukuk2ZsXQeET7FVkK
+  bucketName: caimei-oss
+  endpoint: https://oss-cn-shenzhen.aliyuncs.com
+
 # 微信公众号
 wechat:
   apiUrl: https://api.weixin.qq.com

+ 109 - 9
src/main/resources/mapper/KeyWordDao.xml

@@ -7,8 +7,8 @@
     </insert>
 
     <insert id="insertLabelByExcel">
-        insert into cm_user_search_frequency(fromSearch, keyword, frequency, trueStatus, addTime)
-        values (3, #{keyword}, 0, 1, now())
+        insert into cm_user_search_frequency(fromSearch, keyword, frequency, trueStatus, dynamicStatus, addTime)
+        values (3, #{keyword}, 0, 1, 0, now())
     </insert>
 
     <update id="updateLabelStatus">
@@ -32,23 +32,28 @@
     </update>
 
     <select id="findList" resultType="com.caimei365.manager.entity.caimei.KeyWord">
-        SELECT cusf.id AS id, frequency, cusf.keyword as keyword,addTime,
-        cusf.searchTime as searchTime,cusf.trueStatus as labelStatus,cusf.fromSearch as fromSearch
+        SELECT cusf.id AS id, cusf.frequency, cusf.keyword as keyword, cusf.addTime,
+        cusf.searchTime as searchTime,cusf.trueStatus as labelStatus,cusf.fromSearch as fromSearch,
+        cusf.dynamicStatus, s.linkMan as name
         FROM cm_user_search_frequency cusf
+        left join serviceprovider s on cusf.serviceProviderId = s.serviceProviderID
         WHERE cusf.delStatus = 1
         <if test="beginTime !=null and beginTime !=''">
-            AND (searchTime BETWEEN #{beginTime} AND #{endTime} or searchTime IS NULL)
+            AND (cusf.searchTime BETWEEN #{beginTime} AND #{endTime} or cusf.searchTime IS NULL)
         </if>
         <if test="keyword !=null and keyword !=''">
-            AND keyword LIKE CONCAT('%',#{keyword},'%')
+            AND cusf.keyword LIKE CONCAT('%',#{keyword},'%')
+        </if>
+        <if test="labelStatus == 1">
+            AND cusf.dynamicStatus = 0
         </if>
         <if test="labelStatus !=null">
-            AND trueStatus = #{labelStatus}
+            AND cusf.trueStatus = #{labelStatus}
         </if>
         <if test="fromSearch != null">
-            AND fromSearch = #{fromSearch}
+            AND cusf.fromSearch = #{fromSearch}
         </if>
-        ORDER BY frequency DESC,searchTime DESC
+        ORDER BY cusf.addTime DESC, cusf.searchTime DESC
     </select>
 
     <select id="findRecommendList" resultType="com.caimei365.manager.entity.caimei.KeyWord">
@@ -72,4 +77,99 @@
         where keyword = #{keyword}
           and delstatus = 1
     </select>
+
+    <select id="getServiceList" resultType="com.caimei365.manager.entity.caimei.cmUser.ServiceProviderModel">
+        SELECT
+            ser.serviceProviderID AS serviceProviderId,
+            ser.linkMan,
+            ser.userID AS userId
+        FROM serviceprovider ser
+        WHERE ser.organizeId = 0 AND ser.validFlag = 1 AND ser.status = 90 GROUP BY ser.serviceProviderID
+        order by ser.addTime asc
+    </select>
+
+    <select id="getStateKeyWordList" resultType="com.caimei365.manager.entity.caimei.KeyWord">
+        SELECT cusf.id AS id, cusf.frequency, cusf.keyword as keyword, cusf.addTime,
+        cusf.searchTime as searchTime,cusf.trueStatus as labelStatus,cusf.fromSearch as fromSearch,
+        cusf.serviceProviderId, cusf.dynamicStatus, s.linkMan as name
+        FROM cm_user_search_frequency cusf
+        left join serviceprovider s on cusf.serviceProviderId = s.serviceProviderID
+        WHERE cusf.delStatus = 1 AND cusf.dynamicStatus = 1
+        <if test="beginTime !=null and beginTime !=''">
+            AND (cusf.searchTime BETWEEN #{beginTime} AND #{endTime} or cusf.searchTime IS NULL)
+        </if>
+        <if test="keyword !=null and keyword !=''">
+            AND cusf.keyword LIKE CONCAT('%',#{keyword},'%')
+        </if>
+        <if test="fromSearch != null">
+            AND cusf.fromSearch = #{fromSearch}
+        </if>
+        <if test="serviceProviderId != null">
+            AND cusf.serviceProviderID = #{serviceProviderId}
+        </if>
+        ORDER BY cusf.addTime DESC
+    </select>
+
+    <insert id="insertLabelByState">
+        insert into cm_user_search_frequency(fromSearch, keyword, frequency, trueStatus, dynamicStatus, addTime)
+        values (1, #{keyword}, 0, 0, 1, now())
+    </insert>
+
+    <select id="getPriorKeywordList" resultType="com.caimei365.manager.entity.caimei.CmPriorKeyword">
+        select
+            cpk.id, cpk.searchId AS searchId ,cusf.fromSearch as fromSearch, cusf.keyword as keyword, cusf.dynamicStatus,
+            cusf.serviceProviderId, cpk.addTime, s.linkMan as name
+        from cm_prior_keyword cpk
+        left join cm_user_search_frequency cusf on cpk.searchId = cusf.id
+        left join serviceprovider s on cusf.serviceProviderId = s.serviceProviderID
+        WHERE cpk.delFlag = 0 AND cusf.delStatus = 1
+        <if test="keyword !=null and keyword !=''">
+            AND cusf.keyword LIKE CONCAT('%',#{keyword},'%')
+        </if>
+        <if test="fromSearch != null">
+            AND cusf.fromSearch = #{fromSearch}
+        </if>
+        <if test="dynamicStatus != null">
+            AND cusf.dynamicStatus = #{dynamicStatus}
+        </if>
+        order by cpk.addTime desc
+    </select>
+
+    <select id="getPickKeyword" resultType="com.caimei365.manager.entity.caimei.KeyWord">
+        SELECT cusf.id AS id, cusf.frequency, cusf.keyword as keyword, cusf.addTime,
+        cusf.searchTime as searchTime,cusf.trueStatus as labelStatus,cusf.fromSearch as fromSearch,
+        cusf.serviceProviderId, cusf.dynamicStatus, s.linkMan as name
+        FROM cm_user_search_frequency cusf
+        left join serviceprovider s on cusf.serviceProviderId = s.serviceProviderID
+        WHERE cusf.delStatus = 1
+        <if test="keyword !=null and keyword !=''">
+            AND cusf.keyword LIKE CONCAT('%',#{keyword},'%')
+        </if>
+        <if test="fromSearch != null">
+            AND cusf.fromSearch = #{fromSearch}
+        </if>
+        <if test="dynamicStatus != null">
+            AND cusf.dynamicStatus = #{dynamicStatus}
+        </if>
+        ORDER BY cusf.addTime DESC
+    </select>
+
+    <select id="getPriorCount" resultType="java.lang.Integer">
+        select count(id) from cm_prior_keyword where delFlag = 0
+    </select>
+
+    <select id="getPrior" resultType="java.lang.Integer">
+        select id from cm_prior_keyword where delFlag = 0 and searchId = #{searchId}
+    </select>
+
+    <insert id="insertPriorKeyword">
+        insert into cm_prior_keyword (searchId, addTime, delFlag)
+        values (#{searchId}, now(), 0)
+    </insert>
+
+    <update id="delPriorKeyword">
+        update cm_prior_keyword
+        set delFlag = 1
+        where id = #{id}
+    </update>
 </mapper>

+ 443 - 0
src/main/resources/mapper/user/CmClubRemarksDao.xml

@@ -0,0 +1,443 @@
+<?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.caimei365.manager.dao.user.CmClubRemarksDao">
+
+    <select id="getServiceList" resultType="com.caimei365.manager.entity.caimei.cmUser.ServiceProviderModel">
+        SELECT
+            ser.serviceProviderID AS serviceProviderId,
+            ser.linkMan,
+            ser.userID AS userId,
+            ser.mainServiceProviderID AS mainServiceProviderId,
+            svs.linkMan as mainName
+        FROM serviceprovider ser
+                 LEFT JOIN cm_serviceteam_group csg ON csg.serviceId = ser.serviceProviderID
+                 LEFT JOIN cm_serviceteam_role csr ON csr.id = csg.teamId
+                 LEFT JOIN (SELECT serviceProviderID, linkMan FROM serviceprovider WHERE validFlag = 1 AND STATUS = 90) svs ON svs.serviceProviderID = csr.leaderId
+        WHERE ser.organizeId = 0 AND ser.validFlag = 1 AND ser.status = 90 and ser.serviceProviderID != 1342 GROUP BY ser.serviceProviderID
+        order by csr.createdTime, ser.addTime asc
+    </select>
+
+    <select id="getRegisteredNumber" resultType="java.lang.Integer">
+        SELECT
+                (SELECT COUNT(id) FROM cm_club_remarks WHERE createServiceProviderId = #{serviceProviderId} AND clubId IS NOT NULL)
+                    + (SELECT COUNT(id) FROM cm_visitor_remarks WHERE serviceProviderId = #{serviceProviderId} AND addTime = #{addTime} AND clubId IS NOT NULL)
+    </select>
+
+    <select id="getUnregisteredNumber" resultType="java.lang.Integer">
+        SELECT
+                (SELECT COUNT(id) FROM cm_visitor_remarks WHERE serviceProviderId = #{serviceProviderId} AND clubId IS NULL)
+    </select>
+
+    <select id="getClassName" resultType="com.caimei365.manager.entity.caimei.cmUser.CmConsulttype">
+        select id, className
+        from cm_consulttype
+        where delFlag = 0
+    </select>
+
+    <select id="findRegistList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmClubRemarks">
+        SELECT DISTINCT
+        ccr.id AS remarksId, ccr.remarks, s.linkman AS spName, ccr.addTime, ccr.questionMan,
+        csr.leaderId AS leaderId, IFNULL(ccr.consultType,'') AS consult, c.Name AS clubName,
+        ccr.clubType, ccr.pinceSensitve, ccr.satisfied, ccr.followup, ccr.extra,
+        ccr.communicationSituation, ccr.communicationMethods, ccr.customerSource, ccr.customerGender, ccr.groupAddition,
+        ccr.customerAge, ccr.trendsKeyword, ccr.stateKeyword, c.newDeal, c.contractMobile, '1' as type,
+        (SELECT linkMan FROM serviceprovider s WHERE s.serviceProviderID = ccr.serviceProviderId) AS serviceName,
+        (SELECT NAME FROM serviceprovider s WHERE s.serviceProviderID= csr.leaderId) AS leaderName,
+        (SELECT mainImage FROM product p WHERE p.productID= ccre.productID) AS productMainImage,
+        (SELECT NAME FROM product p WHERE p.productID= ccre.productID) AS proName,
+        ccre.reportText AS reportText, ccre.status AS reportStatus, ccre.auditName AS auditName, ccre.auditTime AS auditTime,
+        p.mainImage AS mainImage, ccr.productId as productId, p.name AS productName, sh.name AS shopName, ccr.reportID
+        FROM cm_club_remarks ccr
+        LEFT JOIN serviceprovider s ON ccr.createServiceProviderId = s.serviceProviderID
+        LEFT JOIN club c ON c.clubId=ccr.clubId
+        LEFT JOIN cm_serviceTeam_group csg ON ccr.createServiceProviderId = csg.serviceId
+        LEFT JOIN cm_serviceTeam_role csr ON csr.id = csg.teamId
+        LEFT JOIN cm_club_report ccre ON ccre.Id= ccr.reportID
+        LEFT JOIN product p ON p.productID = ccr.productID
+        LEFT JOIN shop sh ON sh.shopID = p.shopID
+        <where>
+            s.validFlag = 1 and s.serviceProviderID not in (1371, 1359, 1342)
+            <if test="remarks != null and remarks !=''">
+                AND ccr.remarks LIKE concat('%',#{remarks},'%')
+            </if>
+            <if test="clubName !=null and clubName !=''">
+                AND c.Name like concat('%',#{clubName},'%')
+            </if>
+            <if test="leaderId != null">
+                and csr.leaderId = #{leaderId}
+            </if>
+            <if test="serviceProviderId != null">
+                and ccr.serviceProviderId = #{serviceProviderId}
+            </if>
+            <if test="consult != null">
+                and ccr.consultType like concat('%',#{consult},'%')
+            </if>
+            <if test="todayTime != null and todayTime != ''">
+                and ccr.addTime like concat('%', #{todayTime}, '%')
+            </if>
+            <if test="startAddTime != '' and startAddTime != null">
+                and ccr.addTime <![CDATA[  >  ]]> #{startAddTime}
+            </if>
+            <if test="endAddTime != '' and endAddTime != null">
+                and ccr.addTime <![CDATA[  <  ]]> #{endAddTime}
+            </if>
+            <if test="newDeal !=null">
+                and c.newDeal=#{newDeal}
+            </if>
+            <if test="reportId !=null">
+                and ccr.reportID=#{reportId}
+            </if>
+            <if test="isRegister != null">
+                <if test="isRegister == 1">
+                    and ccr.clubId is null
+                </if>
+                <if test="isRegister == 2">
+                    and ccr.clubId is not null
+                </if>
+            </if>
+        </where>
+
+        union
+
+        SELECT DISTINCT
+        ccr.id AS remarksId, ccr.remarks, s.name AS spName, ccr.addTime, ccr.questionMan,
+        csr.leaderId AS leaderId, IFNULL(ccr.consultType,'') AS consult, c.Name AS clubName,
+        ccr.clubType, ccr.pinceSensitve, ccr.satisfied, ccr.followup, ccr.extra,
+        '' as communicationSituation, '' as communicationMethods, '' as customerSource, '' as customerGender, '' as groupAddition,
+        '' as customerAge, '' as trendsKeyword, '' as stateKeyword, c.newDeal, c.contractMobile, '2' as type,
+        (SELECT linkMan FROM serviceprovider s WHERE s.serviceProviderID = ccr.serviceProviderId) AS serviceName,
+        (SELECT NAME FROM serviceprovider s WHERE s.serviceProviderID = csr.leaderId) AS leaderName,
+        (SELECT mainImage FROM product p WHERE p.productID= ccre.productID) AS productMainImage,
+        (SELECT NAME FROM product p WHERE p.productID= ccre.productID) AS proName,
+        ccre.reportText AS reportText, ccre.status AS reportStatus, ccre.auditName AS auditName, ccre.auditTime AS auditTime,
+        p.mainImage AS mainImage, ccr.productId as productId, p.name AS productName, sh.name AS shopName, ccr.reportID
+        FROM cm_visitor_remarks ccr
+        LEFT JOIN serviceprovider s ON ccr.serviceProviderId = s.serviceProviderID
+        LEFT JOIN club c ON c.clubId = ccr.clubId
+        LEFT JOIN cm_serviceTeam_group csg ON ccr.serviceProviderId = csg.serviceId
+        LEFT JOIN cm_serviceTeam_role csr ON csr.id = csg.teamId
+        LEFT JOIN cm_club_report ccre ON  ccre.Id= ccr.reportID
+        LEFT JOIN product p ON p.productID = ccr.productID
+        LEFT JOIN shop sh ON sh.shopID = p.shopID
+        <where>
+            ccr.clubId is not null
+            <if test="remarks != null and remarks !=''">
+                AND ccr.remarks LIKE concat('%',#{remarks},'%')
+            </if>
+            <if test="leaderId != null">
+                and csr.leaderId = #{leaderId}
+            </if>
+            <if test="serviceProviderId != null">
+                and ccr.serviceProviderId = #{serviceProviderId}
+            </if>
+            <if test="consult != null">
+                and ccr.consultType like concat('%',#{consult},'%')
+            </if>
+            <if test="todayTime != null and todayTime != ''">
+                and ccr.addTime like concat('%', #{todayTime}, '%')
+            </if>
+            <if test="startAddTime != '' and startAddTime != null">
+                and ccr.addTime <![CDATA[  >  ]]> #{startAddTime}
+            </if>
+            <if test="endAddTime != '' and endAddTime != null">
+                and ccr.addTime <![CDATA[  <  ]]> #{endAddTime}
+            </if>
+            <if test="newDeal !=null">
+                and c.newDeal=#{newDeal}
+            </if>
+            <if test="reportId !=null">
+                and ccr.reportID=#{reportId}
+            </if>
+            <if test="isRegister != null">
+                <if test="isRegister == 1">
+                    and ccr.clubId is null
+                </if>
+                <if test="isRegister == 2">
+                    and ccr.clubId is not null
+                </if>
+            </if>
+            and ccr.remarks IS NOT NULL
+        </where>
+        ORDER BY ADDTIME DESC
+    </select>
+
+    <update id="updateClubRemarks">
+        UPDATE cm_club_remarks
+        SET reportID=null
+        WHERE id = #{remarksId}
+    </update>
+
+    <update id="updateVisitorRemarks">
+        UPDATE cm_visitor_remarks
+        SET reportID=null
+        WHERE id = #{remarksId}
+    </update>
+
+    <select id="getProduct" resultType="com.caimei365.manager.entity.caimei.product.Product">
+        select p.*, s.name as shopName from product p
+        left join shop s on s.shopId = p.shopId
+        where p.productId = #{productId}
+    </select>
+
+    <select id="getReportById" resultType="com.caimei365.manager.entity.caimei.cmUser.CmReport">
+        SELECT ccr.Id as reportId, p.mainImage AS mainImage,p.`name` AS productName,c.`name` AS clubName,
+        ccr.reportName AS reportName, ccr.reportText AS reportText, ccr.addTime AS ADDTIME,
+        ccr.status AS STATUS, ccr.auditName AS auditName, ccr.auditTime AS auditTime, c.newDeal, ccr.auditText
+        FROM cm_club_report ccr
+        LEFT JOIN product p ON p.productID = ccr.productID
+        LEFT JOIN club c ON c.clubID = ccr.clubID
+        where  ccr.id = #{reportId}
+        limit 1
+    </select>
+
+    <select id="findClassName" resultType="java.lang.String">
+        select className
+        from cm_consulttype
+        where id = #{id}
+    </select>
+
+    <select id="getRemarksImageList" resultType="java.lang.String">
+        select imageUrl
+        from cm_club_remarks_file
+        where remarksId = #{remarksId}
+          and fileType = 1
+    </select>
+
+    <select id="getRemarksFileList" resultType="com.caimei365.manager.entity.caimei.cmUser.RemarksFileVo">
+        select fileName, ossName
+        from cm_club_remarks_file
+        where remarksId = #{remarksId}
+          and fileType = 2
+    </select>
+
+    <select id="getReportList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmReport">
+        SELECT ccr.Id as reportId, p.mainImage AS mainImage,p.`name` AS productName,c.`name` AS clubName,
+               ccr.reportName AS reportName, ccr.reportText AS reportText, ccr.addTime AS ADDTIME,
+               ccr.status AS STATUS, ccr.auditName AS auditName, ccr.auditTime AS auditTime, c.newDeal, ccr.auditText
+        FROM cm_club_report ccr
+        LEFT JOIN product p ON p.productID = ccr.productID
+        LEFT JOIN club c ON c.clubID = ccr.clubID
+        <where>
+            <if test="reportId!=null and reportId!=''">
+                AND ccr.id=#{reportId}
+            </if>
+            <if test="productName!=null and productName!=''">
+                AND p.name LIKE concat('%',#{productName},'%')
+            </if>
+            <if test="clubId != null">
+                c.clubID = #{clubId}
+            </if>
+            <if test="clubName!=null and clubName!=''">
+                AND c.name LIKE concat('%',#{clubName},'%')
+            </if>
+            <if test="reportName!=null and reportName!=''">
+                AND ccr.reportName LIKE concat('%',#{reportName},'%')
+            </if>
+            <if test="status != null">
+                AND ccr.status = #{status}
+            </if>
+            <if test="newDeal != null">
+                AND c.newDeal =#{newDeal}
+            </if>
+            <if test="startAddTime != null and startAddTime != ''">
+                and ccr.addTime <![CDATA[  >  ]]> #{startAddTime}
+            </if>
+            <if test="endAddTime != null and endAddTime != ''">
+                and ccr.addTime <![CDATA[  <  ]]> #{endAddTime}
+            </if>
+        </where>
+        ORDER BY ccr.`addTime` DESC
+    </select>
+
+    <select id="clubRemarksConut" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_club_remarks
+        WHERE reportID = #{reportId}
+    </select>
+
+    <select id="visitorRemarksConut" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_visitor_remarks
+        WHERE reportID = #{reportId}
+    </select>
+
+    <delete id="deleteClubRemarks">
+        DELETE
+        FROM cm_club_report
+        WHERE id = #{reportId}
+    </delete>
+
+    <update id="updateAuditRemarks">
+        UPDATE cm_club_report
+        SET status  =   #{status},
+            auditName   =   #{auditName},
+            auditText   =   #{auditText},
+            auditTime   =   now()
+        WHERE id = #{reportId}
+    </update>
+
+    <select id="getConsultList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmConsulttype">
+        SELECT
+        a.id AS "id",
+        a.className AS "className",
+        a.status AS "status",
+        a.sortNumber AS "sortNumber",
+        a.createdTime AS "createdTime",
+        a.delflag AS "delflag"
+        FROM cm_consulttype a
+        <where>
+            delFlag = 0
+            <if test="status != null">
+                and a.status = #{status}
+            </if>
+            <if test="className != null and className != ''">
+                AND a.className LIKE concat('%',#{className},'%')
+            </if>
+        </where>
+        order by sortnumber ASC
+    </select>
+
+    <insert id="insertConsult" parameterType="com.caimei365.manager.entity.caimei.cmUser.CmConsulttype"  keyProperty="id" useGeneratedKeys="true">
+        INSERT INTO cm_consulttype(
+            className,
+            status,
+            sortNumber,
+            createdTime,
+            delflag
+        ) VALUES (
+                     #{className},
+                     1,
+                     #{sortNumber},
+                     now(),
+                     0
+                 )
+    </insert>
+
+    <update id="updateConsult">
+        UPDATE cm_consulttype SET
+        <if test="className != null and className != '' ">
+            className = #{className},
+        </if>
+        <if test="status != null and status != ''">
+            status = #{status},
+        </if>
+        <if test="sortNumber != null">
+            sortNumber = #{sortNumber},
+        </if>
+        <if test="createdTime != null">
+            createdTime = #{createdTime},
+        </if>
+        delflag = 0
+        WHERE id = #{id}
+    </update>
+
+    <update id="deleteConsult">
+        update cm_consulttype
+        set delflag = 1
+        WHERE id = #{id}
+    </update>
+
+    <select id="getVisitRemarkList" resultType="com.caimei365.manager.entity.caimei.cmUser.VisitRemarkVo">
+        SELECT cvr.id as remarksId,cvr.questionManId,cvr.serviceProviderId,cvr.remarks,cvr.addTime,
+               cvr.questionMan,cvr.clubId,cvr.concactTime,c.name as clubName,s.linkMan as serviceName
+        FROM cm_visitor_remarks cvr
+        LEFT JOIN serviceprovider s ON s.serviceProviderID = cvr.serviceProviderId
+        LEFT JOIN club c ON c.clubId= cvr.clubId
+        <where>
+            <if test="serviceProviderId != null and serviceProviderId != ''">
+                AND cvr.serviceProviderId = #{serviceProviderId}
+            </if>
+            <if test="concat == 1">
+                and cvr.clubId is not null
+            </if>
+            <if test="concat == 2">
+                and cvr.clubId is null
+            </if>
+            <if test="questionMan != null and questionMan != ''">
+                and cvr.questionMan LIKE concat('%',#{questionMan},'%')
+            </if>
+        </where>
+        GROUP BY cvr.questionManId
+        ORDER BY cvr.addTime DESC
+    </select>
+
+    <select id="getClubRemarksList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmClubRemarks">
+        SELECT DISTINCT
+        ccr.id AS remarksId, ccr.remarks, s.linkman AS spName, ccr.addTime, ccr.questionMan,
+        csr.leaderId AS leaderId, IFNULL(ccr.consultType,'') AS consult, c.Name AS clubName,
+        ccr.clubType, ccr.pinceSensitve, ccr.satisfied, ccr.followup, ccr.extra,
+        ccr.communicationSituation, ccr.communicationMethods, ccr.customerSource, ccr.customerGender, ccr.groupAddition,
+        ccr.customerAge, ccr.trendsKeyword, ccr.stateKeyword, c.newDeal, c.contractMobile, '1' as type,
+        (SELECT linkMan FROM serviceprovider s WHERE s.serviceProviderID = ccr.serviceProviderId) AS serviceName,
+        (SELECT NAME FROM serviceprovider s WHERE s.serviceProviderID= csr.leaderId) AS leaderName,
+        (SELECT mainImage FROM product p WHERE p.productID= ccre.productID) AS productMainImage,
+        (SELECT NAME FROM product p WHERE p.productID= ccre.productID) AS proName,
+        ccre.reportText AS reportText, ccre.status AS reportStatus, ccre.auditName AS auditName, ccre.auditTime AS auditTime,
+        p.mainImage AS mainImage, ccr.productId as productId, p.name AS productName, sh.name AS shopName, ccr.reportID
+        FROM cm_club_remarks ccr
+        LEFT JOIN serviceprovider s ON ccr.createServiceProviderId = s.serviceProviderID
+        LEFT JOIN club c ON c.clubId=ccr.clubId
+        LEFT JOIN cm_serviceTeam_group csg ON ccr.createServiceProviderId = csg.serviceId
+        LEFT JOIN cm_serviceTeam_role csr ON csr.id = csg.teamId
+        LEFT JOIN cm_club_report ccre ON ccre.Id= ccr.reportID
+        LEFT JOIN product p ON p.productID = ccr.productID
+        LEFT JOIN shop sh ON sh.shopID = p.shopID
+        <where>
+            s.validFlag = 1 and s.serviceProviderID not in (1371, 1359, 1342)
+            <if test="questionManId != null and questionManId != ''">
+                AND ccr.clubId is null
+            </if>
+            <if test="questionManId == null or questionManId == ''">
+                <if test="clubId != null">
+                    and ccr.clubId = #{clubId}
+                </if>
+            </if>
+        </where>
+
+        union
+
+        SELECT DISTINCT
+        ccr.id AS remarksId, ccr.remarks, s.name AS spName, ccr.addTime, ccr.questionMan,
+        csr.leaderId AS leaderId, IFNULL(ccr.consultType,'') AS consult, c.Name AS clubName,
+        ccr.clubType, ccr.pinceSensitve, ccr.satisfied, ccr.followup, ccr.extra,
+        '' as communicationSituation, '' as communicationMethods, '' as customerSource, '' as customerGender, '' as groupAddition,
+        '' as customerAge, '' as trendsKeyword, '' as stateKeyword, c.newDeal, c.contractMobile, '2' as type,
+        (SELECT linkMan FROM serviceprovider s WHERE s.serviceProviderID = ccr.serviceProviderId) AS serviceName,
+        (SELECT NAME FROM serviceprovider s WHERE s.serviceProviderID = csr.leaderId) AS leaderName,
+        (SELECT mainImage FROM product p WHERE p.productID= ccre.productID) AS productMainImage,
+        (SELECT NAME FROM product p WHERE p.productID= ccre.productID) AS proName,
+        ccre.reportText AS reportText, ccre.status AS reportStatus, ccre.auditName AS auditName, ccre.auditTime AS auditTime,
+        p.mainImage AS mainImage, ccr.productId as productId, p.name AS productName, sh.name AS shopName, ccr.reportID
+        FROM cm_visitor_remarks ccr
+        LEFT JOIN serviceprovider s ON ccr.serviceProviderId = s.serviceProviderID
+        LEFT JOIN club c ON c.clubId = ccr.clubId
+        LEFT JOIN cm_serviceTeam_group csg ON ccr.serviceProviderId = csg.serviceId
+        LEFT JOIN cm_serviceTeam_role csr ON csr.id = csg.teamId
+        LEFT JOIN cm_club_report ccre ON  ccre.Id= ccr.reportID
+        LEFT JOIN product p ON p.productID = ccr.productID
+        LEFT JOIN shop sh ON sh.shopID = p.shopID
+        <where>
+            <if test="questionManId != null and questionManId != ''">
+                AND ccr.questionManId LIKE concat('%',#{questionManId},'%')
+            </if>
+            <if test="clubId != null">
+                and ccr.clubId = #{clubId}
+            </if>
+        </where>
+        ORDER BY ADDTIME DESC
+    </select>
+
+    <select id="getVisitorImageList" resultType="java.lang.String">
+        select imageUrl
+        from cm_visitor_remarks_file
+        where remarksId = #{remarksId}
+          and fileType = 1
+    </select>
+    <select id="getVisitorFileList" resultType="com.caimei365.manager.entity.caimei.cmUser.RemarksFileVo">
+        select fileName, ossName
+        from cm_visitor_remarks_file
+        where remarksId = #{remarksId}
+          and fileType = 2
+    </select>
+
+</mapper>

+ 56 - 25
src/main/resources/mapper/user/CustomerServiceDao.xml

@@ -4,8 +4,9 @@
 
     <select id="getCustomerShopList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmShopStatistics">
         SELECT
-            DISTINCT css.shopID AS shopId,
-                     s.name,
+            DISTINCT css.id as id,
+                     css.shopID AS shopId,
+                     s.name as shopName,
                      s.linkMan,
                      s.contractMobile AS mobile,
                      s.status AS shopStatus,
@@ -15,14 +16,14 @@
                  LEFT JOIN shop s ON css.shopId = s.shopId
         <where>
             css.delFlag = 0
-            <if test="name != null and name != ''">
-                and s.name like concat('%',#{name},'%')
+            <if test="shopName != null and shopName != ''">
+                and s.name like concat('%',#{shopName},'%')
             </if>
             <if test="status != null">
                 and css.status = #{status}
             </if>
         </where>
-        order by css.addTime, s.addTime desc
+        order by css.addTime desc, s.addTime desc
     </select>
 
     <select id="getCustomerShopId" resultType="java.lang.Integer">
@@ -31,7 +32,7 @@
 
     <select id="getShopList" resultType="com.caimei365.manager.entity.caimei.CmShop">
         select * from shop
-        where status = 90
+        where status = 90 and shopType = 1
         <if test="shopName != null and shopName != ''">
             and name like concat('%',#{shopName},'%')
         </if>
@@ -54,7 +55,6 @@
     <select id="getCmInformationList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmRoosInformation">
         SELECT id,
                IP,
-               userID,
                shopId,
                followUpStatus,
                consultName,
@@ -105,14 +105,14 @@
                 and i.title like concat('%',#{title},'%')
             </if>
             <if test="status != null">
-                csi.status = #{status}
+                and csi.status = #{status}
             </if>
         </where>
-        order by csi.addTime, i.pubdate desc
+        order by csi.addTime desc, i.pubdate desc
     </select>
 
     <select id="getShopInfoId" resultType="java.lang.Integer">
-        select id from cm_shop_info where delFlag = 0
+        select infoId from cm_shop_info where delFlag = 0
     </select>
 
     <select id="getInfoList" resultType="com.caimei365.manager.entity.caimei.cmUser.Info">
@@ -140,7 +140,7 @@
 
     <update id="delShopInfo">
         update cm_shop_info
-        set delFlag = 0
+        set delFlag = 1
         where id = #{id}
     </update>
 
@@ -149,7 +149,7 @@
             csk.id,
             csk.shopId,
             cusf.keyword,
-            (SELECT COUNT(recordID) FROM cm_behavior_record WHERE pageType = 8 AND pageLabel = cusf.keyword) as number,
+            cusf.frequency as number,
             cusf.searchTime,
             csk.status,
             csk.addTime
@@ -165,11 +165,11 @@
                 csk.status = #{status}
             </if>
         </where>
-        order by csk.addTime, (SELECT COUNT(recordID) FROM cm_behavior_record WHERE pageType = 8 AND pageLabel = cusf.keyword) desc
+        order by csk.addTime desc, (SELECT COUNT(recordID) FROM cm_behavior_record WHERE pageType = 8 AND pageLabel = cusf.keyword) desc
     </select>
 
     <select id="getShopKeywordId" resultType="java.lang.Integer">
-        select id from cm_shop_keyword where delFlag = 0
+        select searchId from cm_shop_keyword where delFlag = 0
     </select>
 
     <select id="getSearchFrequencyList" resultType="com.caimei365.manager.entity.caimei.cmUser.CmUserSearchFrequency">
@@ -194,7 +194,7 @@
 
     <update id="delShopKeyword">
         update cm_shop_keyword
-        set delFlag = 0
+        set delFlag = 1
         where id = #{id}
     </update>
 
@@ -238,12 +238,12 @@
             from cm_shop_advertisingImage csa
             left join shop s on s.shopId = csa.shopId
             <where>
-                csa.shopId = #{shopId}
+                csa.delFlag = 0
                 <if test="shopName != null and shopName != ''">
                     and s.name like concat('%',#{shopName},'%')
                 </if>
                 <if test="status != null">
-                    csa.status = #{status}
+                    and csa.status = #{status}
                 </if>
             </where>
             order by csa.sort asc, csa.addTime desc
@@ -262,7 +262,8 @@
 
     <update id="updateShopAdvertisingImage">
         update cm_shop_advertisingImage
-        set pcImage = #{pcImage},
+        set shopId  = #{shopId},
+            pcImage = #{pcImage},
             appImage = #{appImage},
             jumpLink = #{jumpLink},
             status = #{status}
@@ -283,7 +284,7 @@
 
     <update id="delShopAdvertisingImage">
         update cm_shop_advertisingImage
-        set delFlag = 0
+        set delFlag = 1
         where id = #{id}
     </update>
 
@@ -295,10 +296,19 @@
             cps.shopLink,
             cps.accessNumber,
             cps.accessDuration,
-            (cps.accessDuration / cps.accessNumber) AS averageDuration
+            ifnull((cps.accessDuration / cps.accessNumber), 0) AS averageDuration
         FROM cm_page_shop cps
                  LEFT JOIN shop s ON s.shopId = cps.shopId
-        WHERE cps.shopId = #{shopId}
+        <where>
+            cps.shopId = #{shopId}
+            <if test="startTime != null and startTime != ''">
+                and cps.accessDate <![CDATA[ > ]]> #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                and cps.accessDate <![CDATA[ < ]]> #{endTime}
+            </if>
+        </where>
+        group by cps.shopId
     </select>
 
     <select id="getPageShopProduct" resultType="com.caimei365.manager.entity.caimei.cmUser.CmPageShopProduct">
@@ -306,17 +316,24 @@
             cpsp.id,
             cpsp.shopId,
             cpsp.productId,
-            p.name,
+            p.name as productName,
             p.mainImage,
             copi.validFlag,
             cpsp.link,
             cpsp.accessNumber,
             cpsp.accessDuration,
-            (cpsp.accessDuration / cpsp.accessNumber) AS averageDuration
+            ifnull((cpsp.accessDuration / cpsp.accessNumber), 0) AS averageDuration
         FROM cm_page_shop_product cpsp
                  LEFT JOIN product p ON p.productId = cpsp.productId
                  LEFT JOIN cm_organize_product_info copi ON copi.productId = cpsp.productId
         WHERE cpsp.shopId = #{shopId} and copi.organizeId = 0
+        <if test="startTime != null and startTime != ''">
+            and cpsp.accessDate <![CDATA[ > ]]> #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and cpsp.accessDate <![CDATA[ < ]]> #{endTime}
+        </if>
+        group by cpsp.shopId
     </select>
 
     <select id="getPageShopInfo" resultType="com.caimei365.manager.entity.caimei.cmUser.CmPageShopInfo">
@@ -330,10 +347,17 @@
             cpsi.link,
             cpsi.accessNumber,
             cpsi.accessDuration,
-            (cpsi.accessDuration / cpsi.accessNumber) AS averageDuration
+            ifnull((cpsi.accessDuration / cpsi.accessNumber), 0) AS averageDuration
         FROM cm_page_shop_info cpsi
         LEFT JOIN info i ON i.id = cpsi.infoId
         WHERE cpsi.shopId = #{shopId}
+        <if test="startTime != null and startTime != ''">
+            and cpsi.accessDate <![CDATA[ > ]]> #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and cpsi.accessDate <![CDATA[ < ]]> #{endTime}
+        </if>
+        group by cpsi.shopId
     </select>
 
     <select id="getPageShopKeyword" resultType="com.caimei365.manager.entity.caimei.cmUser.CmPageShopKeyword">
@@ -344,9 +368,16 @@
             cpsk.link,
             cpsk.accessNumber,
             cpsk.accessDuration,
-            (cpsk.accessDuration / cpsk.accessNumber) AS averageDuration
+            ifnull((cpsk.accessDuration / cpsk.accessNumber), 0) AS averageDuration
         FROM cm_page_shop_keyword cpsk
         LEFT JOIN cm_user_search_frequency cusf ON cusf.id = cpsk.searchId
         WHERE cpsk.shopId = #{shopId}
+        <if test="startTime != null and startTime != ''">
+            and cpsk.accessDate <![CDATA[ > ]]> #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and cpsk.accessDate <![CDATA[ < ]]> #{endTime}
+        </if>
+        group by cpsk.shopId
     </select>
 </mapper>