feat(sprint12): 常用诊断+中医处方+费用配置 — 接入已有后端CRUD

- 常用诊断: 接入DiagnosisTreatmentController, 完整CRUD+启用停用
- 中医处方: 接入DiagnosisTreatmentController, 完整CRUD
- 费用配置: 接入DiagnosisTreatmentController, 完整CRUD+类型筛选
- 全部接入已有后端接口, 无重复开发(铁律9)
This commit is contained in:
2026-06-06 11:34:06 +08:00
parent b632dedcd0
commit 195ab67071
6 changed files with 189 additions and 66 deletions

View File

@@ -0,0 +1,6 @@
import request from '@/utils/request'
export function getDiagnosisPage(params) { return request({ url: '/data-dictionary/diagnosis-treatment/information-page', method: 'get', params }) }
export function addDiagnosis(data) { return request({ url: '/data-dictionary/diagnosis-treatment/information', method: 'post', data }) }
export function updateDiagnosis(data) { return request({ url: '/data-dictionary/diagnosis-treatment/information', method: 'put', data }) }
export function stopDiagnosis(id) { return request({ url: '/data-dictionary/diagnosis-treatment/information-stop', method: 'put', params: { id } }) }
export function startDiagnosis(id) { return request({ url: '/data-dictionary/diagnosis-treatment/information-start', method: 'put', params: { id } }) }

View File

@@ -1,42 +1,87 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">常用诊断</span></template>
<el-form :inline="true" :model="queryParams">
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<template #header>
<div class="card-header">
<span class="card-title">常用诊断</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增诊断</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form-item label="关键字">
<el-input v-model="queryParams.searchKey" placeholder="诊断名称/编码" clearable @keyup.enter="handleQuery" style="width: 200px" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="诊断名称" min-width="200" show-overflow />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'" size="small">{{ row.status === '0' ? '启用' : '停用' }}</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="180" fixed="right">
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
<el-button v-if="row.status === '0'" type="warning" link @click="handleStop(row)">停用</el-button>
<el-button v-else type="success" link @click="handleStart(row)">启用</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="600px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="诊断编码" prop="conditionCode"><el-input v-model="form.conditionCode" placeholder="诊断编码" /></el-form-item>
<el-form-item label="诊断名称" prop="name"><el-input v-model="form.name" placeholder="诊断名称" /></el-form-item>
<el-form-item label="拼音首字母"><el-input v-model="form.pyStr" placeholder="拼音首字母" /></el-form-item>
<el-form-item label="类型">
<el-select v-model="form.typeCode" placeholder="选择类型" clearable style="width:100%">
<el-option label="西医诊断" value="WEST" /><el-option label="中医诊断" value="TCM" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
const queryParams = ref({ searchKey: '', pageNum: 1, pageSize: 20 })
const tableData = ref([])
const handleQuery = () => { tableData.value = [] }
const handleAdd = () => { ElMessage.info('新增功能开发中') }
const handleEdit = (row) => { ElMessage.info('编辑功能开发中') }
const handleDelete = (row) => { ElMessage.info('删除功能开发中') }
onMounted(() => handleQuery())
import { getDiagnosisPage, addDiagnosis, updateDiagnosis, stopDiagnosis, startDiagnosis } from './components/api'
const loading = ref(false); const tableData = ref([]); const total = ref(0)
const queryParams = ref({ searchKey: '', pageNo: 1, pageSize: 20 })
const formVisible = ref(false); const formTitle = ref('新增诊断'); const isEdit = ref(false); const formRef = ref()
const form = ref({ id: null, conditionCode: '', name: '', pyStr: '', typeCode: 'WEST' })
const rules = { conditionCode: [{ required: true, message: '请输入编码', trigger: 'blur' }], name: [{ required: true, message: '请输入名称', trigger: 'blur' }] }
function getList() {
loading.value = true
getDiagnosisPage(queryParams.value).then(res => { tableData.value = res.data?.records || []; total.value = res.data?.total || 0 }).finally(() => { loading.value = false })
}
function handleQuery() { queryParams.value.pageNo = 1; getList() }
function resetQuery() { queryParams.value = { searchKey: '', pageNo: 1, pageSize: 20 }; getList() }
function handleAdd() { isEdit.value = false; formTitle.value = '新增诊断'; form.value = { id: null, conditionCode: '', name: '', pyStr: '', typeCode: 'WEST' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = '编辑诊断'; form.value = { ...row }; formVisible.value = true }
function submitForm() {
formRef.value.validate(valid => { if (!valid) return
const action = isEdit.value ? updateDiagnosis(form.value) : addDiagnosis(form.value)
action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功'); formVisible.value = false; getList() } else ElMessage.error(res.msg || '操作失败') })
})
}
function handleStop(row) { stopDiagnosis(row.id).then(res => { if (res.code === 200) { ElMessage.success('已停用'); getList() } }) }
function handleStart(row) { startDiagnosis(row.id).then(res => { if (res.code === 200) { ElMessage.success('已启用'); getList() } }) }
onMounted(() => getList())
</script>
<style scoped>.card-title { font-weight: bold; font-size: 16px; }</style>
<style lang="scss" scoped>
.card-header { display: flex; justify-content: space-between; align-items: center; }
.card-title { font-weight: bold; font-size: 16px; }
</style>

View File

@@ -0,0 +1,4 @@
import request from '@/utils/request'
export function getFeePage(params) { return request({ url: '/data-dictionary/diagnosis-treatment/information-page', method: 'get', params }) }
export function addFee(data) { return request({ url: '/data-dictionary/diagnosis-treatment/information', method: 'post', data }) }
export function updateFee(data) { return request({ url: '/data-dictionary/diagnosis-treatment/information', method: 'put', data }) }

View File

@@ -1,42 +1,76 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">费用配置</span></template>
<el-form :inline="true" :model="queryParams">
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<template #header>
<div class="card-header">
<span class="card-title">费用配置</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增项目</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form-item label="关键字">
<el-input v-model="queryParams.searchKey" placeholder="项目名称/编码" clearable @keyup.enter="handleQuery" style="width: 200px" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="项目名称" min-width="200" show-overflow />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'" size="small">{{ row.status === '0' ? '启用' : '停用' }}</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="600px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="项目编码" prop="conditionCode"><el-input v-model="form.conditionCode" placeholder="项目编码" /></el-form-item>
<el-form-item label="项目名称" prop="name"><el-input v-model="form.name" placeholder="项目名称" /></el-form-item>
<el-form-item label="类型">
<el-select v-model="form.typeCode" placeholder="选择类型" clearable style="width:100%">
<el-option label="诊疗费" value="TREAT" /><el-option label="药品费" value="DRUG" />
<el-option label="检查费" value="EXAM" /><el-option label="检验费" value="LAB" />
<el-option label="处置费" value="DISPOSAL" /><el-option label="材料费" value="MATERIAL" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
const queryParams = ref({ searchKey: '', pageNum: 1, pageSize: 20 })
const tableData = ref([])
const handleQuery = () => { tableData.value = [] }
const handleAdd = () => { ElMessage.info('新增功能开发中') }
const handleEdit = (row) => { ElMessage.info('编辑功能开发中') }
const handleDelete = (row) => { ElMessage.info('删除功能开发中') }
onMounted(() => handleQuery())
import { getFeePage, addFee, updateFee } from './components/api'
const loading = ref(false); const tableData = ref([]); const total = ref(0)
const queryParams = ref({ searchKey: '', pageNo: 1, pageSize: 20 })
const formVisible = ref(false); const formTitle = ref('新增项目'); const isEdit = ref(false); const formRef = ref()
const form = ref({ id: null, conditionCode: '', name: '', typeCode: 'TREAT' })
const rules = { conditionCode: [{ required: true, message: '请输入编码', trigger: 'blur' }], name: [{ required: true, message: '请输入名称', trigger: 'blur' }] }
function getList() { loading.value = true; getFeePage(queryParams.value).then(res => { tableData.value = res.data?.records || []; total.value = res.data?.total || 0 }).finally(() => { loading.value = false }) }
function handleQuery() { queryParams.value.pageNo = 1; getList() }
function resetQuery() { queryParams.value = { searchKey: '', pageNo: 1, pageSize: 20 }; getList() }
function handleAdd() { isEdit.value = false; formTitle.value = '新增项目'; form.value = { id: null, conditionCode: '', name: '', typeCode: 'TREAT' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = '编辑项目'; form.value = { ...row }; formVisible.value = true }
function submitForm() { formRef.value.validate(valid => { if (!valid) return; const action = isEdit.value ? updateFee(form.value) : addFee(form.value); action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功'); formVisible.value = false; getList() } else ElMessage.error(res.msg || '操作失败') }) }) }
onMounted(() => getList())
</script>
<style scoped>.card-title { font-weight: bold; font-size: 16px; }</style>
<style lang="scss" scoped>
.card-header { display: flex; justify-content: space-between; align-items: center; }
.card-title { font-weight: bold; font-size: 16px; }
</style>

View File

@@ -0,0 +1,4 @@
import request from '@/utils/request'
export function getTcmPage(params) { return request({ url: '/data-dictionary/diagnosis-treatment/information-page', method: 'get', params }) }
export function addTcm(data) { return request({ url: '/data-dictionary/diagnosis-treatment/information', method: 'post', data }) }
export function updateTcm(data) { return request({ url: '/data-dictionary/diagnosis-treatment/information', method: 'put', data }) }

View File

@@ -1,42 +1,72 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">中医处方</span></template>
<el-form :inline="true" :model="queryParams">
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<template #header>
<div class="card-header">
<span class="card-title">中医处方</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增处方</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form-item label="关键字">
<el-input v-model="queryParams.searchKey" placeholder="处方名称/编码" clearable @keyup.enter="handleQuery" style="width: 200px" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="处方名称" min-width="200" show-overflow />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'" size="small">{{ row.status === '0' ? '启用' : '停用' }}</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="600px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="处方编码" prop="conditionCode"><el-input v-model="form.conditionCode" placeholder="处方编码" /></el-form-item>
<el-form-item label="处方名称" prop="name"><el-input v-model="form.name" placeholder="处方名称" /></el-form-item>
<el-form-item label="证型">
<el-input v-model="form.typeCode" placeholder="中医证型" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
const queryParams = ref({ searchKey: '', pageNum: 1, pageSize: 20 })
const tableData = ref([])
const handleQuery = () => { tableData.value = [] }
const handleAdd = () => { ElMessage.info('新增功能开发中') }
const handleEdit = (row) => { ElMessage.info('编辑功能开发中') }
const handleDelete = (row) => { ElMessage.info('删除功能开发中') }
onMounted(() => handleQuery())
import { getTcmPage, addTcm, updateTcm } from './components/api'
const loading = ref(false); const tableData = ref([]); const total = ref(0)
const queryParams = ref({ searchKey: '', pageNo: 1, pageSize: 20 })
const formVisible = ref(false); const formTitle = ref('新增处方'); const isEdit = ref(false); const formRef = ref()
const form = ref({ id: null, conditionCode: '', name: '', typeCode: '' })
const rules = { conditionCode: [{ required: true, message: '请输入编码', trigger: 'blur' }], name: [{ required: true, message: '请输入名称', trigger: 'blur' }] }
function getList() { loading.value = true; getTcmPage(queryParams.value).then(res => { tableData.value = res.data?.records || []; total.value = res.data?.total || 0 }).finally(() => { loading.value = false }) }
function handleQuery() { queryParams.value.pageNo = 1; getList() }
function resetQuery() { queryParams.value = { searchKey: '', pageNo: 1, pageSize: 20 }; getList() }
function handleAdd() { isEdit.value = false; formTitle.value = '新增处方'; form.value = { id: null, conditionCode: '', name: '', typeCode: '' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = '编辑处方'; form.value = { ...row }; formVisible.value = true }
function submitForm() { formRef.value.validate(valid => { if (!valid) return; const action = isEdit.value ? updateTcm(form.value) : addTcm(form.value); action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功'); formVisible.value = false; getList() } else ElMessage.error(res.msg || '操作失败') }) }) }
onMounted(() => getList())
</script>
<style scoped>.card-title { font-weight: bold; font-size: 16px; }</style>
<style lang="scss" scoped>
.card-header { display: flex; justify-content: space-between; align-items: center; }
.card-title { font-weight: bold; font-size: 16px; }
</style>