调整项目管理模块中基础项目中的一些名称,接口文件添加了一部分接口
This commit is contained in:
parent
c0b99c2ba2
commit
6dd15833f2
@ -20,11 +20,21 @@ export const ExammoduleApi = {
|
||||
return await request.get({ url: `/inspect/exammodule/get?id=` + id })
|
||||
},
|
||||
|
||||
//所有体检套餐
|
||||
getListExammodule: async () => {
|
||||
return await request.get({ url: `/inspect/exammodule/getList` })
|
||||
},
|
||||
|
||||
// 新增体检套餐
|
||||
createExammodule: async (data: ExammoduleVO) => {
|
||||
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) => {
|
||||
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 })
|
||||
},
|
||||
|
||||
// 按照套餐项目ID和套餐ID删除体检套餐项目
|
||||
deleteExammoduleitemcode: async (params: { itemCode: string, examModuleID: number }) => {
|
||||
return await request.delete({
|
||||
url: `/inspect/exammodule/deleteitemcode?itemCode=${params.itemCode}&examModuleID=${params.examModuleID}`
|
||||
})
|
||||
},
|
||||
|
||||
// 导出体检套餐 Excel
|
||||
exportExammodule: async (params) => {
|
||||
return await request.download({ url: `/inspect/exammodule/export-excel`, params })
|
||||
|
@ -20,10 +20,10 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目名称">
|
||||
<el-input v-model="queryParams.projectName" placeholder="请输入名称" />
|
||||
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" />
|
||||
</el-form-item>
|
||||
<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-button type="primary" @click="handleSearch">搜索</el-button>
|
||||
@ -57,9 +57,13 @@
|
||||
<el-table-column type="selection" width="55" :resizable="false" />
|
||||
<el-table-column prop="itemCode" label="项目代号" :resizable="false" />
|
||||
<el-table-column prop="itemName" label="检查项目名称" :resizable="false" />
|
||||
<el-table-column prop="price" label="项目单价" :resizable="false" />
|
||||
<el-table-column prop="discountedPrice" label="折扣价" :resizable="false" />
|
||||
<el-table-column prop="discounted" label="折扣百分比" :resizable="false" />
|
||||
<el-table-column prop="price" label="项目单价(元)" :resizable="false" />
|
||||
<el-table-column 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="unit" label="项目单位" :resizable="false" />
|
||||
<el-table-column prop="highValue" label="取值上限" :resizable="false" />
|
||||
@ -75,7 +79,7 @@
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<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>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
@ -104,7 +108,7 @@
|
||||
</template>
|
||||
|
||||
<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 { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index'
|
||||
import { itemsApi, itemsVO } from '@/api/inspect/inspectitems/index'
|
||||
@ -315,6 +319,12 @@ watch(editDialogVisible, (newVal) => {
|
||||
getTableData()
|
||||
}
|
||||
})
|
||||
|
||||
// 添加计算折扣价的方法
|
||||
const calculateDiscountedPrice = (price: number, discount: number): number => {
|
||||
if (!price || !discount) return 0;
|
||||
return Number((price - price * (discount / 100)).toFixed(2));
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
@ -68,7 +68,7 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="折扣百分比" prop="discounted">
|
||||
<el-form-item label="折扣" prop="discounted">
|
||||
<el-input v-model="formData.discounted" placeholder="请输入折扣">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
@ -118,12 +118,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { ref } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { DepartmentApi, DepartmentVO } from '@/api/inspect/inspectdepartment/index'
|
||||
import { itemsApi, itemsVO } from '@/api/inspect/inspectitems/index'
|
||||
import { getStrDictOptions } from '@/utils/dict'
|
||||
|
||||
const visible = ref(false)
|
||||
const formRef = ref<FormInstance>()
|
||||
const departmentOptions = ref<{ value: string; label: string }[]>([])
|
||||
@ -156,7 +157,7 @@ const getDepartmentList = async () => {
|
||||
try {
|
||||
const data = await DepartmentApi.getListDepartment()
|
||||
departmentOptions.value = data.map((item: DepartmentVO) => ({
|
||||
value: item.departmentName,
|
||||
value: item.id,
|
||||
label: item.departmentName
|
||||
}))
|
||||
} catch (error) {
|
||||
@ -165,7 +166,10 @@ const getDepartmentList = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
// 提交表单
|
||||
// 定义emit事件
|
||||
const emit = defineEmits(['success'])
|
||||
|
||||
// 修改提交表单方法
|
||||
const handleSubmit = async () => {
|
||||
if (!formRef.value) return
|
||||
|
||||
@ -179,11 +183,13 @@ const handleSubmit = async () => {
|
||||
}
|
||||
if (formData.value.section) {
|
||||
const section = formData.value.section
|
||||
formData.value.section = section.split('|')[0]
|
||||
formData.value.sectionID = section.split('|')[1]
|
||||
formData.value.sectionID = section.split('|')[0]
|
||||
formData.value.section = section.split('|')[1]
|
||||
}
|
||||
await itemsApi.createitems(formData.value as itemsVO)
|
||||
ElMessage.success('添加成功')
|
||||
// 触发success事件
|
||||
emit('success')
|
||||
handleClose()
|
||||
} catch (error) {
|
||||
console.error('添加失败:', error)
|
||||
|
@ -23,13 +23,12 @@
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
<el-button type="primary" @click="handleSearch">搜索</el-button>
|
||||
<el-button type="primary" @click="save">保存</el-button>
|
||||
<el-button type="danger" @click="handleDelete">删除选中</el-button>
|
||||
<el-button type="danger" @click="handleClear">清空列表</el-button>
|
||||
<el-button type="primary" @click="handleSearch" style="margin-top: 10px ;margin-bottom : 10px;">搜索</el-button>
|
||||
<el-button type="primary" @click="save" style="margin-top: 10px ;margin-bottom : 10px;">添加</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="tableData"
|
||||
border
|
||||
style="width: 100%"
|
||||
@ -59,9 +58,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ExammoduleApi } from '@/api/inspect/exammodule'
|
||||
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'
|
||||
//搜索查询
|
||||
async function handleSearch() {
|
||||
@ -80,17 +78,13 @@ async function handleSearch() {
|
||||
queryParams.sectionID = searchForm.department // 使用section作为科室查询参数
|
||||
}
|
||||
|
||||
console.log('查询参数:', queryParams) // 添加日志查看实际发送的参数
|
||||
|
||||
try {
|
||||
const res = await itemsApi.getitemsPage(queryParams)
|
||||
console.log('查询结果:', res)
|
||||
if (res) {
|
||||
tableData.value = res.list || []
|
||||
total.value = res.total || 0
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('查询失败:', error)
|
||||
ElMessage.error('查询失败')
|
||||
tableData.value = []
|
||||
total.value = 0
|
||||
@ -110,7 +104,6 @@ const getDepartmentList = async () => {
|
||||
label: item.departmentName
|
||||
}))
|
||||
} catch (error) {
|
||||
console.error('获取科室列表失败:', error)
|
||||
ElMessage.error('获取科室列表失败')
|
||||
}
|
||||
}
|
||||
@ -118,10 +111,21 @@ const getDepartmentList = async () => {
|
||||
const currentPage = ref(1)
|
||||
const pageSize = ref(10)
|
||||
const total = ref(0)
|
||||
const emit = defineEmits(['update:modelValue', 'save-items'])
|
||||
|
||||
const tableRef = ref(null)
|
||||
|
||||
//保存数据
|
||||
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) => {
|
||||
pageSize.value = val
|
||||
handleSearch()
|
||||
@ -133,53 +137,13 @@ const handleCurrentChange = (val: number) => {
|
||||
}
|
||||
|
||||
// 添加选中行数据的响应式变量
|
||||
const selectedRows = ref([])
|
||||
const selectedRows = ref<any[]>([])
|
||||
|
||||
// 表格多选
|
||||
const handleSelectionChange = (selection: any[]) => {
|
||||
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(() => {
|
||||
getDepartmentList()
|
||||
})
|
||||
|
@ -20,7 +20,36 @@
|
||||
:class="{ active: selectedPackage?.id === item.id }"
|
||||
@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>
|
||||
@ -31,41 +60,28 @@
|
||||
<el-button type="primary" @click="handleAdd">
|
||||
<el-icon><Plus /></el-icon>新增套餐
|
||||
</el-button>
|
||||
<el-button type="primary" @click="handleDelete">
|
||||
<el-icon><Delete /></el-icon>删除
|
||||
</el-button>
|
||||
<el-button type="primary" @click="openDrawer">
|
||||
<el-icon><Plus /></el-icon>添加项目
|
||||
</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-button>
|
||||
</div>
|
||||
|
||||
<div class="search-form">
|
||||
<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 :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange">
|
||||
<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="discount" label="折扣(%)" />
|
||||
<el-table-column prop="discountPrice" label="折扣价(元)" />
|
||||
<el-table-column prop="address" 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-column prop="moduleName" label="项目单元" />
|
||||
</el-table>
|
||||
|
||||
<div class="pagination-container">
|
||||
@ -90,7 +106,7 @@
|
||||
size="30%"
|
||||
:destroy-on-close="true"
|
||||
>
|
||||
<Drawer/>
|
||||
<Drawer @save-items="handleSaveItems"/>
|
||||
</el-drawer>
|
||||
</div>
|
||||
</div>
|
||||
@ -100,11 +116,13 @@
|
||||
|
||||
<script setup>
|
||||
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 { ExammoduleApi } from '@/api/inspect/exammodule'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import Drawer from './drawer.vue'
|
||||
import { itemsApi } from '@/api/inspect/inspectitems'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
// 添加搜索关键字
|
||||
const searchKeyword = ref('')
|
||||
// 修改搜索表单,添加type字段
|
||||
@ -140,30 +158,86 @@ const filteredPackageList = computed(() => {
|
||||
)
|
||||
})
|
||||
|
||||
// 获取套餐列表
|
||||
// 修改获取套餐列表的方法
|
||||
const getPackageList = async () => {
|
||||
try {
|
||||
const res = await ExammoduleApi.getExammodulePage({
|
||||
pageNo: 1,
|
||||
pageSize: 100
|
||||
})
|
||||
// 修改数据获取方式,直接获取 res.list
|
||||
if (res?.list) {
|
||||
packageList.value = res.list
|
||||
} else {
|
||||
const res = await ExammoduleApi.getListExammodule()
|
||||
|
||||
if (res) {
|
||||
// 对列表进行处理,将相同 examModuleID 的记录合并
|
||||
const groupedPackages = {}
|
||||
res.forEach(item => {
|
||||
if (item.examModuleID && item.examModuleID.toString().trim() !== '') {
|
||||
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 = []
|
||||
console.warn('获取套餐列表数据结构异常:', res)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取套餐列表失败:', error)
|
||||
packageList.value = []
|
||||
}
|
||||
}
|
||||
|
||||
// 选择套餐
|
||||
const handleSelectPackage = (item) => {
|
||||
// 修改选择套餐的方法
|
||||
const handleSelectPackage = async (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() // 重新获取套餐列表
|
||||
}
|
||||
|
||||
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 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()
|
||||
}
|
||||
|
||||
const drawer = ref(false)
|
||||
// 修改 handleSubmit 方法
|
||||
const handleSubmit = async () => {
|
||||
if (!selectedPackage.value) {
|
||||
ElMessage.warning('请先选择套餐')
|
||||
return
|
||||
}
|
||||
|
||||
const openDrawer = () => {
|
||||
drawer.value = true
|
||||
if (tableData.value.length === 0) {
|
||||
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>
|
||||
|
||||
@ -237,8 +632,9 @@ const openDrawer = () => {
|
||||
border-radius: 4px;
|
||||
padding: 10px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
height: 90%;
|
||||
overflow-y: auto;
|
||||
height: 90vh; /* 设置固定高度 */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.panel-title {
|
||||
@ -317,9 +713,25 @@ const openDrawer = () => {
|
||||
|
||||
/* 添加套餐列表样式 */
|
||||
.package-list {
|
||||
flex: 1;
|
||||
overflow-y: auto; /* 启用垂直滚动 */
|
||||
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 {
|
||||
padding: 10px;
|
||||
border-bottom: 1px solid #eee;
|
||||
@ -346,6 +758,10 @@ const openDrawer = () => {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.package-name .el-input {
|
||||
margin: -5px 0;
|
||||
}
|
||||
|
||||
.drawer-content {
|
||||
padding: 20px;
|
||||
}
|
||||
@ -391,4 +807,29 @@ const openDrawer = () => {
|
||||
color: #606266;
|
||||
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>
|
||||
|
@ -55,7 +55,6 @@ const formData = reactive({
|
||||
packageName: '',
|
||||
examModuleName: '',
|
||||
examModuleID: 0,
|
||||
itemCode: ''
|
||||
})
|
||||
|
||||
const handlePackageCodeInput = (value) => {
|
||||
@ -75,22 +74,6 @@ const rules = {
|
||||
}
|
||||
},
|
||||
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' }]
|
||||
@ -116,6 +99,18 @@ const handleSubmit = async () => {
|
||||
if (!newPackageRef.value) return
|
||||
try {
|
||||
await newPackageRef.value.validate()
|
||||
|
||||
// 在表单验证通过后检查套餐编号是否存在
|
||||
const result = await ExammoduleApi.createExammodule({
|
||||
examModuleName: formData.packageName,
|
||||
examModuleID: Number(formData.packageCode),
|
||||
})
|
||||
|
||||
if (result === 999) {
|
||||
ElMessage.error('套餐编号已存在')
|
||||
return
|
||||
}
|
||||
|
||||
ElMessage.success('新增套餐成功')
|
||||
visible.value = false
|
||||
emit('refresh-list')
|
||||
|
Loading…
Reference in New Issue
Block a user