chenying2100 il y a 1 mois
Parent
commit
00b914948d

+ 190 - 0
.specstory/history/2025-07-14_04-02Z-修改-index-vue-以实现宫格按钮样式.md

@@ -1021,7 +1021,197 @@ _**Assistant**_
 
 ```js
 function formatDate(date) {
+  const pad = n => n < 10 ? '0' + n : n;
+  return date.getFullYear() + '-' +
+    pad(date.getMonth() + 1) + '-' +
+    pad(date.getDate()) + ' ' +
+    pad(date.getHours()) + ':' +
+    pad(date.getMinutes()) + ':' +
+    pad(date.getSeconds());
+}
+
+// 用法
+const now = new Date();
+const formatted = formatDate(now);
+console.log(formatted); // 例如:2024-06-09 15:23:45
+```
+
+你也可以直接一行写法:
+```js
+const pad = n => n < 10 ? '0' + n : n;
+const now = new Date();
+const formatted = now.getFullYear() + '-' +
+  pad(now.getMonth() + 1) + '-' +
+  pad(now.getDate()) + ' ' +
+  pad(now.getHours()) + ':' +
+  pad(now.getMinutes()) + ':' +
+  pad(now.getSeconds());
+console.log(formatted);
+```
+
+如需在 Vue/TS/JS 文件中直接用,复制即可!
+
+---
+
+_**User**_
+
+为我创建一个元素被选中的class样式
+
+---
+
+_**Assistant**_
+
+下面是一个常用的“选中”样式 class,你可以直接用于 `.is-checked`:
+
+```css
+.is-checked {
+  background-color: #409EFF;   /* Element Plus 主色 */
+  color: #fff;
+  border: 1.5px solid #409EFF;
+  border-radius: 6px;
+  box-shadow: 0 2px 8px rgba(64,158,255,0.08);
+  transition: background 0.2s, color 0.2s, border 0.2s;
+}
+```
+
+**用法举例:**
+```html
+<div class="custom-radio-cell" :class="{ 'is-checked': isSelected }">内容</div>
+```
+
+你可以将这段 CSS 添加到你的 `<style scoped>` 里,选中时就会高亮显示为主色、白字、带圆角和阴影,视觉效果明显且美观。
+
+如需 hover 效果或其他配色,请告知!
+
+---
+
+_**User**_
+
+营养评估,为我命名表明
+
+---
+
+_**Assistant**_
+
+“营养评估”常用的英文表名命名方式有如下几种,推荐用下划线风格或驼峰风格,具体如下:
+
+### 1. 下划线风格(推荐,常用于MySQL、PostgreSQL等)
+```
+nutrition_assessment
+```
+
+### 2. 驼峰风格(部分NoSQL或部分ORM习惯)
+```
+NutritionAssessment
+```
+
+### 3. 其他常见命名
+- nutrition_evaluation
+- nutrition_screening
+
+---
+
+**推荐表名:**  
+`nutrition_assessment`
+
+如果是多张表,相关表名可以是:
+- nutrition_assessment_result
+- nutrition_assessment_record
+- nutrition_assessment_detail
+
+如需中英文注释或建表SQL示例,请告知!
+
+---
+
+_**User**_
+
+这里为我添加显示图片
+
+---
+
+_**Assistant**_
+
+Cancelled
+
+---
+
+已为你在 `ctl.label` 前添加了图片显示,图片地址为 `ctl.img` 或 `ctl.image`,高度24px,右侧有间距。  
+如需进一步美化或有特殊图片字段名,请告知!
+
+---
+
+_**User**_
+
+请帮我修改css样式,保证在有图片的时候,图片和文字要分开
+
+---
+
+_**Assistant**_
+
+```diff
+                                        <template v-for="ctl,i in item.contentList">
+                                            <el-radio :label="ctl.label" :value="i" :disabled="isView">
+-                                               <span>{{ctl.label }}</span>
+-                                               <span v-if="ctl.img">    
++                                               <span class="option-content">
++                                                   <span v-if="ctl.img" class="option-img">
+                                                        <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true"/>
++                                                   </span>
++                                                   <span>{{ ctl.label }}</span>
+                                                </span>
+                                            </el-radio>
+```
+
+```diff
+                                            <template v-for="ctl,i in item.contentList">
+                                                <el-checkbox :label="ctl.label" :value="i" :disabled="isView">
++                                                   <span class="option-content">
++                                                       <span v-if="ctl.img" class="option-img">
++                                                           <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true" />
++                                                       </span>
+                                                        <span>{{ ctl.label }}</span>
++                                                   </span>
+                                                </el-checkbox>
+                                            </template>
+```
+
+```diff
+                                        <template v-for="ctl,i in item.contentList">
+                                            <el-checkbox :label="ctl.label" :value="i" :disabled="isView">
++                                               <span class="option-content">
++                                                   <span v-if="ctl.img" class="option-img">
++                                                       <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true" />
++                                                   </span>
+                                                    <span>{{ ctl.label }}</span>
++                                               </span>
+                                            </el-checkbox>
+                                        </template>
+```
+
+```diff
+    border-left: none;
+  }
++  
++ .option-content {
++   display: inline-flex;
++   align-items: center;
++ }
++ .option-img {
++   display: inline-block;
++   margin-right: 8px;
++   vertical-align: middle;
++ }
+  </style>
+  
+```
+
+---
+
+已优化图片和文字的样式:  
+- 图片和文字分开显示,图片在左、文字在右,垂直居中,间距美观。  
+- 适用于单选和多选项。
 
+如需进一步调整图片尺寸、间距或其他样式,请随时告知!
 
 ---
 

+ 6 - 9
prompt/info.txt

@@ -1,27 +1,24 @@
-营养筛查
+营养评估
   时间
   看诊类型
   门诊/住院号
-  营养筛查类型
-  营养筛查分数
-  营养筛查结论
+  营养评估类型类型  
   支付状态
   筛查医生/护士
 
 
 
 
--- 营养筛查
+-- 营养评估
 CREATE TABLE `nutrition_screening` (
   `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
   `patient_id` bigint(20) DEFAULT NULL COMMENT '患者ID',
   `config_id` bigint NOT NULL COMMENT '营养筛查类型',
   `screening_time` datetime NOT NULL COMMENT '筛查时间',
   `visit_type` char(1) NOT NULL COMMENT '看诊类型(0门诊 1住院)',
-  `patient_no` varchar(50) NOT NULL COMMENT '门诊/住院号',  
-  `screening_score` decimal(5,2) DEFAULT NULL COMMENT '营养筛查分数',
-  `screening_conclusion` varchar(500) DEFAULT NULL COMMENT '营养筛查结论',
+  `patient_no` varchar(50) NOT NULL COMMENT '门诊/住院号',   
   `payment_status` varchar(20) DEFAULT '未支付' COMMENT '支付状态(未支付/已支付/已退款)',
+  `content` longtext  null comment '内容',
 
   -- 系统字段
   status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
@@ -31,7 +28,7 @@ CREATE TABLE `nutrition_screening` (
   create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
   update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'   
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='营养筛查表';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='营养评估表';
 
 
 

+ 63 - 0
src/api/patients/evaluation/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { EvaluationVO, EvaluationForm, EvaluationQuery } from '@/api/system/evaluation/types';
+
+/**
+ * 查询营养评估列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listEvaluation = (query?: EvaluationQuery): AxiosPromise<EvaluationVO[]> => {
+  return request({
+    url: '/system/evaluation/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询营养评估详细
+ * @param id
+ */
+export const getEvaluation = (id: string | number): AxiosPromise<EvaluationVO> => {
+  return request({
+    url: '/system/evaluation/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增营养评估
+ * @param data
+ */
+export const addEvaluation = (data: EvaluationForm) => {
+  return request({
+    url: '/system/evaluation',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改营养评估
+ * @param data
+ */
+export const updateEvaluation = (data: EvaluationForm) => {
+  return request({
+    url: '/system/evaluation',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除营养评估
+ * @param id
+ */
+export const delEvaluation = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/evaluation/' + id,
+    method: 'delete'
+  });
+};

+ 146 - 0
src/api/patients/evaluation/types.ts

@@ -0,0 +1,146 @@
+export interface EvaluationVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 患者ID
+   */
+  patientId: string | number;
+
+  /**
+   * 营养评估类型
+   */
+  configId: string | number;
+
+  /**
+   * 筛查时间
+   */
+  screeningTime: string;
+
+  /**
+   * 看诊类型(0门诊 1住院)
+   */
+  visitType: string;
+
+  /**
+   * 门诊/住院号
+   */
+  patientNo: string;
+
+  /**
+   * 支付状态(未支付/已支付/已退款)
+   */
+  paymentStatus: string;
+
+  /**
+   * 内容
+   */
+  content: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+}
+
+export interface EvaluationForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 患者ID
+   */
+  patientId?: string | number;
+
+  /**
+   * 营养评估类型
+   */
+  configId?: string | number;
+
+  /**
+   * 筛查时间
+   */
+  screeningTime?: string;
+
+  /**
+   * 看诊类型(0门诊 1住院)
+   */
+  visitType?: string;
+
+  /**
+   * 门诊/住院号
+   */
+  patientNo?: string;
+
+  /**
+   * 支付状态(未支付/已支付/已退款)
+   */
+  paymentStatus?: string;
+
+  /**
+   * 内容
+   */
+  content?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+}
+
+export interface EvaluationQuery extends PageQuery {
+
+  /**
+   * 患者ID
+   */
+  patientId?: string | number;
+
+  /**
+   * 营养评估类型
+   */
+  configId?: string | number;
+
+  /**
+   * 筛查时间
+   */
+  screeningTime?: string;
+
+  /**
+   * 看诊类型(0门诊 1住院)
+   */
+  visitType?: string;
+
+  /**
+   * 门诊/住院号
+   */
+  patientNo?: string;
+
+  /**
+   * 支付状态(未支付/已支付/已退款)
+   */
+  paymentStatus?: string;
+
+  /**
+   * 内容
+   */
+  content?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 2 - 0
src/api/patients/screening/types.ts

@@ -102,6 +102,8 @@ export interface ScreeningForm extends BaseEntity {
    */
   status?: string;
 
+  content?: string;
+
 }
 
 export interface ScreeningQuery extends PageQuery {

+ 531 - 0
src/views/patients/evaluation/add.vue

@@ -0,0 +1,531 @@
+<template>
+  <div class="p-2">
+    <el-card>
+      <!-- 新增顶部操作栏 -->
+      <el-row>
+        <el-col :span="4">
+          <el-button type="primary" plain @click="close" style="margin-right: 20px;margin-left: 30px;">返回</el-button>
+          <span style="font-size: 14px;  vertical-align: middle;">{{ screeningName }}</span>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <el-card>
+      <template v-for="item,idx in form.otherInfo">
+        <template v-if="item.questionChildType == 'singleChoice'">
+          <template v-if="item.arrangement == '2'">
+            <div style="margin-bottom: 20px;padding-top: 20px;"
+              :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
+              <el-row>
+                <el-col :span="24">
+                  <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                  <span style="font-weight: bold;">{{ item.title }}</span>
+                </el-col>
+              </el-row>
+              <el-row style="margin-bottom: 20px;">
+                <el-col :span="24">
+                  <div class="radio-card">
+                    <el-radio-group v-model="item.value" style="margin-top: 8px;">
+                      <template v-for="ctl,i in item.contentList">
+                        <el-radio :label="ctl.label" :value="i" :disabled="isView">
+                          <span class="option-content">
+                            <span v-if="ctl.img" class="option-img">
+                              <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true" />
+                            </span>
+                            <span>{{ ctl.label }}</span>
+                          </span>
+                        </el-radio>
+                      </template>
+                    </el-radio-group>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </template>
+          <template v-else>
+            <div style="margin-bottom: 10px; padding-top: 20px;"
+              :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
+              <el-row>
+                <el-col :span="24">
+                  <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                  <span style="font-weight: bold;">{{ item.title }}</span>
+                  <el-radio-group v-model="item.value" class="horizontal-radio-group" style="margin-top: 8px;">
+                    <template v-for="ctl,i in item.contentList">
+                      <el-radio :label="ctl.label" :value="i" :disabled="isView">
+                        <span class="option-content">
+                          <span v-if="ctl.img" class="option-img">
+                            <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true" />
+                          </span>
+                          <span>{{ ctl.label }}</span>
+                        </span>
+                      </el-radio>
+                    </template>
+                  </el-radio-group>
+                </el-col>
+              </el-row>
+            </div>
+          </template>
+        </template>
+        <template v-if="item.questionChildType == 'multipleChoice'">
+          <template v-if="item.arrangement == '2'">
+            <div style="margin-bottom: 10px; padding-top: 20px;"
+              :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
+              <el-row>
+                <el-col :span="24">
+                  <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                  <span style="font-weight: bold;">{{ item.title }}</span>
+                </el-col>
+              </el-row>
+              <el-row style="margin-bottom: 20px;">
+                <el-col :span="24">
+                  <div class="checkbox-vertical-card">
+                    <el-checkbox-group v-model="item.value" style="margin-top: 8px;">
+                      <template v-for="ctl,i in item.contentList">
+                        <el-checkbox :label="ctl.label" :value="i" :disabled="isView">
+                          <span class="option-content">
+                            <span v-if="ctl.img" class="option-img">
+                              <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true" />
+                            </span>
+                            <span>{{ ctl.label }}</span>
+                          </span>
+                        </el-checkbox>
+                      </template>
+                    </el-checkbox-group>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </template>
+          <template v-else>
+            <div style="margin-bottom: 10px;  padding-top: 20px;"
+              :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
+              <el-row>
+                <el-col :span="24">
+                  <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                  <span style="font-weight: bold;">{{ item.title }}</span>
+                  <el-checkbox-group v-model="item.value" class="horizontal-checkbox-group" style="margin-top: 8px;">
+                    <template v-for="ctl,i in item.contentList">
+                      <el-checkbox :label="ctl.label" :value="i" :disabled="isView">
+                        <span class="option-content">
+                          <span v-if="ctl.img" class="option-img">
+                            <miniImageUpload :limit="1" v-model="ctl.img" :disabled="true" />
+                          </span>
+                          <span>{{ ctl.label }}</span>
+                        </span>
+                      </el-checkbox>
+                    </template>
+                  </el-checkbox-group>
+                </el-col>
+              </el-row>
+            </div>
+          </template>
+        </template>
+
+
+        <!-- //////////////////////////////////////////////////////////////////// -->
+        <!-- <template v-if="item.questionChildType == 'fillBlanks'">
+          <template v-if="item.arrangement == '2'">
+            <div style="margin-bottom: 10px; padding-top: 20px;"
+              :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
+              <el-row>
+                <el-col :span="24">
+                  <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                  <span style="font-weight: bold;">{{ item.title }}</span>
+                </el-col>
+              </el-row>
+              <el-row style="margin-bottom: 20px;">
+                <el-col :span="24">
+                  <el-form>
+                    <el-form-item prop="patientNo" label="姓名/门诊号/住院号">
+                      <el-input placeholder="姓名/门诊号/住院号" clearable />
+                    </el-form-item>
+                    <el-form-item prop="patientNo" label="姓名/门诊号/住院号">
+                      <el-input placeholder="姓名/门诊号/住院号" clearable />
+                    </el-form-item>
+                  </el-form>
+                </el-col>
+              </el-row>
+            </div>
+          </template>
+          <template v-else>
+            <div style="margin-bottom: 10px; padding-top: 20px;"
+              :style="{ 'border-top': idx == 0 ? 'none' : '1px dashed #e5e7eb' }" class="zebra-row">
+              <el-row>
+                <el-col :span="24">
+                  <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                  <span style="font-weight: bold;">{{ item.title }}</span>
+                </el-col>
+              </el-row>
+              <el-row style="margin-bottom: 20px;">
+                <el-col :span="24">
+                  <el-form  :inline="true" label-width="150px">
+                    <el-form-item label="A">
+                      <el-input placeholder="姓名/门诊号/住院号" clearable />
+                    </el-form-item>
+                    <el-form-item label="B">
+                      <el-input placeholder="姓名/门诊号/住院号" clearable />
+                    </el-form-item>
+                    <el-form-item label="C">
+                      <el-input placeholder="姓名/门诊号/住院号" clearable />
+                    </el-form-item>
+                    <el-form-item label="D">
+                      <el-input placeholder="姓名/门诊号/住院号" clearable />
+                    </el-form-item>
+                  </el-form>
+                </el-col>
+              </el-row>
+            </div>
+          </template>
+        </template> -->
+
+        <!-- //////////////////////////////////////////////////////////////////// -->
+
+        <template v-if="item.questionChildType == 'scaleQuestions'">
+          <div style="margin-bottom: 10px;  padding-top: 20px;"
+            :style="{ 'border-top': idx == 0 ? 'none' : '1px dashed #e5e7eb' }" class="zebra-row">
+            <el-row>
+              <el-col :span="24">
+                <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                <span style="font-weight: bold;">{{ item.title }}</span>
+                <div style="overflow-x: scroll;margin-top: 8px;margin-left: 30px;">
+                  <div class="custom-radio-grid">
+                    <div v-for="ctl,n in item.contentList" :key="n" @click="selectScaleQuestions(idx,n)"
+                      :class="['custom-radio-cell', {'is-selected':ctl.value!=null,'cell': item.contentList.length === n+1, 'is-last': n+1 > 1 }]">
+                      {{ n+1 }}
+                    </div>
+                  </div>
+
+                  <div class="custom-radio-grid">
+                    <div v-for="ctl, n in item.contentList" :key="ctl.nameEn" style="border: none;"
+                      :class="['custom-radio-cell']">
+                      {{ ctl.label }}
+                    </div>
+                  </div>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </template>
+
+        <template v-if="item.questionChildType == 'matrixScale'">
+          <div style="margin-bottom: 10px;  padding-top: 20px;"
+            :style="{ 'border-top': idx == 0 ? 'none' : '1px dashed #e5e7eb' }" class="zebra-row">
+            <el-row>
+              <el-col :span="24">
+                <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                <span style="font-weight: bold;">{{ item.title }}</span>
+                <div style="border-bottom: 1px solid #e5e7eb;width: 98%;margin-left: 30px;">
+                  <el-row :gutter="10" class="mb8">
+                    <el-col :span="3" style="margin-top: 30px;">
+                    </el-col>
+                    <template v-for="clt in item.contentList">
+                      <template v-if="clt.optionFlag">
+                        <el-col :span="1" align="center" style="margin-top: 30px;margin-left: 15px;">
+                          {{ clt.optionContent }}
+                        </el-col>
+                      </template>
+                    </template>
+                  </el-row>
+
+                  <template v-for="clt, i1 in item.contentList">
+                    <el-row :gutter="10" class="mb8">
+                      <el-col :span="3" style="margin-top: 10px;">
+                        <template v-if="clt.labelFlag">
+                          标题{{ i1 + 1 }}:{{ clt.label }}
+                        </template>
+                      </el-col>
+                      <template v-for="clt2, i2 in item.contentList">
+                        <el-col :span="1" align="center" style="margin-left: 15px;">
+                          <template v-if="clt2.optionFlag && clt.labelFlag">
+                            <el-radio-group v-model="clt.value" :disabled="isView">
+                              <el-radio :value="(i1+1)*1000+i2" size="large" />
+                            </el-radio-group>
+                          </template>
+                        </el-col>
+                      </template>
+                    </el-row>
+                  </template>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </template>
+
+      </template>
+    </el-card>
+
+    <el-card shadow="always" class="card-footer" v-if="!isView">
+      <div>
+        <el-button type="primary" size="large" @click="submitForm" :loading="buttonLoading"
+          v-hasPermi="['system:hospital:add']">
+          &nbsp;&nbsp;&nbsp;提交&nbsp;&nbsp;&nbsp;
+        </el-button>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+
+<script setup name="Evaluation" lang="ts">
+import { listEvaluation, getEvaluation, delEvaluation, addEvaluation, updateEvaluation } from '@/api/patients/evaluation';
+import { EvaluationVO, EvaluationQuery, EvaluationForm } from '@/api/patients/evaluation/types';
+import {  getScreeningAssessmentConfig } from '@/api/system/screeningAssessmentConfig';
+import {ScreeningAssessmentConfigForm} from '@/api/system/screeningAssessmentConfig/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+let paramForm = ref<EvaluationForm>({});
+ 
+
+const screeningName = ref(''); 
+const { patientInfo } = defineProps<{ patientInfo: any }>()
+const emit = defineEmits(['change'])
+let form=ref<ScreeningAssessmentConfigForm>({});   
+const buttonLoading = ref(false);
+let isView=ref(false);
+ 
+
+/** 查询营养评估列表 */
+const getList = async () => {
+    let id = patientInfo.other;
+    let reg=/^[0-9]*$/;
+     
+    if (!reg.test(id.toString())) {
+        id = window.atob(id);
+        isView.value = true;
+        const res =await getEvaluation(id as string);
+        const content =JSON.parse(res.data.content);
+        screeningName.value = content.name;
+        Object.assign(form.value, content);
+    } else {
+        isView.value = false;
+        const res = await getScreeningAssessmentConfig(id as string);
+        screeningName.value = res.data.name;
+        Object.assign(form.value, res.data);
+    }
+}
+
+const close = async () => {
+    emit('change', 'nutritionEvaluation');
+}; 
+ 
+
+/** 提交按钮 */
+const submitForm = async () => {
+    for (let i = 0, len = form.value.otherInfo.length; i < len; i++) {
+        let item = form.value.otherInfo[i];
+        if (item.required && (item.value == null || item.value == undefined)) {
+            proxy?.$modal.msgError("请确保必填项(第" + (i + 1) + "题)不为空");
+            return;
+        }
+    }
+
+    buttonLoading.value = true;    
+    paramForm.value.content = JSON.stringify(form.value);
+    if (paramForm.value.id) {
+        await updateEvaluation(paramForm.value).finally(() => buttonLoading.value = false);
+    } else {
+        await addEvaluation(paramForm.value).finally(() => buttonLoading.value = false);
+    }
+    proxy?.$modal.msgSuccess("操作成功");
+    close();
+}
+
+ 
+const selectScaleQuestions = async (idx:number, n:number) => {
+    if(isView.value){
+        return;
+    }
+    let other = form.value.otherInfo[idx];
+    if (!other.value) {
+        other.value = [];
+    }
+
+    let ctl = other.contentList[n];
+    if (ctl.value!=null) {
+        ctl.value = null;
+        let newList=[];
+        for (let i = 0, len = other.value.length; i < len; i++) {             
+            if (other.value[i] != n) {                
+                newList.push(other.value[i]);
+            }
+        }
+        other.value=newList;
+    } else {
+        ctl.value = n;
+        other.value.push(n);
+    }
+}
+
+
+
+
+onMounted(() => {
+  paramForm.value.patientId=patientInfo.id;
+  paramForm.value.patientNo=patientInfo.outpatientNo;
+  paramForm.value.visitType=patientInfo.type;
+  paramForm.value.configId=patientInfo.other; 
+  getList();
+});
+</script>
+
+<style scoped>
+  .screening-type-grid {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 8px;
+  }
+  .screening-type-btn {
+    font-weight: bold;
+    font-size: 16px;
+    height: 48px;
+    border-radius: 8px;
+  }
+  .radio-card {
+    display: inline-block;
+  }
+  .radio-card .el-radio-group {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+  .radio-card .el-radio {
+    margin-bottom: 3px;
+    margin-left: 30px;
+  }
+  .radio-card el-radio:last-child {
+    margin-bottom: 0;
+  }
+  .horizontal-radio-group {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    margin-left: 16px;
+  }
+  .horizontal-radio-group .el-radio {
+    margin-right: 32px;
+    margin-bottom: 0;
+    margin-left: 14px;
+  }
+  .horizontal-checkbox-group {
+    display: flex;
+    flex-wrap: wrap;
+    align-items: center;
+    margin-left: 30px;
+  }
+  .horizontal-checkbox-group .el-checkbox {
+    margin-right: 32px;
+    margin-bottom: 8px;
+  }
+  .checkbox-vertical-card .el-checkbox-group {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+  .checkbox-vertical-card .el-checkbox {
+    margin-bottom: 10px;
+    margin-left: 30px;
+  }
+  .checkbox-vertical-card .el-checkbox:last-child {
+    margin-bottom: 0;
+  }
+ 
+
+  /* 斑马色:偶数题背景色 */
+.zebra-row:nth-child(even) {
+  background: #fafafa;
+}
+
+/* 斑马色:奇数题背景色 */
+.zebra-row:nth-child(odd) {
+  background: #fff;
+}
+
+.card-footer{  
+    z-index: 99;
+    bottom: 0px;
+    left: calc(var(--left-menu-max-width) + var(--app-content-padding));
+    right: 0px;
+    height: 90px;
+    display: flex;
+    justify-content: center;
+    align-items: center;     
+}
+
+.custom-radio-grid {
+  display: flex;
+  /* border: 1px solid #bfc4cc; */
+  border-radius: 4px;
+  background: #fff;
+  margin-bottom: 16px;
+}
+
+.custom-radio-cell {
+  width: 100px;
+  flex: none;
+  text-align: center;
+  border: 1px solid #bfc4cc;
+  margin: 0 !important;
+  height: 40px;
+  line-height: 20px;
+  font-size: 18px;
+  font-weight: normal;
+  background: #fff;
+  border-radius: 0 !important;
+  cursor: pointer;
+  user-select: none;
+  transition: background 0.2s;
+  word-break: break-all;
+  white-space: normal;
+  overflow-wrap: break-word;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 0 5px;
+}
+
+.custom-radio-cell:last-child {
+  border-right: none;
+}
+
+.custom-radio-cell .el-radio__input {
+  display: none !important;
+}
+
+.custom-radio-cell .el-radio__label {
+  padding: 0;
+  width: 100%;
+  display: block;
+  text-align: center;
+  cursor: pointer;
+}
+ 
+
+.custom-radio-cell .cell {
+  border-right: 1px solid #bfc4cc;
+}
+
+
+.is-selected {
+  background-color: #ccf0a4;   /* Element Plus 主色 */
+  color: #fff;  
+  border-radius: 6px;
+  box-shadow: 0 2px 8px rgba(64,158,255,0.08);
+  transition: background 0.2s, color 0.2s, border 0.2s;
+}
+
+.custom-radio-cell.is-last {
+  border-right: 1px solid #bfc4cc;
+  border-left: none;
+}
+ 
+.option-content {
+  display: inline-flex;
+  align-items: center;
+}
+.option-img {
+  display: inline-block;
+  margin-right: 8px;
+  vertical-align: middle;
+}
+</style>

+ 311 - 0
src/views/patients/evaluation/index.vue

@@ -0,0 +1,311 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" >
+            <el-form-item prop="screeningTime">
+              <el-date-picker v-model="screeningTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
+            </el-form-item>
+            <el-form-item label="看诊类型" prop="visitType">
+              <el-select v-model="queryParams.visitType" placeholder="请选择" clearable>
+                <el-option v-for="item in treatment_user_type" :key="item.id" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="营养评估类型" prop="configId" label-width="100px">
+              <div>
+                <el-select v-model="queryParams.configId" placeholder="请选择" clearable>
+                  <el-option v-for="item in screeningAssessmentConfigList" :key="item.configId" :label="item.name" :value="item.configId" />
+                </el-select>
+              </div>
+            </el-form-item>
+            <el-form-item prop="patientNo">
+              <el-input v-model="queryParams.patientNo" placeholder="姓名/门诊号/住院号" clearable @keyup.enter="handleQuery" />
+            </el-form-item> 
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:evaluation:add']">新增营养评估</el-button>
+          </el-col>
+          <!-- <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:evaluation:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:evaluation:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:evaluation:export']">导出</el-button>
+          </el-col> -->
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="evaluationList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="时间" align="center" prop="screeningTime"  />
+        <el-table-column label="看诊类型" align="center" prop="visitType" />
+        <el-table-column label="门诊/住院号" align="center" prop="patientNo" />
+        <el-table-column label="营养评估类型" align="center" prop="configName" />        
+        <el-table-column label="支付状态" align="center" prop="paymentStatus" />
+        <el-table-column label="筛查医生/护士" align="center" prop="createByName" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="详情" placement="top">
+              <el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['system:evaluation:edit']">详情</el-button>
+            </el-tooltip>
+            <!-- <el-tooltip content="打印" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:evaluation:remove']">打印</el-button>
+            </el-tooltip> -->
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改营养评估对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
+      <div class="screening-type-grid">
+            <el-button
+              v-for="item in screeningAssessmentConfigList"
+              :key="item.configId"
+              type="primary"
+              plain 
+              class="screening-type-btn"              
+              @click="handleScreeningSelect(item.configId)"
+              style="width: 350px;margin-left:0px">            
+              {{ item.name }}
+            </el-button>
+          </div>           
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Evaluation" lang="ts">
+import { listEvaluation, getEvaluation, delEvaluation, addEvaluation, updateEvaluation } from '@/api/patients/evaluation';
+import { EvaluationVO, EvaluationQuery, EvaluationForm } from '@/api/patients/evaluation/types';
+import { ScreeningAssessmentConfigQuery,ScreeningAssessmentConfigVO } from '@/api/system/screeningAssessmentConfig/types';
+import { listScreeningAssessmentConfig } from '@/api/system/screeningAssessmentConfig';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { treatment_user_type } = toRefs<any>(proxy?.useDict('treatment_user_type'));
+
+const screeningTime = ref<[DateModelType, DateModelType]>(['', '']);
+const screeningAssessmentConfigList = ref<ScreeningAssessmentConfigVO[]>([]);
+const evaluationList = ref<EvaluationVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const evaluationFormRef = ref<ElFormInstance>();
+const emit = defineEmits(['change'])
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: EvaluationForm = {
+  id: undefined,
+  patientId: undefined,
+  configId: undefined,
+  screeningTime: undefined,
+  visitType: undefined,
+  patientNo: undefined,
+  paymentStatus: undefined,
+  content: undefined,
+  status: undefined,
+}
+const data = reactive<PageData<EvaluationForm, EvaluationQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    patientId: undefined,
+    configId: undefined,
+    screeningTime: undefined,
+    visitType: undefined,
+    patientNo: undefined,
+    paymentStatus: undefined,
+    content: undefined,
+    status: undefined,
+    params: {
+    }
+  },
+  rules: {
+    id: [
+      { required: true, message: "主键ID不能为空", trigger: "blur" }
+    ],
+    configId: [
+      { required: true, message: "营养评估类型不能为空", trigger: "blur" }
+    ],
+    screeningTime: [
+      { required: true, message: "筛查时间不能为空", trigger: "blur" }
+    ],
+    visitType: [
+      { required: true, message: "看诊类型不能为空", trigger: "change" }
+    ],
+    patientNo: [
+      { required: true, message: "门诊/住院号不能为空", trigger: "blur" }
+    ],
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询筛查/评估配置列表 */
+const getScreeningConfigList = async () => {
+  let param=ref<ScreeningAssessmentConfigQuery>({
+    pageNum: 1,
+    type: '2',
+    pageSize: -1,
+  });
+  const res = await listScreeningAssessmentConfig(param.value);
+  screeningAssessmentConfigList.value = res.rows;   
+}
+
+/** 查询营养评估列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listEvaluation(queryParams.value);
+  evaluationList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  evaluationFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: EvaluationVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "选择营养评估";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: EvaluationVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getEvaluation(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改营养评估";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  evaluationFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateEvaluation(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addEvaluation(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: EvaluationVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除营养评估编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delEvaluation(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/evaluation/export', {
+    ...queryParams.value
+  }, `evaluation_${new Date().getTime()}.xlsx`)
+}
+
+const handleView = async (row?: EvaluationVO) => {
+  emit('change', 'nutritionEvaluationAdd',window.btoa(row.id.toString()))
+}
+
+const handleScreeningSelect = (configId:number) => {   
+  emit('change', 'nutritionEvaluationAdd',configId)
+} 
+
+function formatDate(date) {
+  const pad = n => n < 10 ? '0' + n : n;
+  return date.getFullYear() + '-' +
+    pad(date.getMonth() + 1) + '-' +
+    pad(date.getDate())   ;
+}
+
+onMounted(() => {
+  getList();
+
+  getScreeningConfigList();   
+  let now=new Date();
+  let start=formatDate(now);
+  let end=formatDate(new Date(now.getTime()-24*60*60*1000*30));
+  screeningTime.value=[end+' 00:00:00',start+' 23:59:59']; 
+});
+</script>
+
+<style scoped>
+.screening-type-grid {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+.screening-type-btn {
+  font-weight: normal;
+  font-size: 16px;
+  height: 48px;
+  border-radius: 8px;  
+}
+</style>

+ 32 - 5
src/views/patients/medicalRecord/index.vue

@@ -23,6 +23,9 @@
                 <el-menu-item index="nutritionScreening">
                     <span>营养筛查</span>
                 </el-menu-item>
+                <el-menu-item index="nutritionEvaluationAdd" v-show="false">
+                    <span>营养评估新增</span>
+                </el-menu-item>
                 <el-menu-item index="nutritionEvaluation">
                     <span>营养评估</span>
                 </el-menu-item>
@@ -121,9 +124,11 @@
     // 动态导入组件
     const MedicalRecord = defineAsyncComponent(() => import('./medicalRecord.vue'));
     const NutritionScreening = defineAsyncComponent(() => import('@/views/patients/screening/index.vue'));
+    const NutritionEvaluation = defineAsyncComponent(() => import('@/views/patients/evaluation/index.vue'));
     const NutriDiagnosis = defineAsyncComponent(() => import('@/views/patients/nutriDiagnosis/index.vue'));
     const CheckLabel = defineAsyncComponent(() => import('@/views/patients/checkLabel/index.vue'));
     const NutritionScreeningAdd = defineAsyncComponent(() => import('@/views/patients/screening/add.vue'));
+    const NutritionEvaluationAdd = defineAsyncComponent(() => import('@/views/patients/evaluation/add.vue'));
 
     const componentMap = {
         medicalRecord: MedicalRecord, // “营养病例”对应MedicalRecord.vue
@@ -131,6 +136,8 @@
         nutritionDiagnosis: NutriDiagnosis,
         nutritionScreening: NutritionScreening,
         nutritionScreeningAdd: NutritionScreeningAdd,
+        nutritionEvaluation:NutritionEvaluation,
+        nutritionEvaluationAdd: NutritionEvaluationAdd,
         // ... 其它映射
     };
     const currentComponent = ref(componentMap['medicalRecord']); // 默认显示
@@ -144,7 +151,9 @@
         id: '',
         name: '',
         age: '',
-         gender: '',
+        gender: '',
+        type: '',
+        outpatientNo: '',
         deptName: '',
        
     } as any);
@@ -157,10 +166,16 @@
     const showEditDialog = ref(false);
     const editData = ref({} as any);
 
-    const handleSelect = (key: string,other?:string[]) => {
-        activeMenu.value = key;
-        currentComponent.value = componentMap[key] || null;  
-        patientInfo.value['other']=other;           
+    const handleSelect = (key: string,other?:string[]) => {   
+        if(key=='nutritionScreeningAdd'||key=='nutritionEvaluationAdd'){            
+            activeMenu.value = key.replace('Add',''); 
+        }else{
+            activeMenu.value = key; 
+        }     
+        currentComponent.value = componentMap[key] || null; 
+        patientInfo.value['other']=other;
+        patientInfo.value.type=route.query.type;
+        patientInfo.value.outpatientNo=route.query.outpatientNo;             
     };
 
     const goBack = () => {
@@ -181,6 +196,8 @@
     const handleRowClick = (row, column, event) => {
         const idx = patientList.value.findIndex(item => item === row);
         patientInfo.value = row;
+        patientInfo.value.type=route.query.type;
+        patientInfo.value.outpatientNo=route.query.outpatientNo;  
         if (idx !== -1) {
             currentPatientIndex.value = idx;
         }
@@ -190,6 +207,8 @@
         currentComponent.value = componentMap['medicalRecord']
         if (currentPatientIndex.value > 0) {
             patientInfo.value = patientList.value[currentPatientIndex.value - 1];
+            patientInfo.value.type=route.query.type;
+            patientInfo.value.outpatientNo=route.query.outpatientNo;  
             currentPatientIndex.value--;
         }
     };
@@ -197,6 +216,8 @@
     const handleNext = () => {
         currentComponent.value = componentMap['medicalRecord']
         patientInfo.value = patientList.value[currentPatientIndex.value + 1];
+        patientInfo.value.type=route.query.type;
+        patientInfo.value.outpatientNo=route.query.outpatientNo;  
         if (currentPatientIndex.value < patientList.value.length - 1) {
             currentPatientIndex.value++;
         }
@@ -296,6 +317,8 @@
                     const targetIndex = patientList.value.findIndex(patient => patient.id === id);
                     if (targetIndex !== -1) {
                         patientInfo.value = patientList.value[targetIndex];
+                        patientInfo.value.type=route.query.type;
+                        patientInfo.value.outpatientNo=route.query.outpatientNo;  
                         currentPatientIndex.value = targetIndex;
                     } else {
                         // 如果没找到,默认选中第一个
@@ -305,6 +328,8 @@
                 } else {
                     // 没有路由参数,默认选中第一个
                     patientInfo.value = patientList.value[0];
+                    patientInfo.value.type=route.query.type;
+                    patientInfo.value.outpatientNo=route.query.outpatientNo;  
                     currentPatientIndex.value = 0;
                 }
             }
@@ -326,6 +351,8 @@
         // 获取体力活动字典
         const { physical_activity } = toRefs(proxy ?.useDict('physical_activity'));
         physicalActivityDict.value = physical_activity ?.value || [];
+        patientInfo.value.type=route.query.type;
+        patientInfo.value.outpatientNo=route.query.outpatientNo;   
         getList();        
     });
 </script>

+ 256 - 36
src/views/patients/screening/add.vue

@@ -19,7 +19,7 @@
                             :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
                             <el-row>
                                 <el-col :span="24">
-                                    <span style="color: #f56c6c; margin-right: 4px;">*</span>
+                                    <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
                                     <span style="font-weight: bold;">{{ item.title }}</span>
                                 </el-col>
                             </el-row>
@@ -27,9 +27,15 @@
                                 <el-col :span="24">
                                     <div class="radio-card">
                                         <el-radio-group v-model="item.value" style="margin-top: 8px;">
-                                            <template v-for="ctl in item.contentList">
-                                                <el-radio :label="ctl.label">
-                                                    <span>{{ctl.label }}</span>
+                                            <template v-for="ctl,i in item.contentList">
+                                                <el-radio :label="ctl.label" :value="i" :disabled="isView">
+                                                    <span class="option-content">
+                                                        <span v-if="ctl.img" class="option-img">
+                                                            <miniImageUpload :limit="1" v-model="ctl.img"
+                                                                :disabled="true" />
+                                                        </span>
+                                                        <span>{{ ctl.label }}</span>
+                                                    </span>
                                                 </el-radio>
                                             </template>
                                         </el-radio-group>
@@ -43,13 +49,19 @@
                             :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
                             <el-row>
                                 <el-col :span="24">
-                                    <span style="color: #f56c6c; margin-right: 4px;">*</span>
+                                    <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
                                     <span style="font-weight: bold;">{{ item.title }}</span>
                                     <el-radio-group v-model="item.value" class="horizontal-radio-group"
                                         style="margin-top: 8px;">
-                                        <template v-for="ctl in item.contentList">
-                                            <el-radio :label="ctl.label">
-                                                <span>{{ctl.label }}</span>
+                                        <template v-for="ctl,i in item.contentList">
+                                            <el-radio :label="ctl.label" :value="i" :disabled="isView">
+                                                <span class="option-content">
+                                                        <span v-if="ctl.img" class="option-img">
+                                                            <miniImageUpload :limit="1" v-model="ctl.img"
+                                                                :disabled="true" />
+                                                        </span>
+                                                        <span>{{ ctl.label }}</span>
+                                                    </span>
                                             </el-radio>
                                         </template>
                                     </el-radio-group>
@@ -64,7 +76,7 @@
                             :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
                             <el-row>
                                 <el-col :span="24">
-                                    <span style="color: #f56c6c; margin-right: 4px;">*</span>
+                                    <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
                                     <span style="font-weight: bold;">{{ item.title }}</span>
                                 </el-col>
                             </el-row>
@@ -72,9 +84,15 @@
                                 <el-col :span="24">
                                     <div class="checkbox-vertical-card">
                                         <el-checkbox-group v-model="item.value" style="margin-top: 8px;">
-                                            <template v-for="ctl in item.contentList">
-                                                <el-checkbox :label="ctl.label">
-                                                    <span>{{ ctl.label }}</span>
+                                            <template v-for="ctl,i in item.contentList">
+                                                <el-checkbox :label="ctl.label" :value="i" :disabled="isView">
+                                                    <span class="option-content">
+                                                        <span v-if="ctl.img" class="option-img">
+                                                            <miniImageUpload :limit="1" v-model="ctl.img"
+                                                                :disabled="true" />
+                                                        </span>
+                                                        <span>{{ ctl.label }}</span>
+                                                    </span>
                                                 </el-checkbox>
                                             </template>
                                         </el-checkbox-group>
@@ -88,12 +106,19 @@
                             :style="{'border-top':idx==0?'none':'1px dashed #e5e7eb'}" class="zebra-row">
                             <el-row>
                                 <el-col :span="24">
+                                    <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
                                     <span style="font-weight: bold;">{{ item.title }}</span>
                                     <el-checkbox-group v-model="item.value" class="horizontal-checkbox-group"
                                         style="margin-top: 8px;">
-                                        <template v-for="ctl in item.contentList">
-                                            <el-checkbox :label="ctl.label">
-                                                <span>{{ ctl.label }}</span>
+                                        <template v-for="ctl,i in item.contentList">
+                                            <el-checkbox :label="ctl.label" :value="i" :disabled="isView">
+                                                <span class="option-content">
+                                                        <span v-if="ctl.img" class="option-img">
+                                                            <miniImageUpload :limit="1" v-model="ctl.img"
+                                                                :disabled="true" />
+                                                        </span>
+                                                        <span>{{ ctl.label }}</span>
+                                                    </span>
                                             </el-checkbox>
                                         </template>
                                     </el-checkbox-group>
@@ -103,12 +128,86 @@
                     </template>
                 </template>
 
+                <template v-if="item.questionChildType == 'scaleQuestions'">
+                    <div style="margin-bottom: 10px;  padding-top: 20px;"
+                        :style="{ 'border-top': idx == 0 ? 'none' : '1px dashed #e5e7eb' }" class="zebra-row">
+                        <el-row>
+                            <el-col :span="24">
+                                <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                                <span style="font-weight: bold;">{{ item.title }}</span>
+                                <div style="overflow-x: scroll;margin-top: 8px;margin-left: 30px;">
+                                    <div class="custom-radio-grid">
+                                        <div v-for="ctl,n in item.contentList" :key="n"
+                                            @click="selectScaleQuestions(idx,n)"
+                                            :class="['custom-radio-cell', {'is-selected':ctl.value!=null,'cell': item.contentList.length === n+1, 'is-last': n+1 > 1 }]">
+                                            {{ n+1 }}
+                                        </div>
+                                    </div>
+
+                                    <div class="custom-radio-grid">
+                                        <div v-for="ctl, n in item.contentList" :key="ctl.nameEn" style="border: none;"
+                                            :class="['custom-radio-cell']">
+                                            {{ ctl.label }}
+                                        </div>
+                                    </div>
+                                </div>
+                            </el-col>
+                        </el-row>
+                    </div>
+                </template>
+
+                <template v-if="item.questionChildType == 'matrixScale'">
+                    <div style="margin-bottom: 10px;  padding-top: 20px;"
+                        :style="{ 'border-top': idx == 0 ? 'none' : '1px dashed #e5e7eb' }" class="zebra-row">
+                        <el-row>
+                            <el-col :span="24">
+                                <span style="color: #f56c6c; margin-right: 4px;" v-show="item.required">*</span>
+                                <span style="font-weight: bold;">{{ item.title }}</span>
+                                <div style="border-bottom: 1px solid #e5e7eb;width: 98%;margin-left: 30px;">
+                                    <el-row :gutter="10" class="mb8">
+                                        <el-col :span="3" style="margin-top: 30px;">
+                                        </el-col>
+                                        <template v-for="clt in item.contentList">
+                                            <template v-if="clt.optionFlag">
+                                                <el-col :span="1" align="center"
+                                                    style="margin-top: 30px;margin-left: 15px;">
+                                                    {{ clt.optionContent }}
+                                                </el-col>
+                                            </template>
+                                        </template>
+                                    </el-row>
+
+                                    <template v-for="clt, i1 in item.contentList">
+                                        <el-row :gutter="10" class="mb8">
+                                            <el-col :span="3" style="margin-top: 10px;">
+                                                <template v-if="clt.labelFlag">
+                                                    标题{{ i1 + 1 }}:{{ clt.label }}
+                                                </template>
+                                            </el-col>
+                                            <template v-for="clt2, i2 in item.contentList">
+                                                <el-col :span="1" align="center" style="margin-left: 15px;">
+                                                    <template v-if="clt2.optionFlag && clt.labelFlag">
+                                                        <el-radio-group v-model="clt.value" :disabled="isView">
+                                                            <el-radio :value="(i1+1)*1000+i2" size="large" />
+                                                        </el-radio-group>
+                                                    </template>
+                                                </el-col>
+                                            </template>
+                                        </el-row>
+                                    </template>
+                                </div>
+                            </el-col>
+                        </el-row>
+                    </div>
+                </template>
+
             </template>
         </el-card>
 
-        <el-card shadow="always" class="card-footer">
+        <el-card shadow="always" class="card-footer" v-if="!isView">
             <div>
-                <el-button type="primary" size="large" @click="submitForm" v-hasPermi="['system:hospital:add']">
+                <el-button type="primary" size="large" @click="submitForm" :loading="buttonLoading"
+                    v-hasPermi="['system:hospital:add']">
                     &nbsp;&nbsp;&nbsp;提交&nbsp;&nbsp;&nbsp;
                 </el-button>
             </div>
@@ -122,42 +221,96 @@
   import {  getScreeningAssessmentConfig } from '@/api/system/screeningAssessmentConfig';
   import {ScreeningAssessmentConfigForm} from '@/api/system/screeningAssessmentConfig/types';
   import { ref } from 'vue'
-  
+  let paramForm = ref<ScreeningForm>({});
+
   const { proxy } = getCurrentInstance() as ComponentInternalInstance; 
  
   const screeningName = ref(''); 
   const { patientInfo } = defineProps<{ patientInfo: any }>()
   const emit = defineEmits(['change'])
   let form=ref<ScreeningAssessmentConfigForm>({});   
- 
-  const malnutritionSigns = ref<string[]>([])
-  const age = ref('<50')
- 
- 
+  const buttonLoading = ref(false);
+  let isView=ref(false);
   
   /** 查询营养筛查列表 */
-  const getList = async () => {
-  let id=patientInfo.other;
-  const res = await getScreeningAssessmentConfig(id as string);
-  screeningName.value=res.data.name;
-  Object.assign(form.value, res.data);   
-  console.log(form.value);
-} 
-  
+const getList = async () => {
+    let id = patientInfo.other;
+    let reg=/^[0-9]*$/;
+     
+    if (!reg.test(id.toString())) {
+        id = window.atob(id);
+        isView.value = true;
+        const res =await getScreening(id as string);
+        const content =JSON.parse(res.data.content);
+        screeningName.value = content.name;
+        Object.assign(form.value, content);
+    } else {
+        isView.value = false;
+        const res = await getScreeningAssessmentConfig(id as string);
+        screeningName.value = res.data.name;
+        Object.assign(form.value, res.data);
+    }
+}
+
 
 const close = async () => {
     emit('change', 'nutritionScreening');
 };
  
   
-  /** 提交按钮 */
-  const submitForm = () => {
-     
-  }
+/** 提交按钮 */
+const submitForm = async () => {
+    for (let i = 0, len = form.value.otherInfo.length; i < len; i++) {
+        let item = form.value.otherInfo[i];
+        if (item.required && (item.value == null || item.value == undefined)) {
+            proxy?.$modal.msgError("请确保必填项(第" + (i + 1) + "题)不为空");
+            return;
+        }
+    }
+
+    buttonLoading.value = true;    
+    paramForm.value.content = JSON.stringify(form.value);
+    if (paramForm.value.id) {
+        await updateScreening(paramForm.value).finally(() => buttonLoading.value = false);
+    } else {
+        await addScreening(paramForm.value).finally(() => buttonLoading.value = false);
+    }
+    proxy?.$modal.msgSuccess("操作成功");
+    close();
+}
  
-   
+
+const selectScaleQuestions = async (idx:number, n:number) => {
+    if(isView.value){
+        return;
+    }
+    let other = form.value.otherInfo[idx];
+    if (!other.value) {
+        other.value = [];
+    }
+
+    let ctl = other.contentList[n];
+    if (ctl.value!=null) {
+        ctl.value = null;
+        let newList=[];
+        for (let i = 0, len = other.value.length; i < len; i++) {             
+            if (other.value[i] != n) {                
+                newList.push(other.value[i]);
+            }
+        }
+        other.value=newList;
+    } else {
+        ctl.value = n;
+        other.value.push(n);
+    }
+}
+
   
   onMounted(() => {
+    paramForm.value.patientId=patientInfo.id;
+    paramForm.value.patientNo=patientInfo.outpatientNo;
+    paramForm.value.visitType=patientInfo.type;
+    paramForm.value.configId=patientInfo.other;    
     getList();       
   });
   </script>
@@ -244,5 +397,72 @@ const close = async () => {
     justify-content: center;
     align-items: center;     
 }
+
+.custom-radio-grid {
+  display: flex;
+  /* border: 1px solid #bfc4cc; */
+  border-radius: 4px;
+  background: #fff;
+  margin-bottom: 16px;
+}
+
+.custom-radio-cell {
+  width: 100px;
+  flex: none;
+  text-align: center;
+  border: 1px solid #bfc4cc;
+  margin: 0 !important;
+  height: 40px;
+  line-height: 20px;
+  font-size: 18px;
+  font-weight: normal;
+  background: #fff;
+  border-radius: 0 !important;
+  cursor: pointer;
+  user-select: none;
+  transition: background 0.2s;
+  word-break: break-all;
+  white-space: normal;
+  overflow-wrap: break-word;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 0 5px;
+}
+
+.custom-radio-cell:last-child {
+  border-right: none;
+}
+
+.custom-radio-cell .el-radio__input {
+  display: none !important;
+}
+
+.custom-radio-cell .el-radio__label {
+  padding: 0;
+  width: 100%;
+  display: block;
+  text-align: center;
+  cursor: pointer;
+}
+ 
+
+.custom-radio-cell .cell {
+  border-right: 1px solid #bfc4cc;
+}
+
+
+.is-selected {
+  background-color: #ccf0a4;   /* Element Plus 主色 */
+  color: #fff;  
+  border-radius: 6px;
+  box-shadow: 0 2px 8px rgba(64,158,255,0.08);
+  transition: background 0.2s, color 0.2s, border 0.2s;
+}
+
+.custom-radio-cell.is-last {
+  border-right: 1px solid #bfc4cc;
+  border-left: none;
+}
   </style>
   

+ 10 - 11
src/views/patients/screening/index.vue

@@ -62,7 +62,7 @@
         <el-table-column label="时间" align="center" prop="screeningTime"  />
         <el-table-column label="看诊类型" align="center" prop="visitType" />
         <el-table-column label="门诊/住院号" align="center" prop="patientNo" />
-        <el-table-column label="营养筛查类型" align="center" prop="configId" />
+        <el-table-column label="营养筛查类型" align="center" prop="configName" />
         <el-table-column label="营养筛查分数" align="center" prop="screeningScore" />
         <el-table-column label="营养筛查结论" align="center" prop="screeningConclusion" />
         <el-table-column label="支付状态" align="center" prop="paymentStatus" />
@@ -70,11 +70,11 @@
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
             <el-tooltip content="详情" placement="top">
-              <el-button link type="primary" icon="View" @click="handleUpdate(scope.row)">详情</el-button>
+              <el-button link type="primary" icon="View" @click="handleView(scope.row)">详情</el-button>
             </el-tooltip>
-            <el-tooltip content="打印" placement="top">
+            <!-- <el-tooltip content="打印" placement="top">
               <el-button link type="primary" icon="Print" @click="handleUpdate(scope.row)">打印</el-button>
-            </el-tooltip>
+            </el-tooltip> -->
             <el-tooltip content="删除" placement="top">
               <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
                 v-hasPermi="['system:screening:remove']">删除</el-button>
@@ -99,13 +99,7 @@
               style="width: 350px;margin-left:0px">            
               {{ item.name }}
             </el-button>
-          </div>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
+          </div>       
     </el-dialog>
   </div>
 </template>
@@ -259,6 +253,11 @@ const handleUpdate = async (row?: ScreeningVO) => {
   dialog.title = "修改营养筛查";
 }
 
+const handleView = async (row?: ScreeningVO) => {
+  emit('change', 'nutritionScreeningAdd',window.btoa(row.id.toString()))
+}
+
+
 /** 提交按钮 */
 const submitForm = () => {
   screeningFormRef.value?.validate(async (valid: boolean) => {

+ 3 - 3
src/views/system/screeningAssessmentConfig/add.vue

@@ -445,11 +445,11 @@
                         </template>
                       </el-col>
                       <el-col :span="3" align="center" style="margin-top: -5px;">
-                        <miniImageUpload :limit="1" v-model="ctl.img" />
-                      </el-col>
-                      <el-col :span="3" align="left" style="margin-top: -5px;">
                         <el-input style="width: 60px;" size="large" v-model="ctl.score" />
                       </el-col>
+                      <el-col :span="3" align="left" style="margin-top: -5px;">                        
+                        <el-checkbox v-model="ctl.allowFillBlank" />
+                      </el-col>
                       <el-col :span="4" align="center">
                       </el-col>
                     </el-row>

+ 0 - 235
src/views/system/screeningAssessmentQuestion/index.vue

@@ -1,235 +0,0 @@
-<template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div v-show="showSearch" class="mb-[10px]">
-        <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="主键ID" prop="configId">
-              <el-input v-model="queryParams.configId" placeholder="请输入主键ID" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="标题" prop="title">
-              <el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-            </el-form-item>
-          </el-form>
-        </el-card>
-      </div>
-    </transition>
-
-    <el-card shadow="never">
-      <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:screeningAssessmentQuestion:add']">新增</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:screeningAssessmentQuestion:edit']">修改</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:screeningAssessmentQuestion:remove']">删除</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:screeningAssessmentQuestion:export']">导出</el-button>
-          </el-col>
-          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-        </el-row>
-      </template>
-
-      <el-table v-loading="loading" border :data="screeningAssessmentQuestionList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="主键ID" align="center" prop="questionId" v-if="true" />
-        <el-table-column label="主键ID" align="center" prop="configId" />
-        <el-table-column label="标题" align="center" prop="title" />
-        <el-table-column label="题型" align="center" prop="questionType" />
-        <el-table-column label="内容" align="center" prop="content" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:screeningAssessmentQuestion:edit']"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:screeningAssessmentQuestion:remove']"></el-button>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
-    </el-card>
-    <!-- 添加或修改题目对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
-      <el-form ref="screeningAssessmentQuestionFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="主键ID" prop="configId">
-          <el-input v-model="form.configId" placeholder="请输入主键ID" />
-        </el-form-item>
-        <el-form-item label="标题" prop="title">
-            <el-input v-model="form.title" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="内容">
-          <editor v-model="form.content" :min-height="192"/>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="ScreeningAssessmentQuestion" lang="ts">
-import { listScreeningAssessmentQuestion, getScreeningAssessmentQuestion, delScreeningAssessmentQuestion, addScreeningAssessmentQuestion, updateScreeningAssessmentQuestion } from '@/api/system/screeningAssessmentQuestion';
-import { ScreeningAssessmentQuestionVO, ScreeningAssessmentQuestionQuery, ScreeningAssessmentQuestionForm } from '@/api/system/screeningAssessmentQuestion/types';
-
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-
-const screeningAssessmentQuestionList = ref<ScreeningAssessmentQuestionVO[]>([]);
-const buttonLoading = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref<Array<string | number>>([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-
-const queryFormRef = ref<ElFormInstance>();
-const screeningAssessmentQuestionFormRef = ref<ElFormInstance>();
-
-const dialog = reactive<DialogOption>({
-  visible: false,
-  title: ''
-});
-
-const initFormData: ScreeningAssessmentQuestionForm = {
-  questionId: undefined,
-  configId: undefined,
-  title: undefined,
-  questionType: undefined,
-  content: undefined,
-}
-const data = reactive<PageData<ScreeningAssessmentQuestionForm, ScreeningAssessmentQuestionQuery>>({
-  form: {...initFormData},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    configId: undefined,
-    title: undefined,
-    questionType: undefined,
-    content: undefined,
-    params: {
-    }
-  },
-  rules: {
-    questionId: [
-      { required: true, message: "主键ID不能为空", trigger: "blur" }
-    ],
-    title: [
-      { required: true, message: "标题不能为空", trigger: "blur" }
-    ],
-    questionType: [
-      { required: true, message: "题型不能为空", trigger: "change" }
-    ],
-  }
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 查询题目列表 */
-const getList = async () => {
-  loading.value = true;
-  const res = await listScreeningAssessmentQuestion(queryParams.value);
-  screeningAssessmentQuestionList.value = res.rows;
-  total.value = res.total;
-  loading.value = false;
-}
-
-/** 取消按钮 */
-const cancel = () => {
-  reset();
-  dialog.visible = false;
-}
-
-/** 表单重置 */
-const reset = () => {
-  form.value = {...initFormData};
-  screeningAssessmentQuestionFormRef.value?.resetFields();
-}
-
-/** 搜索按钮操作 */
-const handleQuery = () => {
-  queryParams.value.pageNum = 1;
-  getList();
-}
-
-/** 重置按钮操作 */
-const resetQuery = () => {
-  queryFormRef.value?.resetFields();
-  handleQuery();
-}
-
-/** 多选框选中数据 */
-const handleSelectionChange = (selection: ScreeningAssessmentQuestionVO[]) => {
-  ids.value = selection.map(item => item.questionId);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
-
-/** 新增按钮操作 */
-const handleAdd = () => {
-  reset();
-  dialog.visible = true;
-  dialog.title = "添加题目";
-}
-
-/** 修改按钮操作 */
-const handleUpdate = async (row?: ScreeningAssessmentQuestionVO) => {
-  reset();
-  const _questionId = row?.questionId || ids.value[0]
-  const res = await getScreeningAssessmentQuestion(_questionId);
-  Object.assign(form.value, res.data);
-  dialog.visible = true;
-  dialog.title = "修改题目";
-}
-
-/** 提交按钮 */
-const submitForm = () => {
-  screeningAssessmentQuestionFormRef.value?.validate(async (valid: boolean) => {
-    if (valid) {
-      buttonLoading.value = true;
-      if (form.value.questionId) {
-        await updateScreeningAssessmentQuestion(form.value).finally(() =>  buttonLoading.value = false);
-      } else {
-        await addScreeningAssessmentQuestion(form.value).finally(() =>  buttonLoading.value = false);
-      }
-      proxy?.$modal.msgSuccess("操作成功");
-      dialog.visible = false;
-      await getList();
-    }
-  });
-}
-
-/** 删除按钮操作 */
-const handleDelete = async (row?: ScreeningAssessmentQuestionVO) => {
-  const _questionIds = row?.questionId || ids.value;
-  await proxy?.$modal.confirm('是否确认删除题目编号为"' + _questionIds + '"的数据项?').finally(() => loading.value = false);
-  await delScreeningAssessmentQuestion(_questionIds);
-  proxy?.$modal.msgSuccess("删除成功");
-  await getList();
-}
-
-/** 导出按钮操作 */
-const handleExport = () => {
-  proxy?.download('system/screeningAssessmentQuestion/export', {
-    ...queryParams.value
-  }, `screeningAssessmentQuestion_${new Date().getTime()}.xlsx`)
-}
-
-onMounted(() => {
-  getList();
-});
-</script>