Lou
2024-02-27 953890b950f73a64a538238f207ee43684059c78
维修基金相关页面修改
8 files modified
1 files added
3876 ■■■■■ changed files
src/views/gzll/components/deitDiscussion.vue 475 ●●●●● patch | view | raw | blame | history
src/views/gzll/process/maintenanceFundApply/detail.vue 142 ●●●●● patch | view | raw | blame | history
src/views/gzll/process/maintenanceFundApply/edit.vue 835 ●●●●● patch | view | raw | blame | history
src/views/gzll/process/maintenanceFundApply/handle.vue 817 ●●●●● patch | view | raw | blame | history
src/views/property/process/maintenanceFundApply/detail.vue 658 ●●●●● patch | view | raw | blame | history
src/views/property/process/maintenanceFundApply/edit.vue 803 ●●●●● patch | view | raw | blame | history
src/views/property/process/maintenanceFundApply/handle.vue 117 ●●●● patch | view | raw | blame | history
src/views/property/propertyCapitalApply.vue 25 ●●●●● patch | view | raw | blame | history
vue.config.js 4 ●●●● patch | view | raw | blame | history
src/views/gzll/components/deitDiscussion.vue
New file
@@ -0,0 +1,475 @@
<!--
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2024-01-04 15:18:13
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2024-01-04 17:13:22
 * @FilePath: \jczz_web\src\views\article\components\deitDiscussion.vue
 * @Description:
 *
 * Copyright (c) 2024 by shuishen, All Rights Reserved.
-->
<template>
    <div>
      <el-dialog title="" append-to-body :visible.sync="popupTableShow" width="80%" :before-close="handleClose">
        <span slot="title" class="dialog-footer">
          {{ ontitle }}
        </span>
        <div id="" v-if="editFlag">
          <avue-form @submit="handleSubmit" :option="optionDiscuss" @reset-change="handleReset" v-model="disCussFrom">
          </avue-form>
        </div>
        <div id="" v-if="!editFlag">
          <avue-crud :table-loading="loading" :option="optionList" :data="data" v-model="form" ref="crud"
            @row-update="rowUpdate" @row-del="rowDel">
            <template slot="menuLeft" v-if="!editFlag">
              <el-button type="primary" size="small" plain icon="el-icon-circle-plus-outline" @click="add()">添加
              </el-button>
            </template>
            <template #icon="scope">
              <i :class="scope.row.icon" style="font-size:14px"></i>
            </template>
            <template #menu="{ row, size }">
              <el-button v-if="row.level === 1" :size="size" text type="primary" @click="edit(row)">编辑</el-button>
              <el-button v-if="row.level === 1" :size="size" text type="danger" @click="deletes(row)">删除</el-button>
              <el-button v-if="row.level === 2" :size="size" text type="primary" @click="openUser(row, 1)">
                选择此项人数:{{ row.number }} 详情</el-button>
            </template>
          </avue-crud>
        </div>
      </el-dialog>
      <el-dialog title="" append-to-body :visible.sync="popupTableUserShow" width="80%" :before-close="userHandleClose">
        <avue-crud :data="userData" :page="userPage" :option="userOption" @search-change="searchChange"
          @search-reset="searchReset"></avue-crud>
      </el-dialog>
    </div>
  </template>
  <script>
    import {
      getListPd,
      getDetailPd,
      addPd,
      updatePd,
      removePd
    } from "@/api/discuss/publicDiscuss"
    import {
      getPage
    } from "@/api/discuss/userTopics"
    import website from '@/config/website'
    import {
      getLists,
      getList,
      getDetail,
      add,
      update,
      remove
    } from "@/api/discuss/topics"
    export default {
      data() {
        return {
          popupTableShow: false,
          popupTableUserShow: false,
          loading: true,
          ontitle: '编辑议题',
          editFlag: false,
          disCussFrom: {
            discussContent: '',
            optionRange: 0,
            sort: 1,
            optionContent: '',
            optionDetail: '',
            number: '',
            createTime: '',
            updateTime: '',
            deleteFlag: '',
            articleId: '',
            parentId: '',
            level: '',
            children: [{
              optionContent: '',
              optionDetail: '',
              number: '',
              createTime: '',
              updateTime: '',
              deleteFlag: '',
              articleId: '',
              parentId: '',
              level: '',
            }]
          },
          optionDiscuss: {
            emptyText: '取消',
            column: [{
                label: '议题',
                prop: 'discussContent',
                type: 'input',
                row: true,
                rules: [{
                  required: true,
                  message: '请输入议题',
                  trigger: 'blur'
                }],
              },
              {
                label: '选项范围',
                prop: 'optionRange',
                type: 'radio',
                value: 0,
                button: true,
                row: true,
                dicData: [{
                  label: '多选',
                  value: 1
                }, {
                  label: '单选',
                  value: 0
                }],
                rules: [{
                  required: true,
                  message: '请选项范围',
                  trigger: 'blur'
                }],
              },
              // {
              //   label: '排序',
              //   prop: 'sort',
              //   controlsPosition: '',
              //   type: 'number'
              // },
              {
                label: '选项内容',
                prop: 'children',
                type: 'dynamic',
                span: 24,
                children: {
                  column: [{
                    label: '选项标题',
                    prop: 'optionContent',
                    type: 'input',
                    rules: [{
                      required: true,
                      message: '请输入选项标题',
                      trigger: 'blur'
                    }]
                  }, {
                    label: '选项说明',
                    prop: 'optionDetail',
                    type: 'input',
                  }]
                }
              },
            ]
          },
          // 表单数据
          form: {},
          data: [],
          optionList: {
            headerAlign: 'center',
            align: 'center',
            border: true,
            addBtn: false,
            editBtn: false,
            delBtn: false,
            defaultExpandAll: true,
            rowKey: 'id',
            rowParentKey: 'parentId',
            column: [{
                label: '标题',
                prop: 'discussContent',
              },
              {
                label: '选项内容',
                prop: 'optionContent',
              }
            ]
          },
          articleId: '',
          userData: [],
          userOption: {
            labelWidth: 96,
            searchLabelWidth: 96,
            searchShow: true,
            searchMenuSpan: 3,
            // menuWidth: 500,
            menu: false,
            height: "auto",
            calcHeight: 54,
            dialogWidth: 950,
            tip: false,
            border: true,
            //stripe:true,
            index: true,
            editBtn: false,
            addBtn: false,
            viewBtn: false,
            selection: true,
            delBtn: false,
            excelBtn: true,
            dialogClickModal: false,
            header:false,
            column: [{
              label: '姓名',
              prop: 'name',
              searchSpan: 4,
              search: true,
            }, {
              label: '头像',
              type: 'upload',
              listType: "picture-img",
              prop: 'avatar'
            }, {
              label: '手机',
              prop: 'phone',
              searchSpan: 4,
              search: true,
            }, {
              label: '小区',
              prop: 'aoiName'
            }, {
              label: '地址',
              prop: 'addressName'
            }, {
              label: '签名',
              type: 'upload',
              listType: "picture-img",
              prop: 'signaturePath'
            }, {
              label: '时间',
              prop: 'createTime'
            }]
          },
          // 分页信息
          userPage: {
            pageSize: 10,
            pageSizes: [10, 20, 30, 50, 100],
            currentPage: 1,
            total: 0
          },
          query: {},
          newData: {},
          articleRange: {},
        }
      },
      watch: {},
      methods: {
        userHandleClose() {
          this.popupTableUserShow = false
        },
        searchReset() {
          if (this.articleRange) {
            this.query.districtId = this.newData.articleRange
          }
          this.query.articleId = this.articleId
          this.userPage.currentPage = 1
          this.getUserPage(this.userPage, this.query)
        },
        searchChange(params, done) {
          if (this.articleRange) {
            this.query.districtId = this.newData.articleRange
          }
          this.query = params
          this.query.articleId = this.articleId
          this.userPage.currentPage = 1
          this.getUserPage(this.userPage, this.query)
          done()
        },
        initData(newData) {
          this.editFlag = false
          this.popupTableShow = true
          this.articleId = newData.id
          this.query.level = 1
          this.query.articleId = this.articleId
          this.newData = newData
          this.query.districtId = newData.articleRange
          this.onLoad(this.userPage, this.query)
        },
        // initData(newData) {
        //   this.editFlag = false
        //   this.popupTableShow = true
        //   this.articleId = newData.id
        //   this.onLoad()
        // },
        handleClose() {
          this.popupTableShow = false
          this.disCussFrom = {}
        },
        handleSubmit(form, done) {
          done()
          form.articleId = this.articleId
          add(form).then(
            () => {
              this.$message({
                type: "success",
                message: "操作成功!",
              })
              form = {}
              this.editFlag = false
              let params = {
                level: 1,
                articleId: this.articleId
              }
              getLists(1, 100, Object.assign(params, this.query)).then(res => {
                const data = res.data.data
                this.data = data
              })
            },
            (error) => {
              window.console.log(error)
            }
          )
        },
        handleReset() {
          this.editFlag = false
        },
        // 提交修改
        rowUpdate(row, index, done, loading) {
          done()
          if (!row.id) {
            addPd(row).then(() => {
              this.onLoad()
              this.$message({
                type: "success",
                message: "操作成功!"
              })
            })
          } else {
            updatePd(row).then(() => {
              this.onLoad()
              this.$message({
                type: "success",
                message: "操作成功!"
              })
            })
          }
        },
        rowDel(row) {
          this.$confirm("确定将选择数据删除?", {
              confirmButtonText: "确定",
              cancelButtonText: "取消",
              type: "warning"
            })
            .then(() => {
              return remove(row.id)
            })
            .then(() => {
              this.getUserPage(this.userPage)
              this.$message({
                type: "success",
                message: "操作成功!"
              })
            })
        },
        add() {
          this.editFlag = true
        },
        edit(row) {
          this.disCussFrom = row
          this.editFlag = true
        },
        deletes(row) {
          this.$confirm("确定将选择数据删除?", {
              confirmButtonText: "确定",
              cancelButtonText: "取消",
              type: "warning"
            })
            .then(() => {
              return remove(row.id)
            })
            .then(() => {
              this.onLoad()
              this.$message({
                type: "success",
                message: "操作成功!"
              })
            })
        },
        openUser(row, type = 0,disId) {
          this.popupTableUserShow = true
          this.query = {}
          this.articleId = row.id
          let districtId
          if (type == 0) {
            this.newData = row
            districtId = this.newData.articleRange || disId
            this.userParams = {
              articleId: row.id,
              districtId: JSON.stringify(districtId)
            }
          } else {
            districtId = this.newData.articleRange || disId
            this.userParams = {
              topicsId: row.id,
              districtId: JSON.stringify(districtId)
            }
          }
          this.getUserPage(this.userPage, this.userParams)
        },
        getUserPage(page, params = {}) {
          getPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
            const data = res.data.data
            this.userPage.total = data.total
            this.userData = data.records
            this.userData.forEach(item => {
              if (item.avatar.length > 0) {
                item.avatar = website.minioUrl + item.avatar
              }
              if (item.signaturePath && item.signaturePath.length > 0) {
                item.signaturePath = website.minioUrl + item.signaturePath
                // console.log("=====>", item.signaturePath)
              }
            })
          })
        },
        onLoad(page, params = {}) {
          this.loading = true
          getLists(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
            const data = res.data.data
            this.data = data
            this.loading = false
          })
        }
      },
    }
  </script>
  <style lang="scss" scoped></style>
src/views/gzll/process/maintenanceFundApply/detail.vue
@@ -10,7 +10,25 @@
        <div slot="header">
          <span>审批信息</span>
        </div>
        <avue-form :option="option" :value="form"></avue-form>
        <avue-form :option="option" :value="form">
          <template slot-scope="{ row, size, index }" slot="vote">
            <div>{{ topicTitle }}</div>
            <el-table :data="topictData" v-if="topictData.length">
              <el-table-column width="300" property="optionContent" label="选项"
                label-class-name="workOrderStyle"></el-table-column>
              <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
              </el-table-column>
              <el-table-column width="300">
                <template slot-scope="scope">
                  <el-button slot="reference" type="primary" size="mini"
                    @click="openUserPopup(scope.row, 1)">详情</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template>
        </avue-form>
        <!-- <el-form-item label="申请人">
          <el-input :disabled="true" v-model="form.flow.assigneeName" />
        </el-form-item>
@@ -56,6 +74,8 @@
        </el-row>
      </el-card>
    </el-form>
    <deitDiscussion ref="DeitDiscussion">
    </deitDiscussion>
  </basic-container>
</template>
@@ -71,8 +91,14 @@
    add,
    getPropertyCapitalApply
  } from "@/api/property/propertyCapitalApply";
  export default {
  import {
  getLists
} from "@/api/discuss/topics"
import deitDiscussion from "../../components/deitDiscussion.vue"
export default {
  components: {
    deitDiscussion
  },
    data() {
      return {
        businessId: '',
@@ -250,6 +276,55 @@
              value: '0.00',
              disabled: true
            },
            {
          disabled:true,
          display: false,
          hide: true,
          parent: false,
          label: "投票结果",
          prop: "articleId",
          search: false,
          viewDisabled: false,
          type: 'select',
          dicUrl: `/api/blade-article/article/getArticleByDistrictId?type=4&eventType=1&districtId={{districtId}}`,
          cascader: ['vote'],
          props: {
            label: "title",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth:140,
          rules: [{
            required: true,
            message: "请选择投票结果",
            trigger: "blur",
          },],
          change: (val) => {
            console.log("val===>", val)
            // console.log("form===>",this.form)
            if (val.value && !this.form.id) {
              this.articleRange = val.articleRange;
              // this.showDialog = true;
              // this.getDetail(val.value, val.articleRange)
            }
          }
        },
        {
          disabled: true,
          display: false,
          span: 24,
          hide: true,
          prop: "vote",
          slot: true,
          label: "投票详情",
          labelWidth: 140,
        },
            {
              label: "项目摘要",
              span: 24,
@@ -291,9 +366,41 @@
              }, ],
            }
          ],
        },
        topictData: [],
      topicTitle: "",
      articleRange: ""
      }
    },
    watch: {
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData && this.form.articleId) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
    'form.articleId': {
      handler(newData) {
        this.getVoteDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
  },
    created() {
      this.init();
    },
@@ -319,7 +426,34 @@
        this.$router.push({
          path: `/work/start`
        });
      },
      getVoteDetail(articleId, districtId) {
      let params = {
        level: 1,
        articleId: articleId,
        districtId: districtId
      }
      getLists(1, 10, params).then(res => {
        const data = res.data.data
        if (data.length) {
          this.topictData = data[0].children;
          this.topicTitle = data[0].discussContent;
        }
      })
    },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
    }
  }
</script>
</script>
<style>
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/gzll/process/maintenanceFundApply/edit.vue
@@ -14,6 +14,23 @@
          <span>审批信息</span>
        </div>
        <avue-form ref="crud" :option="option" v-model="form" @submit="handleSubmit">
          <template slot-scope="{ row, size, index }" slot="vote">
            <div>{{ topicTitle }}</div>
            <el-table :data="topictData" v-if="topictData.length">
              <el-table-column width="300" property="optionContent" label="选项"
                label-class-name="workOrderStyle"></el-table-column>
              <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
              </el-table-column>
              <el-table-column width="300">
                <template slot-scope="scope">
                  <el-button slot="reference" type="primary" size="mini"
                    @click="openUserPopup(scope.row, 1)">详情</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template>
          <template slot-scope="{size}" slot="menuForm">
            <el-button type="primary" :size="size" @click="$refs.crud.submit()">保存信息</el-button>
            <!-- <el-button :size="size" @click="$refs.form.resetForm()">自定义清空</el-button> -->
@@ -32,10 +49,10 @@
          <el-timeline>
            <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
              <el-card shadow="hover">
                <p>{{flow.assigneeName}} 在 [{{flow.createTime}}] 开始处理 [{{flow.historyActivityName}}] 环节</p>
                <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{flow.historyActivityDurationTime}}]</p>
                <p v-if="flow.comment!==''">批复意见: [{{flow.comment}}]</p>
                <p v-if="flow.endTime!==''">结束时间: [{{flow.endTime}}]</p>
                <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}] 环节</p>
                <p v-if="flow.historyActivityDurationTime !== ''">任务历时 [{{ flow.historyActivityDurationTime }}]</p>
                <p v-if="flow.comment !== ''">批复意见: [{{ flow.comment }}]</p>
                <p v-if="flow.endTime !== ''">结束时间: [{{ flow.endTime }}]</p>
              </el-card>
            </el-timeline-item>
          </el-timeline>
@@ -60,360 +77,480 @@
      <el-button type="danger" @click="handleDisagree">关闭申请</el-button>
    </div>
    <deitDiscussion ref="DeitDiscussion">
    </deitDiscussion>
  </basic-container>
</template>
<script>
  import {
    historyFlowList,
    leaveDetail
  } from "@/api/work/process";
import {
  historyFlowList,
  leaveDetail
} from "@/api/work/process";
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
  } from "@/api/property/propertyCapitalApply";
  import {
    completeTask
  } from "@/api/work/work";
  export default {
    data() {
      return {
        taskId: '',
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          startTime: '',
          endTime: '',
          reason: '',
          comment: '',
import {
  getList,
  remove,
  update,
  add,
  getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply";
import {
  completeTask
} from "@/api/work/work";
import {
  getLists
} from "@/api/discuss/topics"
import deitDiscussion from "../../components/deitDiscussion.vue"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      taskId: '',
      businessId: '',
      processInstanceId: '',
      src: '',
      flowList: [],
      form: {
        flow: {
          assigneeName: '',
        },
        option: {
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 350,
          border: true,
          //stripe:true,
          submitBtn: false,
          emptyBtn: false,
          index: true,
          viewBtn: true,
          selection: true,
          dialogClickModal: false,
          column: [{
              label: "小区",
              prop: "districtId",
              searchSpan: 5,
              search: true,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              labelWidth: 120,
              width: 220,
              overHidden: true,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchLabelWidth: 120,
              searchSpan: 5,
              search: true,
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
            },
            {
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              labelWidth: 140,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
            },
            {
              label: "预计竣工时间",
              prop: "completedTime",
              labelWidth: 140,
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 12,
              row: true,
            },
            {
              label: '联系人',
              prop: 'linkman',
              span: 12,
              labelWidth: 120,
              search: true,
              searchSpan: 4,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
            },
            {
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              labelWidth: 140,
              type: "textarea",
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              labelWidth: 140,
              type: "textarea",
            },
            // {
            //   label: "批复意见",
            //   span: 24,
            //   hide: true,
            //   prop: "comment",
            //   labelWidth: 140,
            //   type: "textarea",
            //   rules: [{
            //     required: true,
            //     message: "请输入批复意见",
            //     trigger: "blur",
            //   }, ],
            // },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              span: 24,
              hide: true,
              labelWidth: 140,
              multiple: true,
              // showFileList: true,
              propsHttp: {
                res: 'data',
                name: "originalName",
                url: "link"
              },
              action: '/api/blade-resource/oss/endpoint/put-file-attach',
              rules: [{
                required: true,
                message: "请上传施工方案",
                trigger: "blur",
              }, ],
            }
          ],
        }
      }
    },
    created() {
      this.init();
    },
    beforeRouteUpdate(to, from, next) {
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
      // 可以访问组件实例 `this`
      if (to.fullPath !== from.fullPath) {
        next();
        this.init();
      }
    },
    methods: {
      handleSubmit(form, done, loading) {
        if (form.constructionSchemeUrls.length > 0) {
          var urls = []
          var split = form.constructionSchemeUrls.split(",");
          split.forEach(url => {
            var names = url.split("jczz/");
            urls.push(names[1])
          })
          form.constructionSchemeUrls = urls.join(",")
        }
        update(form).then(
          () => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!",
            });
            done();
        startTime: '',
        endTime: '',
        reason: '',
        comment: '',
      },
      option: {
        height: "auto",
        calcHeight: 54,
        dialogWidth: 1150,
        tip: false,
        searchShow: true,
        searchMenuSpan: 3,
        menuWidth: 350,
        border: true,
        //stripe:true,
        submitBtn: false,
        emptyBtn: false,
        index: true,
        viewBtn: true,
        selection: true,
        dialogClickModal: false,
        column: [{
          label: "小区",
          prop: "districtId",
          searchSpan: 5,
          search: true,
          type: 'tree',
          dicUrl: `/api/blade-district/district/getDistrictTree`,
          props: {
            label: "name",
            value: "id"
          },
          (error) => {
            window.console.log(error);
            loading();
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth: 120,
          width: 220,
          overHidden: true,
          rules: [{
            required: true,
            message: "请选择小区",
            trigger: "blur",
          },],
        },
        {
          label: '维修项目名称',
          prop: 'name',
          searchLabelWidth: 120,
          searchSpan: 5,
          search: true,
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入维修项目名称",
            trigger: "blur",
          },],
        },
        {
          label: "预计开工时间",
          prop: "runTime",
          span: 12,
          labelWidth: 140,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同开始时间",
            trigger: "blur",
          },],
        },
        {
          label: "预计竣工时间",
          prop: "completedTime",
          labelWidth: 140,
          span: 12,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同结束时间",
            trigger: "blur",
          },],
        },
        {
          label: "项目分摊方式",
          prop: "allocationWay",
          labelWidth: 140,
          value: '按建筑面积分摊',
          span: 12,
          row: true,
        },
        {
          label: '联系人',
          prop: 'linkman',
          span: 12,
          labelWidth: 120,
          search: true,
          searchSpan: 4,
          rules: [{
            required: true,
            message: "请输入联系人",
            trigger: "blur",
          },],
        },
        {
          label: '联系方式',
          prop: 'linkPhone',
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入联系方式",
            trigger: "blur",
          },],
        },
        {
          label: "项目预算总金额(元)",
          prop: "budgetAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          label: "实际预算金额(元)",
          prop: "actualAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          label: "自筹金额(元)",
          prop: "selfAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          label: "预算应拨付金额(元)",
          prop: "budgetAppropriateAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          display: false,
          hide: true,
          parent: false,
          label: "投票结果",
          prop: "articleId",
          search: false,
          viewDisabled: false,
          type: 'select',
          dicUrl: `/api/blade-article/article/getArticleByDistrictId?type=4&eventType=1&districtIdList={{districtId}}`,
          // slot: true,
          formslot: true,
          cascader: ['vote'],
          props: {
            label: "title",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          width: 260,
          rules: [{
            required: true,
            message: "请选择投票结果",
            trigger: "blur",
          },],
          change: (val) => {
            console.log("val===>", val)
            // console.log("form===>",this.form)
          }
        );
      },
      init() {
        this.taskId = this.$route.params.taskId;
        this.processInstanceId = this.$route.params.processInstanceId;
        this.businessId = this.$route.params.businessId;
        historyFlowList(this.processInstanceId).then(res => {
          const data = res.data;
          if (data.success) {
            this.flowList = data.data;
          }
        })
        getPropertyCapitalApply(this.businessId).then(res => {
          const data = res.data;
          if (data.success) {
            this.form = data.data;
          }
        })
      },
      handleAgree() {
        // if (!this.form.comment) {
        //   this.$message.warning('请先填写批复意见');
        //   return;
        // }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          flag: 'ok',
          comment: this.form.comment,
        };
        completeTask(params).then(res => {
          const data = res.data;
          if (data.success) {
            this.$message.success(data.msg);
            this.$router.$avueRouter.closeTag();
            this.$router.push({
              path: `/property/propertyCapitalApply`
            });
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        })
      },
      handleDisagree() {
        this.form.comment = '关闭申请'
        if (!this.form.comment) {
          this.$message.warning('请先填写批复意见');
          return;
        },
        {
          display: false,
          span: 24,
          hide: true,
          prop: "vote",
          slot: true,
          label: "投票详情",
          labelWidth: 140,
        },
        {
          label: "项目摘要",
          span: 24,
          hide: true,
          prop: "projectDigest",
          placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
          labelWidth: 140,
          type: "textarea",
        },
        {
          label: "项目进度描述",
          span: 24,
          hide: true,
          prop: "projectDescribe",
          labelWidth: 140,
          type: "textarea",
        },
        // {
        //   label: "批复意见",
        //   span: 24,
        //   hide: true,
        //   prop: "comment",
        //   labelWidth: 140,
        //   type: "textarea",
        //   rules: [{
        //     required: true,
        //     message: "请输入批复意见",
        //     trigger: "blur",
        //   }, ],
        // },
        {
          label: '施工方案附件',
          prop: 'constructionSchemeUrls',
          type: 'upload',
          span: 24,
          hide: true,
          labelWidth: 140,
          multiple: true,
          // showFileList: true,
          propsHttp: {
            res: 'data',
            name: "originalName",
            url: "link"
          },
          action: '/api/blade-resource/oss/endpoint/put-file-attach',
          rules: [{
            required: true,
            message: "请上传施工方案",
            trigger: "blur",
          },],
        }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          comment: this.form.comment,
        };
        completeTask(params).then(res => {
          const data = res.data;
          if (data.success) {
            this.$message.success(data.msg);
            this.$router.$avueRouter.closeTag();
            this.$router.push({
              path: `/property/propertyCapitalApply`
            });
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        })
        ],
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag();
        this.$router.push({
          path: `/gzll/todo`
        });
      }
      topictData: [],
      topicTitle: "",
      articleRange: ""
    }
  },
  watch: {
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData && this.form.articleId) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
    'form.articleId': {
      handler(newData) {
        this.getVoteDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
  },
  created() {
    this.init();
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
    // 可以访问组件实例 `this`
    if (to.fullPath !== from.fullPath) {
      next();
      this.init();
    }
  },
  methods: {
    handleSubmit(form, done, loading) {
      if (form.constructionSchemeUrls.length > 0) {
        var urls = []
        var split = form.constructionSchemeUrls.split(",");
        split.forEach(url => {
          var names = url.split("jczz/");
          urls.push(names[1])
        })
        form.constructionSchemeUrls = urls.join(",")
      }
      update(form).then(
        () => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
          });
          done();
        },
        (error) => {
          window.console.log(error);
          loading();
        }
      );
    },
    init() {
      this.taskId = this.$route.params.taskId;
      this.processInstanceId = this.$route.params.processInstanceId;
      this.businessId = this.$route.params.businessId;
      historyFlowList(this.processInstanceId).then(res => {
        const data = res.data;
        if (data.success) {
          this.flowList = data.data;
        }
      })
      getPropertyCapitalApply(this.businessId).then(res => {
        const data = res.data;
        if (data.success) {
          this.form = data.data;
        }
      })
    },
    handleAgree() {
      // if (!this.form.comment) {
      //   this.$message.warning('请先填写批复意见');
      //   return;
      // }
      const params = {
        taskId: this.taskId,
        processInstanceId: this.processInstanceId,
        flag: 'ok',
        comment: this.form.comment,
      };
      completeTask(params).then(res => {
        const data = res.data;
        if (data.success) {
          this.$message.success(data.msg);
          this.$router.$avueRouter.closeTag();
          this.$router.push({
            path: `/property/propertyCapitalApply`
          });
        } else {
          this.$message.error(data.msg || '提交失败');
        }
      })
    },
    handleDisagree() {
      this.form.comment = '关闭申请'
      if (!this.form.comment) {
        this.$message.warning('请先填写批复意见');
        return;
      }
      const params = {
        taskId: this.taskId,
        processInstanceId: this.processInstanceId,
        comment: this.form.comment,
      };
      completeTask(params).then(res => {
        const data = res.data;
        if (data.success) {
          this.$message.success(data.msg);
          this.$router.$avueRouter.closeTag();
          this.$router.push({
            path: `/property/propertyCapitalApply`
          });
        } else {
          this.$message.error(data.msg || '提交失败');
        }
      })
    },
    handleCancel() {
      this.$router.$avueRouter.closeTag();
      this.$router.push({
        path: `/gzll/todo`
      });
    },
    getVoteDetail(articleId, districtId) {
      let params = {
        level: 1,
        articleId: articleId,
        districtId: districtId
      }
      getLists(1, 10, params).then(res => {
        const data = res.data.data
        if (data.length) {
          this.topictData = data[0].children;
          this.topicTitle = data[0].discussContent;
        }
      })
    },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
  }
</script>
}
</script>
<style>
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/gzll/process/maintenanceFundApply/handle.vue
@@ -11,7 +11,22 @@
        <div slot="header">
          <span>审批信息</span>
        </div>
        <avue-form :option="option" v-model="form"></avue-form>
        <avue-form :option="option" v-model="form">
          <template slot-scope="{ row, size, index }" slot="vote">
            <div>{{ topicTitle }}</div>
            <el-table :data="topictData" v-if="topictData.length">
              <el-table-column width="300" property="optionContent" label="选项"
                label-class-name="workOrderStyle"></el-table-column>
              <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
              </el-table-column>
              <el-table-column width="300">
                <template slot-scope="scope">
                  <el-button slot="reference" type="primary" size="mini"
                    @click="openUserPopup(scope.row, 1)">详情</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template></avue-form>
      </el-card>
      <el-card shadow="hover">
@@ -25,7 +40,7 @@
                <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}]
                  环节</p>
                <p v-if="flow.historyActivityDurationTime !== ''">任务历时 [{{ flow.historyActivityDurationTime
                                }}]
                }}]
                </p>
                <p v-if="flow.comment !== ''">批复意见: [{{ flow.comment }}]</p>
                <p v-if="flow.endTime !== ''">结束时间: [{{ flow.endTime }}]</p>
@@ -58,362 +73,476 @@
      <el-button type="danger" @click="handleDisagree">驳回</el-button>
    </div>
    <deitDiscussion ref="DeitDiscussion">
  </deitDiscussion>
  </basic-container>
</template>
<script>
  import {
    historyFlowList,
    leaveDetail
  } from "@/api/work/process"
import {
  historyFlowList,
  leaveDetail
} from "@/api/work/process"
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
  } from "@/api/property/propertyCapitalApply"
  import {
    completeTask
  } from "@/api/work/work"
  import website from '@/config/website'
import {
  getList,
  remove,
  update,
  add,
  getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply"
import {
  completeTask
} from "@/api/work/work"
import website from '@/config/website'
import {
  getLists,
} from "@/api/discuss/topics"
  export default {
    data() {
      return {
        taskId: '',
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          startTime: '',
          endTime: '',
          reason: '',
import deitDiscussion from "./components/deitDiscussion"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      taskId: '',
      businessId: '',
      processInstanceId: '',
      src: '',
      flowList: [],
      form: {
        flow: {
          assigneeName: '',
        },
        option: {
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 350,
          border: true,
          //stripe:true,
          submitBtn: false,
          emptyBtn: false,
          index: true,
          viewBtn: true,
          selection: true,
          dialogClickModal: false,
          column: [{
              label: "小区",
              prop: "districtId",
              searchSpan: 5,
              search: true,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              labelWidth: 120,
              width: 220,
              overHidden: true,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchLabelWidth: 120,
              searchSpan: 5,
              search: true,
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              labelWidth: 140,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "预计竣工时间",
              prop: "completedTime",
              labelWidth: 140,
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 12,
              row: true,
              disabled: true
            },
            {
              label: '联系人',
              prop: 'linkman',
              span: 12,
              labelWidth: 120,
              search: true,
              searchSpan: 4,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              labelWidth: 140,
              type: "textarea",
              disabled: true
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              labelWidth: 140,
              type: "textarea",
              disabled: true
            }, {
              label: "批复意见",
              span: 24,
              hide: true,
              prop: "comment",
              labelWidth: 140,
              type: "textarea",
              rules: [{
                required: true,
                message: "请输入批复意见",
                trigger: "blur",
              }, ],
            },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              listType: 'picture-img',
              span: 24,
              hide: true,
              labelWidth: 140,
              multiple: true,
              // showFileList: true,
              propsHttp: {
                res: 'data',
                name: "originalName",
                url: "link"
              },
              action: '/api/blade-resource/oss/endpoint/put-file-attach',
              rules: [{
                required: true,
                message: "请上传施工方案",
                trigger: "blur",
              }, ],
        startTime: '',
        endTime: '',
        reason: '',
      },
      option: {
        height: "auto",
        calcHeight: 54,
        dialogWidth: 1150,
        tip: false,
        searchShow: true,
        searchMenuSpan: 3,
        menuWidth: 350,
        border: true,
        //stripe:true,
        submitBtn: false,
        emptyBtn: false,
        index: true,
        viewBtn: true,
        selection: true,
        dialogClickModal: false,
        column: [{
          label: "小区",
          prop: "districtId",
          searchSpan: 5,
          search: true,
          type: 'tree',
          dicUrl: `/api/blade-district/district/getDistrictTree`,
          props: {
            label: "name",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth: 120,
          width: 220,
          overHidden: true,
          rules: [{
            required: true,
            message: "请选择小区",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: '维修项目名称',
          prop: 'name',
          searchLabelWidth: 120,
          searchSpan: 5,
          search: true,
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入维修项目名称",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "预计开工时间",
          prop: "runTime",
          span: 12,
          labelWidth: 140,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同开始时间",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "预计竣工时间",
          prop: "completedTime",
          labelWidth: 140,
          span: 12,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同结束时间",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "项目分摊方式",
          prop: "allocationWay",
          labelWidth: 140,
          value: '按建筑面积分摊',
          span: 12,
          row: true,
          disabled: true
        },
        {
          label: '联系人',
          prop: 'linkman',
          span: 12,
          labelWidth: 120,
          search: true,
          searchSpan: 4,
          rules: [{
            required: true,
            message: "请输入联系人",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: '联系方式',
          prop: 'linkPhone',
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入联系方式",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "项目预算总金额(元)",
          prop: "budgetAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          label: "实际预算金额(元)",
          prop: "actualAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          label: "自筹金额(元)",
          prop: "selfAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          label: "预算应拨付金额(元)",
          prop: "budgetAppropriateAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          display: false,
          hide: true,
          parent: false,
          label: "投票结果",
          prop: "articleId",
          search: false,
          viewDisabled: false,
          type: 'select',
          dicUrl: `/api/blade-article/article/getArticleByDistrictId?type=4&eventType=1&districtId={{districtId}}`,
          // slot: true,
          formslot: true,
          cascader: ['vote'],
          props: {
            label: "title",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          width: 260,
          rules: [{
            required: true,
            message: "请选择投票结果",
            trigger: "blur",
          },],
          change: (val) => {
            console.log("val===>", val)
            // console.log("form===>",this.form)
            if (val.value && !this.form.id) {
              this.articleRange = val.articleRange;
              // this.showDialog = true;
              // this.getDetail(val.value, val.articleRange)
            }
          ],
          }
        },
        {
          display: false,
          span: 24,
          hide: true,
          prop: "vote",
          slot: true,
          label: "投票详情",
          labelWidth: 140
        },
        {
          label: "项目摘要",
          span: 24,
          hide: true,
          prop: "projectDigest",
          placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
          labelWidth: 140,
          type: "textarea",
          disabled: true
        },
        {
          label: "项目进度描述",
          span: 24,
          hide: true,
          prop: "projectDescribe",
          labelWidth: 140,
          type: "textarea",
          disabled: true
        }, {
          label: "批复意见",
          span: 24,
          hide: true,
          prop: "comment",
          labelWidth: 140,
          type: "textarea",
          rules: [{
            required: true,
            message: "请输入批复意见",
            trigger: "blur",
          },],
        },
        {
          label: '施工方案附件',
          prop: 'constructionSchemeUrls',
          type: 'upload',
          listType: 'picture-img',
          span: 24,
          hide: true,
          labelWidth: 140,
          multiple: true,
          // showFileList: true,
          propsHttp: {
            res: 'data',
            name: "originalName",
            url: "link"
          },
          action: '/api/blade-resource/oss/endpoint/put-file-attach',
          rules: [{
            required: true,
            message: "请上传施工方案",
            trigger: "blur",
          },],
        }
      }
    },
    created() {
      this.init()
    },
    beforeRouteUpdate(to, from, next) {
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
      // 可以访问组件实例 `this`
      if (to.fullPath !== from.fullPath) {
        next()
        this.init()
      }
    },
    methods: {
      init() {
        this.taskId = this.$route.params.taskId
        this.processInstanceId = this.$route.params.processInstanceId
        this.businessId = this.$route.params.businessId
        historyFlowList(this.processInstanceId).then(res => {
          const data = res.data
          if (data.success) {
            this.flowList = data.data
          }
        })
        getPropertyCapitalApply(this.businessId).then(res => {
          const data = res.data
          if (data.success) {
            data.data.constructionSchemeUrls = website.minioUrl + data.data.constructionSchemeUrls
            this.form = data.data
          }
        })
        ],
      },
      handleAgree() {
        if (!this.form.comment) {
          this.$message.warning('请先填写批复意见')
          return
        }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          flag: 'ok',
          comment: this.form.comment,
        }
        completeTask(params).then(res => {
          const data = res.data
          if (data.success) {
            this.$message.success(data.msg)
            this.$router.$avueRouter.closeTag()
            this.$router.push({
              path: `/gzll/todo`
            })
          } else {
            this.$message.error(data.msg || '提交失败')
          }
        })
      },
      handleDisagree() {
        if (!this.form.comment) {
          this.$message.warning('请先填写批复意见')
          return
        }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          comment: this.form.comment,
        }
        completeTask(params).then(res => {
          const data = res.data
          if (data.success) {
            this.$message.success(data.msg)
            this.$router.$avueRouter.closeTag()
            this.$router.push({
              path: `/gzll/todo`
            })
          } else {
            this.$message.error(data.msg || '提交失败')
          }
        })
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag()
        this.$router.push({
          path: `/gzll/todo`
        })
      }
      topictData: [],
      topicTitle: "",
      articleRange: ""
    }
  },
  watch: {
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData && this.form.articleId) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
    'form.articleId': {
      handler(newData) {
        this.getVoteDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
  },
  created() {
    this.init()
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
    // 可以访问组件实例 `this`
    if (to.fullPath !== from.fullPath) {
      next()
      this.init()
    }
  },
  methods: {
    init() {
      this.taskId = this.$route.params.taskId
      this.processInstanceId = this.$route.params.processInstanceId
      this.businessId = this.$route.params.businessId
      historyFlowList(this.processInstanceId).then(res => {
        const data = res.data
        if (data.success) {
          this.flowList = data.data
        }
      })
      getPropertyCapitalApply(this.businessId).then(res => {
        const data = res.data
        if (data.success) {
          data.data.constructionSchemeUrls = website.minioUrl + data.data.constructionSchemeUrls
          this.form = data.data
        }
      })
    },
    handleAgree() {
      if (!this.form.comment) {
        this.$message.warning('请先填写批复意见')
        return
      }
      const params = {
        taskId: this.taskId,
        processInstanceId: this.processInstanceId,
        flag: 'ok',
        comment: this.form.comment,
      }
      completeTask(params).then(res => {
        const data = res.data
        if (data.success) {
          this.$message.success(data.msg)
          this.$router.$avueRouter.closeTag()
          this.$router.push({
            path: `/gzll/todo`
          })
        } else {
          this.$message.error(data.msg || '提交失败')
        }
      })
    },
    handleDisagree() {
      if (!this.form.comment) {
        this.$message.warning('请先填写批复意见')
        return
      }
      const params = {
        taskId: this.taskId,
        processInstanceId: this.processInstanceId,
        comment: this.form.comment,
      }
      completeTask(params).then(res => {
        const data = res.data
        if (data.success) {
          this.$message.success(data.msg)
          this.$router.$avueRouter.closeTag()
          this.$router.push({
            path: `/gzll/todo`
          })
        } else {
          this.$message.error(data.msg || '提交失败')
        }
      })
    },
    handleCancel() {
      this.$router.$avueRouter.closeTag()
      this.$router.push({
        path: `/gzll/todo`
      })
    },
    getVoteDetail(articleId, districtId) {
      let params = {
        level: 1,
        articleId: articleId,
        districtId: districtId
      }
      getLists(1, 10, params).then(res => {
        const data = res.data.data
        if (data.length) {
          this.topictData = data[0].children;
          this.topicTitle = data[0].discussContent;
        }
      })
    },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
  }
}
</script>
<style scoped>
  .container {
    position: relative;
    /* 确保按钮相对于该元素定位 */
  }
.container {
  position: relative;
  /* 确保按钮相对于该元素定位 */
}
  #myButton {
    position: fixed;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
  }
#myButton {
  position: fixed;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
}
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/property/process/maintenanceFundApply/detail.vue
@@ -10,7 +10,25 @@
        <div slot="header">
          <span>审批信息</span>
        </div>
        <avue-form :option="option" :value="form"></avue-form>
        <avue-form :option="option" :value="form">
          <template slot-scope="{ row, size, index }" slot="vote">
            <div>{{ topicTitle }}</div>
            <el-table :data="topictData" v-if="topictData.length">
              <el-table-column width="300" property="optionContent" label="选项"
                label-class-name="workOrderStyle"></el-table-column>
              <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
              </el-table-column>
              <el-table-column width="300">
                <template slot-scope="scope">
                  <el-button slot="reference" type="primary" size="mini"
                    @click="openUserPopup(scope.row, 1)">详情</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template>
        </avue-form>
        <!-- <el-form-item label="申请人">
          <el-input :disabled="true" v-model="form.flow.assigneeName" />
        </el-form-item>
@@ -38,10 +56,10 @@
          <el-timeline>
            <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
              <el-card shadow="hover">
                <p>{{flow.assigneeName}} 在 [{{flow.createTime}}] 开始处理 [{{flow.historyActivityName}}] 环节</p>
                <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{flow.historyActivityDurationTime}}]</p>
                <p v-if="flow.comment!==''">批复意见: [{{flow.comment}}]</p>
                <p v-if="flow.endTime!==''">结束时间: [{{flow.endTime}}]</p>
                <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}] 环节</p>
                <p v-if="flow.historyActivityDurationTime !== ''">任务历时 [{{ flow.historyActivityDurationTime }}]</p>
                <p v-if="flow.comment !== ''">批复意见: [{{ flow.comment }}]</p>
                <p v-if="flow.endTime !== ''">结束时间: [{{ flow.endTime }}]</p>
              </el-card>
            </el-timeline-item>
          </el-timeline>
@@ -56,270 +74,390 @@
        </el-row>
      </el-card>
    </el-form>
    <deitDiscussion ref="DeitDiscussion">
  </deitDiscussion>
  </basic-container>
</template>
<script>
  import {
    historyFlowList,
    leaveDetail
  } from "@/api/work/process";
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
  } from "@/api/property/propertyCapitalApply";
import {
  historyFlowList,
  leaveDetail
} from "@/api/work/process";
import {
  getList,
  remove,
  update,
  add,
  getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply";
  export default {
    data() {
      return {
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          startTime: '',
          endTime: '',
          reason: '',
import {
  getLists
} from "@/api/discuss/topics"
import deitDiscussion from "../../components/deitDiscussion.vue"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      businessId: '',
      processInstanceId: '',
      src: '',
      flowList: [],
      form: {
        flow: {
          assigneeName: '',
        },
        option: {
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 350,
          border: true,
          //stripe:true,
          submitBtn: false,
          emptyBtn: false,
          index: true,
          viewBtn: true,
          selection: true,
          dialogClickModal: false,
          column: [{
              label: "小区",
              prop: "districtId",
              searchSpan: 5,
              search: true,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              labelWidth: 120,
              width: 220,
              overHidden: true,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchLabelWidth: 120,
              searchSpan: 5,
              search: true,
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              labelWidth: 140,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "预计竣工时间",
              prop: "completedTime",
              labelWidth: 140,
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 12,
              row: true,
              disabled: true
            },
            {
              label: '联系人',
              prop: 'linkman',
              span: 12,
              labelWidth: 120,
              search: true,
              searchSpan: 4,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              labelWidth: 140,
              type: "textarea",
              disabled: true
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              labelWidth: 140,
              type: "textarea",
              disabled: true
            },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              span: 24,
              hide: true,
              labelWidth: 140,
              multiple: true,
              // showFileList: true,
              propsHttp: {
                res: 'data',
                name: "originalName",
                url: "link"
              },
              action: '/api/blade-resource/oss/endpoint/put-file-attach',
              rules: [{
                required: true,
                message: "请上传施工方案",
                trigger: "blur",
              }, ],
        startTime: '',
        endTime: '',
        reason: '',
      },
      option: {
        height: "auto",
        calcHeight: 54,
        dialogWidth: 1150,
        tip: false,
        searchShow: true,
        searchMenuSpan: 3,
        menuWidth: 350,
        border: true,
        //stripe:true,
        submitBtn: false,
        emptyBtn: false,
        index: true,
        viewBtn: true,
        selection: true,
        dialogClickModal: false,
        column: [{
          label: "小区",
          prop: "districtId",
          searchSpan: 5,
          search: true,
          type: 'tree',
          dicUrl: `/api/blade-district/district/getDistrictTree`,
          cascader: ['articleId'],
          props: {
            label: "name",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth: 120,
          width: 220,
          overHidden: true,
          rules: [{
            required: true,
            message: "请选择小区",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: '维修项目名称',
          prop: 'name',
          searchLabelWidth: 120,
          searchSpan: 5,
          search: true,
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入维修项目名称",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "预计开工时间",
          prop: "runTime",
          span: 12,
          labelWidth: 140,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同开始时间",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "预计竣工时间",
          prop: "completedTime",
          labelWidth: 140,
          span: 12,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同结束时间",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "项目分摊方式",
          prop: "allocationWay",
          labelWidth: 140,
          value: '按建筑面积分摊',
          span: 12,
          row: true,
          disabled: true
        },
        {
          label: '联系人',
          prop: 'linkman',
          span: 12,
          labelWidth: 120,
          search: true,
          searchSpan: 4,
          rules: [{
            required: true,
            message: "请输入联系人",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: '联系方式',
          prop: 'linkPhone',
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入联系方式",
            trigger: "blur",
          },],
          disabled: true
        },
        {
          label: "项目预算总金额(元)",
          prop: "budgetAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          label: "实际预算金额(元)",
          prop: "actualAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          label: "自筹金额(元)",
          prop: "selfAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          label: "预算应拨付金额(元)",
          prop: "budgetAppropriateAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
          disabled: true
        },
        {
          disabled:true,
          display: false,
          hide: true,
          parent: false,
          label: "投票结果",
          prop: "articleId",
          search: false,
          viewDisabled: false,
          type: 'select',
          dicUrl: `/api/blade-article/article/getArticleByDistrictId?type=4&eventType=1&districtId={{districtId}}`,
          cascader: ['vote'],
          props: {
            label: "title",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth:140,
          rules: [{
            required: true,
            message: "请选择投票结果",
            trigger: "blur",
          },],
          change: (val) => {
            console.log("val===>", val)
            // console.log("form===>",this.form)
            if (val.value && !this.form.id) {
              this.articleRange = val.articleRange;
              // this.showDialog = true;
              // this.getDetail(val.value, val.articleRange)
            }
          ],
          }
        },
        {
          disabled: true,
          display: false,
          span: 24,
          hide: true,
          prop: "vote",
          slot: true,
          label: "投票详情",
          labelWidth: 140,
        },
        {
          label: "项目摘要",
          span: 24,
          hide: true,
          prop: "projectDigest",
          placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
          labelWidth: 140,
          type: "textarea",
          disabled: true
        },
        {
          label: "项目进度描述",
          span: 24,
          hide: true,
          prop: "projectDescribe",
          labelWidth: 140,
          type: "textarea",
          disabled: true
        },
        {
          label: '施工方案附件',
          prop: 'constructionSchemeUrls',
          type: 'upload',
          span: 24,
          hide: true,
          labelWidth: 140,
          multiple: true,
          // showFileList: true,
          propsHttp: {
            res: 'data',
            name: "originalName",
            url: "link"
          },
          action: '/api/blade-resource/oss/endpoint/put-file-attach',
          rules: [{
            required: true,
            message: "请上传施工方案",
            trigger: "blur",
          },],
        }
        ],
      },
      topictData: [],
      topicTitle: "",
      articleRange: ""
    }
  },
  watch: {
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData && this.form.articleId) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
    created() {
      this.init();
    },
    methods: {
      init() {
        this.processInstanceId = this.$route.params.processInstanceId;
        this.businessId = this.$route.params.businessId;
        historyFlowList(this.processInstanceId).then(res => {
          const data = res.data;
          if (data.success) {
            this.flowList = data.data;
          }
        })
        getPropertyCapitalApply(this.businessId).then(res => {
          const data = res.data;
          if (data.success) {
            this.form = data.data;
          }
        })
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag();
        this.$router.push({
          path: `/work/start`
        });
    'form.articleId': {
      handler(newData) {
        this.getVoteDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    }
    },
  },
  created() {
    this.init();
  },
  methods: {
    init() {
      this.processInstanceId = this.$route.params.processInstanceId;
      this.businessId = this.$route.params.businessId;
      historyFlowList(this.processInstanceId).then(res => {
        const data = res.data;
        if (data.success) {
          this.flowList = data.data;
        }
      })
      getPropertyCapitalApply(this.businessId).then(res => {
        const data = res.data;
        if (data.success) {
          this.form = data.data;
        }
      })
    },
    handleCancel() {
      this.$router.$avueRouter.closeTag();
      this.$router.push({
        path: `/work/start`
      });
    },
    getVoteDetail(articleId, districtId) {
      let params = {
        level: 1,
        articleId: articleId,
        districtId: districtId
      }
      getLists(1, 10, params).then(res => {
        const data = res.data.data
        if (data.length) {
          this.topictData = data[0].children;
          this.topicTitle = data[0].discussContent;
        }
      })
    },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
  }
</script>
}
</script>
<style>
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/property/process/maintenanceFundApply/edit.vue
@@ -14,6 +14,24 @@
          <span>审批信息</span>
        </div>
        <avue-form ref="crud" :option="option" v-model="form" @submit="handleSubmit">
          <template slot-scope="{ row, size, index }" slot="vote">
            <div>{{ topicTitle }}</div>
            <el-table :data="topictData" v-if="topictData.length">
              <el-table-column width="300" property="optionContent" label="选项"
                label-class-name="workOrderStyle"></el-table-column>
              <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
              </el-table-column>
              <el-table-column width="300">
                <template slot-scope="scope">
                  <el-button slot="reference" type="primary" size="mini"
                    @click="openUserPopup(scope.row, 1)">详情</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template>
          <template slot-scope="{size}" slot="menuForm">
            <el-button type="primary" :size="size" @click="$refs.crud.submit()">保存信息</el-button>
            <!-- <el-button :size="size" @click="$refs.form.resetForm()">自定义清空</el-button> -->
@@ -32,10 +50,10 @@
          <el-timeline>
            <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
              <el-card shadow="hover">
                <p>{{flow.assigneeName}} 在 [{{flow.createTime}}] 开始处理 [{{flow.historyActivityName}}] 环节</p>
                <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{flow.historyActivityDurationTime}}]</p>
                <p v-if="flow.comment!==''">批复意见: [{{flow.comment}}]</p>
                <p v-if="flow.endTime!==''">结束时间: [{{flow.endTime}}]</p>
                <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}] 环节</p>
                <p v-if="flow.historyActivityDurationTime !== ''">任务历时 [{{ flow.historyActivityDurationTime }}]</p>
                <p v-if="flow.comment !== ''">批复意见: [{{ flow.comment }}]</p>
                <p v-if="flow.endTime !== ''">结束时间: [{{ flow.endTime }}]</p>
              </el-card>
            </el-timeline-item>
          </el-timeline>
@@ -60,196 +78,206 @@
      <el-button type="danger" @click="handleDisagree">关闭申请</el-button>
    </div>
    <deitDiscussion ref="DeitDiscussion">
    </deitDiscussion>
  </basic-container>
</template>
<script>
  import {
    historyFlowList,
    leaveDetail
  } from "@/api/work/process";
import {
  historyFlowList,
  leaveDetail
} from "@/api/work/process";
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
  } from "@/api/property/propertyCapitalApply";
  import {
    completeTask
  } from "@/api/work/work";
  export default {
    data() {
      return {
        taskId: '',
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          startTime: '',
          endTime: '',
          reason: '',
          comment: '',
import {
  getList,
  remove,
  update,
  add,
  getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply";
import {
  completeTask
} from "@/api/work/work";
import {
  getLists
} from "@/api/discuss/topics"
import deitDiscussion from "../../components/deitDiscussion.vue"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      taskId: '',
      businessId: '',
      processInstanceId: '',
      src: '',
      flowList: [],
      form: {
        flow: {
          assigneeName: '',
        },
        option: {
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 350,
          border: true,
          //stripe:true,
          submitBtn: false,
          emptyBtn: false,
          index: true,
          viewBtn: true,
          selection: true,
          dialogClickModal: false,
          column: [{
              label: "小区",
              prop: "districtId",
              searchSpan: 5,
              search: true,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              labelWidth: 120,
              width: 220,
              overHidden: true,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchLabelWidth: 120,
              searchSpan: 5,
              search: true,
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
            },
            {
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              labelWidth: 140,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
            },
            {
              label: "预计竣工时间",
              prop: "completedTime",
              labelWidth: 140,
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 12,
              row: true,
            },
            {
              label: '联系人',
              prop: 'linkman',
              span: 12,
              labelWidth: 120,
              search: true,
              searchSpan: 4,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
            },
            {
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
            },
            {
        startTime: '',
        endTime: '',
        reason: '',
        comment: '',
      },
      option: {
        height: "auto",
        calcHeight: 54,
        dialogWidth: 1150,
        tip: false,
        searchShow: true,
        searchMenuSpan: 3,
        menuWidth: 350,
        border: true,
        //stripe:true,
        submitBtn: false,
        emptyBtn: false,
        index: true,
        viewBtn: true,
        selection: true,
        dialogClickModal: false,
        column: [{
          label: "小区",
          prop: "districtId",
          searchSpan: 5,
          search: true,
          type: 'tree',
          dicUrl: `/api/blade-district/district/getDistrictTree`,
          cascader: ['articleId'],
          props: {
            label: "name",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth: 140,
          width: 220,
          overHidden: true,
          rules: [{
            required: true,
            message: "请选择小区",
            trigger: "blur",
          },],
        },
        {
          label: '维修项目名称',
          prop: 'name',
          searchLabelWidth: 120,
          searchSpan: 5,
          search: true,
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入维修项目名称",
            trigger: "blur",
          },],
        },
        {
          label: "预计开工时间",
          prop: "runTime",
          span: 12,
          labelWidth: 140,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同开始时间",
            trigger: "blur",
          },],
        },
        {
          label: "预计竣工时间",
          prop: "completedTime",
          labelWidth: 140,
          span: 12,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同结束时间",
            trigger: "blur",
          },],
        },
        {
          label: "项目分摊方式",
          prop: "allocationWay",
          labelWidth: 140,
          value: '按建筑面积分摊',
          span: 12,
          row: true,
        },
        {
          label: '联系人',
          prop: 'linkman',
          span: 12,
          labelWidth: 140,
          search: true,
          searchSpan: 4,
          rules: [{
            required: true,
            message: "请输入联系人",
            trigger: "blur",
          },],
        },
        {
          label: '联系方式',
          prop: 'linkPhone',
          span: 12,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请输入联系方式",
            trigger: "blur",
          },],
        },
        {
          label: "项目预算总金额(元)",
          prop: "budgetAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          label: "实际预算金额(元)",
          prop: "actualAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          label: "自筹金额(元)",
          prop: "selfAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          label: "预算应拨付金额(元)",
          prop: "budgetAppropriateAmount",
          span: 12,
          hide: true,
          labelWidth: 140,
          type: 'number',
          precision: 2,
          value: '0.00',
        },
        {
          display: false,
          hide: true,
          parent: false,
@@ -271,7 +299,7 @@
          width: 260,
          rules: [{
            required: true,
            message: "请选择议事",
            message: "请选择投票结果",
            trigger: "blur",
          },],
          change: (val) => {
@@ -281,171 +309,242 @@
          }
        },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              labelWidth: 140,
              type: "textarea",
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              labelWidth: 140,
              type: "textarea",
            },
            // {
            //   label: "批复意见",
            //   span: 24,
            //   hide: true,
            //   prop: "comment",
            //   labelWidth: 140,
            //   type: "textarea",
            //   rules: [{
            //     required: true,
            //     message: "请输入批复意见",
            //     trigger: "blur",
            //   }, ],
            // },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              span: 24,
              hide: true,
              labelWidth: 140,
              multiple: true,
              // showFileList: true,
              propsHttp: {
                res: 'data',
                name: "originalName",
                url: "link"
              },
              action: '/api/blade-resource/oss/endpoint/put-file-attach',
              rules: [{
                required: true,
                message: "请上传施工方案",
                trigger: "blur",
              }, ],
            }
          ],
        }
      }
    },
    created() {
      this.init();
    },
    beforeRouteUpdate(to, from, next) {
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
      // 可以访问组件实例 `this`
      if (to.fullPath !== from.fullPath) {
        next();
        this.init();
      }
    },
    methods: {
      handleSubmit(form, done, loading) {
        if (form.constructionSchemeUrls.length > 0) {
          var urls = []
          var split = form.constructionSchemeUrls.split(",");
          split.forEach(url => {
            var names = url.split("jczz/");
            urls.push(names[1])
          })
          form.constructionSchemeUrls = urls.join(",")
        }
        update(form).then(
          () => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!",
            });
            done();
        {
          display: false,
          span: 24,
          hide: true,
          prop: "vote",
          slot: true,
          label: "投票详情",
          labelWidth: 140,
        },
        {
          label: "项目摘要",
          span: 24,
          hide: true,
          prop: "projectDigest",
          placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
          labelWidth: 140,
          type: "textarea",
        },
        {
          label: "项目进度描述",
          span: 24,
          hide: true,
          prop: "projectDescribe",
          labelWidth: 140,
          type: "textarea",
        },
        // {
        //   label: "批复意见",
        //   span: 24,
        //   hide: true,
        //   prop: "comment",
        //   labelWidth: 140,
        //   type: "textarea",
        //   rules: [{
        //     required: true,
        //     message: "请输入批复意见",
        //     trigger: "blur",
        //   }, ],
        // },
        {
          label: '施工方案附件',
          prop: 'constructionSchemeUrls',
          type: 'upload',
          span: 24,
          hide: true,
          labelWidth: 140,
          multiple: true,
          // showFileList: true,
          propsHttp: {
            res: 'data',
            name: "originalName",
            url: "link"
          },
          (error) => {
            window.console.log(error);
            loading();
          }
        );
      },
      init() {
        this.taskId = this.$route.params.taskId;
        this.processInstanceId = this.$route.params.processInstanceId;
        this.businessId = this.$route.params.businessId;
        historyFlowList(this.processInstanceId).then(res => {
          const data = res.data;
          if (data.success) {
            this.flowList = data.data;
          }
        })
        getPropertyCapitalApply(this.businessId).then(res => {
          const data = res.data;
          if (data.success) {
            this.form = data.data;
          }
        })
      },
      handleAgree() {
        // if (!this.form.comment) {
        //   this.$message.warning('请先填写批复意见');
        //   return;
        // }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          flag: 'ok',
          comment: this.form.comment,
        };
        completeTask(params).then(res => {
          const data = res.data;
          if (data.success) {
            this.$message.success(data.msg);
            this.$router.$avueRouter.closeTag();
            this.$router.push({
              path: `/property/propertyCapitalApply`
            });
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        })
      },
      handleDisagree() {
        this.form.comment = '关闭申请'
        if (!this.form.comment) {
          this.$message.warning('请先填写批复意见');
          return;
          action: '/api/blade-resource/oss/endpoint/put-file-attach',
          rules: [{
            required: true,
            message: "请上传施工方案",
            trigger: "blur",
          },],
        }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          comment: this.form.comment,
        };
        completeTask(params).then(res => {
          const data = res.data;
          if (data.success) {
            this.$message.success(data.msg);
            this.$router.$avueRouter.closeTag();
            this.$router.push({
              path: `/property/propertyCapitalApply`
            });
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        })
        ],
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag();
        this.$router.push({
          path: `/property/todo`
        });
      }
      topictData: [],
      topicTitle: "",
      articleRange: ""
    }
  },
  watch: {
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData && this.form.articleId) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
    'form.articleId': {
      handler(newData) {
        this.getVoteDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
  },
  created() {
    this.init();
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
    // 可以访问组件实例 `this`
    if (to.fullPath !== from.fullPath) {
      next();
      this.init();
    }
  },
  methods: {
    handleSubmit(form, done, loading) {
      if (form.constructionSchemeUrls.length > 0) {
        var urls = []
        var split = form.constructionSchemeUrls.split(",");
        split.forEach(url => {
          var names = url.split("jczz/");
          urls.push(names[1])
        })
        form.constructionSchemeUrls = urls.join(",")
      }
      update(form).then(
        () => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
          });
          done();
        },
        (error) => {
          window.console.log(error);
          loading();
        }
      );
    },
    init() {
      this.taskId = this.$route.params.taskId;
      this.processInstanceId = this.$route.params.processInstanceId;
      this.businessId = this.$route.params.businessId;
      historyFlowList(this.processInstanceId).then(res => {
        const data = res.data;
        if (data.success) {
          this.flowList = data.data;
        }
      })
      getPropertyCapitalApply(this.businessId).then(res => {
        const data = res.data;
        if (data.success) {
          this.form = data.data;
        }
      })
    },
    handleAgree() {
      // if (!this.form.comment) {
      //   this.$message.warning('请先填写批复意见');
      //   return;
      // }
      const params = {
        taskId: this.taskId,
        processInstanceId: this.processInstanceId,
        flag: 'ok',
        comment: this.form.comment,
      };
      completeTask(params).then(res => {
        const data = res.data;
        if (data.success) {
          this.$message.success(data.msg);
          this.$router.$avueRouter.closeTag();
          this.$router.push({
            path: `/property/propertyCapitalApply`
          });
        } else {
          this.$message.error(data.msg || '提交失败');
        }
      })
    },
    handleDisagree() {
      this.form.comment = '关闭申请'
      if (!this.form.comment) {
        this.$message.warning('请先填写批复意见');
        return;
      }
      const params = {
        taskId: this.taskId,
        processInstanceId: this.processInstanceId,
        comment: this.form.comment,
      };
      completeTask(params).then(res => {
        const data = res.data;
        if (data.success) {
          this.$message.success(data.msg);
          this.$router.$avueRouter.closeTag();
          this.$router.push({
            path: `/property/propertyCapitalApply`
          });
        } else {
          this.$message.error(data.msg || '提交失败');
        }
      })
    },
    handleCancel() {
      this.$router.$avueRouter.closeTag();
      this.$router.push({
        path: `/property/todo`
      });
    },
    getVoteDetail(articleId, districtId) {
      let params = {
        level: 1,
        articleId: articleId,
        districtId: districtId
      }
      getLists(1, 10, params).then(res => {
        const data = res.data.data
        if (data.length) {
          this.topictData = data[0].children;
          this.topicTitle = data[0].discussContent;
        }
      })
    },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
  }
</script>
}
</script>
<style>
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/property/process/maintenanceFundApply/handle.vue
@@ -11,7 +11,25 @@
        <div slot="header">
          <span>审批信息</span>
        </div>
        <avue-form :option="option" v-model="form"></avue-form>
        <avue-form :option="option" v-model="form">
          <template slot-scope="{ row, size, index }" slot="vote">
            <div>{{ topicTitle }}</div>
            <el-table :data="topictData" v-if="topictData.length">
              <el-table-column width="300" property="optionContent" label="选项"
                label-class-name="workOrderStyle"></el-table-column>
              <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
              </el-table-column>
              <el-table-column width="300">
                <template slot-scope="scope">
                  <el-button slot="reference" type="primary" size="mini"
                    @click="openUserPopup(scope.row, 1)">详情</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template>
        </avue-form>
      </el-card>
      <el-card shadow="hover">
@@ -57,7 +75,8 @@
      <el-button type="primary" @click="handleAgree">同意</el-button>
      <el-button type="danger" @click="handleDisagree">驳回</el-button>
    </div>
    <deitDiscussion ref="DeitDiscussion">
    </deitDiscussion>
  </basic-container>
</template>
@@ -78,8 +97,15 @@
  completeTask
} from "@/api/work/work"
import website from '@/config/website'
import {
  getLists
} from "@/api/discuss/topics"
import deitDiscussion from "../../components/deitDiscussion.vue"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      taskId: '',
@@ -125,8 +151,7 @@
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          labelWidth: 120,
          width: 220,
          labelWidth: 140,
          overHidden: true,
          rules: [{
            required: true,
@@ -143,6 +168,7 @@
          search: true,
          span: 12,
          labelWidth: 140,
          width: 220,
          rules: [{
            required: true,
            message: "请输入维修项目名称",
@@ -186,14 +212,14 @@
          labelWidth: 140,
          value: '按建筑面积分摊',
          span: 12,
          row: true,
          // row: true,
          disabled: true
        },
        {
          label: '联系人',
          prop: 'linkman',
          span: 12,
          labelWidth: 120,
          labelWidth: 140,
          search: true,
          searchSpan: 4,
          rules: [{
@@ -260,6 +286,7 @@
          disabled: true
        },
        {
          disabled: true,
          display: false,
          hide: true,
          parent: false,
@@ -278,7 +305,7 @@
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          width: 260,
          labelWidth: 140,
          rules: [{
            required: true,
            message: "请选择议事",
@@ -287,10 +314,23 @@
          change: (val) => {
            console.log("val===>", val)
            // console.log("form===>",this.form)
          }
        },
        {
          disabled: true,
          display: false,
          span: 24,
          hide: true,
          prop: "vote",
          // formslot: true,
          slot:true,
          label: "投票详情",
          labelWidth:140
        },
        {
          label: "项目摘要",
          span: 24,
@@ -345,19 +385,38 @@
          },],
        }
        ],
      }
      },
      topictData: [],
      topicTitle: "",
      articleRange: ""
    }
  },
  'form.districtId': {
    handler(newData) {
      const column = this.findObject(this.option.column, "articleId")
      if (newData) {
        column.display = true;
      } else {
        column.display = false
  watch: {
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData && this.form.articleId) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    }
    },
    'form.articleId': {
      handler(newData) {
        console.log("data===>", newData)
        this.getVoteDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
  },
  created() {
    this.init()
  },
@@ -442,7 +501,24 @@
      this.$router.push({
        path: `/property/todo`
      })
    }
    },
    getVoteDetail(articleId, districtId) {
      let params = {
        level: 1,
        articleId: articleId,
        districtId: districtId
      }
      getLists(1, 10, params).then(res => {
        const data = res.data.data
        if (data.length) {
          this.topictData = data[0].children;
          this.topicTitle = data[0].discussContent;
        }
      })
    },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
  }
}
</script>
@@ -459,4 +535,7 @@
  left: 50%;
  transform: translateX(-50%);
}
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/property/propertyCapitalApply.vue
@@ -5,29 +5,19 @@
      v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
      <template slot-scope="{ row, size, index }" slot="voteForm">
        <div>{{ topicTitle }}</div>
        <el-table :data="topictData" v-if="topictData.length">
          <el-table-column width="300" property="optionContent" label="选项"
            label-class-name="workOrderStyle"></el-table-column>
          <el-table-column width="300" property="number" label="人数" label-class-name="workOrderStyle">
          </el-table-column>
          <el-table-column width="300">
            <template slot-scope="scope">
              <el-button slot="reference" type="primary" size="mini" @click="openUserPopup(scope.row, 1)">详情</el-button>
            </template>
          </el-table-column>
        </el-table>
      </template>
@@ -54,31 +44,21 @@
          v-text="textDispose(row, 'linkPhoneflag', 'linkPhone')">
        </el-button>
      </template>
      <template slot="constructionSchemeUrlsType" slot-scope="{file}">
        <span>{{ file }}</span>
      </template>
    </avue-crud>
    <el-drawer append-to-body :visible.sync="showDialog" width="80%" :modal="false">
      <span slot="title">{{ topicTitle }}</span>
      <avue-crud :option="optionList" :data="topictData" ref="crud2">
        <!-- <template #icon="scope">
          <i :class="scope.row.icon" style="font-size:14px"></i>
        </template> -->
        <template slot-scope="{row}" slot="number">
          <span style="margin-right:10px;">1</span>
          <el-button slot="reference" type="primary" size="mini" @click="openUserPopup(row, 1)">详情</el-button>
          <!-- <el-popover placement="right" width="400" trigger="click">
            <el-table :data="gridData">
              <el-table-column width="150" property="date" label="日期"></el-table-column>
@@ -87,18 +67,14 @@
            </el-table>
            <el-button slot="reference" type="primary"  size="mini">详情</el-button>
          </el-popover> -->
        </template>
      </avue-crud>
    </el-drawer>
    <deitDiscussion ref="DeitDiscussion">
    </deitDiscussion>
  </basic-container>
</template>
<script>
import {
  getList,
@@ -114,7 +90,6 @@
import func from "@/util/func"
import {
  getLists,
  getPage
} from "@/api/discuss/topics"
import deitDiscussion from "./components/deitDiscussion"
vue.config.js
@@ -38,8 +38,8 @@
        proxy: {
            "/api": {
                //本地服务接口地址
                // target:"http://192.168.2.109:9528",
                target: "https://srgdjczzxtpt.com:2080/api",
                target:"http://192.168.2.140:9528",
                // target: "https://srgdjczzxtpt.com:2080/api",
                // target: "https://kt39592615.goho.co",
                // target: "http://z4042833u6.wicp.vip",
                // target: "http://localhost:9528",