<template>
  <div>
    <section class="content" style="margin-top: -10px;">
      <div class="box box-info">
        <!-- 头信息 -->
        <div
          class="box-header with-border"
          style="background-color:#D3DCE6;margin-bottom:20px;"
        >
          <h3 class="box-title">学生管理</h3>
          <div class="box-tools pull-right">
            <button
              type="button"
              class="btn btn-box-tool"
              data-widget="collapse"
            >
              <i class="fa fa-minus"></i>
            </button>
          </div>
        </div>

        <!-- 正文信息 -->
        <div class="box-body">
          <el-form
            :inline="true"
            :model="formSearch"
            label-position="right"
            label-width="80px"
          >
            <el-form-item
              v-if="isSuperAdmin"
              label="顶级机构"
              class="pull-left"
            >
              <el-select
                style="width: 180px"
                class="input_width_lg"
                v-model="formSearch.rootOrgId"
                placeholder="请选择"
              >
                <el-option
                  v-for="item in rootOrgList"
                  :label="item.name"
                  :value="item.id"
                  :key="item.id"
                >
                </el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="姓名" class="pull-left">
              <el-input
                placeholder="请输入姓名"
                v-model="formSearch.name"
              ></el-input>
            </el-form-item>
            <el-form-item label="学号" class="pull-left">
              <el-input
                placeholder="请输入学号"
                v-model="formSearch.studentCode"
              ></el-input>
            </el-form-item>
            <el-form-item label="身份证" class="pull-left">
              <el-input
                placeholder="请输入身份证"
                v-model="formSearch.identityNumber"
              ></el-input>
            </el-form-item>
            <el-form-item class="pull-right buttonframe">
              <el-button
                v-if="rolePrivileges.search_student"
                size="small"
                type="primary"
                icon="search"
                @click="searchForm"
                >查询
              </el-button>
              <el-button
                v-if="rolePrivileges.upload_student_photo"
                size="small"
                type="info"
                @click="uploadPhoto"
                >上传照片
              </el-button>
              <el-button
                v-if="rolePrivileges.reset_student_password"
                size="small"
                type="warning"
                @click="resetPassword('');"
                >重置密码
              </el-button>
              <el-button
                v-if="rolePrivileges.change_student_availability"
                size="small"
                type="success"
                @click="enableStudent('');"
                >启用
              </el-button>
              <el-button
                v-if="rolePrivileges.change_student_availability"
                size="small"
                type="danger"
                @click="disableStudent('');"
                >禁用
              </el-button>
            </el-form-item>
          </el-form>

          <!-- 页面列表 -->
          <el-table
            :data="tableData"
            border
            style="width: 100%;text-align:center;"
            @selection-change="selectChange"
          >
            <el-table-column type="selection" width="50"></el-table-column>
            <el-table-column prop="id" width="100" label="ID"></el-table-column>
            <el-table-column label="考生" width="100">
              <template slot-scope="scope">
                <el-popover trigger="hover" placement="left">
                  <div style="font-size: 18px;font-family: 新宋体">
                    <tr>
                      <td style="color: green">姓名</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.name }}
                      </td>
                    </tr>
                    <tr>
                      <td style="color: green">身份证号</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.identityNumber }}
                      </td>
                    </tr>
                    <tr>
                      <td style="color: green">学号</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.studentCode }}
                      </td>
                    </tr>
                    <tr>
                      <td style="color: green">学习中心</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.orgName }}
                      </td>
                    </tr>
                    <tr>
                      <td style="color: green">手机号</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.phoneNumber }}
                      </td>
                    </tr>
                    <tr>
                      <td style="color: green">安全手机号</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.securityPhone }}
                      </td>
                    </tr>
                    <tr>
                      <td style="color: green">创建时间</td>
                      <td style="color:purple;padding-left: 20px;">
                        {{ scope.row.creationTime }}
                      </td>
                    </tr>
                  </div>

                  <div slot="reference" class="name-wrapper">
                    <span>{{ scope.row.name }}</span>
                  </div>
                </el-popover>
              </template>
            </el-table-column>
            <el-table-column
              prop="studentCode"
              width=""
              label="学号"
            ></el-table-column>
            <el-table-column
              prop="identityNumber"
              width=""
              label="身份证"
            ></el-table-column>
            <el-table-column
              prop="updateTime"
              width="168"
              label="更新时间"
            ></el-table-column>
            <el-table-column width="100" label="状态">
              <template slot-scope="scope">
                <div>
                  <span>
                    <el-tag :type="getTag(scope.row.enable)">
                      {{ getEnable(scope.row.enable) }}
                    </el-tag>
                  </span>
                </div>
              </template>
            </el-table-column>
            <el-table-column label="操作" width="450">
              <template slot-scope="scope">
                <div>
                  <el-button
                    size="mini"
                    type="warning"
                    @click="showPhoto(scope.row);"
                    >查看照片
                  </el-button>
                  <el-button
                    size="mini"
                    type="warning"
                    @click="showStuExamDialog(scope.row);"
                    >考试记录
                  </el-button>
                  <el-button
                    v-if="rolePrivileges.reset_student_password"
                    size="mini"
                    type="warning"
                    @click="resetPassword(scope.row);"
                    >重置密码
                  </el-button>
                  <el-button
                    v-if="
                      null != scope.row.enable &&
                        !scope.row.enable &&
                        rolePrivileges.change_student_availability
                    "
                    size="mini"
                    type="success"
                    @click="enableStudent(scope.row);"
                    >启用
                  </el-button>
                  <el-button
                    v-else-if="rolePrivileges.change_student_availability"
                    size="mini"
                    type="danger"
                    @click="disableStudent(scope.row);"
                    >禁用
                  </el-button>
                  <el-button
                    v-if="rolePrivileges.unbind_student_code"
                    size="mini"
                    type="warning"
                    @click="unbindStudentCode(scope.row);"
                    >解绑学号
                  </el-button>
                  <el-button
                    v-if="rolePrivileges.unbind_security_phone"
                    size="mini"
                    type="warning"
                    @click="unbindSecurityPhone(scope.row);"
                    >解绑安全手机
                  </el-button>
                </div>
              </template>
            </el-table-column>
          </el-table>
          <div class="page pull-right">
            <el-pagination
              @current-change="handleCurrentChange"
              :current-page="currentPage"
              :page-size="pageSize"
              layout="total, prev, pager, next, jumper"
              :total="total"
            >
            </el-pagination>
          </div>

          <!-- 考试记录 -->
          <el-dialog
            title="学生考试记录"
            size="small"
            v-model="stuExamDialog"
            v-loading="stuExamLoading"
            element-loading-text="拼命加载中"
          >
            <el-form
              :inline="true"
              :model="stuExamSearch"
              label-position="right"
              label-width="100px"
            >
              <el-form-item label="考试" class="pull-left">
                <el-select
                  class="input"
                  :remote-method="queryExams4Search"
                  remote
                  :loading="queryExams4SearchLoading"
                  filterable
                  clearable
                  v-model="stuExamSearch.examId"
                  placeholder="请选择"
                >
                  <el-option
                    v-for="item in examList4Search"
                    :label="item.name"
                    :value="item.id"
                    :key="item.id"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
              <el-form-item class="pull-left">
                <el-button
                  size="small"
                  type="primary"
                  icon="search"
                  @click="searchStuExam"
                  >查询
                </el-button>
              </el-form-item>
            </el-form>

            <el-table
              :data="stuExamList"
              border
              style="width: 100%;text-align:center;"
            >
              <el-table-column inline-template label="学生姓名">
                <div>
                  <span>{{ row.studentName }}</span>
                </div>
              </el-table-column>
              <el-table-column inline-template label="学号">
                <div>
                  <span>{{ row.studentCode }}</span>
                </div>
              </el-table-column>
              <el-table-column inline-template label="身份证">
                <div>
                  <span>{{ row.identityNumber }}</span>
                </div>
              </el-table-column>
              <el-table-column inline-template label="考试">
                <div>
                  <span>{{ row.examName }}</span>
                </div>
              </el-table-column>
              <el-table-column inline-template label="课程">
                <div>
                  <span>{{ row.courseName }}</span>
                </div>
              </el-table-column>
              <el-table-column inline-template width="100" label="考试状态">
                <div>
                  <span v-if="null == row.started"></span>
                  <span v-else-if="row.started">已考</span>
                  <span v-else>未考</span>
                </div>
              </el-table-column>
            </el-table>
            <div class="page pull-right">
              <el-pagination
                @current-change="stuExamCurChange"
                :current-page="stuExamCurPage"
                :page-size="stuExamPageSize"
                layout="total, prev, pager, next, jumper"
                :total="stuExamTotal"
              >
              </el-pagination>
            </div>
          </el-dialog>

          <!-- 导入弹窗 -->
          <el-dialog
            title="学生照片导入页"
            size="tiny"
            :visible.sync="photoUploadDialog"
          >
            <el-form>
              <el-row>
                <el-form-item style="margin-left:30px">
                  <el-upload
                    class="form_left"
                    ref="upload"
                    list-type="picture"
                    :action="uploadAction"
                    :headers="uploadHeaders"
                    :data="uploadData"
                    :before-upload="beforeUpload"
                    :on-progress="uploadProgress"
                    :on-success="uploadSuccess"
                    :on-error="uploadError"
                    :file-list="fileList"
                    :auto-upload="false"
                    :multiple="false"
                  >
                    <el-button size="small" slot="trigger" type="primary"
                      >选择文件
                    </el-button>
                    <el-button
                      size="small"
                      style="margin-left:10px;"
                      type="success"
                      @click="submitUpload"
                      >确认上传
                    </el-button>
                    <div slot="tip" class="el-upload__tip">
                      只能上传jpg,png文件
                    </div>
                  </el-upload>
                </el-form-item>
              </el-row>
            </el-form>
          </el-dialog>

          <el-dialog
            @close="closePhotoDialog"
            title="照片"
            v-model="photoDialog"
          >
            <div class="student_photo">
              <img :src="photo.url" alt="学生照片" height="20%" width="30%" />
            </div>
          </el-dialog>
        </div>
      </div>
    </section>
  </div>
</template>

<script>
import { CORE_API, EXAM_WORK_API, OUTLET_API } from "@/constants/constants.js";
import { mapState } from "vuex";

export default {
  data() {
    return {
      rolePrivileges: {
        search_student: false,
        upload_student_photo: false,
        reset_student_password: false,
        change_student_availability: false,
        unbind_student_code: false,
        unbind_security_phone: false
      },
      isSuperAdmin: false,
      rootOrgList: null,
      stuExamLoading: false,
      button: {},
      formSearch: {
        rootOrgId: null,
        name: "",
        studentCode: "",
        identityNumber: "",
        enable: ""
      },
      selectedStuIds: [],
      statusList: [
        {
          value: true,
          label: "启用"
        },
        {
          value: false,
          label: "禁用"
        }
      ],

      tableData: [],
      currentPage: 1,
      pageSize: 10,
      total: 10,
      photoDialog: false,
      photo: { url: "" },

      errMessages: [],
      uploadAction: OUTLET_API + "/facepp/add",
      uploadData: {},
      fileLoading: false,
      fileList: [],
      uploadHeaders: {},
      photoUploadDialog: false,

      stuExamCurPage: 1,
      stuExamPageSize: 10,
      stuExamTotal: 10,
      stuExamDialog: false,
      stuExamList: [],
      examList4Search: [],
      queryExams4SearchLoading: false,
      stuExamSearch: {
        rootOrgId: null,
        examId: "",
        studentCode: "",
        studentName: "",
        orgId: null,
        specialtyName: "",
        courseCode: "",
        courseName: "",
        infoCollector: "",
        identityNumber: "",
        identityNumberLike: false,
        withStarted: true
      }
    };
  },
  computed: {
    ...mapState({ user: state => state.user }),
    stuIds() {
      var stuIds = "";
      for (let stuId of this.selectedStuIds) {
        if (!stuIds) {
          stuIds += stuId;
        } else {
          stuIds += "," + stuId;
        }
      }
      return stuIds;
    }
  },
  methods: {
    queryExams4Search(name) {
      this.queryExams(name, "search");
    },
    queryExams(name, where) {
      console.log("queryExams; name: " + name);
      if ("search" == where) {
        this.queryExams4SearchLoading = true;
      }
      this.$http
        .get(EXAM_WORK_API + "/exam/queryByNameLike?name=" + name)
        .then(response => {
          if ("search" == where) {
            this.queryExams4SearchLoading = false;
            this.examList4Search = response.body;
          }
        })
        .catch(response => {
          if (response.status == 500) {
            this.$notify({
              showClose: true,
              message: response.body.desc,
              type: "error"
            });
          }
          if ("search" == where) {
            this.queryExams4SearchLoading = false;
          }
        });
    },
    closeStuExamDialog() {
      this.stuExamDialog = false;
    },
    showStuExamDialog(row) {
      this.stuExamSearch.identityNumber = row.identityNumber;
      this.stuExamList = [];
      this.stuExamTotal = 0;
      this.searchStuExam();
      this.stuExamDialog = true;
    },
    searchStuExam() {
      var param = new URLSearchParams(this.stuExamSearch);
      this.stuExamLoading = true;
      var url =
        EXAM_WORK_API +
        "/exam_student/examStudentPage/" +
        (this.stuExamCurPage - 1) +
        "/" +
        this.stuExamPageSize +
        "?" +
        param;
      this.$http
        .get(url)
        .then(response => {
          this.stuExamList = response.body.list;
          this.stuExamTotal = response.body.total;
          this.stuExamLoading = false;
        })
        .catch(function(response) {
          if (response.status == 500) {
            this.$notify({
              showClose: true,
              message: response.body.desc,
              type: "error"
            });
          }

          this.stuExamLoading = false;
        });
    },
    stuExamCurChange(val) {
      this.stuExamCurPage = val;
      this.stuExamSearch.page = val - 1;
      this.searchStuExam();
    },
    closePhotoDialog() {
      this.photo.url = "";
      this.photoDialog = false;
    },
    showPhoto(row) {
      if (row.photoPath) {
        this.photo.url = row.photoPath;
        this.photoDialog = true;
      } else {
        this.$notify({
          showClose: true,
          message: "未上传照片",
          type: "error"
        });
      }
    },
    uploadPhoto() {
      this.photoUploadDialog = true;
      this.initUpload();
    },
    selectChange(row) {
      this.selectedStuIds = [];
      row.forEach((element, index) => {
        console.log(index);
        this.selectedStuIds.push(element.id);
      });
      console.log(this.selectedStuIds);
    },
    getStatus(status) {
      if (status == true) {
        return "启用";
      } else if (status == false) {
        return "禁用";
      } else {
        return "";
      }
    },
    handleCurrentChange(val) {
      this.currentPage = val;
      this.searchForm();
    },
    //查询方法
    searchForm() {
      var param = new URLSearchParams(this.formSearch);
      var url =
        CORE_API +
        "/student/studentPage/" +
        (this.currentPage - 1) +
        "/" +
        this.pageSize +
        "?" +
        param;
      this.$http
        .get(url)
        .then(response => {
          this.tableData = response.data.list;
          this.total = response.data.total;
        })
        .catch(function(response) {
          if (response.status == 500) {
            this.$notify({
              showClose: true,
              message: response.body.desc,
              type: "error"
            });
          }
        });
    },
    checkIds(row) {
      if (row) {
        return row.id;
      } else {
        if (this.stuIds.length == 0) {
          this.$notify({
            type: "warning",
            message: "请选择学生"
          });
          return "";
        } else {
          return this.stuIds;
        }
      }
    },
    unbindStudentCode(row) {
      var stuIds = this.checkIds(row);
      if (!stuIds) return;
      this.$confirm("是否解绑学号？", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        var url = CORE_API + "/student/unbindStudentCode/" + stuIds;
        this.$http.put(url).then(response => {
          console.log(response);
          this.$notify({
            type: "success",
            message: "解绑成功"
          });
          this.searchForm();
        });
      });
    },
    unbindSecurityPhone(row) {
      var stuIds = this.checkIds(row);
      if (!stuIds) return;
      this.$confirm("是否解绑安全手机号？", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        var url = CORE_API + "/student/unbindSecurityPhone/" + stuIds;
        this.$http.put(url).then(response => {
          console.log(response);
          this.$notify({
            type: "success",
            message: "解绑成功"
          });
          this.searchForm();
        });
      });
    },
    //重置密码方法
    resetPassword(row) {
      var stuIds = this.checkIds(row);
      if (!stuIds) return;
      this.$confirm("是否重置所选学生的密码？", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        var url = CORE_API + "/student/resetPass/" + stuIds;
        this.$http.put(url).then(response => {
          console.log(response);
          this.$notify({
            type: "success",
            message: "重置密码成功"
          });
          this.searchForm();
        });
      });
    },

    //禁用
    disableStudent(row) {
      var stuIds = this.checkIds(row);
      if (!stuIds) return;
      this.$confirm("是否禁用所选学生？", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        var url = CORE_API + "/student/disable/" + stuIds;
        this.$http.put(url).then(response => {
          console.log(response);
          this.$notify({
            type: "success",
            message: "禁用成功"
          });
          this.searchForm();
        });
      });
    },

    //启用
    enableStudent(row) {
      var stuIds = this.checkIds(row);
      if (!stuIds) return;
      this.$confirm("是否启用所选学生？", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        var url = CORE_API + "/student/enable/" + stuIds;
        this.$http.put(url).then(response => {
          console.log(response);
          this.$notify({
            type: "success",
            message: "启用成功"
          });
          this.searchForm();
        });
      });
    },
    beforeUpload(file) {
      console.log(file);
    },
    uploadProgress(event, file, fileList) {
      console.log("uploadProgress");
      console.log(event);
      console.log(file);
      console.log(fileList);
    },
    uploadSuccess(response, file, fileList) {
      console.log(response);
      console.log(file);
      console.log(fileList);
      this.$notify({
        message: "上传成功",
        type: "success"
      });
      this.fileLoading = false;
      this.photoUploadDialog = false;
      this.searchForm();
    },
    uploadError(response, file, fileList) {
      console.log(response);
      console.log(file);
      console.log(fileList);
      var jsonStr = response.message.substring(4);
      var resp = eval("(" + jsonStr + ")");
      if (response.status == 500) {
        this.$notify({
          message: resp.desc,
          type: "error"
        });
      }
      this.fileLoading = false;
    },
    initUpload() {
      this.fileList = [];
    },
    checkUpload() {
      var fileList = this.$refs.upload.uploadFiles;
      if (fileList.length == 0) {
        this.$notify({
          message: "上传文件不能为空",
          type: "error"
        });
        return false;
      }
      if (fileList.length > 1) {
        this.$notify({
          message: "每次只能上传一个文件",
          type: "error"
        });
        return false;
      }
      for (let file of fileList) {
        let f = file.name.toLowerCase();
        if (!f.endsWith(".jpg") && !f.endsWith(".png")) {
          this.$notify({
            message: "上传文件必须为jpg或者png格式",
            type: "error"
          });
          this.initUpload();
          return false;
        }
      }
      return true;
    },
    //确定上传
    submitUpload() {
      if (!this.checkUpload()) {
        return false;
      }
      this.$refs.upload.submit();
      this.fileLoading = true;
    },
    //清空文件
    removeFile() {
      this.$refs.upload.clearFiles();
    },
    getTag(status) {
      if (status == true) {
        return "success";
      } else if (status == false) {
        return "danger";
      } else {
        return status;
      }
    },
    getEnable(enable) {
      if (enable == true) {
        return "启用";
      } else if (enable == false) {
        return "禁用";
      } else {
        return "启用";
      }
    },
    initPrivileges() {
      let params = new URLSearchParams({
        privilegeCodes: Object.keys(this.rolePrivileges).toString()
      });
      let url = CORE_API + "/rolePrivilege/checkPrivileges?" + params;
      this.$http.post(url).then(response => {
        this.rolePrivileges = response.data;
      });
    },
    init() {
      this.initPrivileges();

      for (let role of this.user.roleList) {
        if (role.roleCode == "SUPER_ADMIN") {
          this.isSuperAdmin = true;
          break;
        }
      }

      var url = CORE_API + "/org/getRootOrgList";

      this.$http.get(url).then(response => {
        this.rootOrgList = response.data;
        this.formSearch.rootOrgId = this.user.rootOrgId;
        this.searchForm();
      });
    }
  },
  created() {
    this.init();
    this.uploadHeaders = {
      key: this.user.key,
      token: this.user.token
    };
  }
};
</script>
<style scoped></style>
