feat: 项目信息新增发布时间字段(默认页面打开时间, 可修改不可设未来)
- 表单新增"发布时间" datetime 选择器, 默认 nowLocalDatetime() - disabledDate 禁用今天之后日历日期 + validator 校验不得晚于当前时间 - 编辑回显 publishTime, 发布时用表单里的发布时间 (不再取点击瞬间) Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -84,6 +84,14 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<el-row :gutter="12">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="发布时间" prop="publishTime">
|
||||||
|
<el-date-picker v-model="form.publishTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
:disabled-date="disableFutureDate" placeholder="请选择发布时间" style="width:100%" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
<!-- ========== 第二区块:角色劳务设置 ========== -->
|
<!-- ========== 第二区块:角色劳务设置 ========== -->
|
||||||
<div class="new-card-title">角色劳务设置</div>
|
<div class="new-card-title">角色劳务设置</div>
|
||||||
@@ -153,12 +161,31 @@ const fileInputRef = ref(null)
|
|||||||
|
|
||||||
function defaultRoleRow() { return { role: '', customName: '', amount: 0 } }
|
function defaultRoleRow() { return { role: '', customName: '', amount: 0 } }
|
||||||
function defaultNotice(key, label) { return { key, label, url: '', name: '' } }
|
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() {
|
function nowLocalDatetime() {
|
||||||
const d = new Date()
|
const d = new Date()
|
||||||
const p = n => String(n).padStart(2, '0')
|
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())}`
|
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')
|
// 项目负责人候选 (sys_user.role_type='leader')
|
||||||
const leaderOptions = ref([])
|
const leaderOptions = ref([])
|
||||||
@@ -172,6 +199,8 @@ const form = reactive({
|
|||||||
isBidProject: 'N',
|
isBidProject: 'N',
|
||||||
totalSessions: 0, totalAmount: 0, manageFee: 0,
|
totalSessions: 0, totalAmount: 0, manageFee: 0,
|
||||||
startTime: '', endTime: '',
|
startTime: '', endTime: '',
|
||||||
|
// 发布时间: 默认打开页面时的本地时间, 用户可修改 (不可设未来时间)
|
||||||
|
publishTime: nowLocalDatetime(),
|
||||||
roleRows: [
|
roleRows: [
|
||||||
{ role: '主席', customName: '', amount: 0 },
|
{ role: '主席', customName: '', amount: 0 },
|
||||||
{ role: '主持', customName: '', amount: 0 },
|
{ role: '主持', customName: '', amount: 0 },
|
||||||
@@ -195,7 +224,8 @@ const rules = {
|
|||||||
totalSessions: [{ required: true, message: '请输入总场次', trigger: 'blur' }],
|
totalSessions: [{ required: true, message: '请输入总场次', trigger: 'blur' }],
|
||||||
totalAmount: [{ required: true, message: '请输入总金额', trigger: 'blur' }],
|
totalAmount: [{ required: true, message: '请输入总金额', trigger: 'blur' }],
|
||||||
startTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
|
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) {
|
function onRoleSelectChange(r) {
|
||||||
@@ -289,6 +319,8 @@ async function loadProject() {
|
|||||||
form.manageFee = p.manageFee || 0
|
form.manageFee = p.manageFee || 0
|
||||||
form.startTime = p.startTime || ''
|
form.startTime = p.startTime || ''
|
||||||
form.endTime = p.endTime || ''
|
form.endTime = p.endTime || ''
|
||||||
|
// 发布时间: 已有值反显, 否则沿用页面打开时的默认时间
|
||||||
|
form.publishTime = p.publishTime || nowLocalDatetime()
|
||||||
form.leadUserId = p.leadUserId || null
|
form.leadUserId = p.leadUserId || null
|
||||||
form.isBidProject = p.isBidProject || 'N'
|
form.isBidProject = p.isBidProject || 'N'
|
||||||
// 角色劳务反显: biz_project.role_labor JSON 数组 [{role, customName, amount}]
|
// 角色劳务反显: 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 === 'notice') payload.publishUrl = n.url
|
||||||
else if (n.key === 'schedule') payload.scheduleUrl = n.url
|
else if (n.key === 'schedule') payload.scheduleUrl = n.url
|
||||||
}
|
}
|
||||||
// 发布时设置 is_published='Y' + publish_time (同步后端字段)
|
// 发布时设置 is_published='Y' + publish_time (用表单里用户可编辑的发布时间)
|
||||||
if (mode === 'publish') {
|
if (mode === 'publish') {
|
||||||
payload.isPublished = 'Y'
|
payload.isPublished = 'Y'
|
||||||
payload.publishTime = nowLocalDatetime()
|
payload.publishTime = form.publishTime
|
||||||
}
|
}
|
||||||
// 多执行方分配已移至"项目分配"页面单独管理
|
// 多执行方分配已移至"项目分配"页面单独管理
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user