fuliqi
2025-01-03 1bfba74b6bea7da6d14b0da1ab8b1efe02e474b3
Merge remote-tracking branch 'origin/master'
12个文件已修改
4个文件已添加
1484 ■■■■■ 已修改文件
src/components/flow/Dept/MyDept.vue 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/flow/Dept/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/flow/Role/MyRole.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/flow/User/MultUser.vue 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/flow/User/SingleUser.vue 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/task/myProcess/detail/index.vue 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/task/myProcess/send/index.vue 255 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/abnormalProject/index.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/abnormalProject/list.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/projectLibrary/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/projectLibrary/list.js 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectManage/plan/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectManage/progress/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/detail/index.vue 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/index.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/flow/Dept/MyDept.vue
New file
@@ -0,0 +1,105 @@
<template>
  <div>
    <el-dialog
      :title="`选择候选部门`"
      :visible.sync="show"
      width="65%"
      :destroy-on-close="true"
      :close-on-click-modal="false"
      :modal="false"
      :before-close="close">
      <el-tree
        ref="tree"
        :data="deptTree"
        show-checkbox
        node-key="id"
        :check-strictly="true"
        :default-expanded-keys="['dept:100']"
        @check-change="handleCheckChange"
        >
      </el-tree>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submit">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {flowableDeptTreeSelect} from "@/api/system/user";
export default {
  name: "MyDept",
  props: {
    show: {
      required: true,
      type: Boolean
    },
    checkeds: {
      required: true
    }
  },
  watch: {
    checkeds: {
      handler(newV) {
        if (newV && newV.length > 0) {
          this.checkList = newV
          this.$nextTick(() => {
            if (this.$refs.tree) {
              this.$refs.tree.setCheckedKeys(newV.map(item => item.id));
            }
          });
        } else {
          this.checkList = []
        }
      },
      deep: true
    },
  },
  data() {
    return {
      deptTree: [],
      checkList: [],
    }
  },
  created() {
    flowableDeptTreeSelect().then(res => {
      this.deptTree = res.data
    })
  },
  methods: {
    setCheckList(newV) {
      if (newV && newV.length > 0) {
        this.checkList = newV
        this.$nextTick(() => {
          if (this.$refs.tree) {
            this.$refs.tree.setCheckedKeys(newV.map(item => item.id));
          }
        });
      } else {
        this.checkList = []
      }
    },
    handleCheckChange(data, checked, indeterminate) {
      if (checked) {
        if (this.checkList.indexOf(data) === -1) {
          this.checkList.push(data)
        }
      } else {
        this.checkList = this.checkList.filter(item => item !== data)
      }
      console.log(data, checked, indeterminate);
    },
    close() {
      this.$emit("close")
    },
    submit() {
      this.$emit("submit", this.checkList)
    }
  }
}
</script>
<style scoped>
</style>
src/components/flow/Dept/index.vue
@@ -4,7 +4,6 @@
      :title="`选择候选部门`"
      :visible.sync="show"
      width="65%"
      :destroy-on-close="true"
      :close-on-click-modal="false"
      :modal="false"
@@ -75,7 +74,9 @@
    },
    handleCheckChange(data, checked, indeterminate) {
      if (checked) {
        this.checkList.push(data)
        if (this.checkList.indexOf(data) === -1) {
          this.checkList.push(data)
        }
      } else {
        this.checkList = this.checkList.filter(item => item !== data)
      }
src/components/flow/Role/MyRole.vue
New file
@@ -0,0 +1,207 @@
<template>
  <div>
    <el-dialog
      :title="`选择候选角色`"
      :visible.sync="show"
      width="65%"
      :destroy-on-close="true"
      :close-on-click-modal="false"
      :modal="false"
      :before-close="close">
      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
        <el-form-item label="角色名称" prop="roleName">
          <el-input
            v-model="queryParams.roleName"
            placeholder="请输入角色名称"
            clearable
            style="width: 240px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
        </el-form-item>
      </el-form>
      <el-table ref="dataTable"  v-loading="loading" :data="roleList" @selection-change="handleMultipleRoleSelect">
        <el-table-column type="selection" width="50" align="center" />
        <el-table-column label="角色编号" prop="roleId" width="120" />
        <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
        <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
        <el-table-column label="显示顺序" prop="roleSort" width="100" />
        <el-table-column label="创建时间" align="center" prop="createTime" width="180">
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.createTime) }}</span>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="total>0"
        :total="total"
        :page-sizes="[5,10]"
        layout="prev, pager, next"
        :page.sync="queryParams.pageNum"
        :limit.sync="queryParams.pageSize"
        @pagination="getList"
      />
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submit">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import { listRole} from "@/api/system/role";
import {StrUtil} from "@/utils/StrUtil";
export default {
  name: "MyRole",
  dicts: ['sys_normal_disable'],
  // 接受父组件的值
  props: {
    show: {
      type: Boolean,
      required: true,
      default: true
    },
    // 回显数据传值
    selectValues: {
      type: Array,
      default: [],
      required: false
    }
  },
  data() {
    return {
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 角色表格数据
      roleList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 5,
        roleName: undefined,
        roleKey: undefined,
        status: undefined
      },
      // 表单参数
      form: {},
      radioSelected: 0, // 单选框传值
      selectRoleList: [] // 回显数据传值
    };
  },
  watch: {
    selectValues: {
      deep: true,
      handler(newVal) {
        if (newVal && newVal.length > 0) {
          this.$nextTick(() => {
            this.$refs.dataTable.clearSelection();
            this.selectRoleList = []
            newVal.forEach(item => {
              this.roleList.forEach(role => {
                if (item.roleId === role.roleId) {
                  this.selectRoleList.push(role)
                  this.$refs.dataTable.toggleRowSelection(role)
                }
              })
            });
          })
        } else {
          this.selectRoleList = []
        }
      }
    },
    roleList: {
      deep: true,
      handler(newVal) {
        if (newVal && newVal.length > 0) {
          this.$nextTick(() => {
            this.$refs.dataTable.clearSelection();
            this.selectValues.forEach(item => {
              newVal.forEach(role => {
                if (item.roleId === role.roleId) {
                  this.$refs.dataTable.toggleRowSelection(role)
                }
              })
            });
          })
        }
      }
    }
  },
  mounted() {
    this.getList();
  },
  methods: {
    setChecked(val) {
      if (val && val.length > 0) {
        this.$nextTick(() => {
          this.$refs.dataTable.clearSelection();
          this.selectRoleList = val
          val.forEach(check => {
            this.roleList.forEach(item => {
              if (check.roleId === item.roleId) {
                this.$refs.dataTable.toggleRowSelection(item)
              }
            })
          })
        });
      } else {
        this.selectRoleList = []
      }
    },
    close() {
      this.$emit("close")
    },
    submit() {
      this.$emit("submit", this.selectRoleList)
    },
    /** 查询角色列表 */
    getList() {
      this.loading = true;
      listRole(this.queryParams).then(response => {
          this.roleList = response.rows;
          this.total = response.total;
          this.loading = false;
        }
      );
    },
    // 多选框选中数据
    handleMultipleRoleSelect(selection) {
      this.selectRoleList = selection
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.handleQuery();
    },
  }
};
</script>
<style scoped>
</style>
src/components/flow/User/MultUser.vue
New file
@@ -0,0 +1,259 @@
<template>
  <div>
    <el-dialog
      :title="`选择转办接收人员`"
      :visible.sync="show"
      width="65%"
      :destroy-on-close="true"
      :close-on-click-modal="false"
      :modal="false"
      :before-close="close">
      <el-row :gutter="20">
        <!--部门数据-->
        <el-col :span="6" :xs="24">
          <div class="head-container">
            <el-input
              v-model="deptName"
              placeholder="请输入部门名称"
              clearable
              size="small"
              prefix-icon="el-icon-search"
              style="margin-bottom: 20px"
            />
          </div>
          <div class="head-container">
            <el-tree
              :data="deptOptions"
              :props="defaultProps"
              :expand-on-click-node="false"
              :filter-node-method="filterNode"
              ref="tree"
              node-key="id"
              default-expand-all
              highlight-current
              @node-click="handleNodeClick"
            />
          </div>
        </el-col>
        <!--用户数据-->
        <el-col :span="18" :xs="24">
          <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
            <el-form-item label="用户名称" prop="userName">
              <el-input
                v-model="queryParams.userName"
                placeholder="请输入用户名称"
                clearable
                style="width: 150px"
                @keyup.enter.native="handleQuery"
              />
            </el-form-item>
            <el-form-item>
              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
            </el-form-item>
          </el-form>
          <el-table ref="dataTable" v-loading="loading" :row-key="getRowKey" :data="userList" @selection-change="handleUserSelect">
            <el-table-column type="selection" align="center" />
            <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
            <el-table-column label="登录账号" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
            <el-table-column label="用户姓名" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
            <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
            <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
          </el-table>
          <pagination
            v-show="total>0"
            :total="total"
            :page-sizes="[5,10]"
            layout="prev, pager, next"
            :page.sync="queryParams.pageNum"
            :limit.sync="queryParams.pageSize"
            @pagination="getList"
          />
        </el-col>
      </el-row>
      <span slot="footer" class="dialog-footer">
        <el-button type="danger" @click="getSelected">确认</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import { listUser, deptTreeSelect } from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {StrUtil} from '@/utils/StrUtil'
export default {
  name: "SingleUser",
  dicts: ['sys_normal_disable', 'sys_user_sex'],
  components: { Treeselect },
  // 接受父组件的值
  props: {
    show: {
      required: true,
      type: Boolean
    },
    // 回显数据传值
    selectUserList: {
      type: Number,
      default: null,
      required: false
    },
  },
  data() {
    return {
      innerSelected: [],
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 用户表格数据
      userList: [],
      // 弹出层标题
      title: "",
      // 部门树选项
      deptOptions: undefined,
      // 是否显示弹出层
      open: false,
      // 部门名称
      deptName: undefined,
      // 表单参数
      form: {},
      defaultProps: {
        children: "children",
        label: "label"
      },
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 5,
        userName: undefined,
        phonenumber: undefined,
        status: undefined,
        deptId: undefined
      },
      // 列信息
      columns: [
        { key: 0, label: `用户编号`, visible: true },
        { key: 1, label: `用户名称`, visible: true },
        { key: 2, label: `用户昵称`, visible: true },
        { key: 3, label: `部门`, visible: true },
        { key: 4, label: `手机号码`, visible: true },
        { key: 5, label: `状态`, visible: true },
        { key: 6, label: `创建时间`, visible: true }
      ],
      radioSelected: 0, // 单选框传值
    };
  },
  watch: {
    // 根据名称筛选部门树
    deptName(val) {
      this.$refs.tree.filter(val);
    },
    selectUserList: {
      deep: true,
      handler(newVal) {
        console.log(this.selectValues, "传入的值是")
        this.setChecked(newVal)
      },
    },
    userList: {
      deep: true,
      handler(newVal) {
        this.$nextTick(() => {
          this.$refs.dataTable.clearSelection();
          this.innerSelected.forEach(check => {
            newVal.forEach(item => {
              if (check.userId === item.userId) {
                this.$refs.dataTable.toggleRowSelection(item)
              }
            })
          })
        });
      },
    },
  },
  mounted() {
    this.getList();
    this.getDeptTree();
  },
  methods: {
    setChecked(val) {
      this.$nextTick(() => {
        this.$refs.dataTable.clearSelection();
        this.innerSelected = val
        val.forEach(check => {
          this.userList.forEach(item => {
            if (check.userId === item.userId) {
              this.$refs.dataTable.toggleRowSelection(item)
            }
          })
        })
      });
    },
    /** 查询用户列表 */
    getList() {
      this.loading = true;
      listUser(this.queryParams).then(response => {
          this.userList = response.rows;
          this.total = response.total;
          this.loading = false;
        }
      );
    },
    /** 查询部门下拉树结构 */
    getDeptTree() {
      deptTreeSelect().then(response => {
        this.deptOptions = response.data;
      });
    },
    // 保存选中的数据id,row-key就是要指定一个key标识这一行的数据
    getRowKey (row) {
      return row.id
    },
    // 筛选节点
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    // 节点单击事件
    handleNodeClick(data) {
      this.queryParams.deptId = data.id;
      this.handleQuery();
    },
    // 传递选中值
    handleUserSelect(selectionList) {
      console.log("选中值", selectionList)
      this.innerSelected = selectionList
    },
    getSelected() {
      this.$emit('submit', this.innerSelected);
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRange = [];
      this.resetForm("queryForm");
      this.queryParams.deptId = undefined;
      this.$refs.tree.setCurrentKey(null);
      this.handleQuery();
    },
    close() {
      this.$emit("close")
    },
  }
};
</script>
<style scoped>
</style>
src/components/flow/User/SingleUser.vue
New file
@@ -0,0 +1,287 @@
<template>
  <div>
    <el-dialog
      :title="`选择转办接收人员`"
      :visible.sync="show"
      width="65%"
      :destroy-on-close="true"
      :close-on-click-modal="false"
      :modal="false"
      :before-close="close">
      <el-row :gutter="20">
        <!--部门数据-->
        <el-col :span="6" :xs="24">
          <div class="head-container">
            <el-input
              v-model="deptName"
              placeholder="请输入部门名称"
              clearable
              size="small"
              prefix-icon="el-icon-search"
              style="margin-bottom: 20px"
            />
          </div>
          <div class="head-container">
            <el-tree
              :data="deptOptions"
              :props="defaultProps"
              :expand-on-click-node="false"
              :filter-node-method="filterNode"
              ref="tree"
              node-key="id"
              default-expand-all
              highlight-current
              @node-click="handleNodeClick"
            />
          </div>
        </el-col>
        <!--用户数据-->
        <el-col :span="18" :xs="24">
          <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
            <el-form-item label="用户名称" prop="userName">
              <el-input
                v-model="queryParams.userName"
                placeholder="请输入用户名称"
                clearable
                style="width: 150px"
                @keyup.enter.native="handleQuery"
              />
            </el-form-item>
            <el-form-item>
              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
            </el-form-item>
          </el-form>
          <el-table ref="dataTable" v-loading="loading" :row-key="getRowKey" :data="userList" @selection-change="handleUserSelect">
            <el-table-column type="selection" />
            <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
            <el-table-column label="登录账号" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
            <el-table-column label="用户姓名" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
            <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
            <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
          </el-table>
          <pagination
            v-show="total>0"
            :total="total"
            :page-sizes="[5,10]"
            layout="prev, pager, next"
            :page.sync="queryParams.pageNum"
            :limit.sync="queryParams.pageSize"
            @pagination="getList"
          />
        </el-col>
      </el-row>
      <span slot="footer" class="dialog-footer">
        <el-button type="danger" @click="getSelected">确认</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import { listUser, deptTreeSelect } from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {StrUtil} from '@/utils/StrUtil'
export default {
  name: "SingleUser",
  dicts: ['sys_normal_disable', 'sys_user_sex'],
  components: { Treeselect },
  // 接受父组件的值
  props: {
    show: {
      required: true,
      type: Boolean
    },
    // 回显数据传值
    selectUser: {
      default: null,
      required: false
    },
  },
  data() {
    return {
      innerSelected: null,
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 用户表格数据
      userList: [],
      // 弹出层标题
      title: "",
      // 部门树选项
      deptOptions: undefined,
      // 是否显示弹出层
      open: false,
      // 部门名称
      deptName: undefined,
      // 表单参数
      form: {},
      defaultProps: {
        children: "children",
        label: "label"
      },
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 5,
        userName: undefined,
        phonenumber: undefined,
        status: undefined,
        deptId: undefined
      },
      // 列信息
      columns: [
        { key: 0, label: `用户编号`, visible: true },
        { key: 1, label: `用户名称`, visible: true },
        { key: 2, label: `用户昵称`, visible: true },
        { key: 3, label: `部门`, visible: true },
        { key: 4, label: `手机号码`, visible: true },
        { key: 5, label: `状态`, visible: true },
        { key: 6, label: `创建时间`, visible: true }
      ],
      radioSelected: 0, // 单选框传值
      selectUserList: [] // 回显数据传值
    };
  },
  watch: {
    // 根据名称筛选部门树
    deptName(val) {
      this.$refs.tree.filter(val);
    },
    selectUser: {
      deep: true,
      handler(newVal) {
        if (newVal) {
          this.$nextTick(() => {
            this.$refs.dataTable.clearSelection();
            this.userList.forEach(item => {
              if (newVal === item.userId) {
                this.innerSelected = item
                this.$refs.dataTable.toggleRowSelection(item)
              }
            })
          });
        } else {
          this.innerSelected = null;
        }
      },
    },
    userLst: {
      deep: true,
      handler(newVal) {
        if (newVal) {
          this.$nextTick(() => {
            this.$refs.dataTable.clearSelection();
            if (! this.innerSelected) {
              newVal.forEach(item => {
                if (this.innerSelected.userId === item.userId) {
                  this.innerSelected = item
                  this.$refs.dataTable.toggleRowSelection(item)
                }
              })
            }
          });
        } else {
          this.innerSelected = null;
        }
      },
    },
  },
  mounted() {
    this.getList();
    this.getDeptTree();
  },
  methods: {
    setChecked(val) {
      if (val) {
        this.$nextTick(() => {
          this.$refs.dataTable.clearSelection();
          this.userList.forEach(item => {
            if (val.userId === item.userId) {
              this.innerSelected = item
              this.$refs.dataTable.toggleRowSelection(item)
            }
          })
        });
      } else {
        this.innerSelected = null
      }
    },
    /** 查询用户列表 */
    getList() {
      this.loading = true;
      listUser(this.queryParams).then(response => {
          this.userList = response.rows;
          this.total = response.total;
          this.loading = false;
        }
      );
    },
    /** 查询部门下拉树结构 */
    getDeptTree() {
      deptTreeSelect().then(response => {
        this.deptOptions = response.data;
      });
    },
    // 保存选中的数据id,row-key就是要指定一个key标识这一行的数据
    getRowKey (row) {
      return row.id
    },
    // 筛选节点
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    // 节点单击事件
    handleNodeClick(data) {
      this.queryParams.deptId = data.id;
      this.handleQuery();
    },
    // 传递选中值
    handleUserSelect(selectionList) {
      if (selectionList && selectionList.length > 1) {
        this.$refs.dataTable.clearSelection();
        this.$refs.dataTable.toggleRowSelection(selectionList[selectionList.length - 1]);
      }
      if (selectionList && selectionList.length > 0) {
        this.innerSelected = selectionList[selectionList.length - 1]
        console.log(this.innerSelected)
      } else {
        this.innerSelected = null
      }
    },
    getSelected() {
      this.$emit('submit', this.innerSelected);
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRange = [];
      this.resetForm("queryForm");
      this.queryParams.deptId = undefined;
      this.$refs.tree.setCurrentKey(null);
      this.handleQuery();
    },
    close() {
      this.$emit("close")
    },
  }
};
</script>
<style scoped>
/deep/ .el-table__header-wrapper .el-checkbox{
  display:none
}
</style>
src/router/index.js
@@ -136,7 +136,7 @@
        path: 'task/myProcess/send/index',
        component: () => import('@/views/flowable/task/myProcess/send/index'),
        name: 'SendRecord',
        meta: { title: '流程发起', icon: '' }
        meta: { title: '流程办理', icon: '' }
      }
    ]
  },
src/views/flowable/task/myProcess/detail/index.vue
@@ -1,18 +1,46 @@
<template>
  <div class="app-container">
    <el-card class="box-card" >
      <div slot="header" class="clearfix">
        <span class="el-icon-document">任务详情</span>
      <div slot="header" class="clearfix" style="display: flex">
        <div style="flex: 1" class="el-icon-document">{{`任务详情:` + this.goBackParams.processName}}</div>
        <div style="flex: 2">{{projectName + '——' + flowName}}</div>
        <el-button style="float: right;" size="mini" type="danger" @click="goBack">关闭</el-button>
      </div>
      <el-tabs  tab-position="top" v-model="activeName" @tab-click="handleClick">
        <!--表单信息-->
        <el-tab-pane label="表单信息" name="1">
          <el-col :span="16" :offset="4" v-if="formDataList && formDataList.length > 0">
            <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp">
              <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #409eff">当前阶段:<span style="color: red">{{formDataObj.beforeNodeName}}</span></div>
              <div v-else style="margin-bottom: 15px;color: #409eff">前置阶段:<span style="color: #d5904b">{{formDataObj.beforeNodeName}}</span></div>
              <v-form-render  :form-data="formDataObj.formJson" :ref="'form' + index"/>
          <el-col :span="16" :offset="4">
            <div v-if="formDataList && formDataList.length > 0">
              <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp">
                <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #409eff">当前阶段:<span style="color: red">{{formDataObj.beforeNodeName}}</span></div>
                <div v-else style="margin-bottom: 15px;color: #409eff">前置阶段:<span style="color: #d5904b">{{formDataObj.beforeNodeName}}</span></div>
                <div v-if="formDataObj.formJson !== null && formDataObj.formJson !== ''">
                  <v-form-render  :form-data="formDataObj.formJson" :ref="'form' + index"/>
                </div>
                <div v-else>
                  <el-alert
                    title="节点无表单数据"
                    type="info"
                    :closable="false"
                  >
                  </el-alert>
                </div>
              </div>
            </div>
            <div v-else>
              <el-alert
                title="当前节点无表单数据"
                type="info"
                :closable="false"
              >
              </el-alert>
              <el-alert
                style="margin-top: 20px"
                title="前置节点无表单数据"
                type="info"
                :closable="false"
              >
              </el-alert>
            </div>
         </el-col>
        </el-tab-pane>
@@ -90,6 +118,8 @@
  props: {},
  data() {
    return {
      projectName: '',
      flowName: '',
      // 模型xml数据
      flowData: {},
      formDataList: [],  // 表单列表
@@ -116,6 +146,8 @@
    this.taskForm.taskId  = this.$route.query && this.$route.query.taskId;
    this.taskForm.procInsId = this.$route.query && this.$route.query.procInsId;
    this.goBackParams = this.$route.query && this.$route.query.goBackParams;
    this.projectName = this.$route.query && this.$route.query.projectName;
    this.flowName = this.$route.query && this.$route.query.flowName;
    // 流程任务重获取变量表单
    this.processVariables( this.taskForm.taskId)
    this.getFlowRecordList(this.taskForm.procInsId, this.taskForm.deployId);
@@ -199,7 +231,8 @@
        path: '/projectFlow/detail',
        query: {
          projectId: this.goBackParams.projectId,
          processDefId: this.goBackParams.processDefId
          processDefId: this.goBackParams.processDefId,
          processName: this.goBackParams.processName
        }
      })
    },
@@ -236,11 +269,10 @@
}
.form-warp {
  min-width: 700px;
  padding: 20px;
  margin-top: 5px;
  margin-bottom: 20px;
  box-shadow:
    inset 0 -3em 3em rgba(0, 0, 0, 0.1),
    0 0 0 2px rgb(239, 239, 239),
    0.3em 0.3em 1em rgba(0, 0, 0, 0.3);
  box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;
}
</style>
src/views/flowable/task/myProcess/send/index.vue
@@ -1,8 +1,9 @@
<template>
  <div class="app-container">
    <el-card class="box-card" >
      <div slot="header" class="clearfix">
        <span class="el-icon-document">{{`流程处理:` + processName}}</span>
      <div slot="header" class="clearfix" style="display: flex">
        <div style="flex: 1" class="el-icon-document">{{`任务办理:` + processName}}</div>
        <div style="flex: 2">{{projectName + '——' + flowName}}</div>
        <el-button style="float: right;" size="mini" type="danger" @click="goBack">关闭</el-button>
      </div>
      <el-tabs  tab-position="top" v-model="activeName"  @tab-click="handleClick">
@@ -11,20 +12,19 @@
          <!--初始化流程加载表单信息-->
          <el-col :span="16" :offset="4" v-if="formDataList && formDataList.length > 0">
            <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp" style="position: relative">
              <div v-if="!formDataObj.current" style="position: absolute; top: 2px; right: 2px">
                <el-button type="danger" @click="openRejectTask(formDataObj.beforeNodeDefId)">驳回</el-button>
<!--     前置节点可驳回         -->
              <div v-if="!formDataObj.current" style="position: absolute; top: 4px; right: 4px">
                <el-button type="danger" size="small" @click="openRejectTask(formDataObj.beforeNodeDefId)">驳 回</el-button>
              </div>
              <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #409eff">当前阶段:<span style="color: red">{{formDataObj.beforeNodeName}}</span></div>
              <div v-else style="margin-bottom: 15px;color: #409eff">前置阶段:<span style="color: #d5904b">{{formDataObj.beforeNodeName}}</span></div>
<!--     当前节点可协同、转办等操作         -->
              <div v-else style="position: absolute; top: 4px; right: 4px; display: flex;justify-content: center; align-items: center;">
                <el-button size="small" type="primary" @click="submitForm">确认并提交</el-button>
                <el-button size="small" type="primary" disabled @click="submitForm">协同办理(功能开发中)</el-button>
                <el-button size="small" type="primary" @click="openDelegation(formDataList[0].beforeNodeName)">转办</el-button>
              </div>
              <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #E6A23C">当前阶段:<span style="color: #409EFF">{{formDataObj.beforeNodeName}}</span></div>
              <div v-else style="margin-bottom: 15px;color: #E6A23C">前置阶段:<span style="color: #F56C6C">{{formDataObj.beforeNodeName}}</span></div>
              <v-form-render  :form-data="formDataObj.formJson" :ref="'form' + index"/>
            </div>
<!--            <v-form-render :form-data="formRenderData" ref="vFormRef"/>-->
            <div style="display: flex;justify-content: center; align-items: center; margin: 20px 0">
              <el-button type="primary" @click="submitForm">确认并提交</el-button>
              <el-button type="primary" disabled @click="submitForm">协同办理(功能开发中)</el-button>
              <el-button type="primary" @click="openDelegation(formDataList[0].beforeNodeName)">转办</el-button>
<!--              <el-button type="primary" @click="resetForm">重 置</el-button>-->
            </div>
          </el-col>
        </el-tab-pane>
@@ -83,17 +83,46 @@
          </el-alert>
          <el-form-item label="用户类型" prop="peopleType">
            <el-select v-model="delegationForm.peopleType" @change="peopleTypeChange" placeholder="请选择用户类型">
              <el-option label="指定人员" disabled value="FIX_USER"></el-option>
              <el-option label="候选用户" disabled value="USER"></el-option>
              <el-option label="指定人员" value="FIX_USER"></el-option>
              <el-option label="候选用户" value="USER"></el-option>
              <el-option label="候选部门" value="DEPT"></el-option>
              <el-option label="候选角色" disabled  value="ROLE"></el-option>
              <el-option label="候选角色" value="ROLE"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item v-if="delegationForm.peopleType === 'DEPT'" label="候选部门" prop="targetId">
            <Dept ref="dept" :checkeds="delegationDeptSelect" :show="deptShow" @close="closeDept" @submit="getDeptSelect"/>
            <MyDept ref="dept" :checkeds="delegationDeptSelect" :show="deptShow" @close="closeDept" @submit="getDeptSelect"/>
            <div style="display: flex;align-items: center">
              <div>{{deptNames}}</div>
              <el-button style="margin-left: 8px" type="text" @click="editDept">编辑</el-button>
              <div>
                <el-tag v-for="dept in delegationDeptSelect" :key="dept.id + 'zxc'" type="info" closable @close="removeDept(dept)">{{dept.label}}</el-tag>
              </div>
              <el-button style="margin-left: 8px" type="text" @click="editDept">选择</el-button>
            </div>
          </el-form-item>
          <el-form-item v-if="delegationForm.peopleType === 'FIX_USER'" label="指定用户" prop="targetId">
            <single-user ref="singleUser" :select-user="delegationForm.targetId" :show="singleUserShow" @close="closeSingleUser" @submit="getSingleUserSelect"/>
            <div style="display: flex;align-items: center">
              <div>
                <el-tag v-for="user in delegationUserSelect" :key="user.userId + 'abc'" type="info" closable @close="removeSingleUser(user)">{{user.nickName}}</el-tag>
              </div>
              <el-button style="margin-left: 8px" type="text" @click="editSingleUser">选择</el-button>
            </div>
          </el-form-item>
          <el-form-item v-if="delegationForm.peopleType === 'USER'" label="候选用户" prop="targetId">
            <mult-user ref="multUser" :select-user="delegationUserSelect" :show="multUserShow" @close="closeMultUser" @submit="getMultUserSelect"/>
            <div style="display: flex;align-items: center">
              <div>
                <el-tag v-for="user in delegationUserSelect" :key="user.userId + 'qwe'" type="info" closable @close="removeMultUser(user)">{{user.nickName}}</el-tag>
              </div>
              <el-button style="margin-left: 8px" type="text" @click="editMultUser">选择</el-button>
            </div>
          </el-form-item>
          <el-form-item v-if="delegationForm.peopleType === 'ROLE'" label="候选角色" prop="targetId">
            <my-role ref="role" :select-values="delegationRoleSelect" :show="roleShow" @close="closeRole" @submit="getRoleSelect"/>
            <div style="display: flex;align-items: center">
              <div>
                <el-tag v-for="role in delegationRoleSelect" :key="role.roleId + 'rty'" type="info" closable @close="removeRole(role)">{{role.roleName}}</el-tag>
              </div>
              <el-button style="margin-left: 8px" type="text" @click="editRole">选择</el-button>
            </div>
          </el-form-item>
        </el-form>
@@ -109,12 +138,13 @@
<script>
import {definitionStart, flowXmlAndNode} from "@/api/flowable/definition";
import BpmnViewer from '@/components/Process/viewer';
import Dept from '@/components/flow/Dept'
import MyDept from '@/components/flow/Dept/MyDept'
import SingleUser from '@/components/flow/User/SingleUser'
import MultUser from '@/components/flow/User/MultUser'
import MyRole from '@/components/flow/Role/MyRole'
import {completeSubmitFormTask} from "@/api/flowable/process";
import { flowTaskForm } from "@/api/flowable/todo";
import {getNextFlowNodeByStart} from "@/api/flowable/todo";
import FlowUser from '@/components/flow/User'
import FlowRole from '@/components/flow/Role'
import {rejectTask} from "@/api/flowable/process";
import {taskDelegation} from "@/api/projectProcess/projectProcess";
@@ -122,15 +152,22 @@
  name: "Record",
  components: {
    BpmnViewer,
    FlowUser,
    FlowRole,
    Dept,
    MyRole,
    MyDept,
    SingleUser,
    MultUser,
  },
  props: {},
  data() {
    return {
      deptShow: false, // 部门显示
      deptNames: '', // 选中的部门名称
      projectName: '',
      flowName: '',
      roleShow: false, // 角色组显示
      delegationRoleSelect: [], // 选中角色
      multUserShow: false, // 用户组显示
      singleUserShow: false, // 指定用户显示
      delegationUserSelect: [], // 选中的用户
      deptShow: false, // 部门组显示
      delegationDeptSelect: [], // 选中部门
      delegationFormRules: {
        peopleType: [
@@ -186,6 +223,8 @@
    this.processName = this.$route.query && this.$route.query.processName;
    this.deployId = this.$route.query && this.$route.query.deployId;
    this.taskId = this.$route.query && this.$route.query.taskId;
    this.projectName = this.$route.query && this.$route.query.projectName;
    this.flowName = this.$route.query && this.$route.query.flowName;
    // 初始化表单
    this.procDefId  = this.$route.query && this.$route.query.procDefId;
    this.goBackParams  = this.$route.query && this.$route.query.goBackParams;
@@ -193,21 +232,63 @@
    this.getFlowFormData(this.taskId);
  },
  methods: {
    removeDept(dept) {
      let index = this.delegationDeptSelect.indexOf(dept);
      if (index !== -1) {
        this.delegationDeptSelect.splice(index, 1);
      }
      this.delegationForm.targetId = this.delegationDeptSelect.map(item => item.id).join(",")
    },
    removeRole(role) {
      let index = this.delegationRoleSelect.indexOf(role);
      if (index !== -1) {
        this.delegationRoleSelect.splice(index, 1);
      }
      this.delegationForm.targetId = this.delegationRoleSelect.map(item => item.roleId).join(",")
    },
    removeMultUser(user) {
      let index = this.delegationUserSelect.indexOf(user);
      if (index !== -1) {
        this.delegationUserSelect.splice(index, 1);
      }
      this.delegationForm.targetId = this.delegationUserSelect.map(item => item.userId).join(",")
    },
    removeSingleUser(user) {
      // 因为只能选一个用户,所以删了就没了
      this.delegationUserSelect = []
      this.delegationForm.targetId = ''
    },
    getTips() {
      if (this.delegationForm.peopleType === 'USER' || this.delegationForm.peopleType === 'FIX_USER') {
        return this.delegationUserSelect.map(item => item.nickName).join("、")
      } else if (this.delegationForm.peopleType === 'DEPT') {
        return this.delegationDeptSelect.map(item => item.label).join("、")
      } else if (this.delegationForm.peopleType === 'ROLE') {
        return this.delegationRoleSelect.map(item => item.roleName).join("、")
      }
    },
    delegation() {
      this.$confirm(`确定要将此任务交由【${this.deptNames}】处理吗?`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        taskDelegation(this.delegationForm).then(res => {
          this.$message.success("已发起转办申请")
          this.goBack()
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消转办操作'
        });
      this.$refs['delegationForm'].validate((valid) => {
        if (valid) {
          this.$confirm(`确定要将此任务交由【${this.getTips()}】处理吗?`, '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            taskDelegation(this.delegationForm).then(res => {
              this.$message.success("已发起转办申请")
              this.goBack()
            })
          }).catch(() => {
            this.$message({
              type: 'info',
              message: '已取消转办操作'
            });
          });
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    peopleTypeChange(val) {
@@ -216,6 +297,12 @@
          this.$refs.dept.setCheckList(this.delegationDeptSelect)
        })
        this.deptShow = true
      } else if (val === 'FIX_USER') {
        this.singleUserShow = true
      } else if (val === 'USER') {
        this.multUserShow = true
      } else if (val === 'ROLE') {
        this.roleShow = true
      }
    },
    editDept() {
@@ -224,18 +311,78 @@
      })
      this.deptShow = true
    },
    getDeptSelect(list, names) {
      console.log(list, names)
      if (list) {
        this.delegationForm.targetId = list
        this.delegationDeptSelect = list.split(",")
        this.deptNames = names
    editSingleUser() {
      if (this.delegationUserSelect && this.delegationUserSelect.length > 0) {
        this.$nextTick(() => {
          this.$refs.singleUser.setChecked(this.delegationUserSelect[0])
        })
      }
      this.singleUserShow = true
    },
    editRole() {
      if (this.delegationRoleSelect && this.delegationRoleSelect.length > 0) {
        this.$nextTick(() => {
          this.$refs.role.setChecked(this.delegationRoleSelect)
        })
      }
      this.roleShow = true
    },
    editMultUser() {
      if (this.delegationForm.targetId) {
        this.$nextTick(() => {
          this.$refs.multUser.setChecked(this.delegationUserSelect)
        })
      }
      this.multUserShow = true
    },
    getDeptSelect(deptList) {
      if (deptList && deptList.length > 0) {
        this.delegationForm.targetId = deptList.map(item => item.id).join(",")
        this.delegationDeptSelect = deptList
      }
      this.deptShow = false
    },
    getMultUserSelect(userList) {
      if (userList && userList.length > 0) {
        this.delegationForm.targetId = userList.map(item => item.userId).join(",")
        this.delegationUserSelect = userList
      } else {
        this.delegationForm.targetId = ''
        this.delegationUserSelect = []
      }
      this.multUserShow = false
    },
    getRoleSelect(roleList) {
      if (roleList && roleList.length > 0) {
        this.delegationForm.targetId = roleList.map(item => item.roleId).join(",")
        this.delegationRoleSelect = roleList
      } else {
        this.delegationForm.targetId = ''
        this.delegationRoleSelect = []
      }
      this.roleShow = false
    },
    getSingleUserSelect(user) {
      if (user) {
        this.delegationForm.targetId = user.userId
        this.delegationUserSelect = [user]
      } else {
        this.delegationForm.targetId = ''
        this.delegationUserSelect = []
      }
      this.singleUserShow = false
    },
    closeDept() {
      console.log(this.deptNames)
      this.deptShow = false
    },
    closeSingleUser() {
      this.singleUserShow = false
    },
    closeRole() {
      this.roleShow = false
    },
    closeMultUser() {
      this.multUserShow = false
    },
    openDelegation(taskName) {
      this.delegationForm.taskName = taskName
@@ -312,7 +459,8 @@
        path: '/projectFlow/detail',
        query: {
          projectId: this.goBackParams.projectId,
          processDefId: this.goBackParams.processDefId
          processDefId: this.goBackParams.processDefId,
          processName: this.goBackParams.processName
        }
      })
    },
@@ -466,11 +614,10 @@
}
.form-warp {
  min-width: 700px;
  padding: 20px;
  margin-top: 5px;
  margin-bottom: 20px;
  box-shadow:
    inset 0 -3em 3em rgba(0, 0, 0, 0.1),
    0 0 0 2px rgb(239, 239, 239),
    0.3em 0.3em 1em rgba(0, 0, 0, 0.3);
  box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;
}
</style>
src/views/projectEngineering/abnormalProject/index.vue
@@ -92,7 +92,7 @@
              <el-row>
                <el-col :span="12">
                  <el-form-item label="项目码">
                    <el-select v-model="queryParams.projectColorCode" clearable placeholder="请选择" class="select-option"
                    <el-select v-model="queryParams.coding" clearable placeholder="请选择" class="select-option"
                               @change="handleQuery">
                      <el-option v-for="item in dict.type.sys_project_code" :key="item.value" :label="item.label"
                                 :value="item.value"/>
@@ -201,9 +201,9 @@
            <template v-if="item.slotName === 'projectStatus'">
              <dict-tag :options="dict.type.sys_project_status" :value="scope.row.projectStatus"/>
            </template>
            <!-- projectColorCode插槽 -->
            <template v-if="item.slotName === 'projectColorCode'">
              <dict-tag :options="dict.type.sys_project_code" :value="scope.row.projectColorCode"/>
            <!-- coding插槽 -->
            <template v-if="item.slotName === 'coding'">
              <dict-tag :options="dict.type.sys_project_code" :value="scope.row.coding"/>
            </template>
            <!-- projectType插槽 -->
            <template v-if="item.slotName === 'projectType'">
@@ -331,7 +331,7 @@
        projectType: '', // 项目类型
        importanceType: '', // 重点分类
        projectStatus: '', // 项目状态
        projectColorCode: '', // 项目码
        coding: '', // 项目码
        investmentType: '', // 资金类型
        projectPhase: '', // 项目阶段
        investType: '', // 投资类别
src/views/projectEngineering/abnormalProject/list.js
@@ -1,7 +1,7 @@
export const current = [
  {id: 'projectName', label: '项目名称', visible: true},
  {id: 'projectOwnerUnit', label: '业主单位', visible: true},
  {id: 'projectColorCode', label: '项目码', slotName: 'projectColorCode', visible: true},
  {id: 'coding', label: '项目码', slotName: 'coding', visible: true},
  {id: 'projectCode', label: '项目代码', visible: true},
  {id: 'projectType', label: '项目类型', slotName: 'projectType', visible: true},
  {id: 'projectPhase', label: '项目阶段', visible: true},
@@ -89,7 +89,7 @@
export const currentRest = [
  { id: 'projectName', label: '项目名称', visible: true },
  { id: 'projectOwnerUnit', label: '业主单位', visible: true },
  { id: 'projectColorCode', label: '项目码', slotName: 'projectColorCode', visible: true },
  { id: 'coding', label: '项目码', slotName: 'coding', visible: true },
  { id: 'projectCode', label: '项目代码', visible: true },
  { id: 'projectType', label: '项目类型', slotName: 'projectType', visible: true },
  { id: 'projectPhase', label: '项目阶段', visible: true },
src/views/projectEngineering/projectLibrary/index.vue
@@ -216,8 +216,8 @@
            <template v-if="item.slotName === 'projectStatus'">
              <dict-tag :options="dict.type.sys_project_status" :value="scope.row.projectStatus"/>
            </template>
            <!-- projectColorCode插槽 -->
            <template v-if="item.slotName === 'projectColorCode'">
            <!-- coding插槽 -->
            <template v-if="item.slotName === 'coding'">
              <dict-tag :options="dict.type.sys_project_code" :value="scope.row.coding"/>
            </template>
            <!-- projectType插槽 -->
@@ -350,7 +350,7 @@
        projectType: '', // 项目类型
        importanceType: '', // 重点分类
        projectStatus: '', // 项目状态
        projectColorCode: '', // 项目码
        coding: '', // 项目码
        investmentType: '', // 资金类型
        projectPhase: '', // 项目阶段
        investType: '', // 投资类别
src/views/projectEngineering/projectLibrary/list.js
@@ -1,7 +1,7 @@
export const current = [
  {id: 'projectName', label: '项目名称', visible: true},
  {id: 'projectOwnerUnit', label: '业主单位', visible: true},
  {id: 'projectColorCode', label: '项目码', slotName: 'projectColorCode', visible: true},
  {id: 'coding', label: '项目码', slotName: 'coding', visible: true},
  {id: 'projectCode', label: '项目代码', visible: true},
  {id: 'projectType', label: '项目类型', slotName: 'projectType', visible: true},
  {id: 'projectPhase', label: '项目阶段', visible: true},
@@ -89,7 +89,189 @@
export const currentRest = [
  {id: 'projectName', label: '项目名称', visible: true},
  {id: 'projectOwnerUnit', label: '业主单位', visible: true},
  {id: 'projectColorCode', label: '项目码', slotName: 'projectColorCode', visible: true},
  {id: 'coding', label: '项目码', slotName: 'coding', visible: true},
  {id: 'projectCode', label: '项目代码', visible: true},
  {id: 'projectType', label: '项目类型', slotName: 'projectType', visible: true},
  {id: 'projectPhase', label: '项目阶段', visible: true},
  {id: 'totalInvestment', label: '总投资额', visible: true},
  {id: 'yearInvestAmount', label: '本年计划投资', visible: true},
  {id: 'planStartTime', label: '项目年份', slotName: 'planStartTime', visible: true},
  {id: 'projectStatus', label: '项目状态', slotName: 'projectStatus', visible: true},
  {id: 'investType', label: '投资类别', slotName: 'investType', visible: true},
  {id: 'content', label: '建设内容', visible: false},
  {id: 'fundType', label: '资金类型', visible: false},
  {id: 'projectContactPerson', label: '项目联系人', visible: false},
  {id: 'contact', label: '联系方式', visible: false},
  {id: 'engineeringIdList', label: '关联工程', visible: false},
  {id: 'competentDepartmentList', label: '主管部门', visible: false},
  {id: 'area', label: '行政区划', visible: false},
  {id: 'managementCentralizationList', label: '管理归口', visible: false},
  {id: 'projectApprovalType', label: '项目审批类型', visible: false},
  {id: 'importanceType', label: '重点分类', slotName: 'importanceType', visible: false},
  {id: 'setTime', label: '立项时间', visible: false},
  {id: 'planCompleteTime', label: '计划竣工时间', visible: false},
  {id: 'winUnit', label: '中标单位', visible: false},
  {id: 'winAmount', label: '中标金额', visible: false},
  {id: 'winTime', label: '中标时间', visible: false},
  {id: 'year', label: '年度投资计划', visible: false},
  {id: 'address', label: '项目地址', visible: false},
  {id: 'projectBudget', label: '项目预算', visible: false},
  {id: 'beCrossRegion', label: '建设地点是否跨域', visible: false},
  {id: 'constructionLocation', label: '项目建设地点', visible: false},
  {id: 'detailedAddress', label: '建设详细地址', visible: false},
  {id: 'beCompensationProject', label: '是否是补码项目', visible: false},
  {id: 'compensationReason', label: '补码原因', visible: false},
  {id: 'plannedStartDate', label: '计划开工时间', visible: false},
  {id: 'expectedCompletionDate', label: '拟建成时间', visible: false},
  {id: 'nationalIndustryClassification', label: '国际行业分类', visible: false},
  {id: 'industryClassification', label: '所属行业分类', visible: false},
  {id: 'projectNature', label: '项目建成性质', visible: false},
  {id: 'projectAttribute', label: '项目属性', visible: false},
  {id: 'useEarth', label: '是否使用土地', visible: false},
  {id: 'contentScale', label: '主要建设内容及规模', visible: false},
  {id: 'code', label: '建管平台代码', visible: false},
  {id: 'projectUnit', label: '项目单位', visible: false},
  {id: 'projectUnitType', label: '项目单位类型', visible: false},
  {id: 'registrationType', label: '登记注册类型', visible: false},
  {id: 'holdingSituation', label: '控股情况', visible: false},
  {id: 'certificateType', label: '证照类型', visible: false},
  {id: 'certificateNumber', label: '证件号码', visible: false},
  {id: 'registeredAddress', label: '注册地址', visible: false},
  {id: 'registeredCapital', label: '注册资金', visible: false},
  {id: 'legal_representative', label: '法人代表', visible: false},
  {id: 'fixedPhone', label: '固定电话', visible: false},
  {id: 'legalPersonIdcard', label: '法人身份证号', visible: false},
  {id: 'projectContactPerson', label: '项目联系人', visible: false},
  {id: 'phone', label: '移动电话', visible: false},
  {id: 'contactIdcard', label: '联系人身份证号', visible: false},
  {id: 'wechat', label: '微信号', visible: false},
  {id: 'contactAddress', label: '联系人通讯地址', visible: false},
  {id: 'postCode', label: '邮政编码', visible: false},
  {id: 'email', label: '电子邮箱', visible: false},
  {id: 'totalInvestment', label: '项目总投资额', visible: false},
  {id: 'principal', label: '项目本金', visible: false},
  {id: 'governmentInvestmentTotal', label: '政府投资', visible: false},
  {id: 'centralInvestmentTotal', label: '中央投资', visible: false},
  {id: 'centralBudgetInvestment', label: '中央预算投资', visible: false},
  {id: 'centralFiscalInvestment', label: '中央财政', visible: false},
  {id: 'centralSpecialBondInvestment', label: '中央专项债券筹集的专项建设资金', visible: false},
  {id: 'centralSpecialFundInvestment', label: '中央专项建设基金', visible: false},
  {id: 'provincialInvestmentTotal', label: '省级投资', visible: false},
  {id: 'provincialBudgetInvestment', label: '省预算内投资', visible: false},
  {id: 'provincialFiscalInvestment', label: '省财政性建设投资', visible: false},
  {id: 'provincialSpecialFundInvestment', label: '省专项建设资金', visible: false},
  {id: 'cityInvestmentTotal', label: '市(州)投资', visible: false},
  {id: 'cityBudgetInvestment', label: '市(州)预算内投资', visible: false},
  {id: 'cityFiscalInvestment', label: '市(州)财政性投资', visible: false},
  {id: 'citySpecialFundInvestment', label: '市(州)专项资金', visible: false},
  {id: 'countyInvestmentTotal', label: '县(市、区)投资', visible: false},
  {id: 'countyBudgetInvestment', label: '区(县)预算内投资', visible: false},
  {id: 'countyFiscalInvestment', label: '区(县)财政性建设资金', visible: false},
  {id: 'countySpecialFundInvestment', label: '区(县)专项资金', visible: false},
  {id: 'domesticLoanTotal', label: '国内贷款', visible: false},
  {id: 'bankLoan', label: '银行贷款', visible: false},
  {id: 'foreignInvestmentTotal', label: '外商投资', visible: false},
  {id: 'enterpriseSelfRaisedTotal', label: '企业自筹', visible: false},
  {id: 'otherInvestmentTotal', label: '其他投资', visible: false}
];
// 流程推进列表使用
export const projectProcessCurrent = [
  {id: 'projectName', label: '项目名称', visible: true},
  {id: 'flowableProcessName', label: '绑定流程', visible: true, minWidth: 200, showOverflowTooltip: true},
  {id: 'projectOwnerUnit', label: '业主单位', visible: true},
  {id: 'coding', label: '项目码', slotName: 'coding', visible: true},
  {id: 'projectCode', label: '项目代码', visible: true},
  {id: 'projectType', label: '项目类型', slotName: 'projectType', visible: true},
  {id: 'projectPhase', label: '项目阶段', visible: true},
  {id: 'totalInvestment', label: '总投资额', visible: true},
  {id: 'yearInvestAmount', label: '本年计划投资', visible: true},
  {id: 'planStartTime', label: '项目年份', slotName: 'planStartTime', visible: true},
  {id: 'projectStatus', label: '项目状态', slotName: 'projectStatus', visible: true},
  {id: 'investType', label: '投资类别', slotName: 'investType', visible: true},
  {id: 'content', label: '建设内容', visible: false},
  {id: 'fundType', label: '资金类型', visible: false},
  {id: 'projectContactPerson', label: '项目联系人', visible: false},
  {id: 'contact', label: '联系方式', visible: false},
  {id: 'engineeringIdList', label: '关联工程', visible: false},
  {id: 'competentDepartmentList', label: '主管部门', visible: false},
  {id: 'area', label: '行政区划', visible: false},
  {id: 'managementCentralizationList', label: '管理归口', visible: false},
  {id: 'projectApprovalType', label: '项目审批类型', visible: false},
  {id: 'importanceType', label: '重点分类', slotName: 'importanceType', visible: false},
  {id: 'setTime', label: '立项时间', visible: false},
  {id: 'planCompleteTime', label: '计划竣工时间', visible: false},
  {id: 'winUnit', label: '中标单位', visible: false},
  {id: 'winAmount', label: '中标金额', visible: false},
  {id: 'winTime', label: '中标时间', visible: false},
  {id: 'year', label: '年度投资计划', visible: false},
  {id: 'address', label: '项目地址', visible: false},
  {id: 'projectBudget', label: '项目预算', visible: false},
  {id: 'beCrossRegion', label: '建设地点是否跨域', visible: false},
  {id: 'constructionLocation', label: '项目建设地点', visible: false},
  {id: 'detailedAddress', label: '建设详细地址', visible: false},
  {id: 'beCompensationProject', label: '是否是补码项目', visible: false},
  {id: 'compensationReason', label: '补码原因', visible: false},
  {id: 'plannedStartDate', label: '计划开工时间', visible: false},
  {id: 'expectedCompletionDate', label: '拟建成时间', visible: false},
  {id: 'nationalIndustryClassification', label: '国际行业分类', visible: false},
  {id: 'industryClassification', label: '所属行业分类', visible: false},
  {id: 'projectNature', label: '项目建成性质', visible: false},
  {id: 'projectAttribute', label: '项目属性', visible: false},
  {id: 'useEarth', label: '是否使用土地', visible: false},
  {id: 'contentScale', label: '主要建设内容及规模', visible: false},
  {id: 'code', label: '建管平台代码', visible: false},
  {id: 'projectUnit', label: '项目单位', visible: false},
  {id: 'projectUnitType', label: '项目单位类型', visible: false},
  {id: 'registrationType', label: '登记注册类型', visible: false},
  {id: 'holdingSituation', label: '控股情况', visible: false},
  {id: 'certificateType', label: '证照类型', visible: false},
  {id: 'certificateNumber', label: '证件号码', visible: false},
  {id: 'registeredAddress', label: '注册地址', visible: false},
  {id: 'registeredCapital', label: '注册资金', visible: false},
  {id: 'legal_representative', label: '法人代表', visible: false},
  {id: 'fixedPhone', label: '固定电话', visible: false},
  {id: 'legalPersonIdcard', label: '法人身份证号', visible: false},
  {id: 'projectContactPerson', label: '项目联系人', visible: false},
  {id: 'phone', label: '移动电话', visible: false},
  {id: 'contactIdcard', label: '联系人身份证号', visible: false},
  {id: 'wechat', label: '微信号', visible: false},
  {id: 'contactAddress', label: '联系人通讯地址', visible: false},
  {id: 'postCode', label: '邮政编码', visible: false},
  {id: 'email', label: '电子邮箱', visible: false},
  {id: 'totalInvestment', label: '项目总投资额', visible: false},
  {id: 'principal', label: '项目本金', visible: false},
  {id: 'governmentInvestmentTotal', label: '政府投资', visible: false},
  {id: 'centralInvestmentTotal', label: '中央投资', visible: false},
  {id: 'centralBudgetInvestment', label: '中央预算投资', visible: false},
  {id: 'centralFiscalInvestment', label: '中央财政', visible: false},
  {id: 'centralSpecialBondInvestment', label: '中央专项债券筹集的专项建设资金', visible: false},
  {id: 'centralSpecialFundInvestment', label: '中央专项建设基金', visible: false},
  {id: 'provincialInvestmentTotal', label: '省级投资', visible: false},
  {id: 'provincialBudgetInvestment', label: '省预算内投资', visible: false},
  {id: 'provincialFiscalInvestment', label: '省财政性建设投资', visible: false},
  {id: 'provincialSpecialFundInvestment', label: '省专项建设资金', visible: false},
  {id: 'cityInvestmentTotal', label: '市(州)投资', visible: false},
  {id: 'cityBudgetInvestment', label: '市(州)预算内投资', visible: false},
  {id: 'cityFiscalInvestment', label: '市(州)财政性投资', visible: false},
  {id: 'citySpecialFundInvestment', label: '市(州)专项资金', visible: false},
  {id: 'countyInvestmentTotal', label: '县(市、区)投资', visible: false},
  {id: 'countyBudgetInvestment', label: '区(县)预算内投资', visible: false},
  {id: 'countyFiscalInvestment', label: '区(县)财政性建设资金', visible: false},
  {id: 'countySpecialFundInvestment', label: '区(县)专项资金', visible: false},
  {id: 'domesticLoanTotal', label: '国内贷款', visible: false},
  {id: 'bankLoan', label: '银行贷款', visible: false},
  {id: 'foreignInvestmentTotal', label: '外商投资', visible: false},
  {id: 'enterpriseSelfRaisedTotal', label: '企业自筹', visible: false},
  {id: 'otherInvestmentTotal', label: '其他投资', visible: false}
];
export const projectProcessCurrentRest = [
  {id: 'projectName', label: '项目名称', visible: true},
  {id: 'flowableProcessName', label: '绑定流程', visible: true, minWidth: 200, showOverflowTooltip: true},
  {id: 'projectOwnerUnit', label: '业主单位', visible: true},
  {id: 'coding', label: '项目码', slotName: 'coding', visible: true},
  {id: 'projectCode', label: '项目代码', visible: true},
  {id: 'projectType', label: '项目类型', slotName: 'projectType', visible: true},
  {id: 'projectPhase', label: '项目阶段', visible: true},
src/views/projectManage/plan/index.vue
@@ -74,9 +74,9 @@
          {{ scope.row.reportStatus === 0 ? '已上报' : '未上报' }}
        </template>
      </el-table-column>
      <el-table-column label="项目码" align="center" prop="projectColorCode">
      <el-table-column label="项目码" align="center" prop="coding">
        <template slot-scope="scope">
          <el-tag type="success" v-if="scope.row.projectColorCode === 'green'">绿</el-tag>
          <el-tag type="success" v-if="scope.row.coding === 'green'">绿</el-tag>
        </template>
      </el-table-column>
      <el-table-column label="项目代码" align="center" prop="projectCode" />
src/views/projectManage/progress/index.vue
@@ -74,9 +74,9 @@
          {{ scope.row.reportStatus === 0 ? '已上报' : '未上报' }}
        </template>
      </el-table-column>
      <el-table-column label="项目码" align="center" prop="projectColorCode">
      <el-table-column label="项目码" align="center" prop="coding">
        <template slot-scope="scope">
          <el-tag type="success" v-if="scope.row.projectColorCode === 'green'">绿</el-tag>
          <el-tag type="success" v-if="scope.row.coding === 'green'">绿</el-tag>
        </template>
      </el-table-column>
      <el-table-column label="项目代码" align="center" prop="projectCode" />
src/views/projectProcess/detail/index.vue
@@ -6,7 +6,7 @@
          <h2>项目名称:{{detailData.projectName}}</h2>
        </div>
        <div class="project-info">
          <div class="project-info-item"></div>
          <div class="project-info-item">流程名称:{{queryParams.processName}}</div>
          <div class="project-info-item">项目代码:{{detailData.projectCode}}</div>
          <div class="project-info-item">
            <div style="color: black">
@@ -48,11 +48,6 @@
          >
          </el-table-column>
          <el-table-column
            prop="processName"
            label="流程名称"
          >
          </el-table-column>
          <el-table-column
            prop="promoterUnitName"
            label="发起单位"
          >
@@ -63,16 +58,36 @@
          >
          </el-table-column>
          <el-table-column
            align="center"
            prop="handlerType"
            label="处理方类型"
          >
            <template slot-scope="scope">
              <el-tag v-if="scope.row.handlerType === 'USER'">人员账号</el-tag>
              <el-tag type="success" v-else-if="scope.row.handlerType === 'DEPT'">单位</el-tag>
              <el-tag type="info" v-else-if="scope.row.handlerType === 'ROLE'">角色</el-tag>
            </template>
          </el-table-column>
          <el-table-column
            prop="handlerUnitName"
            label="处理单位"
            :formatter="unitFormatter"
          >
          </el-table-column>
          <el-table-column
            prop="handlerName"
            label="候选处理人"
            :formatter="candidateFormatter"
          >
          </el-table-column>
          <el-table-column
            prop="handlerName"
            label="实际处理人"
            :formatter="finalFinishedFormatter"
          >
          </el-table-column>
          <el-table-column
            align="center"
            prop="taskStatus"
            label="任务状态"
          >
@@ -111,7 +126,7 @@
} from "@/api/projectProcess/projectProcess";
export default {
  name: "index",
  name: "Detail",
  data() {
    return {
      loading: false,
@@ -127,6 +142,7 @@
        currentPage: 1,
        projectId: null,
        processDefId: null,
        processName: '' // 流程名称
      }
    }
  },
@@ -134,18 +150,45 @@
    console.log(this.$route.query, "参数")
    this.queryParams.projectId = this.$route.query.projectId
    this.queryParams.processDefId = this.$route.query.processDefId
    this.queryParams.processName = this.$route.query.processName
    this.loading = true
    this.getProjectProcessInfo()
  },
  methods: {
    unitFormatter(row) {
      if (row.handlerType === 'USER') {
        return null;
      } else if (row.handlerType === 'DEPT') {
        return row.handlerUnitName.join("、")
      } else if (row.handlerType === 'ROLE') {
        return row.handlerUnitName.join('、')
      }
    },
    candidateFormatter(row) {
      if (row.handlerType === 'USER') {
        return row.handlerName.join('、')
      } else if (row.handlerType === 'DEPT') {
        return row.handlerUnitName.join('、')
      } else if (row.handlerType === 'ROLE') {
        return row.handlerUnitName.join('、')
      }
    },
    finalFinishedFormatter(row) {
      // 不是已完成的状态没有实际处理人,已完成的状态只有一个人
      if (row.taskStatus !== '已完成') {
        return null
      } else {
        return row.handlerName
      }
    },
    showHandle(row) {
      console.log(this.$store.state.user, "用户信息")
      if (row.taskStatus === '待办') {
        if (row.handlerType === "USER") {
          return this.$store.state.user.id === row.handlerId
          console.log(row.handlerId.indexOf(this.$store.state.user.id) !== -1, "我是不是")
          return row.handlerId.indexOf(this.$store.state.user.id) !== -1
        } else if (row.handlerType === "DEPT") {
          console.log(this.$store.state.user.deptId, "部门id", row.handlerUnitId)
          return this.$store.state.user.deptId === row.handlerUnitId
          return row.handlerUnitId.indexOf(this.$store.state.user.deptId) !== -1
          // return this.$store.state.user.name === '市发展改革委' || this.$store.state.user.name === '市住建局'
        } else if (row.handlerType === "ROLE") {
          return this.$auth.hasRole(row.handlerUnitName)
@@ -167,6 +210,8 @@
            deployId: row.deployId,
            procDefId: row.processDefId,
            processName: row.taskName,
            flowName: this.queryParams.processName,
            projectName: this.detailData.projectName,
            taskId: row.taskId,
            showAuditing: res.data,
            goBackParams: this.queryParams
@@ -177,6 +222,8 @@
    goToProcessDetail(row) {
      this.$router.push({ path: '/flowable/task/myProcess/detail/index',
        query: {
          projectName: this.detailData.projectName,
          flowName: this.queryParams.processName,
          procInsId: row.processInsId,
          deployId: row.deployId,
          taskId: row.taskId,
src/views/projectProcess/index.vue
@@ -88,7 +88,7 @@
              <el-row>
                <el-col :span="12">
                  <el-form-item label="项目码">
                    <el-select v-model="queryParams.projectColorCode" clearable placeholder="请选择" class="select-option" @change="handleQuery">
                    <el-select v-model="queryParams.coding" clearable placeholder="请选择" class="select-option" @change="handleQuery">
                      <el-option v-for="item in dict.type.sys_project_code" :key="item.value" :label="item.label"
                                 :value="item.value"/>
                    </el-select>
@@ -197,6 +197,7 @@
        :prop="item.id"
        :label="item.label"
        :min-width="item.minWidth"
        :show-overflow-tooltip="item.showOverflowTooltip"
      >
        <template slot-scope="scope">
          <!-- 使用具名插槽 -->
@@ -205,14 +206,9 @@
            <template v-if="item.slotName === 'projectStatus'">
              <dict-tag :options="dict.type.sys_project_status" :value="scope.row.projectStatus"/>
            </template>
            <!-- projectColorCode插槽 -->
            <template v-if="item.slotName === 'projectColorCode' || item.slotName === 'coding'">
              <div v-if="scope.row.projectColorCode">
                <dict-tag :options="dict.type.sys_project_code" :value="scope.row.projectColorCode"/>
              </div>
              <div v-else>
                <dict-tag :options="dict.type.sys_project_code" :value="scope.row.coding"/>
              </div>
            <!-- coding插槽 -->
            <template v-if="item.slotName === 'coding' || item.slotName === 'coding'">
              <dict-tag :options="dict.type.sys_project_code" :value="scope.row.coding"/>
            </template>
            <!-- projectType插槽 -->
            <template v-if="item.slotName === 'projectType'">
@@ -290,7 +286,7 @@
import { listDefinition } from "@/api/flowable/definition";
import {listInfo, getInfo, delInfo, addInfo, updateInfo} from "@/api/projectEngineering/projectInfo";
import { getProjectProcess } from "@/api/projectProcess/projectProcess"
import {current, currentRest} from '@/views/projectEngineering/projectLibrary/list';
import {projectProcessCurrent, projectProcessCurrentRest} from '@/views/projectEngineering/projectLibrary/list';
import FileDialog from '@/views/projectEngineering/projectLibrary/component/FileDialog';
import RunProcess from "@/views/projectProcess/components/RunProcess";
import {getProcessConfigInfoList} from "@/api/projectProcess/processConfigInfo";
@@ -355,7 +351,7 @@
        projectType: '', // 项目类型
        importanceType: '', // 重点分类
        projectStatus: '', // 项目状态
        projectColorCode: '', // 项目码
        coding: '', // 项目码
        investmentType: '', // 资金类型
        projectPhase: '', // 项目阶段
        investType: '', // 投资类别
@@ -384,7 +380,7 @@
    if(projectCategory){
      this.isProjectCategory = true;
    }
    const columns = current.map((item, index) => {
    const columns = projectProcessCurrent.map((item, index) => {
      item.index = index + 1;
      item.key = index;
      item.serialNumber = index + 1;
@@ -402,7 +398,8 @@
        path: '/projectFlow/detail',
        query: {
          projectId: row.id,
          processDefId: row.processDefId
          processDefId: row.processDefId,
          processName: row.flowableProcessName
        }
      })
    },
@@ -433,13 +430,13 @@
    },
    // 重置排序的方法
    handleResetSort() {
      this.defaultColumns = currentRest.map((item, index) => {
      this.defaultColumns = projectProcessCurrentRest.map((item, index) => {
        item.index = index + 1;
        item.key = index;
        item.serialNumber = index + 1
        return item;
      });
      this.columns = currentRest.map((item, index) => {
      this.columns = projectProcessCurrentRest.map((item, index) => {
        item.index = index + 1;
        item.key = index;
        item.serialNumber = index + 1