xiangpei
2024-12-31 686b6f9e7ee9a390e179a3290d70d57c635ac7e1
流程转办:指定用户组件
2个文件已修改
1个文件已添加
333 ■■■■■ 已修改文件
src/components/flow/Dept/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/flow/User/SingleUser.vue 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/task/myProcess/send/index.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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"
src/components/flow/User/SingleUser.vue
New file
@@ -0,0 +1,262 @@
<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: {
      type: Number,
      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) {
        console.log(this.selectValues, "传入的值是")
        this.$nextTick(() => {
          this.$refs.dataTable.clearSelection();
            this.userList.forEach(item => {
              if (newVal === item.userId) {
                this.innerSelected = item
                this.$refs.dataTable.toggleRowSelection(item)
              }
            })
        });
      },
      // immediate: true
    },
  },
  mounted() {
    this.getList();
    this.getDeptTree();
  },
  methods: {
    setChecked(val) {
        this.$nextTick(() => {
          this.$refs.dataTable.clearSelection();
            this.userList.forEach(item => {
              if (val === item.userId) {
                this.innerSelected = item
                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) {
      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/views/flowable/task/myProcess/send/index.vue
@@ -83,7 +83,7 @@
          </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="指定人员" value="FIX_USER"></el-option>
              <el-option label="候选用户" disabled value="USER"></el-option>
              <el-option label="候选部门" value="DEPT"></el-option>
              <el-option label="候选角色" disabled  value="ROLE"></el-option>
@@ -94,6 +94,13 @@
            <div style="display: flex;align-items: center">
              <div>{{deptNames}}</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="closeUser" @submit="getSingleUserSelect"/>
            <div style="display: flex;align-items: center">
              <div>{{delegationUserSelect.map(item => item.nickName).join(',')}}</div>
              <el-button style="margin-left: 8px" type="text" @click="editUser">编辑</el-button>
            </div>
          </el-form-item>
        </el-form>
@@ -110,6 +117,7 @@
import {definitionStart, flowXmlAndNode} from "@/api/flowable/definition";
import BpmnViewer from '@/components/Process/viewer';
import Dept from '@/components/flow/Dept'
import SingleUser from '@/components/flow/User/SingleUser'
import {completeSubmitFormTask} from "@/api/flowable/process";
import { flowTaskForm } from "@/api/flowable/todo";
import {getNextFlowNodeByStart} from "@/api/flowable/todo";
@@ -125,10 +133,13 @@
    FlowUser,
    FlowRole,
    Dept,
    SingleUser,
  },
  props: {},
  data() {
    return {
      singleUserShow: false, // 指定用户显示
      delegationUserSelect: [], // 选中的用户
      deptShow: false, // 部门显示
      deptNames: '', // 选中的部门名称
      delegationDeptSelect: [], // 选中部门
@@ -194,20 +205,27 @@
  },
  methods: {
    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.deptNames}】处理吗?`, '提示', {
            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 +234,8 @@
          this.$refs.dept.setCheckList(this.delegationDeptSelect)
        })
        this.deptShow = true
      } else if (val === 'FIX_USER') {
        this.singleUserShow = true
      }
    },
    editDept() {
@@ -223,6 +243,12 @@
        this.$refs.dept.setCheckList(this.delegationDeptSelect)
      })
      this.deptShow = true
    },
    editUser() {
      this.$nextTick(() => {
        this.$refs.singleUser.setChecked(this.delegationForm.targetId)
      })
      this.singleUserShow = true
    },
    getDeptSelect(list, names) {
      console.log(list, names)
@@ -233,10 +259,22 @@
      }
      this.deptShow = 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
    },
    closeUser() {
      this.singleUserShow = false
    },
    openDelegation(taskName) {
      this.delegationForm.taskName = taskName
      this.delegationForm.taskId = this.taskId