|
@@ -99,13 +99,10 @@
|
|
|
<Icon icon="ep:refresh" class="mr-5px"/>
|
|
<Icon icon="ep:refresh" class="mr-5px"/>
|
|
|
重置
|
|
重置
|
|
|
</el-button>
|
|
</el-button>
|
|
|
- <el-button type="primary" @click="handleCopy" :disabled="selectedRows.length !== 1">
|
|
|
|
|
- <Icon icon="ep:document-copy" class="mr-5px"/>
|
|
|
|
|
- 复制
|
|
|
|
|
- </el-button>
|
|
|
|
|
- <el-button type="success" @click="handleSubmit" :disabled="!hasCopiedRows">
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <el-button type="success" @click="handleSubmit" :disabled="!hasModifiedRows && !hasCopiedRows">
|
|
|
<Icon icon="ep:upload" class="mr-5px"/>
|
|
<Icon icon="ep:upload" class="mr-5px"/>
|
|
|
- 提交
|
|
|
|
|
|
|
+ 提交修改
|
|
|
</el-button>
|
|
</el-button>
|
|
|
<el-button type="success" @click="handleExport" :loading="exportLoading">
|
|
<el-button type="success" @click="handleExport" :loading="exportLoading">
|
|
|
<Icon icon="ep:download" class="mr-5px"/>
|
|
<Icon icon="ep:download" class="mr-5px"/>
|
|
@@ -122,12 +119,12 @@
|
|
|
@current-change="handleCurrentChange"
|
|
@current-change="handleCurrentChange"
|
|
|
@row-click="handleRowClick"
|
|
@row-click="handleRowClick"
|
|
|
@sort-change="handleSortChange"
|
|
@sort-change="handleSortChange"
|
|
|
- :row-key="getRowKey"
|
|
|
|
|
class="shift-schedule-table"
|
|
class="shift-schedule-table"
|
|
|
ref="tableRef"
|
|
ref="tableRef"
|
|
|
:row-class-name="getRowClassName"
|
|
:row-class-name="getRowClassName"
|
|
|
highlight-current-row
|
|
highlight-current-row
|
|
|
>
|
|
>
|
|
|
|
|
+ <el-table-column type="selection" width="55" fixed="left" />
|
|
|
<el-table-column label="日期" prop="date" width="170" align="center" fixed="left" sortable>
|
|
<el-table-column label="日期" prop="date" width="170" align="center" fixed="left" sortable>
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<div class="date-cell">
|
|
<div class="date-cell">
|
|
@@ -181,7 +178,7 @@
|
|
|
<CheckerSelect
|
|
<CheckerSelect
|
|
|
:ref="(el) => setCheckerSelectRef(el, row.id)"
|
|
:ref="(el) => setCheckerSelectRef(el, row.id)"
|
|
|
:dept-id="userStore.getUser.deptId?.toString() || props.relateDepartment"
|
|
:dept-id="userStore.getUser.deptId?.toString() || props.relateDepartment"
|
|
|
- :model-value="row.checkerItems || []"
|
|
|
|
|
|
|
+ v-model="row.teamList"
|
|
|
:multiple="true"
|
|
:multiple="true"
|
|
|
:has-data="true"
|
|
:has-data="true"
|
|
|
@change="(checkers) => handleCheckerSelectChange(checkers, row)"
|
|
@change="(checkers) => handleCheckerSelectChange(checkers, row)"
|
|
@@ -205,11 +202,11 @@
|
|
|
<el-table-column label="电话" prop="contactPhone" width="130" align="center"/>
|
|
<el-table-column label="电话" prop="contactPhone" width="130" align="center"/>
|
|
|
|
|
|
|
|
<!-- 管道介质 -->
|
|
<!-- 管道介质 -->
|
|
|
- <el-table-column label="管道介质" prop="medium" width="150" align="center">
|
|
|
|
|
|
|
+ <el-table-column label="管道介质" prop="pipeMedium" width="150" align="center">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<div>
|
|
<div>
|
|
|
<el-tag
|
|
<el-tag
|
|
|
- v-for="m in row.medium"
|
|
|
|
|
|
|
+ v-for="m in (row.pipeMedium || [])"
|
|
|
:key="m"
|
|
:key="m"
|
|
|
size="small"
|
|
size="small"
|
|
|
class="mr-5px mb-5px"
|
|
class="mr-5px mb-5px"
|
|
@@ -217,6 +214,7 @@
|
|
|
>
|
|
>
|
|
|
{{ m }}
|
|
{{ m }}
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
|
|
+ <span v-if="!row.pipeMedium || row.pipeMedium.length === 0">-</span>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
@@ -225,13 +223,19 @@
|
|
|
<el-table-column label="管线长度 (m)" prop="pipeLengthTotal" width="120" align="center">
|
|
<el-table-column label="管线长度 (m)" prop="pipeLengthTotal" width="120" align="center">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span class="font-mono font-semibold text-blue-800">
|
|
<span class="font-mono font-semibold text-blue-800">
|
|
|
- {{ row.pipeLengthTotal?.toFixed(2) || '-' }}
|
|
|
|
|
|
|
+ {{ row.pipeLengthTotal || '-' }}
|
|
|
</span>
|
|
</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
|
|
|
|
|
- <el-table-column label="区域街道" prop="street" width="120" align="center"/>
|
|
|
|
|
- <el-table-column label="上次报告编号" prop="lastReportNo" width="150" align="center"/>
|
|
|
|
|
|
|
+ <el-table-column label="区域街道" prop="equipStreetName" width="120" align="center">
|
|
|
|
|
+ <template #default="{ row }">
|
|
|
|
|
+ <span>
|
|
|
|
|
+ {{ row.equipDistrictName + ' ' + row.equipStreetName || '-' }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="上次报告编号" prop="lastLegalPeriodicalInspectionReportNo" width="150" align="center"/>
|
|
|
<el-table-column label="监督报告编号" prop="lastMaintenanceReportNo" width="150"
|
|
<el-table-column label="监督报告编号" prop="lastMaintenanceReportNo" width="150"
|
|
|
align="center"/>
|
|
align="center"/>
|
|
|
|
|
|
|
@@ -261,7 +265,7 @@
|
|
|
</template>
|
|
</template>
|
|
|
<div class="flex items-center justify-center gap-6px cursor-help">
|
|
<div class="flex items-center justify-center gap-6px cursor-help">
|
|
|
<span>状态</span>
|
|
<span>状态</span>
|
|
|
- <Icon icon="ep:question-filled" class="text-gray-400" size="14"/>
|
|
|
|
|
|
|
+ <Icon icon="ep:question-filled" class="text-gray-400" :size="14"/>
|
|
|
</div>
|
|
</div>
|
|
|
</el-tooltip>
|
|
</el-tooltip>
|
|
|
</template>
|
|
</template>
|
|
@@ -305,22 +309,28 @@ const props = defineProps<{
|
|
|
// ==================== 数据定义 ====================
|
|
// ==================== 数据定义 ====================
|
|
|
interface ScheduleRow {
|
|
interface ScheduleRow {
|
|
|
id?: string
|
|
id?: string
|
|
|
|
|
+ index?: number // 行索引
|
|
|
|
|
+ sourceIndex?: number // 源行索引
|
|
|
date: string
|
|
date: string
|
|
|
week: string
|
|
week: string
|
|
|
checkers?: string[] // 检验员ID数组(用于提交)
|
|
checkers?: string[] // 检验员ID数组(用于提交)
|
|
|
- checkerItems?: CheckerItem[] // 检验员对象数组(用于显示和编辑)
|
|
|
|
|
teamList?: any[] // 团队列表(后端返回的完整数据)
|
|
teamList?: any[] // 团队列表(后端返回的完整数据)
|
|
|
checkType?: string
|
|
checkType?: string
|
|
|
unitName?: string
|
|
unitName?: string
|
|
|
- address?: string
|
|
|
|
|
|
|
+ pipeAddress?: string // 管道使用地址
|
|
|
contact?: string
|
|
contact?: string
|
|
|
contactPhone?: string
|
|
contactPhone?: string
|
|
|
- medium?: string[]
|
|
|
|
|
- pipeLengthTotal?: number
|
|
|
|
|
- street?: string
|
|
|
|
|
- lastReportNo?: string
|
|
|
|
|
- lastMaintenanceReportNo?: string
|
|
|
|
|
- status?: any
|
|
|
|
|
|
|
+ pipeMedium?: string[] // 管道介质
|
|
|
|
|
+ pipeLengthTotal?: string // 管道长度
|
|
|
|
|
+ equipDistrictName?: string // 设备所在区域名称
|
|
|
|
|
+ equipStreetName?: string // 设备所在街道名称
|
|
|
|
|
+ lastLegalPeriodicalInspectionReportNo?: string // 上次定检报告编号
|
|
|
|
|
+ confirmOrderId?: string // 确认订单ID
|
|
|
|
|
+ modified?: boolean // 是否被修改
|
|
|
|
|
+ originalData?: any // 原始数据,用于比较
|
|
|
|
|
+ lastYearReportNo?: string // 上次年检报告编号
|
|
|
|
|
+ lastMaintenanceReportNo?: string // 监督检验报告编号
|
|
|
|
|
+ status?: number // 状态, 100 已排期 200 待约检 300 已受理 400 检测中
|
|
|
isCopied?: boolean // 是否为复制的行
|
|
isCopied?: boolean // 是否为复制的行
|
|
|
submitted?: boolean // 是否已提交
|
|
submitted?: boolean // 是否已提交
|
|
|
}
|
|
}
|
|
@@ -332,6 +342,11 @@ const tableData = ref<ScheduleRow[]>([])
|
|
|
const selectedRows = ref<ScheduleRow[]>([])
|
|
const selectedRows = ref<ScheduleRow[]>([])
|
|
|
const tableRef = ref()
|
|
const tableRef = ref()
|
|
|
|
|
|
|
|
|
|
+// 处理选择变化
|
|
|
|
|
+const handleSelectionChange = (val: ScheduleRow[]) => {
|
|
|
|
|
+ selectedRows.value = val
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 用户store
|
|
// 用户store
|
|
|
const userStore = useUserStoreWithOut()
|
|
const userStore = useUserStoreWithOut()
|
|
|
|
|
|
|
@@ -347,29 +362,47 @@ const queryParams = reactive({
|
|
|
unitName: '',
|
|
unitName: '',
|
|
|
status: '',
|
|
status: '',
|
|
|
orderBy: '', // 排序字段
|
|
orderBy: '', // 排序字段
|
|
|
- orderType: '' // 排序类型:asc-升序,desc-降序
|
|
|
|
|
|
|
+ orderType: '', // 排序类型:asc-升序,desc-降序
|
|
|
|
|
+ relateDepartment: '' // 关联部门
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== 方法 ====================
|
|
// ==================== 方法 ====================
|
|
|
|
|
|
|
|
-// 获取行的唯一key(用于table的row-key)
|
|
|
|
|
-const getRowKey = (row: ScheduleRow): string => {
|
|
|
|
|
- // 复制的行使用taskId+date作为唯一标识
|
|
|
|
|
- // 避免同一任务的多行有相同的id导致表格渲染异常
|
|
|
|
|
- if (row.id && row.date) {
|
|
|
|
|
- return `${row.id}_${row.date}`
|
|
|
|
|
- }
|
|
|
|
|
- return row.id || Math.random().toString(36)
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
// 获取检验员昵称列表(用于显示)
|
|
// 获取检验员昵称列表(用于显示)
|
|
|
const getCheckerNames = (row: ScheduleRow): string => {
|
|
const getCheckerNames = (row: ScheduleRow): string => {
|
|
|
- if (!row.checkerItems || row.checkerItems.length === 0) {
|
|
|
|
|
- return ''
|
|
|
|
|
|
|
+ if (row.teamList && row.teamList.length > 0) {
|
|
|
|
|
+ // 从 teamList 中获取所有检验员名称,用顿号分隔
|
|
|
|
|
+ const allMembers: string[] = [];
|
|
|
|
|
+ row.teamList.forEach(team => {
|
|
|
|
|
+ // 添加组长
|
|
|
|
|
+ if (team.leaders && team.leaders.length > 0) {
|
|
|
|
|
+ team.leaders.forEach(leader => {
|
|
|
|
|
+ if (leader.nickname) {
|
|
|
|
|
+ allMembers.push(leader.nickname);
|
|
|
|
|
+ } else if (leader.id) {
|
|
|
|
|
+ allMembers.push(leader.id);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ // 添加成员
|
|
|
|
|
+ if (team.members && team.members.length > 0) {
|
|
|
|
|
+ team.members.forEach(member => {
|
|
|
|
|
+ if (member.nickname) {
|
|
|
|
|
+ allMembers.push(member.nickname);
|
|
|
|
|
+ } else if (member.id) {
|
|
|
|
|
+ allMembers.push(member.id);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ return allMembers.join('、') || '';
|
|
|
|
|
+ } else if (row.checkers && row.checkers.length > 0) {
|
|
|
|
|
+ // 如果只有 checkers ID 列表,直接显示 ID
|
|
|
|
|
+ return row.checkers.join('、');
|
|
|
}
|
|
}
|
|
|
- // 直接返回所有检验员名称,用顿号分隔
|
|
|
|
|
- return row.checkerItems.map(item => item.member?.nickname).filter(Boolean).join('、')
|
|
|
|
|
|
|
+ return ''
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 设置 CheckerSelect 引用
|
|
// 设置 CheckerSelect 引用
|
|
@@ -387,39 +420,13 @@ const handlePopoverShow = async (row: ScheduleRow) => {
|
|
|
|
|
|
|
|
currentEditingRow.value = row
|
|
currentEditingRow.value = row
|
|
|
|
|
|
|
|
- // 获取当前行的 CheckerSelect 引用
|
|
|
|
|
const checkerSelectRef = checkerSelectRefs.value[row.id]
|
|
const checkerSelectRef = checkerSelectRefs.value[row.id]
|
|
|
- if (!checkerSelectRef) {
|
|
|
|
|
- console.warn('CheckerSelect ref not found for row:', row.id)
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
// 加载检验员列表
|
|
// 加载检验员列表
|
|
|
const deptId = userStore.getUser.deptId?.toString() || props.relateDepartment
|
|
const deptId = userStore.getUser.deptId?.toString() || props.relateDepartment
|
|
|
- await nextTick()
|
|
|
|
|
await checkerSelectRef.getCheckerList(deptId)
|
|
await checkerSelectRef.getCheckerList(deptId)
|
|
|
-
|
|
|
|
|
- // 如果有已选择的检验员,需要从完整列表中匹配出完整信息
|
|
|
|
|
- if (row.checkers && row.checkers.length > 0) {
|
|
|
|
|
- await nextTick()
|
|
|
|
|
- const fullMemberList = checkerSelectRef.getAllMembersFromData?.() || []
|
|
|
|
|
-
|
|
|
|
|
- // 将简化的checkerItems转换为完整的checkerItems
|
|
|
|
|
- const completeCheckerItems = row.checkers.map(checkerId => {
|
|
|
|
|
- // 从完整列表中查找匹配的检验员
|
|
|
|
|
- const matchedMember = fullMemberList.find(m => m.memberId.toString() === checkerId.toString())
|
|
|
|
|
- if (matchedMember) {
|
|
|
|
|
- return matchedMember
|
|
|
|
|
- }
|
|
|
|
|
- // 如果没找到,返回原始数据
|
|
|
|
|
- return row.checkerItems?.find(c => c.memberId.toString() === checkerId.toString())
|
|
|
|
|
- }).filter(Boolean)
|
|
|
|
|
-
|
|
|
|
|
- // 更新当前行的检验员数据
|
|
|
|
|
- if (completeCheckerItems.length > 0) {
|
|
|
|
|
- row.checkerItems = completeCheckerItems
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ console.log(row.teamList)
|
|
|
|
|
+ row.teamList = row.teamList || []
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 关闭Popover
|
|
// 关闭Popover
|
|
@@ -432,10 +439,36 @@ const handleCheckerSelectChange = (selectedCheckers: CheckerItem[], row: Schedul
|
|
|
if (!row) {
|
|
if (!row) {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- // 更新当前行的检验员数据
|
|
|
|
|
- row.checkerItems = [...selectedCheckers]
|
|
|
|
|
// 同步更新checkers数组(用于提交)- 只需要memberId
|
|
// 同步更新checkers数组(用于提交)- 只需要memberId
|
|
|
row.checkers = selectedCheckers.map(c => c.memberId.toString())
|
|
row.checkers = selectedCheckers.map(c => c.memberId.toString())
|
|
|
|
|
+
|
|
|
|
|
+ // 构建 teamList
|
|
|
|
|
+ const teamMap = new Map<string, any>()
|
|
|
|
|
+ selectedCheckers.forEach(item => {
|
|
|
|
|
+ const groupTeamId = String(item.groupTeamId || '')
|
|
|
|
|
+ if (!teamMap.has(groupTeamId)) {
|
|
|
|
|
+ teamMap.set(groupTeamId, {
|
|
|
|
|
+ groupTeamId: groupTeamId,
|
|
|
|
|
+ leaders: [],
|
|
|
|
|
+ members: []
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ const team = teamMap.get(groupTeamId)
|
|
|
|
|
+ if (item.isLeader) {
|
|
|
|
|
+ team.leaders.push({
|
|
|
|
|
+ id: item.memberId,
|
|
|
|
|
+ nickname: item.member?.nickname || ''
|
|
|
|
|
+ })
|
|
|
|
|
+ } else {
|
|
|
|
|
+ team.members.push({
|
|
|
|
|
+ id: item.memberId,
|
|
|
|
|
+ nickname: item.member?.nickname || ''
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ row.teamList = Array.from(teamMap.values())
|
|
|
|
|
+ // 标记为已修改
|
|
|
|
|
+ row.modified = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 处理日期变更
|
|
// 处理日期变更
|
|
@@ -446,7 +479,8 @@ const handleDateChange = (row: ScheduleRow) => {
|
|
|
}
|
|
}
|
|
|
// 更新星期
|
|
// 更新星期
|
|
|
row.week = calculateWeek(row.date)
|
|
row.week = calculateWeek(row.date)
|
|
|
-
|
|
|
|
|
|
|
+ // 标记为已修改
|
|
|
|
|
+ row.modified = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 通过日期计算星期
|
|
// 通过日期计算星期
|
|
@@ -457,7 +491,10 @@ const calculateWeek = (dateStr: string): string => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 获取状态文本
|
|
// 获取状态文本
|
|
|
-const getStatusText = (status: number | string): string => {
|
|
|
|
|
|
|
+const getStatusText = (status: number | string | null | undefined): string => {
|
|
|
|
|
+ if (status === null || status === undefined) {
|
|
|
|
|
+ return '未知'
|
|
|
|
|
+ }
|
|
|
const statusMap: Record<number, string> = {
|
|
const statusMap: Record<number, string> = {
|
|
|
100: '已排期',
|
|
100: '已排期',
|
|
|
200: '待约检',
|
|
200: '待约检',
|
|
@@ -468,7 +505,10 @@ const getStatusText = (status: number | string): string => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 获取状态样式类
|
|
// 获取状态样式类
|
|
|
-const getStatusClass = (status: number | string): string => {
|
|
|
|
|
|
|
+const getStatusClass = (status: number | string | null | undefined): string => {
|
|
|
|
|
+ if (status === null || status === undefined) {
|
|
|
|
|
+ return ''
|
|
|
|
|
+ }
|
|
|
const classMap: Record<number, string> = {
|
|
const classMap: Record<number, string> = {
|
|
|
100: 'dot-scheduled',
|
|
100: 'dot-scheduled',
|
|
|
200: 'dot-pending-appointment',
|
|
200: 'dot-pending-appointment',
|
|
@@ -480,11 +520,11 @@ const getStatusClass = (status: number | string): string => {
|
|
|
|
|
|
|
|
// 判断是否可以编辑
|
|
// 判断是否可以编辑
|
|
|
const canEdit = (row: ScheduleRow): boolean => {
|
|
const canEdit = (row: ScheduleRow): boolean => {
|
|
|
- // 只有刚复制且未提交的行可以编辑
|
|
|
|
|
- if (row.isCopied && !row.submitted) {
|
|
|
|
|
|
|
+ // 受理前(状态为 100 已排期或 200 待约检)的行可以编辑
|
|
|
|
|
+ if (row.status === 100 || row.status === 200) {
|
|
|
return true
|
|
return true
|
|
|
}
|
|
}
|
|
|
- // 其他行都不可编辑
|
|
|
|
|
|
|
+ // 其他行不可编辑
|
|
|
return false
|
|
return false
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -493,150 +533,191 @@ const hasCopiedRows = computed(() => {
|
|
|
return tableData.value.some(row => row.isCopied && !row.submitted)
|
|
return tableData.value.some(row => row.isCopied && !row.submitted)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+// 是否有修改的行
|
|
|
|
|
+const hasModifiedRows = computed(() => {
|
|
|
|
|
+ return tableData.value.some(row => row.modified)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
// 获取行类名
|
|
// 获取行类名
|
|
|
const getRowClassName = ({row}: { row: ScheduleRow }): string => {
|
|
const getRowClassName = ({row}: { row: ScheduleRow }): string => {
|
|
|
if (row.isCopied && !row.submitted) {
|
|
if (row.isCopied && !row.submitted) {
|
|
|
return 'copied-row'
|
|
return 'copied-row'
|
|
|
}
|
|
}
|
|
|
|
|
+ if (row.modified) {
|
|
|
|
|
+ return 'modified-row'
|
|
|
|
|
+ }
|
|
|
return ''
|
|
return ''
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 复制行
|
|
// 复制行
|
|
|
-const handleCopy = () => {
|
|
|
|
|
- if (selectedRows.value.length !== 1) {
|
|
|
|
|
- ElMessage.warning('请选择一行数据进行复制')
|
|
|
|
|
|
|
+const handleCopy = (row: ScheduleRow) => {
|
|
|
|
|
+ // 限制只有有 confirmOrderId 的情况下才能复制
|
|
|
|
|
+ if (!row.confirmOrderId) {
|
|
|
|
|
+ ElMessage.warning('只有已确认的订单才能复制')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const sourceRow = selectedRows.value[0]
|
|
|
|
|
-
|
|
|
|
|
// 计算下一天的日期
|
|
// 计算下一天的日期
|
|
|
let nextDate = ''
|
|
let nextDate = ''
|
|
|
let nextWeek = ''
|
|
let nextWeek = ''
|
|
|
- if (sourceRow.date) {
|
|
|
|
|
- nextDate = dayjs(sourceRow.date).add(1, 'day').format('YYYY-MM-DD')
|
|
|
|
|
|
|
+ if (row.date) {
|
|
|
|
|
+ nextDate = dayjs(row.date).add(1, 'day').format('YYYY-MM-DD')
|
|
|
nextWeek = calculateWeek(nextDate)
|
|
nextWeek = calculateWeek(nextDate)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 创建新行,复制所有属性
|
|
// 创建新行,复制所有属性
|
|
|
const newRow: ScheduleRow = {
|
|
const newRow: ScheduleRow = {
|
|
|
- ...sourceRow,
|
|
|
|
|
- sourceIndex: sourceRow.index,
|
|
|
|
|
|
|
+ ...row,
|
|
|
|
|
+ sourceIndex: row.index,
|
|
|
date: nextDate, // 设置为下一天
|
|
date: nextDate, // 设置为下一天
|
|
|
week: nextWeek, // 设置对应的星期
|
|
week: nextWeek, // 设置对应的星期
|
|
|
isCopied: true, // 标记为复制的行
|
|
isCopied: true, // 标记为复制的行
|
|
|
submitted: false, // 标记为未提交
|
|
submitted: false, // 标记为未提交
|
|
|
|
|
+ modified: true, // 标记为已修改
|
|
|
// 清空检验员相关数据
|
|
// 清空检验员相关数据
|
|
|
checkers: [],
|
|
checkers: [],
|
|
|
- checkerItems: [],
|
|
|
|
|
teamList: [],
|
|
teamList: [],
|
|
|
// 深拷贝其他数组类型字段
|
|
// 深拷贝其他数组类型字段
|
|
|
- medium: sourceRow.medium ? [...sourceRow.medium] : []
|
|
|
|
|
|
|
+ pipeMedium: row.pipeMedium ? [...row.pipeMedium] : []
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 找到源行的索引
|
|
// 找到源行的索引
|
|
|
- const sourceIndex = tableData.value.findIndex(row => row.index === sourceRow.index)
|
|
|
|
|
|
|
+ const sourceIndex = tableData.value.findIndex(r => r.id === row.id)
|
|
|
|
|
|
|
|
// 将新行插入到源行后面
|
|
// 将新行插入到源行后面
|
|
|
if (sourceIndex !== -1) {
|
|
if (sourceIndex !== -1) {
|
|
|
|
|
+ // 设置新行的索引为源行索引 + 1
|
|
|
|
|
+ newRow.index = sourceIndex + 1
|
|
|
tableData.value.splice(sourceIndex + 1, 0, newRow)
|
|
tableData.value.splice(sourceIndex + 1, 0, newRow)
|
|
|
|
|
+ // 更新后续行的索引
|
|
|
|
|
+ for (let i = sourceIndex + 2; i < tableData.value.length; i++) {
|
|
|
|
|
+ tableData.value[i].index = i
|
|
|
|
|
+ }
|
|
|
} else {
|
|
} else {
|
|
|
|
|
+ // 如果找不到源行,将新行添加到末尾
|
|
|
|
|
+ newRow.index = tableData.value.length
|
|
|
tableData.value.push(newRow)
|
|
tableData.value.push(newRow)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ElMessage.success('复制成功,日期已自动设为下一天,请修改检验员后提交')
|
|
ElMessage.success('复制成功,日期已自动设为下一天,请修改检验员后提交')
|
|
|
-
|
|
|
|
|
- // 清空选择
|
|
|
|
|
- tableRef.value?.clearSelection()
|
|
|
|
|
}
|
|
}
|
|
|
// 提交
|
|
// 提交
|
|
|
const handleSubmit = async () => {
|
|
const handleSubmit = async () => {
|
|
|
- // 获取所有复制且未提交的
|
|
|
|
|
|
|
+ // 获取所有需要提交的行:复制的行和修改的
|
|
|
const copiedRows = tableData.value.filter(row => row.isCopied && !row.submitted)
|
|
const copiedRows = tableData.value.filter(row => row.isCopied && !row.submitted)
|
|
|
-
|
|
|
|
|
- if (copiedRows.length === 0) {
|
|
|
|
|
- ElMessage.warning('没有需要提交的复制行')
|
|
|
|
|
|
|
+ const modifiedRows = tableData.value.filter(row => row.modified && !row.isCopied)
|
|
|
|
|
+
|
|
|
|
|
+ if (copiedRows.length === 0 && modifiedRows.length === 0) {
|
|
|
|
|
+ ElMessage.warning('没有需要提交的行')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 校验1:检查是否都填写了日期
|
|
|
|
|
- const rowsWithoutDate = copiedRows.filter(row => !row.date || row.date.trim() === '')
|
|
|
|
|
- // 原始日期
|
|
|
|
|
- if (rowsWithoutDate.length > 0) {
|
|
|
|
|
- ElMessage.warning('请为所有复制的行选择日期')
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- let isDuplicate = false
|
|
|
|
|
- copiedRows.forEach(row => {
|
|
|
|
|
- let id = row.id
|
|
|
|
|
- let rows = tableData.value.filter(row => row.id === id)
|
|
|
|
|
- // 增加行应该和其他行日期不相同
|
|
|
|
|
- rows.forEach(item => {
|
|
|
|
|
- if (item.date === row.date && row!==item) {
|
|
|
|
|
- isDuplicate = true
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 校验复制的行
|
|
|
|
|
+ if (copiedRows.length > 0) {
|
|
|
|
|
+ // 校验1:检查是否都填写了日期
|
|
|
|
|
+ const rowsWithoutDate = copiedRows.filter(row => !row.date || row.date.trim() === '')
|
|
|
|
|
+ if (rowsWithoutDate.length > 0) {
|
|
|
|
|
+ ElMessage.warning('请为所有复制的行选择日期')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 校验日期是否重复
|
|
|
|
|
+ let isDuplicate = false
|
|
|
|
|
+ copiedRows.forEach(row => {
|
|
|
|
|
+ let id = row.id
|
|
|
|
|
+ let rows = tableData.value.filter(row => row.id === id)
|
|
|
|
|
+ // 增加行应该和其他行日期不相同
|
|
|
|
|
+ rows.forEach(item => {
|
|
|
|
|
+ if (item.date === row.date && row!==item) {
|
|
|
|
|
+ isDuplicate = true
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
})
|
|
})
|
|
|
- })
|
|
|
|
|
- if (isDuplicate) {
|
|
|
|
|
- ElMessage.warning('请为所有复制的行选择不同的日期')
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ if (isDuplicate) {
|
|
|
|
|
+ ElMessage.warning('请为所有复制的行选择不同的日期')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 校验2:检查是否有检验员
|
|
|
|
|
+ const rowsWithoutCheckers = copiedRows.filter(row => !row.checkers || row.checkers.length === 0)
|
|
|
|
|
+ if (rowsWithoutCheckers.length > 0) {
|
|
|
|
|
+ ElMessage.warning('请为所有复制的行选择检验员')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 校验2:检查是否有检验员
|
|
|
|
|
- const rowsWithoutCheckers = copiedRows.filter(row => !row.checkers || row.checkers.length === 0)
|
|
|
|
|
- if (rowsWithoutCheckers.length > 0) {
|
|
|
|
|
- ElMessage.warning('请为所有复制的行选择检验员')
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ // 校验修改的行
|
|
|
|
|
+ if (modifiedRows.length > 0) {
|
|
|
|
|
+ // 校验1:检查是否都填写了日期
|
|
|
|
|
+ const rowsWithoutDate = modifiedRows.filter(row => !row.date || row.date.trim() === '')
|
|
|
|
|
+ if (rowsWithoutDate.length > 0) {
|
|
|
|
|
+ ElMessage.warning('请为所有修改的行选择日期')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 校验2:检查是否有检验员
|
|
|
|
|
+ const rowsWithoutCheckers = modifiedRows.filter(row => !row.checkers || row.checkers.length === 0)
|
|
|
|
|
+ if (rowsWithoutCheckers.length > 0) {
|
|
|
|
|
+ ElMessage.warning('请为所有修改的行选择检验员')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- // 转换数据格式,只保留 id、date、teamList
|
|
|
|
|
- const submitData = copiedRows.map(row => {
|
|
|
|
|
- // 从 checkerItems 构建 teamList
|
|
|
|
|
- const teamMap = new Map<string, any>()
|
|
|
|
|
- row.checkerItems?.forEach(item => {
|
|
|
|
|
- const groupTeamId = item.groupTeamId
|
|
|
|
|
-
|
|
|
|
|
- if (!teamMap.has(groupTeamId)) {
|
|
|
|
|
- teamMap.set(groupTeamId, {
|
|
|
|
|
- groupTeamId: groupTeamId,
|
|
|
|
|
- leaderId: item.isLeader ? item.memberId : '',
|
|
|
|
|
- memberIdList: []
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ElMessage({ message: '提交中...', type: 'info', duration: 0 })
|
|
|
|
|
+
|
|
|
|
|
+ // 处理复制的行
|
|
|
|
|
+ const copyPromises = copiedRows.map(async (row) => {
|
|
|
|
|
+ // 从 teamList 构建提交数据
|
|
|
|
|
+ const teamList = (row.teamList || []).map(team => ({
|
|
|
|
|
+ groupTeamId: team.groupTeamId,
|
|
|
|
|
+ leaderId: team.leaders?.[0]?.id || '',
|
|
|
|
|
+ memberIdList: team.members?.map(member => member.id) || []
|
|
|
|
|
+ }))
|
|
|
|
|
+
|
|
|
|
|
+ const copyData = {
|
|
|
|
|
+ sourceId: row.id,
|
|
|
|
|
+ newDate: row.date,
|
|
|
|
|
+ teamList: teamList
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- const team = teamMap.get(groupTeamId)
|
|
|
|
|
- if (!team.memberIdList.includes(item.memberId) && !item.isLeader) {
|
|
|
|
|
- team.memberIdList.push(item.memberId)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ console.log('复制数据:', copyData)
|
|
|
|
|
|
|
|
- // 如果是组长,确保 leaderId 正确
|
|
|
|
|
- if (item.isLeader) {
|
|
|
|
|
- team.leaderId = item.memberId
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ // 调用复制接口
|
|
|
|
|
+ const res = await EquipPipeSchedulingApi.copyEquipPipeScheduling(copyData)
|
|
|
|
|
+ return res
|
|
|
|
|
+ })
|
|
|
|
|
|
|
|
- const teamList = Array.from(teamMap.values())
|
|
|
|
|
|
|
+ // 处理修改的行
|
|
|
|
|
+ const updatePromises = modifiedRows.map(async (row) => {
|
|
|
|
|
+ // 从 teamList 构建提交数据
|
|
|
|
|
+ const teamList = (row.teamList || []).map(team => ({
|
|
|
|
|
+ groupTeamId: team.groupTeamId,
|
|
|
|
|
+ leaderId: team.leaders?.[0]?.id || '',
|
|
|
|
|
+ memberIdList: team.members?.map(member => member.id) || []
|
|
|
|
|
+ }))
|
|
|
|
|
|
|
|
- return {
|
|
|
|
|
|
|
+ const updateData = {
|
|
|
id: row.id,
|
|
id: row.id,
|
|
|
date: row.date,
|
|
date: row.date,
|
|
|
teamList: teamList
|
|
teamList: teamList
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ console.log('更新数据:', updateData)
|
|
|
|
|
+
|
|
|
|
|
+ // 调用更新接口
|
|
|
|
|
+ const res = await EquipPipeSchedulingApi.setShiftSchedule([updateData])
|
|
|
|
|
+ return res
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- console.log('提交数据:', submitData)
|
|
|
|
|
|
|
+ // 执行所有操作
|
|
|
|
|
+ await Promise.all([...copyPromises, ...updatePromises])
|
|
|
|
|
|
|
|
- const res = await EquipPipeSchedulingApi.setShiftSchedule(submitData)
|
|
|
|
|
- if (res) {
|
|
|
|
|
- ElMessage.success(`成功提交 ${copiedRows.length} 条数据`)
|
|
|
|
|
- // 标记为已提交
|
|
|
|
|
- copiedRows.forEach(row => {
|
|
|
|
|
- row.submitted = true
|
|
|
|
|
- })
|
|
|
|
|
- // 刷新数据
|
|
|
|
|
- await handleQuery()
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const totalCount = copiedRows.length + modifiedRows.length
|
|
|
|
|
+ ElMessage.success(`成功提交 ${totalCount} 条数据`)
|
|
|
|
|
+
|
|
|
|
|
+ // 刷新数据
|
|
|
|
|
+ await handleQuery()
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('提交失败:', error)
|
|
console.error('提交失败:', error)
|
|
|
ElMessage.error('提交失败')
|
|
ElMessage.error('提交失败')
|
|
@@ -647,129 +728,39 @@ const handleSubmit = async () => {
|
|
|
const handleQuery = async () => {
|
|
const handleQuery = async () => {
|
|
|
loading.value = true
|
|
loading.value = true
|
|
|
|
|
|
|
|
- // 清除表格排序状态
|
|
|
|
|
|
|
+ // 清除单选状态
|
|
|
if (tableRef.value) {
|
|
if (tableRef.value) {
|
|
|
- tableRef.value.clearSort()
|
|
|
|
|
- // 清除单选状态
|
|
|
|
|
tableRef.value.setCurrentRow(null)
|
|
tableRef.value.setCurrentRow(null)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 清空选中的行
|
|
|
|
|
- selectedRows.value = []
|
|
|
|
|
-
|
|
|
|
|
queryParams.relateDepartment = props.relateDepartment
|
|
queryParams.relateDepartment = props.relateDepartment
|
|
|
const res = await EquipPipeSchedulingApi.planSchedulingShiftSchedule(queryParams)
|
|
const res = await EquipPipeSchedulingApi.planSchedulingShiftSchedule(queryParams)
|
|
|
|
|
|
|
|
- // 处理数据并按检验员日期分组展开
|
|
|
|
|
- const expandedRows: ScheduleRow[] = []
|
|
|
|
|
- let rowIndex = 0;
|
|
|
|
|
-
|
|
|
|
|
- res.forEach((row) => {
|
|
|
|
|
- const taskItem = row.taskItems[0];
|
|
|
|
|
- const baseDate = formatArrayDate(row.date)
|
|
|
|
|
-
|
|
|
|
|
- // 提取所有唯一的日期
|
|
|
|
|
- const dateSet = new Set<string>()
|
|
|
|
|
- dateSet.add(baseDate) // 添加基础日期
|
|
|
|
|
-
|
|
|
|
|
- // 从 teamList 中收集所有检验员的日期
|
|
|
|
|
- if (row.teamList && row.teamList.length > 0) {
|
|
|
|
|
- row.teamList.forEach(team => {
|
|
|
|
|
- // 检查组长的日期
|
|
|
|
|
- if (team.leaders && team.leaders.length > 0) {
|
|
|
|
|
- team.leaders.forEach(leader => {
|
|
|
|
|
- if (leader.date && Array.isArray(leader.date)) {
|
|
|
|
|
- dateSet.add(formatArrayDate(leader.date))
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
- // 检查组员的日期
|
|
|
|
|
- if (team.members && team.members.length > 0) {
|
|
|
|
|
- team.members.forEach(member => {
|
|
|
|
|
- if (member.date && Array.isArray(member.date)) {
|
|
|
|
|
- dateSet.add(formatArrayDate(member.date))
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 为每个唯一日期创建一行
|
|
|
|
|
- const uniqueDates = Array.from(dateSet).sort()
|
|
|
|
|
-
|
|
|
|
|
- uniqueDates.forEach((dateStr, index) => {
|
|
|
|
|
- const newRow: ScheduleRow = {
|
|
|
|
|
- ...row,
|
|
|
|
|
- date: dateStr,
|
|
|
|
|
- index: rowIndex++,
|
|
|
|
|
- week: calculateWeek(dateStr),
|
|
|
|
|
- unitName: taskItem.unitName,
|
|
|
|
|
- pipeAddress: taskItem.pipeAddress,
|
|
|
|
|
- checkType: taskItem.checkType,
|
|
|
|
|
- medium: row.pipeMedium.filter((medium, idx, self) => self.indexOf(medium) === idx),
|
|
|
|
|
- contact: [...new Set(row.taskItems?.map(item => item.contact).filter(Boolean))].join('/') || '',
|
|
|
|
|
- contactPhone: [...new Set(row.taskItems?.map(item => item.contactPhone).filter(Boolean))].join('/') || '',
|
|
|
|
|
- pipeLengthTotal: row.taskItems?.reduce((acc, cur) => acc + (parseFloat(cur.pipeLengthTotal) || 0), 0),
|
|
|
|
|
- lastReportNo: taskItem.checkType == 100 ? taskItem.lastLegalPeriodicalInspectionReportNo : taskItem.lastYearReportNo,
|
|
|
|
|
- lastMaintenanceReportNo: taskItem.lastMaintenanceReportNo,
|
|
|
|
|
- street: (taskItem.equipDistrictName || '') + (taskItem.equipStreetName || ''),
|
|
|
|
|
- teamList: row.teamList ? JSON.parse(JSON.stringify(row.teamList)) : [],
|
|
|
|
|
- isCopied: false,
|
|
|
|
|
- submitted: false
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 初始化检验员数据 - 根据当前行的日期筛选检验员
|
|
|
|
|
- if (newRow.teamList && newRow.teamList.length > 0) {
|
|
|
|
|
- const checkerItems: CheckerItem[] = []
|
|
|
|
|
-
|
|
|
|
|
- newRow.teamList.forEach(team => {
|
|
|
|
|
- // 添加组长(如果组长的日期匹配当前行日期或没有指定日期)
|
|
|
|
|
- if (team.leaders && team.leaders.length > 0) {
|
|
|
|
|
- team.leaders.forEach(leader => {
|
|
|
|
|
- const leaderDate = leader.date && Array.isArray(leader.date) ? formatArrayDate(leader.date) : baseDate
|
|
|
|
|
- if (leaderDate === dateStr) {
|
|
|
|
|
- checkerItems.push({
|
|
|
|
|
- groupTeamId: team.groupTeamId,
|
|
|
|
|
- memberId: leader.id,
|
|
|
|
|
- leaderId: leader.id,
|
|
|
|
|
- member: leader,
|
|
|
|
|
- isLeader: true
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 添加组员(如果组员的日期匹配当前行日期或没有指定日期)
|
|
|
|
|
- if (team.members && team.members.length > 0) {
|
|
|
|
|
- team.members.forEach(member => {
|
|
|
|
|
- const memberDate = member.date && Array.isArray(member.date) ? formatArrayDate(member.date) : baseDate
|
|
|
|
|
- if (memberDate === dateStr) {
|
|
|
|
|
- checkerItems.push({
|
|
|
|
|
- groupTeamId: team.groupTeamId,
|
|
|
|
|
- memberId: member.id,
|
|
|
|
|
- leaderId: team.leaders?.[0]?.id || '',
|
|
|
|
|
- member: member,
|
|
|
|
|
- isLeader: false
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- newRow.checkerItems = checkerItems
|
|
|
|
|
- newRow.checkers = checkerItems.map(c => c.memberId)
|
|
|
|
|
- } else {
|
|
|
|
|
- newRow.checkerItems = []
|
|
|
|
|
- newRow.checkers = []
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- expandedRows.push(newRow)
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- // 按日期排序
|
|
|
|
|
- expandedRows.sort((a, b) => dayjs(a.date).valueOf() - dayjs(b.date).valueOf())
|
|
|
|
|
- tableData.value = expandedRows
|
|
|
|
|
|
|
+ // 处理后端返回的null值
|
|
|
|
|
+ tableData.value = (res || []).map((item, index) => ({
|
|
|
|
|
+ ...item,
|
|
|
|
|
+ index,
|
|
|
|
|
+ date: item.date ? dayjs(item.date).format('YYYY-MM-DD') : '',
|
|
|
|
|
+ week: item.week || '',
|
|
|
|
|
+ checkers: item.checkers || [],
|
|
|
|
|
+ teamList: item.teamList || [],
|
|
|
|
|
+ checkType: item.checkType || '',
|
|
|
|
|
+ unitName: item.unitName || '',
|
|
|
|
|
+ pipeAddress: item.pipeAddress || '',
|
|
|
|
|
+ contact: item.contact || '',
|
|
|
|
|
+ contactPhone: item.contactPhone || '',
|
|
|
|
|
+ pipeMedium: item.pipeMedium || [],
|
|
|
|
|
+ pipeLengthTotal: item.pipeLengthTotal || '',
|
|
|
|
|
+ equipDistrictName: item.equipDistrictName || '',
|
|
|
|
|
+ equipStreetName: item.equipStreetName || '',
|
|
|
|
|
+ lastLegalPeriodicalInspectionReportNo: item.lastLegalPeriodicalInspectionReportNo || '',
|
|
|
|
|
+ lastYearReportNo: item.lastYearReportNo || '',
|
|
|
|
|
+ lastMaintenanceReportNo: item.lastMaintenanceReportNo || '',
|
|
|
|
|
+ confirmOrderId: item.confirmOrderId || '',
|
|
|
|
|
+ status: item.status,
|
|
|
|
|
+ isCopied: false,
|
|
|
|
|
+ submitted: true
|
|
|
|
|
+ }))
|
|
|
loading.value = false
|
|
loading.value = false
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -898,6 +889,15 @@ watch(() => props.month, async (newMonth, oldMonth) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 修改的行高亮显示
|
|
|
|
|
+ :deep(.el-table__row.modified-row) {
|
|
|
|
|
+ background-color: #e7f3ff !important;
|
|
|
|
|
+
|
|
|
|
|
+ td {
|
|
|
|
|
+ background-color: #e7f3ff !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
:deep(.el-table__row td:first-child) {
|
|
:deep(.el-table__row td:first-child) {
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
color: #113355;
|
|
color: #113355;
|