Administrator
2022-04-11 79d9fc857559982b00b68b2d709807bdc4cd286f
src/views/accreditationRecords/accreditationRecords.vue
@@ -1,6 +1,13 @@
<template>
  <basic-container class="desk1">
  <basic-container
    :class="[
      'desk1',
      $store.state.control.screenSize == 1366 ? 'smallSize' : 'normalSize',
      $store.state.control.windowWidth >= 1024 ? 'tooRowSearch1' : ''
    ]"
  >
    <avue-crud
      class="tablesss"
      :option="option"
      :table-loading="loading"
      :data="data"
@@ -24,11 +31,10 @@
    >
      <template slot="menuLeft">
        <el-button
          style="display:none"
          type="danger"
          size="small"
          icon="el-icon-delete"
          v-if="permission.notice_delete"
          v-if="permission.accreditationRecords_batch_delete"
          plain
          @click="handleDelete"
          >删 除
@@ -38,10 +44,32 @@
          size="small"
          plain
          icon="el-icon-download"
          v-if="permission.accreditationRecords_export || check"
          v-if="permission.accreditationRecords_export"
          @click="handleExport"
          >保安员证信息导出
        </el-button>
        <el-button
          type="primary"
          size="small"
          plain
          v-if="permission.accreditationRecords_worker_batch_audit || check"
          icon="el-icon-collection-tag"
          @click="handleSecurityAudit"
          >批量审批
        </el-button>
        <el-button
          type="primary"
          size="small"
          plain
          style="display:none"
          v-if="permission.accreditationRecords_status"
          icon="el-icon-collection-tag"
          @click="handleBatch"
          >已制证
        </el-button>
        <span>
          <Legend :datas="datalistLIU"></Legend>
        </span>
        <!-- v-if="permission.notice_delete" -->
      </template>
      <template slot-scope="{ row }" slot="category">
@@ -49,28 +77,76 @@
      </template>
      <template slot-scope="{ type, size, row }" slot="menu">
        <el-button
          style="display:none"
          style="display: none"
          :size="size"
          :type="type"
          v-if="permission.notice_upload"
          @click="handleUploadPage(row)"
          >附件上传
        </el-button>
        <!-- <el-button
          v-if="!deptCategory"
          :size="size"
        <el-button
          :type="type"
          @click="handleUploadPage(row)"
          >附件查看
        </el-button> -->
          :size="size"
          v-if="permission.accreditationRecords_worker_audit || check"
          icon="el-icon-folder-checked"
          @click="handleAudit(row)"
          >审核
        </el-button>
      </template>
      <template slot-scope="{ row }" slot="auditStatus">
        <el-tag class="dtype">
          {{
            row.auditStatus == 1
              ? "待审核"
              : row.auditStatus == 2
              ? "审核通过"
              : "审核不通过"
          }}
          <i class="zc" v-if="row.auditStatus == 2"></i>
          <i class="yj" v-if="row.auditStatus == 3"></i>
          <i class="gz" v-if="row.auditStatus == 1"></i>
        </el-tag>
      </template>
      <template slot-scope="{ row }" slot="deptName">
            <el-tag>{{ row.deptName }}</el-tag>
        <el-tag>{{ row.deptName }}</el-tag>
      </template>
      <template slot-scope="{ row }" slot="sex">
            <el-tag>{{ row.sex=="1"?"男":row.sex=="2"?"女":""}}</el-tag>
        <el-tag>{{
          row.sex == "1" ? "男" : row.sex == "2" ? "女" : ""
        }}</el-tag>
      </template>
    </avue-crud>
    <el-dialog
      title="证书申请审核"
      :visible.sync="dialogFormVisible"
      modal-append-to-body="false"
      append-to-body="true"
      :close-on-click-model="true"
    >
      <avue-form
        ref="formAudit"
        v-model="Audit"
        :option="optionAudit"
        @reset-change="emptytChange"
        @submit="submit"
      ></avue-form>
    </el-dialog>
    <el-dialog
      title="批量审批"
      append-to-body
      :visible.sync="dialogBatchAudit"
      width="900px"
      @close="closeDialog"
    >
      <avue-form
        ref="formBatchAudit"
        v-model="batchAudit"
        :option="optionBatchAudit"
        @reset-change="emptytChange"
        @submit="submitBatchAudit"
      ></avue-form>
    </el-dialog>
  </basic-container>
</template>
@@ -80,18 +156,38 @@
  remove,
  update,
  add,
  getAccreditationRecords
  getAccreditationRecords,
  batchAccreditation,
  audit,
  batchAudit
} from "@/api/accreditationRecords/accreditationRecords";
import { getDept } from "@/api/system/dept";
import { mapGetters } from "vuex";
import { mapState } from "vuex";
import Qs from "qs";
import website from "@/config/website";
import { getToken } from "@/util/auth";
import Legend from "@/components/liu-legend/Legend";
export default {
  components: {
    Legend
  },
  data() {
    return {
      check:false,
      datalistLIU: [
        {
          color: "#29C093",
          text: "审核通过"
        },
        {
          color: "#F34A4A",
          text: "审核不通过"
        },
        {
          color: "#F48F57",
          text: "待审核"
        }
      ],
      check: false,
      form: {},
      query: {},
      questionBankSearch: {},
@@ -106,9 +202,74 @@
        pageSize: 10,
        currentPage: 1,
        total: 0,
        ...this.$store.state.control.changePageSize
      },
      selectionList: [],
      option: {
      Audit: {},
      dialogFormVisible: false,
      dialogBatchAudit: false,
      optionAudit: {
        height: "auto",
        calcHeight: 30,
        dialogWidth: 1000,
        tip: false,
        searchShow: true,
        searchMenuSpan: 6,
        border: true, //liu
        index: true,
        stripe: true,
        viewBtn: false,
        addBtn: false,
        editBtn: false,
        selection: true,
        excelBtn: false,
        menuWidth: 230,
        dialogClickModal: false,
        ...this.$store.state.control.clearOtherBut,
        column: [
          {
            label: "审核状态",
            search: true,
            searchSpan: 5,
            span: 24,
            prop: "auditStatus",
            slot: true,
            editDisplay: false,
            addDisplay: false,
            type: "select",
            rules: [
              {
                required: true,
                message: "请选择审核类型",
                trigger: "blur"
              }
            ],
            dicData: [
              {
                label: "待审核",
                value: 1
              },
              {
                label: "审核通过",
                value: 2
              },
              {
                label: "审核不通过",
                value: 3
              }
            ]
          },
          {
            label: "审核明细",
            span: 24,
            type: "textarea",
            prop: "auditDetail"
          }
        ]
      },
      batchAudit: {
        number: 0
      },
      optionBatchAudit: {
        height: "auto",
        filterBtn: true,
        calcHeight: 30,
@@ -116,17 +277,89 @@
        tip: false,
        searchShow: true,
        searchMenuSpan: 6,
        border: true, //liu
        index: true,
        stripe: true,
        viewBtn: true,
        selection: false,
        excelBtn: false,
        menuWidth: 380,
        dialogClickModal: false,
        ...this.$store.state.control.clearOtherBut,
        column: [
          {
            label: "所选保安人数",
            prop: "number",
            span: 24,
            value: 0,
            disabled: true,
            labelWidth: 110
          },
          {
            label: "审核状态",
            search: true,
            searchSpan: 5,
            span: 24,
            prop: "auditStatus",
            slot: true,
            editDisplay: false,
            addDisplay: false,
            type: "select",
            rules: [
              {
                required: true,
                message: "请选择审核类型",
                trigger: "blur"
              }
            ],
            dicData: [
              {
                label: "待审核",
                value: 1
              },
              {
                label: "审核通过",
                value: 2
              },
              {
                label: "审核不通过",
                value: 3
              }
            ]
          },
          {
            label: "审核明细",
            span: 24,
            type: "textarea",
            prop: "auditDetail"
          }
        ]
      },
      choiceList: [],
      selectionList: [],
      option: {
        height: "auto",
        filterBtn: true,
        calcHeight: 30,
        dialogWidth: 950,
        tip: true,
        reserveSelection: true,
        searchShow: true,
        searchMenuSpan: 6,
        align: "center",
        border: true,
        index: true,
        stripe: true,
        viewBtn: true,
        // selection: true,
        selection: true,
        excelBtn: false,
        addBtnText: "发布",
        addTitle: "发布",
        saveBtnText: "发布",
        menuWidth: 150,
        menuWidth: 210,
        dialogClickModal: false,
        ...this.$store.state.control.clearOtherBut,
        searchIndex: 5, //收缩展示数量
        column: [
          {
            label: "申请时间",
@@ -140,26 +373,26 @@
            editDisplay: false,
            viewDisplay: false,
            search: true,
            searchSpan:5,
            searchSpan: 5,
            rules: [
              {
                required: true,
                message: "请输入申请时间",
                trigger: "blur",
              },
            ],
                trigger: "blur"
              }
            ]
          },
          {
            label: "姓名",
            prop: "realName",
            search: true,
            searchSpan: 3,
            width:100,
            searchLabelWidth: 50,
            width: 100,
            searchLabelWidth: 50
            // display: false,
          },
          // {
          //   label: "所属保安公司",
          //   label: "企业名称",
          //   searchLabelWidth: "110",
          //   // prop: "deptName",
          //   prop: "deptId",
@@ -178,54 +411,51 @@
          //   minWidth: 260,
          // },
          {
              label: "所属保安公司",
              searchLabelWidth: "110",
              prop: "deptName",
              // type: "tree",
              // dicUrl: "/api/blade-system/dept/security_lazy-tree?parentId=1413470343230877697",
              // props: {
              //     label: "title",
              //     value: "id",
              // },
              slot: true,
              searchSpan: 5,
              search: true,
              overHidden: true,
              minWidth: 200
            label: "企业名称",
            searchLabelWidth: "90",
            prop: "deptName",
            slot: true,
            searchSpan: 5,
            search: true,
            overHidden: true,
            minWidth: 160
          },
          {
            label: "性别",
            prop: "sex",
            width: 80,
            type: "select",
            display: false,
            display: false
          },
          {
            label: "身份证号码",
            prop: "idCardNo",
            search: true,
            searchLabelWidth: 90,
            searchSpan: 4,
            searchSpan: 5,
            width: 140
          },
          {
            label: "年龄",
            prop: "age",
            width: 60
          },
          {
            label: "照片",
            prop: "avatar",
            type: "upload",
            listType: "picture-img",
            width: 60
          },
          {
            label: "保安证编号",
            prop: "securityNumber",
            search: true,
            searchLabelWidth: 90,
            minWidth: 105,
            searchSpan: 3,
            width: 110,
            searchSpan: 4,
            addDisplay: false,
            editDisplay: false,
            editDisplay: false
            // hide: true,
          },
@@ -234,10 +464,10 @@
            prop: "applyName",
            // search: true,
            searchLabelWidth: 90,
            width: 80,
            minWidth: 80,
            // searchSpan: 4,
            addDisplay: false,
            editDisplay: false,
            editDisplay: false
            // hide: true,
          },
          {
@@ -245,10 +475,10 @@
            prop: "applyUnit",
            search: true,
            searchLabelWidth: 120,
            minWidth: 105,
            minWidth: 120,
            searchSpan: 4,
            addDisplay: false,
            editDisplay: false,
            editDisplay: false
            // hide: true,
          },
          {
@@ -256,42 +486,103 @@
            prop: "createTime",
            // search: true,
            searchLabelWidth: 90,
            minWidth: 105,
            width: 140,
            // searchSpan: 4,
            addDisplay: false,
            editDisplay: false,
            editDisplay: false
            // hide: true,
          },
          {
            label: "有无照片",
            prop: "isAvatar",
            type: "select",
            search:true,
            search: true,
            searchLabelWidth: 90,
            minWidth: 105,
            searchSpan: 3,
            searchSpan: 4,
            addDisplay: false,
            editDisplay: false,
            hide: true,
            display: false,
            dicData:[
            dicData: [
              {
                label:"全部",
                value:3
                label: "全部",
                value: 3
              },
              {
                label:"有",
                value:1
                label: "有",
                value: 1
              },
              {
                label:"无",
                value:2
                label: "无",
                value: 2
              }
            ]
          },
        ],
          {
            label: "审核状态",
            prop: "auditStatus",
            type: "select",
            search: true,
            searchLabelWidth: 90,
            width: 110,
            searchSpan: 4,
            addDisplay: false,
            editDisplay: false,
            hide: false,
            display: false,
            dicData: [
              {
                label: "待审核",
                value: 1
              },
              {
                label: "审核通过",
                value: 2
              },
              {
                label: "审核不通过",
                value: 3
              }
            ]
          },
          {
            label: "审核明细",
            prop: "auditDetail",
            minWidth: 105,
            addDisplay: false,
            editDisplay: false,
            hide: false,
            display: false
          },
          {
            label: "是否制证",
            prop: "status",
            type: "select",
            slot: true,
            search: true,
            editDisplay: false,
            addDisplay: false,
            searchSpan: 4,
            width: 80,
            dicData: [
              {
                label: "全部",
                value: 3
              },
              {
                label: "已制证",
                value: 2
              },
              {
                label: "未制证",
                value: 1
              }
            ]
          }
        ]
      },
      data: [],
      data: []
    };
  },
  computed: {
@@ -299,42 +590,171 @@
    permissionList() {
      return {
        addBtn: this.vaildData(null, false),
        viewBtn: this.vaildData(this.permission.accreditationRecords_view, false),
        delBtn: this.vaildData(null, false),
        editBtn: this.vaildData(null, false),
        viewBtn: this.vaildData(
          this.permission.accreditationRecords_view,
          false
        ),
        delBtn: this.vaildData(
          this.permission.accreditationRecords_delete,
          false
        ),
        editBtn: this.vaildData(null, false)
      };
    },
    ids() {
      let ids = [];
      this.selectionList.forEach((ele) => {
      this.selectionList.forEach(ele => {
        ids.push(ele.id);
      });
      return ids.join(",");
    },
    ...mapState({
      userInfo: (state) => state.user.userInfo,
    }),
      userInfo: state => state.user.userInfo
    })
  },
  mounted() {
    this.getDeptInfo(this.userInfo.dept_id);
    this.$store.commit("setWindowSizeHeightAdd");
  },
  created(){
      if (this.userInfo.role_name == "公安管理员") {
  created() {
    if (this.userInfo.role_name == "上岗证办理管理员") {
      this.questionBankSearch["status"] = 1;
      this.questionBankSearch["auditStatus"] = 2;
      this.option.reserveSelection = false;
      this.option.tip = false;
      this.option.selection = false;
    }
    if (this.userInfo.role_name == "公安管理员") {
      //判断是否为市局管理员
      if(this.userInfo.jurisdiction=="1372091709474910209"){
          this.check = true;
          // this.vaildData(this.permission.accreditationRecords_paper_delete, false);
      }else{
      if (this.userInfo.jurisdiction == "1372091709474910209") {
        this.check = true;
      } else {
        this.check = false;
        // this.vaildData(null, false);
      }
    }
  },
  methods: {
    //审核
    handleAudit(row) {
      this.dialogFormVisible = true;
      this.Audit = row;
    },
    //审核
    submit(row, done, loading) {
      const data = {
        id: row.id,
        type: 1,
        auditStatus: row.auditStatus,
        auditDetail: row.auditDetail,
        auditUser: this.userInfo.Id
      };
      audit(data).then(
        () => {
          this.dialogFormVisible = false;
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        },
        error => {
          window.console.log(error);
          loading();
        }
      );
    },
    //证书批量审核
    handleSecurityAudit() {
      if (this.choiceList.length == 0) {
        this.$message({
          message: "未选择保安员",
          type: "warning"
        });
        return;
      }
      this.dialogBatchAudit = true;
      this.batchAudit.number = this.choiceList.length;
    },
    //批量审批
    submitBatchAudit(row, done, loading) {
      var that = this;
      let cho = this.choiceList;
      let str = "";
      for (let k in cho) {
        str += cho[k].id;
        if (k != cho.length - 1) {
          str += ",";
        }
      }
      const data = {
        ids: str,
        type: 1,
        auditStatus: row.auditStatus,
        auditDetail: row.auditDetail,
        auditUser: this.userInfo.Id
      };
      //提交申请
      batchAudit(data).then(
        () => {
          this.onLoad(this.page);
          that.$refs.formBatchAudit.resetFields();
          that.dialogBatchAudit = false;
          this.$message({
            type: "success",
            message: "操作成功"
          });
          //清除选项
          that.$refs.crud.toggleSelection();
          done();
        },
        error => {
          window.console.log(error);
          loading();
        }
      );
    },
    //证书批量修改为已制证
    handleBatch() {
      if (this.choiceList.length === 0) {
        this.$message.warning("请勾选至少一位持证保安员");
        return;
      }
      this.$confirm("共选择人数" + this.choiceList.length + "人,确定已制证?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          let cho = this.choiceList;
          let str = "";
          for (let k in cho) {
            str += cho[k].id;
            if (k != cho.length - 1) {
              str += ",";
            }
          }
          const data = {
            ids: str,
            createUser: this.userInfo.user_id,
            type: 1
          };
          return batchAccreditation(data);
        })
        .then(() => {
          this.onLoad(this.page, this.questionBankSearch);
          this.$refs.crud.toggleSelection();
          this.$message({
            type: "success",
            message: "操作成功!"
          });
        });
    },
    //获取当前用户部门信息
    getDeptInfo(deptId) {
      var that = this;
      getDept(deptId).then((res) => {
      getDept(deptId).then(res => {
        var deptCategory = res.data.data.deptCategory;
        deptCategory == 1
          ? (that.deptCategory = true)
@@ -347,8 +767,8 @@
        path: `/resource/uploadNotice`,
        query: {
          deptId: row.deptId,
          noticeId: row.id,
        },
          noticeId: row.id
        }
      });
    },
    rowSave(row, done, loading) {
@@ -364,11 +784,11 @@
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
            message: "操作成功!"
          });
          done();
        },
        (error) => {
        error => {
          window.console.log(error);
          loading();
        }
@@ -386,11 +806,11 @@
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
            message: "操作成功!"
          });
          done();
        },
        (error) => {
        error => {
          window.console.log(error);
          loading();
        }
@@ -400,7 +820,7 @@
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        type: "warning"
      })
        .then(() => {
          return remove(row.id);
@@ -409,7 +829,7 @@
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
            message: "操作成功!"
          });
        });
    },
@@ -425,10 +845,16 @@
    },
    selectionChange(list) {
      this.selectionList = list;
      this.choiceList = [];
      for (let k in list) {
        this.choiceList.push({
          id: list[k].id
        });
      }
    },
    selectionClear() {
      this.selectionList = [];
      this.$refs.crud.toggleSelection();
      // this.$refs.crud.toggleSelection();
    },
    handleDelete() {
      if (this.selectionList.length === 0) {
@@ -438,23 +864,23 @@
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        type: "warning"
      })
        .then(() => {
          return remove(this.ids);
        })
        .then(() => {
          this.onLoad(this.page);
          this.onLoad(this.page, this.questionBankSearch);
          this.$message({
            type: "success",
            message: "操作成功!",
            message: "操作成功!"
          });
          this.$refs.crud.toggleSelection();
        });
    },
    beforeOpen(done, type) {
      if (["edit", "view"].includes(type)) {
        getAccreditationRecords(this.form.id).then((res) => {
        getAccreditationRecords(this.form.id).then(res => {
          this.form = res.data.data;
        });
      }
@@ -467,70 +893,75 @@
      this.page.pageSize = pageSize;
    },
    refreshChange() {
      this.onLoad(this.page, this.query);
      this.onLoad(this.page, this.questionBankSearch);
    },
    onLoad(page, params = {}) {
      params = this.questionBankSearch;
      this.deptId = JSON.parse(
        window.localStorage.getItem("saber-userInfo")
      ).content.dept_id;
        const { releaseTimeRange } = this.query;
        params["type"] = 1;
        if (this.userInfo.role_name == "保安公司管理员") {
          //如果是保安公司管理员
          params["deptId"] = this.userInfo.dept_id;
        }
        if (this.userInfo.role_name == "培训公司管理员") {
          //如果是培训公司管理员
          params["createUser"] = this.userInfo.Id;
        }
        if (this.userInfo.role_name == "公安管理员") {
          //如果是公安管理员
          params["jurisdiction"] = this.userInfo.jurisdiction;
        }
        let values = {
      const { releaseTimeRange } = this.query;
      params["type"] = 1;
      if (this.userInfo.role_name == "保安公司管理员") {
        //如果是保安公司管理员
        params["deptId"] = this.userInfo.dept_id;
      }
      if (this.userInfo.role_name == "培训公司管理员") {
        //如果是培训公司管理员
        params["createUser"] = this.userInfo.Id;
      }
      if (this.userInfo.role_name == "公安管理员" || this.userInfo.role_name == "民警") {
        //如果是公安管理员
        params["jurisdiction"] = this.userInfo.jurisdiction;
      }
      let values = {
        ...params
      };
      if (releaseTimeRange) {
        values = {
          ...params,
          startTime: releaseTimeRange[0],
          endTime: releaseTimeRange[1],
          ...this.query
        };
        if (releaseTimeRange) {
          values = {
            ...params,
            startTime: releaseTimeRange[0],
            endTime: releaseTimeRange[1],
            ...this.query,
          };
          values.releaseTimeRange = null;
        }
        this.loading = true;
        getList(page.currentPage, page.pageSize, values).then((res) => {
          const data = res.data.data;
          this.page.total = data.total;
          this.data = data.records;
          this.loading = false;
          this.selectionClear();
        });
        values.releaseTimeRange = null;
      }
      this.loading = true;
      getList(page.currentPage, page.pageSize, values).then(res => {
        const data = res.data.data;
        this.page.total = data.total;
        this.data = data.records;
        this.loading = false;
        this.$store.commit("setWindowSizeHeightAdd");
        this.selectionClear();
      });
    },
    //保安员证信息导出
    handleExport() {
      this.$confirm("是否导出保安员证信息数据?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        type: "warning"
      }).then(() => {
        //获取查询条件
        const { releaseTimeRange } = this.questionBankSearch;
        if (releaseTimeRange) {
            this.questionBankSearch['startTime'] = releaseTimeRange[0];
            this.questionBankSearch['endTime'] = releaseTimeRange[1];
          this.questionBankSearch["startTime"] = releaseTimeRange[0];
          this.questionBankSearch["endTime"] = releaseTimeRange[1];
        }
        var data = {
          type:1,
          applyUnit:this.questionBankSearch.applyUnit,
          type: 1,
          applyUnit: this.questionBankSearch.applyUnit,
          deptName: this.questionBankSearch.deptName,
          idCardNo: this.questionBankSearch.idCardNo,
          auditStatus: this.questionBankSearch.auditStatus,
          realName: this.questionBankSearch.realName,
          securityNumber: this.questionBankSearch.securityNumber,
          startTime: this.questionBankSearch.startTime,
          endTime: this.questionBankSearch.endTime,
          isAvatar: this.questionBankSearch.isAvatar,
          status: this.questionBankSearch.status
        };
        //导出
        if (this.userInfo.role_name == "保安公司管理员") {
@@ -541,18 +972,67 @@
          //如果是培训公司管理员
          data["createUser"] = this.userInfo.Id;
        }
        if (this.userInfo.role_name == "公安管理员") {
        if (this.userInfo.role_name == "公安管理员" || this.userInfo.role_name == "民警") {
          //如果是公安管理员
          data["jurisdiction"] = this.userInfo.jurisdiction;
        }
        //序列号url形式,用&拼接
        data = Qs.stringify(data);
        window.open(`/api/accreditationRecords/export-security-paper?${this.website.tokenHeader}=${getToken()}&`+data);
        window.open(
          `/api/accreditationRecords/export-security-paper?${
            this.website.tokenHeader
          }=${getToken()}&` + data
        );
      });
    },
  },
    }
  }
};
</script>
<style>
<style lang="scss" scoped>
.dtype {
  width: 100%;
  padding-left: 0px;
}
.dx {
  position: absolute;
  top: 50%;
  margin-top: -5px;
  margin-left: 6px;
  width: 10px;
  height: 10px;
  border-radius: 30%;
  background: #dfdfdf;
}
.zc {
  position: absolute;
  top: 50%;
  margin-top: -5px;
  margin-left: 4px;
  width: 10px;
  height: 10px;
  border-radius: 30%;
  background: #29c093;
}
.yj {
  position: absolute;
  top: 50%;
  margin-top: -5px;
  margin-left: 4px;
  width: 10px;
  height: 10px;
  border-radius: 30%;
  background: #f34a4a;
}
.gz {
  position: absolute;
  top: 50%;
  margin-top: -5px;
  margin-left: 4px;
  width: 10px;
  height: 10px;
  border-radius: 30%;
  background: #f48f57;
}
</style>