调整项目管理模块中基础项目中的一些名称,接口文件添加了一部分接口

This commit is contained in:
Euni4U 2025-02-18 15:55:09 +08:00
parent c0b99c2ba2
commit 6dd15833f2
6 changed files with 568 additions and 135 deletions

View File

@ -20,11 +20,21 @@ export const ExammoduleApi = {
return await request.get({ url: `/inspect/exammodule/get?id=` + id }) return await request.get({ url: `/inspect/exammodule/get?id=` + id })
}, },
//所有体检套餐
getListExammodule: async () => {
return await request.get({ url: `/inspect/exammodule/getList` })
},
// 新增体检套餐 // 新增体检套餐
createExammodule: async (data: ExammoduleVO) => { createExammodule: async (data: ExammoduleVO) => {
return await request.post({ url: `/inspect/exammodule/create`, data }) return await request.post({ url: `/inspect/exammodule/create`, data })
}, },
//新增体检套餐和项目
ListcreateExammodule: async (data: any) => {
return await request.post({ url: `/inspect/exammodule/Listcreate`, data })
},
// 修改体检套餐 // 修改体检套餐
updateExammodule: async (data: ExammoduleVO) => { updateExammodule: async (data: ExammoduleVO) => {
return await request.put({ url: `/inspect/exammodule/update`, data }) return await request.put({ url: `/inspect/exammodule/update`, data })
@ -35,6 +45,13 @@ export const ExammoduleApi = {
return await request.delete({ url: `/inspect/exammodule/delete?id=` + id }) return await request.delete({ url: `/inspect/exammodule/delete?id=` + id })
}, },
// 按照套餐项目ID和套餐ID删除体检套餐项目
deleteExammoduleitemcode: async (params: { itemCode: string, examModuleID: number }) => {
return await request.delete({
url: `/inspect/exammodule/deleteitemcode?itemCode=${params.itemCode}&examModuleID=${params.examModuleID}`
})
},
// 导出体检套餐 Excel // 导出体检套餐 Excel
exportExammodule: async (params) => { exportExammodule: async (params) => {
return await request.download({ url: `/inspect/exammodule/export-excel`, params }) return await request.download({ url: `/inspect/exammodule/export-excel`, params })

View File

@ -20,10 +20,10 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="项目名称"> <el-form-item label="项目名称">
<el-input v-model="queryParams.projectName" placeholder="请输入名称" /> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" />
</el-form-item> </el-form-item>
<el-form-item label="项目代号"> <el-form-item label="项目代号">
<el-input v-model="queryParams.projectCode" placeholder="请输入项目代" /> <el-input v-model="queryParams.projectCode" placeholder="请输入项目代" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button> <el-button type="primary" @click="handleSearch">搜索</el-button>
@ -57,9 +57,13 @@
<el-table-column type="selection" width="55" :resizable="false" /> <el-table-column type="selection" width="55" :resizable="false" />
<el-table-column prop="itemCode" label="项目代号" :resizable="false" /> <el-table-column prop="itemCode" label="项目代号" :resizable="false" />
<el-table-column prop="itemName" label="检查项目名称" :resizable="false" /> <el-table-column prop="itemName" label="检查项目名称" :resizable="false" />
<el-table-column prop="price" label="项目单价" :resizable="false" /> <el-table-column prop="price" label="项目单价(元)" :resizable="false" />
<el-table-column prop="discountedPrice" label="折扣价" :resizable="false" /> <el-table-column label="折扣价(元)" :resizable="false">
<el-table-column prop="discounted" label="折扣百分比" :resizable="false" /> <template #default="scope">
{{ calculateDiscountedPrice(scope.row.price, scope.row.discounted) }}
</template>
</el-table-column>
<el-table-column prop="discounted" label="折扣(%) " :resizable="false" />
<el-table-column prop="section" label="科室名称" :resizable="false" /> <el-table-column prop="section" label="科室名称" :resizable="false" />
<el-table-column prop="unit" label="项目单位" :resizable="false" /> <el-table-column prop="unit" label="项目单位" :resizable="false" />
<el-table-column prop="highValue" label="取值上限" :resizable="false" /> <el-table-column prop="highValue" label="取值上限" :resizable="false" />
@ -75,7 +79,7 @@
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="handleEdit(scope.row.id)">编辑</el-dropdown-item> <el-dropdown-item @click="handleEdit(scope.row.id)">编辑</el-dropdown-item>
<el-dropdown-item @click="handleDelete(scope.row)">删除</el-dropdown-item> <el-dropdown-item @click="handleDelete(scope.row)" style="color: red;">删除</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -104,7 +108,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted, onBeforeMount, watch } from 'vue' import { ref, reactive, onMounted, watch } from 'vue'
import { Plus, ArrowDown } from '@element-plus/icons-vue' import { Plus, ArrowDown } from '@element-plus/icons-vue'
import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index' import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index'
import { itemsApi, itemsVO } from '@/api/inspect/inspectitems/index' import { itemsApi, itemsVO } from '@/api/inspect/inspectitems/index'
@ -315,6 +319,12 @@ watch(editDialogVisible, (newVal) => {
getTableData() getTableData()
} }
}) })
//
const calculateDiscountedPrice = (price: number, discount: number): number => {
if (!price || !discount) return 0;
return Number((price - price * (discount / 100)).toFixed(2));
}
</script> </script>
<style scoped> <style scoped>

View File

@ -68,7 +68,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="折扣百分比" prop="discounted"> <el-form-item label="折扣" prop="discounted">
<el-input v-model="formData.discounted" placeholder="请输入折扣"> <el-input v-model="formData.discounted" placeholder="请输入折扣">
<template #append>%</template> <template #append>%</template>
</el-input> </el-input>
@ -118,12 +118,13 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from 'vue' import { ref } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index' import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index'
import { itemsApi, itemsVO } from '@/api/inspect/inspectitems/index' import { itemsApi, itemsVO } from '@/api/inspect/inspectitems/index'
import { getStrDictOptions } from '@/utils/dict' import { getStrDictOptions } from '@/utils/dict'
const visible = ref(false) const visible = ref(false)
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const departmentOptions = ref<{ value: string; label: string }[]>([]) const departmentOptions = ref<{ value: string; label: string }[]>([])
@ -156,7 +157,7 @@ const getDepartmentList = async () => {
try { try {
const data = await DepartmentApi.getListDepartment() const data = await DepartmentApi.getListDepartment()
departmentOptions.value = data.map((item: DepartmentVO) => ({ departmentOptions.value = data.map((item: DepartmentVO) => ({
value: item.departmentName, value: item.id,
label: item.departmentName label: item.departmentName
})) }))
} catch (error) { } catch (error) {
@ -165,7 +166,10 @@ const getDepartmentList = async () => {
} }
} }
// // emit
const emit = defineEmits(['success'])
//
const handleSubmit = async () => { const handleSubmit = async () => {
if (!formRef.value) return if (!formRef.value) return
@ -179,11 +183,13 @@ const handleSubmit = async () => {
} }
if (formData.value.section) { if (formData.value.section) {
const section = formData.value.section const section = formData.value.section
formData.value.section = section.split('|')[0] formData.value.sectionID = section.split('|')[0]
formData.value.sectionID = section.split('|')[1] formData.value.section = section.split('|')[1]
} }
await itemsApi.createitems(formData.value as itemsVO) await itemsApi.createitems(formData.value as itemsVO)
ElMessage.success('添加成功') ElMessage.success('添加成功')
// success
emit('success')
handleClose() handleClose()
} catch (error) { } catch (error) {
console.error('添加失败:', error) console.error('添加失败:', error)

View File

@ -23,13 +23,12 @@
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
<el-button type="primary" @click="handleSearch">搜索</el-button> <el-button type="primary" @click="handleSearch" style="margin-top: 10px ;margin-bottom : 10px;">搜索</el-button>
<el-button type="primary" @click="save">保存</el-button> <el-button type="primary" @click="save" style="margin-top: 10px ;margin-bottom : 10px;">添加</el-button>
<el-button type="danger" @click="handleDelete">删除选中</el-button>
<el-button type="danger" @click="handleClear">清空列表</el-button>
</div> </div>
<el-table <el-table
ref="tableRef"
:data="tableData" :data="tableData"
border border
style="width: 100%" style="width: 100%"
@ -59,9 +58,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ExammoduleApi } from '@/api/inspect/exammodule'
import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index' import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage } from 'element-plus'
import { itemsApi } from '@/api/inspect/inspectitems/index' import { itemsApi } from '@/api/inspect/inspectitems/index'
// //
async function handleSearch() { async function handleSearch() {
@ -80,17 +78,13 @@ async function handleSearch() {
queryParams.sectionID = searchForm.department // 使section queryParams.sectionID = searchForm.department // 使section
} }
console.log('查询参数:', queryParams) //
try { try {
const res = await itemsApi.getitemsPage(queryParams) const res = await itemsApi.getitemsPage(queryParams)
console.log('查询结果:', res)
if (res) { if (res) {
tableData.value = res.list || [] tableData.value = res.list || []
total.value = res.total || 0 total.value = res.total || 0
} }
} catch (error) { } catch (error) {
console.error('查询失败:', error)
ElMessage.error('查询失败') ElMessage.error('查询失败')
tableData.value = [] tableData.value = []
total.value = 0 total.value = 0
@ -110,7 +104,6 @@ const getDepartmentList = async () => {
label: item.departmentName label: item.departmentName
})) }))
} catch (error) { } catch (error) {
console.error('获取科室列表失败:', error)
ElMessage.error('获取科室列表失败') ElMessage.error('获取科室列表失败')
} }
} }
@ -118,10 +111,21 @@ const getDepartmentList = async () => {
const currentPage = ref(1) const currentPage = ref(1)
const pageSize = ref(10) const pageSize = ref(10)
const total = ref(0) const total = ref(0)
const emit = defineEmits(['update:modelValue', 'save-items'])
const tableRef = ref(null)
// //
const save = () => { const save = () => {
console.log(tableData.value) if (selectedRows.value.length === 0) {
ElMessage.warning('请先选择要保存的项目')
return
}
emit('save-items', selectedRows.value)
emit('update:modelValue', false)
} }
const handleSizeChange = (val: number) => { const handleSizeChange = (val: number) => {
pageSize.value = val pageSize.value = val
handleSearch() handleSearch()
@ -133,53 +137,13 @@ const handleCurrentChange = (val: number) => {
} }
// //
const selectedRows = ref([]) const selectedRows = ref<any[]>([])
// //
const handleSelectionChange = (selection: any[]) => { const handleSelectionChange = (selection: any[]) => {
selectedRows.value = selection selectedRows.value = selection
} }
//
const handleDelete = () => {
if (selectedRows.value.length === 0) {
ElMessage.warning('请选择要删除的数据')
return
}
ElMessageBox.confirm('确认从列表中移除选中的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//
const selectedIndices = selectedRows.value.map(row =>
tableData.value.findIndex(item => item === row)
)
//
selectedIndices.sort((a, b) => b - a).forEach(index => {
if (index !== -1) {
tableData.value.splice(index, 1)
}
})
ElMessage.success('移除成功')
}).catch(() => {})
}
const handleClear = () => {
ElMessageBox.confirm('确认清空列表数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
tableData.value = []
total.value = 0
ElMessage.success('清空成功')
}).catch(() => {})
}
onMounted(() => { onMounted(() => {
getDepartmentList() getDepartmentList()
}) })

View File

@ -20,7 +20,36 @@
:class="{ active: selectedPackage?.id === item.id }" :class="{ active: selectedPackage?.id === item.id }"
@click="handleSelectPackage(item)" @click="handleSelectPackage(item)"
> >
<div class="package-name">{{ item.examModuleName }}</div> <div class="package-content">
<div class="package-name">
<template v-if="item.isEditing">
<el-input
v-model="item.examModuleName"
size="small"
@blur="saveEdit(item)"
@keyup.enter="saveEdit(item)"
@input="validateNumber($event, item)"
@click.stop
/>
</template>
<template v-else>
{{ item.examModuleName }}
</template>
</div>
<div class="package-actions">
<el-dropdown @command="(command) => handleCommand(command, item)" trigger="click" @click.stop>
<span class="el-dropdown-link">
操作<el-icon class="el-icon--right"><arrow-down /></el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="edit">编辑</el-dropdown-item>
<el-dropdown-item command="delete" class="delete-item" divided>删除</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -31,41 +60,28 @@
<el-button type="primary" @click="handleAdd"> <el-button type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
</el-button> </el-button>
<el-button type="primary" @click="handleDelete">
<el-icon><Delete /></el-icon>
</el-button>
<el-button type="primary" @click="openDrawer"> <el-button type="primary" @click="openDrawer">
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
</el-button> </el-button>
<el-button type="primary" @click="handleSubmit"> <el-button type="danger" @click="handleDeleteSelected">
<el-icon><Delete /></el-icon>
</el-button>
<el-button
type="success"
@click="handleSubmit"
:disabled="!isSubmitEnabled"
>
<el-icon><Upload /></el-icon> <el-icon><Upload /></el-icon>
</el-button> </el-button>
</div> </div>
<div class="search-form"> <el-table :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange">
<el-form :inline="true" :model="searchForm">
<el-form-item label="套餐编号" required>
<el-input v-model="searchForm.name" placeholder="请输入" style="width: 200px" />
</el-form-item>
<el-form-item label="套餐名称" required>
<el-input v-model="searchForm.name" placeholder="请输入" style="width: 200px" />
</el-form-item>
</el-form>
</div>
<el-table :data="tableData" border style="width: 100%">
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="55" />
<el-table-column prop="name" label="名称" /> <el-table-column prop="name" label="基础项目名称" />
<el-table-column prop="price" label="销售价(元)" /> <el-table-column prop="price" label="销售价(元)" />
<el-table-column prop="discount" label="折扣(%)" /> <el-table-column prop="discount" label="折扣(%)" />
<el-table-column prop="discountPrice" label="折扣价(元)" /> <el-table-column prop="discountPrice" label="折扣价(元)" />
<el-table-column prop="address" label="检查地址" /> <el-table-column prop="moduleName" label="项目单元" />
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table> </el-table>
<div class="pagination-container"> <div class="pagination-container">
@ -90,7 +106,7 @@
size="30%" size="30%"
:destroy-on-close="true" :destroy-on-close="true"
> >
<Drawer/> <Drawer @save-items="handleSaveItems"/>
</el-drawer> </el-drawer>
</div> </div>
</div> </div>
@ -100,11 +116,13 @@
<script setup> <script setup>
import { ref, reactive, onMounted, computed } from 'vue' import { ref, reactive, onMounted, computed } from 'vue'
import { Plus, Delete, Upload, Search, Picture, PictureFilled } from '@element-plus/icons-vue' import { Plus, Delete, Upload, Search, Picture, PictureFilled, ArrowDown } from '@element-plus/icons-vue'
import NewPackage from './new.vue' import NewPackage from './new.vue'
import { ExammoduleApi } from '@/api/inspect/exammodule' import { ExammoduleApi } from '@/api/inspect/exammodule'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import Drawer from './drawer.vue' import Drawer from './drawer.vue'
import { itemsApi } from '@/api/inspect/inspectitems'
import { ElMessageBox } from 'element-plus'
// //
const searchKeyword = ref('') const searchKeyword = ref('')
// type // type
@ -140,30 +158,86 @@ const filteredPackageList = computed(() => {
) )
}) })
// //
const getPackageList = async () => { const getPackageList = async () => {
try { try {
const res = await ExammoduleApi.getExammodulePage({ const res = await ExammoduleApi.getListExammodule()
pageNo: 1,
pageSize: 100 if (res) {
}) // examModuleID
// res.list const groupedPackages = {}
if (res?.list) { res.forEach(item => {
packageList.value = res.list if (item.examModuleID && item.examModuleID.toString().trim() !== '') {
} else { if (!groupedPackages[item.examModuleID]) {
groupedPackages[item.examModuleID] = {
...item,
itemCodes: item.itemCode ? [item.itemCode] : []
}
} else if (item.itemCode) {
groupedPackages[item.examModuleID].itemCodes.push(item.itemCode)
}
}
})
packageList.value = Object.values(groupedPackages)
} else {
packageList.value = [] packageList.value = []
console.warn('获取套餐列表数据结构异常:', res)
} }
} catch (error) { } catch (error) {
console.error('获取套餐列表失败:', error)
packageList.value = [] packageList.value = []
} }
} }
// //
const handleSelectPackage = (item) => { const handleSelectPackage = async (item) => {
selectedPackage.value = item selectedPackage.value = item
// hasDataChanged.value = false //
try {
// itemCodes itemCodes
if (!item.itemCodes || item.itemCodes.length === 0) {
tableData.value = []
return
}
//
const itemDetails = []
for (const itemCode of item.itemCodes) {
const itemDetail = await itemsApi.getitemsPage({
itemCode: itemCode,
pageNo: 1,
pageSize: 1
})
if (itemDetail?.list?.[0]) {
itemDetails.push({
name: itemDetail.list[0].itemName,
price: itemDetail.list[0].price,
discount: itemDetail.list[0].discount,
discountPrice: itemDetail.list[0].discountPrice,
moduleName: itemDetail.list[0].moduleName
})
}
}
tableData.value = itemDetails
} catch (error) {
console.error('加载套餐项目失败:', error)
ElMessage.error('加载套餐项目失败')
tableData.value = []
}
}
//
const getItemDetail = async (itemCode) => {
try {
//
const response = await itemsApi.getItems({
itemCode: itemCode
})
return response
} catch (error) {
console.error('获取项目详情失败:', error)
return null
}
} }
// //
@ -187,20 +261,208 @@ const refreshList = async () => {
await getPackageList() // await getPackageList() //
} }
const handleDelete = (row) => { const handleDelete = async () => {
// if (!selectedPackage.value) {
ElMessage.warning('请先选择要删除的套餐')
return
}
try {
await ElMessageBox.confirm('确定要删除该套餐吗?此操作将删除该套餐下的所有项目。', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
// examModuleID
const res = await ExammoduleApi.getExammodulePage({
examModuleID: selectedPackage.value.examModuleID,
pageNo: 1,
pageSize: 100
})
if (res?.list) {
//
const deletePromises = res.list.map(item =>
ExammoduleApi.deleteExammodule(item.id)
)
await Promise.all(deletePromises)
}
ElMessage.success('删除成功')
//
await getPackageList()
//
selectedPackage.value = null
tableData.value = []
} catch (error) {
if (error !== 'cancel') {
console.error('删除失败:', error)
ElMessage.error('删除失败')
}
}
} }
const handleAddItem = () => { const handleAddItem = () => {
// //
} }
const handleSubmit = () => { //
// const isSubmitEnabled = computed(() => {
return tableData.value.length > 0 && selectedPackage.value && hasDataChanged.value
})
//
const hasDataChanged = ref(false)
// handleSaveItems
const handleSaveItems = async (items) => {
if (!selectedPackage.value) {
ElMessage.warning('请先选择套餐')
return
}
//
const newItems = items.map(item => ({
name: item.itemName,
price: item.price,
discount: item.discount,
discountPrice: item.discountPrice,
moduleName: item.moduleName
}))
//
const existingNames = tableData.value.map(item => item.name)
const uniqueItems = newItems.filter(item => !existingNames.includes(item.name))
if (uniqueItems.length === 0) {
ElMessage.warning('所选项目已存在')
return
}
//
tableData.value = [...tableData.value, ...uniqueItems]
hasDataChanged.value = true //
drawer.value = false
ElMessage.success('项目添加成功')
} }
const handleEdit = (row) => { const multipleSelection = ref([])
//
//
const handleSelectionChange = (selection) => {
multipleSelection.value = selection
}
//
const handleDeleteSelected = async () => {
if (multipleSelection.value.length === 0) {
ElMessage.warning('请先选择要删除的项目')
return
}
try {
await ElMessageBox.confirm('确定要删除选中的项目吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
//
for (const item of multipleSelection.value) {
// itemCode
const itemsRes = await itemsApi.getitemsPage({
itemName: item.name,
pageNo: 1,
pageSize: 1
})
if (!itemsRes?.list?.[0]) {
ElMessage.warning(`未找到项目"${item.name}"的信息`)
continue
}
const itemCode = itemsRes.list[0].itemCode
//
await ExammoduleApi.deleteExammoduleitemcode({
itemCode: itemCode,
examModuleID: selectedPackage.value.examModuleID
})
//
tableData.value = tableData.value.filter(row => row.name !== item.name)
}
//
multipleSelection.value = []
//
await getPackageList()
//
if (selectedPackage.value) {
const updatedPackage = packageList.value.find(p => p.examModuleID === selectedPackage.value.examModuleID)
if (updatedPackage) {
await handleSelectPackage(updatedPackage)
}
}
hasDataChanged.value = true //
ElMessage.success('删除成功')
} catch (error) {
if (error !== 'cancel') {
console.error('删除失败:', error)
ElMessage.error('删除失败')
}
}
}
const validateNumber = (value, item) => {
if (value) {
//
item.examModuleName = value.replace(/\D/g, '')
}
}
const saveEdit = async (item) => {
if (!item.examModuleName.trim()) {
item.examModuleName = item.originalName
item.isEditing = false
ElMessage.warning('套餐名称不能为空')
return
}
try {
await ExammoduleApi.updateExammodule({
examModuleName: item.examModuleName,
examModuleID: item.examModuleID
})
ElMessage.success('更新成功')
item.isEditing = false
await getPackageList()
const updatedPackage = packageList.value.find(p => p.examModuleID === item.examModuleID)
if (updatedPackage) {
selectedPackage.value = updatedPackage
await handleSelectPackage(updatedPackage)
}
} catch (error) {
console.error('更新失败:', error)
item.examModuleName = item.originalName
item.isEditing = false
ElMessage.error('更新失败')
}
}
const drawer = ref(false)
const openDrawer = () => {
drawer.value = true
} }
// //
@ -214,10 +476,143 @@ const handleCurrentChange = (val) => {
getPackageList() getPackageList()
} }
const drawer = ref(false) // handleSubmit
const handleSubmit = async () => {
if (!selectedPackage.value) {
ElMessage.warning('请先选择套餐')
return
}
const openDrawer = () => { if (tableData.value.length === 0) {
drawer.value = true ElMessage.warning('请先添加项目')
return
}
try {
// itemCode
if (!selectedPackage.value.itemCodes || selectedPackage.value.itemCodes.length === 0) {
await ExammoduleApi.deleteExammodule(selectedPackage.value.id)
}
//
const bindList = []
// ID
for (const item of tableData.value) {
// ID
const itemsRes = await itemsApi.getitemsPage({
itemName: item.name,
pageNo: 1,
pageSize: 1
})
if (!itemsRes?.list?.[0]) {
ElMessage.warning(`未找到项目"${item.name}"的信息`)
continue
}
//
const itemCode = itemsRes.list[0].itemCode
if (!selectedPackage.value.itemCodes?.includes(itemCode)) {
//
bindList.push({
id: null,
examModuleName: selectedPackage.value.examModuleName,
examModuleID: selectedPackage.value.examModuleID,
itemCode: itemCode
})
}
}
//
if (bindList.length > 0) {
await ExammoduleApi.ListcreateExammodule(bindList)
ElMessage.success('提交成功')
} else {
ElMessage.success('数据已更新')
}
//
await getPackageList()
//
if (selectedPackage.value) {
const updatedPackage = packageList.value.find(p => p.examModuleID === selectedPackage.value.examModuleID)
if (updatedPackage) {
await handleSelectPackage(updatedPackage)
}
}
hasDataChanged.value = false //
} catch (error) {
console.error('提交失败:', error)
ElMessage.error('提交失败')
}
}
const handleEdit = async () => {
if (!selectedPackage.value) {
ElMessage.warning('请先选择要编辑的套餐')
return
}
try {
const { value: newName } = await ElMessageBox.prompt('请输入新的套餐名称', '编辑套餐', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputValue: selectedPackage.value.examModuleName
})
if (newName.trim() === '') {
ElMessage.warning('套餐名称不能为空')
return
}
// examModuleID
const res = await ExammoduleApi.getExammodulePage({
examModuleID: selectedPackage.value.examModuleID,
pageNo: 1,
pageSize: 100
})
if (res?.list) {
//
const updatePromises = res.list.map(item =>
ExammoduleApi.updateExammodule({
id: item.id,
examModuleName: newName,
examModuleID: selectedPackage.value.examModuleID
})
)
await Promise.all(updatePromises)
ElMessage.success('更新成功')
//
await getPackageList()
const updatedPackage = packageList.value.find(p => p.examModuleID === selectedPackage.value.examModuleID)
if (updatedPackage) {
selectedPackage.value = updatedPackage
await handleSelectPackage(updatedPackage)
}
}
} catch (error) {
if (error !== 'cancel') {
console.error('更新失败:', error)
ElMessage.error('更新失败')
}
}
}
//
const handleCommand = (command, item) => {
switch (command) {
case 'edit':
handleEdit(item)
break
case 'delete':
handleDelete(item)
break
}
} }
</script> </script>
@ -237,8 +632,9 @@ const openDrawer = () => {
border-radius: 4px; border-radius: 4px;
padding: 10px; padding: 10px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
height: 90%; height: 90vh; /* 设置固定高度 */
overflow-y: auto; display: flex;
flex-direction: column;
} }
.panel-title { .panel-title {
@ -317,9 +713,25 @@ const openDrawer = () => {
/* 添加套餐列表样式 */ /* 添加套餐列表样式 */
.package-list { .package-list {
flex: 1;
overflow-y: auto; /* 启用垂直滚动 */
margin-top: 10px; margin-top: 10px;
} }
/* 自定义滚动条样式 */
.package-list::-webkit-scrollbar {
width: 6px;
}
.package-list::-webkit-scrollbar-thumb {
background-color: #dcdfe6;
border-radius: 3px;
}
.package-list::-webkit-scrollbar-track {
background-color: #f5f7fa;
}
.package-item { .package-item {
padding: 10px; padding: 10px;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
@ -346,6 +758,10 @@ const openDrawer = () => {
color: #333; color: #333;
} }
.package-name .el-input {
margin: -5px 0;
}
.drawer-content { .drawer-content {
padding: 20px; padding: 20px;
} }
@ -391,4 +807,29 @@ const openDrawer = () => {
color: #606266; color: #606266;
line-height: 1.6; line-height: 1.6;
} }
.package-content {
display: flex;
justify-content: space-between;
align-items: center;
}
.package-actions {
margin-left: 10px;
}
.el-dropdown-link {
cursor: pointer;
color: #409EFF;
display: flex;
align-items: center;
}
.el-dropdown-link:hover {
opacity: 0.8;
}
.delete-item {
color: #F56C6C !important;
}
</style> </style>

View File

@ -55,7 +55,6 @@ const formData = reactive({
packageName: '', packageName: '',
examModuleName: '', examModuleName: '',
examModuleID: 0, examModuleID: 0,
itemCode: ''
}) })
const handlePackageCodeInput = (value) => { const handlePackageCodeInput = (value) => {
@ -75,22 +74,6 @@ const rules = {
} }
}, },
trigger: 'blur' trigger: 'blur'
},
{
validator: async (rule, value, callback) => {
if (!value) return callback()
const result = await ExammoduleApi.createExammodule({
examModuleName: formData.packageName,
examModuleID: Number(value),
itemCode: value,
})
if (result === 999) {
callback(new Error('套餐编号已存在'))
} else {
callback()
}
},
trigger: 'blur'
} }
], ],
packageName: [{ required: true, message: '请输入套餐名称', trigger: 'blur' }] packageName: [{ required: true, message: '请输入套餐名称', trigger: 'blur' }]
@ -116,6 +99,18 @@ const handleSubmit = async () => {
if (!newPackageRef.value) return if (!newPackageRef.value) return
try { try {
await newPackageRef.value.validate() await newPackageRef.value.validate()
//
const result = await ExammoduleApi.createExammodule({
examModuleName: formData.packageName,
examModuleID: Number(formData.packageCode),
})
if (result === 999) {
ElMessage.error('套餐编号已存在')
return
}
ElMessage.success('新增套餐成功') ElMessage.success('新增套餐成功')
visible.value = false visible.value = false
emit('refresh-list') emit('refresh-list')