zxl
2025-03-25 6ae0fcef149ddbe614746023a58a3885b3ac4bde
src/views/projectManage/progress/progressRecord.vue
@@ -1,8 +1,8 @@
<template>
  <div class="app-container">
    <el-container>
      <el-header v-show="planRecordData && planRecordData.projectName" class="header-title">项目名称:{{ planRecordData.projectName }}</el-header>
      <h4 v-show="planRecordData && planRecordData.projectCode" style="text-align: center">项目代码:{{ planRecordData.projectCode }}</h4>
      <el-header v-show="projectInfoData && projectInfoData.projectName" class="header-title">项目名称:{{ projectInfoData.projectName }}</el-header>
      <h4 v-show="projectInfoData && projectInfoData.projectCode" style="text-align: center">项目代码:{{ projectInfoData.projectCode }}</h4>
      <el-main>
        <el-card shadow="hover">
          <el-row :gutter="20">
@@ -24,15 +24,44 @@
                    <el-table-column prop="title" label="事项名称" align="center" />
                    <el-table-column prop="progressStatus" label="进度情况" align="center">
                      <template slot-scope="scope">
                        {{ scope.row.progressStatus === 0 ? '未完成' : scope.row.progressStatus === 1 ? '待审核' : scope.row.progressStatus === 2 ? '已驳回' : '已完成'}}
                        {{ scope.row.progressStatus === 3 ? '已通过' : scope.row.progressStatus === 2 ? '已驳回' : scope.row.progressStatus === 1 ?'未审核' : '未开始'}}
                      </template>
                    </el-table-column>
                    <el-table-column prop="startTime" label="计划开始时间" align="center" />
                    <el-table-column prop="endTime" label="计划完成时间" align="center" />
                    <el-table-column fixed="right" label="操作" align="center">
                      <template slot-scope="scope">
                        <el-button type="primary" size="small" :disabled="scope.row.progressStatus === 1 || scope.row.progressStatus === 3" @click="handleProgressReport(scope.row)">进度上报</el-button>
                        <el-button type="primary" size="small" @click="handleCheckProgress(scope.row)">查看</el-button>
                        <div v-if="!projectInfoData.managerFlag">
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 0"
                            @click="handleProgressReport(scope.row)">进度上报</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 2"
                            @click="handleReportAgain(scope.row)">重新上报</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            icon="el-icon-view"
                            v-if="scope.row.progressStatus !== 0"
                            @click="handleCheckProgress(scope.row)">查看</el-button>
                        </div>
                        <div v-if="projectInfoData.managerFlag">
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 1"
                            @click="handleOpenExamine(scope.row)">审核</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            icon="el-icon-view"
                            v-if="scope.row.progressStatus === 2 || scope.row.progressStatus === 3"
                            @click="handleCheckProgress(scope.row)">查看</el-button>
                        </div>
                      </template>
                    </el-table-column>
                  </el-table>
@@ -52,15 +81,38 @@
                    <el-table-column prop="title" label="事项名称" align="center" />
                    <el-table-column prop="progressStatus" label="进度情况" align="center">
                      <template slot-scope="scope">
                        {{ scope.row.progressStatus === 0 ? '未完成' : scope.row.progressStatus === 1 ? '待审核' : scope.row.progressStatus === 2 ? '已驳回' : '已完成'}}
                        {{ scope.row.progressStatus === 3 ? '已通过' : scope.row.progressStatus === 2 ? '已驳回' : scope.row.progressStatus === 1 ?'未审核' : '未开始'}}
                      </template>
                    </el-table-column>
                    <el-table-column prop="startTime" label="计划开始时间" align="center" />
                    <el-table-column prop="endTime" label="计划完成时间" align="center" />
                    <el-table-column fixed="right" label="操作" align="center">
                      <template slot-scope="scope">
                        <el-button type="primary" size="small" :disabled="scope.row.progressStatus === 1 || scope.row.progressStatus === 3" @click="handleProgressReport(scope.row)">进度上报</el-button>
                        <el-button type="primary" size="small" @click="handleCheckProgress(scope.row)">查看</el-button>
                        <div v-if="!projectInfoData.managerFlag">
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 0"
                            @click="handleProgressReport(scope.row)">进度上报</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 2"
                            @click="handleReportAgain(scope.row)">重新上报</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            icon="el-icon-view"
                            v-if="scope.row.progressStatus !== 0"
                            @click="handleCheckProgress(scope.row)">查看</el-button>
                        </div>
                        <div v-if="projectInfoData.managerFlag">
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 1"
                            @click="handleOpenExamine(scope.row)">审核</el-button>
                        </div>
                      </template>
                    </el-table-column>
                  </el-table>
@@ -80,15 +132,38 @@
                    <el-table-column prop="title" label="事项名称" align="center" />
                    <el-table-column prop="progressStatus" label="进度情况" align="center">
                      <template slot-scope="scope">
                        {{ scope.row.progressStatus === 0 ? '未完成' : scope.row.progressStatus === 1 ? '待审核' : scope.row.progressStatus === 2 ? '已驳回' : '已完成'}}
                        {{ scope.row.progressStatus === 3 ? '已通过' : scope.row.progressStatus === 2 ? '已驳回' : scope.row.progressStatus === 1 ?'未审核' : '未开始'}}
                      </template>
                    </el-table-column>
                    <el-table-column prop="startTime" label="计划开始时间" align="center" />
                    <el-table-column prop="endTime" label="计划完成时间" align="center" />
                    <el-table-column fixed="right" label="操作" align="center">
                      <template slot-scope="scope">
                        <el-button type="primary" size="small" :disabled="scope.row.progressStatus === 1 || scope.row.progressStatus === 3" @click="handleProgressReport(scope.row)">进度上报</el-button>
                        <el-button type="primary" size="small" @click="handleCheckProgress(scope.row)">查看</el-button>
                        <div v-if="!projectInfoData.managerFlag">
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 0"
                            @click="handleProgressReport(scope.row)">进度上报</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 2"
                            @click="handleReportAgain(scope.row)">重新上报</el-button>
                          <el-button
                            type="text"
                            size="medium"
                            icon="el-icon-view"
                            v-if="scope.row.progressStatus !== 0"
                            @click="handleCheckProgress(scope.row)">查看</el-button>
                        </div>
                        <div v-if="projectInfoData.managerFlag">
                          <el-button
                            type="text"
                            size="medium"
                            v-if="scope.row.progressStatus === 1"
                            @click="handleOpenExamine(scope.row)">审核</el-button>
                        </div>
                      </template>
                    </el-table-column>
                  </el-table>
@@ -97,91 +172,194 @@
            </el-col>
            <div style="margin-bottom: 10px">
              <h1 style="font-size: 20px; font-weight: bold;">竣工报告</h1>
              <div style="display: flex; justify-content: center; align-items: center;">
                <el-upload
                    class="upload-demo"
                    drag
                    action="https://jsonplaceholder.typicode.com/posts/"
                    multiple>
                  <i class="el-icon-upload"></i>
                  <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                  <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
                </el-upload>
              <div style="display: flex;margin-left: 20px;">
                <file-upload v-model="projectProgressForm.completedReportFileList"
                             :fileType="projectProgressForm.accept"
                             :isShowTip="false"/>
              </div>
            </div>
            <div style="margin-bottom: 10px">
              <h1 style="font-size: 20px; font-weight: bold;">情况说明</h1>
              <div style="display: flex; justify-content: center; align-items: center;">
                <el-upload
                    class="upload-demo"
                    drag
                    action="https://jsonplaceholder.typicode.com/posts/"
                    multiple>
                  <i class="el-icon-upload"></i>
                  <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                  <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
                </el-upload>
              <div style="display: flex;margin-left: 20px;">
                <file-upload v-model="projectProgressForm.situationDescriptionFileList"
                             :fileType="projectProgressForm.accept"
                             :isShowTip="false"/>
              </div>
            </div>
            <div style="display: flex; justify-content: center; align-items: center; margin-top: 20px;">
              <el-button type="primary" @click="handleSave">保 存</el-button>
            </div>
          </el-row>
          <el-dialog title="进度上报" :visible.sync="dialogFormVisible" custom-class="custom-dialog">
          <el-dialog
            :title=" dialogFlag === 1 ? '进度查看' : '进度上报' "
            :visible.sync="dialogFormVisible"
            custom-class="custom-dialog"
            :close-on-click-modal="false"
            @close="handleCancel">
            <el-form :model="progressReportData">
              <el-form-item label="报告期:" :label-width="formLabelWidth">
                <el-input :value="progressReportData.planTime + (progressReportData.planTimeFlag === 0 ? '月度' : progressReportData.planTimeFlag === 1 ? '季度' : '年度')" disabled />
              </el-form-item>
              <el-form-item label="计划事项:" :label-width="formLabelWidth">
                <el-input v-model="progressReportData.title" disabled />
              </el-form-item>
              <el-form-item label="计划时间:" :label-width="formLabelWidth">
                <el-date-picker v-model="progressReportData.startTime" type="date" placeholder="选择日期" size="small" style="width: 130px" disabled/>
                至
                <el-date-picker v-model="progressReportData.endTime" type="date" placeholder="选择日期" size="small" style="width: 130px" disabled/>
              </el-form-item>
              <el-form-item label="实际完成时间:" :label-width="formLabelWidth">
                <el-date-picker v-model="progressReportData.actualStartTime" type="date" placeholder="选择日期" size="small" style="width: 130px" />
                至
                <el-date-picker v-model="progressReportData.actualEndTime" type="date" placeholder="选择日期" size="small" style="width: 130px" />
              </el-form-item>
              <el-form-item label="进度情况:" :label-width="formLabelWidth">
                <el-input type="textarea" v-model="progressReportData.progressStatus" placeholder="请输入" rows="3" />
              </el-form-item>
              <el-form-item label="工程进度附件:" :label-width="formLabelWidth">
                <el-upload
                    class="upload-demo"
                    drag
                    action="https://jsonplaceholder.typicode.com/posts/"
                    multiple>
                  <i class="el-icon-upload"></i>
                  <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                  <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
                </el-upload>
              </el-form-item>
              <el-form-item label="截止本报告完成投资:" :label-width="formLabelWidth">
                <el-input v-model="progressReportData.actualInvest" type="number" />
              </el-form-item>
              <el-form-item label="上级审核:" :label-width="formLabelWidth">
                <el-input :value="progressReportData.departmentExamine === 0 ? '同意' : '驳回'" disabled />
              </el-form-item>
              <el-form-item label="上级批复:" :label-width="formLabelWidth">
                <el-input v-model="progressReportData.departmentApproval" disabled />
              </el-form-item>
              <el-form-item label="上级批复回复:" :label-width="formLabelWidth">
                <el-input type="textarea" v-model="progressReportData.departmentApprovalReply" placeholder="请输入" rows="3" />
              </el-form-item>
              <el-form-item label="主管部门审核:" :label-width="formLabelWidth">
                <el-input :value="progressReportData.manageExamine === 0 ? '同意' : '驳回'" disabled />
              </el-form-item>
              <el-form-item label="主管部门审核批复:" :label-width="formLabelWidth">
                <el-input v-model="progressReportData.manageApproval" disabled />
              </el-form-item>
              <el-form-item label="主管部门批复回复:" :label-width="formLabelWidth">
                <el-input type="textarea" v-model="progressReportData.manageApprovalReply" placeholder="请输入" rows="3" />
              </el-form-item>
              <el-row>
                <el-col :span="12">
                  <el-form-item label="报告期:" :label-width="formLabelWidth">
                    <el-input :value="progressReportData.planTime + (progressReportData.planTimeFlag === 0 ? '月度' : progressReportData.planTimeFlag === 1 ? '季度' : '年度')" readonly />
                  </el-form-item>
                  <el-form-item label="计划事项:" :label-width="formLabelWidth">
                    <el-input v-model="progressReportData.title" readonly />
                  </el-form-item>
                  <el-form-item label="计划时间:" :label-width="formLabelWidth">
                    <el-date-picker v-model="progressReportData.startTime" type="date" placeholder="选择日期" size="medium" style="width: 130px" readonly/>
                    至
                    <el-date-picker v-model="progressReportData.endTime" type="date" placeholder="选择日期" size="medium" style="width: 130px" readonly/>
                  </el-form-item>
                  <el-form-item label="实际完成时间:" :label-width="formLabelWidth">
                    <el-date-picker
                      v-model="progressReportData.actualStartTime"
                      type="date"
                      placeholder="选择日期"
                      value-format="yyyy-MM-dd HH:mm:ss"
                      size="medium"
                      style="width: 130px"
                      :readonly="projectInfoData.managerFlag || dialogFlag !== 0"/>
                    至
                    <el-date-picker
                      v-model="progressReportData.actualEndTime"
                      type="date"
                      placeholder="选择日期"
                      value-format="yyyy-MM-dd HH:mm:ss"
                      size="medium"
                      style="width: 130px"
                      :readonly="projectInfoData.managerFlag || dialogFlag !== 0"/>
                  </el-form-item>
                  <el-form-item label="进度情况:" :label-width="formLabelWidth">
                    <el-input
                      type="textarea"
                      v-model="progressReportData.progressStatusStr"
                      placeholder="请输入" rows="3"
                      :readonly="projectInfoData.managerFlag || dialogFlag !== 0" />
                  </el-form-item>
                  <el-form-item label="工程进度附件:" :label-width="formLabelWidth">
                    <file-upload v-model="progressReportData.fileList"
                                 :fileType="accept"
                                 :isShowTip="false"/>
                  </el-form-item>
                  <el-form-item label="截止本报告完成投资:" :label-width="formLabelWidth">
                    <el-input
                      v-model="progressReportData.actualInvest"
                      type="number"
                      :readonly="projectInfoData.managerFlag || dialogFlag !== 0" />
                  </el-form-item>
                </el-col>
                <el-col :span="12">
                  <el-form-item label="上级审核:" :label-width="formLabelWidth">
                    <div v-if="!projectInfoData.managerFlag">
                      <el-input
                        :value="progressReportData.departmentExamine === 0 ? '同意' : progressReportData.departmentExamine === 1 ? '驳回' : '未审核'"
                        readonly />
                    </div>
                    <div v-if="projectInfoData.managerFlag">
                      <el-select
                        v-model="progressReportData.departmentExamine"
                        placeholder="请选择"
                        size="medium"
                        :disabled="progressReportData.progressStatusInt === 2 || progressReportData.progressStatusInt === 3"
                        clearable>
                        <el-option label="同意" :value="0"></el-option>
                        <el-option label="驳回" :value="1"></el-option>
                        <el-option label="请选择" :value="null"></el-option>
                      </el-select>
                    </div>
                  </el-form-item>
                  <el-form-item label="上级批复:" :label-width="formLabelWidth">
                    <div v-if="!projectInfoData.managerFlag">
                      <el-input v-model="progressReportData.departmentApproval" readonly />
                    </div>
                    <div v-if="projectInfoData.managerFlag">
                      <el-input
                        v-model="progressReportData.departmentApproval"
                        :readonly="progressReportData.progressStatusInt === 2 || progressReportData.progressStatusInt === 3"/>
                    </div>
                  </el-form-item>
                  <el-form-item label="上级批复回复:" :label-width="formLabelWidth">
                    <div v-if="!projectInfoData.managerFlag">
                      <el-input
                        type="textarea"
                        v-model="progressReportData.departmentApprovalReply"
                        :readonly="dialogFlag === 0 || progressReportData.progressStatusInt === 1"
                        placeholder="请输入"
                        rows="3" />
                    </div>
                    <div v-if="projectInfoData.managerFlag">
                      <el-input
                        type="textarea"
                        v-model="progressReportData.departmentApprovalReply"
                        placeholder="请输入"
                        rows="3"
                        readonly/>
                    </div>
                  </el-form-item>
                  <el-form-item label="主管部门审核:" :label-width="formLabelWidth">
                    <div v-if="!projectInfoData.managerFlag">
                      <el-input
                        :value="progressReportData.manageExamine === 0 ? '同意' : progressReportData.manageExamine === 1 ? '驳回' : '未审核'"
                        readonly />
                    </div>
                    <div v-if="projectInfoData.managerFlag">
                      <el-select
                        v-model="progressReportData.manageExamine"
                        placeholder="请选择"
                        size="medium"
                        :disabled="progressReportData.progressStatusInt === 2 || progressReportData.progressStatusInt === 3"
                        clearable>
                        <el-option label="请选择" :value="null"></el-option>
                        <el-option label="同意" :value="0"></el-option>
                        <el-option label="驳回" :value="1"></el-option>
                      </el-select>
                    </div>
                  </el-form-item>
                  <el-form-item label="主管部门批复:" :label-width="formLabelWidth">
                    <div v-if="!projectInfoData.managerFlag">
                      <el-input
                        v-model="progressReportData.manageApproval"
                        readonly />
                    </div>
                    <div v-if="projectInfoData.managerFlag">
                      <el-input
                        :readonly="progressReportData.progressStatusInt === 2 || progressReportData.progressStatusInt === 3"
                        v-model="progressReportData.manageApproval" />
                    </div>
                  </el-form-item>
                  <el-form-item label="主管部门批复回复:" :label-width="formLabelWidth">
                    <div v-if="!projectInfoData.managerFlag">
                      <el-input
                        type="textarea"
                        v-model="progressReportData.manageApprovalReply"
                        :readonly="dialogFlag === 0 || progressReportData.progressStatusInt === 1"
                        placeholder="请输入"
                        rows="3" />
                    </div>
                    <div v-if="projectInfoData.managerFlag">
                      <el-input
                        type="textarea"
                        v-model="progressReportData.manageApprovalReply"
                        placeholder="请输入"
                        rows="3"
                        readonly/>
                    </div>
                  </el-form-item>
                </el-col>
              </el-row>
            </el-form>
            <div slot="footer" class="dialog-footer">
              <el-button type="primary" @click="dialogFormVisible = false">上 报</el-button>
              <el-button @click="dialogFormVisible = false">取 消</el-button>
              <div v-if="!projectInfoData.managerFlag">
                <el-button type="primary" @click="handleRecordSubmit" v-if="dialogFlag === 0">上 报</el-button>
                <el-button @click="handleReply" v-if="isShowReplyBtn && (progressReportData.progressStatusInt === 2 || progressReportData.progressStatusInt === 3)">回 复</el-button>
                <el-button @click="handleCancel">取 消</el-button>
              </div>
              <div v-if="projectInfoData.managerFlag">
                <el-button type="primary" @click="handleExamine" v-if="dialogFlag === 2">审 批</el-button>
                <el-button @click="handleCancel">取 消</el-button>
              </div>
            </div>
          </el-dialog>
        </el-card>
@@ -191,36 +369,64 @@
</template>
<script>
import { getProgressInfoList, getProgressReport } from "@/api/projectManage/progress/index";
import { getProgressInfoList, getProgressReport, recordSubmit, saveProjectProgressFileLists, getProjectProgressForm, examine, reply } from "@/api/projectManage/progress/index";
import progressRecord from "./progressRecord.vue";
export default {
  name: "progressRecord",
  computed: {
    progressRecord() {
      return progressRecord
    }
  },
  data() {
    return {
      // 接收传递过来的项目计划数据
      planRecordData: {},
      projectInfoData: {},
      monthProgress: [],
      seasonProgress: [],
      yearProgress: [],
      activeTab: "month", // 默认显示月度计划
      dialogFormVisible: false,
      // 查看显示
      dialogFlag: 0,// 上报、重新上报:0,查看:1,审核:2
      // 是否展示回复按钮
      isShowReplyBtn: true,
      progressReportData: {},
      formLabelWidth: '150px'
      formLabelWidth: '150px',
      // 竣工报告、情况说明附件
      projectProgressForm: {
        completedReportFileList: [],
        situationDescriptionFileList: [],
        projectReportId: null,
        accept: ['pdf'],
      },
      // 进度上报附件类型
      accept: ['pdf','jpg','mp4'],
    }
  },
  created() {
    this.getProjectInfoData()
  },
  methods: {
    // 页面加载
    search() {
      this.getPlanRecordData(this.planRecordData.id);
      this.getProjectProgressForm(this.projectInfoData.id);
      this.getProgressInfoList(this.projectInfoData.id);
      this.progressReportData = {};
    },
    // 获取传递过来的项目计划详情
    getplanRecordData() {
    getProjectInfoData() {
      // 从查询参数中获取数据
      if (this.$route.query.data) {
        this.planRecordData = JSON.parse(this.$route.query.data);
        this.getProgressInfoList(this.planRecordData.id);
      }
        this.projectInfoData = JSON.parse(this.$route.query.data);
        this.search();
    },
    getProjectProgressForm(id) {
      getProjectProgressForm(id).then(res => {
        this.projectProgressForm = res.data;
      })
    },
    // 获取项目进度计划项
    getProgressInfoList(id) {
@@ -232,15 +438,79 @@
    },
    // 进度上报
    handleProgressReport(row) {
      this.dialogFlag = 0;
      this.dialogFormVisible = true;
      getProgressReport(row.id).then(res => {
        this.progressReportData = res.data;
      })
    },
    // 重新上报
    handleReportAgain(row) {
      this.dialogFlag = 0;
      this.isShowReplyBtn = false;
      this.dialogFormVisible = true;
      getProgressReport(row.id).then(res => {
        this.progressReportData = res.data;
      })
    },
    // 上报提交
    handleRecordSubmit() {
      recordSubmit(this.progressReportData).then(res => {
        this.dialogFormVisible = false;
        this.$message.success('上报成功');
        this.search();
      })
    },
    // 回复
    handleReply() {
      reply(this.progressReportData).then(res => {
        this.dialogFormVisible = false;
        this.$message.success('回复成功');
        this.search();
      })
    },
    // 审批
    handleExamine() {
      examine(this.progressReportData).then(res => {
        this.dialogFormVisible = false;
        this.$message.success('审批成功');
        this.search();
      })
    },
    // 打开查看进度弹窗
    handleCheckProgress(row) {
      this.dialogFormVisible = true;
      this.dialogFlag = 1;
      getProgressReport(row.id).then(res => {
        this.progressReportData = res.data;
      })
    },
    // 打开审核弹窗
    handleOpenExamine(row) {
      this.dialogFormVisible = true;
      this.dialogFlag = 2;
      getProgressReport(row.id).then(res => {
        this.progressReportData = res.data;
      })
    },
    // 关闭弹窗
    handleCancel() {
      this.dialogFormVisible = false;
      this.isShowReplyBtn = true;
      this.dialogFlag = 0;
      this.progressReportData = {};
    },
    // 保存
    handleSave() {
      this.projectProgressForm.projectReportId = this.projectInfoData.id;
      // 判断文件不为空
        saveProjectProgressFileLists(this.projectProgressForm).then(res => {
          this.$message.success('保存成功');
          this.search();
        })
    }
  },
  created() {
    this.getplanRecordData();
  },
};
</script>
@@ -252,7 +522,7 @@
}
.custom-dialog {
  max-height: 70vh; /* 设置最大高度 */
  max-height: 60vh; /* 设置最大高度 */
  overflow-y: auto; /* 允许垂直滚动 */
}
</style>