Bläddra i källkod

支部成员管理 - 委员会、党员、申请人、积极分子名册

Wang Zi Wen 2 år sedan
förälder
incheckning
3132af2207

+ 624 - 0
ruoyi-ui/src/views/branch/dymc/index.vue

@@ -0,0 +1,624 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" size="small" v-show="showSearch" label-width="68px">
+
+      <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="['branch:member:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['branch:member:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['branch:member:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['branch:member:edit']"
+        >导入</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['branch:member:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="memberList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="姓名" align="center" prop="nickName"/>
+      <el-table-column label="性别" align="center" prop="sex" :formatter="sysUserSexFormat"/>
+      <el-table-column label="出生年月" align="center" prop="birthday">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="学历" align="center" prop="educationLevel" :formatter="educationLevelFormat"/>
+      <el-table-column label="参加工作时间" align="center" prop="workJoinTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.workJoinTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="入党时间" align="center" prop="partyEntryTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.partyEntryTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="联系方式" align="center" prop="phonenumber"/>
+      <el-table-column label="调进时间" align="center" prop="entryTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.entryTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="调出时间" align="center" prop="leaveTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.leaveTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['branch:member:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['branch:member:remove']"
+          >删除</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-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="绑定用户" prop="userId">
+              <el-select v-model="form.userId" placeholder="请选择绑定用户">
+                <el-option
+                  v-for="dict in userList"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="成员类型" prop="memberType">
+              <el-select v-model="form.memberType" placeholder="请选择成员类型">
+                <el-option
+                  v-for="dict in memberTypeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="出生年月" prop="birthday">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.birthday"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择出生年月">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="学历" prop="educationLevel">
+              <el-select v-model="form.educationLevel" placeholder="请选择学历">
+                <el-option
+                  v-for="dict in educationLevelOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="参加工作时间" prop="workJoinTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.workJoinTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择参加工作时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="入党时间" prop="partyEntryTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.partyEntryTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择入党时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="调进时间" prop="entryTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.entryTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择调进时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="调出时间" prop="leaveTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.leaveTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择调出时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="归属部门" prop="deptId">
+              <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+            </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" slot="tip">
+          <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+        </div>
+        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</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 { listMember, getMember, delMember, addMember, updateMember, exportMember, importTemplate} from "@/api/branch/member";
+  import { treeselect } from "@/api/system/dept";
+  import { getToken } from "@/utils/auth";
+  import Treeselect from "@riophae/vue-treeselect";
+  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+  import { listUser} from "@/api/system/user";
+
+  export default {
+    name: "Member",
+    components: { Treeselect },
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: true,
+        // 显示搜索条件
+        showSearch: false,
+        // 总条数
+        total: 0,
+        // 支部成员管理表格数据
+        memberList: [],
+        // 弹出层标题
+        title: "",
+        // 部门树选项
+        deptOptions: undefined,
+        clientHeight:300,
+        // 是否显示弹出层
+        open: false,
+        // 成员类型字典
+        memberTypeOptions: [],
+        // 学历字典
+        educationLevelOptions: [],
+        // 用户性别字典
+        sysUserSexOptions: [],
+        // 成员民族字典
+        memberEthnicOptions: [],
+        // 用户列表
+        userList: [],
+        // 用户导入参数
+        upload: {
+          // 是否显示弹出层(用户导入)
+          open: false,
+          // 弹出层标题(用户导入)
+          title: "",
+          // 是否禁用上传
+          isUploading: false,
+          // 是否更新已经存在的用户数据
+          updateSupport: 0,
+          // 设置上传的请求头部
+          headers: { Authorization: "Bearer " + getToken() },
+          // 上传的地址
+          url: process.env.VUE_APP_BASE_API + "/branch/member/importData"
+        },
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize: 20,
+          memberId: null,
+          userId: null,
+          memberType: null,
+          birthday: null,
+          educationLevel: null,
+          workJoinTime: null,
+          workEntryTime: null,
+          partyEntryTime: null,
+          currentPost: null,
+          labourDivision: null,
+          labourEntryTime: null,
+          labourLeaveTime: null,
+          entryTime: null,
+          leaveTime: null,
+          isLeague: null,
+          applyTime: null,
+          formCreateTime: null,
+          currentMentor: null,
+          planDevelopDuration: null,
+          isTrained: null,
+          remarks: null,
+          deptId: null,
+        },
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {
+          userId: [
+            { required: true, message: "绑定用户不能为空", trigger: "blur" }
+          ],
+        }
+      };
+    },
+    watch: {
+      // 根据名称筛选部门树
+      deptName(val) {
+        this.$refs.tree.filter(val);
+      }
+    },
+    created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+        this.clientHeight = document.body.clientHeight -250
+      })
+      this.getList();
+      this.getTreeselect();
+      this.getDicts("member_education_level").then(response => {
+        this.educationLevelOptions = response.data;
+      });
+      this.getDicts("member_type").then(response => {
+        this.memberTypeOptions = response.data;
+      });
+      this.getDicts("sys_user_sex").then(response => {
+        this.sysUserSexOptions = response.data;
+      });
+      this.getDicts("member_ethnic").then(response => {
+        this.memberEthnicOptions = response.data;
+      });
+      this.getUserList();
+    },
+    methods: {
+      /** 查询用户列表 */
+      getUserList() {
+        listUser().then(response => {
+          let rows = response.rows;
+          let userList = [];
+          for(let i = 0; i < rows.length; i++) {
+            if (rows[i].userName != "admin") {
+              let user = { "dictValue" : rows[i].userId, "dictLabel" : rows[i].nickName};
+              userList.push(user);
+            }
+          }
+          this.userList = userList;
+        });
+      },
+      /** 查询支部成员管理列表 */
+      getList() {
+        this.loading = true;
+        listMember(this.queryParams).then(response => {
+          let rows = response.rows;
+          let memberList = [];
+          for (let i = 0; i < rows.length; i++) {
+            if (rows[i].memberType == "2" || rows[i].memberType == "3") {//党员、党委
+              let posts = Array.from(rows[i].posts);//岗位
+              let roles = Array.from(rows[i].roles);//角色
+              let roleString = "";
+              let postString = "";
+              for (let j = 0; j < roles.length; j++) {
+                if (j > 0) {//多个角色拼接
+                  roleString += "\n兼" + roles[j].roleName;
+                } else {
+                  roleString += roles[j].roleName;
+                }
+              }
+              for (let j = 0; j < posts.length; j++) {
+                if (j > 0) {//多个岗位拼接
+                  postString += "\n兼" + posts[j].postName;
+                } else {
+                  postString += posts[j].postName;
+                }
+              }
+              rows.roleString = roleString;
+              rows.postString = postString;
+              memberList.push(rows[i]);
+            }
+          }
+          this.memberList = memberList;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      /** 查询部门下拉树结构 */
+      getTreeselect() {
+        treeselect().then(response => {
+          this.deptOptions = response.data;
+        });
+      },
+      // 学历字典翻译
+      educationLevelFormat(row, column) {
+        return this.selectDictLabel(this.educationLevelOptions, row.educationLevel);
+      },
+      // 成员类型字典翻译
+      memberTypeFormat(row, column) {
+        return this.selectDictLabel(this.memberTypeOptions, row.memberType);
+      },
+      // 用户性别字典翻译
+      sysUserSexFormat(row, column) {
+        return this.selectDictLabel(this.sysUserSexOptions, row.sex);
+      },
+      // 用户性别字典翻译
+      memberEthnicFormat(row, column) {
+        return this.selectDictLabel(this.memberEthnicOptions, row.ethnic);
+      },
+      // 用户列表字典翻译
+      userListFormat(row, column) {
+        return this.selectDictLabel(this.userList, row.userId);
+      },
+      // 现培养人字典翻译
+      currentMentorFormat(row, column) {
+        return this.selectDictLabel(this.userList, row.currentMentor);
+      },
+      // 取消按钮
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 表单重置
+      reset() {
+        this.form = {
+          memberId: null,
+          userId: null,
+          memberType: null,
+          birthday: null,
+          educationLevel: null,
+          workJoinTime: null,
+          workEntryTime: null,
+          partyEntryTime: null,
+          currentPost: null,
+          labourDivision: null,
+          labourEntryTime: null,
+          labourLeaveTime: null,
+          entryTime: null,
+          leaveTime: null,
+          isLeague: null,
+          applyTime: null,
+          formCreateTime: null,
+          currentMentor: null,
+          planDevelopDuration: null,
+          isTrained: null,
+          remarks: null,
+          delFlag: null,
+          createBy: null,
+          createTime: null,
+          updateBy: null,
+          updateTime: null,
+          deptId: null,
+        };
+        this.resetForm("form");
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 多选框选中数据
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.memberId)
+        this.single = selection.length!==1
+        this.multiple = !selection.length
+      },
+      /** 新增按钮操作 */
+      handleAdd() {
+        this.reset();
+        this.form.memberType = "2";
+        this.open = true;
+        this.title = "添加党员信息";
+      },
+      /** 修改按钮操作 */
+      handleUpdate(row) {
+        this.reset();
+        const memberId = row.memberId || this.ids
+        getMember(memberId).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "修改党员信息";
+        });
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.memberId != null) {
+              updateMember(this.form).then(response => {
+                this.$modal.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              });
+            } else {
+              console.log(this.form);
+              addMember(this.form).then(response => {
+                this.$modal.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              });
+            }
+          }
+        });
+      },
+      /** 删除按钮操作 */
+      handleDelete(row) {
+        const memberIds = row.memberId || this.ids;
+        this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delMember(memberIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+      },
+      /** 导出按钮操作 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('是否确认导出所有党员名册数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportMember(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+      },
+      /** 导入按钮操作 */
+      handleImport() {
+        this.upload.title = "导入";
+        this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+        importTemplate().then(response => {
+          this.download(response.msg);
+        });
+      },
+      // 文件上传中处理
+      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(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+        this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+        this.$refs.upload.submit();
+      }
+    }
+  };
+</script>
+
+<style>
+  /** 文本换行符处理 */
+  .el-table .cell{
+    white-space: pre-wrap;
+  }
+  /** textarea字体 */
+  textarea {
+    font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
+  }
+</style>

+ 697 - 0
ruoyi-ui/src/views/branch/sqrjjfzmc/index.vue

@@ -0,0 +1,697 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" size="small" v-show="showSearch" label-width="68px">
+
+      <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="['branch:member:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['branch:member:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['branch:member:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['branch:member:edit']"
+        >导入</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['branch:member:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="memberList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="姓名" align="center" prop="nickName"/>
+      <el-table-column label="性别" align="center" prop="sex" :formatter="sysUserSexFormat"/>
+      <el-table-column label="民族" align="center" prop="ethnic" :formatter="memberEthnicFormat" />
+      <el-table-column label="出生年月" align="center" prop="birthday">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="参加工作时间" align="center" prop="workJoinTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.workJoinTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="入职时间" align="center" prop="workEntryTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.workEntryTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="学历" align="center" prop="educationLevel" :formatter="educationLevelFormat"/>
+      <el-table-column label="是否团员" align="center" prop="isLeague">
+        <template slot-scope="scope">
+          <span>{{ scope.row.isLeague == "1" ? "是" : "否" }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="现岗位" align="center" prop="postString"/>
+      <el-table-column label="申请入党时间" align="center" prop="applyTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.applyTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="建表考察时间" align="center" prop="formCreateTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.formCreateTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="现培养人" align="center" prop="currentMentor" :formatter="currentMentorFormat" />
+      <el-table-column label="计划发展时间" align="center" prop="planDevelopDuration">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.planDevelopDuration, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="是否参加过入党前培训" align="center" prop="isTrained">
+        <template slot-scope="scope">
+          <span>{{ scope.row.isTrained == "1" ? "是" : "否" }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks"/>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['branch:member:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['branch:member:remove']"
+          >删除</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-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="绑定用户" prop="userId">
+              <el-select v-model="form.userId" placeholder="请选择绑定用户">
+                <el-option
+                  v-for="dict in userList"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="成员类型" prop="memberType">
+              <el-select v-model="form.memberType" placeholder="请选择成员类型">
+                <el-option
+                  v-for="dict in memberTypeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="民族" prop="ethnic">
+              <el-select v-model="form.ethnic" placeholder="请选择民族">
+                <el-option
+                  v-for="dict in memberEthnicOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="出生年月" prop="birthday">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.birthday"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择出生年月">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="参加工作时间" prop="workJoinTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.workJoinTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择参加工作时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="入职时间" prop="workEntryTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.workEntryTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择入职时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="学历" prop="educationLevel">
+              <el-select v-model="form.educationLevel" placeholder="请选择学历">
+                <el-option
+                  v-for="dict in educationLevelOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否团员">
+              <el-radio-group v-model="form.isLeague">
+                <el-radio key="1" label="1">是</el-radio>
+                <el-radio key="0" label="0">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="申请入党时间" prop="applyTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.applyTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择申请入党时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="建表考察时间" prop="formCreateTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.formCreateTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择建表考察时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="现培养人" prop="currentMentor">
+              <el-select v-model="form.currentMentor" placeholder="请选择现培养人">
+                <el-option
+                  v-for="dict in userList"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="计划发展时间" prop="planDevelopDuration">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.planDevelopDuration"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择计划发展时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否参加过入党前培训">
+              <el-radio-group v-model="form.isTrained">
+                <el-radio key="1" label="1">是</el-radio>
+                <el-radio key="0" label="0">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="备注" prop="remarks">
+              <el-input v-model="form.remarks" placeholder="请输入备注" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="归属部门" prop="deptId">
+              <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+            </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" slot="tip">
+          <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+        </div>
+        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</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 { listMember, getMember, delMember, addMember, updateMember, exportMember, importTemplate} from "@/api/branch/member";
+  import { treeselect } from "@/api/system/dept";
+  import { getToken } from "@/utils/auth";
+  import Treeselect from "@riophae/vue-treeselect";
+  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+  import { listUser} from "@/api/system/user";
+
+  export default {
+    name: "Member",
+    components: { Treeselect },
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: true,
+        // 显示搜索条件
+        showSearch: false,
+        // 总条数
+        total: 0,
+        // 支部成员管理表格数据
+        memberList: [],
+        // 弹出层标题
+        title: "",
+        // 部门树选项
+        deptOptions: undefined,
+        clientHeight:300,
+        // 是否显示弹出层
+        open: false,
+        // 成员类型字典
+        memberTypeOptions: [],
+        // 学历字典
+        educationLevelOptions: [],
+        // 用户性别字典
+        sysUserSexOptions: [],
+        // 成员民族字典
+        memberEthnicOptions: [],
+        // 用户列表
+        userList: [],
+        // 用户导入参数
+        upload: {
+          // 是否显示弹出层(用户导入)
+          open: false,
+          // 弹出层标题(用户导入)
+          title: "",
+          // 是否禁用上传
+          isUploading: false,
+          // 是否更新已经存在的用户数据
+          updateSupport: 0,
+          // 设置上传的请求头部
+          headers: { Authorization: "Bearer " + getToken() },
+          // 上传的地址
+          url: process.env.VUE_APP_BASE_API + "/branch/member/importData"
+        },
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize: 20,
+          memberId: null,
+          userId: null,
+          memberType: null,
+          birthday: null,
+          educationLevel: null,
+          workJoinTime: null,
+          workEntryTime: null,
+          partyEntryTime: null,
+          currentPost: null,
+          labourDivision: null,
+          labourEntryTime: null,
+          labourLeaveTime: null,
+          entryTime: null,
+          leaveTime: null,
+          isLeague: null,
+          applyTime: null,
+          formCreateTime: null,
+          currentMentor: null,
+          planDevelopDuration: null,
+          isTrained: null,
+          remarks: null,
+          deptId: null,
+        },
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {
+          userId: [
+            { required: true, message: "绑定用户不能为空", trigger: "blur" }
+          ],
+        }
+      };
+    },
+    watch: {
+      // 根据名称筛选部门树
+      deptName(val) {
+        this.$refs.tree.filter(val);
+      }
+    },
+    created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+        this.clientHeight = document.body.clientHeight -250
+      })
+      this.getList();
+      this.getTreeselect();
+      this.getDicts("member_education_level").then(response => {
+        this.educationLevelOptions = response.data;
+      });
+      this.getDicts("member_type").then(response => {
+        this.memberTypeOptions = response.data;
+      });
+      this.getDicts("sys_user_sex").then(response => {
+        this.sysUserSexOptions = response.data;
+      });
+      this.getDicts("member_ethnic").then(response => {
+        this.memberEthnicOptions = response.data;
+      });
+      this.getUserList();
+    },
+    methods: {
+      /** 查询用户列表 */
+      getUserList() {
+        listUser().then(response => {
+          let rows = response.rows;
+          let userList = [];
+          for(let i = 0; i < rows.length; i++) {
+            if (rows[i].userName != "admin") {
+              let user = { "dictValue" : rows[i].userId, "dictLabel" : rows[i].nickName};
+              userList.push(user);
+            }
+          }
+          this.userList = userList;
+        });
+      },
+      /** 查询支部成员管理列表 */
+      getList() {
+        this.loading = true;
+        listMember(this.queryParams).then(response => {
+          let rows = response.rows;
+          let memberList = [];
+          for (let i = 0; i < rows.length; i++) {
+            if (rows[i].memberType == "1") {//申请人、积极分子
+              let posts = Array.from(rows[i].posts);//岗位
+              let roles = Array.from(rows[i].roles);//角色
+              let roleString = "";
+              let postString = "";
+              for (let j = 0; j < roles.length; j++) {
+                if (j > 0) {//多个角色拼接
+                  roleString += "\n兼" + roles[j].roleName;
+                } else {
+                  roleString += roles[j].roleName;
+                }
+              }
+              for (let j = 0; j < posts.length; j++) {
+                if (j > 0) {//多个岗位拼接
+                  postString += "\n兼" + posts[j].postName;
+                } else {
+                  postString += posts[j].postName;
+                }
+              }
+              rows.roleString = roleString;
+              rows.postString = postString;
+              memberList.push(rows[i]);
+            }
+          }
+          this.memberList = memberList;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      /** 查询部门下拉树结构 */
+      getTreeselect() {
+        treeselect().then(response => {
+          this.deptOptions = response.data;
+        });
+      },
+      // 学历字典翻译
+      educationLevelFormat(row, column) {
+        return this.selectDictLabel(this.educationLevelOptions, row.educationLevel);
+      },
+      // 成员类型字典翻译
+      memberTypeFormat(row, column) {
+        return this.selectDictLabel(this.memberTypeOptions, row.memberType);
+      },
+      // 用户性别字典翻译
+      sysUserSexFormat(row, column) {
+        return this.selectDictLabel(this.sysUserSexOptions, row.sex);
+      },
+      // 用户性别字典翻译
+      memberEthnicFormat(row, column) {
+        return this.selectDictLabel(this.memberEthnicOptions, row.ethnic);
+      },
+      // 用户列表字典翻译
+      userListFormat(row, column) {
+        return this.selectDictLabel(this.userList, row.userId);
+      },
+      // 现培养人字典翻译
+      currentMentorFormat(row, column) {
+        return this.selectDictLabel(this.userList, row.currentMentor);
+      },
+      // 取消按钮
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 表单重置
+      reset() {
+        this.form = {
+          memberId: null,
+          userId: null,
+          memberType: null,
+          birthday: null,
+          educationLevel: null,
+          workJoinTime: null,
+          workEntryTime: null,
+          partyEntryTime: null,
+          currentPost: null,
+          labourDivision: null,
+          labourEntryTime: null,
+          labourLeaveTime: null,
+          entryTime: null,
+          leaveTime: null,
+          isLeague: null,
+          applyTime: null,
+          formCreateTime: null,
+          currentMentor: null,
+          planDevelopDuration: null,
+          isTrained: null,
+          remarks: null,
+          delFlag: null,
+          createBy: null,
+          createTime: null,
+          updateBy: null,
+          updateTime: null,
+          deptId: null,
+        };
+        this.resetForm("form");
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 多选框选中数据
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.memberId)
+        this.single = selection.length!==1
+        this.multiple = !selection.length
+      },
+      /** 新增按钮操作 */
+      handleAdd() {
+        this.reset();
+        this.form.memberType = "1";
+        this.open = true;
+        this.title = "添加申请人、积极分子信息";
+      },
+      /** 修改按钮操作 */
+      handleUpdate(row) {
+        this.reset();
+        const memberId = row.memberId || this.ids
+        getMember(memberId).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "修改申请人、积极分子信息";
+        });
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.memberId != null) {
+              updateMember(this.form).then(response => {
+                this.$modal.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              });
+            } else {
+              console.log(this.form);
+              addMember(this.form).then(response => {
+                this.$modal.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              });
+            }
+          }
+        });
+      },
+      /** 删除按钮操作 */
+      handleDelete(row) {
+        const memberIds = row.memberId || this.ids;
+        this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delMember(memberIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+      },
+      /** 导出按钮操作 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('是否确认导出所有申请人、积极分子名册数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportMember(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+      },
+      /** 导入按钮操作 */
+      handleImport() {
+        this.upload.title = "导入";
+        this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+        importTemplate().then(response => {
+          this.download(response.msg);
+        });
+      },
+      // 文件上传中处理
+      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(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+        this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+        this.$refs.upload.submit();
+      }
+    }
+  };
+</script>
+
+<style>
+  /** 文本换行符处理 */
+  .el-table .cell{
+    white-space: pre-wrap;
+  }
+  /** textarea字体 */
+  textarea {
+    font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
+  }
+</style>

+ 629 - 0
ruoyi-ui/src/views/branch/wyhmc/index.vue

@@ -0,0 +1,629 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" size="small" v-show="showSearch" label-width="68px">
+
+      <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="['branch:member:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['branch:member:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['branch:member:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['branch:member:edit']"
+        >导入</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['branch:member:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="memberList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="姓名" align="center" prop="nickName"/>
+      <el-table-column label="性别" align="center" prop="sex" :formatter="sysUserSexFormat"/>
+      <el-table-column label="出生年月" align="center" prop="birthday">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="学历" align="center" prop="educationLevel" :formatter="educationLevelFormat"/>
+      <el-table-column label="入职时间" align="center" prop="workEntryTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.workEntryTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="现岗位" align="center" prop="postString"/>
+      <el-table-column label="入党时间" align="center" prop="partyEntryTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.partyEntryTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="委员分工" align="center" prop="roleString"/>
+      <el-table-column label="任职时间" align="center" prop="labourEntryTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.labourEntryTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="离任时间" align="center" prop="labourLeaveTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.labourLeaveTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['branch:member:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['branch:member:remove']"
+          >删除</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-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="绑定用户" prop="userId">
+              <el-select v-model="form.userId" placeholder="请选择绑定用户">
+                <el-option
+                  v-for="dict in userList"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="成员类型" prop="memberType">
+              <el-select v-model="form.memberType" placeholder="请选择成员类型">
+                <el-option
+                  v-for="dict in memberTypeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="出生年月" prop="birthday">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.birthday"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择出生年月">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="学历" prop="educationLevel">
+              <el-select v-model="form.educationLevel" placeholder="请选择学历">
+                <el-option
+                  v-for="dict in educationLevelOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="入职时间" prop="workEntryTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.workEntryTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择入职时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="入党时间" prop="partyEntryTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.partyEntryTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择入党时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="任职时间" prop="labourEntryTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.labourEntryTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择任职时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="离任时间" prop="labourLeaveTime">
+              <el-date-picker clearable size="small" style="width: 200px"
+                              v-model="form.labourLeaveTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="选择离任时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="归属部门" prop="deptId">
+              <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+            </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" slot="tip">
+          <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+        </div>
+        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</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 { listMember, getMember, delMember, addMember, updateMember, exportMember, importTemplate} from "@/api/branch/member";
+  import { treeselect } from "@/api/system/dept";
+  import { getToken } from "@/utils/auth";
+  import Treeselect from "@riophae/vue-treeselect";
+  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+  import { listUser} from "@/api/system/user";
+
+  export default {
+    name: "Member",
+    components: { Treeselect },
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: true,
+        // 显示搜索条件
+        showSearch: false,
+        // 总条数
+        total: 0,
+        // 支部成员管理表格数据
+        memberList: [],
+        // 弹出层标题
+        title: "",
+        // 部门树选项
+        deptOptions: undefined,
+        clientHeight:300,
+        // 是否显示弹出层
+        open: false,
+        // 成员类型字典
+        memberTypeOptions: [],
+        // 学历字典
+        educationLevelOptions: [],
+        // 用户性别字典
+        sysUserSexOptions: [],
+        // 成员民族字典
+        memberEthnicOptions: [],
+        // 用户列表
+        userList: [],
+        // 用户导入参数
+        upload: {
+          // 是否显示弹出层(用户导入)
+          open: false,
+          // 弹出层标题(用户导入)
+          title: "",
+          // 是否禁用上传
+          isUploading: false,
+          // 是否更新已经存在的用户数据
+          updateSupport: 0,
+          // 设置上传的请求头部
+          headers: { Authorization: "Bearer " + getToken() },
+          // 上传的地址
+          url: process.env.VUE_APP_BASE_API + "/branch/member/importData"
+        },
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize: 20,
+          memberId: null,
+          userId: null,
+          memberType: null,
+          birthday: null,
+          educationLevel: null,
+          workJoinTime: null,
+          workEntryTime: null,
+          partyEntryTime: null,
+          currentPost: null,
+          labourDivision: null,
+          labourEntryTime: null,
+          labourLeaveTime: null,
+          entryTime: null,
+          leaveTime: null,
+          isLeague: null,
+          applyTime: null,
+          formCreateTime: null,
+          currentMentor: null,
+          planDevelopDuration: null,
+          isTrained: null,
+          remarks: null,
+          deptId: null,
+        },
+        // 表单参数
+        form: {
+        },
+        // 表单校验
+        rules: {
+          userId: [
+            { required: true, message: "绑定用户不能为空", trigger: "blur" }
+          ],
+          memberType: [
+            { required: true, message: "成员类型不能为空", trigger: "blur" }
+          ],
+        }
+      };
+    },
+    watch: {
+      // 根据名称筛选部门树
+      deptName(val) {
+        this.$refs.tree.filter(val);
+      }
+    },
+    created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+        this.clientHeight = document.body.clientHeight -250
+      })
+      this.getList();
+      this.getTreeselect();
+      this.getDicts("member_education_level").then(response => {
+        this.educationLevelOptions = response.data;
+      });
+      this.getDicts("member_type").then(response => {
+        this.memberTypeOptions = response.data;
+      });
+      this.getDicts("sys_user_sex").then(response => {
+        this.sysUserSexOptions = response.data;
+      });
+      this.getDicts("member_ethnic").then(response => {
+        this.memberEthnicOptions = response.data;
+      });
+      this.getUserList();
+    },
+    methods: {
+      /** 查询用户列表 */
+      getUserList() {
+        listUser().then(response => {
+          let rows = response.rows;
+          let userList = [];
+          for(let i = 0; i < rows.length; i++) {
+            if (rows[i].userName != "admin") {
+              let user = { "dictValue" : rows[i].userId, "dictLabel" : rows[i].nickName};
+              userList.push(user);
+            }
+          }
+          this.userList = userList;
+        });
+      },
+      /** 查询支部成员管理列表 */
+      getList() {
+        this.loading = true;
+        listMember(this.queryParams).then(response => {
+          let rows = response.rows;
+          let memberList = [];
+          for (let i = 0; i < rows.length; i++) {
+            if (rows[i].memberType == "3") {//党委
+              let posts = Array.from(rows[i].posts);//岗位
+              let roles = Array.from(rows[i].roles);//角色
+              let roleString = "";
+              let postString = "";
+              for (let j = 0; j < roles.length; j++) {
+                if (j > 0) {//多个角色拼接
+                  roleString += "\n兼" + roles[j].roleName;
+                } else {
+                  roleString += roles[j].roleName;
+                }
+              }
+              for (let j = 0; j < posts.length; j++) {
+                if (j > 0) {//多个岗位拼接
+                  postString += "\n兼" + posts[j].postName;
+                } else {
+                  postString += posts[j].postName;
+                }
+              }
+              rows.roleString = roleString;
+              rows.postString = postString;
+              memberList.push(rows[i]);
+            }
+          }
+          this.memberList = memberList;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      /** 查询部门下拉树结构 */
+      getTreeselect() {
+        treeselect().then(response => {
+          this.deptOptions = response.data;
+        });
+      },
+      // 学历字典翻译
+      educationLevelFormat(row, column) {
+        return this.selectDictLabel(this.educationLevelOptions, row.educationLevel);
+      },
+      // 成员类型字典翻译
+      memberTypeFormat(row, column) {
+        return this.selectDictLabel(this.memberTypeOptions, row.memberType);
+      },
+      // 用户性别字典翻译
+      sysUserSexFormat(row, column) {
+        return this.selectDictLabel(this.sysUserSexOptions, row.sex);
+      },
+      // 用户性别字典翻译
+      memberEthnicFormat(row, column) {
+        return this.selectDictLabel(this.memberEthnicOptions, row.ethnic);
+      },
+      // 用户列表字典翻译
+      userListFormat(row, column) {
+        return this.selectDictLabel(this.userList, row.userId);
+      },
+      // 现培养人字典翻译
+      currentMentorFormat(row, column) {
+        return this.selectDictLabel(this.userList, row.currentMentor);
+      },
+      // 取消按钮
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 表单重置
+      reset() {
+        this.form = {
+          memberId: null,
+          userId: null,
+          memberType: null,
+          birthday: null,
+          educationLevel: null,
+          workJoinTime: null,
+          workEntryTime: null,
+          partyEntryTime: null,
+          currentPost: null,
+          labourDivision: null,
+          labourEntryTime: null,
+          labourLeaveTime: null,
+          entryTime: null,
+          leaveTime: null,
+          isLeague: null,
+          applyTime: null,
+          formCreateTime: null,
+          currentMentor: null,
+          planDevelopDuration: null,
+          isTrained: null,
+          remarks: null,
+          delFlag: null,
+          createBy: null,
+          createTime: null,
+          updateBy: null,
+          updateTime: null,
+          deptId: null,
+        };
+        this.resetForm("form");
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 多选框选中数据
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.memberId)
+        this.single = selection.length!==1
+        this.multiple = !selection.length
+      },
+      /** 新增按钮操作 */
+      handleAdd() {
+        this.reset();
+        this.form.memberType = "3";
+        this.open = true;
+        this.title = "添加委员信息";
+      },
+      /** 修改按钮操作 */
+      handleUpdate(row) {
+        this.reset();
+        const memberId = row.memberId || this.ids
+        getMember(memberId).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "修改委员信息";
+        });
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.memberId != null) {
+              updateMember(this.form).then(response => {
+                this.$modal.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              });
+            } else {
+              console.log(this.form);
+              addMember(this.form).then(response => {
+                this.$modal.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              });
+            }
+          }
+        });
+      },
+      /** 删除按钮操作 */
+      handleDelete(row) {
+        const memberIds = row.memberId || this.ids;
+        this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delMember(memberIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+      },
+      /** 导出按钮操作 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('是否确认导出所有委员会名册数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportMember(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+      },
+      /** 导入按钮操作 */
+      handleImport() {
+        this.upload.title = "导入";
+        this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+        importTemplate().then(response => {
+          this.download(response.msg);
+        });
+      },
+      // 文件上传中处理
+      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(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+        this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+        this.$refs.upload.submit();
+      }
+    }
+  };
+</script>
+
+<style>
+  /** 文本换行符处理 */
+  .el-table .cell{
+    white-space: pre-wrap;
+  }
+  /** textarea字体 */
+  textarea {
+    font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
+  }
+</style>