feat(web-admin): add optional occur date on reimburse apply details

Allow picking YYYY-MM-DD per detail line and show it in the view dialog.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-08-17 16:00:01 +08:00
1 parent 5b7a9f2f8f
commit 8f032488a4
1 file changed
+25 -8
@@ -291,6 +291,7 @@
<th class="col-expense">费用项目<span class="th-required">*</span></th>
<th class="col-amount">金额(元)<span class="th-required">*</span></th>
<th class="col-remark">报销事由<span class="th-required">*</span></th>
<th class="col-occur">发生时间</th>
<th class="col-action">操作</th>
</tr>
</thead>
@@ -321,6 +322,16 @@
<td class="col-remark">
<el-input v-model="line.remark" placeholder="请输入报销事由" />
</td>
<td class="col-occur">
<el-date-picker
v-model="line.occurDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="可选"
clearable
style="width: 100%"
/>
</td>
<td class="col-action">
<el-button
v-if="addForm.details.length > 1"
@@ -523,6 +534,9 @@
<el-table-column prop="remark" label="报销事由" min-width="140" align="left" header-align="center">
<template #default="{ row }">{{ row.remark || '-' }}</template>
</el-table-column>
<el-table-column prop="occurDate" label="发生时间" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ row.occurDate || '—' }}</template>
</el-table-column>
</ListTable>
</div>
@@ -649,6 +663,7 @@ interface DetailLine {
expenseItemId: string
amount: number | string
remark: string
occurDate: string
}
const loadingMap = reactive<Record<string, boolean>>({})
@@ -759,7 +774,7 @@ const addForm = reactive({
reimburseDate: todayYmd(),
title: '',
remark: '',
details: [{ expenseItemId: '', amount: '' as number | string, remark: '' }] as DetailLine[]
details: [{ expenseItemId: '', amount: '' as number | string, remark: '', occurDate: '' }] as DetailLine[]
})
const viewData = ref<Record<string, any>>({})
@@ -1014,7 +1029,7 @@ async function openAddDialog() {
addForm.reimburseDate = todayYmd()
addForm.title = ''
addForm.remark = ''
addForm.details = [{ expenseItemId: '', amount: '', remark: '' }]
addForm.details = [{ expenseItemId: '', amount: '', remark: '', occurDate: '' }]
selectedInvoicePicks.value = []
editingId.value = null
titleAutoLinked.value = true
@@ -1100,10 +1115,11 @@ async function openEditDialog(row: any) {
addForm.details = (data.details || []).map((d: any) => ({
expenseItemId: d.expenseId,
amount: d.amount,
remark: d.remark || ''
remark: d.remark || '',
occurDate: d.occurDate || ''
}))
if (addForm.details.length === 0) {
addForm.details = [{ expenseItemId: '', amount: '', remark: '' }]
addForm.details = [{ expenseItemId: '', amount: '', remark: '', occurDate: '' }]
}
editingId.value = row.id
const invoices = Array.isArray(data.invoices) ? data.invoices : []
@@ -1119,7 +1135,7 @@ async function openEditDialog(row: any) {
}
function addDetailLine() {
addForm.details.push({ expenseItemId: '', amount: '', remark: '' })
addForm.details.push({ expenseItemId: '', amount: '', remark: '', occurDate: '' })
}
function removeDetailLine(index: number) {
@@ -1227,7 +1243,7 @@ type AddPayload = {
remark: string
invoiceIds: string[]
invoiceLinks: { invoiceId: string; attachmentId: string }[]
details: { expenseItemId: string; amount: number; remark: string }[]
details: { expenseItemId: string; amount: number; remark: string; occurDate?: string }[]
}
function buildAddPayload(): AddPayload | null {
@@ -1256,7 +1272,8 @@ function buildAddPayload(): AddPayload | null {
details: validDetails.map((d) => ({
expenseItemId: String(d.expenseItemId),
amount: Number(d.amount),
remark: String(d.remark).trim()
remark: String(d.remark).trim(),
occurDate: d.occurDate ? String(d.occurDate) : undefined
}))
}
}
@@ -1267,7 +1284,7 @@ function resetAddForm() {
addForm.reimburseDate = todayYmd()
addForm.title = ''
addForm.remark = ''
addForm.details = [{ expenseItemId: '', amount: '', remark: '' }]
addForm.details = [{ expenseItemId: '', amount: '', remark: '', occurDate: '' }]
selectedInvoicePicks.value = []
editingId.value = null
}