zhongrj
2024-02-28 cf29b0e7df3af2ce2c1fcd0b515132bdc038bd37
Merge branch 'master' of http://s16s652780.51mypc.cn:49896/r/jczz_web
6 files modified
2 files renamed
14 files added
1 files deleted
6769 ■■■■ changed files
node_modules.rar patch | view | raw | blame | history
src/api/categoryLabel/category.js 14 ●●●● patch | view | raw | blame | history
src/router/views/index.js 55 ●●●●● patch | view | raw | blame | history
src/views/property/propertyCapitalApply.vue 1284 ●●●● patch | view | raw | blame | history
src/views/property/propertyCompany.vue 7 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/components/deitDiscussion.vue 475 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/leave/detail.vue 107 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/leave/form.vue 112 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/leave/handle.vue 169 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/maintenanceFundApply/detail.vue 463 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/maintenanceFundApply/edit.vue 550 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/maintenanceFundApply/form.vue 267 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/process/maintenanceFundApply/handle.vue 542 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/propertyCapitalManage.vue 209 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/propertySupervision.vue 247 ●●●●● patch | view | raw | blame | history
src/views/propertySupervision/residentSupervision.vue 1603 ●●●● patch | view | raw | blame | history
src/views/userHouse/components/categoryList.vue 26 ●●●● patch | view | raw | blame | history
src/views/userHouse/components/houseLableList.vue patch | view | raw | blame | history
src/views/userHouse/components/houseStatistics.vue 214 ●●●●● patch | view | raw | blame | history
src/views/userHouse/components/placeStatistics.vue 156 ●●●●● patch | view | raw | blame | history
src/views/userHouse/lable/lableList.vue 41 ●●●●● patch | view | raw | blame | history
src/views/userHouse/lable/lableStatistics.vue 41 ●●●●● patch | view | raw | blame | history
src/views/userHouse/lable/statistics.vue 187 ●●●●● patch | view | raw | blame | history
node_modules.rar
Binary files differ
src/api/categoryLabel/category.js
@@ -32,13 +32,21 @@
  })
}
export const remove = (id) => {
export const remove = (ids) => {
  return request({
    url: '/api/blade-category/category/remove',
    method: 'post',
    params: {
      id,
      ids
    }
  })
}
export const update = (row) => {
  return request({
    url: '/api/blade-category/category/update',
    method: 'post',
    data: row
  })
}
@@ -48,4 +56,4 @@
    method: 'post',
    data: row
  })
}
}
src/router/views/index.js
@@ -238,4 +238,59 @@
      },
    ],
  },
  {
    path: "/propertySupervision/process/maintenanceFundApply",
    component: Layout,
    redirect: "/propertySupervision/process/maintenanceFundApply/form",
    children: [{
        path: "form/:processDefinitionId",
        name: "维修基金申请",
        meta: {
          i18n: "propertySupervision",
        },
        component: () =>
          import(
            /* webpackChunkName: "views" */
            "@/views/propertySupervision/process/maintenanceFundApply/form"
          ),
      },
      {
        path: "handle/:taskId/:processInstanceId/:businessId",
        name: "处理维修基金申请",
        meta: {
          i18n: "propertySupervision",
        },
        component: () =>
          import(
            /* webpackChunkName: "views" */
            "@/views/propertySupervision/process/maintenanceFundApply/handle"
          ),
      },
      {
        path: "detail/:processInstanceId/:businessId",
        name: "维修基金申请详情",
        meta: {
          i18n: "propertySupervision",
        },
        component: () =>
          import(
            /* webpackChunkName: "views" */
            "@/views/propertySupervision/process/maintenanceFundApply/detail"
          ),
      },
      {
        path: "edit/:taskId/:processInstanceId/:businessId",
        name: "调整维修基金申请",
        meta: {
          i18n: "propertySupervision",
        },
        component: () =>
          import(
            /* webpackChunkName: "views" */
            "@/views/propertySupervision/process/maintenanceFundApply/edit"
          ),
      },
    ],
  },
];
src/views/property/propertyCapitalApply.vue
@@ -23,6 +23,10 @@
      <template slot-scope="{ row, size, index }" slot="menu">
        <el-button :size="size" type="text" @click="goDetail(row)">查看申请
        </el-button>
        <el-button :size="size" type="text" v-if="row.applyStatus === 4" @click="handleWork(row)">调整申请
        </el-button>
        <!-- <el-button :size="size" type="text" @click="goDetail(row)">查看申请
@@ -76,677 +80,677 @@
  </basic-container>
</template>
<script>
import {
  getList,
  remove,
  update,
  add,
  getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply"
import {
  mapGetters
} from "vuex"
import website from '@/config/website'
import func from "@/util/func"
import {
  getLists,
} from "@/api/discuss/topics"
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
  } from "@/api/property/propertyCapitalApply"
  import {
    mapGetters
  } from "vuex"
  import website from '@/config/website'
  import func from "@/util/func"
  import {
    getLists,
  } from "@/api/discuss/topics"
import deitDiscussion from "./components/deitDiscussion"
  import deitDiscussion from "./components/deitDiscussion"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      showDialog: false,
      form: {
        // constructionSchemeUrls:[]
      },
      query: {},
      loading: true,
      page: {
        pageSize: 10,
        currentPage: 1,
        total: 0,
      },
      datetime: "",
      selectionList: [],
      option: {
        labelWidth: 154,
        searchLabelWidth: 96,
        searchShow: true,
        searchMenuSpan: 3,
        menuWidth: 210,
        height: "auto",
        calcHeight: 54,
        dialogWidth: 1150,
        tip: false,
        border: true,
        //stripe:true,
        index: true,
        editBtn: false,
        viewBtn: true,
        delBtn: false,
        selection: true,
        dialogClickModal: false,
        viewBtnText: "查看申请",
        column: [{
          width: 220,
          overHidden: true,
          label: '小区名称',
          addDisplay: false,
          editDisplay: false,
          viewDisplay: false,
          prop: "districtName",
          search: true,
          searchSpan: 4,
          searchLabelWidth: 76,
          rules: [{
            required: true,
            message: "请输入小区名称",
            trigger: "blur",
          }],
        },
        {
          hide: true,
          parent: false,
          label: "小区",
          prop: "districtId",
          search: false,
          type: 'tree',
          dicUrl: `/api/blade-district/district/getDistrictTree?filterFlag=1`,
          cascader: ['articleId'],
          props: {
            label: "name",
            value: "id"
          },
          defaultExpandedKeys: ["361102003"],
          span: 12,
          width: 260,
          rules: [{
            required: true,
            message: "请选择小区",
            trigger: "blur",
          },],
        },
        {
          label: '维修项目名称',
          prop: 'name',
          searchSpan: 5,
          searchLabelWidth: 124,
          search: true,
          span: 12,
          rules: [{
            required: true,
            message: "请输入维修项目名称",
            trigger: "blur",
          },],
        },
        {
          width: 110,
          label: "所属街道",
          addDisplay: false,
          editDisplay: false,
          viewDisplay: false,
          prop: "streetName",
          search: true,
          searchSpan: 4
        },
        {
          width: 156,
          overHidden: true,
          label: "所属社区",
          addDisplay: false,
          editDisplay: false,
          viewDisplay: false,
          prop: "communityName",
          search: true,
          searchSpan: 4
        },
        {
          width: 100,
          label: "预计开工时间",
          prop: "runTime",
          span: 12,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同开始时间",
            trigger: "blur",
          },],
        },
        {
          width: 100,
          label: "预计竣工时间",
          prop: "completedTime",
          span: 12,
          type: "date",
          format: "yyyy-MM-dd",
          valueFormat: "yyyy-MM-dd",
          rules: [{
            required: true,
            message: "请选择合同结束时间",
            trigger: "blur",
          },],
        },
        {
          label: "项目分摊方式",
          prop: "allocationWay",
          value: '按建筑面积分摊',
          span: 12,
          row: true,
        },
        {
          width: 110,
          label: '联系人',
          prop: 'linkman',
          span: 12,
          searchSpan: 4,
          searchLabelWidth: 80,
          search: true,
          rules: [{
            required: true,
            message: "请输入联系人",
            trigger: "blur",
          },],
        },
        {
          width: 120,
          label: '联系方式',
          prop: 'linkPhone',
          span: 12,
          rules: [{
            required: true,
            message: "请输入联系方式",
            trigger: "blur",
          },],
        },
        {
          width: 100,
          label: '申请时间',
          prop: 'applyTime',
          span: 12,
          display: false,
        }, {
          label: '审核进度',
          prop: 'applyStatus',
          span: 12,
          display: false,
          dicData: [{
            label: "待审核",
            value: 0,
          }, {
            label: "业委会",
            value: 1,
          }, {
            label: "街道",
            value: 2,
          }, {
            label: "区住建局",
            value: 3,
          }, {
            label: "调整申请",
            value: 4,
          }, {
            label: "审核通过",
            value: 5,
          }, {
            label: "审核不通过",
            value: 6,
          }, {
            label: "上饶住建局",
            value: 7,
          }]
        },
        {
          label: "项目预算总金额(元)",
          prop: "budgetAmount",
          span: 12,
          hide: true,
          type: 'number',
          precision: 2,
          value: '0.00'
        },
        {
          label: "实际预算金额(元)",
          prop: "actualAmount",
          span: 12,
          hide: true,
          type: 'number',
          precision: 2,
          value: '0.00'
        },
        {
          label: "自筹金额(元)",
          prop: "selfAmount",
          span: 12,
          hide: true,
          type: 'number',
          precision: 2,
          value: '0.00'
        },
        {
          label: "预算应拨付金额(元)",
          prop: "budgetAppropriateAmount",
          span: 12,
          hide: true,
          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&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",
          formslot: true,
          label: "投票详情"
        },
        {
          label: "项目摘要",
          span: 24,
          hide: true,
          prop: "projectDigest",
          placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
          type: "textarea"
        },
        {
          label: "项目进度描述",
          span: 24,
          hide: true,
          prop: "projectDescribe",
          type: "textarea"
        },
        {
          label: '施工方案附件',
          prop: 'constructionSchemeUrls',
          type: 'upload',
          span: 24,
          hide: true,
          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",
          },],
        }
        ],
      },
      data: [],
      optionList: {
        header: false,
        menu: false,
        headerAlign: 'center',
        align: 'center',
        border: true,
        addBtn: false,
        editBtn: false,
        delBtn: false,
        defaultExpandAll: true,
        rowKey: 'id',
        rowParentKey: 'parentId',
        column: [{
          label: '选项内容',
          prop: 'optionContent',
        },
        {
          label: '人数',
          prop: 'number',
          slot: true,
        }
        ]
      },
      topictData: [],
      topicTitle: "",
      articleRange: ""
    }
  },
  watch: {
    // 'form.districtId':{
    //   handler(newVal,oldVal){
    //     console.log("val===>", newVal)
    //     if(newVal){
    //         this.showDialog = true;
    //       }
    //   },
    //   deep: true,
    //     immediate: true
    // }
    'form.districtId': {
      handler(newData) {
        const column = this.findObject(this.option.column, "articleId")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
  export default {
    components: {
      deitDiscussion
    },
    'form.articleId': {
      handler(newData) {
        console.log("data===>", newData)
        this.getDetail(this.form.articleId, this.articleRange)
        const column = this.findObject(this.option.column, "vote")
        if (newData) {
          column.display = true;
        } else {
          column.display = false
        }
      }
    },
  },
  computed: {
    ...mapGetters(["permission", "userInfo"]),
    permissionList() {
    data() {
      return {
        addBtn: this.vaildData(this.permission.propertyCapitalApply_add, true),
        viewBtn: this.vaildData(this.permission.propertyCapitalApply_view, true),
        delBtn: this.vaildData(this.permission.propertyCapitalApply_delete, true),
        editBtn: this.vaildData(this.permission.propertyCapitalApply_edit, true),
        showDialog: false,
        form: {
          // constructionSchemeUrls:[]
        },
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0,
        },
        datetime: "",
        selectionList: [],
        option: {
          labelWidth: 154,
          searchLabelWidth: 96,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 210,
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          border: true,
          //stripe:true,
          index: true,
          editBtn: false,
          viewBtn: false,
          delBtn: false,
          selection: true,
          dialogClickModal: false,
          viewBtnText: "查看申请",
          column: [{
              width: 220,
              overHidden: true,
              label: '小区名称',
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "districtName",
              search: true,
              searchSpan: 4,
              searchLabelWidth: 76,
              rules: [{
                required: true,
                message: "请输入小区名称",
                trigger: "blur",
              }],
            },
            {
              hide: true,
              parent: false,
              label: "小区",
              prop: "districtId",
              search: false,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree?filterFlag=1`,
              cascader: ['articleId'],
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              width: 260,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchSpan: 5,
              searchLabelWidth: 124,
              search: true,
              span: 12,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
            },
            {
              width: 110,
              label: "所属街道",
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "streetName",
              search: true,
              searchSpan: 4
            },
            {
              width: 156,
              overHidden: true,
              label: "所属社区",
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "communityName",
              search: true,
              searchSpan: 4
            },
            {
              width: 100,
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
            },
            {
              width: 100,
              label: "预计竣工时间",
              prop: "completedTime",
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              value: '按建筑面积分摊',
              span: 12,
              row: true,
            },
            {
              width: 110,
              label: '联系人',
              prop: 'linkman',
              span: 12,
              searchSpan: 4,
              searchLabelWidth: 80,
              search: true,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
            },
            {
              width: 120,
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
            },
            {
              width: 100,
              label: '申请时间',
              prop: 'applyTime',
              span: 12,
              display: false,
            }, {
              label: '审核进度',
              prop: 'applyStatus',
              span: 12,
              display: false,
              dicData: [{
                label: "待审核",
                value: 0,
              }, {
                label: "业委会",
                value: 1,
              }, {
                label: "街道",
                value: 2,
              }, {
                label: "区住建局",
                value: 3,
              }, {
                label: "调整申请",
                value: 4,
              }, {
                label: "审核通过",
                value: 5,
              }, {
                label: "审核不通过",
                value: 6,
              }, {
                label: "上饶住建局",
                value: 7,
              }]
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              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&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",
              formslot: true,
              label: "投票详情"
            },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              type: "textarea"
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              type: "textarea"
            },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              span: 24,
              hide: true,
              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",
              }, ],
            }
          ],
        },
        data: [],
        optionList: {
          header: false,
          menu: false,
          headerAlign: 'center',
          align: 'center',
          border: true,
          addBtn: false,
          editBtn: false,
          delBtn: false,
          defaultExpandAll: true,
          rowKey: 'id',
          rowParentKey: 'parentId',
          column: [{
              label: '选项内容',
              prop: 'optionContent',
            },
            {
              label: '人数',
              prop: 'number',
              slot: true,
            }
          ]
        },
        topictData: [],
        topicTitle: "",
        articleRange: ""
      }
    },
    ids() {
      let ids = []
      this.selectionList.forEach((ele) => {
        ids.push(ele.id)
      })
      return ids.join(",")
    },
    watch: {
      // 'form.districtId':{
      //   handler(newVal,oldVal){
      //     console.log("val===>", newVal)
      //     if(newVal){
      //         this.showDialog = true;
      //       }
      //   },
      //   deep: true,
      //     immediate: true
    textDispose() {
      return (row, flag, type) => {
        if (row[flag] || row[type] == null) {
          return row[type]
        } else {
          if (type == 'principalIdCard') {
            return row[type].replace(/^(.{6})(?:\d+)(.{4})$/, "$1******$2")
      // }
      'form.districtId': {
        handler(newData) {
          const column = this.findObject(this.option.column, "articleId")
          if (newData) {
            column.display = true;
          } else {
            return row[type].replace(/^(.{3})(?:\d+)(.{4})$/, "$1****$2")
            column.display = false
          }
        }
      },
      'form.articleId': {
        handler(newData) {
          console.log("data===>", newData)
          this.getDetail(this.form.articleId, this.articleRange)
          const column = this.findObject(this.option.column, "vote")
          if (newData) {
            column.display = true;
          } else {
            column.display = false
          }
        }
      },
    },
    computed: {
      ...mapGetters(["permission", "userInfo"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.propertyCapitalApply_add, true),
          viewBtn: this.vaildData(this.permission.propertyCapitalApply_view, true),
          delBtn: this.vaildData(this.permission.propertyCapitalApply_delete, true),
          editBtn: this.vaildData(this.permission.propertyCapitalApply_edit, true),
        }
      },
      ids() {
        let ids = []
        this.selectionList.forEach((ele) => {
          ids.push(ele.id)
        })
        return ids.join(",")
      },
      textDispose() {
        return (row, flag, type) => {
          if (row[flag] || row[type] == null) {
            return row[type]
          } else {
            if (type == 'principalIdCard') {
              return row[type].replace(/^(.{6})(?:\d+)(.{4})$/, "$1******$2")
            } else {
              return row[type].replace(/^(.{3})(?:\d+)(.{4})$/, "$1****$2")
            }
          }
        }
      }
    }
  },
  methods: {
    rowView() {
      this.showDialog = false;
    },
    methods: {
      rowView() {
        this.showDialog = false;
      },
    showStringDispose(row, type) {
      row[type] = !row[type]
    },
      showStringDispose(row, type) {
        row[type] = !row[type]
      },
    handleWork(row) {
      this.$router.push({
        path: `/property/process/maintenanceFundApply/edit/${row.taskId}/${row.processInstanceId}/${row.id}`
      })
    },
    goDetail(row) {
      this.$router.push({
        path: `/property/process/maintenanceFundApply/detail/${row.processInstanceId}/${row.id}`
      })
    },
    rowSave(row, done, loading) {
      row.constructionSchemeUrls = func.join(row.constructionSchemeUrls)
      if (row.constructionSchemeUrls.length > 0) {
        var urls = []
        var split = row.constructionSchemeUrls.split(",")
        split.forEach(url => {
          var names = url.split("jczz/")
          urls.push(names[1])
      handleWork(row) {
        this.$router.push({
          path: `/property/process/maintenanceFundApply/edit/${row.taskId}/${row.processInstanceId}/${row.id}`
        })
        row.constructionSchemeUrls = urls.join(",")
      }
      row.propertyFlag = 1
      add(row).then(
        () => {
          this.onLoad(this.page)
          this.$message({
            type: "success",
            message: "操作成功!",
      },
      goDetail(row) {
        this.$router.push({
          path: `/property/process/maintenanceFundApply/detail/${row.processInstanceId}/${row.id}`
        })
      },
      rowSave(row, done, loading) {
        row.constructionSchemeUrls = func.join(row.constructionSchemeUrls)
        if (row.constructionSchemeUrls.length > 0) {
          var urls = []
          var split = row.constructionSchemeUrls.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          done()
        },
        (error) => {
          window.console.log(error)
          loading()
          row.constructionSchemeUrls = urls.join(",")
        }
      )
    },
    rowUpdate(row, index, done, loading) {
      if (row.constructionSchemeUrls.length > 0) {
        var urls = []
        var split = row.constructionSchemeUrls.split(",")
        split.forEach(url => {
          var names = url.split("jczz/")
          urls.push(names[1])
        })
        row.constructionSchemeUrls = urls.join(",")
      }
      update(row).then(
        () => {
          this.onLoad(this.page)
          this.$message({
            type: "success",
            message: "操作成功!",
          })
          done()
        },
        (error) => {
          window.console.log(error)
          loading()
        }
      )
    },
    rowDel(row) {
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          return remove(row.id)
        })
        .then(() => {
          this.onLoad(this.page)
          this.$message({
            type: "success",
            message: "操作成功!",
          })
        })
    },
    searchReset() {
      this.query = {}
      this.onLoad(this.page)
    },
    searchChange(params, done) {
      this.query = params
      this.page.currentPage = 1
      this.onLoad(this.page, params)
      done()
    },
    selectionChange(list) {
      console.log(111);
      this.selectionList = list
    },
    selectionClear() {
      this.selectionList = []
      this.$refs.crud.toggleSelection()
    },
    handleDelete() {
      if (this.selectionList.length === 0) {
        this.$message.warning("请选择至少一条数据")
        return
      }
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          return remove(this.ids)
        })
        .then(() => {
          this.onLoad(this.page)
          this.$message({
            type: "success",
            message: "操作成功!",
          })
          this.$refs.crud.toggleSelection()
        })
    },
    beforeOpen(done, type) {
      if (["edit", "view"].includes(type)) {
        getPropertyCapitalApply(this.form.id).then((res) => {
          this.form = res.data.data
          this.form.propertyFlag = 1
          if (this.form.constructionSchemeUrls.length > 0) {
            var urls = []
            var names = this.form.constructionSchemeUrls.split(",")
            names.forEach(name => {
              urls.push(website.minioUrl + name)
        row.propertyFlag = 1
        add(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            this.form.constructionSchemeUrls = urls.join(",")
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        })
      }
      // con
      done()
    },
    currentChange(currentPage) {
      this.page.currentPage = currentPage
    },
    sizeChange(pageSize) {
      this.page.pageSize = pageSize
    },
    refreshChange() {
      this.onLoad(this.page, this.query)
    },
    onLoad(page, params = {}) {
      const {
        dateTime
      } = this.query
      let values = {
        ...params,
      }
      if (dateTime) {
        values = {
        )
      },
      rowUpdate(row, index, done, loading) {
        if (row.constructionSchemeUrls.length > 0) {
          var urls = []
          var split = row.constructionSchemeUrls.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          row.constructionSchemeUrls = urls.join(",")
        }
        update(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
      },
      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
          .then(() => {
            return remove(row.id)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
          })
      },
      searchReset() {
        this.query = {}
        this.onLoad(this.page)
      },
      searchChange(params, done) {
        this.query = params
        this.page.currentPage = 1
        this.onLoad(this.page, params)
        done()
      },
      selectionChange(list) {
        console.log(111);
        this.selectionList = list
      },
      selectionClear() {
        this.selectionList = []
        this.$refs.crud.toggleSelection()
      },
      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据")
          return
        }
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
          .then(() => {
            return remove(this.ids)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            this.$refs.crud.toggleSelection()
          })
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
          getPropertyCapitalApply(this.form.id).then((res) => {
            this.form = res.data.data
            this.form.propertyFlag = 1
            if (this.form.constructionSchemeUrls.length > 0) {
              var urls = []
              var names = this.form.constructionSchemeUrls.split(",")
              names.forEach(name => {
                urls.push(website.minioUrl + name)
              })
              this.form.constructionSchemeUrls = urls.join(",")
            }
          })
        }
        // con
        done()
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize
      },
      refreshChange() {
        this.onLoad(this.page, this.query)
      },
      onLoad(page, params = {}) {
        const {
          dateTime
        } = this.query
        let values = {
          ...params,
          startTime: dateTime[0],
          endTime: dateTime[1],
          ...this.query,
        }
        values.dateTime = null
      }
      this.loading = true
      getList(page.currentPage, page.pageSize, values).then((res) => {
        const data = res.data.data
        this.page.total = data.total
        this.data = data.records
        this.data.forEach(item => {
          this.$set(item, 'linkPhoneflag', false)
          if (item.constructionSchemeUrls.length > 0) {
            var urls = []
            var names = item.constructionSchemeUrls.split(",")
            names.forEach(name => {
              urls.push(website.minioUrl + name)
            })
            item.constructionSchemeUrls = urls.join(",")
        if (dateTime) {
          values = {
            ...params,
            startTime: dateTime[0],
            endTime: dateTime[1],
            ...this.query,
          }
          values.dateTime = null
        }
        this.loading = true
        getList(page.currentPage, page.pageSize, values).then((res) => {
          const data = res.data.data
          this.page.total = data.total
          this.data = data.records
          this.data.forEach(item => {
            this.$set(item, 'linkPhoneflag', false)
            if (item.constructionSchemeUrls.length > 0) {
              var urls = []
              var names = item.constructionSchemeUrls.split(",")
              names.forEach(name => {
                urls.push(website.minioUrl + name)
              })
              item.constructionSchemeUrls = urls.join(",")
            }
          })
          this.loading = false
          this.selectionClear()
        })
      },
      getDetail(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;
          }
        })
        this.loading = false
        this.selectionClear()
      })
    },
      },
    getDetail(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])
      },
    openUserPopup(row) {
      this.$refs.DeitDiscussion.openUser(row, 1, [this.form.districtId])
    },
    }
  }
}
</script>
<style>
.avue-upload__icon {
  line-height: 6;
}
  .avue-upload__icon {
    line-height: 6;
  }
.workOrderStyle {
  font-weight: normal;
}
  .workOrderStyle {
    font-weight: normal;
  }
</style>
src/views/property/propertyCompany.vue
@@ -200,6 +200,13 @@
              // width: 100,
            },
            {
              width: 210,
              overHidden: true,
              label: "管理小区",
              prop: "districtNames",
              display: false
            },
            {
              label: "简介",
              prop: "remark",
              component: "AvueUeditor",
src/views/propertySupervision/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/propertySupervision/process/leave/detail.vue
New file
@@ -0,0 +1,107 @@
<template>
  <basic-container>
    <el-form ref="form" :model="form" label-width="80px">
      <el-row type="flex" class="row-bg" justify="end">
        <el-form-item>
          <el-button @click="handleCancel">关闭</el-button>
        </el-form-item>
      </el-row>
      <el-card shadow="hover">
        <div slot="header">
          <span>审批信息</span>
        </div>
        <el-form-item label="申请人">
          <el-input :disabled="true" v-model="form.flow.assigneeName" />
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="开始时间">
              <el-input :disabled="true" v-model="form.startTime" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="结束时间">
              <el-input :disabled="true" v-model="form.endTime" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="请假理由">
          <el-input :disabled="true" type="textarea" v-model="form.reason" />
        </el-form-item>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程信息</span>
        </div>
        <el-row type="flex" class="row-bg">
          <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>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </el-row>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程跟踪</span>
        </div>
        <el-row class="row-bg">
          <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
        </el-row>
      </el-card>
    </el-form>
  </basic-container>
</template>
<script>
  import {historyFlowList, leaveDetail} from "@/api/work/process";
  export default {
    data() {
      return {
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow:{
            assigneeName:'',
          },
          startTime: '',
          endTime: '',
          reason: '',
        }
      }
    },
    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;
          }
        })
        leaveDetail(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`});
      }
    }
  }
</script>
src/views/propertySupervision/process/leave/form.vue
New file
@@ -0,0 +1,112 @@
<template>
  <div>
    <basic-container>
      <avue-form :option="option" v-model="form" @submit="handleSubmit"/>
    </basic-container>
    <basic-container>
      <flow-design :is-display="true" :process-definition-id="processDefinitionId"></flow-design>
    </basic-container>
  </div>
</template>
<script>
  import {leaveProcess} from "@/api/work/process";
  export default {
    data() {
      return {
        processDefinitionId: '',
        form: {},
        option: {
          group: [
            {
              icon: 'el-icon-info',
              label: '请假基础信息',
              prop: 'group1',
              column: [
                {
                  label: '审批人员',
                  prop: 'taskUser',
                  type: 'select',
                  dicUrl: `/api/blade-system/user/user-list`,
                  props: {
                    label: "account",
                    value: "id"
                  },
                  span: 24,
                  rules: [
                    {
                      required: true,
                      message: '请选择审批人员',
                      trigger: 'blur'
                    }
                  ]
                },
                {
                  label: '开始时间',
                  prop: 'startTime',
                  type: 'datetime',
                  valueFormat: 'yyyy-MM-dd HH:mm:ss',
                  rules: [
                    {
                      required: true,
                      message: '请选择开始时间',
                      trigger: 'blur'
                    }
                  ]
                },
                {
                  label: '结束时间',
                  prop: 'endTime',
                  type: 'datetime',
                  valueFormat: 'yyyy-MM-dd HH:mm:ss',
                  rules: [
                    {
                      required: true,
                      message: '请选择结束时间',
                      trigger: 'blur'
                    }
                  ]
                },
                {
                  label: '请假理由',
                  prop: 'reason',
                  type: 'textarea',
                  span: 24,
                  rules: [
                    {
                      required: true,
                      message: '请输入请假理由',
                      trigger: 'blur'
                    }
                  ]
                },
              ]
            },
          ],
        }
      }
    },
    created() {
      this.processDefinitionId = this.$route.params.processDefinitionId;
    },
    methods: {
      handleSubmit() {
        const params = {
          processDefinitionId: this.$route.params.processDefinitionId,
          ...this.form,
        };
        leaveProcess(params).then(resp => {
          const data = resp.data;
          if (data.success) {
            this.$message.success(data.msg);
            this.$router.$avueRouter.closeTag();
            this.$router.push({path: `/work/start`});
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        });
      }
    }
  }
</script>
src/views/propertySupervision/process/leave/handle.vue
New file
@@ -0,0 +1,169 @@
<template>
  <basic-container>
    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
      <el-row type="flex" class="row-bg" justify="end">
        <el-form-item>
          <el-button type="primary" @click="handleAgree">同意</el-button>
          <el-button type="danger" @click="handleDisagree">驳回</el-button>
          <el-button @click="handleCancel">关闭</el-button>
        </el-form-item>
      </el-row>
      <el-card shadow="hover">
        <div slot="header">
          <span>审批信息</span>
        </div>
        <el-form-item label="申请人">
          <el-input :disabled="true" v-model="form.flow.assigneeName"/>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="开始时间">
              <el-input :disabled="true" v-model="form.startTime"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="结束时间">
              <el-input :disabled="true" v-model="form.endTime"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="请假理由">
          <el-input :disabled="true" type="textarea" v-model="form.reason"/>
        </el-form-item>
        <el-form-item label="批复意见">
          <el-input type="textarea" v-model="form.comment"/>
        </el-form-item>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程信息</span>
        </div>
        <el-row type="flex" class="row-bg">
          <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>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </el-row>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程跟踪</span>
        </div>
        <el-row class="row-bg">
          <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
        </el-row>
      </el-card>
    </el-form>
  </basic-container>
</template>
<script>
  import {historyFlowList, leaveDetail} from "@/api/work/process";
  import {completeTask} from "@/api/work/work";
  export default {
    data() {
      return {
        taskId: '',
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          startTime: '',
          endTime: '',
          reason: '',
          comment: '',
        },
      }
    },
    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;
          }
        })
        leaveDetail(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: `/work/start`});
          } 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: `/work/start`});
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        })
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag();
        this.$router.push({path: `/work/start`});
      }
    }
  }
</script>
src/views/propertySupervision/process/maintenanceFundApply/detail.vue
New file
@@ -0,0 +1,463 @@
<template>
  <basic-container>
    <el-form ref="form" :model="form" label-width="80px">
      <!-- <el-row type="flex" class="row-bg" justify="end">
        <el-form-item>
          <el-button @click="handleCancel">关闭</el-button>
        </el-form-item>
      </el-row> -->
      <el-card shadow="hover">
        <div slot="header">
          <span>审批信息</span>
        </div>
        <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>
        <el-row>
          <el-col :span="12">
            <el-form-item label="开始时间">
              <el-input :disabled="true" v-model="form.startTime" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="结束时间">
              <el-input :disabled="true" v-model="form.endTime" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="请假理由">
          <el-input :disabled="true" type="textarea" v-model="form.reason" />
        </el-form-item> -->
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程信息</span>
        </div>
        <el-row type="flex" class="row-bg">
          <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>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </el-row>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程跟踪</span>
        </div>
        <el-row class="row-bg">
          <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
        </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 {
  getLists
} from "@/api/discuss/topics"
import deitDiscussion from "../../components/deitDiscussion.vue"
export default {
  components: {
    deitDiscussion
  },
  data() {
    return {
      businessId: '',
      processInstanceId: '',
      src: '',
      flowList: [],
      form: {
        flow: {
          assigneeName: '',
        },
        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
        }
      }
    },
    '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>
<style>
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/propertySupervision/process/maintenanceFundApply/edit.vue
New file
@@ -0,0 +1,550 @@
<template>
  <basic-container>
    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
      <!--  <el-row type="flex" class="row-bg" justify="end">
        <el-form-item>
          <el-button @click="handleCancel">关闭</el-button>
        </el-form-item>
      </el-row> -->
      <el-card shadow="hover">
        <div slot="header">
          <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> -->
          </template>
        </avue-form>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程信息</span>
        </div>
        <el-row type="flex" class="row-bg">
          <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>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </el-row>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程跟踪</span>
        </div>
        <el-row class="row-bg">
          <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
        </el-row>
      </el-card>
    </el-form>
    <div style="text-align: center;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 10px;">
      <el-button type="primary" @click="handleAgree">重新提交</el-button>
      <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 {
  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: '',
        },
        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,
          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)
          }
        },
        {
          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",
          },],
        }
        ],
      },
      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>
<style>
.workOrderStyle {
  font-weight: normal;
}
</style>
src/views/propertySupervision/process/maintenanceFundApply/form.vue
New file
@@ -0,0 +1,267 @@
<template>
  <div>
    <basic-container>
      <avue-form :option="option" v-model="form" @submit="handleSubmit" />
    </basic-container>
    <basic-container>
      <flow-design :is-display="true" :process-definition-id="processDefinitionId"></flow-design>
    </basic-container>
  </div>
</template>
<script>
  import {
    leaveProcess
  } from "@/api/work/process";
  export default {
    data() {
      return {
        processDefinitionId: '',
        form: {},
        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: '施工方案附件',
              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.processDefinitionId = this.$route.params.processDefinitionId;
    },
    methods: {
      handleSubmit(form, done, loading) {
        form.constructionSchemeUrls = func.join(form.constructionSchemeUrls)
        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(",")
        }
        add(form).then(
          () => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!",
            });
            done();
          },
          (error) => {
            window.console.log(error);
            loading();
          }
        );
      },
      handleSubmit() {
        const params = {
          processDefinitionId: this.$route.params.processDefinitionId,
          ...this.form,
        };
        leaveProcess(params).then(resp => {
          const data = resp.data;
          if (data.success) {
            this.$message.success(data.msg);
            this.$router.$avueRouter.closeTag();
            this.$router.push({
              path: `/work/start`
            });
          } else {
            this.$message.error(data.msg || '提交失败');
          }
        });
      }
    }
  }
</script>
src/views/propertySupervision/process/maintenanceFundApply/handle.vue
New file
@@ -0,0 +1,542 @@
<template>
  <basic-container>
    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
      <!-- <el-row type="flex" class="row-bg" justify="end">
        <el-form-item>
          <el-button @click="handleCancel">关闭</el-button>
        </el-form-item>
      </el-row> -->
      <el-card shadow="hover">
        <div slot="header">
          <span>审批信息</span>
        </div>
        <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">
        <div slot="header">
          <span>流程信息</span>
        </div>
        <el-row type="flex" class="row-bg">
          <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>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </el-row>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程跟踪</span>
        </div>
        <el-row class="row-bg">
          <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
        </el-row>
      </el-card>
    </el-form>
    <!-- <div style="">
      <el-button type="primary" @click="handleAgree">同意</el-button>
      <el-button type="danger" @click="handleDisagree">驳回</el-button>
    </div> -->
    <div style="text-align: center;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 10px;">
      <el-button type="primary" @click="handleAgree">同意</el-button>
      <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 {
    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"
  import deitDiscussion from "../../components/deitDiscussion.vue"
  export default {
    components: {
      deitDiscussion
    },
    data() {
      return {
        taskId: '',
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          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: 140,
              overHidden: true,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchLabelWidth: 120,
              searchSpan: 5,
              search: true,
              span: 12,
              labelWidth: 140,
              width: 220,
              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: 140,
              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&districtIdList={{districtId}}`,
              // slot: true,
              formslot: true,
              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)
              }
            },
            {
              disabled: true,
              display: false,
              span: 24,
              hide: true,
              prop: "vote",
              // formslot: true,
              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",
              }, ],
            }
          ],
        },
        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) {
          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()
    },
    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: `/propertySupervision/propertyCapitalManage`
            })
          } 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: `/propertySupervision/propertyCapitalManage`
            })
          } else {
            this.$message.error(data.msg || '提交失败')
          }
        })
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag()
        this.$router.push({
          path: `/propertySupervision/propertyCapitalManage`
        })
      },
      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;
    /* 确保按钮相对于该元素定位 */
  }
  #myButton {
    position: fixed;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
  }
  .workOrderStyle {
    font-weight: normal;
  }
</style>
src/views/propertySupervision/propertyCapitalManage.vue
@@ -1,5 +1,6 @@
<template>
  <basic-container>
    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
@@ -13,6 +14,13 @@
        <el-button type="text" :size="size" icon="el-icon-search" v-if="permission.work_todo_follow"
          @click.stop="handleImage(row, index)">流程图
        </el-button>
      </template>
      <template slot="menuLeft">
        <div class="tab-list">
          <div :class="{ 'choose': typeStatus == 1 }" @click="changeType(1)">待处理</div>
          <div :class="{ 'choose': typeStatus == 2 }" @click="changeType(2)">已处理</div>
        </div>
      </template>
      <template slot-scope="{row, size}" slot="processDefinitionVersion">
        <el-tag :size="size">v{{ row.processDefinitionVersion }}</el-tag>
@@ -42,6 +50,7 @@
  export default {
    data() {
      return {
        typeStatus: 1,
        form: {},
        selectionId: '',
        selectionList: [],
@@ -176,6 +185,12 @@
      }
    },
    methods: {
      changeType(type) {
        this.typeStatus = type
        this.page.currentPage = 1
        // this.onLoad(this.page)
      },
      showStringDispose(row, type) {
        row[type] = !row[type]
      },
@@ -199,12 +214,12 @@
      },
      handleWork(row) {
        this.$router.push({
          path: `/property/process/${flowRoute(this.flowRoutes, row.category)}/handle/${row.taskId}/${row.processInstanceId}/${row.businessId}`
          path: `/propertySupervision/process/${flowRoute(this.flowRoutes, row.category)}/handle/${row.taskId}/${row.processInstanceId}/${row.businessId}`
        })
      },
      handleDetail(row) {
        this.$router.push({
          path: `/property/process/${flowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}`
          path: `/propertySupervision/process/${flowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}`
        })
      },
      handleImage(row) {
@@ -244,4 +259,192 @@
      }
    }
  }
</script>
</script>
<style lang="scss" scoped>
  .avue-upload__icon {
    line-height: 6;
  }
  .tab-list {
    display: flex;
    margin-right: 6px;
    border: 1px solid #dcdfe6;
    color: #606266;
    border-radius: 4px;
    height: 34px;
    &>div {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 60px;
      cursor: pointer;
      font-size: 12px;
    }
    &>div:nth-child(2) {
      border-left: 1px solid #dcdfe6;
      border-right: 1px solid #dcdfe6;
    }
    .choose {
      color: #FFF;
      background-color: #409dfe;
    }
  }
  :deep(.avue-crud__left) {
    display: flex;
    align-items: center;
  }
  :deep(.el-drawer__header) {
    margin-bottom: 10px;
  }
  :deep(.el-radio__input.is-disabled+span.el-radio__label) {
    color: #000;
  }
  :deep(.el-radio__input.is-checked+.el-radio__label) {
    color: #409EFF !important;
  }
  :deep(.el-radio__input.is-checked .el-radio__inner::after) {
    background-color: #FFF;
  }
  :deep(.el-radio__input.is-checked .el-radio__inner) {
    background-color: #409EFF;
  }
  :deep(.el-radio) {
    margin-right: 20px;
  }
  .title {
    margin: 10px;
    height: 40px;
    background-color: #eee;
    display: flex;
    align-items: center;
    .icon {
      width: 4px;
      height: 18px;
      background-color: #409dfe;
      margin: 0 10px;
      color: transparent;
    }
  }
  .basic-info {
    padding: 0 20px;
    font-size: 14px;
    .info-item {
      display: flex;
      padding: 10px;
      .info-name {
        width: 100px;
        display: flex;
        align-items: center;
      }
      .info-value {
        display: flex;
        align-items: center;
      }
    }
  }
  .question-list {
    padding: 0 20px;
    font-size: 14px;
    .question-type {
      height: 60px;
      display: flex;
      align-items: center;
      cursor: pointer;
      justify-content: space-between;
      padding-right: 20px;
      .type-name {}
      .icon-box {}
    }
    .question-item {
      margin-bottom: 20px;
      padding: 10px;
      background: #f5f7fa;
      border-radius: 8px;
      &>div {
        margin: 14px 0;
      }
      .question-name {
        display: flex;
        .key {
          width: 80%;
          padding-right: 20px;
          word-break: break-all;
        }
        .value {
          width: 20%;
          display: flex;
          align-items: center;
          justify-content: center;
        }
      }
      .yh-pic-box {
        display: flex;
        height: 100px;
        .yh-pic-name {
          width: 100px;
          display: flex;
          align-items: center;
          justify-content: left;
        }
        .yh-pic-list {
          width: 0;
          flex: 1;
          display: flex;
        }
      }
      .yh-remark {
        display: flex;
        .yh-remark-name {
          width: 100px;
          display: flex;
          align-items: center;
          justify-content: left;
        }
        .yh-remark-value {
          word-break: break-all;
        }
      }
    }
    .remark-box {
      padding: 10px;
      background-color: #f5f7fa;
      border-radius: 8px;
      min-height: 40px;
      margin-bottom: 20px;
    }
  }
</style>
src/views/propertySupervision/propertySupervision.vue
New file
@@ -0,0 +1,247 @@
<template>
  <basic-container>
    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
      @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="menu">
        <el-button type="text" :size="size" icon="el-icon-s-check" v-if="permission.work_todo_handle"
          @click.stop="handleWork(row)">处理
        </el-button>
        <el-button type="text" :size="size" icon="el-icon-info" v-if="permission.work_todo_detail"
          @click.stop="handleDetail(row)">详情
        </el-button>
        <el-button type="text" :size="size" icon="el-icon-search" v-if="permission.work_todo_follow"
          @click.stop="handleImage(row, index)">流程图
        </el-button>
      </template>
      <template slot-scope="{row, size}" slot="processDefinitionVersion">
        <el-tag :size="size">v{{ row.processDefinitionVersion }}</el-tag>
      </template>
      <template slot-scope="{row, size}" slot="linkPhone">
        <el-button :size="size" type="text" @click="showStringDispose(row, 'linkPhoneflag')"
          v-text="textDispose(row, 'linkPhoneflag', 'linkPhone')">
        </el-button>
      </template>
    </avue-crud>
    <flow-design is-dialog :is-display.sync="flowBox" :process-instance-id="processInstanceId"></flow-design>
  </basic-container>
</template>
<script>
  import {
    mapGetters
  } from "vuex"
  import {
    todoList
  } from "@/api/work/work"
  import {
    flowCategory,
    flowRoute
  } from "@/util/flow"
  export default {
    data() {
      return {
        form: {},
        selectionId: '',
        selectionList: [],
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        processInstanceId: '',
        flowBox: false,
        workBox: false,
        option: {
          labelWidth: 120,
          searchLabelWidth: 96,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 210,
          height: 'auto',
          calcHeight: 30,
          tip: false,
          simplePage: true,
          border: true,
          index: true,
          // selection: true,
          editBtn: false,
          addBtn: false,
          viewBtn: false,
          delBtn: false,
          dialogWidth: 900,
          dialogClickModal: false,
          column: [{
              label: "流程分类",
              type: "select",
              row: true,
              dicUrl: "/api/blade-system/dict/dictionary?code=flow",
              props: {
                label: "dictValue",
                value: "dictKey"
              },
              dataType: "number",
              slot: true,
              prop: "category",
              // search: true,
              hide: true,
              width: 100,
            },
            {
              width: 100,
              label: '申请类型',
              prop: 'categoryName',
              // search: true,
            },
            {
              width: 220,
              overHidden: true,
              label: "小区",
              prop: "districtId",
              // search: true,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              searchSpan: 5,
              span: 12,
            },
            {
              width: 110,
              label: '联系人',
              prop: 'linkman',
              // search: true,
            },
            {
              width: 120,
              label: '联系电话',
              prop: 'linkPhone',
              // search: true,
              slot: true
            },
            {
              label: '项目名称',
              prop: 'name',
              // search: true,
            },
            {
              label: '当前步骤',
              prop: 'taskName',
            },
            // {
            //   label: '流程版本',
            //   prop: 'processDefinitionVersion',
            //   // slot: true,
            //   width: 80,
            // },
            {
              width: 144,
              label: '申请时间',
              prop: 'createTime',
            },
          ]
        },
        data: []
      }
    },
    computed: {
      ...mapGetters(["permission", "flowRoutes"]),
      ids() {
        let ids = []
        this.selectionList.forEach(ele => {
          ids.push(ele.id)
        })
        return ids.join(",")
      },
      textDispose() {
        return (row, flag, type) => {
          if (row[flag] || row[type] == null) {
            return row[type]
          } else {
            if (type == 'principalIdCard') {
              return row[type].replace(/^(.{6})(?:\d+)(.{4})$/, "$1******$2")
            } else {
              return row[type].replace(/^(.{3})(?:\d+)(.{4})$/, "$1****$2")
            }
          }
        }
      }
    },
    methods: {
      showStringDispose(row, type) {
        row[type] = !row[type]
      },
      searchReset() {
        this.query = {}
        this.onLoad(this.page)
      },
      searchChange(params, done) {
        this.query = params
        this.page.currentPage = 1
        this.onLoad(this.page, params)
        done()
      },
      selectionChange(list) {
        this.selectionList = list
      },
      selectionClear() {
        this.selectionList = []
        this.$refs.crud.toggleSelection()
      },
      handleWork(row) {
        this.$router.push({
          path: `/propertySupervision/process/${flowRoute(this.flowRoutes, row.category)}/handle/${row.taskId}/${row.processInstanceId}/${row.businessId}`
        })
      },
      handleDetail(row) {
        this.$router.push({
          path: `/propertySupervision/process/${flowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}`
        })
      },
      handleImage(row) {
        this.processInstanceId = row.processInstanceId
        this.flowBox = true
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize
      },
      refreshChange() {
        this.onLoad(this.page, this.query)
      },
      onLoad(page, params = {}) {
        const query = {
          ...this.query,
          category: (params.category) ? flowCategory(params.category) : null
        }
        this.loading = true
        todoList(page.currentPage, page.pageSize, Object.assign(params, query)).then(res => {
          const data = {
            ...res.data.data,
            records: res.data.data.records.map(item => {
              return {
                ...item,
                'linkPhoneflag': false
              }
            })
          }
          this.page.total = data.total
          this.data = data.records
          this.loading = false
          this.selectionClear()
        })
      }
    }
  }
</script>
src/views/propertySupervision/residentSupervision.vue
@@ -1,85 +1,85 @@
<template>
    <div class="cur-resident-supervision-page" v-loading="loading">
        <div class="echarts-wrap">
            <div class="echarts-cell" v-for="(i, k) in labelCountList" :key="k">
                <box-title :title="i.name" :classVal="9" :classStyle="'echarts-title'"></box-title>
                <div class="echarts-item"></div>
            </div>
        </div>
        <div class="cur-from-box">
            <avue-crud :option="option" :search.sync="search" :table-loading="loading" :data="data" ref="crud"
                v-model="form" :permission="permissionList" @row-del="rowDel" @row-update="rowUpdate" @row-save="rowSave"
                :before-open="beforeOpen" :page.sync="page" @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}" slot="menu">
                    <el-button :size="size" type="text" icon="el-icon-circle-plus-outline"
                        v-if="permission.househould_manager" @click="manageLabel(row)">标签
                    </el-button>
                </template>
                <template slot-scope="{row, size}" slot="phoneNumber">
                    <el-button :size="size" type="text" @click="showStringDispose(row, 'phoneNumberflag')">
                        {{ textDispose(row, 'phoneNumberflag', 'phoneNumber') }}
                    </el-button>
                </template>
                <template slot-scope="{row, size}" slot="idCard">
                    <el-button :size="size" type="text" @click="showStringDispose(row, 'idCardflag')"
                        v-text="textDispose(row, 'idCardflag', 'idCard')"></el-button>
                </template>
                <template slot-scope="{row, size}" slot="householdLabelList">
                    {{ labelDispose(row.householdLabelList) }}
                </template>
            </avue-crud>
        </div>
        <el-dialog title="用户角色配置" append-to-body :visible.sync="roleBox" width="345px" center>
            <el-tree :data="roleGrantList" show-checkbox check-strictly default-expand-all node-key="id" ref="treeRole"
                :default-checked-keys="roleTreeObj" :props="props">
            </el-tree>
            <span slot="footer" class="dialog-footer">
                <el-button size="small" @click="roleBox = false">取 消</el-button>
                <el-button size="small" type="primary" @click="submitRole">确 定</el-button>
            </span>
        </el-dialog>
        <el-dialog title="标签管理" append-to-body :visible.sync="labelFlag" center width="600px">
            <div>
                <div class="grid-container2">
                    <div class="grid-item" :style="{ backgroundColor: item2.color }" v-for="(item2, index2) in labelData"
                        @click="changLabel(item2)" :key="index2">
                        {{ item2.name }}
                    </div>
                </div>
            </div>
        </el-dialog>
        <el-dialog :title="'编辑标签   ' + currentLabel.name" append-to-body :visible.sync="editLabelFlge" width="655px">
            <avue-form :option="labelOption" v-model="labelForm" :submit="onsubmit">
            </avue-form>
            <span slot="footer" class="dialog-footer">
                <el-button size="small" @click="editLabelFlge = false">取 消</el-button>
                <el-button size="small" type="primary" @click="onsubmit">确 定</el-button>
            </span>
        </el-dialog>
        <el-dialog title="用户数据导入" append-to-body :visible.sync="excelBox" width="555px">
            <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
                <template slot="excelTemplate">
                    <el-button size="small" type="primary" @click="handleTemplate">
                        点击下载<i class="el-icon-download el-icon--right"></i>
                    </el-button>
                </template>
            </avue-form>
        </el-dialog>
  <div class="cur-resident-supervision-page" v-loading="loading">
    <div class="echarts-wrap">
      <div class="echarts-cell" v-for="(i, k) in labelCountList" :key="k">
        <box-title :title="i.name" :classVal="9" :classStyle="'echarts-title'"></box-title>
        <div class="echarts-item"></div>
      </div>
    </div>
    <div class="cur-from-box">
      <avue-crud :option="option" :search.sync="search" :table-loading="loading" :data="data" ref="crud" v-model="form"
        :permission="permissionList" @row-del="rowDel" @row-update="rowUpdate" @row-save="rowSave"
        :before-open="beforeOpen" :page.sync="page" @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}" slot="menu">
          <el-button :size="size" type="text" icon="el-icon-circle-plus-outline" v-if="permission.househould_manager"
            @click="manageLabel(row)">标签
          </el-button>
        </template>
        <template slot-scope="{row, size}" slot="phoneNumber">
          <el-button :size="size" type="text" @click="showStringDispose(row, 'phoneNumberflag')">
            {{ textDispose(row, 'phoneNumberflag', 'phoneNumber') }}
          </el-button>
        </template>
        <template slot-scope="{row, size}" slot="idCard">
          <el-button :size="size" type="text" @click="showStringDispose(row, 'idCardflag')"
            v-text="textDispose(row, 'idCardflag', 'idCard')"></el-button>
        </template>
        <template slot-scope="{row, size}" slot="householdLabelList">
          {{ labelDispose(row.householdLabelList) }}
        </template>
      </avue-crud>
    </div>
    <el-dialog title="用户角色配置" append-to-body :visible.sync="roleBox" width="345px" center>
      <el-tree :data="roleGrantList" show-checkbox check-strictly default-expand-all node-key="id" ref="treeRole"
        :default-checked-keys="roleTreeObj" :props="props">
      </el-tree>
      <span slot="footer" class="dialog-footer">
        <el-button size="small" @click="roleBox = false">取 消</el-button>
        <el-button size="small" type="primary" @click="submitRole">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="标签管理" append-to-body :visible.sync="labelFlag" center width="600px">
      <div>
        <div class="grid-container2">
          <div class="grid-item" :style="{ backgroundColor: item2.color }" v-for="(item2, index2) in labelData"
            @click="changLabel(item2)" :key="index2">
            {{ item2.name }}
          </div>
        </div>
      </div>
    </el-dialog>
    <el-dialog :title="'编辑标签   ' + currentLabel.name" append-to-body :visible.sync="editLabelFlge" width="655px">
      <avue-form :option="labelOption" v-model="labelForm" :submit="onsubmit">
      </avue-form>
      <span slot="footer" class="dialog-footer">
        <el-button size="small" @click="editLabelFlge = false">取 消</el-button>
        <el-button size="small" type="primary" @click="onsubmit">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="用户数据导入" append-to-body :visible.sync="excelBox" width="555px">
      <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
        <template slot="excelTemplate">
          <el-button size="small" type="primary" @click="handleTemplate">
            点击下载<i class="el-icon-download el-icon--right"></i>
          </el-button>
        </template>
      </avue-form>
    </el-dialog>
  </div>
</template>
<script>
import {
  import {
    getKeynotePersonnelPage,
    getlabelStatistics,
    remove,
@@ -87,815 +87,814 @@
    update,
    getDetatil,
    getDetatils
} from "@/api/userHouse/list/houseHold.js"
import {
  } from "@/api/userHouse/list/houseHold.js"
  import {
    removeHouseholdLabel,
    saveOrUpdateHouseholdLabel
} from "@/api/userHouse/list/userHouseList.js"
import {
  } from "@/api/userHouse/list/userHouseList.js"
  import {
    getLabelList,
} from '@/api/label/label'
import {
  } from '@/api/label/label'
  import {
    exportBlob
} from "@/api/common"
import {
  } from "@/api/common"
  import {
    mapGetters
} from "vuex"
import {
  } from "vuex"
  import {
    getToken
} from '@/util/auth'
import {
  } from '@/util/auth'
  import {
    downloadXls,
    findParentOrCur,
} from "@/util/util"
import {
  } from "@/util/util"
  import {
    dateNow
} from "@/util/date"
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import Qs from "qs"
import * as echarts from 'echarts'
import {
  } from "@/util/date"
  import NProgress from 'nprogress'
  import 'nprogress/nprogress.css'
  import Qs from "qs"
  import * as echarts from 'echarts'
  import {
    getTreeList
} from '@/api/label/label'
import boxTitle from "../place/components/boxTitle.vue"
  } from '@/api/label/label'
  import boxTitle from "../place/components/boxTitle.vue"
export default {
  export default {
    components: {
        boxTitle
      boxTitle
    },
    data () {
        let isCardId = function (rule, value, callback) {
            // 15位和18位身份证号码的正则表达式
            var regIdCard =
                /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
    data() {
      let isCardId = function(rule, value, callback) {
        // 15位和18位身份证号码的正则表达式
        var regIdCard =
          /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
            // 如果通过该验证,说明身份证格式正确,但准确性还需计算
            if (regIdCard.test(value)) {
                if (value.length == 18) {
                    var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
                        5, 8, 4, 2) // 将前17位加权因子保存在数组里
                    var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2) // 这是除以11后,可能产生的11位余数、验证码,也保存成数组
                    var idCardWiSum = 0 // 用来保存前17位各自乖以加权因子后的总和
                    for (var i = 0; i < 17; i++) {
                        idCardWiSum += value.substring(i, i + 1) * idCardWi[i]
                    }
        // 如果通过该验证,说明身份证格式正确,但准确性还需计算
        if (regIdCard.test(value)) {
          if (value.length == 18) {
            var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
              5, 8, 4, 2) // 将前17位加权因子保存在数组里
            var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2) // 这是除以11后,可能产生的11位余数、验证码,也保存成数组
            var idCardWiSum = 0 // 用来保存前17位各自乖以加权因子后的总和
            for (var i = 0; i < 17; i++) {
              idCardWiSum += value.substring(i, i + 1) * idCardWi[i]
            }
                    var idCardMod = idCardWiSum % 11 // 计算出校验码所在数组的位置
                    var idCardLast = value.substring(17) // 得到最后一位身份证号码
            var idCardMod = idCardWiSum % 11 // 计算出校验码所在数组的位置
            var idCardLast = value.substring(17) // 得到最后一位身份证号码
                    // 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
                    if (idCardMod == 2) {
                        if (idCardLast == "X" || idCardLast == "x") {
                            callback()
                        } else {
                            callback(new Error("身份证号格式有误!"))
                        }
                    } else {
                        // 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
                        if (idCardLast == idCardY[idCardMod]) {
                            callback()
                        } else {
                            callback(new Error("身份证号格式有误!"))
                        }
                    }
                } else {
                    callback()
                }
            } else {
                //alert("身份证格式不正确!");
            // 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
            if (idCardMod == 2) {
              if (idCardLast == "X" || idCardLast == "x") {
                callback()
              } else {
                callback(new Error("身份证号格式有误!"))
              }
            } else {
              // 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
              if (idCardLast == idCardY[idCardMod]) {
                callback()
              } else {
                callback(new Error("身份证号格式有误!"))
              }
            }
          } else {
            callback()
          }
        } else {
          //alert("身份证格式不正确!");
          callback(new Error("身份证号格式有误!"))
        }
        //手机号格式校验
        let validatorPhone = function (rule, value, callback) {
            if (value) {
                if (!/^1[3456789]\d{9}$/.test(value)) {
                    callback(new Error('手机号格式有误!'))
                } else {
                    callback()
                }
            }
        callback()
      }
      //手机号格式校验
      let validatorPhone = function(rule, value, callback) {
        if (value) {
          if (!/^1[3456789]\d{9}$/.test(value)) {
            callback(new Error('手机号格式有误!'))
          } else {
            callback()
          }
        }
        callback()
      }
        return {
            labelData: [],
            form: {},
            search: {},
            excelBox: false,
            selectionList: [],
            labelFlag: false,
            editLabelFlge: false,
            query: {},
            loading: true,
            page: {
                pageSize: 10,
                currentPage: 1,
                total: 0
      return {
        labelData: [],
        form: {},
        search: {},
        excelBox: false,
        selectionList: [],
        labelFlag: false,
        editLabelFlge: false,
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        option: {
          labelWidth: 144,
          searchLabelWidth: 96,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 280,
          menu: false,
          height: 'auto',
          calcHeight: 80,
          tip: false,
          border: true,
          index: true,
          selection: true,
          viewBtn: false,
          addBtn: false,
          delBtn: false,
          editBtn: false,
          dialogType: 'drawer',
          dialogClickModal: false,
          header: false,
          column: [{
              width: 110,
              label: "姓名",
              prop: "name",
              searchSpan: 3,
              searchLabelWidth: 50,
              search: true,
              rules: [{
                required: true,
                message: "请输入姓名",
                trigger: "blur",
              }],
            },
            option: {
                labelWidth: 144,
                searchLabelWidth: 96,
                searchShow: true,
                searchMenuSpan: 3,
                menuWidth: 280,
                menu: false,
                height: 'auto',
                calcHeight: 80,
                tip: false,
                border: true,
                index: true,
                selection: true,
                viewBtn: false,
                addBtn: false,
                delBtn: false,
                editBtn: false,
                dialogType: 'drawer',
                dialogClickModal: false,
                header:false,
                column: [
                    {
                        width: 110,
                        label: "姓名",
                        prop: "name",
                        searchSpan: 3,
                        searchLabelWidth: 50,
                        search: true,
                        rules: [{
                            required: true,
                            message: "请输入姓名",
                            trigger: "blur",
                        }],
                    },
                    {
                        width: 160,
                        display: true,
                        label: "身份证号",
                        prop: "idCard",
                        search: true,
                        searchSpan: 4,
                        slot: true,
                        rules: [{
                            validator: isCardId,
                            trigger: 'blur'
                        }],
                    },
                    {
                        width: 60,
                        label: "性别",
                        prop: "gender",
                        type: "select",
                        dicData: [{
                            label: "男",
                            value: 1
                        },
                        {
                            label: "女",
                            value: 0
                        },
                        {
                            label: "未知",
                            value: "3"
                        }
                        ],
                    },
                    {
                        width: 120,
                        label: "手机号码",
                        prop: "phoneNumber",
                        search: true,
                        searchSpan: 4,
                        slot: true,
                        rules: [{
                            required: true,
                            message: "请输入手机号码",
                            trigger: "blur",
                        },
                        {
                            validator: validatorPhone,
                            trigger: 'blur'
                        }
                        ],
                    },
                    {
                        width: 220,
                        overHidden: true,
                        label: '小区名称',
                        prop: "aoiName",
                        search: true,
                        searchSpan: 4,
                        display: false
                    },
                    {
                        width: 110,
                        label: "所属街道",
                        addDisplay: false,
                        editDisplay: false,
                        viewDisplay: false,
                        prop: "townStreetName",
                        search: true,
                        searchSpan: 4
                    },
                    {
                        width: 156,
                        overHidden: true,
                        label: "所属社区",
                        addDisplay: false,
                        editDisplay: false,
                        viewDisplay: false,
                        prop: "neiName",
                        search: true,
                        searchSpan: 4
                    },
                    {
                        width: 110,
                        overHidden: true,
                        label: "所属网格",
                        addDisplay: false,
                        editDisplay: false,
                        viewDisplay: false,
                        prop: "gridName",
                    },
                    {
                        width: 156,
                        overHidden: true,
                        label: "地址",
                        prop: "address",
                        display: false
                    },
                    {
                        overHidden: true,
                        label: "标签",
                        prop: "householdLabelList",
                        display: false
                    }
                ]
            {
              width: 160,
              display: true,
              label: "身份证号",
              prop: "idCard",
              search: true,
              searchSpan: 4,
              slot: true,
              rules: [{
                validator: isCardId,
                trigger: 'blur'
              }],
            },
            data: [],
            excelForm: {},
            labelForm: {},
            labelOption: {
                submitBtn: false,
                emptyBtn: false,
                column: [{
                    label: '级别',
                    prop: 'color',
                    type: 'radio',
                    button: true,
                    row: true,
                    dicData: [{
                        label: '撤销',
                        value: '#EBEDF0'
                    }, {
                        label: '绿',
                        value: '#30D17C'
                    }, {
                        label: '黄',
                        value: '#FFB42B'
                    }, {
                        label: '红',
                        value: '#EA1F1F'
                    }],
                    rules: [{
                        required: true,
                        message: "请选择",
                        trigger: "blur"
                    }]
                }, {
                    row: true,
                    label: '备注',
                    prop: 'remark',
                    type: 'input'
                }]
            },
            excelOption: {
                submitBtn: false,
                emptyBtn: false,
                column: [{
                    label: '模板上传',
                    prop: 'excelFile',
                    type: 'upload',
                    drag: true,
                    loadText: '模板上传中,请稍等',
                    span: 24,
                    propsHttp: {
                        res: 'data'
                    },
                    tip: '请上传 .xls,.xlsx 标准格式文件',
                    action: "/api/blade-system/user/import-user"
            {
              width: 60,
              label: "性别",
              prop: "gender",
              type: "select",
              dicData: [{
                  label: "男",
                  value: 1
                },
                {
                    label: "数据覆盖",
                    prop: "isCovered",
                    type: "switch",
                    align: "center",
                    width: 80,
                    dicData: [{
                        label: "否",
                        value: 0
                    },
                    {
                        label: "是",
                        value: 1
                    }
                    ],
                    value: 0,
                    slot: true,
                    rules: [{
                        required: true,
                        message: "请选择是否覆盖",
                        trigger: "blur"
                    }]
                  label: "女",
                  value: 0
                },
                {
                    label: '模板下载',
                    prop: 'excelTemplate',
                    formslot: true,
                    span: 24,
                  label: "未知",
                  value: "3"
                }
                ]
              ],
            },
            currentLabel: {},
            currentRow: {},
            householdLabelList: [],
            labelCountList: []
        }
            {
              width: 120,
              label: "手机号码",
              prop: "phoneNumber",
              search: true,
              searchSpan: 4,
              slot: true,
              rules: [{
                  required: true,
                  message: "请输入手机号码",
                  trigger: "blur",
                },
                {
                  validator: validatorPhone,
                  trigger: 'blur'
                }
              ],
            },
            {
              width: 220,
              overHidden: true,
              label: '小区名称',
              prop: "aoiName",
              search: true,
              searchSpan: 4,
              display: false
            },
            {
              width: 110,
              label: "所属街道",
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "townStreetName",
              search: true,
              searchSpan: 4
            },
            {
              width: 156,
              overHidden: true,
              label: "所属社区",
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "neiName",
              search: true,
              searchSpan: 4
            },
            {
              width: 110,
              overHidden: true,
              label: "所属网格",
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "gridName",
            },
            {
              width: 156,
              overHidden: true,
              label: "地址",
              prop: "address",
              display: false
            },
            {
              overHidden: true,
              label: "标签",
              prop: "householdLabelList",
              display: false
            }
          ]
        },
        data: [],
        excelForm: {},
        labelForm: {},
        labelOption: {
          submitBtn: false,
          emptyBtn: false,
          column: [{
            label: '级别',
            prop: 'color',
            type: 'radio',
            button: true,
            row: true,
            dicData: [{
              label: '撤销',
              value: '#EBEDF0'
            }, {
              label: '绿',
              value: '#30D17C'
            }, {
              label: '黄',
              value: '#FFB42B'
            }, {
              label: '红',
              value: '#EA1F1F'
            }],
            rules: [{
              required: true,
              message: "请选择",
              trigger: "blur"
            }]
          }, {
            row: true,
            label: '备注',
            prop: 'remark',
            type: 'input'
          }]
        },
        excelOption: {
          submitBtn: false,
          emptyBtn: false,
          column: [{
              label: '模板上传',
              prop: 'excelFile',
              type: 'upload',
              drag: true,
              loadText: '模板上传中,请稍等',
              span: 24,
              propsHttp: {
                res: 'data'
              },
              tip: '请上传 .xls,.xlsx 标准格式文件',
              action: "/api/blade-system/user/import-user"
            },
            {
              label: "数据覆盖",
              prop: "isCovered",
              type: "switch",
              align: "center",
              width: 80,
              dicData: [{
                  label: "否",
                  value: 0
                },
                {
                  label: "是",
                  value: 1
                }
              ],
              value: 0,
              slot: true,
              rules: [{
                required: true,
                message: "请选择是否覆盖",
                trigger: "blur"
              }]
            },
            {
              label: '模板下载',
              prop: 'excelTemplate',
              formslot: true,
              span: 24,
            }
          ]
        },
        currentLabel: {},
        currentRow: {},
        householdLabelList: [],
        labelCountList: []
      }
    },
    watch: {
        'form.source': {
            handler (newData) {
                let currentAddressColumn = this.findObject(
                    this.option.column,
                    'currentAddress'
                )
      'form.source': {
        handler(newData) {
          let currentAddressColumn = this.findObject(
            this.option.column,
            'currentAddress'
          )
                let homeAdcodeColumn = this.findObject(
                    this.option.column,
                    'homeAdcode'
                )
          let homeAdcodeColumn = this.findObject(
            this.option.column,
            'homeAdcode'
          )
                if (newData == 1) {
                    currentAddressColumn.disabled = true
                    homeAdcodeColumn.disabled = true
                } else {
                    currentAddressColumn.disabled = false
                    homeAdcodeColumn.disabled = false
                }
            },
          if (newData == 1) {
            currentAddressColumn.disabled = true
            homeAdcodeColumn.disabled = true
          } else {
            currentAddressColumn.disabled = false
            homeAdcodeColumn.disabled = false
          }
        },
      },
        'form.cardType': {
            handler (newData) {
                let idCardColumn = this.findObject(
                    this.option.column,
                    'idCard'
                )
      'form.cardType': {
        handler(newData) {
          let idCardColumn = this.findObject(
            this.option.column,
            'idCard'
          )
                let cardNoColumn = this.findObject(
                    this.option.column,
                    'cardNo'
                )
          let cardNoColumn = this.findObject(
            this.option.column,
            'cardNo'
          )
                if (newData == 111) {
                    idCardColumn.display = true
                    cardNoColumn.display = false
                } else {
                    idCardColumn.display = false
                    cardNoColumn.display = true
                }
            },
          if (newData == 111) {
            idCardColumn.display = true
            cardNoColumn.display = false
          } else {
            idCardColumn.display = false
            cardNoColumn.display = true
          }
        },
      },
        'form.healthStatus': {
            handler (newData) {
                let diseaseNameColumn = this.findObject(
                    this.option.column,
                    'diseaseName'
                )
      'form.healthStatus': {
        handler(newData) {
          let diseaseNameColumn = this.findObject(
            this.option.column,
            'diseaseName'
          )
                if (newData == 3) {
                    diseaseNameColumn.disabled = false
                } else {
                    diseaseNameColumn.disabled = true
                }
            },
          if (newData == 3) {
            diseaseNameColumn.disabled = false
          } else {
            diseaseNameColumn.disabled = true
          }
        },
      },
    },
    computed: {
        ...mapGetters(["userInfo", "permission"]),
        permissionList () {
            return {
                addBtn: this.vaildData(this.permission.household_add, false),
                viewBtn: this.vaildData(this.permission.household_view, true),
                delBtn: this.vaildData(this.permission.household_delete, true),
                editBtn: this.vaildData(this.permission.household_edit, true)
            }
        },
        textDispose () {
            return (row, flag, type) => {
                if (row[flag] || row[type] == null) {
                    return row[type]
                } else {
                    if (type == 'idCard') {
                        return row[type].replace(/^(.{6})(?:\d+)(.{4})$/, "$1******$2")
                    } else {
                        return row[type].replace(/^(.{3})(?:\d+)(.{4})$/, "$1****$2")
                    }
                }
            }
        },
        labelDispose () {
            return (list) => {
                return list.map(item => item.labelName).join(',')
            }
      ...mapGetters(["userInfo", "permission"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.household_add, false),
          viewBtn: this.vaildData(this.permission.household_view, true),
          delBtn: this.vaildData(this.permission.household_delete, true),
          editBtn: this.vaildData(this.permission.household_edit, true)
        }
      },
      textDispose() {
        return (row, flag, type) => {
          if (row[flag] || row[type] == null) {
            return row[type]
          } else {
            if (type == 'idCard') {
              return row[type].replace(/^(.{6})(?:\d+)(.{4})$/, "$1******$2")
            } else {
              return row[type].replace(/^(.{3})(?:\d+)(.{4})$/, "$1****$2")
            }
          }
        }
      },
      labelDispose() {
        return (list) => {
          return list.map(item => item.labelName).join(',')
        }
      }
    },
    mounted () {
        // this.getLabelCount()
    mounted() {
      // this.getLabelCount()
    },
    methods: {
        init (row) {
            console.log(JSON.stringify(row))
            this.query.regionCode = row.communityCode
            // this.onLoad(this.page, this.query)
        },
        onsubmit () {
            if (this.labelForm.color === '#EBEDF0') {
                let params = {
                    householdId: this.currentRow.id,
                    labelId: this.currentLabel.id
                }
                removeHouseholdLabel(params).then(res => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!"
                    })
                    this.editLabelFlge = false
                    this.manageLabel(this.currentRow)
                    this.loading = false
                })
            } else {
                this.labelForm.houseCode = this.currentRow.houseCode
                this.labelForm.householdId = this.currentRow.id
                this.labelForm.labelId = this.currentLabel.id
                this.labelForm.lableType = 1
                saveOrUpdateHouseholdLabel(this.labelForm).then(res => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!"
                    })
                    this.editLabelFlge = false
                    this.manageLabel(this.currentRow)
                    this.loading = false
                })
            }
        },
        changLabel (item) {
            this.editLabelFlge = true
            this.currentLabel = item
            this.labelForm.color = item.color
            this.labelForm.remark = item.remark
        },
        manageLabel (item) {
            this.loading = true
            this.currentRow = item
            this.labelFlag = true
            let params = {
                parentId: 103
            }
            // 查询标签
            getLabelList(Object.assign(params)).then(res => {
                const data = res.data.data
                // this.labelData = data;
                // 查询详情
                getDetatils(item.id).then(res => {
                    this.householdLabelList = res.data.data.householdLabelList
                    // 将细类放到一起
                    data.forEach(e => {
                        e.children.forEach(f => {
                            if (this.householdLabelList.length > 0) {
                                this.householdLabelList.forEach(h => {
                                    if (Number(f.id) == h.labelId) {
                                        f['color'] = h.color
                                        f['remark'] = h.remark
                                    }
                                })
                            }
                        })
                    })
                    this.labelData = data
                    this.loading = false
                })
            })
        },
        rowSave (row, done, loading) {
            add(row).then(() => {
                this.initFlag = false
                this.onLoad(this.page)
                this.$message({
                    type: "success",
                    message: "操作成功!"
                })
                done()
            }, error => {
                window.console.log(error)
                loading()
            })
        },
        rowUpdate (row, index, done, loading) {
            update(row).then(() => {
                this.initFlag = false
                this.onLoad(this.page)
                this.$message({
                    type: "success",
                    message: "操作成功!"
                })
                done()
            }, error => {
                window.console.log(error)
                loading()
            })
        },
        rowDel (row) {
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning"
            })
                .then(() => {
                    return remove(row.id)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!"
                    })
                })
        },
        searchReset () {
            this.query = {}
            this.treeDeptId = ''
      init(row) {
        console.log(JSON.stringify(row))
        this.query.regionCode = row.communityCode
        // this.onLoad(this.page, this.query)
      },
      onsubmit() {
        if (this.labelForm.color === '#EBEDF0') {
          let params = {
            householdId: this.currentRow.id,
            labelId: this.currentLabel.id
          }
          removeHouseholdLabel(params).then(res => {
            this.onLoad(this.page)
        },
        searchChange (params, done) {
            this.query = params
            this.page.currentPage = 1
            this.onLoad(this.page, params)
            done()
        },
        selectionChange (list) {
            this.selectionList = list
        },
        selectionClear () {
            this.selectionList = []
            // this.$refs.crud.toggleSelection();
        },
        handleDelete () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning"
            this.$message({
              type: "success",
              message: "操作成功!"
            })
                .then(() => {
                    return remove(this.ids)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!"
                    })
                    this.$refs.crud.toggleSelection()
                })
        },
        handleImport () {
            this.excelBox = true
        },
        uploadAfter (res, done, loading, column) {
            this.excelBox = false
            this.refreshChange()
            done()
        },
        handleExport () {
            this.$confirm("是否导出住户数据?", "提示", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning"
            }).then(() => {
                NProgress.start()
                var data = {
                    ...this.query
                }
                data = Qs.stringify(data)
                exportBlob(
                    `/api/blade-household/household/export-household?${this.website.tokenHeader}=${getToken()}&` + data
                ).then(res => {
                    downloadXls(res.data, `住户数据表${dateNow()}.xlsx`)
                    NProgress.done()
                })
            this.editLabelFlge = false
            this.manageLabel(this.currentRow)
            this.loading = false
          })
        } else {
          this.labelForm.houseCode = this.currentRow.houseCode
          this.labelForm.householdId = this.currentRow.id
          this.labelForm.labelId = this.currentLabel.id
          this.labelForm.lableType = 1
          saveOrUpdateHouseholdLabel(this.labelForm).then(res => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!"
            })
        },
        handleTemplate () {
            exportBlob(`/api/blade-system/user/export-template?${this.website.tokenHeader}=${getToken()}`).then(res => {
                downloadXls(res.data, "住户数据模板.xlsx")
            })
        },
        beforeOpen (done, type) {
            if (["edit", "view"].includes(type)) {
                getDetatils(this.form.id).then(res => {
                    this.form = res.data.data
                    done()
                })
            }
            this.initFlag = true
        },
        currentChange (currentPage) {
            this.page.currentPage = currentPage
        },
        sizeChange (pageSize) {
            this.page.pageSize = pageSize
        },
        refreshChange () {
            this.onLoad(this.page, this.query)
        },
        onLoad (page, params = {}) {
            // this.query.parentId = 100
            this.loading = true
            getlabelStatistics(Object.assign(params, this.query)).then(res => {
                const data = res.data.data
                let list = data[0].children
                this.labelCountList = list
                this.$nextTick(() => {
                    this.setEchartsOption(list)
                })
            })
            getKeynotePersonnelPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
                const data = {
                    ...res.data.data,
                    records: res.data.data.records.map(item => {
                        return {
                            ...item,
                            'phoneNumberflag': false,
                            'idCardflag': false
                        }
                    })
                }
                this.page.total = data.total
                this.data = data.records
                this.loading = false
                this.selectionClear()
            })
        },
        showStringDispose (row, type) {
            row[type] = !row[type]
        },
        getLabelCount () {
            getTreeList().then(res => {
                const data = res.data.data
                let list = data[0].children
                this.labelCountList = list
                this.$nextTick(() => {
                    this.setEchartsOption(list)
                })
            })
        },
        setEchartsOption (data) {
            let option = {
                tooltip: {
                    trigger: 'item',
                    confine: true
                },
                legend: {
                    orient: 'vertical',
                    right: 20,
                    bottom: 0,
                    padding: [30, 0],
                    formatter: function (name) {
                        return name.length > 6 ? name.substr(0, 6) + '...' : name
                    }
                },
                labelLine: {
                    length: 15,
                    length2: 0,
                    maxSurfaceAngle: 80
                },
                series: [{
                    type: 'pie',
                    center: ['26%', '50%'],
                    radius: '60%', //修改大小
                    data: [],
                    label: {
                        show: false
                    },
                    emphasis: {
                        itemStyle: {
                            shadowBlur: 10,
                            shadowOffsetX: 0,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        }
                    }
                }]
            }
            let myEchart = document.getElementsByClassName('echarts-item') //获取类名
            for (let i = 0, ii = data.length; i < ii; i++) {
                let myCharts = echarts.init(myEchart[i])
                // option.title.text = data[i].name;
                let series = []
                for (let k = 0, kk = data[i].children.length; k < kk; k++) {
                    series.push({
                        value: data[i].children[k].count,
                        name: data[i].children[k].name,
                        id: data[i].children[k].id,
                    })
                }
                option.legend.type = series.length > 4 ? "scroll" : "plain"
                option.series[0].data = series
                option && myCharts.setOption(option)
                // myCharts.on('click', (params) => {
                //     console.log(params)
                //     this.query.labelId = params.data.id
                //     this.onLoad(this.page, this.query)
                // })
            }
            this.editLabelFlge = false
            this.manageLabel(this.currentRow)
            this.loading = false
          })
        }
      },
      changLabel(item) {
        this.editLabelFlge = true
        this.currentLabel = item
        this.labelForm.color = item.color
        this.labelForm.remark = item.remark
      },
      manageLabel(item) {
        this.loading = true
        this.currentRow = item
        this.labelFlag = true
        let params = {
          parentId: 103
        }
        // 查询标签
        getLabelList(Object.assign(params)).then(res => {
          const data = res.data.data
          // this.labelData = data;
          // 查询详情
          getDetatils(item.id).then(res => {
            this.householdLabelList = res.data.data.householdLabelList
            // 将细类放到一起
            data.forEach(e => {
              e.children.forEach(f => {
                if (this.householdLabelList.length > 0) {
                  this.householdLabelList.forEach(h => {
                    if (Number(f.id) == h.labelId) {
                      f['color'] = h.color
                      f['remark'] = h.remark
                    }
                  })
                }
              })
            })
            this.labelData = data
            this.loading = false
          })
        })
      },
      rowSave(row, done, loading) {
        add(row).then(() => {
          this.initFlag = false
          this.onLoad(this.page)
          this.$message({
            type: "success",
            message: "操作成功!"
          })
          done()
        }, error => {
          window.console.log(error)
          loading()
        })
      },
      rowUpdate(row, index, done, loading) {
        update(row).then(() => {
          this.initFlag = false
          this.onLoad(this.page)
          this.$message({
            type: "success",
            message: "操作成功!"
          })
          done()
        }, error => {
          window.console.log(error)
          loading()
        })
      },
      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning"
          })
          .then(() => {
            return remove(row.id)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!"
            })
          })
      },
      searchReset() {
        this.query = {}
        this.treeDeptId = ''
        this.onLoad(this.page)
      },
      searchChange(params, done) {
        this.query = params
        this.page.currentPage = 1
        this.onLoad(this.page, params)
        done()
      },
      selectionChange(list) {
        this.selectionList = list
      },
      selectionClear() {
        this.selectionList = []
        // this.$refs.crud.toggleSelection();
      },
      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据")
          return
        }
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning"
          })
          .then(() => {
            return remove(this.ids)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!"
            })
            this.$refs.crud.toggleSelection()
          })
      },
      handleImport() {
        this.excelBox = true
      },
      uploadAfter(res, done, loading, column) {
        this.excelBox = false
        this.refreshChange()
        done()
      },
      handleExport() {
        this.$confirm("是否导出住户数据?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(() => {
          NProgress.start()
          var data = {
            ...this.query
          }
          data = Qs.stringify(data)
          exportBlob(
            `/api/blade-household/household/export-household?${this.website.tokenHeader}=${getToken()}&` + data
          ).then(res => {
            downloadXls(res.data, `住户数据表${dateNow()}.xlsx`)
            NProgress.done()
          })
        })
      },
      handleTemplate() {
        exportBlob(`/api/blade-system/user/export-template?${this.website.tokenHeader}=${getToken()}`).then(res => {
          downloadXls(res.data, "住户数据模板.xlsx")
        })
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
          getDetatils(this.form.id).then(res => {
            this.form = res.data.data
            done()
          })
        }
        this.initFlag = true
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize
      },
      refreshChange() {
        this.onLoad(this.page, this.query)
      },
      onLoad(page, params = {}) {
        // this.query.parentId = 100
        this.loading = true
        getlabelStatistics(Object.assign(params, this.query)).then(res => {
          const data = res.data.data
          let list = data[0].children
          this.labelCountList = list
          this.$nextTick(() => {
            this.setEchartsOption(list)
          })
        })
        getKeynotePersonnelPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
          const data = {
            ...res.data.data,
            records: res.data.data.records.map(item => {
              return {
                ...item,
                'phoneNumberflag': false,
                'idCardflag': false
              }
            })
          }
          this.page.total = data.total
          this.data = data.records
          this.loading = false
          this.selectionClear()
        })
      },
      showStringDispose(row, type) {
        row[type] = !row[type]
      },
      getLabelCount() {
        getTreeList().then(res => {
          const data = res.data.data
          let list = data[0].children
          this.labelCountList = list
          this.$nextTick(() => {
            this.setEchartsOption(list)
          })
        })
      },
      setEchartsOption(data) {
        let option = {
          tooltip: {
            trigger: 'item',
            confine: true
          },
          legend: {
            orient: 'vertical',
            right: 20,
            bottom: 0,
            padding: [30, 0],
            formatter: function(name) {
              return name.length > 6 ? name.substr(0, 6) + '...' : name
            }
          },
          labelLine: {
            length: 15,
            length2: 0,
            maxSurfaceAngle: 80
          },
          series: [{
            type: 'pie',
            center: ['26%', '50%'],
            radius: '60%', //修改大小
            data: [],
            label: {
              show: false
            },
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }]
        }
        let myEchart = document.getElementsByClassName('echarts-item') //获取类名
        for (let i = 0, ii = data.length; i < ii; i++) {
          let myCharts = echarts.init(myEchart[i])
          // option.title.text = data[i].name;
          let series = []
          for (let k = 0, kk = data[i].children.length; k < kk; k++) {
            series.push({
              value: data[i].children[k].count,
              name: data[i].children[k].name,
              id: data[i].children[k].id,
            })
          }
          option.legend.type = series.length > 4 ? "scroll" : "plain"
          option.series[0].data = series
          option && myCharts.setOption(option)
          // myCharts.on('click', (params) => {
          //     console.log(params)
          //     this.query.labelId = params.data.id
          //     this.onLoad(this.page, this.query)
          // })
        }
      }
    }
}
  }
</script>
<style lang="scss" scoped>
.grid-container2 {
  .grid-container2 {
    /* display: grid;
    grid-template-columns: auto auto auto auto;
    grid-gap: 10px; */
    display: flex;
    flex-wrap: wrap;
    padding-bottom: 20px;
}
  }
.grid-item {
  .grid-item {
    padding: 8px 14px;
    border: 1px solid #dcdfe6;
    margin-right: 10px;
    margin-bottom: 10px;
    border-radius: 20px;
}
  }
.grid-item:hover {
  .grid-item:hover {
    background-color: #e8f4ff;
    color: #017BFC;
    cursor: pointer;
}
  }
.el-scrollbar {
  .el-scrollbar {
    height: 100%;
}
  }
.box .el-scrollbar__wrap {
  .box .el-scrollbar__wrap {
    overflow: scroll;
}
  }
:deep(.avue-form__menu--center) {
  :deep(.avue-form__menu--center) {
    text-align: left;
}
  }
:deep(.avue-form__menu--center .el-button) {
  :deep(.avue-form__menu--center .el-button) {
    margin: 0 5px 0 0;
}
  }
</style>
src/views/userHouse/components/categoryList.vue
File was renamed from src/views/userHouse/lable/categoryList.vue
@@ -45,7 +45,7 @@
          menuWidth: 240,
          lazy: true,
          rowKey: 'id',
          defaultExpandAll: true,
          // defaultExpandAll: true,
          column: [{
            label: '名称',
            prop: 'name'
@@ -120,14 +120,14 @@
      },
      rowDel(row, index, done) {
        console.log("*************")
        console.log("*************" + JSON.stringify(row))
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning"
          })
          .then(() => {
            return remove(row.id)
            return remove(row.ids)
          })
          .then(() => {
            this.$message({
@@ -139,7 +139,7 @@
      },
      rowSave(row, done) {
        // row.parentId = this.parentId
        row.parentNo = row.parentId
        row.categoryName = row.name
        submit(row).then(() => {
          this.initFlag = false
@@ -158,6 +158,22 @@
      rowUpdate(row, index, done) {
        const column = this.findObject(this.option.column, "parentId")
        column.value = row.id
        row.parentNo = row.parentId
        row.id = row.ids
        update(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
        done(row)
      },
@@ -186,4 +202,4 @@
<style></style>
<style></style>
src/views/userHouse/components/houseLableList.vue
src/views/userHouse/components/houseStatistics.vue
New file
@@ -0,0 +1,214 @@
<template>
  <basic-container style="margin-bottom: 40px;">
    <div class="current-page-box">
      <div v-for="(item, index) in data" :key="index">
        <div v-if="index == 0">
          <!-- <box-title class="m10" :classVal="9" :title="item.name"></box-title> -->
          <div v-for="(item1, childIndex) in item.children" :key="childIndex">
            <div v-if="item1.name === '民政标签'">
              <box-title class="m10" :classVal="9" :title="item1.name"></box-title>
              <div v-for="(item2, index2) in item1.children" :key="index2">
                <!-- <box-title class="m10" :classVal="9" :title="item2.name"></box-title> -->
                <div class="m20 m-t-28 grid-content bg-purple-dark">
                  <el-divider content-position="left">{{ item2.name }}</el-divider>
                </div>
                <div class="grid-container" v-if="item2.children">
                  <div v-for="(item3, index3) in item2.children" :key="index3">
                    <div>
                      {{ item3.count }}
                    </div>
                    <div>
                      {{ item3.name }}
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div v-else>
              <!--  <div class="m20 m-t-28 grid-content bg-purple-dark">
                <el-divider content-position="left">{{ item1.name }}</el-divider>
              </div> -->
              <box-title class="m10" :classVal="9" :title="item1.name"></box-title>
              <div class="grid-container" v-if="item1.children">
                <div v-for="(item2, childChildIndex) in item1.children" :key="childChildIndex">
                  <div>
                    {{ item2.count }}
                  </div>
                  <div>
                    {{ item2.name }}
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div v-if="index == 1">
          <box-title class="m10" :classVal="9" :title="item.name"></box-title>
          <div class="grid-container">
            <div v-for="(item1, childIndex) in item.children" :key="childIndex">
              <div>
                {{ item1.count }}
              </div>
              <div>
                {{ item1.name }}
              </div>
            </div>
          </div>
        </div>
        <!-- <div v-if="index == 2">
        <box-title class="m10" :classVal="9" :title="item.name"></box-title>
        <div class="grid-container">
          <div>
            <div>
              {{ item.count }}
            </div>
            <div>
              {{ item.name }}
            </div>
          </div>
        </div>
      </div> -->
      </div>
    </div>
  </basic-container>
</template>
<script>
  import {
    getTreeList,
    add,
    update,
    remove
  } from '@/api/label/label'
  import boxTitle from '../components/boxTitle.vue'
  export default {
    data() {
      return {
        items: [],
        query: {
          parentId: 0
        },
        data: [],
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        option: {
          span: 4,
          data: []
        },
      }
    },
    components: {
      boxTitle
    },
    mounted() {
      this.onLoad()
    },
    methods: {
      onLoad(page, params = {}) {
        this.loading = true
        getTreeList().then(res => {
          const data = res.data.data
          this.data = data
          this.loading = false
          // this.selectionClear();
        })
      },
    }
  }
</script>
<style lang="scss" scoped>
  .m10 {
    margin: 10px;
  }
  .m20 {
    margin: 20px;
  }
  .m-t-28 {
    margin-top: 28px;
  }
  .grid-container {
    display: flex;
    flex-wrap: wrap;
    font-size: 15px;
    color: #fff;
  }
  .grid-container>div {
    margin: 18px;
    padding: 10px 8px;
    display: flex;
    flex-direction: column;
    width: calc(100% / 6 - 36px);
    background-color: #429FFF;
    text-align: center;
    border-radius: 10px;
    box-sizing: border-box;
    &>div {
      font-size: 14px;
      line-height: 22px;
      text-align: center;
    }
    &>div:first-child {
      font-size: 18px;
      font-weight: bold;
    }
  }
  /* .el-row {
    margin-bottom: 20px;
    &:last-child {
      margin-bottom: 0;
    }
  }
  .el-col {
    border-radius: 4px;
  }
  .bg-purple-dark {
    background: #99a9bf;
  }
  .bg-purple {
    background: #d3dce6;
  }
  .bg-purple-light {
    background: #e5e9f2;
  }
  .grid-content {
    border-radius: 4px;
    min-height: 36px;
  }
  .row-bg {
    padding: 10px 0;
    background-color: #f9fafc;
  } */
</style>
src/views/userHouse/components/placeStatistics.vue
New file
@@ -0,0 +1,156 @@
<template>
  <basic-container style="margin-bottom: 40px;">
    <div class="current-page-box">
      <div v-for="(item, index) in data" :key="index">
        <box-title class="m10" :classVal="9" :title="item.name"></box-title>
        <div v-for="(item1, childIndex) in item.children" :key="childIndex">
          <div class="m20 m-t-28 grid-content bg-purple-dark">
            <el-divider content-position="left">{{ item1.name }}</el-divider>
          </div>
          <!-- <box-title class="m10" :classVal="9" :title="item1.name"></box-title> -->
          <div class="grid-container" v-if="item1.children">
            <div v-for="(item2, childChildIndex) in item1.children" :key="childChildIndex">
              <div>
                {{ item2.count }}
              </div>
              <div>
                {{ item2.name }}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </basic-container>
</template>
<script>
  import {
    getTreeList,
    submit,
    update,
    remove
  } from '@/api/categoryLabel/category'
  import boxTitle from '../components/boxTitle.vue'
  export default {
    data() {
      return {
        items: [],
        query: {
          parentId: 0
        },
        data: [],
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        option: {
          span: 4,
          data: []
        },
      }
    },
    components: {
      boxTitle
    },
    mounted() {
      this.onLoad()
    },
    methods: {
      onLoad(page, params = {}) {
        this.loading = true
        getTreeList().then(res => {
          const data = res.data.data
          this.data = data
          this.loading = false
          // this.selectionClear();
        })
      },
    }
  }
</script>
<style lang="scss" scoped>
  .m10 {
    margin: 10px;
  }
  .m20 {
    margin: 20px;
  }
  .m-t-28 {
    margin-top: 28px;
  }
  .grid-container {
    display: flex;
    flex-wrap: wrap;
    font-size: 15px;
    color: #fff;
  }
  .grid-container>div {
    margin: 18px;
    padding: 10px 8px;
    display: flex;
    flex-direction: column;
    width: calc(100% / 6 - 36px);
    background-color: #429FFF;
    text-align: center;
    border-radius: 10px;
    box-sizing: border-box;
    &>div {
      font-size: 14px;
      line-height: 22px;
      text-align: center;
    }
    &>div:first-child {
      font-size: 18px;
      font-weight: bold;
    }
  }
  /* .el-row {
    margin-bottom: 20px;
    &:last-child {
      margin-bottom: 0;
    }
  }
  .el-col {
    border-radius: 4px;
  }
  .bg-purple-dark {
    background: #99a9bf;
  }
  .bg-purple {
    background: #d3dce6;
  }
  .bg-purple-light {
    background: #e5e9f2;
  }
  .grid-content {
    border-radius: 4px;
    min-height: 36px;
  }
  .row-bg {
    padding: 10px 0;
    background-color: #f9fafc;
  } */
</style>
src/views/userHouse/lable/lableList.vue
New file
@@ -0,0 +1,41 @@
<template>
  <div>
    <el-tabs v-model="activeName" @tab-click="handleClick">
      <el-tab-pane label="人/房标签" name="first"></el-tab-pane>
      <el-tab-pane label="场所标签" name="second"></el-tab-pane>
    </el-tabs>
    <div v-if="activeName ==='first'">
      <houseLableList ref="houseLableList" />
    </div>
    <div v-else>
      <categoryList ref="categoryList" />
    </div>
  </div>
</template>
<script>
  import houseLableList from '../components/houseLableList.vue'
  import categoryList from '../components/categoryList.vue'
  export default {
    data() {
      return {
        activeName: 'first'
      };
    },
    components: {
      houseLableList,
      categoryList
    },
    methods: {
      handleClick(tab, event) {
        console.log(tab, event);
      }
    }
  };
</script>
src/views/userHouse/lable/lableStatistics.vue
New file
@@ -0,0 +1,41 @@
<template>
  <div>
    <el-tabs v-model="activeName" @tab-click="handleClick">
      <el-tab-pane label="人/房标签统计" name="first"></el-tab-pane>
      <el-tab-pane label="场所标签统计" name="second"></el-tab-pane>
    </el-tabs>
    <div v-if="activeName ==='first'">
      <houseStatistics ref="houseStatistics" />
    </div>
    <div v-else>
      <placeStatistics ref="placeStatistics" />
    </div>
  </div>
</template>
<script>
  import houseStatistics from '../components/houseStatistics.vue'
  import placeStatistics from '../components/placeStatistics.vue'
  export default {
    data() {
      return {
        activeName: 'first'
      };
    },
    components: {
      houseStatistics,
      placeStatistics
    },
    methods: {
      handleClick(tab, event) {
        console.log(tab, event);
      }
    }
  };
</script>
src/views/userHouse/lable/statistics.vue
File was deleted