ソースを参照

自定义质控规则

liyanyan 3 週間 前
コミット
80e3b342bf

+ 646 - 73
src/views/rule/config/components/CreateDialog.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-dialog v-el-drag-dialog :title="titleStr" :visible.sync="data.bSwitch" width="1200px" top="5vh">
-      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="80px" class="demo-ruleForm">
+      <el-form ref="ruleForm" :disabled="titleStr === '详情'" :model="ruleForm" :rules="rules" label-width="80px" class="demo-ruleForm">
         <el-row :gutter="16">
           <el-col :span="8">
             <el-form-item label="病历类型" prop="case_type">
@@ -127,6 +127,8 @@
               <el-input v-model="ruleForm.description" type="textarea" :autosize="{ minRows: 3 }" placeholder="请输入" />
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="16">
           <el-col :span="24">
             <el-form-item label="质控规则">
               <el-col :span="5">
@@ -475,7 +477,7 @@
                       <el-col :span="2">
                         <div class="text-right">逻辑{{ sIndex + 1 }}</div>
                       </el-col>
-                      <el-col :span="6">
+                      <el-col v-if="!(sItem.condition === '病程记录关联' || sItem.condition === '时效')" :span="6">
                         <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'rule')">
                           <el-input
                             :value="getDisplayName(sItem.param1)"
@@ -486,7 +488,7 @@
                           />
                         </div>
                       </el-col>
-                      <el-col :span="3">
+                      <el-col v-if="!(sItem.condition === '病程记录关联' || sItem.condition === '时效')" :span="4">
                         <el-select
                           v-model="sItem.condition"
                           filterable
@@ -502,28 +504,160 @@
                           />
                         </el-select>
                       </el-col>
-                      <el-col v-if="sItem.condition === '时效'" :span="9">
-                        <el-row :gutter="8">
-                          <el-col :span="6">
+                      <el-col v-if="sItem.condition === '时效'" :span="22" class="progress-note">
+                        <el-row :gutter="24">
+                          <el-col v-if="sItem.condition === '时效'" :span="5">
+                            <el-select
+                              v-model="sItem.condition"
+                              filterable
+                              clearable
+                              placeholder="请选择"
+                              style="width: 100%;"
+                            >
+                              <el-option
+                                v-for="(items, bindex) in selectFormula"
+                                :key="bindex"
+                                :label="items.formula"
+                                :value="items.formula"
+                              />
+                            </el-select>
+                          </el-col>
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'sx_param1')">
+                              <el-input
+                                :value="getDisplayName(sItem.sx_param1)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center">等于</div>
+                          </el-col>
+                          <el-col :span="5">
                             <div class="rule-condition">
                               <el-input
-                                :value="getDisplayName(sItem.sx_1)"
+                                v-model="sItem.sx_param2"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'sx_param3')">
+                              <el-input
+                                :value="getDisplayName(sItem.sx_param3)"
                                 placeholder="请选择"
                                 size="small"
                                 readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center">在</div>
+                          </el-col>
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'sx_param4_index')">
+                              <el-input
+                                :value="getDisplayName(sItem.sx_param4_index)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center">包含</div>
+                          </el-col>
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.sx_param4_condition1"
+                                placeholder="请输入"
+                                size="small"
                                 style="width: 100%;"
                               />
-                              <el-button
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center">不包含</div>
+                          </el-col>
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.sx_param4_condition2"
+                                placeholder="请输入"
                                 size="small"
-                                style="width: 90px; position: absolute; right: 0; top: 0; opacity: 0;"
-                                @click="openCategoryDialog(index, sIndex, 'sx_1')"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'sx_param4_kssj')">
+                              <el-input
+                                :value="getDisplayName(sItem.sx_param4_kssj)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
                               />
                             </div>
                           </el-col>
                           <el-col :span="2">
-                            <div class="text-right">至</div>
+                            <div class="text-center">至</div>
                           </el-col>
-                          <el-col :span="6">
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'sx_param4_jssj')">
+                              <el-input
+                                :value="getDisplayName(sItem.sx_param4_jssj)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="1">
+                            <div class="text-center">+</div>
+                          </el-col>
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.sx_param4_sjjg"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center">小时内</div>
+                          </el-col>
+                          <el-col v-if="sItem.condition === '时效'" :span="2">
+                            <div class="button-group">
+                              <el-button
+                                type="primary"
+                                plain
+                                icon="el-icon-plus"
+                                size="mini"
+                                @click="onAddGZ(index, sIndex)"
+                              />
+                              <el-button
+                                v-if="item.condition_content.length !== 1"
+                                size="mini"
+                                type="primary"
+                                plain
+                                icon="el-icon-minus"
+                                @click="onDeleteGZ(index, sIndex)"
+                              />
+                            </div>
+                          </el-col>
+                          <!-- <el-col :span="6">
                             <div class="rule-condition">
                               <el-input
                                 :value="getDisplayName(sItem.sx_2)"
@@ -545,9 +679,9 @@
                           <el-col v-if="sItem.sx_2" :span="5">
                             <el-input v-model="sItem.sx_3" clearable placeholder="请输入" style="width: 100%;" />
                           </el-col>
-                          <el-col :span="3" style="margin-left: 5px;">
+                          <el-col :span="3">
                             <div class="text-right">小时</div>
-                          </el-col>
+                          </el-col> -->
                         </el-row>
                       </el-col>
                       <el-col v-else-if="sItem.condition === '范围'" :span="6">
@@ -731,7 +865,235 @@
                           </el-col>
                         </el-row>
                       </el-col>
-                      <el-col :span="2">
+                      <el-col v-else-if="sItem.condition === '病程记录关联'" :span="22" class="progress-note">
+                        <el-row :gutter="24">
+                          <!-- 参数1 -->
+                          <el-col v-if="sItem.condition === '病程记录关联'" :span="5">
+                            <el-select
+                              v-model="sItem.condition"
+                              filterable
+                              clearable
+                              placeholder="请选择"
+                              style="width: 100%;"
+                            >
+                              <el-option
+                                v-for="(items, bindex) in selectFormula"
+                                :key="bindex"
+                                :label="items.formula"
+                                :value="items.formula"
+                              />
+                            </el-select>
+                          </el-col>
+                          <!-- 参数2 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param1_BLBH"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <!-- 参数3 -->
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'pn_param1')">
+                              <el-input
+                                :value="getDisplayName(sItem.pn_param1)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <!-- 参数4 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param2"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <!-- 参数5 -->
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'pn_param3')">
+                              <el-input
+                                :value="getDisplayName(sItem.pn_param3)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="1">
+                            <div class="text-center" style="line-height: 36px;">在</div>
+                          </el-col>
+                          <!-- 参数6 -->
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'pn_param4_index')">
+                              <el-input
+                                :value="getDisplayName(sItem.pn_param4_index)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center" style="line-height: 36px;">包含</div>
+                          </el-col>
+                          <!-- 参数7 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param4_condition1"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center" style="line-height: 36px;">不包含</div>
+                          </el-col>
+                          <!-- 参数8 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param4_condition2"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <!-- 参数9 -->
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'pn_param4_kssj')">
+                              <el-input
+                                :value="getDisplayName(sItem.pn_param4_kssj)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="1">
+                            <div class="text-center" style="line-height: 36px;">至</div>
+                          </el-col>
+                          <!-- 参数10 -->
+                          <el-col :span="5">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'pn_param4_jssj')">
+                              <el-input
+                                :value="getDisplayName(sItem.pn_param4_jssj)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="1">
+                            <div class="text-center" style="line-height: 36px;">+</div>
+                          </el-col>
+                          <!-- 参数11 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param4_sjjg"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center" style="line-height: 36px;">小时内</div>
+                          </el-col>
+                        </el-row>
+                        <el-row :gutter="24">
+                          <!-- 参数12 -->
+                          <el-col :span="5">
+                            <el-select
+                              v-model="sItem.pn_param5"
+                              filterable
+                              clearable
+                              placeholder="请选择"
+                              style="width: 100%;"
+                            >
+                              <el-option label="关联" value="gl" />
+                              <el-option label="不关联" value="bgl" />
+                            </el-select>
+                          </el-col>
+                          <!-- 参数13 -->
+                          <el-col :span="4">
+                            <div class="rule-condition" @click="openCategoryDialog(index, sIndex, 'pn_param6')">
+                              <el-input
+                                :value="getDisplayName(sItem.pn_param6)"
+                                placeholder="请选择"
+                                size="small"
+                                readonly
+                                style="width: 100%"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center" style="line-height: 36px;">包含</div>
+                          </el-col>
+                          <!-- 参数14 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param6_ct"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col :span="2">
+                            <div class="text-center" style="line-height: 36px;">不含</div>
+                          </el-col>
+                          <!-- 参数15 -->
+                          <el-col :span="4">
+                            <div class="rule-condition">
+                              <el-input
+                                v-model="sItem.pn_param6_oct"
+                                placeholder="请输入"
+                                size="small"
+                                style="width: 100%;"
+                              />
+                            </div>
+                          </el-col>
+                          <el-col v-if="sItem.condition === '病程记录关联'" :span="2">
+                            <div class="button-group">
+                              <el-button
+                                type="primary"
+                                plain
+                                icon="el-icon-plus"
+                                size="mini"
+                                @click="onAddGZ(index, sIndex)"
+                              />
+                              <el-button
+                                v-if="item.condition_content.length !== 1"
+                                size="mini"
+                                type="primary"
+                                plain
+                                icon="el-icon-minus"
+                                @click="onDeleteGZ(index, sIndex)"
+                              />
+                            </div>
+                          </el-col>
+                        </el-row>
+                      </el-col>
+                      <el-col v-if="!(sItem.condition === '病程记录关联' || sItem.condition === '时效')" :span="2">
                         <div class="button-group">
                           <el-button
                             type="primary"
@@ -905,7 +1267,7 @@
 
         </el-row>
       </el-form>
-      <span slot="footer" class="dialog-footer">
+      <span v-if="titleStr !== '详情'" slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm('ruleForm')">提 交</el-button>
         <el-button @click="onTest">测试规则</el-button>
       </span>
@@ -913,35 +1275,33 @@
 
     <!-- 新增选择弹窗 -->
     <el-dialog title="选择类目" :visible.sync="categoryDialogVisible" width="600px" append-to-body>
-      <div class="category-content">
-        <el-row>
-          <el-col :span="8">
-            <!-- 左侧菜单 -->
-            <el-menu :default-active="activeCategory" class="category-menu">
-              <el-menu-item
-                v-for="item in objects"
-                :key="item.field_name"
-                :index="item.field_name"
-                @click="handleCategoryClick(item)"
-              >
-                {{ item.field_name }}
-              </el-menu-item>
-            </el-menu>
-          </el-col>
-          <el-col :span="16">
-            <!-- 右侧子项 -->
-            <div class="sub-category-list">
-              <el-button
-                v-for="subItem in currentSubCategories"
-                :key="subItem.field"
-                @click="handleSubCategorySelect(subItem)"
-              >
-                {{ subItem.field_name }}
-              </el-button>
-            </div>
-          </el-col>
-        </el-row>
-      </div>
+      <el-tabs
+        v-model="activeCategory"
+        type="border-card"
+        class="tab"
+        :tab-position="'left'"
+        style="height:max-content"
+        @tab-click="handleCategoryClick"
+      >
+        <el-tab-pane
+          v-for="(item) in (objects)"
+          :key="item.field_name"
+          :label="item.field_name"
+          :name="item.field_name"
+        >
+          <el-row slot="label" type="flex" align="middle">{{ item.field_name }}</el-row>
+          <div class="grid-container">
+            <el-tag
+              v-for="(tag) in item.child"
+              :key="tag.field"
+              size="large"
+              @click="handleSubCategorySelect(tag)"
+            >
+              {{ tag.field_name }}
+            </el-tag>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
     </el-dialog>
 
     <!-- 修改知识库弹窗 -->
@@ -1133,7 +1493,33 @@ export default {
                 subtract_value: '',
                 subtract_value_type: 'number',
                 hasChildOptions: false,
-                childOptions: []
+                childOptions: [],
+                // 病程记录关联
+                pn_param1_BLBH: '',
+                pn_param1: [],
+                pn_param2: '',
+                pn_param3: [],
+                pn_param4_index: [],
+                pn_param4_condition1: '',
+                pn_param4_condition2: '',
+                pn_param4_kssj: [],
+                pn_param4_jssj: [],
+                pn_param4_sjjg: '',
+                pn_param5: '',
+                pn_param6: [],
+                pn_param6_ct: '',
+                pn_param6_oct: '',
+                // 时效
+                sx_param1: [],
+                sx_param2: '',
+                sx_param3: [],
+                sx_param4_index: [],
+                sx_param4_kssj: [],
+                sx_param4_jssj: [],
+                sx_param4_condition1: '',
+                sx_param4_condition2: '',
+                sx_param4_sjjg: ''
+
               }
             ],
             custom_basis: [], // 质控依据
@@ -1220,7 +1606,7 @@ export default {
   },
   computed: {
     titleStr() {
-      return this.data.row.id ? '编辑' : '新增'
+      return this.data.row.id ? this.data.actionType === 'DETAIL' ? '详情' : '编辑' : '新增'
     },
     filteredCategories() {
       if (!this.searchKeyword) return this.categories
@@ -1293,6 +1679,35 @@ export default {
         const ruleList = this.getQcRule(p.rule_list)
         ruleList.forEach(rule => {
           rule.condition_content.forEach(item => {
+            if (item.condition === '病程记录关联') {
+              // 病程记录关联
+              item.pn_param1_BLBH = item.param1[2]
+              item.pn_param1 = [item.param1[0], item.param1[1]]
+              item.pn_param2 = item.param2
+              item.pn_param3 = item.param3
+              item.pn_param4_index = item.param4[0].index && (item.param4[0].index).split('.') || []
+              item.pn_param4_condition1 = item.param4[0].condition1
+              item.pn_param4_condition2 = item.param4[0].condition2
+              item.pn_param4_kssj = item.param4[0].kssj && (item.param4[0].kssj).split('.') || []
+              item.pn_param4_jssj = item.param4[0].jssj && (item.param4[0].jssj).split('.') || []
+              item.pn_param4_sjjg = item.param4[0].sjjg
+              item.pn_param5 = item.param5
+              item.pn_param6 = item.param6[0] && (item.param6[0]).split('.') || []
+              item.pn_param6_ct = item.param6[1]
+              item.pn_param6_oct = item.param6[2]
+            }
+            if (item.condition === '时效') {
+              // 时效
+              item.sx_param1 = [item.param1[0], item.param1[1]]
+              item.sx_param2 = item.param2
+              item.sx_param3 = [item.param3[0], item.param3[1]]
+              item.sx_param4_index = item.param4[0].index && (item.param4[0].index).split('.') || []
+              item.sx_param4_condition1 = item.param4[0].condition1
+              item.sx_param4_condition2 = item.param4[0].condition2
+              item.sx_param4_kssj = item.param4[0].kssj && (item.param4[0].kssj).split('.') || []
+              item.sx_param4_jssj = item.param4[0].jssj && (item.param4[0].jssj).split('.') || []
+              item.sx_param4_sjjg = item.param4[0].sjjg
+            }
             // 如果是字典类型且 param2 是字符串,转换为数组
             if (item.hasChildOptions && typeof item.param2 === 'string' && item.param2) {
               item.param2 = item.param2.split(',')
@@ -1434,7 +1849,32 @@ export default {
         subtract_value: '',
         subtract_value_type: 'number',
         hasChildOptions: false,
-        childOptions: []
+        childOptions: [],
+        // 病程记录关联
+        pn_param1_BLBH: '',
+        pn_param1: [],
+        pn_param2: '',
+        pn_param3: [],
+        pn_param4_index: [],
+        pn_param4_condition1: '',
+        pn_param4_condition2: '',
+        pn_param4_kssj: [],
+        pn_param4_jssj: [],
+        pn_param4_sjjg: '',
+        pn_param5: '',
+        pn_param6: [],
+        pn_param6_ct: '',
+        pn_param6_oct: '',
+        // 时效
+        sx_param1: [],
+        sx_param2: '',
+        sx_param3: [],
+        sx_param4_index: [],
+        sx_param4_kssj: [],
+        sx_param4_jssj: [],
+        sx_param4_condition1: '',
+        sx_param4_condition2: '',
+        sx_param4_sjjg: ''
       })
     },
     // 删除质控逻辑大框中_逻辑
@@ -1535,42 +1975,109 @@ export default {
         if (valid) {
           if (this.judgeQZTJ()) {
             const processConditionContent = (content) => {
+              const contentArr = []
               content.forEach(item => {
-                // 处理多选值
-                if (Array.isArray(item.param2)) {
-                  item.param2 = item.param2.join(',')
-                }
-                if (item.condition === '减' && item.subtract_param) {
-                  // 组合减法条件的完整表达式
-                  const subtractValue = this.getDisplayName(item.subtract_param)
-                  if (subtractValue) {
-                    // 获取父级字段名
-                    const [parentField] = item.subtract_param
-                    // 构造 param2 格式: parentField.field
-                    item.param2 = `${parentField}.${item.subtract_param[1]}`
+                const element = { ...item }
+                if (element.condition === '病程记录关联') {
+                  const elementParams = {
+                    param1: [
+                      Array.isArray(element.pn_param1) && !!(element.pn_param1.length) ? element.pn_param1[0] : '',
+                      Array.isArray(element.pn_param1) && !!(element.pn_param1.length) ? element.pn_param1[1] : '',
+                      element.pn_param1_BLBH
+                    ],
+                    param2: element.pn_param2,
+                    condition: element.condition,
+                    param3: [
+                      Array.isArray(element.pn_param3) && !!(element.pn_param3.length) ? element.pn_param3[0] : '',
+                      Array.isArray(element.pn_param3) && !!(element.pn_param3.length) ? element.pn_param3[1] : ''
+                    ],
+                    param4: [
+                      {
+                        kssj: element.pn_param4_kssj.join('.'),
+                        jssj: element.pn_param4_jssj.join('.'),
+                        sjjg: element.pn_param4_sjjg,
+                        index: element.pn_param4_index.join('.'),
+                        condition1: element.pn_param4_condition1,
+                        condition2: element.pn_param4_condition2
+                      }
+                    ],
+                    param5: element.pn_param5,
+                    param6: [
+                      element.pn_param6.join('.'),
+                      element.pn_param6_ct,
+                      element.pn_param6_oct
+                    ]
                   }
-                }
-                // 对重复率条件的特殊处理
-                if (item.condition === '重复率') {
-                  // 确保param2格式正确
-                  if (item.param2_object && Array.isArray(item.param2_object)) {
-                    const [field1, field2] = item.param2_object
-                    item.param2 = `${field1}.${field2}`
+                  contentArr.push(elementParams)
+                } else if (element.condition === '时效') {
+                  const elementParams = {
+                    param1: [
+                      Array.isArray(element.sx_param1) && !!(element.sx_param1.length) ? element.sx_param1[0] : '',
+                      Array.isArray(element.sx_param1) && !!(element.sx_param1.length) ? element.sx_param1[1] : ''
+                    ],
+                    param2: element.sx_param2,
+                    condition: element.condition,
+                    param3: [
+                      Array.isArray(element.sx_param3) && !!(element.sx_param3.length) ? element.sx_param3[0] : '',
+                      Array.isArray(element.sx_param3) && !!(element.sx_param3.length) ? element.sx_param3[1] : ''
+                    ],
+                    param4: [
+                      {
+                        kssj: element.sx_param4_kssj.join('.'),
+                        jssj: element.sx_param4_jssj.join('.'),
+                        sjjg: element.sx_param4_sjjg,
+                        index: element.sx_param4_index.join('.'),
+                        condition1: element.sx_param4_condition1,
+                        condition2: element.sx_param4_condition2
+                      }
+                    ]
+                  }
+                  contentArr.push(elementParams)
+                } else {
+                  // 处理多选值
+                  if (Array.isArray(element.param2)) {
+                    element.param2 = element.param2.join(',')
+                  }
+                  if (element.condition === '减' && element.subtract_param) {
+                    // 组合减法条件的完整表达式
+                    const subtractValue = this.getDisplayName(element.subtract_param)
+                    if (subtractValue) {
+                      // 获取父级字段名
+                      const [parentField] = element.subtract_param
+                      // 构造 param2 格式: parentField.field
+                      element.param2 = `${parentField}.${element.subtract_param[1]}`
+                    }
                   }
-                  // 确保subtract_value是数字格式
-                  if (item.subtract_value !== undefined) {
-                    item.subtract_value = Number(item.subtract_value)
+                  // 对重复率条件的特殊处理
+                  if (element.condition === '重复率') {
+                    // 确保param2格式正确
+                    if (element.param2_object && Array.isArray(element.param2_object)) {
+                      const [field1, field2] = element.param2_object
+                      element.param2 = `${field1}.${field2}`
+                    }
+                    // 确保subtract_value是数字格式
+                    if (element.subtract_value !== undefined) {
+                      element.subtract_value = Number(element.subtract_value)
+                    }
                   }
+                  contentArr.push(element)
                 }
               })
+              return contentArr
             }
 
             // 处理前置条件和质控逻辑中的减法条件
             this.ruleForm.qztj.forEach(item => {
               processConditionContent(item.condition_content)
             })
+            console.log('=============this.ruleForm', this.ruleForm.rule)
+
+            const rules = []
             this.ruleForm.rule.forEach(item => {
-              processConditionContent(item.condition_content)
+              rules.push({
+                ...item,
+                condition_content: processConditionContent(item.condition_content)
+              })
             })
 
             // 继续原有的提交逻辑
@@ -1586,8 +2093,9 @@ export default {
               error_level: this.ruleForm.error_level,
               status: this.ruleForm.status,
               rule_type: this.ruleForm.rule_type,
-              rule: [...this.ruleForm.rule, ...this.ruleForm.qztj]
+              rule: [...rules, ...this.ruleForm.qztj]
             }
+            console.log('>>>>>>>>>>>>>>>>>>>>', params)
             if (this.data.row.id) {
               params.id = this.data.row.id
             }
@@ -1648,7 +2156,8 @@ export default {
     },
     // 点击左侧类目
     handleCategoryClick(item) {
-      this.activeCategory = item.field_name
+      console.log('>>>>>>>>>>>>>>>>>>>>>', item)
+      this.activeCategory = item.name
       this.currentSubCategories = item.child || []
     },
     // 选择右侧子类目
@@ -1842,6 +2351,38 @@ export default {
               condition.param2 = `${parentField}.${subItem.field}`
             }
           }
+        } else if (this.currentSource === 'pn_param1' || this.currentSource === 'pn_param3' || this.currentSource === 'pn_param6' || this.currentSource === 'pn_param4_index' || this.currentSource === 'pn_param4_kssj' || this.currentSource === 'pn_param4_jssj') {
+          // 判断是在前置条件还是质控逻辑中
+          if (this.currentInputSource === 'qztj') {
+            const condition = this.ruleForm.qztj[this.currentRuleIndex].condition_content[this.currentConditionIndex]
+            if (condition) {
+              // 存储完整的对象选择,而不只是字段名
+              condition.param2_object = [parentField, subItem.field]
+              // 同时更新param2为字符串表示形式,用于提交
+              condition.param2 = `${parentField}.${subItem.field}`
+            }
+          } else {
+            const condition = this.ruleForm.rule[this.currentRuleIndex].condition_content[this.currentConditionIndex]
+            if (condition) {
+              condition[this.currentSource] = [parentField, subItem.field]
+            }
+          }
+        } else if (this.currentSource === 'sx_param1' || this.currentSource === 'sx_param3' || this.currentSource === 'sx_param4_index' || this.currentSource === 'sx_param4_kssj' || this.currentSource === 'sx_param4_jssj') {
+          // 判断是在前置条件还是质控逻辑中
+          if (this.currentInputSource === 'qztj') {
+            const condition = this.ruleForm.qztj[this.currentRuleIndex].condition_content[this.currentConditionIndex]
+            if (condition) {
+              // 存储完整的对象选择,而不只是字段名
+              condition.param2_object = [parentField, subItem.field]
+              // 同时更新param2为字符串表示形式,用于提交
+              condition.param2 = `${parentField}.${subItem.field}`
+            }
+          } else {
+            const condition = this.ruleForm.rule[this.currentRuleIndex].condition_content[this.currentConditionIndex]
+            if (condition) {
+              condition[this.currentSource] = [parentField, subItem.field]
+            }
+          }
         }
       }
       this.categoryDialogVisible = false
@@ -2372,4 +2913,36 @@ export default {
   gap: 10px;
   padding: 10px;
 }
+
+.progress-note {
+  .el-row {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: flex-start;
+  }
+  .el-col {
+    margin-bottom: 10px;
+  }
+}
+.grid-container {
+    display: grid;
+    grid-template-columns: repeat(3, 1fr);
+    gap: 10px;
+    .el-tag {
+        text-align: center;
+    }
+}
+::v-deep .el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable {
+    padding: 0;
+
+    .el-tabs__nav-prev {
+        display: none;
+        height: 0px;
+    }
+
+    .el-tabs__nav-next {
+        display: none;
+        height: 0;
+    }
+}
 </style>

+ 9 - 2
src/views/rule/config/components/TableBox.vue

@@ -298,8 +298,15 @@ export default {
     },
     // 查看规则
     onRuleDetail(row) {
-      this.ruleData.row = row
-      this.ruleData.bSwitch = true
+      if (this.ruleType === 1) {
+        // 病历规则
+        this.createData.row = row
+        this.createData.bSwitch = true
+        this.createData.actionType = 'DETAIL'
+      } else {
+        this.ruleData.row = row
+        this.ruleData.bSwitch = true
+      }
     },
     handleCheckAllChange(val) {
       this.codes = val ? this.defaultCodes : []