Commit 44fcec04 authored by miaojiale's avatar miaojiale

Merge branch 'dev' into dev_Miaojiale

parents 65b211f6 68255f88
...@@ -341,7 +341,7 @@ export function getQualityDetail(patientId) { ...@@ -341,7 +341,7 @@ export function getQualityDetail(patientId) {
// 协作组参数配置新增/修改 // 协作组参数配置新增/修改
export function setParamConfig(data) { export function setParamConfig(data) {
return request({ return request({
url: `/disease-data/sys/paramConfig/addOrUpdate`, url: `/disease-data/param/config`,
method: "post", method: "post",
data, data,
}) })
...@@ -350,7 +350,7 @@ export function setParamConfig(data) { ...@@ -350,7 +350,7 @@ export function setParamConfig(data) {
// 协作组参数配置列表 // 协作组参数配置列表
export function getParamConfigList(params) { export function getParamConfigList(params) {
return request({ return request({
url: `/disease-data/sys/paramConfig/list`, url: `/disease-data/param/config/page`,
method: "get", method: "get",
params, params,
}) })
...@@ -359,7 +359,7 @@ export function getParamConfigList(params) { ...@@ -359,7 +359,7 @@ export function getParamConfigList(params) {
// 删除配置 // 删除配置
export function delParamConfig(id) { export function delParamConfig(id) {
return request({ return request({
url: `/disease-data/sys/paramConfig/${id}`, url: `/disease-data/param/config?id=${id}`,
method: "delete", method: "delete",
}) })
} }
...@@ -12,13 +12,6 @@ export function getFieldPage(params = {}) { ...@@ -12,13 +12,6 @@ export function getFieldPage(params = {}) {
params, params,
}) })
} }
export function getFieldList(params = {}) {
return request({
url: "/cloud-upms/field/dict/list/table",
method: "get",
params,
})
}
export function delField(id) { export function delField(id) {
return request({ return request({
...@@ -92,7 +85,7 @@ export function copyForm(data = {}) { ...@@ -92,7 +85,7 @@ export function copyForm(data = {}) {
// 获取 // 获取
export function getFormDetail(id) { export function getFormDetail(id) {
return request({ return request({
url: `/cloud-upms//org/form/${id}`, url: `/cloud-upms/org/form/${id}`,
method: "get", method: "get",
}) })
} }
......
...@@ -44,6 +44,8 @@ module.exports = { ...@@ -44,6 +44,8 @@ module.exports = {
tokenTableName: "agcs", tokenTableName: "agcs",
//token存储位置localStorage sessionStorage cookie //token存储位置localStorage sessionStorage cookie
storage: "localStorage", storage: "localStorage",
// 前缀名
storagePrefixName: "agcs",
//是否显示logo //是否显示logo
logo: true, logo: true,
//是否国定头部 固定fixed 不固定noFixed //是否国定头部 固定fixed 不固定noFixed
......
...@@ -58,14 +58,14 @@ export default { ...@@ -58,14 +58,14 @@ export default {
}, },
}, },
watch: { watch: {
// $route: { $route: {
// handler(route) { handler(route) {
// if ("mobile" === this.device) { if ("mobile" === this.device) {
// this.$store.dispatch("settings/foldSideBar") this.$store.dispatch("settings/foldSideBar")
// } }
// }, },
// immediate: true, immediate: true,
// }, },
}, },
created() { created() {
//重载所有路由 //重载所有路由
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
* @description 所有全局配置的状态管理,如无必要请勿修改 * @description 所有全局配置的状态管理,如无必要请勿修改
*/ */
import defaultSettings from "@/config/settings"; import defaultSettings from "@/config/settings"
const { tagsBar, logo, layout, header, themeBar, skeleton } = defaultSettings; const { tagsBar, logo, layout, header, themeBar, skeleton } = defaultSettings
const theme = JSON.parse(localStorage.getItem("BYUI-VUE-THEME")) || ""; const theme = JSON.parse(localStorage.getItem("BYUI-VUE-THEME")) || ""
const state = { const state = {
tagsBar: theme.tagsBar || tagsBar, tagsBar: theme.tagsBar || tagsBar,
logo, logo,
...@@ -16,7 +16,7 @@ const state = { ...@@ -16,7 +16,7 @@ const state = {
skeleton, skeleton,
device: "desktop", device: "desktop",
themeBar, themeBar,
}; }
const getters = { const getters = {
collapse: (state) => state.collapse, collapse: (state) => state.collapse,
device: (state) => state.device, device: (state) => state.device,
...@@ -26,51 +26,51 @@ const getters = { ...@@ -26,51 +26,51 @@ const getters = {
tagsBar: (state) => state.tagsBar, tagsBar: (state) => state.tagsBar,
themeBar: (state) => state.themeBar, themeBar: (state) => state.themeBar,
skeleton: (state) => state.skeleton, skeleton: (state) => state.skeleton,
}; }
const mutations = { const mutations = {
changeLayout: (state, layout) => { changeLayout: (state, layout) => {
if (layout) state.layout = layout; if (layout) state.layout = layout
}, },
changeHeader: (state, header) => { changeHeader: (state, header) => {
if (header) state.header = header; if (header) state.header = header
}, },
changeTagsBar: (state, tagsBar) => { changeTagsBar: (state, tagsBar) => {
if (tagsBar) state.tagsBar = tagsBar; if (tagsBar) state.tagsBar = tagsBar
}, },
changeCollapse: (state) => { changeCollapse: (state) => {
state.collapse = !state.collapse; state.collapse = !state.collapse
}, },
foldSideBar: (state) => { foldSideBar: (state) => {
state.collapse = true; // state.collapse = true;
}, },
openSideBar: (state) => { openSideBar: (state) => {
state.collapse = false; state.collapse = false
}, },
toggleDevice: (state, device) => { toggleDevice: (state, device) => {
state.device = device; state.device = device
}, },
}; }
const actions = { const actions = {
changeLayout({ commit }, layout) { changeLayout({ commit }, layout) {
commit("changeLayout", layout); commit("changeLayout", layout)
}, },
changeHeader({ commit }, header) { changeHeader({ commit }, header) {
commit("changeHeader", header); commit("changeHeader", header)
}, },
changeTagsBar({ commit }, tagsBar) { changeTagsBar({ commit }, tagsBar) {
commit("changeTagsBar", tagsBar); commit("changeTagsBar", tagsBar)
}, },
changeCollapse({ commit }) { changeCollapse({ commit }) {
commit("changeCollapse"); commit("changeCollapse")
}, },
foldSideBar({ commit }) { foldSideBar({ commit }) {
commit("foldSideBar"); commit("foldSideBar")
}, },
openSideBar({ commit }) { openSideBar({ commit }) {
commit("openSideBar"); commit("openSideBar")
}, },
toggleDevice({ commit }, device) { toggleDevice({ commit }, device) {
commit("toggleDevice", device); commit("toggleDevice", device)
}, },
}; }
export default { state, getters, mutations, actions }; export default { state, getters, mutations, actions }
const ls = window.localStorage const ls = window.localStorage
const ss = window.sessionStorage const ss = window.sessionStorage
import { storagePrefixName } from "@/config/settings"
export const Local = { export const Local = {
get(key, def) { get(key, def) {
let value = null let value = null
try { try {
value = JSON.parse(ls.getItem(key)) value = JSON.parse(ls.getItem(storagePrefixName + "-" + key))
} catch (e) { } catch (e) {
console.log(" ") console.log(" ")
} }
...@@ -19,14 +20,14 @@ export const Local = { ...@@ -19,14 +20,14 @@ export const Local = {
ls.setItem(i, JSON.stringify(setting[i])) ls.setItem(i, JSON.stringify(setting[i]))
} }
} else { } else {
ls.setItem(key, JSON.stringify(val)) ls.setItem(storagePrefixName + "-" + key, JSON.stringify(val))
} }
} catch (e) { } catch (e) {
console.log("'") console.log("'")
} }
}, },
remove(key) { remove(key) {
ls.removeItem(key) ls.removeItem(storagePrefixName + "-" + key)
}, },
clear() { clear() {
ls.clear() ls.clear()
...@@ -36,7 +37,7 @@ export const Local = { ...@@ -36,7 +37,7 @@ export const Local = {
export const Session = { export const Session = {
get(key) { get(key) {
try { try {
return JSON.parse(ss.getItem(key)) return JSON.parse(ss.getItem(storagePrefixName + "-" + key))
} catch (e) { } catch (e) {
return null return null
} }
...@@ -48,11 +49,11 @@ export const Session = { ...@@ -48,11 +49,11 @@ export const Session = {
ss.setItem(i, JSON.stringify(setting[i])) ss.setItem(i, JSON.stringify(setting[i]))
} }
} else { } else {
ss.setItem(key, JSON.stringify(val)) ss.setItem(storagePrefixName + "-" + key, JSON.stringify(val))
} }
}, },
remove(key) { remove(key) {
ss.removeItem(key) ss.removeItem(storagePrefixName + "-" + key)
}, },
clear() { clear() {
ss.clear() ss.clear()
......
<template>
<el-row class="page-container dict">
<el-container class="page-main" :gutter="20">
<el-aside width="250px" class="left-content">
<el-col :span="24" class="left-search">
<el-input
v-model.trim="searchVal"
clearable
:placeholder="placeholder"
>
</el-input>
</el-col>
<el-col class="dict-list" ref="dict">
<el-col
v-for="(item, index) in tableList"
:key="item.id"
class="dict-item"
>
<span
@click="handClick(index, item)"
:class="{ active: index == isActive }"
style="cursor: pointer"
>
<strong>
{{ item.label }}
</strong>
- {{ item.value }}
</span>
</el-col>
</el-col>
</el-aside>
<el-main>
<div style="text-align: right">
<el-input
v-model.trim="keyWord"
clearable
placeholder="关键字"
style="width: 220px; margin-right: 5px"
>
</el-input>
<el-button type="primary" @click="handleSave" :loading="loading"
>保存配置</el-button
>
</div>
<el-table-self
style="margin-top: 10px"
ref="table"
:table-data="fields"
:columns="columns"
:list-loading="listLoading"
/>
</el-main>
</el-container>
</el-row>
</template>
<script>
import { setExportFields, getTableFields, getExportConfigFields } from "@/api/coop-group"
export default {
name: "ExportFieldConfig",
props: {
groupId: String,
},
data() {
return {
isActive: -1,
placeholder: "搜索数据库",
name: "",
searchVal: "",
keyWord: "",
typeId: "",
fieldList: [],
configuredFieldList: [],
tableCode: "",
loading: false,
listLoading: false,
columns: [
{
label: "字段名称",
minWidth: 120,
value: "fieldName",
},
{
label: "字段code",
minWidth: 200,
value: "fieldCode",
},
{
operType: "checkbox",
label: "是否导出",
minWidth: 100,
value: "isExport",
tabType: "selection",
},
{
operType: "checkbox",
label: "是否脱敏",
minWidth: 100,
value: "isDesensitized",
tabType: "selection",
},
{
operType: "input",
type: "number",
label: "排序号",
width: 120,
inputWidth: 108,
value: "sort",
showInput: true,
},
],
}
},
watch: {
groupId(groupId) {
if (groupId) {
this.getTableFields()
this.getFields()
}
},
},
computed: {
// 数据库表过滤
tableList() {
const dictTable = this.dictMap["table"] || []
const list = dictTable.filter(
(_) =>
!this.searchVal ||
_.label.includes(this.searchVal) ||
_.value.includes(this.searchVal)
)
this.isActive = this.getListIdx(list, this.typeId)
return list
},
// 全部字段和已配置字段
fieldValue() {
return this.fieldList.map((field) => {
let configuredField = this.configuredFieldList.find(
(_) => _.fieldCode === field.fieldCode
)
return {
...field,
sort: (configuredField && configuredField.sort) || undefined,
isExport: Boolean(configuredField),
isDesensitized: Boolean(
configuredField && configuredField.isDesensitized
),
}
})
},
fields() {
return this.fieldValue.filter(
(_) =>
!this.keyWord ||
_.fieldName.includes(this.keyWord) ||
_.fieldCode.includes(this.keyWord)
)
},
},
methods: {
// 点击左侧列表
handClick(index, { type, label, id, value }) {
if (!this.groupId) {
this.$message.warning("请先选择协作组")
return
}
this.name = label
this.tableCode = value
this.isActive = index
this.typeId = id
this.fieldList = []
this.getTableFields()
this.getFields()
},
// 全部字段
getTableFields() {
getTableFields({ tableCode: this.tableCode, groupId: this.groupId }).then(
(res) => {
this.fieldList = res.data
}
)
},
// 已配置字段
getFields() {
getExportConfigFields({ tableCode: this.tableCode, groupId: this.groupId })
.then((res) => {
this.configuredFieldList = res.data
})
.catch((e) => {
this.configuredFieldList = []
})
},
handleSave() {
if (!this.groupId) {
this.$message.warning("请先选择协作组")
return
}
if (!this.fieldValue.length) {
this.$message.warning("没有可保存的数据")
return
}
const list = this.fieldValue
.filter((_) => _.isExport)
.map((_) => {
delete _.isExport
return {
..._,
isDesensitized: _.isDesensitized ? 1 : 0,
}
})
const table = {
tableCode: this.tableCode,
tableName: this.name,
groupId: this.groupId,
}
this.loading = true
setExportFields(table, list)
.then((res) => {
this.$message.success("配置成功")
})
.finally(() => {
this.loading = false
})
},
getListIdx(list = [], id) {
let listIdx = -1
for (var i = 0; i < list.length; i++) {
if (list[i].id === id) {
listIdx = i
break
}
}
return listIdx
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .el-main {
padding: 0px 0 0 10px;
}
</style>
...@@ -50,10 +50,13 @@ export default { ...@@ -50,10 +50,13 @@ export default {
// 查询列表 // 查询列表
searchList: [ searchList: [
{ {
label: "参数代码", label: "类型",
type: "input", type: "select",
prop: "code", prop: "type",
placeholder: "请输入参数代码", placeholder: "请输入类型",
optsFormatter: () => {
return this.dictMap && this.dictMap["sys_param_type"]
},
}, },
{ {
label: "参数值", label: "参数值",
...@@ -61,12 +64,7 @@ export default { ...@@ -61,12 +64,7 @@ export default {
prop: "value", prop: "value",
placeholder: "请输入参数值", placeholder: "请输入参数值",
}, },
{
label: "类型",
type: "input",
prop: "type",
placeholder: "请输入类型",
},
{ {
type: "button", type: "button",
value: "查询", value: "查询",
...@@ -81,10 +79,29 @@ export default { ...@@ -81,10 +79,29 @@ export default {
}, },
], ],
columns: [ columns: [
{
label: "类型",
minWidth: 100,
value: "type",
formatter: (row) => {
return this.$handle.formatDicList(
this.dictMap["sys_param_type"],
row.type
)
},
},
{ {
label: "参数代码", label: "参数代码",
minWidth: 120, minWidth: 120,
value: "code", value: "code",
formatter: (row) => {
const item =
this.dictMap["sys_param_type"].find(
(_) => _.value === row.type
) || {}
const list = item.children || []
return this.$handle.formatDicList(list, row.code)
},
}, },
{ {
...@@ -92,21 +109,7 @@ export default { ...@@ -92,21 +109,7 @@ export default {
minWidth: 120, minWidth: 120,
value: "value", value: "value",
}, },
{
label: "类型",
minWidth: 100,
value: "type",
},
{
label: "目标值名称",
minWidth: 100,
value: "targetName",
},
{
label: "目标值",
minWidth: 100,
value: "targetValue",
},
{ {
label: "创建时间", label: "创建时间",
minWidth: 180, minWidth: 180,
...@@ -151,12 +154,24 @@ export default { ...@@ -151,12 +154,24 @@ export default {
cacheForm: {}, cacheForm: {},
formData: [ formData: [
{ {
type: "input", type: "select",
label: "类型",
placeholder: "请选择类型",
prop: "type",
rules: [{ required: true, message: "请选择类型" }],
func: this.typeChange,
optsFormatter: () => {
return this.dictMap && this.dictMap["sys_param_type"]
},
},
{
type: "select",
label: "参数代码", label: "参数代码",
placeholder: "请输入参数代码", placeholder: "请输入参数代码",
prop: "code", prop: "code",
disabled: false, disabled: false,
rules: [{ required: true, message: "参数代码" }], rules: [{ required: true, message: "参数代码" }],
opts: [],
}, },
{ {
type: "input", type: "input",
...@@ -168,22 +183,9 @@ export default { ...@@ -168,22 +183,9 @@ export default {
{ {
type: "input", type: "input",
label: "类型", label: "默认参数值",
placeholder: "请选择类型", placeholder: "请选择默认参数值",
prop: "type", prop: "defaultValue",
rules: [{ required: true, message: "请选择类型" }],
},
{
type: "input",
label: "目标值名称",
placeholder: "请选择目标值名称",
prop: "targetName",
},
{
type: "input",
label: "目标值",
placeholder: "请选择目标值",
prop: "targetValue",
}, },
], ],
formEdit: {}, formEdit: {},
...@@ -200,6 +202,11 @@ export default { ...@@ -200,6 +202,11 @@ export default {
}, },
methods: { methods: {
typeChange(val) {
this.$refs.dialog.initFields({ code: "" })
const opt = this.dictMap["sys_param_type"].find((_) => _.value === val)
this.formData[1].opts = (opt && opt.children) || []
},
handleAdd(row) { handleAdd(row) {
this.formEdit = Object.assign({}, row) this.formEdit = Object.assign({}, row)
if (!this.groupId) { if (!this.groupId) {
...@@ -212,13 +219,17 @@ export default { ...@@ -212,13 +219,17 @@ export default {
const data = Object.assign(form, { const data = Object.assign(form, {
groupId: this.groupId, groupId: this.groupId,
}) })
setParamConfig(data).then((res) => { setParamConfig(data)
.then((res) => {
if (res.code === 1) { if (res.code === 1) {
this.$message.success("添加成功") this.$message.success("添加成功")
this.handleSearch() this.handleSearch()
this.$refs.dialog.close() this.$refs.dialog.close()
} }
}) })
.finally(() => {
this.$refs.dialog.loading = false
})
}, },
handleDel(row) { handleDel(row) {
this.$confirm(`是否删除【${row.code || ""}】?`, "提示", { this.$confirm(`是否删除【${row.code || ""}】?`, "提示", {
......
<template>
<el-row class="page-container dict">
<el-container class="page-main" :gutter="20">
<el-aside width="250px" class="left-content">
<el-col :span="24" class="left-search">
<el-input
v-model.trim="searchVal"
clearable
:placeholder="placeholder"
>
</el-input>
</el-col>
<el-col class="dict-list" ref="dict">
<el-col
v-for="(item, index) in tableList"
:key="item.id"
class="dict-item"
>
<span
@click="handClick(index, item)"
:class="{ active: index == isActive }"
style="cursor: pointer"
>
<strong>
{{ item.label }}
</strong>
- {{ item.value }}
</span>
</el-col>
</el-col>
</el-aside>
<el-main>
<el-button type="primary" @click="handleClone">引用配置</el-button>
<div style="text-align: right">
<el-input
v-model.trim="keyWord"
clearable
placeholder="关键字"
style="width: 220px; margin-right: 5px"
>
</el-input>
<el-button
type="primary"
v-if="tableCode === 'data_lab_detail'"
@click="handleAdd"
>新增(检验细项)</el-button
>
</div>
<el-table-self
style="margin-top: 10px"
ref="table"
:table-data="
tableCode === 'data_lab_detail' ? configuredFields : fields
"
:columns="columns"
:list-loading="listLoading"
/>
</el-main>
<dialog-form
width="650px"
:close-modal="false"
label-width="140px"
ref="dialog"
title="引用其他机构协作组配置"
:form-data="formData"
@handleConfirm="handleConfirm"
></dialog-form>
<el-drawer
title="配置字段"
:visible.sync="widgetVisible"
:size="500"
:wrapperClosable="false"
>
<div class="drawer__container">
<div class="drawer__content">
<div class="widget-config">
<el-form
label-suffix=":"
labelPosition="left"
labelWidth="110px"
ref="form"
:rules="rules"
size="small"
:model="configForm"
>
<el-form-item label="数据模块" prop="firstType">
<el-select
v-model="configForm.firstType"
placeholder="选择数据模块"
style="width: 100%"
@change="firstTypeChange"
clearable
filterable
>
<el-option
:label="item.label"
:value="item.value"
v-for="item in dictMap['data_module']"
:key="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据子模块">
<el-select
v-model="configForm.subType"
placeholder="选择数据子模块"
style="width: 100%"
clearable
filterable
>
<el-option
:label="item.label"
:value="item.value"
v-for="item in subTypeOpts"
:key="item.id"
></el-option>
</el-select>
</el-form-item>
<div style="margin-bottom: 10px; font-size: 18px">父级字段</div>
<el-form-item label="父级数据表">
<el-select
v-model="configForm.parentTableCode"
placeholder="选择父级数据表"
style="width: 100%"
@change="tableChange"
clearable
filterable
>
<el-option
:label="item.label"
:value="item.value"
v-for="item in dictMap['table']"
:key="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="父级字段">
<el-select
v-model="configForm.parentFieldCode"
placeholder="选择父级字段"
style="width: 100%"
clearable
filterable
>
<el-option
:label="item.label"
:value="item.value"
v-for="item in parentFieldOpts"
:key="item.id"
></el-option>
</el-select>
</el-form-item>
<div style="margin-bottom: 10px; font-size: 18px">
当前配置字段
</div>
<el-form-item label="字段名称">
<el-input
v-model="configForm.fieldName"
:disabled="isDisabled"
></el-input>
</el-form-item>
<el-form-item label="字段编码">
<el-input
v-model="configForm.fieldCode"
:disabled="isDisabled"
></el-input>
</el-form-item>
<div style="margin-bottom: 10px; font-size: 18px">完整性</div>
<el-form-item label="是否必填" labelWidth="130px">
<el-switch
v-model="configForm.isRequired"
:active-value="1"
:inactive-value="0"
></el-switch>
</el-form-item>
<div style="margin-bottom: 10px; font-size: 18px">有效性</div>
<el-form-item label="字典值域范围">
<el-select
v-model="configForm.dictType"
placeholder="选择字典"
style="width: 100%"
@change="dicTypeChange"
clearable
filterable
>
<el-option
:label="item.name"
:value="item.type"
v-for="item in dictList"
:key="item.id"
></el-option>
</el-select>
</el-form-item>
<div
class="el-form-item--small el-form--label-top"
style="padding-bottom: 14px"
>
<strong class="el-form-item__label" style="padding: 0"
>字典数据示例:</strong
>
<div class="el-form-item__content">
<draggable
tag="ul"
:list="dicData"
:group="{ name: 'dic' }"
ghost-class="ghost"
handle=".drag-item"
>
<li v-for="(item, index) in dicData" :key="index">
<i
class="drag-item el-icon-s-operation"
style="font-size: 16px; margin: 0 5px; cursor: move"
></i>
<el-input
style="margin-right: 5px"
size="mini"
readonly
clearable
v-model="item.label"
placeholder="label"
></el-input>
<el-input
size="mini"
clearable
readonly
v-model="item.value"
placeholder="value"
></el-input>
</li>
</draggable>
</div>
</div>
<el-form-item label="正则表达式">
<el-input v-model="configForm.regexStr" clearable></el-input>
</el-form-item>
<el-form-item label="Hutool校验">
<el-select
v-model="configForm.htType"
placeholder="选择Hutool校验"
style="width: 100%"
clearable
filterable
>
<el-option
:label="item.label"
:value="item.value"
v-for="item in dictMap['hutool_validator']"
:key="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="文本长度">
<div style="display: flex">
<el-input-number
v-model.trim="configForm.minLen"
:min="0"
clearable
controls-position="right"
size="mini"
placeholder="最小长度"
></el-input-number>
<span style="margin: 0 10px"> - </span>
<el-input-number
v-model.trim="configForm.maxLen"
clearable
:min="configForm.minLen + 1"
controls-position="right"
size="mini"
placeholder="最大长度"
></el-input-number>
</div>
</el-form-item>
<el-form-item label="数值范围">
<div style="display: flex">
<el-input-number
v-model.trim="configForm.minValue"
clearable
controls-position="right"
size="mini"
placeholder="最小值"
></el-input-number>
<span style="margin: 0 10px"> - </span>
<el-input-number
v-model.trim="configForm.maxValue"
clearable
:min="configForm.minValue + 1"
controls-position="right"
size="mini"
placeholder="最大值"
></el-input-number>
</div>
</el-form-item>
<div style="margin-bottom: 10px; font-size: 18px">一致性</div>
<el-form-item label="逻辑质控">
<el-input
v-model.trim="configForm.logicStr"
type="textarea"
clearable
placeholder="逻辑质控"
></el-input>
</el-form-item>
<div style="margin-bottom: 10px; font-size: 18px">准确性</div>
<el-form-item label="逻辑质控">
<el-input
v-model.trim="configForm.note"
type="textarea"
clearable
placeholder="逻辑质控"
></el-input>
</el-form-item>
</el-form>
</div>
</div>
<div class="footer">
<el-button @click="widgetVisible = false" size="large"
>取 消</el-button
>
<el-button
size="large"
type="primary"
:loading="loading"
@click="handleConfigConfirm"
>确 定</el-button
>
</div>
</div>
</el-drawer>
</el-container>
</el-row>
</template>
<script>
import {
setQcConfigFields,
getTableFields,
getQcConfigFields,
setQcConfigField,
getQcGroupOption,
setCloneConf,
delConf,
} from "@/api/coop-group"
import Draggable from "vuedraggable"
import { mapGetters } from "vuex"
export default {
name: "QualityControlConfig",
components: { Draggable },
props: {
groupId: String,
groupName: String,
},
data() {
return {
isDisabled: true,
subTypeOpts: [],
parentFieldOpts: [],
widgetVisible: false,
configForm: {
firstType: "",
subType: "",
},
rules: {
firstType: [
{ required: true, message: "请选择数据模块", trigger: "change" },
],
},
isActive: -1,
placeholder: "搜索数据库",
name: "",
searchVal: "",
keyWord: "",
typeId: "",
fieldList: [],
configuredFieldList: [],
tableCode: "",
loading: false,
listLoading: false,
configIndex: 0,
formData: [
{
type: "select",
label: "引用机构/协作组",
placeholder: "请选择机构/协作组",
prop: "id",
opts: [],
rules: [{ required: true, message: "请选择机构/协作组" }],
},
],
columns: [
{
label: "数据模块",
minWidth: 120,
value: "firstType",
hidden: true,
},
{
label: "数据子模块",
minWidth: 120,
value: "subType",
hidden: true,
},
{
label: "字段名称",
minWidth: 120,
value: "fieldName",
},
{
label: "字段code",
minWidth: 120,
value: "fieldCode",
},
{
label: "规则",
minWidth: 200,
value: "logicStr",
},
{
label: "操作",
width: 160,
fixed: "right",
operType: "button",
operations: [
{
func: this.handleConfig,
formatter(row) {
return {
label: "配置",
type: "text",
}
},
},
{
func: this.handleDel,
style: {
color: "#F56C6C",
},
formatter(row) {
return {
label: "删除配置",
type: "text",
}
},
},
],
},
],
dicData: [],
}
},
watch: {
groupId(groupId) {
if (groupId) {
this.getTableFields()
this.getFields()
}
},
tableCode(tableCode) {
this.columns[0].hidden = this.columns[1].hidden =
tableCode === "data_lab_detail" ? false : true
},
},
computed: {
...mapGetters({
dictList: ["dict/dictSet"],
dictMap: ["dict/dictMap"],
}),
// 数据库表过滤
tableList() {
const dictTable =
(this.dictMap["table"] &&
this.dictMap["table"].filter((_) => _.value !== "data_lab_type")) ||
[]
const list = dictTable.filter(
(_) =>
!this.searchVal ||
_.label.includes(this.searchVal) ||
_.value.includes(this.searchVal)
)
this.isActive = this.getListIdx(list, this.typeId)
return list
},
fields() {
return this.fieldList.filter(
(_) =>
!this.keyWord ||
_.fieldName.includes(this.keyWord) ||
_.fieldCode.includes(this.keyWord)
)
},
configuredFields() {
return this.configuredFieldList.filter(
(_) =>
!this.keyWord ||
_.fieldName.includes(this.keyWord) ||
_.fieldCode.includes(this.keyWord)
)
},
},
methods: {
handleDel(row) {
this.$confirm(`是否删除【${row.fieldName || ""}】配置?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
delConf(row.id).then((res) => {
if (res.code === 1) {
this.$message({
type: "success",
message: "删除成功!",
})
this.getTableFields()
}
})
})
.catch(() => {})
},
handleClone() {
if (!this.groupId) {
this.$message.warning("请先选择协作组")
return
}
this.$refs.dialog.open()
},
handleConfirm({ id }) {
const { diseaseCode, groupId, orgId } = this.formData[0].opts.find(
(item) => item.groupId === id
)
const params = {
sourceDiseaseCode: diseaseCode,
sourceGroupId: groupId,
sourceOrgId: orgId,
targetGroupId: this.groupId,
}
setCloneConf(params).then((res) => {
this.$message.success("配置成功")
this.getFields()
this.$refs.dialog.close()
})
},
handleConfigConfirm() {
this.$refs.form.validate((valid) => {
if (valid) {
const data = Object.assign(
{
tableCode: this.tableCode,
tableName: this.name,
groupId: this.groupId,
groupName: this.groupName,
},
this.configForm
)
this.loading = true
setQcConfigField(data)
.then((res) => {
this.$message.success("配置成功")
this.getFields()
this.widgetVisible = false
})
.finally(() => {
this.loading = false
})
} else {
}
})
},
tableChange(tableCode) {
if (!tableCode) {
this.parentFieldOpts = []
return
}
getTableFields({ tableCode, groupId: this.groupId }).then((res) => {
this.parentFieldOpts = res.data.map((_) => {
return {
..._,
label: _.fieldName,
value: _.fieldCode,
}
})
})
},
firstTypeChange(val, notEmpty = false) {
let list = []
const current = this.dictMap["data_module"].find((_) => _.value === val)
if (current && current.children) {
list = current.children
}
if (!notEmpty) {
this.$set(this.configForm, "subType", "")
}
this.subTypeOpts = list
},
dicTypeChange(type) {
this.dicData = this.deepClone(this.dictMap[type])
},
handleAdd() {
this.handleConfig({}, -1)
},
handleConfig(row, index) {
this.configForm = Object.assign({}, row, {
maxLen: this.formatter(row.maxLen),
minLen: this.formatter(row.minLen),
maxValue: this.formatter(row.maxValue),
minValue: this.formatter(row.minValue),
})
this.dicTypeChange(row.dictType)
this.firstTypeChange(row.firstType, true)
this.isDisabled = index > -1
this.configIndex = index
this.widgetVisible = true
},
formatter(val) {
return val === "" || val === null ? undefined : val
},
getQcGroupOption() {
getQcGroupOption().then((res) => {
this.formData[0].opts = res.data.map((item) => {
return {
...item,
value: item.groupId,
label: `机构:${item.orgName} | 疾病: ${item.diseaseName} | 协作组: ${item.groupName}`,
}
})
})
},
// 点击左侧列表
handClick(index, { type, label, id, value }) {
if (!this.groupId) {
this.$message.warning("请先选择协作组")
return
}
this.name = label
this.tableCode = value
this.isActive = index
this.typeId = id
this.fieldList = []
this.getTableFields()
},
// 全部字段
getTableFields() {
getTableFields({ tableCode: this.tableCode, groupId: this.groupId }).then(
(res) => {
this.fieldList = res.data
this.getFields()
}
)
},
// 已配置字段
getFields() {
if (!this.tableCode) return
getQcConfigFields({ tableCode: this.tableCode, groupId: this.groupId })
.then((res) => {
this.configuredFieldList = res.data
this.fieldList = this.fieldList.map((field) => {
let configuredField = this.configuredFieldList.find(
(_) => _.fieldCode === field.fieldCode
)
return {
...field,
...configuredField,
}
})
})
.catch((e) => {
this.configuredFieldList = []
})
},
// 批量保存
handleSave() {
if (!this.groupId) {
this.$message.warning("请先选择协作组")
return
}
const table = {
tableCode: this.tableCode,
tableName: this.name,
groupId: this.groupId,
groupName: this.groupName,
}
const fieldList =
this.tableCode === "data_lab_detail"
? this.configuredFieldList
: this.fieldList
const list = fieldList
.filter((_) => _.firstType)
.map((_) => {
return {
..._,
...table,
}
})
if (!list.length) {
this.$message.warning("没有可保存的数据")
return
}
this.loading = true
setQcConfigFields(table, list)
.then((res) => {
this.$message.success("配置成功")
this.getFields()
})
.finally(() => {
this.loading = false
})
},
getListIdx(list = [], id) {
let listIdx = -1
for (var i = 0; i < list.length; i++) {
if (list[i].id === id) {
listIdx = i
break
}
}
return listIdx
},
},
created() {
this.getQcGroupOption()
},
}
</script>
<style lang="scss" scoped>
::v-deep .el-main {
padding: 0px 0 0 10px;
}
.drawer__container {
padding: 0 20px;
.drawer__content {
height: calc(100vh - #{"160px"});
overflow-y: auto;
::v-deep .el-input-number {
width: 100%;
}
&::-webkit-scrollbar {
width: 0px;
height: 0px;
}
&::-webkit-scrollbar-thumb {
background-color: #fff;
}
}
.footer {
margin-top: 20px;
display: flex;
button {
flex: 1;
}
}
}
</style>
...@@ -38,15 +38,6 @@ ...@@ -38,15 +38,6 @@
<el-tab-pane label="表单管理" name="second"> <el-tab-pane label="表单管理" name="second">
<GroupForm :group-id="groupId"></GroupForm> <GroupForm :group-id="groupId"></GroupForm>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="导出字段配置" name="third">
<ExportFieldConfig :group-id="groupId"></ExportFieldConfig>
</el-tab-pane>
<el-tab-pane label="质控配置" name="fourth">
<QualityControlConfig
:group-id="groupId"
:group-name="groupName"
></QualityControlConfig>
</el-tab-pane>
<el-tab-pane label="参数配置" name="fifth"> <el-tab-pane label="参数配置" name="fifth">
<ParameterConfig :group-id="groupId"></ParameterConfig> <ParameterConfig :group-id="groupId"></ParameterConfig>
</el-tab-pane> </el-tab-pane>
...@@ -65,18 +56,14 @@ ...@@ -65,18 +56,14 @@
</template> </template>
<script> <script>
import ExportFieldConfig from "./ExportFieldConfig.vue"
import GroupUser from "./GroupUser" import GroupUser from "./GroupUser"
import GroupForm from "./GroupForm" import GroupForm from "./GroupForm"
import QualityControlConfig from "./QualityControlConfig.vue"
import ParameterConfig from "./ParameterConfig.vue" import ParameterConfig from "./ParameterConfig.vue"
import { translateListToTree } from "@/utils/handleRoutes" import { translateListToTree } from "@/utils/handleRoutes"
import { getCoopGroupList, addCoopGroup } from "@/api/coop-group.js" import { getCoopGroupList, addCoopGroup } from "@/api/coop-group.js"
export default { export default {
name: "CollaGroup", name: "CollaGroup",
components: { components: {
ExportFieldConfig,
QualityControlConfig,
GroupUser, GroupUser,
GroupForm, GroupForm,
ParameterConfig, ParameterConfig,
......
...@@ -109,7 +109,7 @@ ...@@ -109,7 +109,7 @@
<script> <script>
import WidgetConfig from "packages/WidgetConfig.vue" import WidgetConfig from "packages/WidgetConfig.vue"
import { getFieldList, addField, delField } from "@/api/field.js" import { getFieldListByCode, addField, delField } from "@/api/field.js"
// 新增所需字段 // 新增所需字段
const fields = [ const fields = [
"id", "id",
...@@ -264,9 +264,9 @@ export default { ...@@ -264,9 +264,9 @@ export default {
this.widgetVisible = true this.widgetVisible = true
}, },
handleConfirm(form) { handleConfirm(form) {
if (!/^[a-z]+([a-z0-9]*([_]?[a-z]+)*)*$/.test(form.prop)) { if (!/^[a-zA-Z]+([a-zA-Z0-9]*([_-]?[a-zA-Z0-9]+)*)*$/.test(form.prop)) {
this.$message.error( this.$message.error(
"只能包含字母、数字、下划线。必须以字母开始,下划线不可连续重复,下划线后不可紧跟着数字,不能以数字、下划线结束" "只能包含大小字母、数字、下划线。必须以字母开始,下划线不可连续重复,下划线后不可紧跟着数字,不能以数字、下划线结束"
) )
return return
} }
...@@ -325,6 +325,7 @@ export default { ...@@ -325,6 +325,7 @@ export default {
this.handleSearch(form) this.handleSearch(form)
}, },
handleSearch(form) { handleSearch(form) {
if (!this.tableCode) return
this.cacheForm = Object.assign(this.cacheForm, form) this.cacheForm = Object.assign(this.cacheForm, form)
this.listLoading = true this.listLoading = true
const params = Object.assign( const params = Object.assign(
...@@ -338,7 +339,7 @@ export default { ...@@ -338,7 +339,7 @@ export default {
delete params[key] delete params[key]
} }
} }
getFieldList(params).then((res) => { getFieldListByCode(params).then((res) => {
this.listLoading = false this.listLoading = false
this.tableData = res.data || [] this.tableData = res.data || []
}) })
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
{{ item.name }} | {{ item.code }} {{ item.name }} | {{ item.code }}
</span> </span>
<span class="item-del"> <span class="item-del">
<i class="el-icon-edit-outline" @click="handleAdd(item)"></i> <!-- <i class="el-icon-edit-outline" @click="handleAdd(item)"></i> -->
</span> </span>
</el-col> </el-col>
</el-col> </el-col>
......
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
@change="tableCodeChange" @change="tableCodeChange"
> >
<el-option <el-option
v-for="opt in dictMap['table']" v-for="opt in tableList"
:key="opt.value" :key="opt.code"
:label="opt.label" :label="opt.name"
:value="opt.value" :value="opt.code"
> >
</el-option> </el-option>
</el-select> </el-select>
...@@ -50,15 +50,19 @@ import { ...@@ -50,15 +50,19 @@ import {
getFormDetail, getFormDetail,
getHistoryInfo, getHistoryInfo,
} from "@/api/field" } from "@/api/field"
import { getTableList } from "@/api/database"
export default { export default {
name: "FormAdd", name: "FormAdd",
props: { props: {
formEdit: { formEdit: {
type: Object, type: Object,
}, },
dbId: {},
}, },
data() { data() {
return { return {
tableList: [],
disabled: false, disabled: false,
name: "", name: "",
options: {}, options: {},
...@@ -70,11 +74,17 @@ export default { ...@@ -70,11 +74,17 @@ export default {
}, },
methods: { methods: {
getTableList() {
if (!this.dbId) return
getTableList(this.dbId).then((res) => {
this.tableList = res.data
})
},
// 获取数据表字段 // 获取数据表字段
tableCodeChange(tableCode) { tableCodeChange(tableCode) {
if (!tableCode) return if (!tableCode) return
this.$refs.form.customFieldsLoading = this.disabled = true this.$refs.form.customFieldsLoading = this.disabled = true
const tableList = this.dictMap["table"] const tableList = this.tableList
this.tableName = this.tableName =
tableList.find((_) => _.value === tableCode) && tableList.find((_) => _.value === tableCode) &&
tableList.find((_) => _.value === tableCode).label tableList.find((_) => _.value === tableCode).label
...@@ -84,6 +94,7 @@ export default { ...@@ -84,6 +94,7 @@ export default {
const customOldFields = [] const customOldFields = []
const d = res.data const d = res.data
d.forEach((item) => { d.forEach((item) => {
if (!item.jsonStr) return
const field = JSON.parse(item.jsonStr) const field = JSON.parse(item.jsonStr)
if (field.id) delete field.id if (field.id) delete field.id
customOldFields.push({ customOldFields.push({
...@@ -120,6 +131,7 @@ export default { ...@@ -120,6 +131,7 @@ export default {
id: this.formEdit.id, id: this.formEdit.id,
formJson: "", formJson: "",
name: this.name, name: this.name,
dbId: this.dbId,
} }
let fieldList = [] let fieldList = []
form["formJson"] = await this.$refs.form.getData("string") form["formJson"] = await this.$refs.form.getData("string")
...@@ -202,6 +214,7 @@ export default { ...@@ -202,6 +214,7 @@ export default {
}, },
created() { created() {
this.initForm() this.initForm()
this.getTableList()
}, },
} }
</script> </script>
......
<template> <template>
<div class="container"> <div class="container">
<form-add v-if="isAdd" @back="back" :form-edit="formEdit"></form-add> <form-add
v-if="isAdd"
@back="back"
:form-edit="formEdit"
:dbId="dbId"
></form-add>
<form-history <form-history
v-else-if="isHistory" v-else-if="isHistory"
@back="back" @back="back"
:source-id="sourceId" :source-id="sourceId"
></form-history> ></form-history>
<div v-else> <div v-else>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane
:label="item.name"
:name="'index' + index"
v-for="(item, index) in dbList"
:key="item.id"
>{{
}}</el-tab-pane>
</el-tabs>
<direct-search <direct-search
ref="form" ref="form"
:forms="searchList" :forms="searchList"
...@@ -40,6 +54,7 @@ import paginationMixin from "@/components/TabComponents/mixin" ...@@ -40,6 +54,7 @@ import paginationMixin from "@/components/TabComponents/mixin"
import FormAdd from "./FormAdd" import FormAdd from "./FormAdd"
import FormHistory from "./FormHistory.vue" import FormHistory from "./FormHistory.vue"
import { getFormPage, delForm, copyForm } from "@/api/field.js" import { getFormPage, delForm, copyForm } from "@/api/field.js"
import { getDbList } from "@/api/database"
export default { export default {
components: { components: {
FormAdd, FormAdd,
...@@ -48,6 +63,9 @@ export default { ...@@ -48,6 +63,9 @@ export default {
name: "FormConfig", name: "FormConfig",
data() { data() {
return { return {
activeName: "index0",
dbList: [],
dbId: null,
listLoading: false, listLoading: false,
isAdd: false, isAdd: false,
isHistory: false, isHistory: false,
...@@ -174,6 +192,11 @@ export default { ...@@ -174,6 +192,11 @@ export default {
mixins: [paginationMixin], mixins: [paginationMixin],
methods: { methods: {
handleTabClick({ index }) {
this.dbId = this.dbList[index].id
this.handleFormSearch()
},
handleHistory({ id, version }) { handleHistory({ id, version }) {
this.sourceId = id || "" this.sourceId = id || ""
this.isHistory = true this.isHistory = true
...@@ -187,6 +210,7 @@ export default { ...@@ -187,6 +210,7 @@ export default {
const data = { const data = {
name, name,
id: this.formId, id: this.formId,
dbId: this.dbId,
} }
copyForm(data).then((res) => { copyForm(data).then((res) => {
this.$message.success("复制成功") this.$message.success("复制成功")
...@@ -233,7 +257,12 @@ export default { ...@@ -233,7 +257,12 @@ export default {
handleSearch(form) { handleSearch(form) {
this.cacheForm = Object.assign(this.cacheForm, form) this.cacheForm = Object.assign(this.cacheForm, form)
this.listLoading = true this.listLoading = true
const params = Object.assign({}, this.cacheForm) const params = Object.assign(
{
dbId: this.dbId,
},
this.cacheForm
)
for (let key in params) { for (let key in params) {
if (params[key] === "") { if (params[key] === "") {
delete params[key] delete params[key]
...@@ -250,9 +279,19 @@ export default { ...@@ -250,9 +279,19 @@ export default {
} }
}) })
}, },
getDbList() {
getDbList().then((res) => {
this.dbList = res.data
if (this.dbList[0]) {
this.dbId = this.dbList[0].id
}
this.handleFormSearch()
})
},
}, },
created() { created() {
this.handleFormSearch() this.getDbList()
}, },
} }
</script> </script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment