| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605 | <template>  <div class="app-container">    <el-row :gutter="20">      <!--部门数据-->      <!-- <el-col :span="4" :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="24" :xs="24">        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">          <el-form-item label="项目编号" prop="projectNumber">            <el-input v-model="queryParams.projectNumber" placeholder="请输入项目编号" clearable style="width: 240px"              @keyup.enter.native="handleQuery" />          </el-form-item>          <el-form-item label="项目名称" prop="name">            <el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable style="width: 240px"              @keyup.enter.native="handleQuery" />          </el-form-item>          <el-form-item label="研发人员" prop="staffId">            <el-autocomplete v-model="superiorName" value-key="nickName" :fetch-suggestions="getDatas"              :filter-multiple="true" clearable placeholder="请输入关键字" @select="selectUser" />          </el-form-item>          <el-form-item label="项目年份" prop="projectYear">            <el-date-picker v-model="queryParams.projectYear" value-format="yyyy" type="year" placeholder="选择项目年份">            </el-date-picker>          </el-form-item>          <el-form-item label="是否跨年" prop="crossYear">            <el-select v-model="queryParams.crossYear" placeholder="是否跨年" clearable style="width: 240px">              <el-option v-for="dict in year" :key="dict.value" :label="dict.label" :value="dict.value" />            </el-select>          </el-form-item>          <el-form-item label="创建时间">            <el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"              range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>          </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-row :gutter="10" class="mb8">          <el-col :span="1.5">            <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"              v-hasPermi="['system:user:add']">新增</el-button>          </el-col>          <el-col :span="1.5">            <el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport"              v-hasPermi="['system:user:import']">导入</el-button>          </el-col>          <el-col :span="1.5">            <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"              v-hasPermi="['system:user:export']">导出</el-button>          </el-col>          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>        </el-row>        <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">          <el-table-column type="selection" width="50" align="center" />          <el-table-column label="项目编号" align="center" key="projectNumber" prop="projectNumber"            v-if="columns[0].visible" />          <el-table-column label="项目年份" align="center" key="projectYear" prop="projectYear" v-if="columns[1].visible"            :show-overflow-tooltip="true" />          <el-table-column label="是否跨年" align="center" key="crossYear" prop="crossYear" v-if="columns[2].visible"            :show-overflow-tooltip="true">            <template slot-scope="scope">              <span>{{ ["非跨年", "跨年"][scope.row.crossYear] }}</span>            </template>          </el-table-column>          <el-table-column label="项目名称" align="center" key="name" prop="name" v-if="columns[3].visible"            :show-overflow-tooltip="true" />          <el-table-column label="负责人" align="center" key="adminName" prop="adminName" v-if="columns[4].visible" />          <el-table-column label="参与研发人员" align="center" key="staffName" prop="staffName" v-if="columns[5].visible" />          <el-table-column label="项目状态" align="center" key="projectStatus" prop="projectStatus"            v-if="columns[6].visible"></el-table-column>          <el-table-column label="累积工时" align="center" key="duration" prop="duration"            v-if="columns[6].visible"></el-table-column>          <el-table-column label="创建年份" align="center" key="createYear" prop="createYear" v-if="columns[7].visible" />          <el-table-column label="起止时间" align="center" key="startTime" prop="startTime" v-if="columns[8].visible">            <template slot-scope="scope">              <div>{{ scope.row.startTime }}</div>              <div>至</div>              <div>{{ scope.row.endTime }}</div>            </template>          </el-table-column>          <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">            <template slot-scope="scope" v-if="scope.row.userId !== 1">              <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"                v-hasPermi="['system:user:edit']">修改</el-button>            </template>          </el-table-column>        </el-table>        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"          @pagination="getList" />      </el-col>    </el-row>    <!-- 添加或修改用户配置对话框 -->    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>      <el-form ref="form" :model="form" :rules="rules" label-width="80px">        <el-row>          <el-col :span="12">            <el-form-item label="项目编号" prop="projectNumber">              <el-input v-model="form.projectNumber" placeholder="请输入项目编号" maxlength="30" />            </el-form-item>          </el-col>          <el-col :span="12">            <el-form-item label="项目名称" prop="name">              <el-input v-model="form.name" placeholder="请输入项目名称" maxlength="30" />            </el-form-item>          </el-col>        </el-row>        <el-row>          <el-col :span="12">            <el-form-item label="起止时间">              <el-date-picker v-model="dateRange1" style="width:250px" value-format="yyyy-MM-dd" type="daterange"                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>            </el-form-item>          </el-col>          <el-col :span="12">            <el-form-item label="是否跨年" prop="crossYear">              <el-select v-model="form.crossYear" style="width:250px" placeholder="请选择是否跨年">                <el-option v-for="dict in year" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>              </el-select>            </el-form-item>          </el-col>        </el-row>        <el-row>          <el-col :span="12">            <el-form-item label="创建年份" prop="createYear">              <el-date-picker v-model="form.createYear" style="width:250px" value-format="yyyy" type="year"                placeholder="选择创建年份">              </el-date-picker>            </el-form-item>          </el-col>          <el-col :span="12">            <el-form-item label="项目年份" prop="projectYear">              <el-date-picker v-model="form.projectYear" style="width: 250px" value-format="yyyy" type="year"                placeholder="选择项目年份">              </el-date-picker>            </el-form-item>          </el-col>        </el-row>        <el-row>          <el-col :span="12">            <el-form-item label="负责人" prop="superiorName1">              <el-autocomplete v-model="superiorName1" style="width:250px" value-key="nickName"                :fetch-suggestions="getDatas1" :filter-multiple="true" clearable placeholder="请输入关键字"                @select="selectUser1" />            </el-form-item>          </el-col>        </el-row>        <el-row>          <el-col :span="12">            <el-form-item label="项目成员">              <el-autocomplete v-model="superiorName2" style="width:250px" value-key="nickName"                :fetch-suggestions="getDatas2" :filter-multiple="true" clearable placeholder="请输入关键字"                @select="selectUser2" />            </el-form-item>          </el-col>          <el-col :span="12">            <el-button type="primary" style="margin-left: 15px;" @click="addStaff">添加成员</el-button>          </el-col>        </el-row>        <el-row>          <el-col :span="24">            <el-form-item>              <el-tag v-for="tag in tags" :key="tag.name" style="margin-right:10px ;" closable                @close="deleteStaff(tag.id)">                {{ tag.name }}              </el-tag>            </el-form-item>          </el-col>        </el-row>        <el-row>          <el-col :span="24">            <el-form-item label="备注">              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>            </el-form-item>          </el-col>        </el-row>      </el-form>      <div slot="footer" class="dialog-footer">        <el-button type="primary" @click="submitForm">确 定</el-button>        <el-button @click="cancel">取 消</el-button>      </div>    </el-dialog>    <!-- 项目导入对话框 -->    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>        <i class="el-icon-upload"></i>        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>        <div class="el-upload__tip text-center" slot="tip">          <div class="el-upload__tip" slot="tip">            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据          </div>          <span>仅允许导入xls、xlsx格式文件。</span>          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"            @click="importTemplate">下载模板</el-link>        </div>      </el-upload>      <div slot="footer" class="dialog-footer">        <el-button type="primary" @click="submitFileForm">确 定</el-button>        <el-button @click="upload.open = false">取 消</el-button>      </div>    </el-dialog>  </div></template><script>import { listProject, addProject, updateProject, addStaff, listStaff, deleteStaff } from "@/api/system/project";import { selectName, } from "@/api/system/user";import { getToken } from "@/utils/auth";import Treeselect from "@riophae/vue-treeselect";import "@riophae/vue-treeselect/dist/vue-treeselect.css";export default {  name: "User",  dicts: ['sys_normal_disable', 'sys_user_sex'],  components: { Treeselect },  data() {    return {      superiorName: "",      superiorName1: "",      superiorId2: "",      superiorName2: "",      tags: [],      tagIds: [],      // 遮罩层      loading: true,      // 选中数组      ids: [],      // 非单个禁用      single: true,      // 非多个禁用      multiple: true,      // 显示搜索条件      showSearch: true,      // 总条数      total: 0,      // 用户表格数据      userList: null,      // 弹出层标题      title: "",      // 部门树选项      deptOptions: undefined,      // 是否显示弹出层      open: false,      // 部门名称      deptName: undefined,      // 默认密码      initPassword: undefined,      // 日期范围      dateRange: [],      dateRange1: [],      // 岗位选项      postOptions: [],      // 角色选项      roleOptions: [],      // 表单参数      form: {},      year: [{ label: "非跨年", value: 0 }, { label: "跨年", value: 1 }],      defaultProps: {        children: "children",        label: "label"      },      // 用户导入参数      upload: {        // 是否显示弹出层(用户导入)        open: false,        // 弹出层标题(用户导入)        title: "",        // 是否禁用上传        isUploading: false,        // 是否更新已经存在的用户数据        updateSupport: 0,        // 设置上传的请求头部        headers: { Authorization: "Bearer " + getToken() },        // 上传的地址        url: process.env.VUE_APP_BASE_API + "/api/project/importData"      },      // 查询参数      queryParams: {        pageNum: 1,        pageSize: 10,        projectNumber: undefined,        name: undefined,        staffId: undefined,        projectYear: undefined,        crossYear: 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 },        { key: 7, label: `累积工时`, visible: true },        { key: 8, label: `创建年份`, visible: true },        { key: 9, label: `起止时间`, visible: true },      ],      // 表单校验      rules: {        projectNumber: [          { required: true, message: "用户名称不能为空", trigger: "blur" },          { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }        ],        name: [          { required: true, message: "用户昵称不能为空", trigger: "blur" }        ],        password: [          { required: true, message: "用户密码不能为空", trigger: "blur" },          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }        ],        email: [          {            type: "email",            message: "请输入正确的邮箱地址",            trigger: ["blur", "change"]          }        ],        phonenumber: [          {            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,            message: "请输入正确的手机号码",            trigger: "blur"          }        ]      }    };  },  watch: {    // 根据名称筛选部门树    deptName(val) {      this.$refs.tree.filter(val);    }  },  created() {    this.getList();    // this.getDeptTree();    this.getConfigKey("sys.user.initPassword").then(response => {      this.initPassword = response.msg;    });  },  methods: {    // 根据查询关键词,获取匹配的下拉列表数据      getDatas(query, cb) {      selectName(query, 0).then(response => {        cb(response.data)      });    },    getDatas1(query, cb) {      selectName(query, 2).then(response => {        cb(response.data)      });    },    getDatas2(query, cb) {      selectName(query, 2).then(response => {        cb(response.data)      });    },    selectUser(item) {      this.queryParams.staffId = item.userId      this.superiorName = item.nickName    },    selectUser1(item) {      this.form.aid = item.userId      this.form.adminName = item.nickName    },    selectUser2(item) {      this.superiorId2 = item.userId      this.superiorName2 = item.nickName    },    /** 查询用户列表 */    getList() {      this.loading = true;      listProject(this.addDateRange(this.queryParams, this.dateRange)).then(response => {        this.userList = response.rows;        this.total = response.total;        this.loading = false;      }      );    },    /** 查询部门下拉树结构 */    getDeptTree() {      deptTreeSelect().then(response => {        this.deptOptions = response.data;      });    },    // 筛选节点    filterNode(value, data) {      if (!value) return true;      return data.label.indexOf(value) !== -1;    },    // 节点单击事件    handleNodeClick(data) {      this.queryParams.deptId = data.id;      this.handleQuery();    },    // 取消按钮    cancel() {      this.open = false;      this.reset();    },    // 表单重置    reset() {      this.form = {        aid: undefined,        adminName: undefined,        name: undefined,        projectStatus: 1,        projectNumber: undefined,        projectYear: undefined,        createYear: undefined,        crossYear: undefined,        remark: undefined,        startTime: undefined,        endTime: undefined,      };      this.superiorName1 = undefined;      this.superiorName2 = undefined;      this.dateRange1 = [];      this.tags = [];      this.resetForm("form");    },    /** 搜索按钮操作 */    handleQuery() {      this.queryParams.pageNum = 1;      this.getList();    },    /** 重置按钮操作 */    resetQuery() {      this.dateRange = [];      this.resetForm("queryForm");      this.queryParams.deptId = undefined;      this.superiorName = undefined      // this.$refs.tree.setCurrentKey(null);      this.handleQuery();    },    // 多选框选中数据    handleSelectionChange(selection) {      this.ids = selection.map(item => item.userId);      this.single = selection.length != 1;      this.multiple = !selection.length;    },    /** 新增按钮操作 */    handleAdd() {      this.reset();      this.open = true;      this.title = "新增项目";    },    /** 修改按钮操作 */    handleUpdate(row) {      this.reset();      this.listStaff(row.id)      this.open = true;      this.title = "修改项目";      this.form = {        id: row.id,        aid: row.aid,        adminName: row.adminName,        name: row.name,        projectStatus: row.projectStatus,        projectNumber: row.projectNumber,        projectYear: row.projectYear,        createYear: row.createYear,        crossYear: row.crossYear,        remark: row.remark,      };      this.dateRange1 = [row.startTime || "", row.endTime || ""]      this.superiorName1 = row.adminName;    },    /** 导出按钮操作 */    handleExport() {      this.download('api/project/export', {        ...this.queryParams      }, `project_${new Date().getTime()}.xlsx`)    },    /** 导入按钮操作 */    handleImport() {      this.upload.title = "项目导入";      this.upload.open = true;    },    /** 下载模板操作 */    importTemplate() {      this.download('api/project/importTemplate', {      }, `project_template_${new Date().getTime()}.xlsx`)    },    // 文件上传中处理    handleFileUploadProgress(event, file, fileList) {      this.upload.isUploading = true;    },    // 文件上传成功处理    handleFileSuccess(response, file, fileList) {      this.upload.open = false;      this.upload.isUploading = false;      this.$refs.upload.clearFiles();      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });      this.getList();    },    // 提交上传文件    submitFileForm() {      this.$refs.upload.submit();    },    /** 提交按钮 */    submitForm: function () {      this.$refs["form"].validate(valid => {        this.form.startTime = this.dateRange1[0];        this.form.endTime = this.dateRange1[1];        if (valid) {          if (this.form.id != undefined) {            updateProject(this.form).then(response => {              this.$modal.msgSuccess("修改成功");              this.open = false;              this.getList();            });          } else {            if (this.tags.length > 0) {              let result = this.tags.map(obj => obj.id);              this.form.staffObject = result.toString()            }            addProject(this.form).then(response => {              this.$modal.msgSuccess("新增成功");              this.open = false;              this.getList();            });          }        }      });    },    /** 项目成员列表 */    listStaff(id) {      let data = {        pid: id,      }      listStaff(data).then(response => {        this.tags = response.data      });    },    /** 添加项目成员 */    addStaff() {      let data = {        pid: this.form.id,        aid: this.superiorId2,        name: this.superiorName2,      }      if (!this.form.id) {        let result = this.tags.filter(obj => obj.aid === this.superiorId2);        if (result.length != 0) {          this.$modal.msgWarning("已经添加过该成员了~");          return        }      }      addStaff(data).then(response => {        if (response.code == 200) {          this.$modal.msgSuccess("添加成功");          if (this.form.id != undefined) {            this.listStaff(this.form.id)          } else {            let list = this.tags            list.push({ aid: response.data.aid, name: response.data.name, id: response.data.id })            this.tags = list          }          this.superiorId2 = undefined;          this.superiorName2 = undefined;        }      });    },    /** 删除项目成员 */    deleteStaff(id) {      if (!this.form.id) {        let list = this.tags        list.splice(list.indexOf(list.find(item => item.id === id)), 1)        this.tags = list      } else {        let data = {          id,        }        deleteStaff(data).then(response => {          if (response.code == 200) {            this.listStaff(this.form.id)            this.$modal.msgSuccess("移除项目成员成功~");          }        });      }    },  }};</script>
 |