|
|
@@ -6,7 +6,7 @@ import { Close, Delete, Plus } from '@element-plus/icons-vue'
|
|
|
|
|
|
defineOptions({ name: 'IotRyEquipmentReportForm' })
|
|
|
|
|
|
-type FormMode = 'create' | 'edit' | 'detail' | 'approval'
|
|
|
+type FormMode = 'create' | 'edit' | 'detail' | 'approval' | 'modify'
|
|
|
|
|
|
interface EquipmentReportForm {
|
|
|
id?: number
|
|
|
@@ -19,9 +19,11 @@ interface EquipmentReportForm {
|
|
|
personnel: string
|
|
|
auditStatus?: 0 | 10 | 20 | 30 | 40
|
|
|
opinion?: string
|
|
|
+ modifyFlag?: 'Y'
|
|
|
}
|
|
|
|
|
|
interface ImproveReportDetail {
|
|
|
+ detailKey?: string
|
|
|
projectName: string
|
|
|
constructionDetail: string
|
|
|
nextPlan: string
|
|
|
@@ -69,6 +71,8 @@ const auditStatusMap = {
|
|
|
40: { label: '已取消', type: 'info' }
|
|
|
} as const
|
|
|
|
|
|
+let detailKeySeed = 0
|
|
|
+
|
|
|
const rules: FormRules = {
|
|
|
title: [{ required: true, message: '请输入标题', trigger: ['blur', 'change'] }],
|
|
|
createTime: [{ required: true, message: '请选择汇报时间', trigger: ['blur', 'change'] }],
|
|
|
@@ -83,7 +87,8 @@ const drawerTitle = computed(() => {
|
|
|
create: '新建设备汇报',
|
|
|
edit: '编辑设备汇报',
|
|
|
detail: '查看设备汇报',
|
|
|
- approval: '审批设备汇报'
|
|
|
+ approval: '审批设备汇报',
|
|
|
+ modify: '修改设备汇报'
|
|
|
}
|
|
|
|
|
|
return titleMap[formMode.value]
|
|
|
@@ -101,12 +106,18 @@ function getAuditStatus(status?: number) {
|
|
|
|
|
|
function createDefaultDetail(): ImproveReportDetail {
|
|
|
return {
|
|
|
+ detailKey: createDetailKey(),
|
|
|
projectName: '',
|
|
|
constructionDetail: '',
|
|
|
nextPlan: ''
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function createDetailKey() {
|
|
|
+ detailKeySeed += 1
|
|
|
+ return `detail-${Date.now()}-${detailKeySeed}`
|
|
|
+}
|
|
|
+
|
|
|
function getDefaultDetails() {
|
|
|
return [createDefaultDetail()]
|
|
|
}
|
|
|
@@ -117,12 +128,32 @@ function normalizeDetails(details?: ImproveReportDetail[]) {
|
|
|
}
|
|
|
|
|
|
return details.map((item) => ({
|
|
|
+ detailKey: item.detailKey || createDetailKey(),
|
|
|
projectName: item.projectName || '',
|
|
|
constructionDetail: item.constructionDetail || '',
|
|
|
nextPlan: item.nextPlan || ''
|
|
|
}))
|
|
|
}
|
|
|
|
|
|
+function resolveDetailIndex(row: ImproveReportDetail) {
|
|
|
+ const index = form.value.improveReportDetails.findIndex(
|
|
|
+ (item) => item.detailKey === row.detailKey
|
|
|
+ )
|
|
|
+ return index >= 0 ? index : 0
|
|
|
+}
|
|
|
+
|
|
|
+function getDetailFieldProp(row: ImproveReportDetail, field: keyof ImproveReportDetail) {
|
|
|
+ return `improveReportDetails.${resolveDetailIndex(row)}.${field}`
|
|
|
+}
|
|
|
+
|
|
|
+function getDetailRowKey(row: ImproveReportDetail) {
|
|
|
+ return row.detailKey || ''
|
|
|
+}
|
|
|
+
|
|
|
+function getSubmitDetails(details: ImproveReportDetail[]) {
|
|
|
+ return details.map(({ detailKey: _detailKey, ...item }) => item)
|
|
|
+}
|
|
|
+
|
|
|
function toFormData(row?: any): EquipmentReportForm {
|
|
|
if (!row) return { ...defaultForm, improveReportDetails: getDefaultDetails() }
|
|
|
|
|
|
@@ -171,13 +202,12 @@ function addImproveReportDetail() {
|
|
|
form.value.improveReportDetails.push(createDefaultDetail())
|
|
|
}
|
|
|
|
|
|
-function removeImproveReportDetail(index: number) {
|
|
|
+function removeImproveReportDetail(row: ImproveReportDetail) {
|
|
|
if (form.value.improveReportDetails.length <= 1) {
|
|
|
- form.value.improveReportDetails = getDefaultDetails()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- form.value.improveReportDetails.splice(index, 1)
|
|
|
+ form.value.improveReportDetails.splice(resolveDetailIndex(row), 1)
|
|
|
}
|
|
|
|
|
|
async function submitForm() {
|
|
|
@@ -187,7 +217,11 @@ async function submitForm() {
|
|
|
formLoading.value = true
|
|
|
await formRef.value.validate()
|
|
|
|
|
|
- const data = { ...form.value, createTime: Number(form.value.createTime) }
|
|
|
+ const data = {
|
|
|
+ ...form.value,
|
|
|
+ createTime: Number(form.value.createTime),
|
|
|
+ improveReportDetails: getSubmitDetails(form.value.improveReportDetails)
|
|
|
+ }
|
|
|
|
|
|
if (data.id) {
|
|
|
await IotRyImproveDailyReportApi.updateIotRyImproveDailyReport({
|
|
|
@@ -198,9 +232,10 @@ async function submitForm() {
|
|
|
workPurpose: data.workPurpose,
|
|
|
relocationDays: Number(data.relocationDays),
|
|
|
personnel: data.personnel,
|
|
|
- improveReportDetails: data.improveReportDetails
|
|
|
+ improveReportDetails: data.improveReportDetails,
|
|
|
+ ...(formMode.value === 'modify' ? { modifyFlag: 'Y' as const } : {})
|
|
|
})
|
|
|
- message.success('编辑成功')
|
|
|
+ message.success(formMode.value === 'modify' ? '修改成功' : '编辑成功')
|
|
|
await props.loadList()
|
|
|
} else {
|
|
|
await IotRyImproveDailyReportApi.createIotRyImproveDailyReport({
|
|
|
@@ -353,14 +388,15 @@ defineExpose({ handleOpenForm })
|
|
|
:data="form.improveReportDetails"
|
|
|
:loading="false"
|
|
|
class="detail-table"
|
|
|
+ :row-key="getDetailRowKey"
|
|
|
:show-border="true"
|
|
|
:show-overflow-tooltip="false">
|
|
|
<ZmTableColumn label="项目名称" prop="projectName" :width="220">
|
|
|
- <template #default="{ row, $index }">
|
|
|
+ <template #default="{ row }">
|
|
|
<el-form-item
|
|
|
class="mb-0!"
|
|
|
:show-message="false"
|
|
|
- :prop="`improveReportDetails.${$index}.projectName`"
|
|
|
+ :prop="getDetailFieldProp(row, 'projectName')"
|
|
|
:rules="{
|
|
|
required: true,
|
|
|
message: '请输入项目名称',
|
|
|
@@ -376,11 +412,11 @@ defineExpose({ handleOpenForm })
|
|
|
</ZmTableColumn>
|
|
|
|
|
|
<ZmTableColumn label="施工动态" min-width="280">
|
|
|
- <template #default="{ row, $index }">
|
|
|
+ <template #default="{ row }">
|
|
|
<el-form-item
|
|
|
class="mb-0!"
|
|
|
:show-message="false"
|
|
|
- :prop="`improveReportDetails.${$index}.constructionDetail`"
|
|
|
+ :prop="getDetailFieldProp(row, 'constructionDetail')"
|
|
|
:rules="{
|
|
|
required: true,
|
|
|
message: '请输入施工动态',
|
|
|
@@ -399,11 +435,11 @@ defineExpose({ handleOpenForm })
|
|
|
</ZmTableColumn>
|
|
|
|
|
|
<ZmTableColumn label="下步计划" min-width="240">
|
|
|
- <template #default="{ row, $index }">
|
|
|
+ <template #default="{ row }">
|
|
|
<el-form-item
|
|
|
class="mb-0!"
|
|
|
:show-message="false"
|
|
|
- :prop="`improveReportDetails.${$index}.nextPlan`"
|
|
|
+ :prop="getDetailFieldProp(row, 'nextPlan')"
|
|
|
:rules="{
|
|
|
required: true,
|
|
|
message: '请输入下步计划',
|
|
|
@@ -422,13 +458,13 @@ defineExpose({ handleOpenForm })
|
|
|
</ZmTableColumn>
|
|
|
|
|
|
<ZmTableColumn label="操作" width="90" fixed="right">
|
|
|
- <template #default="{ $index }">
|
|
|
+ <template #default="{ row }">
|
|
|
<el-button
|
|
|
link
|
|
|
type="danger"
|
|
|
:icon="Delete"
|
|
|
- @click="removeImproveReportDetail($index)"
|
|
|
- :disabled="mainFieldDisabled">
|
|
|
+ @click="removeImproveReportDetail(row)"
|
|
|
+ :disabled="mainFieldDisabled || form.improveReportDetails.length <= 1">
|
|
|
删除
|
|
|
</el-button>
|
|
|
</template>
|
|
|
@@ -453,7 +489,7 @@ defineExpose({ handleOpenForm })
|
|
|
|
|
|
<template #footer>
|
|
|
<el-button
|
|
|
- v-if="formMode === 'create' || formMode === 'edit'"
|
|
|
+ v-if="formMode === 'create' || formMode === 'edit' || formMode === 'modify'"
|
|
|
size="default"
|
|
|
type="primary"
|
|
|
@click="submitForm"
|