日计划管理模块接口调试

This commit is contained in:
BianLzhaoMin 2025-12-29 18:43:38 +08:00
parent 717c31f21f
commit 4d59cb2325
6 changed files with 271 additions and 97 deletions

View File

@ -44,3 +44,12 @@ export function delDailyPlanAPI(data) {
data,
})
}
// 日计划管理- 获取日计划详情
export function getDailyPlanDetailAPI(data) {
return request({
url: '/dayPlan/getDayPlanById',
method: 'GET',
params: data,
})
}

View File

@ -60,21 +60,77 @@ export const tableColumns = [
{ prop: 'planMajorName', label: '专业', fixed: true },
{ prop: 'projectName', label: '项目名称', fixed: true },
{ prop: 'workContent', label: '工作任务' },
{ prop: 'riskLevelName', label: '风险等级' },
{ prop: 'categoryName', label: '计划工作量(基)' },
{ prop: 'riskLevel', label: '风险等级' },
{ prop: 'plannedWorkload', label: '计划工作量(基)' },
]
export const tableColumns_1 = [
{ prop: 'stationName', label: '拟投入作业人员数量', fixed: false },
{ prop: 'majorName', label: '拟投入作业人员姓名', fixed: false },
{ prop: 'businessTypeName', label: '拟投入车辆', fixed: false },
{ prop: 'projectName', label: '实际投入作业人员数量', fixed: false },
{ prop: 'workTask', label: '实际投入作业人员姓名', fixed: false },
{ prop: 'riskLevelName', label: '实际投入车辆', fixed: false },
{ prop: 'categoryName', label: '实际完成工作量明细', fixed: false },
{ prop: 'categoryName', label: '实际完成工作量(基)', fixed: false },
{ prop: 'categoryName', label: '完成比例', fixed: false },
{ prop: 'categoryName', label: '作业计划完成情况', fixed: false },
{ prop: 'categoryName', label: '计划变更及未完成情况说明', fixed: false },
{
prop: 'stationName',
label: '拟投入作业人员数量',
fixed: false,
formatter: (row) => {
return row.proposedPersonnelList?.filter((item) => item.dataSource == 0).length || ''
},
},
{
prop: 'majorName',
label: '拟投入作业人员姓名',
fixed: false,
width: '180',
formatter: (row) => {
return (
row.proposedPersonnelList
?.filter((item) => item.dataSource == 0)
.map((item) => item.name)
.join(',') || ''
)
},
},
{
prop: 'proposedLongTimeCar',
label: '拟投入车辆',
fixed: false,
width: '180',
formatter: (row) => {
return `长租车${row.proposedLongTimeCar}辆,临租车${row.proposedTemporaryCar}` || ''
},
},
{
prop: 'projectName',
label: '实际投入作业人员数量',
fixed: false,
formatter: (row) => {
return row.proposedPersonnelList?.filter((item) => item.dataSource == 1).length || ''
},
},
{
prop: 'workTask',
label: '实际投入作业人员姓名',
fixed: false,
formatter: (row) => {
return (
row.proposedPersonnelList
?.filter((item) => item.dataSource == 1)
.map((item) => item.name)
.join(',') || ''
)
},
},
{
prop: 'actualLongTimeCar',
label: '实际投入车辆',
fixed: false,
formatter: (row) => {
return `长租车${row.actualLongTimeCar}辆,临租车${row.actualTemporaryCar}` || ''
},
},
{ prop: 'actualWorkContent', label: '实际完成工作内容', fixed: false },
{ prop: 'actualWorkload', label: '实际完成工作量(基)', fixed: false },
{ prop: 'completionPercentage', label: '完成比例', fixed: false },
{ prop: 'planCompletionStatus', label: '作业计划完成情况', fixed: false },
{ prop: 'planChanges', label: '计划变更及未完成情况说明', fixed: false },
]
export const tableColumns_2 = [
{ prop: 'stationName', label: '拟投入高处作业人员数量', fixed: false },

View File

@ -174,7 +174,7 @@ import {
} from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { getPersonnelCommonListAPI } from '@/api/common.js'
import { updateDailyPlanAPI } from '@/api/planMange/dailyPlan.js'
import { updateDailyPlanAPI, getDailyPlanDetailAPI } from '@/api/planMange/dailyPlan.js'
import { Search } from '@element-plus/icons-vue'
import { useOptions } from '@/hooks/useOptions'
import ComButton from '@/components/ComButton/index.vue'
@ -278,21 +278,21 @@ const getRepairFormData = () => ({
plannedWorkload: null, //
highAltitudePersonnelList: [], //
groundPersonnelList: [], //
skilledWorkerNum: null, //
skilledWorkerDay: null, //
auxiliaryWorkerNum: null, //
auxiliaryWorkerDay: null, //
proposedProficientPersonnel: null, //
proposedProficientDay: null, //
proposedAssistancePersonnel: null, //
proposedAssistanceDay: null, //
proposedLongTimeCar: null, //
proposedTemporaryCar: null, //
proposedSubcontractedCar: null, //
proposedSubCar: null, //
//
actualHighAltitudePersonnelList: [], //
actualGroundPersonnelList: [], //
actualSkilledWorkerNum: null, //
actualAuxiliaryWorkerNum: null, //
actualProficientPersonnel: null, //
actualAssistancePersonnel: null, //
actualLongTimeCar: null, //
actualTemporaryCar: null, //
actualSubcontractedCar: null, //
actualSubCar: null, //
actualWorkloadList: [
{
workloadCategoryId: '',
@ -366,26 +366,69 @@ const onSubmit = async () => {
//
const proposedPersonnelList = []
formData.value.planPersonnelList.forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 0,
})
})
formData.value.actualPersonnelList.forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 1,
})
})
const type = dayPlanType.value
//
if (type === '0' || type === 0) {
// /
;(formData.value.planPersonnelList || []).forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 0, //
})
})
;(formData.value.actualPersonnelList || []).forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 1, //
})
})
} else if (type === '1' || type === 1) {
// / &
;(formData.value.highAltitudePersonnelList || []).forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 2, //
})
})
;(formData.value.groundPersonnelList || []).forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 3, //
})
})
;(formData.value.actualHighAltitudePersonnelList || []).forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 4, //
})
})
;(formData.value.actualGroundPersonnelList || []).forEach((item) => {
proposedPersonnelList.push({
dayPlanId: route.query.id,
inspectionStationName: item.inspectionStationName,
personnelld: item.id,
name: item.name,
dataSource: 5, //
})
})
}
// 使
const {
inspectionStationName,
projectName,
@ -393,13 +436,21 @@ const onSubmit = async () => {
dayPlan,
planPersonnelList,
actualPersonnelList,
highAltitudePersonnelList,
groundPersonnelList,
actualHighAltitudePersonnelList,
actualGroundPersonnelList,
actualPersonnel,
planPersonnel,
proposedLongTimeCar,
actualWorkloadList,
...submitData
} = formData.value
submitData.proposedPersonnelList = proposedPersonnelList
submitData.workloadList = formData.value.actualWorkloadList
console.log('submitData日计划提交参数', submitData)
//
const result = await updateDailyPlanAPI(submitData)
if (result.code === 200) {
proxy.$modal.msgSuccess('保存成功')

View File

@ -72,7 +72,7 @@
<el-row :gutter="24">
<el-col :span="7">
<el-form-item prop="skilledWorkerNum">
<el-form-item prop="proposedProficientPersonnel">
<template #label>
<div style="display: flex; flex-direction: column">
<span>计划投入熟练工人员数量</span>
@ -92,28 +92,32 @@
maxlength="7"
show-word-limit
placeholder="熟练工人员数量"
:model-value="formData.skilledWorkerNum"
@update:model-value="(val) => updateField('skilledWorkerNum', val)"
:model-value="formData.proposedProficientPersonnel"
@update:model-value="
(val) => updateField('proposedProficientPersonnel', val)
"
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item
label="计划投入工日"
prop="skilledWorkerDay"
prop="proposedProficientDay"
label-width="120"
>
<el-input
clearable
maxlength="7"
placeholder="工日"
:model-value="formData.skilledWorkerDay"
@update:model-value="(val) => updateField('skilledWorkerDay', val)"
:model-value="formData.proposedProficientDay"
@update:model-value="
(val) => updateField('proposedProficientDay', val)
"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item prop="auxiliaryWorkerNum">
<el-form-item prop="proposedAssistancePersonnel">
<template #label>
<div style="display: flex; flex-direction: column">
<span>计划投入辅助工人员数量</span>
@ -133,9 +137,9 @@
maxlength="7"
show-word-limit
placeholder="辅助工人员数量"
:model-value="formData.auxiliaryWorkerNum"
:model-value="formData.proposedAssistancePersonnel"
@update:model-value="
(val) => updateField('auxiliaryWorkerNum', val)
(val) => updateField('proposedAssistancePersonnel', val)
"
/>
</el-form-item>
@ -143,16 +147,16 @@
<el-col :span="5">
<el-form-item
label="计划投入工日"
prop="auxiliaryWorkerDay"
prop="proposedAssistanceDay"
label-width="120"
>
<el-input
clearable
maxlength="7"
placeholder="工日"
:model-value="formData.auxiliaryWorkerDay"
:model-value="formData.proposedAssistanceDay"
@update:model-value="
(val) => updateField('auxiliaryWorkerDay', val)
(val) => updateField('proposedAssistanceDay', val)
"
/>
</el-form-item>
@ -201,16 +205,14 @@
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="拟投入分包车" prop="proposedSubcontractedCar">
<el-form-item label="拟投入分包车" prop="proposedSubCar">
<el-input
clearable
maxlength="7"
show-word-limit
placeholder="请输入分包车数量"
:model-value="formData.proposedSubcontractedCar"
@update:model-value="
(val) => updateField('proposedSubcontractedCar', val)
"
:model-value="formData.proposedSubCar"
@update:model-value="(val) => updateField('proposedSubCar', val)"
>
<template #suffix>
<span class="input-suffix"></span>
@ -283,7 +285,7 @@
<el-row :gutter="24">
<el-col :span="12">
<el-form-item prop="actualSkilledWorkerNum">
<el-form-item prop="actualProficientPersonnel">
<template #label>
<div style="display: flex; flex-direction: column">
<span>实际投入检修熟练工数量</span>
@ -303,16 +305,16 @@
maxlength="7"
show-word-limit
placeholder="熟练工人员数量"
:model-value="formData.actualSkilledWorkerNum"
:model-value="formData.actualProficientPersonnel"
@update:model-value="
(val) => updateField('actualSkilledWorkerNum', val)
(val) => updateField('actualProficientPersonnel', val)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="actualAuxiliaryWorkerNum">
<el-form-item prop="actualAssistancePersonnel">
<template #label>
<div style="display: flex; flex-direction: column">
<span>实际投入检修辅助工数量</span>
@ -332,9 +334,9 @@
maxlength="7"
show-word-limit
placeholder="辅助工人员数量"
:model-value="formData.actualAuxiliaryWorkerNum"
:model-value="formData.actualAssistancePersonnel"
@update:model-value="
(val) => updateField('actualAuxiliaryWorkerNum', val)
(val) => updateField('actualAssistancePersonnel', val)
"
/>
</el-form-item>
@ -381,16 +383,14 @@
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="实际投入分包车" prop="actualSubcontractedCar">
<el-form-item label="实际投入分包车" prop="actualSubCar">
<el-input
clearable
maxlength="7"
show-word-limit
placeholder="请输入分包车数量"
:model-value="formData.actualSubcontractedCar"
@update:model-value="
(val) => updateField('actualSubcontractedCar', val)
"
:model-value="formData.actualSubCar"
@update:model-value="(val) => updateField('actualSubCar', val)"
>
<template #suffix>
<span class="input-suffix"></span>
@ -596,10 +596,9 @@ const { options: planWorkLoadCategoryOptions } = useOptions(
//
const planCompletionStatusOptions = [
{ label: '已完成', value: '1' },
{ label: '部分完成', value: '2' },
{ label: '未完成', value: '3' },
{ label: '已取消', value: '4' },
{ label: '完成', value: '完成' },
{ label: '进行中', value: '进行中' },
{ label: '未完成', value: '未完成' },
]
//
@ -718,19 +717,19 @@ const rules = computed(() => ({
groundPersonnelList: [
{ required: true, message: '请选择拟投入地面作业人员', trigger: 'change' },
],
skilledWorkerNum: [
proposedProficientPersonnel: [
{ required: true, message: '请输入计划投入熟练工人员数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
skilledWorkerDay: [
proposedProficientDay: [
{ required: true, message: '请输入计划投入工日', trigger: 'blur' },
{ pattern: positiveIntegerPattern, message: '请输入正整数', trigger: 'blur' },
],
auxiliaryWorkerNum: [
proposedAssistancePersonnel: [
{ required: true, message: '请输入计划投入辅助工人员数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
auxiliaryWorkerDay: [
proposedAssistanceDay: [
{ required: true, message: '请输入计划投入工日', trigger: 'blur' },
{ pattern: positiveIntegerPattern, message: '请输入正整数', trigger: 'blur' },
],
@ -742,7 +741,7 @@ const rules = computed(() => ({
{ required: true, message: '请输入拟投入临租车数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
proposedSubcontractedCar: [
proposedSubCar: [
{ required: true, message: '请输入拟投入分包车数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
@ -757,11 +756,11 @@ const actualRules = computed(() => {
actualGroundPersonnelList: [
{ required: true, message: '请选择实际投入地面作业人员', trigger: 'change' },
],
actualSkilledWorkerNum: [
actualProficientPersonnel: [
{ required: true, message: '请输入实际投入检修熟练工数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
actualAuxiliaryWorkerNum: [
actualAssistancePersonnel: [
{ required: true, message: '请输入实际投入检修辅助工数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
@ -773,7 +772,7 @@ const actualRules = computed(() => {
{ required: true, message: '请输入实际投入临租车数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
actualSubcontractedCar: [
actualSubCar: [
{ required: true, message: '请输入实际投入分包车数量', trigger: 'blur' },
{ pattern: nonNegativeIntegerPattern, message: '请输入非负整数', trigger: 'blur' },
],
@ -916,7 +915,7 @@ const onCancelActualCompletion = () => {
actualAuxiliaryWorkerNum: null,
actualLongTimeCar: null,
actualTemporaryCar: null,
actualSubcontractedCar: null,
actualSubCar: null,
actualWorkloadList: [
{
workloadCategoryId: '',

View File

@ -224,15 +224,15 @@
@update:model-value="
(val) => updateField('planCompletionStatus', val)
"
placeholder="请选择作业计划完成情况"
clearable
style="width: 100%"
placeholder="请选择作业计划完成情况"
>
<el-option
v-for="item in planCompletionStatusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in planCompletionStatusOptions"
/>
</el-select>
</el-form-item>
@ -301,10 +301,9 @@ const showActualCompletion = ref(false)
//
const planCompletionStatusOptions = [
{ label: '已完成', value: '1' },
{ label: '部分完成', value: '2' },
{ label: '未完成', value: '3' },
{ label: '已取消', value: '4' },
{ label: '完成', value: '完成' },
{ label: '进行中', value: '进行中' },
{ label: '未完成', value: '未完成' },
]
//

View File

@ -7,7 +7,9 @@
<el-radio-button label="项目部" value="2" />
</el-radio-group>
<ComButton type="info" plain icon="Download"> 下载统计表 </ComButton>
<ComButton type="info" plain icon="Download" @click="onDownloadStatistic">
下载统计表
</ComButton>
</el-card>
<!-- 日计划填报管理列表 -->
<ComTable
@ -23,12 +25,12 @@
>
<template #toolbar>
<ComButton type="primary" icon="Plus" @click="onHandleAdd">新增日计划</ComButton>
<ComButton type="primary" icon="Plus" @click="onHandleEdit">编辑调试</ComButton>
<ComButton
plain
type="info"
icon="Download"
v-if="['检修', '项目部'].includes(tableType)"
@click="onDownloadWorkloadSummary"
v-if="['1', '2'].includes(tableType)"
>
下载工作量统计表
</ComButton>
@ -50,8 +52,10 @@
<script setup name="MonthlyPlan">
import { ref, computed, getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { listPlanAPI, delPlanAPI } from '@/api/planMange/plan.js'
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'
@ -60,8 +64,15 @@ import AddForm from './addForm.vue'
const router = useRouter()
const { proxy } = getCurrentInstance()
const dictStore = useDictStore()
const { tableColumns, tableColumns_1, tableColumns_2, dialogConfig, buildFormColumns } = config
const {
tableColumns: baseTableColumns,
tableColumns_1,
tableColumns_2,
dialogConfig,
buildFormColumns,
} = config
const comTableRef = ref(null)
const addFormRef = ref(null)
@ -69,9 +80,34 @@ const tableType = ref('0')
// 使
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)
}
}
// formatter
const tableColumns = computed(() => {
return baseTableColumns.map((column) => {
if (column.prop === 'riskLevel') {
return {
...column,
// 使 formatter
formatter: createDynamicDictFormatter('plan_risk_level', 'riskLevel'),
}
}
return column
})
})
const initTableColumns = computed(() => {
if (tableType.value === '0') return [...tableColumns, ...tableColumns_1]
if (tableType.value !== '0') return [...tableColumns, ...tableColumns_2]
if (tableType.value === '0') return [...tableColumns.value, ...tableColumns_1]
if (tableType.value !== '0') return [...tableColumns.value, ...tableColumns_2]
})
//
@ -119,7 +155,7 @@ const actionColumns = computed(() => [
type: 'danger',
link: true,
handler: (row) => {
proxy.$modal.confirm('是否确认删除该计划?').then(async () => {
proxy.$modal.confirm('是否确认删除该计划?').then(async () => {
const result = await delDailyPlanAPI({ dayPlanId: row.dayPlanId })
if (result.code === 200) {
proxy.$modal.msgSuccess('删除成功')
@ -173,6 +209,30 @@ const onHandleEdit = () => {
},
})
}
//
const onDownloadStatistic = () => {
proxy.download(
'/download/dayPlanStatistics',
{
dayPlanType: tableType.value,
startDate: dayjs().startOf('month').format('YYYY-MM-DD'),
endDate: dayjs().endOf('month').format('YYYY-MM-DD'),
},
`日计划统计表.xlsx`,
)
}
//
const onDownloadWorkloadSummary = () => {
proxy.download(
'/monthlyPlan/exportWorkloadSummary',
{
dayPlanType: tableType.value,
},
`${tableType.value === '1' ? '检修' : '项目部'}统计表.xlsx`,
)
}
</script>
<style scoped lang="scss">