|
|
<template>
|
|
|
<el-row style="margin-bottom: 10px">
|
|
|
<el-col v-if="feeModeHour" :span="24">
|
|
|
<label class="el-form-item__label" style="width: 100px;">扣费标准:
|
|
|
</label>
|
|
|
<el-table
|
|
|
:data="feeModeTableData"
|
|
|
border
|
|
|
class="fee-table"
|
|
|
>
|
|
|
<el-table-column
|
|
|
prop="courseType"
|
|
|
label="课程类别"
|
|
|
width="200"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
<div class="select-with-btn-container">
|
|
|
<el-select
|
|
|
v-model="scope.row.courseTypeId"
|
|
|
placeholder="请选择课程类别"
|
|
|
clearable
|
|
|
filterable
|
|
|
default-first-option
|
|
|
:loading="loadingSelect"
|
|
|
@change="handleCourseTypeChange(scope.row)"
|
|
|
>
|
|
|
<el-option
|
|
|
v-for="item in getAvailableCourseTypeOptions(scope.$index)"
|
|
|
:key="item.id"
|
|
|
:label="item.label"
|
|
|
:value="item.id"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
<el-table-column
|
|
|
prop="cnt"
|
|
|
label="扣卡次数"
|
|
|
width="160"
|
|
|
>
|
|
|
<template slot="header"><span class="header-need-input">扣卡次数</span></template>
|
|
|
<template slot-scope="scope">
|
|
|
<el-input-number v-model="scope.row.cnt" size="small" controls-position="right" :min="1" :precision="1" label="输入扣卡次数" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
<el-table-column
|
|
|
prop="totalFee"
|
|
|
label="或扣费金额(每节)"
|
|
|
width="160"
|
|
|
>
|
|
|
<template slot="header"><span class="header-need-input">或扣费金额(每节)</span></template>
|
|
|
<template slot-scope="scope">
|
|
|
<el-input-number v-model="scope.row.totalFee" size="small" controls-position="right" :min="0" :precision="2" label="请输入金额" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
<el-table-column
|
|
|
label="操作"
|
|
|
width="120"
|
|
|
align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
<!-- 关键修改1:仅最后一行显示添加按钮 -->
|
|
|
<el-button
|
|
|
v-if="scope.$index === feeModeTableData.length - 1"
|
|
|
style="padding: 3px 5px;"
|
|
|
type="primary"
|
|
|
icon="el-icon-plus"
|
|
|
size="mini"
|
|
|
@click="handleAddFeeMode(scope)"
|
|
|
/>
|
|
|
<el-button
|
|
|
v-if="canDel(scope)"
|
|
|
style="padding: 3px 5px;margin-left: 5px;"
|
|
|
type="danger"
|
|
|
icon="el-icon-minus"
|
|
|
size="mini"
|
|
|
@click="handleDeleteFeeMode(scope)"
|
|
|
/>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
export default {
|
|
|
props: {
|
|
|
// 全部课程类型
|
|
|
courseTypeOptions: {
|
|
|
type: Array,
|
|
|
default: () => []
|
|
|
},
|
|
|
// 已选择课程类型(初始化用)
|
|
|
hadChooseType: {
|
|
|
type: Array,
|
|
|
default: () => []
|
|
|
},
|
|
|
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
feeModeHour: true,
|
|
|
feeModeTableData: [],
|
|
|
// key-value形式存储 所有课程类型 (courseTypeId => courseType)
|
|
|
courseTypeOptionsMap: {},
|
|
|
loadingSelect: false
|
|
|
}
|
|
|
},
|
|
|
watch: {
|
|
|
// 监听课程类型选项变化,构建映射表并初始化表格
|
|
|
courseTypeOptions: {
|
|
|
immediate: true,
|
|
|
handler(newValue) {
|
|
|
// 构建courseTypeId到courseType的映射
|
|
|
this.courseTypeOptionsMap = newValue.reduce((map, item) => {
|
|
|
map[item.courseTypeId] = item.courseType;
|
|
|
return map;
|
|
|
}, {});
|
|
|
|
|
|
// 初始化表格数据
|
|
|
this.initFeeModeTableData();
|
|
|
}
|
|
|
},
|
|
|
// 监听已选择课程类型变更(仅初始化用)
|
|
|
hadChooseType: {
|
|
|
immediate: true,
|
|
|
handler(newVal) {
|
|
|
if (!this.feeModeHour) return;
|
|
|
this.initFeeModeTableData(newVal);
|
|
|
}
|
|
|
},
|
|
|
// 监听是否显示本收费模式
|
|
|
feeModeHour(newVal) {
|
|
|
if (newVal) {
|
|
|
this.initFeeModeTableData();
|
|
|
} else {
|
|
|
this.feeModeTableData = [];
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
// 初始化扣费标准表格数据
|
|
|
initFeeModeTableData(initIds = this.hadChooseType) {
|
|
|
// 避免重复初始化
|
|
|
if (this.feeModeTableData.length > 0) return;
|
|
|
|
|
|
let tableData = [];
|
|
|
|
|
|
if (initIds.length > 0) {
|
|
|
// 有初始化ID时,按ID初始化行
|
|
|
tableData = initIds.map(id => ({
|
|
|
courseTypeId: id,
|
|
|
courseType: this.courseTypeOptionsMap[id] || '',
|
|
|
cnt: 1,
|
|
|
totalFee: 0
|
|
|
}));
|
|
|
} else {
|
|
|
// 无初始化ID时,默认选中第一个可用课程类型
|
|
|
const firstOption = this.courseTypeOptions[0] || {};
|
|
|
tableData = [{
|
|
|
courseTypeId: firstOption.id || '',
|
|
|
courseType: firstOption.label|| '',
|
|
|
cnt: 1,
|
|
|
totalFee: 0
|
|
|
}];
|
|
|
}
|
|
|
|
|
|
this.feeModeTableData = tableData;
|
|
|
},
|
|
|
// 课程类型选择变更时更新courseType字段
|
|
|
handleCourseTypeChange(row) {
|
|
|
row.courseType = this.courseTypeOptionsMap[row.courseTypeId] || '';
|
|
|
},
|
|
|
// 获取当前行可用的课程类别选项(排除其他行已选中的)
|
|
|
getAvailableCourseTypeOptions(currentIndex) {
|
|
|
// 收集除当前行外,其他行已选中的courseTypeId
|
|
|
const selectedIds = this.feeModeTableData
|
|
|
.filter((_, index) => index !== currentIndex)
|
|
|
.map(item => item.courseTypeId)
|
|
|
.filter(id => id);
|
|
|
|
|
|
// 过滤出未被选中的课程类别
|
|
|
const availableOptions = this.courseTypeOptions.filter(item => !selectedIds.includes(item.id));
|
|
|
return availableOptions;
|
|
|
},
|
|
|
// 新增扣费标准行(关键修改2:默认选中第一个可用选项)
|
|
|
handleAddFeeMode() {
|
|
|
// 获取新增行可用的第一个课程类型
|
|
|
const availableOptions = this.getAvailableCourseTypeOptions(this.feeModeTableData.length);
|
|
|
const firstOption = availableOptions[0] || {};
|
|
|
|
|
|
this.feeModeTableData.push({
|
|
|
courseTypeId: firstOption.id || '',
|
|
|
courseType: firstOption.label || '',
|
|
|
cnt: 1,
|
|
|
totalFee: 0
|
|
|
});
|
|
|
},
|
|
|
// 删除扣费标准行
|
|
|
handleDeleteFeeMode(scope) {
|
|
|
this.feeModeTableData.splice(scope.$index, 1);
|
|
|
},
|
|
|
// 判断是否显示删除按钮(仅一行时不显示)
|
|
|
canDel() {
|
|
|
return this.feeModeTableData.length > 1;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
.fee-table {
|
|
|
margin-left: 10px;
|
|
|
width: calc(100% - 10px);
|
|
|
}
|
|
|
.select-with-btn-container {
|
|
|
width: 100%;
|
|
|
}
|
|
|
.header-need-input {
|
|
|
color: #606266;
|
|
|
}
|
|
|
|
|
|
</style>
|