wjj 12 часов назад
Родитель
Сommit
d40d99e4b9

+ 81 - 62
fs-admin/src/main/java/com/fs/his/task/KdzlTask.java

@@ -28,75 +28,94 @@ public class KdzlTask {
 
     public void syncKdzlMember(){
         logger.info("开始同步会员信息...");
-        List<Custm> custms = kdzlService.exportCustomers();
-        logger.info("会员信息同步完成,数量:{}",custms.size());
-        if (CollectionUtils.isEmpty(custms)) {
-            return;
-        }
-        for (Custm custm : custms) {
-            try {
-                // 判断会员是否已存在
-                FsImportMember member = importMemberMapper.selectFsImportMemberByMemberId(custm.getCustmid());
-                if (member == null) {
-                    member = new FsImportMember();
-                    member.setKdzlMemberId(custm.getCustmid());
-                    member.setKdzlMemberJson(JSON.toJSONString(custm));
-                    member.setMemberName(custm.getName());
-                    member.setCreateTime(new Date());
-                    //手机号
-                    com.fs.kdzl.dto.Contact contact = custm.getContacts().get(0);
-                    if (contact != null) {
-                        member.setMemberPhone(contact.getMobiles().get(0));
-                    }
-                    member.setAddress(custm.getAddr());
-                    //现病史 现用药情况 过敏史
-                    if (CollectionUtils.isNotEmpty(custm.getProperties())) {
-                        for (Property property : custm.getProperties()) {
-                            switch (property.getProp_name()) {
-                                case "现病史":
-                                    member.setPresentIllness(property.getProp_value());
-                                    break;
-                                case "现用药情况":
-                                    member.setCurrentMedication(property.getProp_value());
-                                    break;
-                                case "过敏史":
-                                    member.setAllergyHistory(property.getProp_value());
-                                    break;
+        int totalCount = 0;
+        
+        while (true) {
+            List<Custm> custms = kdzlService.exportCustomers();
+            logger.info("本次获取会员信息数量:{}", custms.size());
+            
+            if (CollectionUtils.isEmpty(custms)) {
+                logger.info("未获取到会员数据,同步结束");
+                break;
+            }
+            
+            totalCount += custms.size();
+            logger.info("累计已同步会员数量:{}", totalCount);
+            
+            for (Custm custm : custms) {
+                try {
+                    FsImportMember member = importMemberMapper.selectFsImportMemberByMemberId(custm.getCustmid());
+                    if (member == null) {
+                        member = new FsImportMember();
+                        member.setKdzlMemberId(custm.getCustmid());
+                        member.setKdzlMemberJson(JSON.toJSONString(custm));
+                        member.setMemberName(custm.getName());
+                        member.setCreateTime(new Date());
+                        
+                        if (CollectionUtils.isNotEmpty(custm.getContacts())) {
+                            com.fs.kdzl.dto.Contact contact = custm.getContacts().get(0);
+                            if (contact != null && CollectionUtils.isNotEmpty(contact.getMobiles())) {
+                                member.setMemberPhone(contact.getMobiles().get(0));
                             }
                         }
-                    }
-                } else {
-                    //更新会员信息
-                    member.setKdzlMemberJson(JSON.toJSONString(custm));
-                    member.setUpdateTime(new Date());
-                    member.setStatus(0);
-                    //现病史 现用药情况 过敏史
-                    if (CollectionUtils.isNotEmpty(custm.getProperties())) {
-                        for (Property property : custm.getProperties()) {
-                            switch (property.getProp_name()) {
-                                case "现病史":
-                                    member.setPresentIllness(property.getProp_value());
-                                    break;
-                                case "现用药情况":
-                                    member.setCurrentMedication(property.getProp_value());
-                                    break;
-                                case "过敏史":
-                                    member.setAllergyHistory(property.getProp_value());
-                                    break;
+                        
+                        member.setAddress(custm.getAddr());
+                        
+                        if (CollectionUtils.isNotEmpty(custm.getProperties())) {
+                            for (Property property : custm.getProperties()) {
+                                switch (property.getProp_name()) {
+                                    case "现病史":
+                                        member.setPresentIllness(property.getProp_value());
+                                        break;
+                                    case "现用药情况":
+                                        member.setCurrentMedication(property.getProp_value());
+                                        break;
+                                    case "过敏史":
+                                        member.setAllergyHistory(property.getProp_value());
+                                        break;
+                                }
+                            }
+                        }
+                    } else {
+                        member.setKdzlMemberJson(JSON.toJSONString(custm));
+                        member.setUpdateTime(new Date());
+                        member.setStatus(0);
+                        
+                        if (CollectionUtils.isNotEmpty(custm.getProperties())) {
+                            for (Property property : custm.getProperties()) {
+                                switch (property.getProp_name()) {
+                                    case "现病史":
+                                        member.setPresentIllness(property.getProp_value());
+                                        break;
+                                    case "现用药情况":
+                                        member.setCurrentMedication(property.getProp_value());
+                                        break;
+                                    case "过敏史":
+                                        member.setAllergyHistory(property.getProp_value());
+                                        break;
+                                }
                             }
                         }
                     }
+                    
+                    if (member.getId() == null) {
+                        importMemberMapper.insertFsImportMember(member);
+                    } else {
+                        importMemberMapper.updateFsImportMember(member);
+                    }
+                } catch (Exception e) {
+                    log.error("同步会员信息失败,custmid: {}, 错误: {}", custm.getCustmid(), e.getMessage());
                 }
-                logger.info("会员信息:{}",member);
-                if (member.getId() == null) {
-                    importMemberMapper.insertFsImportMember(member);
-                } else {
-                    importMemberMapper.updateFsImportMember(member);
-                }
-            } catch (Exception e) {
-                log.error("同步会员信息失败:{}",e.getMessage());
             }
-
+            
+            if (custms.size() < 2000) {
+                logger.info("本次获取数据量小于2000,所有会员数据已同步完毕");
+                break;
+            }
+            
+            logger.info("本次获取数据量等于2000,继续获取下一页数据...");
         }
+        
+        logger.info("会员信息同步完成,总共同步数量:{}", totalCount);
     }
 }

+ 8 - 0
fs-service/src/main/java/com/fs/kdzl/service/KdzlService.java

@@ -19,4 +19,12 @@ public interface KdzlService {
      * @return 客户列表
      */
     List<Custm>  exportCustomers();
+
+    /**
+     * 导出会员
+     * @param start 第一次导出传0,后续迭代传上一次获取到的客户列表最后一个客户的custmid
+     * @param psid 公海id(可选)
+     * @return 会员列表
+     */
+    List<Custm> exportCustomersByPost(Integer start, Long psid);
 }

+ 75 - 7
fs-service/src/main/java/com/fs/kdzl/service/impl/KdzlServiceImpl.java

@@ -31,6 +31,7 @@ public class KdzlServiceImpl implements KdzlService {
     private static final int TOKEN_EXPIRE_SECONDS = 7200;
     private static final int CACHE_ADVANCE_EXPIRE_SECONDS = 600;
     private static final String CUSTOMER_NEXT_CACHE_KEY = "kdzl:customer_next";
+    private static final int MAX_COUNT = 2000;
 
     @Autowired
     private RedisCache redisCache;
@@ -89,8 +90,8 @@ public class KdzlServiceImpl implements KdzlService {
             }
             
             Integer cachedNext = redisCache.getCacheObject(CUSTOMER_NEXT_CACHE_KEY);
-            Integer start = (cachedNext != null) ? cachedNext : 0;
-            int count = 1000;
+            int start = (cachedNext != null) ? cachedNext : 0;
+            int count = MAX_COUNT;
             
             String params = "access_token=" + accessToken + "&start=" + start + "&count=" + count;
             String response = HttpUtils.sendGet(URL + "/customer/export", params);
@@ -111,16 +112,17 @@ public class KdzlServiceImpl implements KdzlService {
                     customerList = customerResponse.getCustms();
                     log.info("成功导出客户数量: {}, 当前start: {}", customerList.size(), start);
                     
-                    Integer next = customerResponse.getNext();
-                    if (next != null) {
+                    if (customerList.size() == MAX_COUNT) {
+                        Integer next = start + count;
                         redisCache.setCacheObject(CUSTOMER_NEXT_CACHE_KEY, next, 7, TimeUnit.DAYS);
-                        log.info("next值已存入/更新缓存: {}", next);
+                        log.info("数据量达到{},更新next缓存: {}", MAX_COUNT, next);
                     } else {
                         redisCache.deleteObject(CUSTOMER_NEXT_CACHE_KEY);
-                        log.info("next为null,已清除缓存,所有客户数据已获取完毕");
+                        log.info("数据量不足{},清除缓存,所有客户数据已获取完毕", MAX_COUNT);
                     }
                 } else {
                     log.info("未查询到客户数据");
+                    redisCache.deleteObject(CUSTOMER_NEXT_CACHE_KEY);
                 }
             } else {
                 String errMsg = jsonObject.getString("errmsg");
@@ -129,7 +131,73 @@ public class KdzlServiceImpl implements KdzlService {
         } catch (Exception e) {
             log.error("导出客户异常", e);
         }
-        log.info("导出客户完成,共导出客户数量,数据: {},{}", customerList.size(), customerList);
+        log.info("导出客户完成,共导出客户数量: {}, 数据: {}", customerList.size(), customerList);
+        return customerList;
+    }
+
+    @Override
+    public List<Custm> exportCustomersByPost(Integer start, Long psid) {
+        List<Custm> customerList = new ArrayList<>();
+        
+        try {
+            String accessToken = getAccessToken();
+            if (accessToken.isEmpty()) {
+                log.error("获取access_token失败,无法导出会员");
+                return customerList;
+            }
+            
+            if (start == null) {
+                start = 0;
+            }
+            
+            String url = URL + "/open/api/customer/exportCustomer?access_token=" + accessToken;
+            
+            JSONObject requestBody = new JSONObject();
+            requestBody.put("start", start);
+            if (psid != null) {
+                requestBody.put("psid", psid);
+            }
+            
+            log.info("导出会员请求URL: {}, 请求体: {}", url, requestBody.toJSONString());
+            
+            String response = HttpUtils.sendPost(url, requestBody.toJSONString());
+            
+            log.info("导出会员响应: {}", response);
+            
+            if (response.isEmpty()) {
+                log.error("导出会员失败,响应为空");
+                return customerList;
+            }
+            
+            JSONObject jsonObject = JSONObject.parseObject(response);
+            CustomerResponse customerResponse = jsonObject.toJavaObject(CustomerResponse.class);
+            Integer result = customerResponse.getResult();
+
+            if (result != null && result == 0) {
+                if (!CollectionUtils.isEmpty(customerResponse.getCustms())) {
+                    customerList = customerResponse.getCustms();
+                    log.info("成功导出会员数量: {}, 当前start: {}", customerList.size(), start);
+                    
+                    if (!customerList.isEmpty()) {
+                        Custm lastCustomer = customerList.get(customerList.size() - 1);
+                        if (lastCustomer.getCustmid() != null) {
+                            redisCache.setCacheObject(CUSTOMER_NEXT_CACHE_KEY, lastCustomer.getCustmid().intValue(), 7, TimeUnit.DAYS);
+                            log.info("下次start值已存入/更新缓存: {}", lastCustomer.getCustmid());
+                        }
+                    }
+                } else {
+                    log.info("未查询到会员数据");
+                }
+            } else {
+                String errMsg = jsonObject.getString("errmsg");
+                log.error("导出会员失败,错误码: {}, 错误信息: {}", result, errMsg);
+            }
+        } catch (Exception e) {
+            log.error("导出会员异常", e);
+        }
+        
+        //log.info("导出会员完成,共导出会员数量: {}, 数据: {}", customerList.size(), customerList);
+        log.info("导出会员完成,共导出会员数量: {}", customerList.size());
         return customerList;
     }
 }

+ 3 - 2
fs-service/src/main/java/com/fs/kdzl/service/test.java

@@ -5,7 +5,8 @@ import com.fs.kdzl.service.impl.KdzlServiceImpl;
 public class test {
     static KdzlServiceImpl kdzlService = new KdzlServiceImpl();
     public static void main(String[] args) {
-        System.out.println(kdzlService.getAccessToken());
-        System.out.println(kdzlService.exportCustomers());
+        //System.out.println(kdzlService.getAccessToken());
+        //System.out.println(kdzlService.exportCustomers());
+        //kdzlService.exportCustomers(12000,2000);
     }
 }