项目完成人数改为范围值和单值均可
This commit is contained in:
parent
2fec32267d
commit
72c47d1c41
@ -155,7 +155,13 @@
|
|||||||
{{ scope.row.projectTypeName }}
|
{{ scope.row.projectTypeName }}
|
||||||
</template>
|
</template>
|
||||||
<template #completionCount="scope">
|
<template #completionCount="scope">
|
||||||
{{ scope.row.completionCount }}
|
<template v-if="scope.row.completionCountDisplay">{{ scope.row.completionCountDisplay }}</template>
|
||||||
|
<template v-else-if="scope.row.completionCountType === 1">
|
||||||
|
{{ scope.row.completionCountMin ?? 0 }}-{{ scope.row.completionCountMax ?? 0 }}人
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ scope.row.completionCount ?? 0 }}人
|
||||||
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</ProTable>
|
</ProTable>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
|
|||||||
@ -18,7 +18,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #completionCount="scope">
|
<template #completionCount="scope">
|
||||||
{{ scope.row.completionCount }}
|
<span v-if="scope.row.completionCountDisplay">{{ scope.row.completionCountDisplay }}</span>
|
||||||
|
<span v-else-if="scope.row.completionCountType === 1">
|
||||||
|
{{ scope.row.completionCountMin }}-{{ scope.row.completionCountMax }}人
|
||||||
|
</span>
|
||||||
|
<span v-else>
|
||||||
|
{{ scope.row.completionCount ?? 0 }}
|
||||||
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #action="scope">
|
<template #action="scope">
|
||||||
@ -54,11 +60,28 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<!-- 完成人数 -->
|
<!-- 完成人数模式切换 -->
|
||||||
<el-form-item label="完成人数:" prop="completionCount">
|
<el-form-item label="完成人数模式:" prop="completionCountType">
|
||||||
|
<el-radio-group v-model="formData.completionCountType" @change="onCompletionCountTypeChange">
|
||||||
|
<el-radio :value="0">单一值</el-radio>
|
||||||
|
<el-radio :value="1">范围值</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 单一值模式:完成人数 -->
|
||||||
|
<el-form-item v-if="formData.completionCountType === 0" label="完成人数:" prop="completionCount">
|
||||||
<el-input-number v-model="formData.completionCount" placeholder="请输入完成人数" :min="0" :step="1" style="width: 100%"></el-input-number>
|
<el-input-number v-model="formData.completionCount" placeholder="请输入完成人数" :min="0" :step="1" style="width: 100%"></el-input-number>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 范围值模式:最小和最大完成人数 -->
|
||||||
|
<el-form-item v-if="formData.completionCountType === 1" label="完成人数范围:" prop="completionCountRange">
|
||||||
|
<div style="display: flex; align-items: center; gap: 12px; width: 100%">
|
||||||
|
<el-input-number v-model="formData.completionCountMin" placeholder="最小值" :min="0" :step="1" style="width: 200px"></el-input-number>
|
||||||
|
<span style="color: #606266">~</span>
|
||||||
|
<el-input-number v-model="formData.completionCountMax" placeholder="最大值" :min="0" :step="1" style="width: 200px"></el-input-number>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<!-- 组别 -->
|
<!-- 组别 -->
|
||||||
<div>
|
<div>
|
||||||
<el-form-item style="display: none;" prop="groups">
|
<el-form-item style="display: none;" prop="groups">
|
||||||
@ -146,11 +169,28 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<!-- 完成人数 -->
|
<!-- 完成人数模式 -->
|
||||||
<el-form-item label="完成人数:">
|
<el-form-item label="完成人数模式:">
|
||||||
|
<el-radio-group v-model="detailData.completionCountType" disabled>
|
||||||
|
<el-radio :value="0">单一值</el-radio>
|
||||||
|
<el-radio :value="1">范围值</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 单一值模式:完成人数 -->
|
||||||
|
<el-form-item v-if="detailData.completionCountType === 0" label="完成人数:">
|
||||||
<el-input-number v-model="detailData.completionCount" disabled :min="0" :step="1" style="width: 100%"></el-input-number>
|
<el-input-number v-model="detailData.completionCount" disabled :min="0" :step="1" style="width: 100%"></el-input-number>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 范围值模式:最小和最大完成人数 -->
|
||||||
|
<el-form-item v-if="detailData.completionCountType === 1" label="完成人数范围:">
|
||||||
|
<div style="display: flex; align-items: center; gap: 12px; width: 100%">
|
||||||
|
<el-input-number v-model="detailData.completionCountMin" disabled :min="0" :step="1" style="width: 200px"></el-input-number>
|
||||||
|
<span style="color: #606266">~</span>
|
||||||
|
<el-input-number v-model="detailData.completionCountMax" disabled :min="0" :step="1" style="width: 200px"></el-input-number>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<!-- 组别 -->
|
<!-- 组别 -->
|
||||||
<div class="detail-groups-section">
|
<div class="detail-groups-section">
|
||||||
<el-form-item :label="'组别' + (index + 1) + ':'"
|
<el-form-item :label="'组别' + (index + 1) + ':'"
|
||||||
@ -243,7 +283,10 @@ const removeGroup = (index) => {
|
|||||||
const formData = ref({
|
const formData = ref({
|
||||||
name: '',
|
name: '',
|
||||||
projectType: '',
|
projectType: '',
|
||||||
|
completionCountType: 0, // 0=单一值, 1=范围值
|
||||||
completionCount: '',
|
completionCount: '',
|
||||||
|
completionCountMin: '',
|
||||||
|
completionCountMax: '',
|
||||||
fee: '',
|
fee: '',
|
||||||
durationMinutes: '',
|
durationMinutes: '',
|
||||||
durationSeconds: '',
|
durationSeconds: '',
|
||||||
@ -257,6 +300,18 @@ const formData = ref({
|
|||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 模式切换处理
|
||||||
|
const onCompletionCountTypeChange = () => {
|
||||||
|
if (formData.value.completionCountType === 0) {
|
||||||
|
// 切换到单一值模式,清空范围值字段
|
||||||
|
formData.value.completionCountMin = '';
|
||||||
|
formData.value.completionCountMax = '';
|
||||||
|
} else {
|
||||||
|
// 切换到范围值模式,清空单一值字段
|
||||||
|
formData.value.completionCount = '';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const validateDuration = (rule, value, callback) => {
|
const validateDuration = (rule, value, callback) => {
|
||||||
const minutes = Number(formData.value.durationMinutes ?? 0);
|
const minutes = Number(formData.value.durationMinutes ?? 0);
|
||||||
const seconds = Number(formData.value.durationSeconds ?? 0);
|
const seconds = Number(formData.value.durationSeconds ?? 0);
|
||||||
@ -292,10 +347,41 @@ const validateGroups = (rule, value, callback) => {
|
|||||||
callback();
|
callback();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 验证完成人数
|
||||||
|
const validateCompletionCount = (rule, value, callback) => {
|
||||||
|
if (formData.value.completionCountType === 0) {
|
||||||
|
// 单一值模式
|
||||||
|
if (formData.value.completionCount === '' || formData.value.completionCount === null || formData.value.completionCount === undefined) {
|
||||||
|
callback(new Error('请输入完成人数'));
|
||||||
|
} else if (Number(formData.value.completionCount) < 0) {
|
||||||
|
callback(new Error('完成人数不能小于0'));
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 范围值模式
|
||||||
|
const min = formData.value.completionCountMin;
|
||||||
|
const max = formData.value.completionCountMax;
|
||||||
|
if (min === '' || min === null || min === undefined) {
|
||||||
|
callback(new Error('请输入最小值'));
|
||||||
|
} else if (max === '' || max === null || max === undefined) {
|
||||||
|
callback(new Error('请输入最大值'));
|
||||||
|
} else if (Number(min) < 0 || Number(max) < 0) {
|
||||||
|
callback(new Error('完成人数不能小于0'));
|
||||||
|
} else if (Number(min) > Number(max)) {
|
||||||
|
callback(new Error('最小值不能大于最大值'));
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const formRules = ref({
|
const formRules = ref({
|
||||||
name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
|
name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
|
||||||
projectType: [{ required: true, message: '请选择项目类型', trigger: 'change' }],
|
projectType: [{ required: true, message: '请选择项目类型', trigger: 'change' }],
|
||||||
completionCount: [{ required: true, message: '请输入完成人数', trigger: 'blur' }],
|
completionCountType: [{ required: true, message: '请选择完成人数模式', trigger: 'change' }],
|
||||||
|
completionCount: [{ required: true, validator: validateCompletionCount, trigger: ['blur', 'change'] }],
|
||||||
|
completionCountRange: [{ required: true, validator: validateCompletionCount, trigger: ['blur', 'change'] }],
|
||||||
fee: [{ required: true, message: '请输入费用', trigger: 'blur' }],
|
fee: [{ required: true, message: '请输入费用', trigger: 'blur' }],
|
||||||
duration: [
|
duration: [
|
||||||
{ required: true, validator: validateDuration, trigger: ['blur', 'change'] }
|
{ required: true, validator: validateDuration, trigger: ['blur', 'change'] }
|
||||||
@ -358,7 +444,10 @@ const onOpenMenu = async (row) => {
|
|||||||
formData.value = {
|
formData.value = {
|
||||||
name: '',
|
name: '',
|
||||||
projectType: '',
|
projectType: '',
|
||||||
|
completionCountType: 0, // 默认为单一值模式
|
||||||
completionCount: '',
|
completionCount: '',
|
||||||
|
completionCountMin: '',
|
||||||
|
completionCountMax: '',
|
||||||
fee: '',
|
fee: '',
|
||||||
durationMinutes: '',
|
durationMinutes: '',
|
||||||
durationSeconds: '',
|
durationSeconds: '',
|
||||||
@ -374,6 +463,10 @@ const onOpenMenu = async (row) => {
|
|||||||
if (row) {
|
if (row) {
|
||||||
const { succeeded, data } = await projectDetailGet({ id: row.id });
|
const { succeeded, data } = await projectDetailGet({ id: row.id });
|
||||||
formData.value = data;
|
formData.value = data;
|
||||||
|
// 确保 completionCountType 字段存在(向后兼容:旧数据默认为单一值模式)
|
||||||
|
if (formData.value.completionCountType === null || formData.value.completionCountType === undefined) {
|
||||||
|
formData.value.completionCountType = 0;
|
||||||
|
}
|
||||||
// 确保 groups 数组存在且有效
|
// 确保 groups 数组存在且有效
|
||||||
if (!formData.value.groups || !Array.isArray(formData.value.groups)) {
|
if (!formData.value.groups || !Array.isArray(formData.value.groups)) {
|
||||||
formData.value.groups = [
|
formData.value.groups = [
|
||||||
@ -414,6 +507,11 @@ const onOpenMenu = async (row) => {
|
|||||||
const onViewDetail = async (row) => {
|
const onViewDetail = async (row) => {
|
||||||
const { succeeded, data } = await projectDetailGet({ id: row.id });
|
const { succeeded, data } = await projectDetailGet({ id: row.id });
|
||||||
if (succeeded) {
|
if (succeeded) {
|
||||||
|
// 确保 completionCountType 字段存在(向后兼容:旧数据默认为单一值模式)
|
||||||
|
if (data.completionCountType === null || data.completionCountType === undefined) {
|
||||||
|
data.completionCountType = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// 确保 groups 数组存在且有效,并格式化日期
|
// 确保 groups 数组存在且有效,并格式化日期
|
||||||
let groupsData = [];
|
let groupsData = [];
|
||||||
if (data.groups && Array.isArray(data.groups)) {
|
if (data.groups && Array.isArray(data.groups)) {
|
||||||
@ -489,7 +587,15 @@ const onSubmit = () => {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
let res;
|
let res;
|
||||||
|
// 根据模式处理完成人数字段
|
||||||
|
if (formData.value.completionCountType === 0) {
|
||||||
|
// 单一值模式
|
||||||
formData.value.completionCount = Number(formData.value.completionCount);
|
formData.value.completionCount = Number(formData.value.completionCount);
|
||||||
|
} else {
|
||||||
|
// 范围值模式
|
||||||
|
formData.value.completionCountMin = Number(formData.value.completionCountMin);
|
||||||
|
formData.value.completionCountMax = Number(formData.value.completionCountMax);
|
||||||
|
}
|
||||||
if (formData.value.id) {
|
if (formData.value.id) {
|
||||||
res = await projectEditPut(formData.value);
|
res = await projectEditPut(formData.value);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -421,7 +421,15 @@
|
|||||||
人</div> -->
|
人</div> -->
|
||||||
<div class="project-card-type">类型:{{ project.parentProjectTypeName ??
|
<div class="project-card-type">类型:{{ project.parentProjectTypeName ??
|
||||||
project.projectTypeName ?? '' }}</div>
|
project.projectTypeName ?? '' }}</div>
|
||||||
<div class="project-card-count">完成人数:{{ project.completionCount ?? 0 }}</div>
|
<div class="project-card-count">完成人数:
|
||||||
|
<template v-if="project.completionCountDisplay">{{ project.completionCountDisplay }}</template>
|
||||||
|
<template v-else-if="project.completionCountType === 1">
|
||||||
|
{{ project.completionCountMin ?? 0 }}-{{ project.completionCountMax ?? 0 }}人
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ project.completionCount ?? 0 }}人
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="project-card-right">
|
<div class="project-card-right">
|
||||||
<div v-for="g in (project.groups ?? [])" :key="g.id" class="group-tag"
|
<div v-for="g in (project.groups ?? [])" :key="g.id" class="group-tag"
|
||||||
@ -473,7 +481,7 @@
|
|||||||
<span>
|
<span>
|
||||||
({{ group.parentProjectTypeName ?? group.projectTypeName ??
|
({{ group.parentProjectTypeName ?? group.projectTypeName ??
|
||||||
(group.projectTeamSize > 1 ?
|
(group.projectTeamSize > 1 ?
|
||||||
'团队' : '个人') }}/{{ group.projectCompletionCount ?? 0 }})
|
'团队' : '个人') }}/{{ group.projectCompletionCountDisplay }})
|
||||||
{{ group.projectName }}-{{ group.groupName ?? group.name }}/{{
|
{{ group.projectName }}-{{ group.groupName ?? group.name }}/{{
|
||||||
formatGroupDate(group) }}/{{
|
formatGroupDate(group) }}/{{
|
||||||
formatGender(group.gender) }}
|
formatGender(group.gender) }}
|
||||||
@ -1006,13 +1014,29 @@ const formatRefundRulesBrief = (refundRules) => {
|
|||||||
const detailProjectsForDisplay = computed(() => {
|
const detailProjectsForDisplay = computed(() => {
|
||||||
const list = [];
|
const list = [];
|
||||||
(detailData.value?.projects ?? []).forEach((p) => {
|
(detailData.value?.projects ?? []).forEach((p) => {
|
||||||
|
// 统一生成完成人数显示文本
|
||||||
|
let completionCountDisplay = '';
|
||||||
|
if (p.completionCountDisplay) {
|
||||||
|
completionCountDisplay = p.completionCountDisplay;
|
||||||
|
} else if (p.completionCountType === 1) {
|
||||||
|
const min = p.completionCountMin ?? 0;
|
||||||
|
const max = p.completionCountMax ?? 0;
|
||||||
|
completionCountDisplay = `${min}-${max}人`;
|
||||||
|
} else {
|
||||||
|
completionCountDisplay = `${p.completionCount ?? 0}人`;
|
||||||
|
}
|
||||||
|
|
||||||
(p.groups ?? []).forEach((g) => {
|
(p.groups ?? []).forEach((g) => {
|
||||||
list.push({
|
list.push({
|
||||||
projectName: p.name,
|
projectName: p.name,
|
||||||
groupName: g.groupName,
|
groupName: g.groupName,
|
||||||
fee: p.fee,
|
fee: p.fee,
|
||||||
limitCount: p.limitCount,
|
limitCount: p.limitCount,
|
||||||
completionCount: p.completionCount
|
completionCount: p.completionCount,
|
||||||
|
completionCountType: p.completionCountType ?? 0,
|
||||||
|
completionCountMin: p.completionCountMin,
|
||||||
|
completionCountMax: p.completionCountMax,
|
||||||
|
completionCountDisplay: completionCountDisplay
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// 如果没有组别,只显示项目
|
// 如果没有组别,只显示项目
|
||||||
@ -1022,7 +1046,11 @@ const detailProjectsForDisplay = computed(() => {
|
|||||||
groupName: '-',
|
groupName: '-',
|
||||||
fee: p.fee,
|
fee: p.fee,
|
||||||
limitCount: p.limitCount,
|
limitCount: p.limitCount,
|
||||||
completionCount: p.completionCount
|
completionCount: p.completionCount,
|
||||||
|
completionCountType: p.completionCountType ?? 0,
|
||||||
|
completionCountMin: p.completionCountMin,
|
||||||
|
completionCountMax: p.completionCountMax,
|
||||||
|
completionCountDisplay: completionCountDisplay
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1210,12 +1238,30 @@ const allGroups = computed(() => {
|
|||||||
const list = [];
|
const list = [];
|
||||||
(projects.value ?? []).forEach((p) => {
|
(projects.value ?? []).forEach((p) => {
|
||||||
(p.groups ?? []).forEach((g) => {
|
(p.groups ?? []).forEach((g) => {
|
||||||
|
// 生成完成人数显示文本(统一逻辑,确保前端/后端一致)
|
||||||
|
let completionCountDisplay = '';
|
||||||
|
if (p.completionCountDisplay) {
|
||||||
|
completionCountDisplay = p.completionCountDisplay;
|
||||||
|
} else if (p.completionCountType === 1) {
|
||||||
|
// 范围值模式
|
||||||
|
const min = p.completionCountMin ?? 0;
|
||||||
|
const max = p.completionCountMax ?? 0;
|
||||||
|
completionCountDisplay = `${min}-${max}人`;
|
||||||
|
} else {
|
||||||
|
// 单一值模式
|
||||||
|
completionCountDisplay = `${p.completionCount ?? 0}人`;
|
||||||
|
}
|
||||||
|
|
||||||
list.push({
|
list.push({
|
||||||
...g,
|
...g,
|
||||||
projectId: p.id,
|
projectId: p.id,
|
||||||
projectName: p.name,
|
projectName: p.name,
|
||||||
projectTeamSize: p.teamSize ?? 1,
|
projectTeamSize: p.teamSize ?? 1,
|
||||||
projectCompletionCount: p.completionCount ?? 0,
|
projectCompletionCount: p.completionCount ?? 0,
|
||||||
|
projectCompletionCountType: p.completionCountType ?? 0,
|
||||||
|
projectCompletionCountMin: p.completionCountMin ?? 0,
|
||||||
|
projectCompletionCountMax: p.completionCountMax ?? 0,
|
||||||
|
projectCompletionCountDisplay: completionCountDisplay,
|
||||||
parentProjectTypeName: p.parentProjectTypeName,
|
parentProjectTypeName: p.parentProjectTypeName,
|
||||||
projectTypeName: p.projectTypeName,
|
projectTypeName: p.projectTypeName,
|
||||||
projectType: p.projectType,
|
projectType: p.projectType,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user