From 1bfba74b6bea7da6d14b0da1ab8b1efe02e474b3 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期五, 03 一月 2025 13:38:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/projectEngineering/projectLibrary/index.vue  |    6 
 src/views/flowable/task/myProcess/detail/index.vue     |   56 +
 src/components/flow/Dept/index.vue                     |    5 
 src/views/projectManage/plan/index.vue                 |    4 
 src/components/flow/Role/MyRole.vue                    |  207 ++++++++
 src/views/projectEngineering/projectLibrary/list.js    |  186 +++++++
 src/components/flow/Dept/MyDept.vue                    |  105 ++++
 src/components/flow/User/SingleUser.vue                |  287 +++++++++++
 src/router/index.js                                    |    2 
 src/views/flowable/task/myProcess/send/index.vue       |  255 ++++++++--
 src/views/projectEngineering/abnormalProject/index.vue |   10 
 src/views/projectProcess/detail/index.vue              |   67 ++
 src/views/projectEngineering/abnormalProject/list.js   |    4 
 src/views/projectProcess/index.vue                     |   27 
 src/components/flow/User/MultUser.vue                  |  259 ++++++++++
 src/views/projectManage/progress/index.vue             |    4 
 16 files changed, 1,374 insertions(+), 110 deletions(-)

diff --git a/src/components/flow/Dept/MyDept.vue b/src/components/flow/Dept/MyDept.vue
new file mode 100644
index 0000000..ea0b709
--- /dev/null
+++ b/src/components/flow/Dept/MyDept.vue
@@ -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>
diff --git a/src/components/flow/Dept/index.vue b/src/components/flow/Dept/index.vue
index 44fcb17..7081767 100644
--- a/src/components/flow/Dept/index.vue
+++ b/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)
       }
diff --git a/src/components/flow/Role/MyRole.vue b/src/components/flow/Role/MyRole.vue
new file mode 100644
index 0000000..f2027a0
--- /dev/null
+++ b/src/components/flow/Role/MyRole.vue
@@ -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>
diff --git a/src/components/flow/User/MultUser.vue b/src/components/flow/User/MultUser.vue
new file mode 100644
index 0000000..c4e18b7
--- /dev/null
+++ b/src/components/flow/User/MultUser.vue
@@ -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;
+      });
+    },
+    // 淇濆瓨閫変腑鐨勬暟鎹甶d,row-key灏辨槸瑕佹寚瀹氫竴涓猭ey鏍囪瘑杩欎竴琛岀殑鏁版嵁
+    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>
diff --git a/src/components/flow/User/SingleUser.vue b/src/components/flow/User/SingleUser.vue
new file mode 100644
index 0000000..e8cf64d
--- /dev/null
+++ b/src/components/flow/User/SingleUser.vue
@@ -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;
+      });
+    },
+    // 淇濆瓨閫変腑鐨勬暟鎹甶d,row-key灏辨槸瑕佹寚瀹氫竴涓猭ey鏍囪瘑杩欎竴琛岀殑鏁版嵁
+    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>
diff --git a/src/router/index.js b/src/router/index.js
index 396f639..64c8440 100644
--- a/src/router/index.js
+++ b/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: '' }
       }
     ]
   },
diff --git a/src/views/flowable/task/myProcess/detail/index.vue b/src/views/flowable/task/myProcess/detail/index.vue
index f1d763c..baa1eae 100644
--- a/src/views/flowable/task/myProcess/detail/index.vue
+++ b/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>
diff --git a/src/views/flowable/task/myProcess/send/index.vue b/src/views/flowable/task/myProcess/send/index.vue
index 70d044d..76f7c37 100644
--- a/src/views/flowable/task/myProcess/send/index.vue
+++ b/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>
diff --git a/src/views/projectEngineering/abnormalProject/index.vue b/src/views/projectEngineering/abnormalProject/index.vue
index 4118f26..a401857 100644
--- a/src/views/projectEngineering/abnormalProject/index.vue
+++ b/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: '', // 鎶曡祫绫诲埆
diff --git a/src/views/projectEngineering/abnormalProject/list.js b/src/views/projectEngineering/abnormalProject/list.js
index d187287..f72eda4 100644
--- a/src/views/projectEngineering/abnormalProject/list.js
+++ b/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: '椤圭洰浠g爜', 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: '椤圭洰浠g爜', visible: true },
   { id: 'projectType', label: '椤圭洰绫诲瀷', slotName: 'projectType', visible: true },
   { id: 'projectPhase', label: '椤圭洰闃舵', visible: true },
diff --git a/src/views/projectEngineering/projectLibrary/index.vue b/src/views/projectEngineering/projectLibrary/index.vue
index 07fd71e..a5e95d3 100644
--- a/src/views/projectEngineering/projectLibrary/index.vue
+++ b/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: '', // 鎶曡祫绫诲埆
diff --git a/src/views/projectEngineering/projectLibrary/list.js b/src/views/projectEngineering/projectLibrary/list.js
index 0da3a9a..bbc8e98 100644
--- a/src/views/projectEngineering/projectLibrary/list.js
+++ b/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: '椤圭洰浠g爜', 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: '椤圭洰浠g爜', 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: '璁″垝绔e伐鏃堕棿', 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: '寤虹骞冲彴浠g爜', 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: '娉曚汉浠h〃', 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: '椤圭洰浠g爜', 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: '璁″垝绔e伐鏃堕棿', 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: '寤虹骞冲彴浠g爜', 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: '娉曚汉浠h〃', 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: '椤圭洰浠g爜', visible: true},
   {id: 'projectType', label: '椤圭洰绫诲瀷', slotName: 'projectType', visible: true},
   {id: 'projectPhase', label: '椤圭洰闃舵', visible: true},
diff --git a/src/views/projectManage/plan/index.vue b/src/views/projectManage/plan/index.vue
index fd8d129..2ab1a9f 100644
--- a/src/views/projectManage/plan/index.vue
+++ b/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="椤圭洰浠g爜" align="center" prop="projectCode" />
diff --git a/src/views/projectManage/progress/index.vue b/src/views/projectManage/progress/index.vue
index 6d4e54a..35ffa83 100644
--- a/src/views/projectManage/progress/index.vue
+++ b/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="椤圭洰浠g爜" align="center" prop="projectCode" />
diff --git a/src/views/projectProcess/detail/index.vue b/src/views/projectProcess/detail/index.vue
index 352f65f..6c17627 100644
--- a/src/views/projectProcess/detail/index.vue
+++ b/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">椤圭洰浠g爜锛歿{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,
diff --git a/src/views/projectProcess/index.vue b/src/views/projectProcess/index.vue
index db7e1d4..9838167 100644
--- a/src/views/projectProcess/index.vue
+++ b/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

--
Gitblit v1.8.0