yn_digital_gadgets_web/src/views/planMange/dailyPlan/index.vue

349 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<el-card class="top-radio">
<el-radio-group v-model="tableType">
<el-radio-button label="运行" value="0" />
<el-radio-button label="检修" value="1" />
<el-radio-button label="项目部" value="2" />
</el-radio-group>
<ComButton
type="info"
plain
icon="Download"
@click="onDownloadStatistic"
v-hasPermi="['plan:dailyPlan:downloadStatistic']"
>
下载统计表
</ComButton>
</el-card>
<!-- 日计划填报管理列表 -->
<ComTable
ref="comTableRef"
:key="tableType"
:show-toolbar="true"
:show-action="true"
:form-columns="formColumns"
:load-data="listDailyPlanAPI"
:table-columns="initTableColumns"
:action-columns="actionColumns"
:defaultQueryParams="{ dayPlanType: tableType }"
:default-form-data="defaultFormData"
>
<template #proposedLongTimeCar="{ row }">
<span v-if="row.proposedLongTimeCar && row.proposedTemporaryCar">
长租车{{ row.proposedLongTimeCar }}辆
<br />
临租车{{ row.proposedTemporaryCar }}辆
</span>
</template>
<template #actualLongTimeCar="{ row }">
<span v-if="row.actualLongTimeCar && row.actualTemporaryCar">
长租车{{ row.actualLongTimeCar }}辆
<br />
临租车{{ row.actualTemporaryCar }}辆
</span>
</template>
<template #toolbar>
<ComButton
type="primary"
icon="Plus"
@click="onHandleAdd"
v-hasPermi="['plan:dailyPlan:add']"
>
新增日完成情况
</ComButton>
<ComButton
plain
type="info"
icon="Download"
v-if="['0'].includes(tableType)"
@click="onDownloadWorkloadSummary"
v-hasPermi="['plan:dailyPlan:downloadWorkloadSummary']"
>
下载工作量统计表
</ComButton>
</template>
</ComTable>
<ComDialog :dialog-config="dialogConfig" @closeDialogOuter="onCloseDialogOuter">
<template #outerContent>
<AddForm ref="addFormRef" />
<el-row class="common-btn-row fixed-bottom">
<ComButton plain type="info" @click="onHandleCancel">取消</ComButton>
<ComButton @click="onHandleSave">保存</ComButton>
</el-row>
</template>
</ComDialog>
</div>
</template>
<script setup name="MonthlyPlan">
import { ref, computed, getCurrentInstance, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { listDailyPlanAPI, delDailyPlanAPI, addDailyPlanAPI } from '@/api/planMange/dailyPlan.js'
import useDictStore from '@/store/modules/dict'
import { selectDictLabel } from '@/utils/ruoyi'
import dayjs from 'dayjs'
import config from './config'
import ComTable from '@/components/ComTable/index.vue'
import ComButton from '@/components/ComButton/index.vue'
import ComDialog from '@/components/ComDialog/index.vue'
import AddForm from './addForm.vue'
const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance()
const dictStore = useDictStore()
const {
tableColumns: baseTableColumns,
tableColumns_1,
tableColumns_2,
dialogConfig,
buildFormColumns,
} = config
const comTableRef = ref(null)
const addFormRef = ref(null)
const tableType = ref(route.query.dayPlanType || '0')
// 默认表单数据:日期区间默认为当月
const defaultFormData = computed(() => ({
month: [
dayjs().startOf('month').format('YYYY-MM-DD'),
dayjs().endOf('month').format('YYYY-MM-DD'),
],
}))
onMounted(() => {
if (route.query.dayPlanType) {
tableType.value = route.query.dayPlanType
}
})
// 加载字典数据,确保字典数据在表格渲染前已经加载
const { plan_risk_level } = proxy.useDict('plan_risk_level')
// 搜索表单配置(当前月计划场景暂不依赖下拉接口,直接使用静态配置)
const formColumns = computed(() => buildFormColumns())
// 创建动态 formatter 函数,每次执行时从 store 获取最新的字典数据
const createDynamicDictFormatter = (dictType, fieldName = null) => {
return (row, column, cellValue) => {
const value = fieldName ? row[fieldName] : cellValue
// 每次执行时都从 store 获取最新的字典数据
const dictData = dictStore.getDict(dictType) || []
return selectDictLabel(dictData, value) || value
}
}
// 构建表格列配置,添加字典映射的 formatter
const tableColumns = computed(() => {
return baseTableColumns.map((column) => {
if (column.prop === 'riskLevel') {
return {
...column,
// 使用动态 formatter每次执行时都会获取最新的字典数据
formatter: createDynamicDictFormatter('plan_risk_level', 'riskLevel'),
}
}
return column
})
})
// 处理 tableColumns_2根据 tableType 区分实际完成工作内容的显示方式
const processedTableColumns_2 = computed(() => {
return tableColumns_2.map((column) => {
// 实际完成工作内容字段需要根据类型区分
if (column.label === '实际完成工作内容') {
return {
...column,
formatter: (row) => {
// 检修类型type === '1'):使用 actualWorkloadList 遍历
if (tableType.value === '1') {
return (
row.workloadList?.map((item) => item.workloadCategoryName).join(',') ||
''
)
}
// 项目部类型type === '2'):使用 actualWorkContent 直接显示
if (tableType.value === '2') {
return row.actualWorkContent || ''
}
return ''
},
}
}
return column
})
})
const initTableColumns = computed(() => {
if (tableType.value === '0') return [...tableColumns.value, ...tableColumns_1]
if (tableType.value !== '0') return [...tableColumns.value, ...processedTableColumns_2.value]
})
// 判断日期是否为今天之前
const isBeforeToday = (dayPlan) => {
if (!dayPlan) return false
const planDate = dayjs(dayPlan)
const today = dayjs().startOf('day')
return planDate.isBefore(today)
}
// 操作列
const actionColumns = computed(() => [
{
label: '详情',
type: 'primary',
link: true,
permission: ['plan:dailyPlan:detail'], // 权限控制:使用 v-hasPermi 指令控制按钮显示
handler: (row) => {
router.push({
path: '/plan/dailyPlanEdit/index',
query: {
id: row.planId || row.dayPlanId,
mode: 'detail',
dayPlanType: tableType.value,
inspectionStationName: row.inspectionStationName,
projectName: row.projectName,
planMajorName: row.planMajorName,
dayPlan: row.dayPlan,
},
})
},
},
{
label: '编辑',
type: 'primary',
link: true,
permission: ['plan:dailyPlan:edit'], // 权限控制:使用 v-hasPermi 指令控制按钮显示
// disabled: (row) => isBeforeToday(row.dayPlan), // 当日期为今天之前时禁用
disabled: false, // 当日期为今天之前时禁用
handler: (row) => {
router.push({
path: '/plan/dailyPlanEdit/index',
query: {
id: row.planId || row.dayPlanId,
mode: 'edit',
dayPlanType: tableType.value,
inspectionStationName: row.inspectionStationName,
projectName: row.projectName,
planMajorName: row.planMajorName,
dayPlan: row.dayPlan,
},
})
},
},
{
label: '删除',
type: 'danger',
link: true,
permission: ['plan:dailyPlan:remove'], // 权限控制:使用 v-hasPermi 指令控制按钮显示
disabled: (row) => isBeforeToday(row.dayPlan), // 当日期为今天之前时禁用
handler: (row) => {
proxy.$modal.confirm('是否确认删除该日计划?').then(async () => {
const result = await delDailyPlanAPI({ dayPlanId: row.dayPlanId })
if (result.code === 200) {
proxy.$modal.msgSuccess('删除成功')
comTableRef.value?.refresh()
}
})
},
},
])
// 新增
const onHandleAdd = () => {
dialogConfig.outerVisible = true
}
// 取消
const onHandleCancel = () => {
dialogConfig.outerVisible = false
}
// 保存
const onHandleSave = async () => {
await addFormRef.value.validate()
const paramsList = addFormRef.value.getSelectedTasks().map((item) => ({
dayPlan: addFormRef.value.getCurrentDate(),
monthlyPlanId: item.monthlyPlanId,
dayPlanType: tableType.value,
riskLevel: item.riskLevel,
}))
const result = await addDailyPlanAPI(paramsList)
if (result.code === 200) {
proxy.$modal.msgSuccess('保存成功')
dialogConfig.outerVisible = false
comTableRef.value?.refresh()
}
}
// 关闭弹框统一处理
const onCloseDialogOuter = (visible) => {
dialogConfig.outerVisible = visible
}
// 编辑调试
const onHandleEdit = () => {
router.push({
path: '/plan/dailyPlanEdit/index',
query: {
mode: 'edit',
dayPlanType: tableType.value,
},
})
}
// 下载统计表
const onDownloadStatistic = () => {
// 获取查询表单的日期数据
const formData = comTableRef.value?.searchFormRef?.getFormData() || {}
const startDate = formData.startDate || dayjs().startOf('month').format('YYYY-MM-DD')
const endDate = formData.endDate || dayjs().endOf('month').format('YYYY-MM-DD')
proxy.download(
'/download/dayPlanStatistics',
{
dayPlanType: tableType.value,
startDate,
endDate,
},
`日计划统计表.xlsx`,
)
}
// 下载工作量统计表
const onDownloadWorkloadSummary = () => {
// 获取查询表单的日期数据
const formData = comTableRef.value?.searchFormRef?.getFormData() || {}
const startDate = formData.startDate || dayjs().startOf('month').format('YYYY-MM-DD')
const endDate = formData.endDate || dayjs().endOf('month').format('YYYY-MM-DD')
proxy.download(
'/dayPlan/exportWorkloadSummary',
{
dayPlanType: tableType.value,
startDate,
endDate,
},
`${tableType.value === '1' ? '检修' : '项目部'}统计表.xlsx`,
)
}
</script>
<style scoped lang="scss">
.top-radio {
margin-bottom: 10px;
:deep(.el-card__body) {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 20px !important;
}
}
</style>