Prechádzať zdrojové kódy

Merge remote-tracking branch 'upstream/master'

hsh 1 mesiac pred
rodič
commit
5f599cfc97

+ 1 - 1
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>thyyxxk</groupId>
     <artifactId>web-server</artifactId>
-    <version>14.0.3</version>
+    <version>14.0.9</version>
     <name>web-server</name>
     <description>server for yibao-web</description>
     <properties>

+ 10 - 0
src/main/java/thyyxxk/webserver/controller/ca/CaController.java

@@ -1,17 +1,21 @@
 package thyyxxk.webserver.controller.ca;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import thyyxxk.webserver.config.auth.PassToken;
+import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.ca.CaReturn;
 import thyyxxk.webserver.entity.ca.CaSignClass;
 import thyyxxk.webserver.entity.ca.CaSingBizSnReturnData;
 import thyyxxk.webserver.entity.ca.PatientIdCardType;
 import thyyxxk.webserver.service.ca.CaServer;
+import thyyxxk.webserver.utils.R;
 import thyyxxk.webserver.utils.ResultVoUtil;
+import thyyxxk.webserver.utils.TokenUtil;
 
 import java.util.List;
 
@@ -110,4 +114,10 @@ public class CaController {
         return server.sendMedicalRecordsToTablet(id);
     }
 
+    @GetMapping("/synchronizeCaSignImage")
+    public ResultVo<String> synchronizeCaSignImage(@RequestParam(value = "code", required = false) String code) {
+        code = StrUtil.isBlank(code) ? TokenUtil.getInstance().getTokenUserId() : code;
+        return server.getUserSeal(code);
+    }
+
 }

+ 8 - 0
src/main/java/thyyxxk/webserver/controller/zhuyuanyizheng/YizhuLuRuController.java

@@ -299,4 +299,12 @@ public class YizhuLuRuController {
         return server.copyOrderToOnce(req);
     }
 
+    @GetMapping("/updateZyDisWay")
+    public ResultVo<String> updateZyDisWay(@RequestParam("patNo") String patNo,
+                                           @RequestParam("times") Integer times,
+                                           @RequestParam("type") String type) {
+        dao.updateZyDisWay(patNo, times, type);
+        return R.ok(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
+    }
+
 }

+ 2 - 0
src/main/java/thyyxxk/webserver/dao/his/inpatient/PatientDao.java

@@ -85,6 +85,8 @@ public interface PatientDao {
             "and admiss_times=a.admiss_times and dis_diag_no=1), " +
             "operation=rtrim(a.operation),a.zy_serial_no, " +
             "bedNo=rtrim(a.bed_no),a.admdvs,a.exp_content, " +
+            "nursingLevel=(select top 1 z.order_name from yz_act_order z where " +
+            "z.inpatient_no=a.inpatient_no and z.admiss_times=a.admiss_times and z.order_name like '%级护理' and status_flag in ('3', '4') order by z.start_time desc), " +
             "dutyNurse=(select rtrim(job_nurse) from batj_ba2 t where t.zyh=a.inpatient_no and t.zycs=a.admiss_times), " +
             "rtrim(b.country) as country, rtrim(b.nation_code) as nation," +
             "rtrim(b.relation_name) as contactName, rtrim(relation_code) as contactRelation, " +

+ 3 - 2
src/main/java/thyyxxk/webserver/dao/his/medicalinsurance/SiZyDao.java

@@ -130,7 +130,7 @@ public interface SiZyDao {
             "and trans_flag_yb!=2 and charge_date<=#{endtime})," +
             "expContent=(select d.exp_content from zy_actpatient d where d.inpatient_no=#{patNo}) " +
             "from t_si_pat_info a where pat_no=#{patNo} and times=#{times} and ledger_sn=#{ledgerSn}")
-    PreSetlmt selectPreSetlmt(String patNo, int times, int ledgerSn, String endtime);
+    PreSetlmt selectPreSetlmt(String patNo, int times, int ledgerSn, Date endtime);
 
     @Select("select start_time from yz_act_order with(nolock) where inpatient_no=#{patNo} and admiss_times=#{times} " +
             "and status_flag > '1' and isnull(group_no, '00')='00' and order_code in " +
@@ -197,7 +197,8 @@ public interface SiZyDao {
     @Update("update t_si_pat_info set insuplc_admdvs=#{insuplcAdmdvs}," +
             "psn_type=#{psnType},emp_name=#{empName},balc=#{balc}," +
             "mdtrt_id=#{mdtrtId},insutype=#{insutype},visit_datetime=#{ybRegisterDate}," +
-            "adm_reg_msgid=#{admRegMsgid},insuplc_admdvs_name=#{insuplcAdmdvsName} " +
+            "adm_reg_msgid=#{admRegMsgid},insuplc_admdvs_name=#{insuplcAdmdvsName}, " +
+            "mdtrt_cert_type=#{mdtrtCertType},mdtrt_cert_no=#{mdtrtCertNo},update_time=getdate() " +
             "where pat_no=#{inpatientNo} and times=#{admissTimes} and ledger_sn=#{ledgerSn}")
     void afterAdmissRegister(ZyPatientInfo p);
 

+ 4 - 0
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyisheng/YiZhuLuRuDao.java

@@ -1765,4 +1765,8 @@ public interface YiZhuLuRuDao {
             "                         where a.act_order_no = ${oldOrderNo})\n" +
             "where act_order_no = ${pa.actOrderNo};")
     void copyOrderToOnce(XinZhenYzActOrder pa, BigDecimal oldOrderNo);
+
+
+    @Update("update t_case_frontsheet_main set zy_dismiss_way = #{type} where bah = #{patNo} and admiss_times = #{times} and file_status <> '1' ")
+    int updateZyDisWay(String patNo,Integer times, String type);
 }

+ 3 - 7
src/main/java/thyyxxk/webserver/service/PublicServer.java

@@ -17,7 +17,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionTemplate;
 import thyyxxk.webserver.config.exception.BizException;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.constants.Capacity;
@@ -172,8 +171,7 @@ public class PublicServer {
     }
 
     @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
-    public BigDecimal[] getActOrderNo(int size) {
-        size = size + 1;
+    public List<BigDecimal> getActOrderNo(int size) {
         BigDecimal oldId = dao.getActOrderNo();
         BigDecimal newId = oldId.add(new BigDecimal(size));
         int num = dao.updateActOrderNo(newId, oldId);
@@ -193,7 +191,7 @@ public class PublicServer {
         ListUtil.batchList(data, PublicDao.class, (m, i) -> {
             m.insertOrderNoRecord(i, userCode);
         });
-        return new BigDecimal[]{oldId, newId};
+        return data;
     }
 
     /**
@@ -946,9 +944,7 @@ public class PublicServer {
 
     @Async
     public void orderRecord(BigDecimal orderCode, String userCode) {
-        TryUtil.ignoreErr(() -> {
-            dao.insertOrderNoRecord(orderCode, userCode);
-        });
+        dao.insertOrderNoRecord(orderCode, userCode);
     }
 
     public ResultVo<UserInfo> getUserInfoByCode(String code) {

+ 39 - 2
src/main/java/thyyxxk/webserver/service/ca/CaServer.java

@@ -36,13 +36,16 @@ import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.entity.outpatient.thmz.MzEmrPatientData;
 import thyyxxk.webserver.entity.zhuyuanyisheng.emr.EmrPatientData;
 import thyyxxk.webserver.entity.zhuyuanyisheng.emr.SignCompleteEnum;
+import thyyxxk.webserver.service.archive.ArchiveServer;
 import thyyxxk.webserver.service.hutoolcache.CaCache;
 import thyyxxk.webserver.service.hutoolcache.UserCache;
 import thyyxxk.webserver.service.zhuyuanyisheng.emr.EmrServer;
+import thyyxxk.webserver.utils.R;
 import thyyxxk.webserver.utils.ResultVoUtil;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
@@ -60,6 +63,7 @@ public class CaServer implements Assertion {
     private final CaCache cache;
     private final UserCache userCache;
     private final MzEmrDao mzEmrDao;
+    private final ArchiveConfig archiveConfig;
 
     private final PatientIdCardTypeDao patientIdCardTypeDao;
 
@@ -72,14 +76,15 @@ public class CaServer implements Assertion {
         zy, mz
     }
 
-    public CaServer(CaData caData, EmrPatientDao emrPatientDao, CaCache cache, UserCache userCache, ArchiveConfig archive, MzEmrDao mzEmrDao, PatientIdCardTypeDao patientIdCardTypeDao) {
+    public CaServer(CaData caData, EmrPatientDao emrPatientDao, CaCache cache, UserCache userCache, ArchiveConfig archiveConfig, MzEmrDao mzEmrDao, PatientIdCardTypeDao patientIdCardTypeDao) {
         this.caData = caData;
         this.emrPatientDao = emrPatientDao;
-        this.archivePath = archive.getPath() + "/archive/emr";
+        this.archivePath = archiveConfig.getPath() + "/archive/emr";
         this.cache = cache;
         this.userCache = userCache;
         this.mzEmrDao = mzEmrDao;
         this.patientIdCardTypeDao = patientIdCardTypeDao;
+        this.archiveConfig = archiveConfig;
     }
 
     private String getRedisKey(String documentId) {
@@ -864,5 +869,37 @@ public class CaServer implements Assertion {
         emrPatientDao.updateById(update);
     }
 
+    public ResultVo<String> getUserSeal(String code) {
+        CaData.MobileApp app = caData.getMobileApp();
+
+        JSONObject json = new JSONObject();
+        json.putOnce("appId", app.getAppId());
+        json.putOnce("id", code);
+        json.putOnce("dealBack", "1");
+
+        String sign = StrUtil.format("appId={}&id={}", app.getAppId(), code);
+
+        json.putOnce("sign", CaUtils.getSign(app.getPrivatekey(), sign));
+
+        String execute = Forest
+                .post(app.getUrl() + "/v1/user/seal")
+                .bodyType(ForestDataType.FORM)
+                .addBody(json).execute(String.class);
+
+        JSONObject rst = JSONUtil.toBean(execute, JSONObject.class);
+        log.info("获取图片:{}", rst);
+        if ("success".equals(rst.getStr("ret"))) {
+            // 带有绿色的背景色
+//            String seal = URLUtil.decode(rst.getByPath("data.seal", String.class));
+            // 透明白色
+            String scaleSeal = URLUtil.decode(rst.getByPath("data.scaleSeal", String.class));
+            byte[] s = Base64.decode(scaleSeal);
+            String createFilePath = StrUtil.format("{}/{}/doctorSignature/{}.png", archiveConfig.getPath(), "archive", code);
+            FileUtil.writeBytes(s, createFilePath);
+            return R.ok(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
+        }
+        return R.fail(ExceptionEnum.LOGICAL_ERROR, "获取失败" + URLUtil.decode(rst.getStr("msg")));
+    }
+
 
 }

+ 0 - 4
src/main/java/thyyxxk/webserver/service/crbmanagement/CrbUpdateByEmr.java

@@ -2,8 +2,6 @@ package thyyxxk.webserver.service.crbmanagement;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
-import cn.hutool.json.JSONConfig;
-import cn.hutool.json.JSONUtil;
 import com.dtflys.forest.Forest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -26,7 +24,6 @@ import thyyxxk.webserver.service.hutoolcache.UserCache;
 import thyyxxk.webserver.utils.DateUtil;
 import thyyxxk.webserver.utils.EmrJsonUtils2;
 
-import javax.annotation.PostConstruct;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -83,7 +80,6 @@ public class CrbUpdateByEmr {
         } catch (Exception e) {
             log.error("传染病结上传获取数据失败:{}", patNo, e);
         }
-
     }
 
 

+ 5 - 1
src/main/java/thyyxxk/webserver/service/inpatient/casefrontsheet/CaseFrontSheetMainService.java

@@ -614,7 +614,11 @@ public class CaseFrontSheetMainService {
                     continue;
                 }
                 String opdate = oprtItem.getJSONObject("手术日期").getString("value");
-                JSONArray oprtorArr = oprtItem.getJSONObject("术者").getJSONArray("value");
+                JSONObject optorObj = oprtItem.getJSONObject("术者");
+                JSONArray oprtorArr = null;
+                if (null != optorObj) {
+                    oprtorArr = optorObj.getJSONArray("value");
+                }
                 JSONObject oprtor = null == oprtorArr ? new JSONObject() : oprtorArr.getJSONObject(0);
 
                 JSONObject assis1 = new JSONObject();

+ 8 - 6
src/main/java/thyyxxk/webserver/service/inpatient/xmlr/XiangMuLuRuService.java

@@ -1020,7 +1020,7 @@ public class XiangMuLuRuService {
         if (patInfo == null) {
             return R.ok(ExceptionEnum.LOGICAL_ERROR, "患者信息不存在");
         }
-        BigDecimal[] orders = publicServer.getActOrderNo(params.getOrderList().size());
+        List<BigDecimal> orders = publicServer.getActOrderNo(params.getOrderList().size());
         List<BigDecimal> execute = transactionTemplate.execute(status -> {
             try {
                 return createOrder(patInfo, params, orders);
@@ -1032,15 +1032,17 @@ public class XiangMuLuRuService {
         return R.ok(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "生成医嘱成功。", execute);
     }
 
-    public List<BigDecimal> createOrder(XinZhenYiZhu patInfo, SaveOrderReq params, BigDecimal[] orders) {
-        AtomicReference<BigDecimal> order = new AtomicReference<>(orders[0]);
+    public List<BigDecimal> createOrder(XinZhenYiZhu patInfo, SaveOrderReq params, List<BigDecimal> orders) {
         List<BigDecimal> orderList = new ArrayList<>();
         String userCode = TokenUtil.getInstance().getTokenUserId();
+        AtomicReference<Integer> index = new AtomicReference<>(0);
+
         ListUtil.batchList(params.getOrderList(), XiangMuLuRuDao.class, (mapper, item) -> {
-            order.set(order.get().add(BigDecimal.ONE));
-            orderList.add(order.get());
-            item.setActOrderNo(order.get());
+            BigDecimal order = orders.get(index.get());
+            orderList.add(order);
+            item.setActOrderNo(order);
             mapper.addOrder(patInfo, item, params.getDoctorCode(), userCode);
+            index.set(index.get() + 1);
         });
         return orderList;
     }

+ 2 - 0
src/main/java/thyyxxk/webserver/service/medicalinsurance/SiZyService.java

@@ -144,6 +144,8 @@ public class SiZyService {
             String mdtrtId = output.getJSONObject("result").getString("mdtrt_id");
             p.setMdtrtId(mdtrtId);
             p.setAdmRegMsgid(input.getString("msgid"));
+            p.setMdtrtCertType(admMdtrtinfo.getMdtrtCertType());
+            p.setMdtrtCertNo(admMdtrtinfo.getMdtrtCertNo());
             dao.afterAdmissRegister(p);
             String restype = dao.selectResponceType(admMdtrtinfo.getMedType());
             dao.updateResponceType(restype, admMdtrtinfo.getMedType(), p.getInpatientNo(), p.getAdmissTimes(), p.getLedgerSn());

+ 2 - 2
src/main/java/thyyxxk/webserver/service/medicalinsurance/impl/ZyYbData.java

@@ -63,7 +63,7 @@ public class ZyYbData implements ZyOrJzYbData {
     @Override
     public PreSetlmt getPreSetlmt(ZyPatientInfo zyptnt) {
         PreSetlmt preSetlmt = dao.selectPreSetlmt(zyptnt.getInpatientNo(), zyptnt.getAdmissTimes(),
-                zyptnt.getLedgerSn(), DateUtil.getTodayEndTime());
+                zyptnt.getLedgerSn(), new Date());
         if (null == preSetlmt || StringUtil.isBlank(preSetlmt.getMdtrtId())) {
             throw new BizException(ExceptionEnum.LOGICAL_ERROR, "此患者没有有效的医保在院信息!");
         }
@@ -106,7 +106,7 @@ public class ZyYbData implements ZyOrJzYbData {
                     zyptnt.getLedgerSn(), zyptnt.getYbRegisterDate(), zyptnt.getZjdzDatetime());
         } else {
             setlmt = dao.selectPreSetlmt(zyptnt.getInpatientNo(), zyptnt.getAdmissTimes(),
-                    zyptnt.getLedgerSn(), "2999-12-31 23:59:59.999");
+                    zyptnt.getLedgerSn(), new Date());
         }
         if (null == setlmt || StringUtil.isBlank(setlmt.getMdtrtId())) {
             throw new BizException(ExceptionEnum.LOGICAL_ERROR, "此患者没有有效的医保在院信息!");

+ 32 - 17
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/YiZhuLuRuServer.java

@@ -1,6 +1,7 @@
 package thyyxxk.webserver.service.zhuyuanyisheng;
 
 import cn.hutool.core.map.BiMap;
+import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SecureUtil;
 import cn.hutool.db.DbUtil;
@@ -300,6 +301,7 @@ public class YiZhuLuRuServer {
             sqlSession.close();
         }
         drgOrderUpdate(patInfo.getInpatientNo() + "_" + patInfo.getAdmissTimes() + "_" + patInfo.getLedgerSn());
+
         sendAMessageToTheNurse(param, userCode, patInfo, "新增医嘱");
 
         List<BigDecimal> orders = yiZhuList.stream().map(XinZhenYzActOrder::getActOrderNo).collect(Collectors.toList());
@@ -350,16 +352,18 @@ public class YiZhuLuRuServer {
     }
 
     private void sendAMessageToTheNurse(XinZhenYiZhu param, String inputCode, XinZhenYiZhu patInfo, String name) {
-        List<String> content = new ArrayList<>();
-        for (XinZhenYzActOrder item : param.getList()) {
-            String sb = notificationStyle("医嘱名", "409eff", item.getOrderName()) +
-                        notificationStyle("医嘱时间", "409eff", DateUtil.formatDatetime(item.getStartTime())) +
-                        notificationStyle("床位", "409eff", patInfo.getBedNo()) +
-                        notificationStyle("患者姓名", "409eff", patInfo.getName()) +
-                        notificationStyle("频次", "409eff", item.getFrequCode());
-            content.add(sb);
-        }
-        publicServer.faSongXiaoXi(patInfo, content, name, inputCode);
+        ThreadUtil.execute(() -> {
+            List<String> content = new ArrayList<>();
+            for (XinZhenYzActOrder item : param.getList()) {
+                String sb = notificationStyle("医嘱名", "409eff", item.getOrderName()) +
+                            notificationStyle("医嘱时间", "409eff", DateUtil.formatDatetime(item.getStartTime())) +
+                            notificationStyle("床位", "409eff", patInfo.getBedNo()) +
+                            notificationStyle("患者姓名", "409eff", patInfo.getName()) +
+                            notificationStyle("频次", "409eff", item.getFrequCode());
+                content.add(sb);
+            }
+            publicServer.faSongXiaoXi(patInfo, content, name, inputCode);
+        });
     }
 
     private String notificationStyle(String name, String color, String content) {
@@ -1607,10 +1611,10 @@ public class YiZhuLuRuServer {
         if (xinZhenYzActOrders == null) {
             return R.fail(ExceptionEnum.ERROR_EL_MESSAGE, "未找到相关数据");
         }
-        BigDecimal[] actOrderNo = publicServer.getActOrderNo(xinZhenYzActOrders.size());
+        List<BigDecimal> actOrderNo = publicServer.getActOrderNo(xinZhenYzActOrders.size());
         List<BigDecimal> execute = transactionTemplate.execute(status -> {
             try {
-                return createOnceOrder(xinZhenYzActOrders, actOrderNo[0]);
+                return createOnceOrder(xinZhenYzActOrders, actOrderNo);
             } catch (Exception e) {
                 status.setRollbackOnly();
                 throw e;
@@ -1622,14 +1626,15 @@ public class YiZhuLuRuServer {
         return R.ok(js);
     }
 
-    private List<BigDecimal> createOnceOrder(List<XinZhenYzActOrder> orderList, BigDecimal orderNo) {
+    private List<BigDecimal> createOnceOrder(List<XinZhenYzActOrder> orderList, List<BigDecimal> orderNo) {
         BiMap<BigDecimal, BigDecimal> map = new BiMap<>(new HashMap<>());
-        AtomicReference<BigDecimal> startOrderNo = new AtomicReference<>(orderNo);
+        AtomicReference<Integer> index = new AtomicReference<>(0);
         List<BigDecimal> rst = new ArrayList<>();
         orderList.forEach(item -> {
-            startOrderNo.set(startOrderNo.get().add(BigDecimal.ONE));
-            map.put(item.getActOrderNo(), startOrderNo.get());
-            item.setActOrderNo(startOrderNo.get());
+            BigDecimal order = orderNo.get(index.get());
+            map.put(item.getActOrderNo(), order);
+            item.setActOrderNo(order);
+            index.set(index.get() + 1);
         });
         ListUtil.batchList(orderList, YiZhuLuRuDao.class, (mapper, item) -> {
             if (item.getParentNo() != null) {
@@ -1642,4 +1647,14 @@ public class YiZhuLuRuServer {
         });
         return rst;
     }
+
+/**
+ * 更新患者就诊方式的方法
+ * @param patNo 患者编号,用于唯一标识一位患者
+ * @param type 就诊类型,表示患者的就诊方式或类型
+ */
+    public void updateZyDisWay(String patNo, String type) {
+
+    }
+
 }

+ 1 - 1
src/main/java/thyyxxk/webserver/service/zygl/ZyActpatientService.java

@@ -338,7 +338,7 @@ public class ZyActpatientService {
             throw new BizException(ExceptionEnum.LOGICAL_ERROR,"预交金已经产生费用,不能删除,若要删除,请先预交金退费!");
         }
         BigDecimal zyTotalFee = zyDetailChargeDao.selectSumChargeFee(param.getInpatientNo(), zyActpatient.getAdmissTimes());
-        if(zyTotalFee != null && totalFee.compareTo(BigDecimal.ZERO) != 0){
+        if(zyTotalFee != null && zyTotalFee.compareTo(BigDecimal.ZERO) != 0){
             throw new BizException(ExceptionEnum.LOGICAL_ERROR,"已经产生住院费用,不能删除,若要删除,请先退费!");
         }
 

+ 1 - 1
src/main/resources/application-dev.yml

@@ -194,7 +194,7 @@ thyy:
   #      url: http://47.100.199.230:8080/pdfsign_hw
   #      return-url: "https://emr.hnthyy.cn:9222/caTest/casign/hBoardSignReturnUrl"
   apiurl:
-    socket-api: http://demo.hnthyy.cn:20922/thyy/api/socket
+    socket-api: http://localhost:20922/thyy/api/socket
     scheduled-api: http://172.16.32.133:21702/thyy/scheduled/api
     thirdpart-api: http://172.16.32.160:21701/thyy/thirdpart/api
     emr-editor-template-url: "http://webhis.thyy.cn:9281/"

+ 3 - 0
update/2025-10-17.md

@@ -0,0 +1,3 @@
+```sql
+alter table t_si_pat_info add mdtrt_cert_type varchar(2),mdtrt_cert_no varchar(128),update_time datetime
+```