فهرست منبع

Merge remote-tracking branch 'origin/xiaoman'

# Conflicts:
#	hx-customer/src/main/java/com/fjhx/customer/initializers/XiaomanInitializers.java
#	hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanApiServiceImpl.java
yzc 1 سال پیش
والد
کامیت
7c8b234ea5
15فایلهای تغییر یافته به همراه485 افزوده شده و 159 حذف شده
  1. 3 3
      hx-customer/src/main/java/com/fjhx/customer/contants/XiaomanContant.java
  2. 62 0
      hx-customer/src/main/java/com/fjhx/customer/controller/xiaoman/XiaomanConfigController.java
  3. 15 0
      hx-customer/src/main/java/com/fjhx/customer/entity/xiaoman/dto/XiaomanConfigDto.java
  4. 15 0
      hx-customer/src/main/java/com/fjhx/customer/entity/xiaoman/dto/XiaomanConfigSelectDto.java
  5. 17 0
      hx-customer/src/main/java/com/fjhx/customer/entity/xiaoman/vo/XiaomanConfigVo.java
  6. 2 2
      hx-customer/src/main/java/com/fjhx/customer/handle/HandleXiaomanData.java
  7. 29 3
      hx-customer/src/main/java/com/fjhx/customer/initializers/XiaomanInitializers.java
  8. 16 0
      hx-customer/src/main/java/com/fjhx/customer/mapper/xiaoman/XiaomanConfigMapper.java
  9. 1 1
      hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/XiaomanApiService.java
  10. 13 0
      hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/XiaomanConfigService.java
  11. 1 1
      hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/XiaomanCustomerService.java
  12. 75 61
      hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanApiServiceImpl.java
  13. 38 1
      hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanConfigServiceImpl.java
  14. 156 87
      hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanCustomerServiceImpl.java
  15. 42 0
      hx-customer/src/main/resources/mapper/xiaoman/XiaomanConfigMapper.xml

+ 3 - 3
hx-customer/src/main/java/com/fjhx/customer/contants/XiaomanContant.java

@@ -19,9 +19,9 @@ public class XiaomanContant {
     /**任务进度说明redis key**/
     public static final String TASK_STATUS_DESC_KEY = "all_customer:task_status_desc_key";
 
-    /**延迟删除key的时间(秒)-> 5个小时 (一般给跑到一半项目被强行关掉后做最后的处理用)**/
-//    public static final int DELAY_DELETE_KEY_TIME = 18000;
-    public static final int DELAY_DELETE_KEY_TIME = 300;
+    /**延迟删除key的时间(秒)-> 8个小时 (一般给跑到一半项目被强行关掉后做最后的处理用)**/
+    public static final int DELAY_DELETE_KEY_TIME = 28800;
+//    public static final int DELAY_DELETE_KEY_TIME = 300;
 
 
     public static final int PAGE_SIZE = 500;

+ 62 - 0
hx-customer/src/main/java/com/fjhx/customer/controller/xiaoman/XiaomanConfigController.java

@@ -0,0 +1,62 @@
+package com.fjhx.customer.controller.xiaoman;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanConfigDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanConfigSelectDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanCustomerDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanCustomerSelectDto;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanConfigVo;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanCustomerVo;
+import com.fjhx.customer.service.xiaoman.XiaomanConfigService;
+import com.fjhx.customer.service.xiaoman.XiaomanCustomerService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 小满配置表 前端控制器
+ * </p>
+ *
+ */
+@RestController
+@RequestMapping("/xiaomanConfig")
+public class XiaomanConfigController {
+
+
+    @Autowired
+    private XiaomanConfigService xiaomanConfigService;
+
+    /**
+     * 小满客户表分页
+     */
+    @PostMapping("/page")
+    public Page<XiaomanConfigVo> page(@RequestBody XiaomanConfigSelectDto dto) {
+        return xiaomanConfigService.getPage(dto);
+    }
+
+    /**
+     * 小满客户表明细
+     */
+    @PostMapping("/detail")
+    public XiaomanConfigVo detail(@RequestBody BaseSelectDto dto) {
+        return xiaomanConfigService.detail(dto.getId());
+    }
+
+
+    /**
+     * 小满客户表编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody XiaomanConfigDto xiaomanConfigDto) {
+        xiaomanConfigService.edit(xiaomanConfigDto);
+    }
+
+
+}

+ 15 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/xiaoman/dto/XiaomanConfigDto.java

@@ -0,0 +1,15 @@
+package com.fjhx.customer.entity.xiaoman.dto;
+
+import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 小满配置表表新增编辑入参实体
+ *
+ */
+@Getter
+@Setter
+public class XiaomanConfigDto extends XiaomanConfig {
+
+}

+ 15 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/xiaoman/dto/XiaomanConfigSelectDto.java

@@ -0,0 +1,15 @@
+package com.fjhx.customer.entity.xiaoman.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 小满配置表列表查询入参实体
+ *
+ */
+@Getter
+@Setter
+public class XiaomanConfigSelectDto extends BaseSelectDto {
+
+}

+ 17 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/xiaoman/vo/XiaomanConfigVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.customer.entity.xiaoman.vo;
+
+import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 小满配置表列表查询返回值实体
+ *
+ * @author lqh
+ * @since 2024-04-06
+ */
+@Getter
+@Setter
+public class XiaomanConfigVo extends XiaomanConfig {
+
+}

+ 2 - 2
hx-customer/src/main/java/com/fjhx/customer/handle/HandleXiaomanData.java

@@ -70,13 +70,13 @@ public class HandleXiaomanData {
      * @param allCustomer
      * @return
      */
-    public static CustomerListApiVo handleAllCustomer(String res,Set<Long> allCustomer){
+    public static CustomerListApiVo handleAllCustomer(String res,Set<Long> allCustomer,boolean flag){
         //反序列化对象
         CustomerListApiVo customerListApiVo = handleDate(res, new TypeReference<R<CustomerListApiVo>>() { });
         //判断列表是否为空
         if (!customerListApiVo.getList().isEmpty()){
             //保存或修改
-            xiaomanCustomerService.handleSaveOrUpdate(customerListApiVo.getList(),allCustomer);
+            xiaomanCustomerService.handleSaveOrUpdate(customerListApiVo.getList(),allCustomer,flag);
         }
         return customerListApiVo;
     }

+ 29 - 3
hx-customer/src/main/java/com/fjhx/customer/initializers/XiaomanInitializers.java

@@ -2,17 +2,26 @@ package com.fjhx.customer.initializers;
 
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.HashUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
 import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanUpdateInfoVO;
+import com.fjhx.customer.handle.HandleXiaomanData;
+import com.fjhx.customer.service.xiaoman.XiaomanApiService;
 import com.fjhx.customer.service.xiaoman.XiaomanConfigService;
+import com.ruoyi.common.utils.sign.Md5Utils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
 
 @Component
 @Slf4j
@@ -25,11 +34,16 @@ public class XiaomanInitializers {
 
     @PostConstruct
     public void dataInitializer() {
-
         // 初始化数据的代码
         log.info("XiaomanInitializers dataInitializer");
         //刷新token
         refreshToken();
+        //获取全量数据
+        try {
+//            xiaomanApiService.initAllList();
+        } catch (Exception e) {
+            log.error("获取小满全量数据异常", e);
+        }
 //        //获取全量数据
 //        try {
 //            xiaomanApiService.initAllList();
@@ -39,7 +53,7 @@ public class XiaomanInitializers {
     }
 
 
-    @Scheduled(cron = "0 0/30 * * * ? ")
+    @Scheduled(cron = "0 0 0/8 * * ? ")
     void refreshToken(){
         //如果过期时间是空的,就获取新的token
         XiaomanConfig config = xiaomanConfigService.getConfig();
@@ -48,7 +62,7 @@ public class XiaomanInitializers {
         if(ObjectUtil.isNull(expireTime) || StrUtil.isBlank(config.getRefreshToken())) {
             xiaomanConfigService.getToken(config);
         } else {
-            //如果过期时间减去当前时间小于110分钟,则要刷新token
+            //如果过期时间减去当前时间小于等于70分钟,则要刷新token
             long between = DateUtil.between(DateUtil.date(), expireTime, DateUnit.MINUTE, false);
             if(between <= 70){
                 xiaomanConfigService.refreshToken(config);
@@ -57,6 +71,18 @@ public class XiaomanInitializers {
     }
 
 
+    @Scheduled(cron = "0 0 0 * * ? ")
+    void updateList(){
+        xiaomanApiService.updateList(8);
+    }
 
 
+    public static void main(String[] args) {
+
+        String styleBS63046 = DigestUtil.sha256Hex("StyleBS63046");
+        boolean equals = "07f204c3ae6af316afebb72972056fc2d4f2cac1d8290975c48f80bf5a8519b2".equals(styleBS63046);
+        System.out.println(styleBS63046);
+        System.out.println(equals);
+    }
+
 }

+ 16 - 0
hx-customer/src/main/java/com/fjhx/customer/mapper/xiaoman/XiaomanConfigMapper.java

@@ -1,7 +1,15 @@
 package com.fjhx.customer.mapper.xiaoman;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
+import com.fjhx.customer.entity.xiaoman.po.XiaomanCustomer;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanConfigVo;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanCustomerVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 /**
@@ -11,5 +19,13 @@ import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
  *
  */
 public interface XiaomanConfigMapper extends BaseMapper<XiaomanConfig> {
+    /**
+     * 小满配置表列表
+     */
+    List<XiaomanConfigVo> getList(@Param("ew") IWrapper<XiaomanConfig> wrapper);
 
+    /**
+     * 小满配置表分页
+     */
+    Page<XiaomanConfigVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<XiaomanConfig> wrapper);
 }

+ 1 - 1
hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/XiaomanApiService.java

@@ -18,7 +18,7 @@ public interface XiaomanApiService {
     String getCustomerDetail(Long companyId);
 
 
-    void updateList();
+    void updateList(int hours);
 
     void getSelectorData();
 

+ 13 - 0
hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/XiaomanConfigService.java

@@ -1,6 +1,13 @@
 package com.fjhx.customer.service.xiaoman;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanConfigDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanConfigSelectDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanCustomerDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanCustomerSelectDto;
 import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanConfigVo;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanCustomerVo;
 import com.ruoyi.common.core.service.BaseService;
 
 
@@ -17,4 +24,10 @@ public interface XiaomanConfigService extends BaseService<XiaomanConfig> {
     void refreshToken(XiaomanConfig config);
 
     XiaomanConfig getConfig();
+
+    Page<XiaomanConfigVo> getPage(XiaomanConfigSelectDto dto);
+
+    XiaomanConfigVo detail(Long id);
+
+    void edit(XiaomanConfigDto xiaomanConfigDto);
 }

+ 1 - 1
hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/XiaomanCustomerService.java

@@ -51,7 +51,7 @@ public interface XiaomanCustomerService  {
      */
     void delete(Long id);
 
-    void handleSaveOrUpdate(List<CustomerApiVo> customerApiVoList, Set<Long> allCustomer);
+    void handleSaveOrUpdate(List<CustomerApiVo> customerApiVoList, Set<Long> allCustomer,boolean flag);
 
     void initAllList();
     void updateList();

+ 75 - 61
hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanApiServiceImpl.java

@@ -52,28 +52,14 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
     @Resource
     DictTenantDataService dictTenantDataService;
 
-    private static final Map<String, String> SELECTOR_KEY = new HashMap() {{
-        put("trail_status", "customer_status");
-        put("origin", "customer_source");
-    }};
-
-    public static void updateInfoData(String token, String body) {
-        String res = HttpUtil.createPost(XiaomanContant.UPDATE_INFO_API_URL).header("Authorization", "Bearer " + token).body(body).execute().body();
-        JSONObject jsonObject = JSONObject.parseObject(res);
-        String error = jsonObject.getString("error");
-        if (StrUtil.isNotBlank(error)) {
-            throw new RuntimeException("获取小满数据异常:" + error);
-        }
-    }
-
-    //    @DSTransactional
+//    @DSTransactional
     @Override
     @Async
     public void initAllList() {
         boolean result = setNxWithExpiration(XiaomanContant.TASK_STATUS_KEY, XiaomanContant.TASK_STATUS_VALUE, XiaomanContant.DELAY_DELETE_KEY_TIME);
         if (!result) {
             String mes = stringRedisTemplate.opsForValue().get(XiaomanContant.TASK_STATUS_DESC_KEY);
-            throw new RuntimeException(StrUtil.isBlank(mes) ? "全量更新正在进行中" : mes);
+            throw new RuntimeException(StrUtil.isBlank(mes)? "全量更新正在进行中" : mes);
         }
         stringRedisTemplate.opsForValue().set(XiaomanContant.TASK_STATUS_DESC_KEY, "全量更新正在进行中");
         try {
@@ -87,7 +73,7 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
             int totalPage;
             do {
                 String str = getData(XiaomanContant.ALL_CUSTOMER_API_URL, token, initPageParams(pageIndex));
-                CustomerListApiVo customerListApiVo = HandleXiaomanData.handleAllCustomer(str, collect);
+                CustomerListApiVo customerListApiVo = HandleXiaomanData.handleAllCustomer(str, collect,true);
                 int totalItem = customerListApiVo.getTotalItem();
                 totalPage = (totalItem / XiaomanContant.PAGE_SIZE) + (totalItem % XiaomanContant.PAGE_SIZE > 0 ? 1 : 0);
                 pageIndex++;
@@ -104,13 +90,12 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
 
     /**
      * 设置key-value并设置过期时间
-     *
+     * @author hj
+     * @date 2024/4/6 21:14
      * @param key
      * @param value
      * @param seconds
      * @return boolean
-     * @author hj
-     * @date 2024/4/6 21:14
      */
     @Override
     public boolean setNxWithExpiration(String key, String value, long seconds) {
@@ -123,15 +108,15 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
         return false;
     }
 
+
     /**
      * 获取客户详情
-     *
-     * @param companyId
      * @author hj
      * @date 2024/4/6 21:38
+     * @param companyId
      */
     @Override
-    public String getCustomerDetail(Long companyId) {
+    public String getCustomerDetail(Long companyId){
         XiaomanConfig config = xiaomanConfigService.getConfig();
         String token = config.getAccessToken();
         Map<String, Object> params = new HashMap<>();
@@ -140,15 +125,15 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
         return getData(XiaomanContant.CUSTOMER_DETAIL_API_URL, token, params);
     }
 
+
     /**
      * 客户更新列表
-     *
      * @author hj
      * @date 2024/4/6 21:54
      */
     @Override
     @Async
-    public void updateList() {
+    public void updateList(){
         try {
             //先更新一下数据字典
             getSelectorData();
@@ -162,10 +147,10 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
             do {
                 Map<String, Object> params = initPageParams(pageIndex);
                 String nowStr = DateUtil.offsetHour(DateUtil.date(), 1).toString("yyyy-MM-dd HH:00:00");
-                params.put("start_time", DateUtil.parse(nowStr).offset(DateField.HOUR, -8).toString("yyyy-MM-dd HH:00:00"));
+                params.put("start_time", DateUtil.parse(nowStr).offset(DateField.HOUR, -hours).toString("yyyy-MM-dd HH:00:00"));
                 params.put("end_time", nowStr);
                 String str = getData(XiaomanContant.GET_UPDATE_CUSTOMER_API_URL, token, params);
-                CustomerListApiVo customerListApiVo = HandleXiaomanData.handleAllCustomer(str, collect);
+                CustomerListApiVo customerListApiVo = HandleXiaomanData.handleAllCustomer(str, collect,false);
                 int totalItem = customerListApiVo.getTotalItem();
                 totalPage = (totalItem / XiaomanContant.PAGE_SIZE) + (totalItem % XiaomanContant.PAGE_SIZE > 0 ? 1 : 0);
                 pageIndex++;
@@ -176,27 +161,14 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
     }
 
 
-    private static Map<String, Object> initPageParams(int page) {
-        Map<String, Object> params = new HashMap<>();
-        params.put("start_index", page);
-        params.put("count", XiaomanContant.PAGE_SIZE);
-        return params;
-    }
-
+    private static final Map<String, String> SELECTOR_KEY = new HashMap(){{
+        put("trail_status", "customer_status");
+        put("origin", "customer_source");
+    }};
 
-    private static String getData(String url, String token, Map<String, Object> params) {
-        String res = HttpUtil.createGet(url).header("Authorization", "Bearer " + token).form(params).execute().body();
-        JSONObject jsonObject = JSONObject.parseObject(res);
-        String error = jsonObject.getString("error");
-        if (StrUtil.isNotBlank(error)) {
-            throw new RuntimeException("获取小满数据异常:" + error);
-        }
-        return res;
-    }
 
     /**
      * 获取下拉框字典数据
-     *
      * @author hj
      * @date 2024/4/7 10:51
      */
@@ -215,11 +187,11 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
             DictTenantDataSelectDto dictTenantDataSelectDto = new DictTenantDataSelectDto();
             dictTenantDataSelectDto.setDictCode(v);
             List<DictTenantDataVo> dictTenantDataServiceList = dictTenantDataService.getList(dictTenantDataSelectDto);
-            Map<String, DictTenantData> collect = dictTenantDataServiceList.stream().collect(Collectors.toMap(DictTenantDataVo::getDictValue, o -> BeanUtil.copyProperties(o, DictTenantData.class)));
+            Map<String, DictTenantData> collect = dictTenantDataServiceList.stream().collect(Collectors.toMap(DictTenantDataVo::getDictValue, o-> BeanUtil.copyProperties(o, DictTenantData.class)));
             JSONArray data = jsonObject.getJSONArray("data");
-            if ("trail_status".equals(k)) {
+            if("trail_status".equals(k)){
                 dealCustomerStatusDict(data, collect);
-            } else if ("origin".equals(k)) {
+            } else if("origin".equals(k)){
                 dealCustomerSourceDict(data, collect);
             }
             log.info("获取小满下拉框字典数据:{}", jsonObject);
@@ -228,24 +200,49 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
         DynamicDataSourceContextHolder.poll();
     }
 
+
+
+
+
+
+
+    private static Map<String, Object> initPageParams(int page) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("start_index", page);
+        params.put("count", XiaomanContant.PAGE_SIZE);
+        return params;
+    }
+
+
+    private static String getData(String url, String token, Map<String, Object> params) {
+        String res = HttpUtil.createGet(url).header("Authorization", "Bearer " + token).form(params).execute().body();
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        String error = jsonObject.getString("error");
+        if (StrUtil.isNotBlank(error)) {
+            throw new RuntimeException("获取小满数据异常:" + error);
+        }
+        return res;
+    }
+
+
     @Override
-    public void updateXiaomanData(XiaomanUpdateInfoVO xiaomanUpdateInfoVO) {
-        if (ObjectUtil.isNull(xiaomanUpdateInfoVO)) {
+    public void updateXiaomanData(XiaomanUpdateInfoVO xiaomanUpdateInfoVO){
+        if (ObjectUtil.isNull(xiaomanUpdateInfoVO)){
             throw new RuntimeException("数据为空");
         }
-        if (StrUtil.isBlank(xiaomanUpdateInfoVO.getName())) {
+        if (StrUtil.isBlank(xiaomanUpdateInfoVO.getName())){
             throw new RuntimeException("客户名称为空");
         }
         xiaomanUpdateInfoVO.setPoolId(0);
         List<XiaomanUpdateInfoVO.Customer> customers = xiaomanUpdateInfoVO.getCustomers();
-        if (CollectionUtil.isEmpty(customers)) {
+        if (CollectionUtil.isEmpty(customers)){
             throw new RuntimeException("客户联系人为空");
         }
         for (XiaomanUpdateInfoVO.Customer customer : customers) {
-            if (StrUtil.isBlank(customer.getName())) {
+            if (StrUtil.isBlank(customer.getName())){
                 throw new RuntimeException("客户联系人名称存在为空");
             }
-            if (StrUtil.isBlank(customer.getEmail())) {
+            if (StrUtil.isBlank(customer.getEmail())){
                 throw new RuntimeException("客户联系人email存在为空");
             }
             customer.setMainCustomerFlag("0");
@@ -259,6 +256,22 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
         updateInfoData(token, body);
     }
 
+
+
+
+
+    public static void updateInfoData(String token, String body){
+        String res = HttpUtil.createPost(XiaomanContant.UPDATE_INFO_API_URL).header("Authorization", "Bearer " + token).body(body).execute().body();
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        String error = jsonObject.getString("error");
+        if (StrUtil.isNotBlank(error)) {
+            throw new RuntimeException("获取小满数据异常:" + error);
+        }
+    }
+
+
+
+
     private void dealCustomerSourceDict(JSONArray data, Map<String, DictTenantData> collect) {
         List<DictTenantData> list = new ArrayList<>();
         for (int i = 0; i < data.size(); i++) {
@@ -266,7 +279,7 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
             String label = jsonObject.getString("origin_name");
             String key = jsonObject.getString("origin_id");
             boolean result = collect.containsKey(label);
-            if (!result) {
+            if(!result){
                 DictTenantData dictTenantData = new DictTenantData();
                 dictTenantData.setDictCode("customer_source");
                 dictTenantData.setDictValue(label);
@@ -274,13 +287,13 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
                 dictTenantData.setTenantId(XiaomanContant.TENANT_ID);
                 dictTenantData.setSort(100);
                 list.add(dictTenantData);
-            } else {
+            }else {
                 DictTenantData dictTenantData = collect.get(label);
                 dictTenantData.setDictKey(key);
                 dictTenantDataService.updateById(dictTenantData);
             }
         }
-        if (!list.isEmpty()) {
+        if (!list.isEmpty()){
             dictTenantDataService.saveBatch(list);
         }
     }
@@ -292,7 +305,7 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
             String label = jsonObject.getString("status_name");
             String key = jsonObject.getString("status_id");
             boolean result = collect.containsKey(label);
-            if (!result) {
+            if(!result){
                 DictTenantData dictTenantData = new DictTenantData();
                 dictTenantData.setDictCode("customer_status");
                 dictTenantData.setDictValue(label);
@@ -300,20 +313,20 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
                 dictTenantData.setTenantId(XiaomanContant.TENANT_ID);
                 dictTenantData.setSort(100);
                 list.add(dictTenantData);
-            } else {
+            }else {
                 DictTenantData dictTenantData = collect.get(label);
                 dictTenantData.setDictKey(key);
                 dictTenantDataService.updateById(dictTenantData);
             }
         }
-        if (!list.isEmpty()) {
+        if (!list.isEmpty()){
             dictTenantDataService.saveBatch(list);
         }
     }
 
     @Override
-    public void dealCustomerTagDict(String label, String key) {
-
+    public void dealCustomerTagDict(String label,String key) {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
         DictTenantData dictTenantData = new DictTenantData();
         dictTenantData.setDictCode("customer_tag");
         dictTenantData.setDictValue(label);
@@ -321,6 +334,7 @@ public class XiaomanApiServiceImpl implements XiaomanApiService {
         dictTenantData.setTenantId(XiaomanContant.TENANT_ID);
         dictTenantData.setSort(100);
         dictTenantDataService.save(dictTenantData);
+        DynamicDataSourceContextHolder.poll();
 
     }
 

+ 38 - 1
hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/XiaomanConfigServiceImpl.java → hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanConfigServiceImpl.java

@@ -1,18 +1,28 @@
-package com.fjhx.customer.service.customer.impl;
+package com.fjhx.customer.service.xiaoman.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.http.Header;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanConfigDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanConfigSelectDto;
+import com.fjhx.customer.entity.xiaoman.dto.XiaomanCustomerDto;
 import com.fjhx.customer.entity.xiaoman.po.XiaomanConfig;
+import com.fjhx.customer.entity.xiaoman.po.XiaomanCustomer;
 import com.fjhx.customer.entity.xiaoman.vo.XiaoManTokenVO;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanConfigVo;
+import com.fjhx.customer.entity.xiaoman.vo.XiaomanCustomerVo;
 import com.fjhx.customer.mapper.xiaoman.XiaomanConfigMapper;
 import com.fjhx.customer.service.xiaoman.XiaomanConfigService;
+import com.ruoyi.common.utils.wrapper.IWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -21,6 +31,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static com.ruoyi.common.utils.wrapper.IWrapper.getWrapper;
+
 /**
  * <p>
  * 小满配置表 服务实现类
@@ -83,6 +95,7 @@ public class XiaomanConfigServiceImpl extends ServiceImpl<XiaomanConfigMapper, X
     }
 
     public static XiaoManTokenVO getToken(XiaomanConfig config, String body, String url){
+        log.info("请求用户名{},请求密码:{}", config.getUsername(), config.getPassword());
         String s = HttpUtil.buildBasicAuth(config.getUsername(), config.getPassword(), Charset.forName("UTF-8"));
         Map<String, String> headers = new HashMap<>();
         headers.put(Header.AUTHORIZATION.getValue(), s);
@@ -111,4 +124,28 @@ public class XiaomanConfigServiceImpl extends ServiceImpl<XiaomanConfigMapper, X
         }
         return list.get(0);
     }
+
+
+    @Override
+    public Page<XiaomanConfigVo> getPage(XiaomanConfigSelectDto dto) {
+        IWrapper<XiaomanConfig> wrapper = getWrapper();
+        wrapper.orderByDesc("xc", XiaomanConfig::getId);
+        Page<XiaomanConfigVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public XiaomanConfigVo detail(Long id) {
+        XiaomanConfig byId = this.getById(id);
+        return BeanUtil.copyProperties(byId, XiaomanConfigVo.class);
+    }
+
+    @Override
+    public void edit(XiaomanConfigDto xiaomanConfigDto) {
+        this.lambdaUpdate().set(XiaomanConfig::getUsername, xiaomanConfigDto.getUsername())
+                .set(XiaomanConfig::getPassword, StrUtil.isNotBlank(xiaomanConfigDto.getPassword())? DigestUtil.sha256Hex(xiaomanConfigDto.getPassword()) : DigestUtil.sha256Hex("#"))
+                .eq(XiaomanConfig::getId, xiaomanConfigDto.getId())
+                .update();
+        this.getToken(this.getConfig());
+    }
 }

+ 156 - 87
hx-customer/src/main/java/com/fjhx/customer/service/xiaoman/impl/XiaomanCustomerServiceImpl.java

@@ -85,6 +85,15 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
     @Override
     public Page<XiaomanCustomerVo> getPage(XiaomanCustomerSelectDto dto) {
         IWrapper<XiaomanCustomer> wrapper = getWrapper();
+
+        if(ObjectUtil.isNotEmpty(dto.getKeyword())){
+            wrapper.and(q->q.like("xc",XiaomanCustomer::getCompanyId,dto.getKeyword()))
+                    .or().like("xc",XiaomanCustomer::getCustomerId,dto.getKeyword())
+                    .or().like("xc",XiaomanCustomer::getName,dto.getKeyword())
+                    .or().like("xc",XiaomanCustomer::getShortName,dto.getKeyword())
+            ;
+        }
+
         wrapper.orderByDesc("xc", XiaomanCustomer::getCompanyId);
         Page<XiaomanCustomerVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         return page;
@@ -113,7 +122,7 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
     }
 
     @Override
-    public void handleSaveOrUpdate(List<CustomerApiVo> customerApiVoList, Set<Long> allCustomer) {
+    public void handleSaveOrUpdate(List<CustomerApiVo> customerApiVoList, Set<Long> allCustomer,boolean flag) {
         List<XiaomanCustomer> xiaomanCustomerList = new ArrayList<>(customerApiVoList);
         for (XiaomanCustomer customer : xiaomanCustomerList){
             try {
@@ -126,7 +135,8 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
                     xiaomanCustomerInfoJsonService.updateById(xiaomanCustomerInfoJson);
                     CustomerInfoVo infoVo = HandleXiaomanData.handleDate(customerDetailJson, new TypeReference<R<CustomerInfoVo>>() {
                     });
-                    Long s = customerConversion(infoVo);
+                    //true 全量更新
+                    Long s = flag ? customerConversionAll(infoVo): customerConversionUpdate(infoVo);
                     customer.setCustomerId(s);
                     updateById(customer);
                 }else {
@@ -140,7 +150,8 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
                     CustomerInfoVo infoVo = HandleXiaomanData.handleDate(customerDetailJson, new TypeReference<R<CustomerInfoVo>>() {
                     });
                     //小满客户 =》 客户
-                    Long s = customerConversion(infoVo);
+                    //true 全量更新
+                    Long s = flag ? customerConversionAll(infoVo): customerConversionUpdate(infoVo);
                     customer.setCustomerId(s);
                     save(customer);
                     System.out.println("2");
@@ -149,15 +160,67 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
                e.printStackTrace();
             }
         }
+    }
+
+    /**
+     * 小满客户 =》 客户
+     * @param vo
+     */
+    public Long customerConversionAll(CustomerInfoVo vo) {
+        SecurityUtils.setTenantId(XiaomanContant.TENANT_ID);
+
+        Customer customer = new Customer();
+
+        customer.setId(vo.getCompanyId());
+
+        extracted(vo, customer);
+
+
+        //联系人
+        if (!vo.getCustomers().isEmpty()){
+            for (CustomerInfoVo.Customer cus  :vo.getCustomers()){
+                if (StringUtils.isNotEmpty(cus.getEmail())){
+                    CustomerUser customerUser = new CustomerUser();
+                    customerUser.setCustomerId(customer.getId());
+                    customerUser.setName(cus.getName());
+                    customerUser.setEmail(cus.getEmail());
+                    List<Map> maps = new ArrayList<>();
+                    if (! cus.getContact().isEmpty()){
+                        for (CustomerInfoVo.Contact contact : cus.getContact()) {
+                            Map map1 = new HashMap();
+                            map1.put("type", contact.getType());
+                            map1.put("contactNo", contact.getValue());
+                            maps.add(map1);
+                        }
+                    }else{
+                        Map map1 = new HashMap();
+                        map1.put("type", "");
+                        map1.put("contactNo", "");
+                        maps.add(map1);
+                    }
+                    customerUser.setPhone(cus.getTel());
+                    customerUser.setContactJson(JSON.toJSONString(maps));
+                    customerUserService.save(customerUser);
+                }
+
+            }
+
+
+        }
+        customer.setCountryName(vo.getCountryName());
+        customerService.save(customer);
 
 
+        return customer.getId();
     }
 
+
+
     /**
      * 小满客户 =》 客户
      * @param vo
      */
-    public Long customerConversion(CustomerInfoVo vo) {
+    public Long customerConversionUpdate(CustomerInfoVo vo) {
         SecurityUtils.setTenantId(XiaomanContant.TENANT_ID);
         List<Customer> list = customerService.lambdaQuery()
                 .eq(StringUtils.isNotEmpty(vo.getName()), Customer::getName, vo.getName())
@@ -173,84 +236,8 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
                 customer.setCompanyId(vo.getCompanyId());
                 //公司编号
                 customer.setCustomerCode(vo.getSerialId());
-                //业务员ID
-                if (!vo.getOwner().isEmpty()){
-                    DynamicDataSourceContextHolder.push(SourceConstant.BASE);
-                    SysUser sysUser = sysUserService.lambdaQuery().eq(SysUser::getNickNameEn, vo.getOwner().get(0).getName()).one();
-                    if (Objects.nonNull(sysUser)){
-                        customer.setUserId(sysUser.getUserId());
-                    }
-                    DynamicDataSourceContextHolder.poll();
-                }
-                //TODO 标签tag  customer_tag
-                if (!vo.getTag().isEmpty()){
-                    Set<String> tags = new HashSet<>();
-                    vo.getTag().forEach(x->{
-                        List<DictTenantDataVo> customerTag = DictUtils.getDictList("customer_tag");
-                        AtomicReference<String> key  = new AtomicReference<>("");
-                        customerTag.forEach(tag ->{
-                            if (tag.getDictValue().equals(x.getTagName())){
-                                key.set(tag.getDictKey());
-                            }
-                        });
-                        if (StringUtils.isNull(key)){
-                            xiaomanApiService.dealCustomerTagDict(x.getTagName(),x.getTagId());
-                            tags.add(x.getTagId());
-                        }else {
-                            tags.add(String.valueOf(key));
-                        }
-
-                    });
-                    customer.setTag(String.join(",",tags));
-                }
-
-                //客户名称
-                customer.setName(vo.getName());
-                //客户简称
-                customer.setShortName(vo.getShortName());
-
-                if (!vo.getOriginList().isEmpty()){
-                    List<DictTenantDataVo> customerSource = DictUtils.getDictList("customer_source");
-                    Set<String> sources = new HashSet<>();
-                    vo.getOriginList().forEach(x->{
-                        customerSource.forEach(tag ->{
-                            if (tag.getDictValue().equals(x)){
-                                sources.add(tag.getDictKey());
-                            }
-                        });
-                    });
-                    customer.setSource(String.join(",",sources));
-                }
-
-
-                //客户规模
-                customer.setScaleId(vo.getScaleId());
-
-                if (StringUtils.isNotEmpty(vo.getTrailStatus())){
-                    AtomicReference<String> status = new AtomicReference<>("");
-                    List<DictTenantDataVo> customerSource = DictUtils.getDictList("customer_status");
-                        customerSource.forEach(tag ->{
-                            if (tag.getDictValue().equals(vo.getTrailStatus())){
-                                status.set(tag.getDictKey());
-                            }
-                        });
-                    customer.setStatus(String.valueOf(status));
-                }
-
-
-
-                //公司网址
-                customer.setHomepage(vo.getHomepage());
-                //小满传真
-                customer.setFax(vo.getFax());
-                //小满电话区号
-                customer.setTelAreaCode(vo.getTelAreaCode());
-                //小满电话
-                customer.setTel(vo.getTel());
-                //小满备注
-                customer.setRemark(vo.getRemark());
-
 
+                extracted(vo, customer);
                 //联系人
                 if (!vo.getCustomers().isEmpty()){
                     Map<String, CustomerUser> collect = customerUserService.lambdaQuery()
@@ -310,17 +297,12 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
                                 collect.put(customerUser.getEmail(),customerUser);
                             }
                         }
-
                     }
-
-
                 }
                 customer.setCountryName(vo.getCountryName());
                 customerService.updateById(customer);
             }
-
         }
-
         SecurityUtils.clearTenantId();
         if (!list.isEmpty()) {
             Long collect = list.stream().map(Customer::getId).collect(Collectors.toList()).get(0);
@@ -331,12 +313,99 @@ public class XiaomanCustomerServiceImpl extends ServiceImpl<XiaomanCustomerMappe
 
     }
 
+    /**
+     * 公用方法
+     * @param vo
+     * @param customer
+     */
+    private void extracted(CustomerInfoVo vo, Customer customer) {
+        customer.setAddress(vo.getAddress());
+        //小满公司ID
+        customer.setCompanyId(vo.getCompanyId());
+        //公司编号
+        customer.setCustomerCode(vo.getSerialId());
+        //业务员ID
+        if (!vo.getOwner().isEmpty()){
+            DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+            SysUser sysUser = sysUserService.lambdaQuery().eq(SysUser::getNickNameEn, vo.getOwner().get(0).getName()).one();
+            if (Objects.nonNull(sysUser)){
+                customer.setUserId(sysUser.getUserId());
+            }
+            DynamicDataSourceContextHolder.poll();
+        }
+        //标签tag  customer_tag
+        if (!vo.getTag().isEmpty()){
+            Set<String> tags = new HashSet<>();
+            vo.getTag().forEach(x->{
+                List<DictTenantDataVo> customerTag = DictUtils.getDictList("customer_tag");
+                AtomicReference<String> key  = new AtomicReference<>("");
+                customerTag.forEach(tag ->{
+                    if (tag.getDictValue().equals(x.getTagName())){
+                        key.set(tag.getDictKey());
+                    }
+                });
+                if (StringUtils.isEmpty(key.toString())){
+                    xiaomanApiService.dealCustomerTagDict(x.getTagName(),x.getTagId());
+                    tags.add(x.getTagId());
+                }else {
+                    tags.add(String.valueOf(key));
+                }
+
+            });
+            customer.setTag(String.join(",",tags));
+        }
+
+        //客户名称
+        customer.setName(vo.getName());
+        //客户简称
+        customer.setShortName(vo.getShortName());
+        //客户来源
+        if (!vo.getOriginList().isEmpty()){
+            List<DictTenantDataVo> customerSource = DictUtils.getDictList("customer_source");
+            Set<String> sources = new HashSet<>();
+            vo.getOriginList().forEach(x->{
+                customerSource.forEach(tag ->{
+                    if (tag.getDictValue().equals(x)){
+                        sources.add(tag.getDictKey());
+                    }
+                });
+            });
+            customer.setSource(String.join(",",sources));
+        }
+
+
+        //客户规模
+        customer.setScaleId(vo.getScaleId());
+        //客户状态
+        if (StringUtils.isNotEmpty(vo.getTrailStatus())){
+            AtomicReference<String> status = new AtomicReference<>("");
+            List<DictTenantDataVo> customerSource = DictUtils.getDictList("customer_status");
+            customerSource.forEach(tag ->{
+                if (tag.getDictValue().equals(vo.getTrailStatus())){
+                    status.set(tag.getDictKey());
+                }
+            });
+            customer.setStatus(String.valueOf(status));
+        }
+
+        //公司网址
+        customer.setHomepage(vo.getHomepage());
+        //小满传真
+        customer.setFax(vo.getFax());
+        //小满电话区号
+        customer.setTelAreaCode(vo.getTelAreaCode());
+        //小满电话
+        customer.setTel(vo.getTel());
+        //小满备注
+        customer.setRemark(vo.getRemark());
+    }
+
     @Override
     public void initAllList() {
         xiaomanApiService.initAllList();
     }
     @Override
     public void updateList() {
-        xiaomanApiService.updateList();
+        xiaomanApiService.updateList(24);
     }
 }

+ 42 - 0
hx-customer/src/main/resources/mapper/xiaoman/XiaomanConfigMapper.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.customer.mapper.xiaoman.XiaomanConfigMapper">
+    <select id="getList" resultType="com.fjhx.customer.entity.xiaoman.vo.XiaomanConfigVo">
+        select
+            xc.id,
+            xc.client_id,
+            xc.client_secret,
+            xc.username,
+            xc.password,
+            xc.access_token,
+            xc.refresh_token,
+            xc.expire_time,
+            xc.last_token_time,
+            xc.scope,
+            xc.grant_type,
+            xc.token_url,
+            xc.refresh_token_url
+        from xiaoman_config xc
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getPage" resultType="com.fjhx.customer.entity.xiaoman.vo.XiaomanConfigVo">
+        select
+            xc.id,
+            xc.client_id,
+            xc.client_secret,
+            xc.username,
+            xc.password,
+            xc.access_token,
+            xc.refresh_token,
+            xc.expire_time,
+            xc.last_token_time,
+            xc.scope,
+            xc.grant_type,
+            xc.token_url,
+            xc.refresh_token_url
+        from xiaoman_config xc
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>