From 0c3c35c0f8c1c88762f28576ffd94c289ffe8f4d Mon Sep 17 00:00:00 2001 From: john Date: Thu, 17 Sep 2026 17:16:49 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=91=E5=B8=83=E6=97=B6=E9=97=B4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5(=E9=BB=98=E8=AE=A4=E9=A1=B5=E9=9D=A2=E6=89=93?= =?UTF-8?q?=E5=BC=80=E6=97=B6=E9=97=B4,=20=E5=8F=AF=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E8=AE=BE=E6=9C=AA=E6=9D=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 表单新增"发布时间" datetime 选择器, 默认 nowLocalDatetime() - disabledDate 禁用今天之后日历日期 + validator 校验不得晚于当前时间 - 编辑回显 publishTime, 发布时用表单里的发布时间 (不再取点击瞬间) Co-Authored-By: Claude Code --- ry-vue3/src/views/manager/ProjectsNew.vue | 40 ++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/ry-vue3/src/views/manager/ProjectsNew.vue b/ry-vue3/src/views/manager/ProjectsNew.vue index a410d1a..06b9add 100644 --- a/ry-vue3/src/views/manager/ProjectsNew.vue +++ b/ry-vue3/src/views/manager/ProjectsNew.vue @@ -84,6 +84,14 @@ + + + + + + +
角色劳务设置
@@ -153,12 +161,31 @@ const fileInputRef = ref(null) function defaultRoleRow() { return { role: '', customName: '', amount: 0 } } function defaultNotice(key, label) { return { key, label, url: '', name: '' } } -// 当前本地时间 "yyyy-MM-dd HH:mm:ss" (发布用, 与 el-date-picker 的本地时间口径一致; 不能用 toISOString 的 UTC) +// 当前本地时间 "yyyy-MM-dd HH:mm:ss" (发布时间默认值/校验用, 与 el-date-picker 的本地时间口径一致; 不能用 toISOString 的 UTC) function nowLocalDatetime() { const d = new Date() const p = n => String(n).padStart(2, '0') return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}` } +// 发布时间: 禁用今天之后的日历日期 (未来日期不可选) +function disableFutureDate(date) { + const today = new Date() + today.setHours(0, 0, 0, 0) + return date.getTime() > today.getTime() +} +// 发布时间校验: 必填 + 不能晚于当前时间 +// value 是 "YYYY-MM-DD HH:mm:ss" 定长补零字符串, 字典序 = 时间序, 直接字符串比较 (无需 Date 解析/时区) +function validatePublishTime(rule, value, callback) { + if (!value) { + callback(new Error('请选择发布时间')) + return + } + if (value > nowLocalDatetime()) { + callback(new Error('发布时间不能晚于当前时间')) + return + } + callback() +} // 项目负责人候选 (sys_user.role_type='leader') const leaderOptions = ref([]) @@ -172,6 +199,8 @@ const form = reactive({ isBidProject: 'N', totalSessions: 0, totalAmount: 0, manageFee: 0, startTime: '', endTime: '', + // 发布时间: 默认打开页面时的本地时间, 用户可修改 (不可设未来时间) + publishTime: nowLocalDatetime(), roleRows: [ { role: '主席', customName: '', amount: 0 }, { role: '主持', customName: '', amount: 0 }, @@ -195,7 +224,8 @@ const rules = { totalSessions: [{ required: true, message: '请输入总场次', trigger: 'blur' }], totalAmount: [{ required: true, message: '请输入总金额', trigger: 'blur' }], startTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }], - endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }] + endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }], + publishTime: [{ validator: validatePublishTime, trigger: 'change' }] } function onRoleSelectChange(r) { @@ -289,6 +319,8 @@ async function loadProject() { form.manageFee = p.manageFee || 0 form.startTime = p.startTime || '' form.endTime = p.endTime || '' + // 发布时间: 已有值反显, 否则沿用页面打开时的默认时间 + form.publishTime = p.publishTime || nowLocalDatetime() form.leadUserId = p.leadUserId || null form.isBidProject = p.isBidProject || 'N' // 角色劳务反显: biz_project.role_labor JSON 数组 [{role, customName, amount}] @@ -403,10 +435,10 @@ async function submit(mode = 'save') { else if (n.key === 'notice') payload.publishUrl = n.url else if (n.key === 'schedule') payload.scheduleUrl = n.url } - // 发布时设置 is_published='Y' + publish_time (同步后端字段) + // 发布时设置 is_published='Y' + publish_time (用表单里用户可编辑的发布时间) if (mode === 'publish') { payload.isPublished = 'Y' - payload.publishTime = nowLocalDatetime() + payload.publishTime = form.publishTime } // 多执行方分配已移至"项目分配"页面单独管理 try {