Explorar el Código

更新自定义规则

lzh hace 4 meses
padre
commit
ef4a03df12
Se han modificado 4 ficheros con 612 adiciones y 426 borrados
  1. 2 1
      .eslintrc.js
  2. 2 1
      package.json
  3. 605 421
      src/views/rule/config/components/CreateDialog.vue
  4. 3 3
      vue.config.js

+ 2 - 1
.eslintrc.js

@@ -2,7 +2,8 @@ module.exports = {
   root: true,
   parserOptions: {
     parser: 'babel-eslint',
-    sourceType: 'module'
+    sourceType: 'module',
+    ecmaVersion: 2020
   },
   env: {
     browser: true,

+ 2 - 1
package.json

@@ -12,7 +12,8 @@
     "new": "plop",
     "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
     "test:unit": "jest --clearCache && vue-cli-service test:unit",
-    "test:ci": "npm run lint && npm run test:unit"
+    "test:ci": "npm run lint && npm run test:unit",
+    "build": "vue-cli-service build"
   },
   "dependencies": {
     "axios": "0.18.1",

+ 605 - 421
src/views/rule/config/components/CreateDialog.vue

@@ -1,432 +1,489 @@
 <template>
-  <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-row :gutter="16">
-        <el-col :span="8">
-          <el-form-item label="病历类型" prop="case_type">
-            <el-select v-model="ruleForm.case_type" filterable clearable placeholder="请选择" style="width: 100%;">
-              <el-option label="出院记录" value="出院记录" />
-              <el-option label="入院记录" value="入院记录" />
-              <el-option label="病程类" value="病程类" />
-              <el-option label="手术类" value="手术类" />
-              <el-option label="医嘱" value="医嘱" />
-              <el-option label="费用" value="费用" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="质控项目" prop="object">
-            <el-cascader
-              v-model="ruleForm.object"
-              :options="objects"
-              :props="{
-                expandTrigger: 'hover',
-                value: 'field_name',
-                label: 'field_name',
-                children: 'child'
-              }"
-              clearable
-              filterable
-              :show-all-levels="false"
-              placeholder="请选择"
-              style="width: 100%;"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="质控科室">
-            <el-select
-              v-model="ruleForm.department"
-              multiple
-              collapse-tags
-              placeholder="请选择"
-              style="width: 100%;"
-            >
-              <el-option
-                v-for="item in departments"
-                :key="item.id"
-                :label="item.dep_name"
-                :value="item.dep_id"
+  <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-row :gutter="16">
+          <el-col :span="8">
+            <el-form-item label="病历类型" prop="case_type">
+              <el-select v-model="ruleForm.case_type" filterable clearable placeholder="请选择" style="width: 100%;">
+                <el-option label="出院记录" value="出院记录" />
+                <el-option label="入院记录" value="入院记录" />
+                <el-option label="病程类" value="病程类" />
+                <el-option label="手术类" value="手术类" />
+                <el-option label="医嘱" value="医嘱" />
+                <el-option label="费用" value="费用" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="质控项目" prop="object">
+              <el-cascader
+                v-model="ruleForm.object"
+                :options="objects"
+                :props="{
+                  expandTrigger: 'hover',
+                  value: 'field_name',
+                  label: 'field_name',
+                  children: 'child'
+                }"
+                clearable
+                filterable
+                :show-all-levels="false"
+                placeholder="请选择"
+                style="width: 100%;"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="8">
+            <el-form-item label="单项否决">
+              <el-select v-model="ruleForm.is_not" filterable clearable placeholder="请选择" style="width: 100%;">
+                <el-option label="是" :value="1" />
+                <el-option label="否" :value="0" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="质控状态" prop="status">
+              <el-select v-model="ruleForm.status" filterable clearable placeholder="请选择" style="width: 100%;">
+                <el-option label="开启" :value="1" />
+                <el-option label="禁用" :value="2" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="质控类型" prop="type">
+              <el-select v-model="ruleForm.type" filterable clearable placeholder="请选择" style="width: 100%;">
+                <el-option label="时效性" value="时效性" />
+                <el-option label="完整性" value="完整性" />
+                <el-option label="逻辑性" value="逻辑性" />
+                <el-option label="内涵性" value="内涵性" />
+                <el-option label="专病规则" value="专病规则" />
+                <el-option label="专科规则" value="专科规则" />
+                <el-option label="检查规则" value="检查规则" />
+                <el-option label="检验规则" value="检验规则" />
+                <el-option label="其他规则" value="其他规则" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="质控场景" prop="changjing">
+              <el-select v-model="ruleForm.changjing" multiple collapse-tags filterable clearable placeholder="请选择" style="width: 100%;">
+                <el-option label="医生端" value="医生端" />
+                <el-option label="编码员" value="编码员" />
+                <el-option label="质控员" value="质控员" />
+                <el-option label="国考" value="国考" />
+                <el-option label="卫统" value="卫统" />
+                <el-option label="医保" value="医保" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="风险等级" prop="error_level">
+              <el-select v-model="ruleForm.error_level" filterable clearable placeholder="请选择" style="width: 100%;">
+                <el-option label="低风险" :value="1" />
+                <el-option label="中风险" :value="2" />
+                <el-option label="高风险" :value="3" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="扣分分值" prop="score">
+              <el-input-number v-model="ruleForm.score" :precision="1" :step="0.5" step-strictly :max="100" :min="0" controls-position="right" placeholder="请输入" style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="规则描述" prop="description">
+              <el-input
+                v-model="ruleForm.description"
+                type="textarea"
+                :autosize="{ minRows: 3 }"
+                placeholder="请输入"
               />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="单项否决">
-            <el-select v-model="ruleForm.is_not" filterable clearable placeholder="请选择" style="width: 100%;">
-              <el-option label="是" :value="1" />
-              <el-option label="否" :value="0" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="质控状态" prop="status">
-            <el-select v-model="ruleForm.status" filterable clearable placeholder="请选择" style="width: 100%;">
-              <el-option label="开启" :value="1" />
-              <el-option label="禁用" :value="2" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="质控类型" prop="type">
-            <el-select v-model="ruleForm.type" filterable clearable placeholder="请选择" style="width: 100%;">
-              <el-option label="时效性" value="时效性" />
-              <el-option label="完整性" value="完整性" />
-              <el-option label="逻辑性" value="逻辑性" />
-              <el-option label="内涵性" value="内涵性" />
-              <el-option label="专病规则" value="专病规则" />
-              <el-option label="专科规则" value="专科规则" />
-              <el-option label="检查规则" value="检查规则" />
-              <el-option label="检验规则" value="检验规则" />
-              <el-option label="其他规则" value="其他规则" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="质控场景" prop="changjing">
-            <el-select v-model="ruleForm.changjing" multiple collapse-tags filterable clearable placeholder="请选择" style="width: 100%;">
-              <el-option label="医生端" value="医生端" />
-              <el-option label="编码员" value="编码员" />
-              <el-option label="质控员" value="质控员" />
-              <el-option label="国考" value="国考" />
-              <el-option label="卫统" value="卫统" />
-              <el-option label="医保" value="医保" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="风险等级" prop="error_level">
-            <el-select v-model="ruleForm.error_level" filterable clearable placeholder="请选择" style="width: 100%;">
-              <el-option label="低风险" :value="1" />
-              <el-option label="中风险" :value="2" />
-              <el-option label="高风险" :value="3" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="扣分分值" prop="score">
-            <el-input-number v-model="ruleForm.score" :precision="1" :step="0.5" step-strictly :max="100" :min="0" controls-position="right" placeholder="请输入" style="width: 100%;" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="规则描述" prop="description">
-            <el-input
-              v-model="ruleForm.description"
-              type="textarea"
-              :autosize="{ minRows: 3 }"
-              placeholder="请输入"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="质控规则">
-            <el-col :span="5">
-              <el-form-item label="规则模板" prop="rule_type">
-                <el-select v-model="ruleForm.rule_type" filterable placeholder="请选择" style="width: 100%;">
-                  <el-option label="普通规则" value="普通规则" />
-                  <!-- <el-option label="时效性规则" value="时效性规则" />
-                  <el-option label="完整性规则" value="完整性规则" />
-                  <el-option label="知识库规则" value="知识库规则" />
-                  <el-option label="大模型规则" value="大模型规则" /> -->
-                </el-select>
-              </el-form-item>
-            </el-col>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="质控规则">
+              <el-col :span="5">
+                <el-form-item label="规则模板" prop="rule_type">
+                  <el-select v-model="ruleForm.rule_type" filterable placeholder="请选择" style="width: 100%;">
+                    <el-option label="普通规则" value="普通规则" />
+                    <!-- <el-option label="时效性规则" value="时效性规则" />
+                    <el-option label="完整性规则" value="完整性规则" />
+                    <el-option label="知识库规则" value="知识库规则" />
+                    <el-option label="大模型规则" value="大模型规则" /> -->
+                  </el-select>
+                </el-form-item>
+              </el-col>
 
-            <el-col :span="24" style="margin-bottom: 20px;">
-              <el-button type="primary" plain icon="el-icon-plus" @click="onAddQZTJ">前置条件</el-button>
-              <el-button type="primary" plain icon="el-icon-plus" @click="onAddZKYJ">质控依据</el-button>
-              <el-button type="primary" plain icon="el-icon-plus" @click="onAddZKyujing">质控预警</el-button>
-            </el-col>
+              <el-col :span="24" style="margin-bottom: 20px;">
+                <el-button type="primary" plain icon="el-icon-plus" @click="onAddQZTJ">前置条件</el-button>
+                <el-button type="primary" plain icon="el-icon-plus" @click="onAddZKYJ">质控依据</el-button>
+                <el-button type="primary" plain icon="el-icon-plus" @click="onAddZKyujing">质控预警</el-button>
+              </el-col>
+
+              <!-- 前置条件 -->
+              <el-col v-if="ruleForm.qztj.length" :span="24">
+                <el-card v-for="(item, index) of ruleForm.qztj" :key="'qztj'+index" class="box-card" shadow="never">
+                  <div slot="header" class="clearfix box-card_header span">
+                    <span class="text">前置条件{{ index + 1 }}</span>
+                    <span class="ml40">
+                      <span>流向</span>
+                      <el-radio v-model="item.condition_type" :label="1" class="ml40">过滤</el-radio>
+                      <el-radio v-model="item.condition_type" :label="2">免审</el-radio>
+                    </span>
+                    <i class="el-icon-delete" style="float: right; margin-top: 13px; cursor: pointer;" @click="onDeleteQZTJ(index)" />
+                  </div>
+                  <div>
+                    <el-row v-for="(sItem, sIndex) of item.condition_content" :key="'tj'+sIndex" :gutter="12" class="mb12">
+                      <el-col :span="2">
+                        <div class="text-right">条件{{ sIndex + 1 }}</div>
+                      </el-col>
+                      <el-col :span="8">
+                        <div class="rule-condition">
+                          <el-input
+                            :value="getDisplayName(sItem.param1)"
+                            placeholder="请选择"
+                            size="small"
+                            style="width: calc(100% - 90px)"
+                            readonly
+                            @click="openCategoryDialog(index, sIndex)"
+                          />
+                          <el-button
+                            size="small"
+                            style="width: 90px"
+                            class="category-select"
+                            @click="openCategoryDialog(index, sIndex)"
+                          >
+                            <i class="el-icon-s-operation" style="margin-right: 5px" />
+                            选择
+                          </el-button>
+                        </div>
+                      </el-col>
+                      <el-col :span="4">
+                        <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="6">
+                        <el-input v-model="sItem.param2" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col :span="4">
+                        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="onAddTJ(index, sIndex)" />
+                        <el-button v-if="item.condition_content.length !== 1" size="mini" type="primary" plain icon="el-icon-minus" @click="onDeleteTJ(index, sIndex)" />
+                      </el-col>
+                    </el-row>
+                    <div class="span">
+                      <span>条件之间的逻辑</span>
+                      <el-radio v-model="item.condition_relation" :label="1" class="ml40">且(满足所有条件)</el-radio>
+                      <el-radio v-model="item.condition_relation" :label="2">或(满足任意一条件)</el-radio>
+                    </div>
+                  </div>
+                </el-card>
+              </el-col>
 
-            <!-- 前置条件 -->
-            <el-col v-if="ruleForm.qztj.length" :span="24">
-              <el-card v-for="(item, index) of ruleForm.qztj" :key="'qztj'+index" class="box-card" shadow="never">
-                <div slot="header" class="clearfix box-card_header span">
-                  <span class="text">前置条件{{ index + 1 }}</span>
-                  <span class="ml40">
-                    <span>流向</span>
-                    <el-radio v-model="item.condition_type" :label="1" class="ml40">过滤</el-radio>
-                    <el-radio v-model="item.condition_type" :label="2">免审</el-radio>
-                  </span>
-                  <i class="el-icon-delete" style="float: right; margin-top: 13px; cursor: pointer;" @click="onDeleteQZTJ(index)" />
-                </div>
-                <div>
-                  <el-row v-for="(sItem, sIndex) of item.condition_content" :key="'tj'+sIndex" :gutter="12" class="mb12">
-                    <el-col :span="2">
-                      <div class="text-right">条件{{ sIndex + 1 }}</div>
-                    </el-col>
-                    <el-col :span="8">
-                      <el-cascader
-                        v-model="sItem.param1"
-                        :options="objects"
-                        :props="{
-                          expandTrigger: 'hover',
-                          value: 'field',
-                          label: 'field_name',
-                          children: 'child'
-                        }"
-                        clearable
-                        filterable
-                        :show-all-levels="false"
-                        placeholder="请选择"
-                        style="width: 100%;"
-                      />
-                    </el-col>
-                    <el-col :span="4">
-                      <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="6">
-                      <el-input v-model="sItem.param2" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col :span="4">
-                      <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="onAddTJ(index, sIndex)" />
-                      <el-button v-if="item.condition_content.length !== 1" size="mini" type="primary" plain icon="el-icon-minus" @click="onDeleteTJ(index, sIndex)" />
-                    </el-col>
-                  </el-row>
-                  <div class="span">
-                    <span>条件之间的逻辑</span>
-                    <el-radio v-model="item.condition_relation" :label="1" class="ml40">且(满足所有条件)</el-radio>
-                    <el-radio v-model="item.condition_relation" :label="2">或(满足任意一条件)</el-radio>
+              <!-- 质控逻辑 -->
+              <el-col :span="24">
+                <el-divider />
+                <el-card v-for="(item, index) of ruleForm.rule" :key="'rule'+index" class="box-card" shadow="never">
+                  <div slot="header" class="clearfix box-card_header span">
+                    <span class="text">质控逻辑</span>
+                    <span class="ml40">
+                      <span>流向</span>
+                      <el-radio v-model="item.detail_status" :label="1" class="ml40">正确</el-radio>
+                      <el-radio v-model="item.detail_status" :label="2">错误</el-radio>
+                    </span>
                   </div>
-                </div>
-              </el-card>
-            </el-col>
+                  <div>
+                    <el-row v-for="(sItem, sIndex) of item.condition_content" :key="'tj'+sIndex" :gutter="12" class="mb12">
+                      <el-col :span="1.5">
+                        <div class="text-right">逻辑{{ sIndex + 1 }}</div>
+                      </el-col>
+                      <el-col :span="5">
+                        <div class="rule-condition">
+                          <el-input
+                            :value="getDisplayName(sItem.param1)"
+                            placeholder="请选择"
+                            size="small"
+                            style="width: calc(100% - 90px)"
+                            readonly
+                            @click="openCategoryDialog(index, sIndex)"
+                          />
+                          <el-button
+                            size="small"
+                            style="width: 90px"
+                            class="category-select"
+                            @click="openCategoryDialog(index, sIndex)"
+                          >
+                            <i class="el-icon-s-operation" style="margin-right: 5px" />
+                            选择
+                          </el-button>
+                        </div>
+                      </el-col>
+                      <el-col :span="4">
+                        <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 v-if="sItem.condition == '等于' || sItem.condition == '不等于'|| sItem.condition == '包含' || sItem.condition == '不包含'" :span="6">
+                        <div class="input-with-category">
+                          <el-input
+                            v-model="sItem.param2"
+                            placeholder="请输入"
+                            size="small"
+                            style="width: calc(100% - 90px)"
+                          />
+                          <el-select
+                            v-model="sItem.categoryType"
+                            size="small"
+                            placeholder="文本"
+                            style="width: 90px"
+                            class="category-select"
+                          >
+                            <i slot="prefix" class="el-icon-s-operation" />
+                            <el-option
+                              v-for="item in categories"
+                              :key="item.value"
+                              :label="item.label"
+                              :value="item.value"
+                            />
+                          </el-select>
+                        </div>
+                      </el-col>
+                      <el-col v-if="sItem.condition == '范围'" :span="3">
+                        <el-input v-model="sItem.fanwei_1" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col v-if="sItem.condition == '范围'" :span="1">
+                        <div class="text-right">至</div>
+                      </el-col>
+                      <el-col v-if="sItem.condition == '范围'" :span="3">
+                        <el-input v-model="sItem.fanwei_2" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <!-- 时效 -->
+                      <el-col v-if="sItem.condition == '时效'" :span="3">
+                        <el-cascader
+                          v-model="sItem.sx_1"
+                          :options="objects"
+                          :props="{
+                            expandTrigger: 'hover',
+                            value: 'field',
+                            label: 'field_name',
+                            children: 'child'
+                          }"
+                          clearable
+                          filterable
+                          :show-all-levels="false"
+                          placeholder="请选择"
+                          style="width: 100%;"
+                        />
+                      </el-col>
+                      <el-col v-if="sItem.condition == '时效'" :span="0.5">
+                        <div class="text-right">至</div>
+                      </el-col>
+                      <el-col v-if="sItem.condition == '时效'" :span="3">
+                        <el-cascader
+                          v-model="sItem.sx_2"
+                          :options="objects"
+                          :props="{
+                            expandTrigger: 'hover',
+                            value: 'field',
+                            label: 'field_name',
+                            children: 'child'
+                          }"
+                          clearable
+                          filterable
+                          :show-all-levels="false"
+                          placeholder="请选择"
+                          style="width: 100%;"
+                        />
+                      </el-col>
+                      <el-col v-if="sItem.condition == '时效' && sItem.sx_2" :span="0.5">
+                        <div class="text-right">+</div>
+                      </el-col>
+                      <el-col v-if="sItem.condition == '时效' && sItem.sx_2" :span="2">
+                        <el-input v-model="sItem.sx_3" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col v-if="sItem.condition == '时效'" :span="1">
+                        <div class="text-right">小时</div>
+                      </el-col>
+                      <el-col :span="3">
+                        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="onAddGZ(index, sIndex)" />
+                        <el-button v-if="item.condition_content.length !== 1" type="primary" size="mini" plain icon="el-icon-minus" @click="onDeleteGZ(index, sIndex)" />
 
-            <!-- 质控逻辑 -->
-            <el-col :span="24">
-              <el-divider />
-              <el-card v-for="(item, index) of ruleForm.rule" :key="'rule'+index" class="box-card" shadow="never">
-                <div slot="header" class="clearfix box-card_header span">
-                  <span class="text">质控逻辑</span>
-                  <span class="ml40">
-                    <span>流向</span>
-                    <el-radio v-model="item.detail_status" :label="1" class="ml40">正确</el-radio>
-                    <el-radio v-model="item.detail_status" :label="2">错误</el-radio>
-                  </span>
-                </div>
-                <div>
-                  <el-row v-for="(sItem, sIndex) of item.condition_content" :key="'tj'+sIndex" :gutter="12" class="mb12">
-                    <el-col :span="1.5">
-                      <div class="text-right">逻辑{{ sIndex + 1 }}</div>
-                    </el-col>
-                    <el-col :span="5">
-                      <el-cascader
-                        v-model="sItem.param1"
-                        :options="objects"
-                        :props="{
-                          expandTrigger: 'hover',
-                          value: 'field',
-                          label: 'field_name',
-                          children: 'child'
-                        }"
-                        clearable
-                        filterable
-                        :show-all-levels="false"
-                        placeholder="请选择"
-                        style="width: 100%;"
-                      />
-                    </el-col>
-                    <el-col :span="4">
-                      <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 v-if=" sItem.condition == '等于' || sItem.condition == '不等于'|| sItem.condition == '包含' || sItem.condition == '不包含'" :span="4">
-                      <el-autocomplete
-                        v-model="sItem.param2"
-                        class="inline-input"
-                        value-key="name"
-                        :fetch-suggestions="querySearch"
-                        placeholder="请输入"
-                        style="width: 100%;"
-                        @select="handleSelect"
-                      />
-                    </el-col>
-                    <el-col v-if="sItem.condition == '范围'" :span="3">
-                      <el-input v-model="sItem.fanwei_1" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col v-if="sItem.condition == '范围'" :span="1">
-                      <div class="text-right">至</div>
-                    </el-col>
-                    <el-col v-if="sItem.condition == '范围'" :span="3">
-                      <el-input v-model="sItem.fanwei_2" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <!-- 时效 -->
-                    <el-col v-if="sItem.condition == '时效'" :span="3">
-                      <el-cascader
-                        v-model="sItem.sx_1"
-                        :options="objects"
-                        :props="{
-                          expandTrigger: 'hover',
-                          value: 'field',
-                          label: 'field_name',
-                          children: 'child'
-                        }"
-                        clearable
-                        filterable
-                        :show-all-levels="false"
-                        placeholder="请选择"
-                        style="width: 100%;"
-                      />
-                    </el-col>
-                    <el-col v-if="sItem.condition == '时效'" :span="0.5">
-                      <div class="text-right">至</div>
-                    </el-col>
-                    <el-col v-if="sItem.condition == '时效'" :span="3">
-                      <el-cascader
-                        v-model="sItem.sx_2"
-                        :options="objects"
-                        :props="{
-                          expandTrigger: 'hover',
-                          value: 'field',
-                          label: 'field_name',
-                          children: 'child'
-                        }"
-                        clearable
-                        filterable
-                        :show-all-levels="false"
-                        placeholder="请选择"
-                        style="width: 100%;"
-                      />
-                    </el-col>
-                    <el-col v-if="sItem.condition == '时效' && sItem.sx_2" :span="0.5">
-                      <div class="text-right">+</div>
-                    </el-col>
-                    <el-col v-if="sItem.condition == '时效' && sItem.sx_2" :span="2">
-                      <el-input v-model="sItem.sx_3" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col v-if="sItem.condition == '时效'" :span="1">
-                      <div class="text-right">小时</div>
-                    </el-col>
-                    <el-col :span="3">
-                      <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="onAddGZ(index, sIndex)" />
-                      <el-button v-if="item.condition_content.length !== 1" type="primary" size="mini" plain icon="el-icon-minus" @click="onDeleteGZ(index, sIndex)" />
-                    </el-col>
-                  </el-row>
-                  <div class="span">
-                    <span>规则之间的逻辑</span>
-                    <el-radio v-model="item.condition_relation" :label="1" class="ml40">且(满足所有条件)</el-radio>
-                    <el-radio v-model="item.condition_relation" :label="2">或(满足任意一条件)</el-radio>
+                      </el-col>
+                    </el-row>
+                    <div class="span">
+                      <span>规则之间的逻辑</span>
+                      <el-radio v-model="item.condition_relation" :label="1" class="ml40">且(满足所有条件)</el-radio>
+                      <el-radio v-model="item.condition_relation" :label="2">或(满足任意一条件)</el-radio>
+                    </div>
+                  </div>
+                </el-card>
+              </el-col>
+              <!-- 质控依据 -->
+              <el-col v-if="ruleForm.rule[0].custom_basis.length" :span="24">
+                <el-card v-for="(item, index) of ruleForm.rule" :key="'rule'+index" class="box-card" shadow="never">
+                  <div slot="header" class="clearfix box-card_header span">
+                    <span class="text">质控依据</span>
+                    <i class="el-icon-delete" style="float: right; margin-top: 13px; cursor: pointer;" @click="onDeleteZKYJ(index)" />
+                  </div>
+                  <div>
+                    <el-row v-for="(sItem, sIndex) of item.custom_basis" :key="'tj'+sIndex" :gutter="12" class="mb12">
+                      <el-col :span="2">
+                        <div class="text-right">条件{{ sIndex + 1 }}</div>
+                      </el-col>
+                      <el-col :span="6">
+                        <el-input v-model="sItem.input1" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col :span="6">
+                        <div class="rule-condition">
+                          <el-input
+                            :value="getDisplayName(sItem.param1)"
+                            placeholder="请选择"
+                            size="small"
+                            style="width: calc(100% - 90px)"
+                            readonly
+                            @click="openCategoryDialog(index, sIndex)"
+                          />
+                          <el-button
+                            size="small"
+                            style="width: 90px"
+                            class="category-select"
+                            @click="openCategoryDialog(index, sIndex)"
+                          >
+                            <i class="el-icon-s-operation" style="margin-right: 5px" />
+                            选择
+                          </el-button>
+                        </div>
+                      </el-col>
+                      <el-col :span="6">
+                        <el-input v-model="sItem.input2" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col :span="4">
+                        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="onAddTJZKYJ(index, sIndex)" />
+                        <el-button v-if="item.custom_basis.length !== 1" size="mini" type="primary" plain icon="el-icon-minus" @click="onDeleteTJZKYJ(index, sIndex)" />
+                      </el-col>
+                    </el-row>
+                  </div>
+                </el-card>
+              </el-col>
+              <!-- 质控预警 -->
+              <el-col v-if=" Object.keys(ruleForm.rule[0].custom_msg).length != 0 " :span="24">
+
+                <el-card v-for="(item, index) of ruleForm.rule" :key="'rule'+index" class="box-card" shadow="never">
+                  <div slot="header" class="clearfix box-card_header span">
+                    <span class="text">质控预警</span>
+                    <i class="el-icon-delete" style="float: right; margin-top: 13px; cursor: pointer;" @click="onDeleteZKyujing(index)" />
+                  </div>
+                  <div>
+                    <el-row :gutter="12" class="mb12">
+                      <el-col :span="2">
+                        <div class="text-right">事件</div>
+                      </el-col>
+                      <el-col :span="7">
+                        <div class="rule-condition">
+                          <el-input
+                            :value="getDisplayName(item.custom_msg.param1)"
+                            placeholder="请选择"
+                            size="small"
+                            style="width: calc(100% - 90px)"
+                            readonly
+                            @click="openCategoryDialog(index, 0)"
+                          />
+                          <el-button
+                            size="small"
+                            style="width: 90px"
+                            class="category-select"
+                            @click="openCategoryDialog(index, 0)"
+                          >
+                            <i class="el-icon-s-operation" style="margin-right: 5px" />
+                            选择
+                          </el-button>
+                        </div>
+                      </el-col>
+                      <el-col :span="1"> + </el-col>
+                      <el-col :span="2"><el-input v-model="item.custom_msg.aftertime" clearable placeholder="请输入" style="width: 100%;" /></el-col>
+                      <el-col :span="1">分</el-col>
+                      <el-col :span="1">前</el-col>
+                      <el-col :span="2"><el-input v-model="item.pre_warning_time" clearable placeholder="请输入" style="width: 100%;" /></el-col>
+                      <el-col :span="2">分提醒</el-col>
+                    </el-row>
+                    <el-row :gutter="12" class="mb12">
+                      <el-col :span="2">
+                        <div class="text-right">预警提示</div>
+                      </el-col>
+                      <el-col :span="6">
+                        <el-input v-model="item.custom_msg.input1" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col :span="4">
+                        <el-input v-model="item.custom_msg.input3" clearable disabled placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col :span="6">
+                        <el-input v-model="item.custom_msg.input2" clearable placeholder="请输入" style="width: 100%;" />
+                      </el-col>
+                      <el-col :span="4" />
+                    </el-row>
                   </div>
-                </div>
-              </el-card>
-            </el-col>
-            <!-- 质控依据 -->
-            <el-col v-if="ruleForm.rule[0].custom_basis.length" :span="24">
-              <el-card v-for="(item, index) of ruleForm.rule" :key="'rule'+index" class="box-card" shadow="never">
-                <div slot="header" class="clearfix box-card_header span">
-                  <span class="text">质控依据</span>
-                  <i class="el-icon-delete" style="float: right; margin-top: 13px; cursor: pointer;" @click="onDeleteZKYJ(index)" />
-                </div>
-                <div>
-                  <el-row v-for="(sItem, sIndex) of item.custom_basis" :key="'tj'+sIndex" :gutter="12" class="mb12">
-                    <el-col :span="2">
-                      <div class="text-right">条件{{ sIndex + 1 }}</div>
-                    </el-col>
-                    <el-col :span="6">
-                      <el-input v-model="sItem.input1" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col :span="6">
-                      <el-cascader
-                        v-model="sItem.param1"
-                        :options="objects"
-                        :props="{
-                          expandTrigger: 'hover',
-                          value: 'field',
-                          label: 'field_name',
-                          children: 'child'
-                        }"
-                        clearable
-                        filterable
-                        :show-all-levels="false"
-                        placeholder="请选择"
-                        style="width: 100%;"
-                      />
-                    </el-col>
-                    <el-col :span="6">
-                      <el-input v-model="sItem.input2" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col :span="4">
-                      <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="onAddTJZKYJ(index, sIndex)" />
-                      <el-button v-if="item.custom_basis.length !== 1" size="mini" type="primary" plain icon="el-icon-minus" @click="onDeleteTJZKYJ(index, sIndex)" />
-                    </el-col>
-                  </el-row>
-                </div>
-              </el-card>
-            </el-col>
-            <!-- 质控预警 -->
-            <el-col v-if=" Object.keys(ruleForm.rule[0].custom_msg).length != 0 " :span="24">
+                </el-card>
+              </el-col>
+            </el-form-item>
+          </el-col>
 
-              <el-card v-for="(item, index) of ruleForm.rule" :key="'rule'+index" class="box-card" shadow="never">
-                <div slot="header" class="clearfix box-card_header span">
-                  <span class="text">质控预警</span>
-                  <i class="el-icon-delete" style="float: right; margin-top: 13px; cursor: pointer;" @click="onDeleteZKyujing(index)" />
-                </div>
-                <div>
-                  <el-row :gutter="12" class="mb12">
-                    <el-col :span="2">
-                      <div class="text-right">事件</div>
-                    </el-col>
-                    <el-col :span="7">
-                      <el-cascader
-                        v-model="item.custom_msg.param1"
-                        :options="objects"
-                        :props="{
-                          expandTrigger: 'hover',
-                          value: 'field',
-                          label: 'field_name',
-                          children: 'child'
-                        }"
-                        clearable
-                        filterable
-                        :show-all-levels="false"
-                        placeholder="请选择"
-                        style="width: 100%;"
-                      />
-                    </el-col>
-                    <el-col :span="1"> + </el-col>
-                    <el-col :span="2"><el-input v-model="item.custom_msg.aftertime" clearable placeholder="请输入" style="width: 100%;" /></el-col>
-                    <el-col :span="1">分</el-col>
-                    <el-col :span="1">前</el-col>
-                    <el-col :span="2"><el-input v-model="item.pre_warning_time" clearable placeholder="请输入" style="width: 100%;" /></el-col>
-                    <el-col :span="2">分提醒</el-col>
-                  </el-row>
-                  <el-row :gutter="12" class="mb12">
-                    <el-col :span="2">
-                      <div class="text-right">预警提示</div>
-                    </el-col>
-                    <el-col :span="6">
-                      <el-input v-model="item.custom_msg.input1" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col :span="4">
-                      <el-input v-model="item.custom_msg.input3" clearable disabled placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col :span="6">
-                      <el-input v-model="item.custom_msg.input2" clearable placeholder="请输入" style="width: 100%;" />
-                    </el-col>
-                    <el-col :span="4" />
-                  </el-row>
-                </div>
-              </el-card>
-            </el-col>
-          </el-form-item>
-        </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm('ruleForm')">提 交</el-button>
+        <el-button @click="onTest">测试规则</el-button>
+      </span>
+    </el-dialog>
 
-      </el-row>
-    </el-form>
-    <span slot="footer" class="dialog-footer">
-      <el-button type="primary" @click="submitForm('ruleForm')">提 交</el-button>
-      <el-button @click="onTest">测试规则</el-button>
-    </span>
-  </el-dialog>
+    <!-- 新增选择弹窗 -->
+    <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-dialog>
+  </div>
 </template>
 
 <script>
@@ -530,12 +587,32 @@ export default {
         rule_type: [
           { required: true, message: '请选择', trigger: 'blur' }
         ]
-      }
+      },
+      categoryDialogVisible: false,
+      searchKeyword: '',
+      selectedCategoryValue: '',
+      currentRuleIndex: null,
+      currentConditionIndex: null,
+      categories: [
+        { label: '文本', value: 'text' },
+        { label: '时间', value: 'time' },
+        { label: '数值', value: 'number' }
+      ],
+      categoryType: 'text', // 默认选中文本类型
+      activeCategory: '',
+      currentSubCategories: [],
+      selectedCategory: null
     }
   },
   computed: {
     titleStr() {
       return this.data.row.id ? '编辑' : '新增'
+    },
+    filteredCategories() {
+      if (!this.searchKeyword) return this.categories
+      return this.categories.filter(item =>
+        item.label.toLowerCase().includes(this.searchKeyword.toLowerCase())
+      )
     }
   },
   created() {
@@ -805,6 +882,54 @@ export default {
           return false
         }
       })
+    },
+    openCategoryDialog(ruleIndex, conditionIndex) {
+      this.currentRuleIndex = ruleIndex
+      this.currentConditionIndex = conditionIndex
+      this.categoryDialogVisible = true
+      if (this.objects.length > 0) {
+        this.activeCategory = this.objects[0].field_name
+        this.currentSubCategories = this.objects[0].child || []
+      }
+    },
+    handleSearch(value) {
+      // 搜索功能已通过 computed 属性实现
+    },
+    confirmCategory() {
+      if (this.selectedCategory) {
+        // 更新对应条件的类目
+        this.ruleForm.rule[this.currentRuleIndex].condition_content[this.currentConditionIndex].category = this.selectedCategory
+        // 可能还需要更新显示的文本
+        const selectedItem = this.categories.find(item => item.value === this.selectedCategory)
+        this.ruleForm.rule[this.currentRuleIndex].condition_content[this.currentConditionIndex].param2 =
+          selectedItem ? selectedItem.label : ''
+      }
+      this.categoryDialogVisible = false
+    },
+    // 点击左侧类目
+    handleCategoryClick(item) {
+      this.activeCategory = item.field_name
+      this.currentSubCategories = item.child || []
+    },
+    // 选择右侧子类目
+    handleSubCategorySelect(category) {
+      if (this.currentRuleIndex !== null && this.currentConditionIndex !== null) {
+        const condition = this.ruleForm.rule[this.currentRuleIndex].condition_content[this.currentConditionIndex]
+        const parentObj = this.objects.find(obj => obj.field_name === this.activeCategory)
+        const parentField = parentObj ? parentObj.field : ''
+
+        condition.param1 = [parentField, category.field]
+        condition.field_name = category.field_name
+      }
+      this.categoryDialogVisible = false
+    },
+    getDisplayName(param1) {
+      if (!Array.isArray(param1)) return ''
+      const [parentField, childField] = param1
+      const parentObj = this.objects.find(obj => obj.field === parentField)
+      if (!parentObj) return ''
+      const childObj = parentObj.child.find(child => child.field === childField)
+      return childObj ? childObj.field_name : ''
     }
   }
 }
@@ -845,4 +970,63 @@ export default {
     color: #909399;
   }
 }
+.input-with-category {
+  display: flex;
+  align-items: stretch;
+  gap: 0;
+
+  ::v-deep .el-input__inner {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0;
+  }
+
+  .category-select {
+    ::v-deep .el-input__inner {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+      margin-left: -1px;
+      padding-left: 25px;  /* 为图标留出空间 */
+    }
+    ::v-deep .el-input__prefix {
+      left: 5px;
+      color: #909399;
+    }
+  }
+}
+.category-content {
+  height: 400px;
+  .category-menu {
+    height: 100%;
+    border-right: 1px solid #e6e6e6;
+  }
+  .sub-category-list {
+    padding: 10px;
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+
+    .el-button {
+      margin: 5px;
+    }
+  }
+}
+.rule-condition {
+  display: flex;
+  align-items: stretch;
+  gap: 0;
+
+  .el-input {
+    ::v-deep .el-input__inner {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+      cursor: pointer;
+    }
+  }
+
+  .category-select {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+    margin-left: -1px;
+  }
+}
 </style>

+ 3 - 3
vue.config.js

@@ -41,21 +41,21 @@ module.exports = {
   devServer: {
     proxy: {
       [process.env.VUE_APP_BASE_API]: {
-        target: 'http://182.44.10.206:7083',
+        target: 'http://182.44.10.206:8083',
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: '/admin/'
         }
       },
       [process.env.VUE_APP_BASE_API2]: {
-        target: 'http://182.44.10.206:7083',
+        target: 'http://182.44.10.206:8083',
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API2]: '/bazb/'
         }
       },
       [process.env.VUE_APP_BASE_API3]: {
-        target: 'http://182.44.10.206:7083',
+        target: 'http://182.44.10.206:8083',
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API3]: '/api/'