Sfoglia il codice sorgente

优化医生开方+药师审核处方

cgp 1 giorno fa
parent
commit
c7e7ada297

+ 49 - 2
java/fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -238,7 +238,7 @@ public class PrescribeController extends  AppBaseController {
             prescribe.setRecordPic(inquiryOrder.getImgs());
             prescribe.setDiagnose(prescribe.getDiagnose());
             prescribe.setDoctorId(inquiryOrder.getDoctorId());
-            prescribe.setStatus(0);
+            prescribe.setStatus(1);
             prescribe.setUsageJson(prescribe.getUsageJson());
             prescribe.setCycle(doctorPrescribe.getCycle());
             prescribe.setRemark(prescribe.getRemark());
@@ -348,7 +348,8 @@ public class PrescribeController extends  AppBaseController {
         prescribe.setDiagnose(param.getDiagnose());
         prescribe.setPatientName(param.getPatientName());
         prescribe.setPrescribeType(param.getPrescribeType());
-        prescribe.setStatus(0); // 待审核
+        prescribe.setPrescribeCode(OrderCodeUtils.getOrderSn());
+        prescribe.setStatus(1); // 待审核
         prescribe.setCreateTime(new Date());
         if (prescribeService.insertFsPrescribe(prescribe) > 0) {
             for (FsPrescribeDrug drug : param.getDrugs()) {
@@ -359,6 +360,52 @@ public class PrescribeController extends  AppBaseController {
         }
         return R.error("保存失败");
     }
+
+    @Login
+    @ApiOperation("医生开方(对待开方记录填写处方,提交进入药师审核)")
+    @Transactional
+    @PostMapping("/openPrescribe")
+    public R openPrescribe(@RequestBody FsPrescribeOpenParam param) {
+        if (param.getPrescribeId() == null) {
+            return R.error("处方ID不能为空");
+        }
+        if (StringUtils.isEmpty(param.getDiagnose())) {
+            return R.error("请填写诊断/医嘱");
+        }
+        if (param.getDrugs() == null || param.getDrugs().isEmpty()) {
+            return R.error("请选择药品");
+        }
+        FsPrescribe prescribe = prescribeService.selectFsPrescribeByPrescribeId(param.getPrescribeId());
+        if (prescribe == null) {
+            return R.error("处方不存在");
+        }
+        // 仅待开方(0)可开方(驳回后回到待开方0,同样走这里重新开方)
+        if (!Integer.valueOf(0).equals(prescribe.getStatus())) {
+            return R.error("当前处方状态不允许开方");
+        }
+        if (!Long.valueOf(getDoctorId()).equals(prescribe.getDoctorId())) {
+            return R.error("非法操作");
+        }
+        FsPrescribe update = new FsPrescribe();
+        update.setPrescribeId(param.getPrescribeId());
+        update.setDiagnose(param.getDiagnose());
+        update.setStatus(1); // 待审核
+        update.setAuditReason(""); // 清空上次驳回原因
+        prescribeService.updateFsPrescribe(update);
+        // 药品:先删后插
+        FsPrescribeDrug queryDrug = new FsPrescribeDrug();
+        queryDrug.setPrescribeId(param.getPrescribeId());
+        List<FsPrescribeDrug> existDrugs = prescribeDrugService.selectFsPrescribeDrugList(queryDrug);
+        if (existDrugs != null && !existDrugs.isEmpty()) {
+            Long[] drugIds = existDrugs.stream().map(FsPrescribeDrug::getDrugId).toArray(Long[]::new);
+            prescribeDrugService.deleteFsPrescribeDrugByDrugIds(drugIds);
+        }
+        for (FsPrescribeDrug drug : param.getDrugs()) {
+            drug.setPrescribeId(param.getPrescribeId());
+            prescribeDrugService.insertFsPrescribeDrug(drug);
+        }
+        return R.ok("开方成功");
+    }
     @PostMapping("/test")
     public R test(@RequestBody HashMap<String,String> map) throws JsonProcessingException {
         ObjectMapper objectMapper = new ObjectMapper();

+ 2 - 2
java/fs-pharmacist-app/src/main/java/com/fs/app/controller/PrescribeAuditController.java

@@ -48,7 +48,7 @@ public class PrescribeAuditController extends AppBaseController {
     }
 
     /**
-     * 已审核处方列表(历史
+     * 已审核处方列表(通过
      */
     @Login
     @ApiOperation("已审核处方列表")
@@ -56,7 +56,7 @@ public class PrescribeAuditController extends AppBaseController {
     public R audited(FsPrescribeListDParam param, HttpServletRequest request) {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         param.setType(2);
-        param.setStatus(2); // 历史
+        param.setStatus(2); // 已审核(通过)
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsPrescribeListDVO> list = prescribeService.selectFsPrescribeListDVO(param);
         return R.ok().put("data", new PageInfo<>(list));

+ 1 - 1
java/fs-pharmacist-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -238,7 +238,7 @@ public class PrescribeController extends  AppBaseController {
             prescribe.setRecordPic(inquiryOrder.getImgs());
             prescribe.setDiagnose(prescribe.getDiagnose());
             prescribe.setDoctorId(inquiryOrder.getDoctorId());
-            prescribe.setStatus(0);
+            prescribe.setStatus(1);
             prescribe.setUsageJson(prescribe.getUsageJson());
             prescribe.setCycle(doctorPrescribe.getCycle());
             prescribe.setRemark(prescribe.getRemark());

+ 2 - 2
java/fs-service/src/main/java/com/fs/his/domain/FsPrescribe.java

@@ -126,8 +126,8 @@ public class FsPrescribe extends BaseEntity
     @Excel(name = "药师ID")
     private Long drugDoctorId;
 
-    /** 状态 0未开 1已开 */
-    @Excel(name = "状态 0未开 1已开")
+    /** 状态 0待开方 1待审核 2通过 -1拒方 -2取消 */
+    @Excel(name = "状态 0待开方 1待审核 2通过 -1拒方 -2取消")
     private Integer status;
 
     @Excel(name = "使用方法")

+ 2 - 2
java/fs-service/src/main/java/com/fs/his/mapper/FsPrescribeMapper.java

@@ -110,10 +110,10 @@ public interface FsPrescribeMapper
             "and p.doctor_id = #{maps.doctorId} " +
             "</if>" +
             "<if test = ' maps.type==2 and maps.status != null and maps.status == 1  '> " +
-            "and p.status = 0 " +
+            "and p.status = 1 " +
             "</if>" +
             "<if test = ' maps.type==2 and maps.status != null and maps.status == 2  '> " +
-            "and (p.status = 1 || p.status = 2) and p.drug_doctor_id = #{maps.doctorId} " +
+            "and p.status = 2 and p.drug_doctor_id = #{maps.doctorId} " +
             "</if>" +
             "<if test=' maps.beginTime != null and maps.beginTime != \"\" '>" +
             "AND date_format(p.create_time,'%y%m%d') &gt;= date_format(#{maps.beginTime},'%y%m%d')  " +

+ 1 - 1
java/fs-service/src/main/java/com/fs/his/param/FsPrescribeAuditParam.java

@@ -8,7 +8,7 @@ import java.io.Serializable;
 public class FsPrescribeAuditParam extends BaseParam implements Serializable {
     private Long prescribeId;
     Long doctorId;
-    Integer status;//1通过 2通过
+    Integer status;//2通过 0驳回(回到待开方)
     String auditReason;//拒绝原因
 
 }

+ 1 - 1
java/fs-service/src/main/java/com/fs/his/param/FsPrescribeListDParam.java

@@ -12,7 +12,7 @@ import java.util.Map;
 public class FsPrescribeListDParam extends BaseParam implements Serializable {
     Long doctorId;
     Long doctorDrugId;
-    Integer status;//1待审核 2历史订单
+    Integer status;//列表筛选状态(医生待开方0 / 药师待审核1 / 药师已审核2)
     Integer type;//1医生 2药师
     String patientName;
     String prescribeCode;

+ 11 - 10
java/fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java

@@ -490,7 +490,7 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         fsPrescribe.setPrescribeType(fsPackage.getProductType());
         fsPrescribe.setRecipeType(fsPackage.getRecipeType());
         fsPrescribe.setStoreId(fsPackage.getStoreId());
-        fsPrescribe.setStatus(1);
+        fsPrescribe.setStatus(2);
         fsPrescribe.setIcdCode(fsPackage.getIcdCode());
         fsPrescribe.setAuditTime(DateUtils.getNowDate());
         fsPrescribe.setCreateTime(DateUtils.getNowDate());
@@ -902,7 +902,7 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
             Long id = doctorMapper.selectFsDoctorType2Ids(fsPrescribe.getPrescribeType());
             FsPrescribeAuditParam param=new FsPrescribeAuditParam();
             param.setDoctorId(id);
-            param.setStatus(1);
+            param.setStatus(2);
             param.setPrescribeId(fsPrescribe.getPrescribeId());
             audit(param);
         }
@@ -912,7 +912,7 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
     @Transactional
     public R audit(FsPrescribeAuditParam param){
         FsPrescribe prescribe=this.selectFsPrescribeByPrescribeId(param.getPrescribeId());
-        if(prescribe.getStatus()!=0){
+        if(prescribe.getStatus()!=1){
             return R.error("非法操作");
         }
         FsPrescribe map=new FsPrescribe();
@@ -922,12 +922,13 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         map.setAuditReason(param.getAuditReason());
         map.setAuditTime(new Date());
         FsDoctor doctor=doctorService.selectFsDoctorByDoctorId(map.getDrugDoctorId());
-        if(StringUtils.isNotEmpty(doctor.getSignUrl())){
+        if(doctor!=null&&StringUtils.isNotEmpty(doctor.getSignUrl())){
             map.setDrugDoctorSignUrl(doctor.getSignUrl());
         }
-        if(param.getStatus().equals(1)){
-            this.updateFsPrescribe(map);
-            //写入订单
+        // 通过(2)/驳回(0回到待开方)都持久化审核结果
+        this.updateFsPrescribe(map);
+        if(param.getStatus().equals(2) && prescribe.getInquiryOrderId()!=null){
+            //写入订单(问诊单处方通过后生成门店订单;简化开方无问诊单则跳过)
             storeOrderService.createOrder(prescribe.getPrescribeId());
             //发送信息
             String orderId=prescribe.getInquiryOrderId().toString();
@@ -1022,8 +1023,8 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
 
     /**
      * 取消处方
-     * 仅允许 status=0 待审 / status=1 已审通过(未调剂) 时取消
-     * 已审通过且已生成门店订单的,同步取消门店订单
+     * 仅允许 status=0 待开方 / status=1 待审核 时取消
+     * 已生成门店订单的,同步取消门店订单
      */
     @Override
     @Transactional
@@ -1038,7 +1039,7 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         }
         FsPrescribe map = new FsPrescribe();
         map.setPrescribeId(prescribe.getPrescribeId());
-        map.setStatus(-1);
+        map.setStatus(-2);
         map.setAuditReason(param.getReason());
         this.updateFsPrescribe(map);
         // 已生成门店订单的同步取消

+ 1 - 1
java/fs-service/src/main/java/com/fs/his/vo/FsPrescribeListDVO.java

@@ -43,7 +43,7 @@ public class FsPrescribeListDVO implements Serializable {
     private String diagnose;
 
 
-    /** 状态 0未开 1已开 */
+    /** 状态 0待开方 1待审核 2通过 -1拒方 -2取消 */
     private Integer status;
 
     /** 审核时间 */

+ 19 - 0
ylrz-doctorui/src/api/patient.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 患者列表
+export function getPatientList(query) {
+  return request({
+    url: '/app/patient/getPatientList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 患者详情
+export function getPatientByPatientId(patientId) {
+  return request({
+    url: '/app/patient/getPatientByPatientId',
+    method: 'get',
+    params: { patientId }
+  })
+}

+ 9 - 0
ylrz-doctorui/src/api/prescribe.js

@@ -89,3 +89,12 @@ export function savePrescribe(data) {
     data
   })
 }
+
+// 医生开方(对待开方记录填写处方,提交进入药师审核)
+export function openPrescribe(data) {
+  return request({
+    url: '/app/prescribe/openPrescribe',
+    method: 'post',
+    data
+  })
+}

+ 99 - 6
ylrz-doctorui/src/views/electronicPrescribe/prescribe/index.vue

@@ -1,6 +1,5 @@
 <template>
   <div class="app-container">
-
     <el-table v-loading="loading" :data="list">
       <el-table-column label="处方编号" prop="prescribeCode" min-width="160" />
       <el-table-column label="患者" prop="patientName" width="100" />
@@ -12,8 +11,9 @@
       </el-table-column>
       <el-table-column label="审核意见" prop="auditReason" show-overflow-tooltip />
       <el-table-column label="创建时间" prop="createTime" width="160" />
-      <el-table-column label="操作" width="100" align="center">
+      <el-table-column label="操作" width="150" align="center">
         <template slot-scope="scope">
+          <el-button v-if="scope.row.status === 0" size="mini" type="primary" @click="handleOpen(scope.row)">开方</el-button>
           <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row)">查看</el-button>
         </template>
       </el-table-column>
@@ -21,6 +21,7 @@
 
     <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
 
+    <!-- 处方详情 -->
     <el-dialog title="处方详情" :visible.sync="detailOpen" width="640px" append-to-body>
       <el-descriptions :column="2" border>
         <el-descriptions-item label="处方编号">{{ detail.prescribe ? detail.prescribe.prescribeCode : '' }}</el-descriptions-item>
@@ -37,11 +38,61 @@
         <el-table-column label="医嘱" prop="instructions" />
       </el-table>
     </el-dialog>
+
+    <!-- 开方 -->
+    <el-dialog title="开方" :visible.sync="openForm.open" width="820px" append-to-body :close-on-click-modal="false">
+      <el-form label-width="90px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="患者姓名">
+              <el-input :value="currentRow.patientName" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="诊断/医嘱">
+          <el-input v-model="openForm.diagnose" type="textarea" :rows="2" placeholder="请输入诊断/医嘱" />
+        </el-form-item>
+      </el-form>
+
+      <div style="margin-bottom: 8px;">
+        <el-button type="primary" icon="el-icon-plus" size="small" @click="handleAddDrug">新增药品</el-button>
+      </div>
+      <el-table :data="openForm.drugs" border>
+        <el-table-column label="药品名称" prop="drugName" min-width="140">
+          <template slot-scope="scope"><el-input v-model="scope.row.drugName" size="small" placeholder="药品名称" /></template>
+        </el-table-column>
+        <el-table-column label="规格" prop="drugSpec" width="110">
+          <template slot-scope="scope"><el-input v-model="scope.row.drugSpec" size="small" placeholder="规格" /></template>
+        </el-table-column>
+        <el-table-column label="用法" prop="usageMethod" width="100">
+          <template slot-scope="scope"><el-input v-model="scope.row.usageMethod" size="small" placeholder="用法" /></template>
+        </el-table-column>
+        <el-table-column label="频次" prop="usageFrequencyUnit" width="90">
+          <template slot-scope="scope"><el-input v-model="scope.row.usageFrequencyUnit" size="small" placeholder="频次" /></template>
+        </el-table-column>
+        <el-table-column label="每次用量" prop="usagePerUseCount" width="90">
+          <template slot-scope="scope"><el-input v-model="scope.row.usagePerUseCount" size="small" placeholder="每次用量" /></template>
+        </el-table-column>
+        <el-table-column label="数量" prop="drugNum" width="80">
+          <template slot-scope="scope"><el-input v-model="scope.row.drugNum" size="small" placeholder="数量" /></template>
+        </el-table-column>
+        <el-table-column label="操作" width="60" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" icon="el-icon-delete" @click="handleDeleteDrug(scope.$index)" />
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div slot="footer">
+        <el-button @click="openForm.open = false">取消</el-button>
+        <el-button type="primary" @click="submitOpen">提交开方</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { getPrescribeList, getPrescribe } from '@/api/prescribe'
+import { getPrescribeList, getPrescribe, openPrescribe } from '@/api/prescribe'
 
 export default {
   name: 'PrescribeList',
@@ -52,7 +103,13 @@ export default {
       total: 0,
       queryParams: { pageNum: 1, pageSize: 10, type: 1 },
       detailOpen: false,
-      detail: { prescribe: {}, drugs: [] }
+      detail: { prescribe: {}, drugs: [] },
+      currentRow: {},
+      openForm: {
+        open: false,
+        diagnose: '',
+        drugs: []
+      }
     }
   },
   created() {
@@ -73,12 +130,48 @@ export default {
         this.detailOpen = true
       })
     },
+    handleOpen(row) {
+      this.currentRow = row
+      this.openForm = { open: true, diagnose: row.diagnose || '', drugs: [] }
+    },
+    handleAddDrug() {
+      this.openForm.drugs.push({
+        drugName: '',
+        drugSpec: '',
+        usageMethod: '',
+        usageFrequencyUnit: '',
+        usagePerUseCount: '',
+        drugNum: 1
+      })
+    },
+    handleDeleteDrug(index) {
+      this.openForm.drugs.splice(index, 1)
+    },
+    submitOpen() {
+      if (!this.openForm.diagnose) {
+        this.$message.warning('请填写诊断/医嘱')
+        return
+      }
+      if (this.openForm.drugs.length === 0) {
+        this.$message.warning('请至少添加一种药品')
+        return
+      }
+      openPrescribe({
+        prescribeId: this.currentRow.prescribeId,
+        diagnose: this.openForm.diagnose,
+        drugs: this.openForm.drugs
+      }).then(() => {
+        this.$message.success('开方成功,已进入待审核')
+        this.openForm.open = false
+        this.getList()
+      })
+    },
     statusText(status) {
-      const map = { 0: '待审核', 1: '已通过', 2: '已驳回', 3: '调剂中', 4: '调剂完成', 5: '已发药' }
+      const map = { 0: '待开方', 1: '待审核', 2: '已通过', '-1': '已拒方', '-2': '已取消' }
       return map[status] || '未知'
     },
     statusType(status) {
-      const map = { 0: 'warning', 1: 'success', 2: 'danger', 3: 'info', 4: 'info', 5: 'success' }
+      const map = { 0: 'warning', 1: 'warning', 2: 'success', '-1': 'danger', '-2': 'info' }
       return map[status] || 'info'
     }
   }

+ 16 - 12
ylrz-doctorui/src/views/electronicPrescribe/prescribeAudit/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="app-container">
     <el-tabs v-model="activeTab" @tab-click="handleTab">
-      <el-tab-pane label="待审核" name="0" />
-      <el-tab-pane label="已审核" name="1" />
+      <el-tab-pane label="待审核" name="1" />
+      <el-tab-pane label="已审核" name="2" />
     </el-tabs>
 
     <el-table v-loading="loading" :data="list">
@@ -11,15 +11,15 @@
       <el-table-column label="诊断" prop="diagnose" show-overflow-tooltip />
       <el-table-column label="状态" width="100" align="center">
         <template slot-scope="scope">
-          <el-tag v-if="scope.row.status === 0" type="warning">待审核</el-tag>
-          <el-tag v-else-if="scope.row.status === 1" type="success">已通过</el-tag>
-          <el-tag v-else type="danger">已驳回</el-tag>
+          <el-tag v-if="scope.row.status === 1" type="warning">待审核</el-tag>
+          <el-tag v-else-if="scope.row.status === 2" type="success">已通过</el-tag>
+          <el-tag v-else type="info">{{ statusText(scope.row.status) }}</el-tag>
         </template>
       </el-table-column>
       <el-table-column label="驳回原因" prop="auditReason" show-overflow-tooltip />
       <el-table-column label="操作" width="120" align="center">
         <template slot-scope="scope">
-          <el-button v-if="scope.row.status === 0" size="mini" type="primary" @click="handleAudit(scope.row)">审核</el-button>
+          <el-button v-if="scope.row.status === 1" size="mini" type="primary" @click="handleAudit(scope.row)">审核</el-button>
           <el-button v-else size="mini" type="text" @click="handleView(scope.row)">查看</el-button>
         </template>
       </el-table-column>
@@ -48,8 +48,8 @@
       </el-form>
       <div slot="footer">
         <el-button type="danger" @click="auditMode = 'reject'">驳回</el-button>
-        <el-button type="success" @click="doAudit(1)">通过</el-button>
-        <el-button v-if="auditMode === 'reject'" type="warning" @click="doAudit(2)">确认驳回</el-button>
+        <el-button type="success" @click="doAudit(2)">通过</el-button>
+        <el-button v-if="auditMode === 'reject'" type="warning" @click="doAudit(0)">确认驳回</el-button>
         <el-button @click="auditOpen = false">关闭</el-button>
       </div>
     </el-dialog>
@@ -64,10 +64,10 @@ export default {
   data() {
     return {
       loading: false,
-      activeTab: '0',
+      activeTab: '1',
       list: [],
       total: 0,
-      queryParams: { pageNum: 1, pageSize: 10, type: 2, status: 0 },
+      queryParams: { pageNum: 1, pageSize: 10, type: 2, status: 1 },
       auditOpen: false,
       auditMode: '',
       auditReason: '',
@@ -110,7 +110,7 @@ export default {
       })
     },
     doAudit(status) {
-      if (status === 2 && !this.auditReason) {
+      if (status === 0 && !this.auditReason) {
         this.$message.warning('请填写驳回原因')
         return
       }
@@ -119,10 +119,14 @@ export default {
         status,
         auditReason: this.auditReason
       }).then(() => {
-        this.$message.success(status === 1 ? '审核通过' : '已驳回')
+        this.$message.success(status === 2 ? '审核通过' : '已驳回')
         this.auditOpen = false
         this.getList()
       })
+    },
+    statusText(status) {
+      const map = { 0: '待开方', 1: '待审核', 2: '已通过', '-1': '已拒方', '-2': '已取消' }
+      return map[status] || '未知'
     }
   }
 }

+ 141 - 5
ylrz-doctorui/src/views/patient/patientRecord/index.vue

@@ -1,11 +1,147 @@
-<script setup>
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="患者姓名" prop="patientName">
+        <el-input
+          v-model="queryParams.patientName"
+          placeholder="请输入患者姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="性别" prop="sex">
+        <el-select v-model="queryParams.sex" placeholder="性别" clearable size="small">
+          <el-option label="男" value="0" />
+          <el-option label="女" value="1" />
+          <el-option label="未知" value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="手机号" prop="mobile">
+        <el-input
+          v-model="queryParams.mobile"
+          placeholder="请输入手机号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
 
-</script>
+    <el-table v-loading="loading" border :data="list">
+      <el-table-column label="患者姓名" align="center" prop="patientName" />
+      <el-table-column label="身份证号" align="center" prop="idCard" width="170px" />
+      <el-table-column label="出生年月" align="center" width="110">
+        <template slot-scope="scope">{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</template>
+      </el-table-column>
+      <el-table-column label="性别" align="center" width="60">
+        <template slot-scope="scope">{{ sexText(scope.row.sex) }}</template>
+      </el-table-column>
+      <el-table-column label="体重G" align="center" prop="weight" />
+      <el-table-column label="手机号" align="center" prop="mobile" />
+      <el-table-column label="最近一次问诊时间" align="center" prop="createTime" />
+      <el-table-column label="操作" align="center" width="100">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" @click="handleDetails(scope.row)">详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
 
-<template>
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
 
+    <el-drawer :with-header="false" size="75%" :visible.sync="drawer.open">
+      <div style="padding: 20px; background-color: #fff;">
+        <h3 style="margin: 0;">患者详情</h3>
+      </div>
+      <div v-if="detail" class="my-content">
+        <div class="my-title">患者信息</div>
+        <el-descriptions :column="3" border>
+          <el-descriptions-item label="患者姓名">{{ detail.patientName }}</el-descriptions-item>
+          <el-descriptions-item label="身份证号">{{ detail.idCard }}</el-descriptions-item>
+          <el-descriptions-item label="出生年月">{{ detail.birthday }}</el-descriptions-item>
+          <el-descriptions-item label="性别">{{ sexText(detail.sex) }}</el-descriptions-item>
+          <el-descriptions-item label="手机号">{{ detail.mobile }}</el-descriptions-item>
+          <el-descriptions-item label="体重G">{{ detail.weight }}</el-descriptions-item>
+          <el-descriptions-item label="创建时间">{{ detail.createTime }}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+    </el-drawer>
+  </div>
 </template>
 
-<style scoped>
+<script>
+import { getPatientList, getPatientByPatientId } from '@/api/patient'
+
+export default {
+  name: 'PatientRecord',
+  data() {
+    return {
+      loading: false,
+      list: [],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      drawer: {
+        open: false
+      },
+      detail: null
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      getPatientList(this.queryParams).then(res => {
+        this.list = res.data.list || []
+        this.total = res.data.total || 0
+        this.loading = false
+      })
+    },
+    handleDetails(row) {
+      getPatientByPatientId(row.patientId).then(res => {
+        this.detail = res.data || null
+        this.drawer.open = true
+      })
+    },
+    sexText(sex) {
+      const map = { 0: '男', 1: '女', 2: '未知' }
+      return map[sex] || ''
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    }
+  }
+}
+</script>
 
-</style>
+<style lang="scss" scoped>
+.my-content {
+  background-color: #fff;
+  padding: 20px;
+  margin: 20px;
+  .my-title {
+    margin-bottom: 20px;
+    color: #524b4a;
+    font-weight: bold;
+  }
+}
+</style>