Ver Fonte

新增同步公海会员

wjj há 21 horas atrás
pai
commit
909101f90a

+ 186 - 48
fs-admin/src/main/java/com/fs/his/task/KdzlTask.java

@@ -12,8 +12,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Component("KdzlTask")
@@ -29,10 +32,14 @@ public class KdzlTask {
     public void syncKdzlMember(){
         logger.info("开始同步会员信息...");
         int totalCount = 0;
+        int loopCount = 0;
+        int maxLoopCount = 100;
+        int batchSize = 500;
         
-        while (true) {
+        while (loopCount < maxLoopCount) {
+            loopCount++;
             List<Custm> custms = kdzlService.exportCustomers();
-            logger.info("本次获取会员信息数量:{}", custms.size());
+            logger.info("本次获取会员信息数量:{},当前循环次数:{}", custms.size(), loopCount);
             
             if (CollectionUtils.isEmpty(custms)) {
                 logger.info("未获取到会员数据,同步结束");
@@ -41,70 +48,83 @@ public class KdzlTask {
             
             totalCount += custms.size();
             logger.info("累计已同步会员数量:{}", totalCount);
-            
+
+            List<Long> kdzlMemberIds = custms.stream()
+                    .map(Custm::getCustmid)
+                    .collect(Collectors.toList());
+
+            List<FsImportMember> existingMembers = importMemberMapper.selectFsImportMemberByMemberIds(kdzlMemberIds);
+            Map<Long, FsImportMember> existingMemberMap = existingMembers.stream()
+                    .collect(Collectors.toMap(FsImportMember::getKdzlMemberId, m -> m));
+
+            List<FsImportMember> membersToSave = new ArrayList<>();
+            Date nowDate = new Date();
+
             for (Custm custm : custms) {
                 try {
-                    FsImportMember member = importMemberMapper.selectFsImportMemberByMemberId(custm.getCustmid());
-                    if (member == null) {
+                    FsImportMember member = existingMemberMap.get(custm.getCustmid());
+                    boolean isNew = (member == null);
+
+                    if (isNew) {
                         member = new FsImportMember();
                         member.setKdzlMemberId(custm.getCustmid());
-                        member.setKdzlMemberJson(JSON.toJSONString(custm));
                         member.setMemberName(custm.getName());
-                        member.setCreateTime(new Date());
-                        
+                        member.setCreateTime(nowDate);
+
                         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));
                             }
                         }
-                        
+
                         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;
-                                }
+                    }
+
+                    member.setKdzlMemberJson(JSON.toJSONString(custm));
+                    member.setUpdateTime(nowDate);
+                    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);
+
+                    membersToSave.add(member);
+                } catch (Exception e) {
+                    log.error("处理会员信息失败,custmid: {}, 错误: {}", custm.getCustmid(), e.getMessage());
+                }
+            }
+
+            if (!membersToSave.isEmpty()) {
+                try {
+                    if (membersToSave.size() <= batchSize) {
+                        importMemberMapper.batchInsertOrUpdateFsImportMember(membersToSave);
+                        logger.info("批量保存会员成功,数量:{}", membersToSave.size());
                     } else {
-                        importMemberMapper.updateFsImportMember(member);
+                        for (int i = 0; i < membersToSave.size(); i += batchSize) {
+                            int endIndex = Math.min(i + batchSize, membersToSave.size());
+                            List<FsImportMember> batch = membersToSave.subList(i, endIndex);
+                            importMemberMapper.batchInsertOrUpdateFsImportMember(batch);
+                            logger.info("分批批量保存会员成功,批次:{}/{}, 数量:{}", 
+                                    (i / batchSize + 1), 
+                                    (membersToSave.size() + batchSize - 1) / batchSize, 
+                                    batch.size());
+                        }
                     }
                 } catch (Exception e) {
-                    log.error("同步会员信息失败,custmid: {}, 错误: {}", custm.getCustmid(), e.getMessage());
+                    log.error("批量保存会员失败,数量:{}, 错误: {}", membersToSave.size(), e.getMessage(), e);
                 }
             }
             
@@ -115,7 +135,125 @@ public class KdzlTask {
             
             logger.info("本次获取数据量等于2000,继续获取下一页数据...");
         }
+
+        if (loopCount >= maxLoopCount) {
+            logger.warn("已达到最大循环次数{},强制退出循环,防止死循环", maxLoopCount);
+        }
         
         logger.info("会员信息同步完成,总共同步数量:{}", totalCount);
     }
+
+    public void syncKdzlHighSeasMember(){
+        logger.info("开始同步公海会员信息...");
+        int totalCount = 0;
+        int loopCount = 0;
+        int maxLoopCount = 100;
+        int batchSize = 500;
+
+        while (loopCount < maxLoopCount) {
+            loopCount++;
+            List<Custm> highSeasCustms = kdzlService.exportHighSeasCustomers(null);
+            logger.info("本次获取公海会员信息数量:{},当前循环次数:{}", highSeasCustms.size(), loopCount);
+            
+            if (CollectionUtils.isEmpty(highSeasCustms)) {
+                logger.info("未获取到公海会员数据,同步结束");
+                break;
+            }
+            
+            totalCount += highSeasCustms.size();
+            logger.info("累计已同步公海会员数量:{}", totalCount);
+
+            List<Long> kdzlMemberIds = highSeasCustms.stream()
+                    .map(Custm::getCustmid)
+                    .collect(Collectors.toList());
+
+            List<FsImportMember> existingMembers = importMemberMapper.selectFsImportMemberByMemberIds(kdzlMemberIds);
+            Map<Long, FsImportMember> existingMemberMap = existingMembers.stream()
+                    .collect(Collectors.toMap(FsImportMember::getKdzlMemberId, m -> m));
+
+            List<FsImportMember> membersToSave = new ArrayList<>();
+            Date nowDate = new Date();
+
+            for (Custm highSeasCustm : highSeasCustms) {
+                try {
+                    FsImportMember member = existingMemberMap.get(highSeasCustm.getCustmid());
+                    boolean isNew = (member == null);
+
+                    if (isNew) {
+                        member = new FsImportMember();
+                        member.setKdzlMemberId(highSeasCustm.getCustmid());
+                        member.setMemberName(highSeasCustm.getName());
+                        member.setCreateTime(nowDate);
+
+                        if (CollectionUtils.isNotEmpty(highSeasCustm.getContacts())) {
+                            com.fs.kdzl.dto.Contact contact = highSeasCustm.getContacts().get(0);
+                            if (contact != null && CollectionUtils.isNotEmpty(contact.getMobiles())) {
+                                member.setMemberPhone(contact.getMobiles().get(0));
+                            }
+                        }
+
+                        member.setAddress(highSeasCustm.getAddr());
+                    }
+
+                    member.setKdzlMemberJson(JSON.toJSONString(highSeasCustm));
+                    member.setUpdateTime(nowDate);
+                    member.setStatus(0);
+
+                    if (CollectionUtils.isNotEmpty(highSeasCustm.getProperties())) {
+                        for (Property property : highSeasCustm.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;
+                            }
+                        }
+                    }
+
+                    membersToSave.add(member);
+                } catch (Exception e) {
+                    log.error("处理公海会员信息失败,custmid: {}, 错误: {}", highSeasCustm.getCustmid(), e.getMessage());
+                }
+            }
+
+            if (!membersToSave.isEmpty()) {
+                try {
+                    if (membersToSave.size() <= batchSize) {
+                        importMemberMapper.batchInsertOrUpdateFsImportMember(membersToSave);
+                        logger.info("批量保存公海会员成功,数量:{}", membersToSave.size());
+                    } else {
+                        for (int i = 0; i < membersToSave.size(); i += batchSize) {
+                            int endIndex = Math.min(i + batchSize, membersToSave.size());
+                            List<FsImportMember> batch = membersToSave.subList(i, endIndex);
+                            importMemberMapper.batchInsertOrUpdateFsImportMember(batch);
+                            logger.info("分批批量保存公海会员成功,批次:{}/{}, 数量:{}", 
+                                    (i / batchSize + 1), 
+                                    (membersToSave.size() + batchSize - 1) / batchSize, 
+                                    batch.size());
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("批量保存公海会员失败,数量:{}, 错误: {}", membersToSave.size(), e.getMessage(), e);
+                }
+            }
+            
+            if (highSeasCustms.size() < 2000) {
+                logger.info("本次获取数据量小于2000,所有公海会员数据已同步完毕");
+                break;
+            }
+
+            logger.info("本次获取公海会员数据量等于2000,继续获取下一页数据...");
+        }
+
+        if (loopCount >= maxLoopCount) {
+            logger.warn("已达到最大循环次数{},强制退出循环,防止死循环", maxLoopCount);
+        }
+        
+        logger.info("公海会员信息同步完成,总共同步数量:{}", totalCount);
+    }
 }

+ 6 - 0
fs-admin/src/main/java/com/fs/qw/controller/FsImportMemberController.java

@@ -21,4 +21,10 @@ public class FsImportMemberController extends BaseController {
         fsImportMemberService.syncKdzlMemberInfo();
         return AjaxResult.success("口袋助理会员信息同步任务已启动,正在后台执行");
     }
+
+    @PostMapping("/syncKdzlHighSeaMemberInfo")
+    public AjaxResult syncKdzlHighSeaMemberInfo(){
+        fsImportMemberService.syncKdzlHighSeaMemberInfo();
+        return AjaxResult.success("口袋助理公海会员信息同步任务已启动,正在后台执行");
+    }
 }

+ 6 - 0
fs-company/src/main/java/com/fs/company/controller/his/FsImportMemberController.java

@@ -21,4 +21,10 @@ public class FsImportMemberController extends BaseController {
         fsImportMemberService.syncKdzlMemberInfo();
         return AjaxResult.success("口袋助理会员信息同步任务已启动,正在后台执行");
     }
+
+    @PostMapping("/syncKdzlHighSeaMemberInfo")
+    public AjaxResult syncKdzlHighSeaMemberInfo(){
+        fsImportMemberService.syncKdzlHighSeaMemberInfo();
+        return AjaxResult.success("口袋助理公海会员信息同步任务已启动,正在后台执行");
+    }
 }

+ 14 - 0
fs-service/src/main/java/com/fs/his/mapper/FsImportMemberMapper.java

@@ -83,4 +83,18 @@ public interface FsImportMemberMapper extends BaseMapper<FsImportMember>{
      */
     @Select("select * from fs_import_member where kdzl_member_id = #{kdzlMemberId}")
     FsImportMember selectFsImportMemberByMemberId(@Param("kdzlMemberId") Long kdzlMemberId);
+
+    /**
+     * 批量插入或更新导入会员(根据kdzl_member_id判断)
+     * @param memberList 导入会员列表
+     * @return 结果
+     */
+    int batchInsertOrUpdateFsImportMember(@Param("memberList") List<FsImportMember> memberList);
+
+    /**
+     * 批量根据口袋助理会员ID查询导入会员
+     * @param kdzlMemberIds 口袋助理会员ID集合
+     * @return 导入会员列表
+     */
+    List<FsImportMember> selectFsImportMemberByMemberIds(@Param("kdzlMemberIds") List<Long> kdzlMemberIds);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsImportMemberService.java

@@ -76,4 +76,6 @@ public interface IFsImportMemberService extends IService<FsImportMember>{
      * 同步口袋助理会员信息
      */
     void syncKdzlMemberInfo();
+
+    void syncKdzlHighSeaMemberInfo();
 }

+ 181 - 47
fs-service/src/main/java/com/fs/his/service/impl/FsImportMemberServiceImpl.java

@@ -1,10 +1,7 @@
 package com.fs.his.service.impl;
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import com.alibaba.excel.EasyExcel;
@@ -243,10 +240,14 @@ public class FsImportMemberServiceImpl extends ServiceImpl<FsImportMemberMapper,
     public void syncKdzlMemberInfo() {
         logger.info("开始同步会员信息...");
         int totalCount = 0;
+        int loopCount = 0;
+        int maxLoopCount = 100;
+        int batchSize = 500;
 
-        while (true) {
+        while (loopCount < maxLoopCount) {
+            loopCount++;
             List<Custm> custms = kdzlService.exportCustomers();
-            logger.info("本次获取会员信息数量:{}", custms.size());
+            logger.info("本次获取会员信息数量:{},当前循环次数:{}", custms.size(), loopCount);
 
             if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(custms)) {
                 logger.info("未获取到会员数据,同步结束");
@@ -256,15 +257,27 @@ public class FsImportMemberServiceImpl extends ServiceImpl<FsImportMemberMapper,
             totalCount += custms.size();
             logger.info("累计已同步会员数量:{}", totalCount);
 
+            List<Long> kdzlMemberIds = custms.stream()
+                    .map(Custm::getCustmid)
+                    .collect(Collectors.toList());
+
+            List<FsImportMember> existingMembers = importMemberMapper.selectFsImportMemberByMemberIds(kdzlMemberIds);
+            Map<Long, FsImportMember> existingMemberMap = existingMembers.stream()
+                    .collect(Collectors.toMap(FsImportMember::getKdzlMemberId, m -> m));
+
+            List<FsImportMember> membersToSave = new ArrayList<>();
+            Date nowDate = new Date();
+
             for (Custm custm : custms) {
                 try {
-                    FsImportMember member = importMemberMapper.selectFsImportMemberByMemberId(custm.getCustmid());
-                    if (member == null) {
+                    FsImportMember member = existingMemberMap.get(custm.getCustmid());
+                    boolean isNew = (member == null);
+
+                    if (isNew) {
                         member = new FsImportMember();
                         member.setKdzlMemberId(custm.getCustmid());
-                        member.setKdzlMemberJson(JSON.toJSONString(custm));
                         member.setMemberName(custm.getName());
-                        member.setCreateTime(new Date());
+                        member.setCreateTime(nowDate);
 
                         if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(custm.getContacts())) {
                             com.fs.kdzl.dto.Contact contact = custm.getContacts().get(0);
@@ -274,51 +287,52 @@ public class FsImportMemberServiceImpl extends ServiceImpl<FsImportMemberMapper,
                         }
 
                         member.setAddress(custm.getAddr());
+                    }
 
-                        if (com.baomidou.mybatisplus.core.toolkit.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 (com.baomidou.mybatisplus.core.toolkit.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.setKdzlMemberJson(JSON.toJSONString(custm));
+                    member.setUpdateTime(nowDate);
+                    member.setStatus(0);
+
+                    if (com.baomidou.mybatisplus.core.toolkit.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);
+                    membersToSave.add(member);
+                } catch (Exception e) {
+                    log.error("处理会员信息失败,custmid: {}, 错误: {}", custm.getCustmid(), e.getMessage());
+                }
+            }
+
+            if (!membersToSave.isEmpty()) {
+                try {
+                    if (membersToSave.size() <= batchSize) {
+                        importMemberMapper.batchInsertOrUpdateFsImportMember(membersToSave);
+                        logger.info("批量保存会员成功,数量:{}", membersToSave.size());
                     } else {
-                        importMemberMapper.updateFsImportMember(member);
+                        for (int i = 0; i < membersToSave.size(); i += batchSize) {
+                            int endIndex = Math.min(i + batchSize, membersToSave.size());
+                            List<FsImportMember> batch = membersToSave.subList(i, endIndex);
+                            importMemberMapper.batchInsertOrUpdateFsImportMember(batch);
+                            logger.info("分批批量保存会员成功,批次:{}/{}, 数量:{}", 
+                                    (i / batchSize + 1), 
+                                    (membersToSave.size() + batchSize - 1) / batchSize, 
+                                    batch.size());
+                        }
                     }
                 } catch (Exception e) {
-                    log.error("同步会员信息失败,custmid: {}, 错误: {}", custm.getCustmid(), e.getMessage());
+                    log.error("批量保存会员失败,数量:{}, 错误: {}", membersToSave.size(), e.getMessage(), e);
                 }
             }
 
@@ -330,6 +344,126 @@ public class FsImportMemberServiceImpl extends ServiceImpl<FsImportMemberMapper,
             logger.info("本次获取数据量等于2000,继续获取下一页数据...");
         }
 
+        if (loopCount >= maxLoopCount) {
+            logger.warn("已达到最大循环次数{},强制退出循环,防止死循环", maxLoopCount);
+        }
+
         logger.info("会员信息同步完成,总共同步数量:{}", totalCount);
     }
+
+    @Override
+    @Async
+    public void syncKdzlHighSeaMemberInfo() {
+        logger.info("开始同步公海会员信息...");
+        int totalCount = 0;
+        int loopCount = 0;
+        int maxLoopCount = 100;
+        int batchSize = 500;
+
+        while (loopCount < maxLoopCount) {
+            loopCount++;
+            List<Custm> custms = kdzlService.exportHighSeasCustomers(null);
+            logger.info("本次获取公海会员信息数量:{},当前循环次数:{}", custms.size(), loopCount);
+
+            if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(custms)) {
+                logger.info("未获取到公海会员数据,同步结束");
+                break;
+            }
+
+            totalCount += custms.size();
+            logger.info("累计已同步公海会员数量:{}", totalCount);
+
+            List<Long> kdzlMemberIds = custms.stream()
+                    .map(Custm::getCustmid)
+                    .collect(Collectors.toList());
+
+            List<FsImportMember> existingMembers = importMemberMapper.selectFsImportMemberByMemberIds(kdzlMemberIds);
+            Map<Long, FsImportMember> existingMemberMap = existingMembers.stream()
+                    .collect(Collectors.toMap(FsImportMember::getKdzlMemberId, m -> m));
+
+            List<FsImportMember> membersToSave = new ArrayList<>();
+            Date nowDate = new Date();
+
+            for (Custm custm : custms) {
+                try {
+                    FsImportMember member = existingMemberMap.get(custm.getCustmid());
+                    boolean isNew = (member == null);
+
+                    if (isNew) {
+                        member = new FsImportMember();
+                        member.setKdzlMemberId(custm.getCustmid());
+                        member.setMemberName(custm.getName());
+                        member.setCreateTime(nowDate);
+
+                        if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(custm.getContacts())) {
+                            com.fs.kdzl.dto.Contact contact = custm.getContacts().get(0);
+                            if (contact != null && com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(contact.getMobiles())) {
+                                member.setMemberPhone(contact.getMobiles().get(0));
+                            }
+                        }
+
+                        member.setAddress(custm.getAddr());
+                    }
+
+                    member.setKdzlMemberJson(JSON.toJSONString(custm));
+                    member.setUpdateTime(nowDate);
+                    member.setStatus(0);
+
+                    if (com.baomidou.mybatisplus.core.toolkit.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;
+                            }
+                        }
+                    }
+
+                    membersToSave.add(member);
+                } catch (Exception e) {
+                    log.error("处理公海会员信息失败,custmid: {}, 错误: {}", custm.getCustmid(), e.getMessage());
+                }
+            }
+
+            if (!membersToSave.isEmpty()) {
+                try {
+                    if (membersToSave.size() <= batchSize) {
+                        importMemberMapper.batchInsertOrUpdateFsImportMember(membersToSave);
+                        logger.info("批量保存公海会员成功,数量:{}", membersToSave.size());
+                    } else {
+                        for (int i = 0; i < membersToSave.size(); i += batchSize) {
+                            int endIndex = Math.min(i + batchSize, membersToSave.size());
+                            List<FsImportMember> batch = membersToSave.subList(i, endIndex);
+                            importMemberMapper.batchInsertOrUpdateFsImportMember(batch);
+                            logger.info("分批批量保存公海会员成功,批次:{}/{}, 数量:{}", 
+                                    (i / batchSize + 1), 
+                                    (membersToSave.size() + batchSize - 1) / batchSize, 
+                                    batch.size());
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("批量保存公海会员失败,数量:{}, 错误: {}", membersToSave.size(), e.getMessage(), e);
+                }
+            }
+
+            if (custms.size() < 2000) {
+                logger.info("本次获取公海数据量小于2000,所有公海会员数据已同步完毕");
+                break;
+            }
+
+            logger.info("本次获取公海数据量等于2000,继续获取下一页数据...");
+        }
+
+        if (loopCount >= maxLoopCount) {
+            logger.warn("已达到最大循环次数{},强制退出循环,防止死循环", maxLoopCount);
+        }
+
+        logger.info("公海会员信息同步完成,总共同步数量:{}", totalCount);
+    }
 }

+ 11 - 0
fs-service/src/main/java/com/fs/kdzl/dto/HighSeaCustomerData.java

@@ -0,0 +1,11 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class HighSeaCustomerData {
+    private List<Custm> customer;
+    private Integer next;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/kdzl/dto/HighSeaCustomerResponse.java

@@ -0,0 +1,11 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class HighSeaCustomerResponse {
+    private HighSeaCustomerData data;
+    private Integer result;
+}

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

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

+ 30 - 33
fs-service/src/main/java/com/fs/kdzl/service/impl/KdzlServiceImpl.java

@@ -6,6 +6,7 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.http.HttpUtils;
 import com.fs.kdzl.dto.Custm;
 import com.fs.kdzl.dto.CustomerResponse;
+import com.fs.kdzl.dto.HighSeaCustomerResponse;
 import com.fs.kdzl.dto.KdzlCustomerDTO;
 import com.fs.kdzl.service.KdzlService;
 import org.slf4j.Logger;
@@ -27,6 +28,7 @@ public class KdzlServiceImpl implements KdzlService {
     private static final String DID = "3697222";
     private static final String SECRET = "95c0bb697d8f444a";
     private static final String URL = "https://api.kdzl.cn/cgi-bin";
+    private static final String URL1 = "https://api.kdzl.cn";
     private static final String ACCESS_TOKEN_CACHE_KEY = "kdzl:access_token";
     private static final int TOKEN_EXPIRE_SECONDS = 7200;
     private static final int CACHE_ADVANCE_EXPIRE_SECONDS = 600;
@@ -62,9 +64,9 @@ public class KdzlServiceImpl implements KdzlService {
                 String accessToken = jsonObject.getString("access_token");
                 log.info("成功获取access_token: {}", accessToken);
                 
-//                int cacheExpireSeconds = TOKEN_EXPIRE_SECONDS - CACHE_ADVANCE_EXPIRE_SECONDS;
-//                redisCache.setCacheObject(ACCESS_TOKEN_CACHE_KEY, accessToken, cacheExpireSeconds, TimeUnit.SECONDS);
-//                log.info("access_token已存入缓存,缓存时间: {}秒", cacheExpireSeconds);
+                int cacheExpireSeconds = TOKEN_EXPIRE_SECONDS - CACHE_ADVANCE_EXPIRE_SECONDS;
+                redisCache.setCacheObject(ACCESS_TOKEN_CACHE_KEY, accessToken, cacheExpireSeconds, TimeUnit.SECONDS);
+                log.info("access_token已存入缓存,缓存时间: {}秒", cacheExpireSeconds);
                 
                 return accessToken;
             } else {
@@ -136,68 +138,63 @@ public class KdzlServiceImpl implements KdzlService {
     }
 
     @Override
-    public List<Custm> exportCustomersByPost(Integer start, Long psid) {
+    public List<Custm> exportHighSeasCustomers(Long psid) {
         List<Custm> customerList = new ArrayList<>();
         
         try {
             String accessToken = getAccessToken();
             if (accessToken.isEmpty()) {
-                log.error("获取access_token失败,无法导出会员");
+                log.error("获取access_token失败,无法导出公海客户");
                 return customerList;
             }
             
-            if (start == null) {
-                start = 0;
-            }
-            
-            String url = URL + "/open/api/customer/exportCustomer?access_token=" + accessToken;
-            
+            Integer cachedNext = redisCache.getCacheObject(CUSTOMER_NEXT_CACHE_KEY + ":highseas");
+            int start = (cachedNext != null) ? cachedNext : 0;
+            //int start = 0;
+
             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());
+            String url = URL1 + "/open/api/customer/exportCustomer?access_token=" + accessToken;
+            String response = HttpUtils.doPost(url, requestBody.toJSONString());
             
-            log.info("导出会员响应: {}", response);
+            //log.info("导出公海客户响应: {}", response);
             
             if (response.isEmpty()) {
-                log.error("导出会员失败,响应为空");
+                log.error("导出公海客户失败,响应为空");
                 return customerList;
             }
             
             JSONObject jsonObject = JSONObject.parseObject(response);
-            CustomerResponse customerResponse = jsonObject.toJavaObject(CustomerResponse.class);
+            HighSeaCustomerResponse customerResponse = jsonObject.toJavaObject(HighSeaCustomerResponse.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());
-                        }
+                if (!CollectionUtils.isEmpty(customerResponse.getData().getCustomer())) {
+                    customerList = customerResponse.getData().getCustomer();
+                    log.info("成功导出公海客户数量: {}, 当前start: {}, psid: {}", customerList.size(), start, psid);
+                    if (customerList.size() == MAX_COUNT) {
+                        redisCache.setCacheObject(CUSTOMER_NEXT_CACHE_KEY + ":highseas",customerResponse.getData().getNext(), 7, TimeUnit.DAYS);
+                        log.info("数据量达到{},更新next缓存为: {}", MAX_COUNT, customerResponse.getData().getNext());
+                    } else {
+                        redisCache.deleteObject(CUSTOMER_NEXT_CACHE_KEY + ":highseas");
+                        log.info("数据量不足{},清除缓存,所有公海客户数据已获取完毕", MAX_COUNT);
                     }
                 } else {
-                    log.info("未查询到会员数据");
+                    log.info("未查询到公海客户数据");
+                    redisCache.deleteObject(CUSTOMER_NEXT_CACHE_KEY + ":highseas");
                 }
             } else {
                 String errMsg = jsonObject.getString("errmsg");
-                log.error("导出会员失败,错误码: {}, 错误信息: {}", result, errMsg);
+                log.error("导出公海客户失败,错误码: {}, 错误信息: {}", result, errMsg);
             }
         } catch (Exception e) {
-            log.error("导出会员异常", e);
+            log.error("导出公海客户异常", e);
         }
-        
-        //log.info("导出会员完成,共导出会员数量: {}, 数据: {}", customerList.size(), customerList);
-        log.info("导出会员完成,共导出会员数量: {}", customerList.size());
         return customerList;
     }
+
 }

+ 39 - 0
fs-service/src/main/resources/mapper/his/FsImportMemberMapper.xml

@@ -132,4 +132,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             )
         </foreach>
     </insert>
+
+    <insert id="batchInsertOrUpdateFsImportMember">
+        INSERT INTO fs_import_member
+        (kdzl_member_id, kdzl_member_json, member_name, address, member_phone, present_illness, current_medication, allergy_history, status, create_time, update_time)
+        VALUES
+        <foreach collection="memberList" item="item" separator=",">
+            (
+            #{item.kdzlMemberId},
+            #{item.kdzlMemberJson},
+            #{item.memberName},
+            #{item.address},
+            #{item.memberPhone},
+            #{item.presentIllness},
+            #{item.currentMedication},
+            #{item.allergyHistory},
+            #{item.status},
+            #{item.createTime},
+            #{item.updateTime}
+            )
+        </foreach>
+        ON DUPLICATE KEY UPDATE
+        kdzl_member_json = VALUES(kdzl_member_json),
+        member_name = VALUES(member_name),
+        address = VALUES(address),
+        member_phone = VALUES(member_phone),
+        present_illness = VALUES(present_illness),
+        current_medication = VALUES(current_medication),
+        allergy_history = VALUES(allergy_history),
+        status = VALUES(status),
+        update_time = VALUES(update_time)
+    </insert>
+
+    <select id="selectFsImportMemberByMemberIds" resultMap="FsImportMemberResult">
+        <include refid="selectFsImportMemberVo"/>
+        where kdzl_member_id in
+        <foreach collection="kdzlMemberIds" item="kdzlMemberId" open="(" separator="," close=")">
+            #{kdzlMemberId}
+        </foreach>
+    </select>
 </mapper>