Pārlūkot izejas kodu

口袋助理会员信息导入

wjj 4 dienas atpakaļ
vecāks
revīzija
12e555c95f

+ 102 - 0
fs-admin/src/main/java/com/fs/his/task/KdzlTask.java

@@ -0,0 +1,102 @@
+package com.fs.his.task;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.fs.his.domain.FsImportMember;
+import com.fs.his.mapper.FsImportMemberMapper;
+import com.fs.kdzl.dto.Custm;
+import com.fs.kdzl.dto.Property;
+import com.fs.kdzl.service.KdzlService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Component("KdzlTask")
+public class KdzlTask {
+
+    @Autowired
+    private KdzlService kdzlService;
+    @Autowired
+    private FsImportMemberMapper importMemberMapper;
+
+    org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
+
+    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;
+                            }
+                        }
+                    }
+                } 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;
+                            }
+                        }
+                    }
+                }
+                logger.info("会员信息:{}",member);
+                if (member.getId() == null) {
+                    importMemberMapper.insertFsImportMember(member);
+                } else {
+                    importMemberMapper.updateFsImportMember(member);
+                }
+            } catch (Exception e) {
+                log.error("同步会员信息失败:{}",e.getMessage());
+            }
+
+        }
+    }
+}

+ 22 - 0
fs-service/src/main/java/com/fs/his/domain/FsImportMember.java

@@ -61,4 +61,26 @@ public class FsImportMember{
 
     /** 公司用户id */
     private Long companyUserId;
+
+    /**
+     口袋助理会员id
+     */
+    private Long kdzlMemberId;
+
+    /**
+     口袋助理会员信息
+     */
+    private String kdzlMemberJson;
+
+    /** 现病史 */
+    @Excel(name = "现病史")
+    private String presentIllness;
+
+    /** 现用药情况 */
+    @Excel(name = "现用药情况")
+    private String currentMedication;
+
+    /** 过敏史 */
+    @Excel(name = "过敏史")
+    private String allergyHistory;
 }

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

@@ -4,6 +4,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsImportMember;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 导入会员Mapper接口
@@ -74,4 +75,12 @@ public interface FsImportMemberMapper extends BaseMapper<FsImportMember>{
      * @return 修改数量
      */
     int completionStatus(@Param("importMemberIds") List<Long> importMemberIds);
+
+    /**
+     * 根据口袋助理会员ID查询导入会员
+     * @param kdzlMemberId 口袋助理会员ID
+     * @return 导入会员
+     */
+    @Select("select * from fs_import_member where kdzl_member_id = #{kdzlMemberId}")
+    FsImportMember selectFsImportMemberByMemberId(@Param("kdzlMemberId") Long kdzlMemberId);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsImportMemberServiceImpl.java

@@ -158,6 +158,9 @@ public class FsImportMemberServiceImpl extends ServiceImpl<FsImportMemberMapper,
             customer.setAddress(member.getAddress());
             customer.setCreateTime(nowDate);
             customer.setImportMemberId(member.getId());
+            customer.setPresentIllness(member.getPresentIllness());
+            customer.setCurrentMedication(member.getCurrentMedication());
+            customer.setAllergyHistory(member.getAllergyHistory());
             customer.setClaimStatus(BigDecimal.ZERO.intValue());// 认领状态0:未认领,1:已认领
             return customer;
         }).collect(Collectors.toList());

+ 7 - 0
fs-service/src/main/java/com/fs/kdzl/dto/Attr.java

@@ -0,0 +1,7 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+@Data
+public class Attr {
+}

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

@@ -0,0 +1,11 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Clbl {
+    private Lbl lbl;
+    private List<SubLbl> sub_lbls;
+}

+ 24 - 0
fs-service/src/main/java/com/fs/kdzl/dto/Contact.java

@@ -0,0 +1,24 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Contact {
+    private Integer contactid;// 联系人ID
+    private List<String> faxs;// 传真
+    private List<String> ims;// 即时通讯
+    private List<String> mails;// 邮箱
+    private List<String> mobiles;// 手机
+    private List<Object> mobiles_nc_result; // 根据实际数据类型调整
+    private String name;// 姓名
+    private List<String> name_swords;// 姓名分词
+    private String note;// 备注
+    private List<String> phones;// 电话
+    private List<Property> properties;// 属性
+    private Integer sex; // 1:男, 2:女
+    private List<String> titles;// 职位
+    private List<String> wechats;// 微信
+    private List<String> weibos;// 微博
+}

+ 47 - 0
fs-service/src/main/java/com/fs/kdzl/dto/Custm.java

@@ -0,0 +1,47 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Custm {
+    private String addr;// 地址
+    private List<Attr> attrs;// 属性
+    private Integer calls_cnt; // 呼叫次数
+    private List<Contact> contacts;
+    private String create_alias;
+    private Integer create_pid;
+    private Long create_time;
+    private Integer create_type;
+    private Long custmid;
+    private Long entry_ps_time;
+    private Integer fcnt;
+    private Integer first_follow_pid;
+    private Long first_follow_time;
+    private Integer first_legwork_pid;
+    private Long first_legwork_time;
+    private String follow_level;
+    private List<Follower> followers;
+    private Integer get_and_assign_cnt;
+    private Long last_call_time;
+    private Long last_connect_time;
+    private Long last_transaction_time;
+    private LblDoc lbl_doc;
+    private Long lftime;
+    private Long lotime;
+    private Integer modify_pid;
+    private Long modify_time;
+    private String name;
+    private List<String> name_swords;
+    private Long obtain_time;
+    private Integer order_cnt;
+    private Long plan_recycle_time;
+    private List<PreFollower> pre_followers;
+    private List<Property> properties;
+    private Integer saleschance_step;
+    private Integer status;
+    private Integer trans_status;
+    private Integer version;
+    private List<String> websites;
+}

+ 13 - 0
fs-service/src/main/java/com/fs/kdzl/dto/CustomerResponse.java

@@ -0,0 +1,13 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CustomerResponse {
+    private List<Custm> custms;
+    private String errmsg;
+    private Integer result;
+    private Integer next;
+}

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

@@ -0,0 +1,11 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+@Data
+public class Follower {
+    private Integer follow_type;
+    private Long lftime;
+    private Integer pid;
+    private Long start_time;
+}

+ 103 - 0
fs-service/src/main/java/com/fs/kdzl/dto/KdzlCustomerDTO.java

@@ -0,0 +1,103 @@
+package com.fs.kdzl.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 口袋助理客户信息 DTO
+ */
+@Data
+public class KdzlCustomerDTO {
+
+    @ApiModelProperty(value = "客户ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "客户名称")
+    private String name;
+
+    @ApiModelProperty(value = "客户手机号")
+    private String mobile;
+
+    @ApiModelProperty(value = "客户微信")
+    private String weixin;
+
+    @ApiModelProperty(value = "客户邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "客户来源")
+    private String source;
+
+    @ApiModelProperty(value = "客户类型")
+    private String type;
+
+    @ApiModelProperty(value = "客户等级")
+    private String level;
+
+    @ApiModelProperty(value = "客户状态")
+    private String status;
+
+    @ApiModelProperty(value = "所属员工ID")
+    private Integer employee_id;
+
+    @ApiModelProperty(value = "所属员工姓名")
+    private String employee_name;
+
+    @ApiModelProperty(value = "所属部门")
+    private String department;
+
+    @ApiModelProperty(value = "客户备注")
+    private String remark;
+
+    @ApiModelProperty(value = "客户标签")
+    private List<String> tags;
+
+    @ApiModelProperty(value = "客户地址")
+    private String address;
+
+    @ApiModelProperty(value = "客户公司")
+    private String company;
+
+    @ApiModelProperty(value = "客户职位")
+    private String position;
+
+    @ApiModelProperty(value = "创建时间")
+    private String create_time;
+
+    @ApiModelProperty(value = "更新时间")
+    private String update_time;
+
+    @ApiModelProperty(value = "最后联系时间")
+    private String last_contact_time;
+
+    @ApiModelProperty(value = "联系次数")
+    private Integer contact_count;
+
+    @ApiModelProperty(value = "客户头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "性别")
+    private String gender;
+
+    @ApiModelProperty(value = "生日")
+    private String birthday;
+
+    @ApiModelProperty(value = "客户价值评分")
+    private Integer score;
+
+    @ApiModelProperty(value = "自定义字段")
+    private List<CustomField> custom_fields;
+
+    /**
+     * 自定义字段 DTO
+     */
+    @Data
+    public static class CustomField {
+        @ApiModelProperty(value = "字段名称")
+        private String field_name;
+
+        @ApiModelProperty(value = "字段值")
+        private String field_value;
+    }
+}

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

@@ -0,0 +1,11 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+@Data
+public class Lbl {
+    private Integer lbl_id;
+    private String lbl_name;
+    private Integer sort_id;
+    private Integer type;
+}

+ 10 - 0
fs-service/src/main/java/com/fs/kdzl/dto/LblDoc.java

@@ -0,0 +1,10 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LblDoc {
+    private List<Clbl> clbls;
+}

+ 7 - 0
fs-service/src/main/java/com/fs/kdzl/dto/PreFollower.java

@@ -0,0 +1,7 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+@Data
+public class PreFollower {
+}

+ 14 - 0
fs-service/src/main/java/com/fs/kdzl/dto/Property.java

@@ -0,0 +1,14 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Property {
+    private Integer data_type;
+    private List<Object> field_access; // 根据实际数据类型调整
+    private Integer prop_id;
+    private String prop_name;
+    private String prop_value;
+}

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

@@ -0,0 +1,11 @@
+package com.fs.kdzl.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SubLbl {
+    private Lbl lbl;
+    private List<Object> sub_lbls; // 根据实际数据类型调整
+}

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

@@ -0,0 +1,22 @@
+package com.fs.kdzl.service;
+
+import com.fs.kdzl.dto.Custm;
+import com.fs.kdzl.dto.KdzlCustomerDTO;
+
+import java.util.List;
+
+public interface KdzlService {
+
+    /**
+     * 获取access_token
+     */
+    String getAccessToken();
+
+    /**
+     * 导出客户
+     * @param start 开始导出客户的位置,默认从0开始
+     * @param count 本次拉取最多返回的客户个数,默认1000,最大2000
+     * @return 客户列表
+     */
+    List<Custm>  exportCustomers();
+}

+ 135 - 0
fs-service/src/main/java/com/fs/kdzl/service/impl/KdzlServiceImpl.java

@@ -0,0 +1,135 @@
+package com.fs.kdzl.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.KdzlCustomerDTO;
+import com.fs.kdzl.service.KdzlService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class KdzlServiceImpl implements KdzlService {
+
+    private static final Logger log = LoggerFactory.getLogger(KdzlServiceImpl.class);
+
+    private static final String APPID = "71605";
+    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 ACCESS_TOKEN_CACHE_KEY = "kdzl:access_token";
+    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";
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Override
+    public String getAccessToken() {
+        try {
+            String cachedToken = redisCache.getCacheObject(ACCESS_TOKEN_CACHE_KEY);
+            if (cachedToken != null && !cachedToken.isEmpty()) {
+                log.info("从缓存中获取access_token: {}", cachedToken);
+                return cachedToken;
+            }
+            
+            String params = "appid=" + APPID + "&did=" + DID + "&secret=" + SECRET + "&expire=" + TOKEN_EXPIRE_SECONDS;
+            String response = HttpUtils.sendGet(URL + "/oauth/access_token", params);
+            
+            log.info("获取口袋助理access_token响应: {}", response);
+            
+            if (response.isEmpty()) {
+                log.error("获取access_token失败,响应为空");
+                return "";
+            }
+            
+            JSONObject jsonObject = JSONObject.parseObject(response);
+            Integer result = jsonObject.getInteger("result");
+            
+            if (result != null && result == 0) {
+                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);
+                
+                return accessToken;
+            } else {
+                String errMsg = jsonObject.getString("errmsg");
+                log.error("获取access_token失败,错误码: {}, 错误信息: {}", result, errMsg);
+                return "";
+            }
+        } catch (Exception e) {
+            log.error("获取access_token异常", e);
+            return "";
+        }
+    }
+
+    @Override
+    public List<Custm> exportCustomers() {
+        List<Custm> customerList = new ArrayList<>();
+        
+        try {
+            String accessToken = getAccessToken();
+            if (accessToken.isEmpty()) {
+                log.error("获取access_token失败,无法导出客户");
+                return customerList;
+            }
+            
+            Integer cachedNext = redisCache.getCacheObject(CUSTOMER_NEXT_CACHE_KEY);
+            Integer start = (cachedNext != null) ? cachedNext : 0;
+            int count = 1000;
+            
+            String params = "access_token=" + accessToken + "&start=" + start + "&count=" + count;
+            String response = HttpUtils.sendGet(URL + "/customer/export", params);
+            
+            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);
+                    
+                    Integer next = customerResponse.getNext();
+                    if (next != null) {
+                        redisCache.setCacheObject(CUSTOMER_NEXT_CACHE_KEY, next, 7, TimeUnit.DAYS);
+                        log.info("next值已存入/更新缓存: {}", next);
+                    } else {
+                        redisCache.deleteObject(CUSTOMER_NEXT_CACHE_KEY);
+                        log.info("next为null,已清除缓存,所有客户数据已获取完毕");
+                    }
+                } else {
+                    log.info("未查询到客户数据");
+                }
+            } else {
+                String errMsg = jsonObject.getString("errmsg");
+                log.error("导出客户失败,错误码: {}, 错误信息: {}", result, errMsg);
+            }
+        } catch (Exception e) {
+            log.error("导出客户异常", e);
+        }
+        log.info("导出客户完成,共导出客户数量,数据: {},{}", customerList.size(), customerList);
+        return customerList;
+    }
+}

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

@@ -0,0 +1,11 @@
+package com.fs.kdzl.service;
+
+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());
+    }
+}

+ 22 - 1
fs-service/src/main/resources/mapper/his/FsImportMemberMapper.xml

@@ -15,10 +15,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="callStatus"    column="call_status"    />
         <result property="companyUserId"    column="company_user_id"    />
         <result property="companyId"    column="company_id"    />
+        <result property="kdzlMemberId" column="kdzl_member_id" />
+        <result property="kdzlMemberJson" column="kdzl_member_json" />
+        <result property="presentIllness" column="present_illness" />
+        <result property="currentMedication" column="current_medication" />
+        <result property="allergyHistory" column="allergy_history" />
     </resultMap>
 
     <sql id="selectFsImportMemberVo">
-        select id, member_name, address, member_phone, status, create_time, update_time, call_status, company_user_id, company_id from fs_import_member
+        select id, member_name, address, member_phone, status, create_time, update_time, call_status, company_user_id, company_id, kdzl_member_id, kdzl_member_json, present_illness, current_medication, allergy_history from fs_import_member
     </sql>
 
     <select id="selectFsImportMemberList" parameterType="FsImportMember" resultMap="FsImportMemberResult">
@@ -29,6 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="memberPhone != null  and memberPhone != ''"> and member_phone = #{memberPhone}</if>
             <if test="status != null "> and status = #{status}</if>
         </where>
+        order by create_time desc
     </select>
     
     <select id="selectFsImportMemberById" parameterType="Long" resultMap="FsImportMemberResult">
@@ -48,6 +54,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="callStatus != null">call_status,</if>
             <if test="companyUserId != null">company_user_id,</if>
             <if test="companyId != null">company_id,</if>
+            <if test="kdzlMemberId != null">kdzl_member_id,</if>
+            <if test="kdzlMemberJson != null">kdzl_member_json,</if>
+            <if test="presentIllness != null">present_illness,</if>
+            <if test="currentMedication != null">current_medication,</if>
+            <if test="allergyHistory != null">allergy_history,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="memberName != null">#{memberName},</if>
@@ -59,6 +70,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="callStatus != null">#{callStatus},</if>
             <if test="companyUserId != null">#{companyUserId},</if>
             <if test="companyId != null">#{companyId},</if>
+            <if test="kdzlMemberId != null">#{kdzlMemberId},</if>
+            <if test="kdzlMemberJson != null">#{kdzlMemberJson},</if>
+            <if test="presentIllness != null">#{presentIllness},</if>
+            <if test="currentMedication != null">#{currentMedication},</if>
+            <if test="allergyHistory != null">#{allergyHistory},</if>
          </trim>
     </insert>
 
@@ -74,6 +90,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="callStatus != null">call_status = #{callStatus},</if>
             <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
             <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="kdzlMemberId != null">kdzl_member_id = #{kdzlMemberId},</if>
+            <if test="kdzlMemberJson != null">kdzl_member_json = #{kdzlMemberJson},</if>
+            <if test="presentIllness != null">present_illness = #{presentIllness},</if>
+            <if test="currentMedication != null">current_medication = #{currentMedication},</if>
+            <if test="allergyHistory != null">allergy_history = #{allergyHistory},</if>
         </trim>
         where id = #{id}
     </update>