+
+
+
+ 单一值
+ 范围值
+
+
+
+
+
+
+
+
+
+ ~
+
+
+
+
{
const formData = ref({
name: '',
projectType: '',
+ completionCountType: 0, // 0=单一值, 1=范围值
completionCount: '',
+ completionCountMin: '',
+ completionCountMax: '',
fee: '',
durationMinutes: '',
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 minutes = Number(formData.value.durationMinutes ?? 0);
const seconds = Number(formData.value.durationSeconds ?? 0);
@@ -292,10 +347,41 @@ const validateGroups = (rule, value, 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({
name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
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' }],
duration: [
{ required: true, validator: validateDuration, trigger: ['blur', 'change'] }
@@ -358,7 +444,10 @@ const onOpenMenu = async (row) => {
formData.value = {
name: '',
projectType: '',
+ completionCountType: 0, // 默认为单一值模式
completionCount: '',
+ completionCountMin: '',
+ completionCountMax: '',
fee: '',
durationMinutes: '',
durationSeconds: '',
@@ -374,6 +463,10 @@ const onOpenMenu = async (row) => {
if (row) {
const { succeeded, data } = await projectDetailGet({ id: row.id });
formData.value = data;
+ // 确保 completionCountType 字段存在(向后兼容:旧数据默认为单一值模式)
+ if (formData.value.completionCountType === null || formData.value.completionCountType === undefined) {
+ formData.value.completionCountType = 0;
+ }
// 确保 groups 数组存在且有效
if (!formData.value.groups || !Array.isArray(formData.value.groups)) {
formData.value.groups = [
@@ -414,6 +507,11 @@ const onOpenMenu = async (row) => {
const onViewDetail = async (row) => {
const { succeeded, data } = await projectDetailGet({ id: row.id });
if (succeeded) {
+ // 确保 completionCountType 字段存在(向后兼容:旧数据默认为单一值模式)
+ if (data.completionCountType === null || data.completionCountType === undefined) {
+ data.completionCountType = 0;
+ }
+
// 确保 groups 数组存在且有效,并格式化日期
let groupsData = [];
if (data.groups && Array.isArray(data.groups)) {
@@ -489,7 +587,15 @@ const onSubmit = () => {
try {
let res;
- formData.value.completionCount = Number(formData.value.completionCount);
+ // 根据模式处理完成人数字段
+ if (formData.value.completionCountType === 0) {
+ // 单一值模式
+ 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) {
res = await projectEditPut(formData.value);
} else {
diff --git a/src/views/user/registration/index.vue b/src/views/user/registration/index.vue
index 2ec51bd..745c198 100644
--- a/src/views/user/registration/index.vue
+++ b/src/views/user/registration/index.vue
@@ -421,7 +421,15 @@
人
-->
类型:{{ project.parentProjectTypeName ??
project.projectTypeName ?? '' }}
- 完成人数:{{ project.completionCount ?? 0 }}
+ 完成人数:
+ {{ project.completionCountDisplay }}
+
+ {{ project.completionCountMin ?? 0 }}-{{ project.completionCountMax ?? 0 }}人
+
+
+ {{ project.completionCount ?? 0 }}人
+
+