123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636 |
- <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"
- />
- </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-col :span="24" style="margin-bottom: 20px;">
- <el-button type="primary" plain icon="el-icon-plus" @click="onAddQZTJ">前置条件</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">
- <el-cascader
- v-model="sItem.param1"
- :options="objects"
- :props="{
- expandTrigger: 'hover',
- value: 'field_name',
- 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 label="包含" value="包含" />
- <el-option label="不包含" value="不包含" />
- <el-option label="大于" value="大于" />
- <el-option label="小于" value="小于" />
- <el-option label="等于" value="等于" />
- </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 :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>
- </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_name',
- 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 label="包含" value="包含" />
- <el-option label="不包含" value="不包含" />
- <el-option label="大于" value="大于" />
- <el-option label="小于" value="小于" />
- <el-option label="等于" value="等于" />
- </el-select>
- </el-col>
- <el-col :span="6">
- <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 :span="4">
- <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>
- </div>
- </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>
- </template>
- <script>
- import { add_rule } from '@/api/rule/config'
- import { get_all_word_map } from '@/api/dict'
- import { get_rule_detail } from '@/api/rule/config'
- export default {
- props: {
- data: {
- type: Object,
- default() {
- return {
- bSwitch: false,
- row: {}
- }
- }
- },
- objects: {
- type: Array,
- default() {
- return []
- }
- },
- departments: {
- type: Array,
- default() {
- return []
- }
- }
- },
- data() {
- return {
- qcData: [],
- ruleForm: {
- case_type: '',
- changjing: [],
- department: [],
- object: [],
- type: '',
- is_not: '',
- description: '',
- score: undefined,
- error_level: '',
- status: '',
- rule_type: '普通规则',
- rule: [
- // 质控逻辑只有一条
- {
- is_pre_condition: 0,
- condition_type: 1,
- condition_relation: 2,
- condition_content: [
- {
- param1: '',
- param2: '',
- condition: '包含'
- }
- ]
- }
- ],
- qztj: [
- // 前置条件默认只有一条
- {
- is_pre_condition: 1,
- condition_type: 1,
- condition_relation: 2,
- condition_content: [
- {
- param1: '',
- param2: '',
- condition: '包含'
- }
- ]
- }
- ]
- },
- rules: {
- description: [
- { required: true, message: '请输入', trigger: 'blur' }
- ],
- score: [
- { required: true, message: '请输入', trigger: 'blur' }
- ],
- case_type: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- changjing: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- department: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- object: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- type: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- is_not: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- error_level: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- status: [
- { required: true, message: '请选择', trigger: 'blur' }
- ],
- rule_type: [
- { required: true, message: '请选择', trigger: 'blur' }
- ]
- }
- }
- },
- computed: {
- titleStr() {
- return this.data.row.id ? '编辑' : '新增'
- }
- },
- created() {
- this.getQcData()
- if (this.data.row.id) {
- this.getDetail(this.data.row.id)
- }
- },
- methods: {
- onTest() {
- this.$message.info('功能待开放...')
- },
- // 获取详情
- getDetail(id) {
- get_rule_detail({ id }).then(res => {
- const { p } = res
- const {
- case_type,
- changjing,
- department,
- object,
- type,
- is_not,
- description,
- score,
- error_level,
- status
- } = p.rule
- this.ruleForm.case_type = case_type
- this.ruleForm.changjing = changjing.split(',')
- this.ruleForm.department = this.toNumberArray(department)
- this.ruleForm.is_not = is_not
- this.ruleForm.status = status
- this.ruleForm.type = type
- this.ruleForm.error_level = error_level
- this.ruleForm.score = score
- this.ruleForm.description = description
- this.ruleForm.object = object.split(',')
- this.ruleForm.rule = this.getQcRule(p.rule_list)
- this.ruleForm.qztj = this.getPreRule(p.rule_list)
- })
- },
- // 找到前置条件
- getPreRule(list) {
- return list.filter(item => item.is_pre_condition)
- },
- // 找到质控逻辑
- getQcRule(list) {
- const rule = list.filter(item => !item.is_pre_condition)
- return rule
- },
- // string 数组 装 number 数组
- toNumberArray(slist) {
- const alist = []
- slist.map(item => {
- alist.push(Number(item))
- })
- return alist
- },
- // 搜索质控字典
- getQcData() {
- get_all_word_map({ status: 1 }).then(res => {
- const { p } = res
- this.qcData = Array.isArray(p) ? p : []
- })
- },
- querySearch(queryString, cb) {
- var qcData = this.qcData
- var results = queryString ? qcData.filter(this.createFilter(queryString)) : qcData
- // 调用 callback 返回建议列表的数据
- cb(results)
- },
- createFilter(queryString) {
- return (restaurant) => {
- return (restaurant.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0)
- }
- },
- handleSelect(item) {
- console.log(item)
- },
- // 添加前置条件大框
- onAddQZTJ() {
- this.ruleForm.qztj.push({
- is_pre_condition: 1,
- condition_type: 1,
- condition_relation: 2,
- condition_content: [
- {
- param1: '',
- param2: '',
- condition: '包含'
- }
- ]
- })
- },
- // 删除前置条件大框
- onDeleteQZTJ(index) {
- this.ruleForm.qztj.splice(index, 1)
- },
- // 新增前置条件大框中_条件
- onAddTJ(index, sIndex) {
- this.ruleForm.qztj[index].condition_content.push({
- param1: '',
- param2: '',
- condition: '包含'
- })
- },
- // 删除前置条件大框中_条件
- onDeleteTJ(index, sIndex) {
- this.ruleForm.qztj[index].condition_content.splice(sIndex, 1)
- },
- // 新增质控逻辑大框中_逻辑
- onAddGZ(index, sIndex) {
- this.ruleForm.rule[index].condition_content.push({
- param1: '',
- param2: '',
- condition: '包含'
- })
- },
- // 删除质控逻辑大框中_逻辑
- onDeleteGZ(index, sIndex) {
- this.ruleForm.rule[index].condition_content.splice(sIndex, 1)
- },
- hasEmptyValues(obj) {
- return Object.values(obj).some(value => !value)
- },
- // 验证前置条件
- judgeQZTJ() {
- const { qztj } = this.ruleForm
- let result = true
- const e_index = []
- if (qztj.length) {
- for (let i = 0; i < qztj.length; i++) {
- qztj[i].condition_content.map(item => {
- if (this.hasEmptyValues(item)) {
- e_index.push(i + 1)
- }
- })
- }
- if (e_index.length) {
- this.$message.error(`请完善前置条件${e_index.join()}`)
- result = false
- }
- }
- return result
- },
- // 验证质控逻辑
- judgeRule() {
- const { rule } = this.ruleForm
- let result = true
- // 质控逻辑只有一条
- rule[0].condition_content.map(item => {
- if (this.hasEmptyValues(item)) {
- this.$message.error(`请完善质控逻辑`)
- result = false
- }
- })
- return result
- },
- submitForm(formName) {
- console.log(this.ruleForm.object)
- this.$refs[formName].validate(async(valid) => {
- const {
- case_type,
- changjing,
- department,
- object,
- type,
- is_not,
- description,
- score,
- error_level,
- status,
- rule_type,
- rule,
- qztj
- } = this.ruleForm
- if (valid) {
- if (this.judgeQZTJ() && this.judgeRule()) {
- const params = {
- case_type,
- changjing,
- department,
- object,
- type,
- is_not,
- description,
- score,
- error_level,
- status,
- rule_type,
- rule: [...rule, ...qztj]
- }
- if (this.data.row.id) {
- params.id = this.data.row.id
- }
- add_rule(params).then(res => {
- this.data.bSwitch = false
- this.$emit('refresh')
- this.$message.success(res.m || '操作成功')
- })
- }
- } else {
- return false
- }
- })
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- ::v-deep .el-col-15 {
- .el-form-item__label {
- width: 160px !important;
- }
- }
- .box-card {
- margin-bottom: 16px;
- }
- ::v-deep .el-card__header {
- padding: 0;
- .box-card_header {
- background: #F7F7F8;
- padding: 0 20px;
- line-height: 40px;
- }
- }
- ::v-deep .el-card__body {
- padding: 20px 12px;
- }
- .text-right {
- text-align: right;
- }
- .ml40 {
- margin-left: 40px;
- }
- .mb12 {
- margin-bottom: 12px;
- }
- .span {
- padding-top: 40px;
- .text {
- color: #909399;
- }
- }
- </style>
|