Newer
Older
securityFront / src / views / visitor / visitorAdd.vue
wangxitong on 15 Mar 2021 13 KB 测试bug修改
<template>
  <div class="app-container">
    <div style="margin: 15px;">
      <el-row class="table-title">
        <el-col :span="6"><div class="title-header" style="margin-left: 10px;color: white">人员信息</div></el-col>
        <el-col :span="12" :offset="6" class="edit_btns">
          <el-button class="edit_btn" size="small" @click="checkin">新增来访人员</el-button>
        </el-col>
      </el-row>

      <el-table :data="dataForm.visitorBaseDTOList" class="table" row-class-name="small-row-class" border>
        <!--序号列-->
        <el-table-column align="center" type="index" label="#" width="55"/>
        <!--内容列-->
        <el-table-column v-for="column in columns" :key="column.value" :label="column.text" :width="column.width" :align="column.align" show-overflow-tooltip>
          <template slot-scope="scope">
            <span v-if="column.value === 'idCard'">{{ encrypIdCardNo(scope.row[column.value]) }}</span>
            <span v-else :class="column.class">{{ scope.row[column.value] }}</span>
          </template>
        </el-table-column>
        <!--操作列-->
        <el-table-column label="操作" align="center" width="160">
          <template slot-scope="scope">
            <el-button type="text" @click="detail(scope.row)">详情</el-button>
            <el-button type="text" @click="del(scope.row.idCard)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>

    <div style="margin: 15px;">
      <el-row class="table-title">
        <el-col :span="6"><div class="title-header" style="margin-left: 10px;color: white">来访信息</div></el-col>
      </el-row>

      <el-form v-loading="formLoading" ref="dataForm" :label-position="labelPosition" :rules="rules" :model="dataForm" class="main-form" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="访客所在单位" prop="deptname">
              <el-input v-model.trim="dataForm.deptname" clearable show-word-limit maxlength="30" type="text" placeholder="必填,访客所在单位"/>
            </el-form-item>
          </el-col>
          <el-col :span="12" >
            <el-form-item label="访客所在城市" prop="city">
              <el-input v-model.trim="dataForm.city" clearable show-word-limit maxlength="30" type="text" placeholder="必填,访客所在城市"/>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="20">
          <el-col :span="6">
            <el-form-item label="接访部门" prop="deptid">
              <el-select v-model="dataForm.deptid" placeholder="所属组织" filterable clearable @change="fetchStaffList">
                <el-option v-for="item in deptList" :key="item.id" :label="item.name" :value="item.id"/>
              </el-select>
              <!--<dept-select ref="deptid" v-model="dataForm.deptid" :dept-show="true" :need-top="true" placeholder="所属组织" @change="fetchStaffList"/>-->
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="接访人员" prop="personId">
              <el-select v-model="dataForm.personId" placeholder="请选择接访人" filterable clearable>
                <el-option v-for="item in staffList" :key="item.id" :label="item.name" :value="item.id"/>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="来访事由" prop="matter">
              <el-input v-model.trim="dataForm.matter" clearable show-word-limit maxlength="30" type="text" placeholder="必填"/>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="授权时间">
              <el-radio-group v-model="authTimeType">
                <el-radio v-for="item in authTimeList" :key="item.value" :label="item.value">{{ item.name }}</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="20">
          <el-col :span="12">
            <el-date-picker
              style="margin-left: 120px"
              :readonly="!customTimeRange"
              v-model="timeRange"
              :picker-options="datePickerOptions"
              type="daterange"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期" />
          </el-col>
        </el-row>
      </el-form>
    </div>

    <div style="height: 120px;">
      <el-row type="flex" justify="center">
        <el-col :span="15" style="text-align:center">
          <el-button type="primary" style="width: 150px;" @click="saveData"> 保存 </el-button>
        </el-col>
      </el-row>
    </div>

    <visitor-check-in ref="checkin" @checked="visitorCheckedIn" />
  </div>
</template>

<script>
import DeptSelect from '@/components/DeptSelect'
import { daysInMonth, oneDayTime, getDate, formatToString } from '@/utils/calendarUtil'
import { getStaffByDept } from '@/api/staff'
import { addVisitorPerson } from '@/api/visitor'
import VisitorCheckIn from '@/views/visitor/visitorCheckIn'
import { getDeptTreeList } from '@/api/dept'
const now = new Date()

export default {
  name: 'VisitorAddPerson',
  components: { VisitorCheckIn, DeptSelect },
  data() {
    return {
      dataForm: {
        visitTime: '',
        deptname: '', // 访客所在单位
        city: '', // 访客所在城市
        deptid: '', // 接访部门
        personId: '', // 接访人员
        matter: '', // 来访原因
        beginTime: '',
        endTime: '',
        visitorBaseDTOList: []
      }, // 表单
      rules: {
        deptname: [{ required: true, message: '单位不能为空', trigger: ['blur', 'change'] }],
        city: [{ required: true, message: '城市不能为空', trigger: ['blur', 'change'] }],
        deptid: [{ required: true, message: '接访部门不能为空', trigger: ['blur', 'change'] }],
        personId: [{ required: true, message: '接访人员不能为空', trigger: ['blur', 'change'] }],
        matter: [{ required: true, message: '来访原因不能为空', trigger: ['blur', 'change'] }]
      },
      staffList: [], // 接访人员列表
      labelPosition: 'right',
      authTimeList: [{ name: '当日', value: '1' }, { name: '本周', value: '2' }, { name: '本月', value: '3' }, { name: '自定义', value: '4' }],
      authTimeType: '1',
      timeRange: [],
      customTimeRange: false,
      deptShowTop: true, // 权属单位下拉是否显示顶级
      deptShow: true,
      formLoading: false,
      deptList: [],
      dialogFormVisible: false,
      datePickerOptions: {
        disabledDate(time) {
          const yesterday = new Date(now.getTime() - oneDayTime)
          const oneYearLater = new Date(now.getTime() + (oneDayTime * 360))
          return time.getTime() < yesterday || time.getTime() > oneYearLater
        }
      },
      columns: [
        {
          text: '姓名',
          value: 'name',
          align: 'center',
          width: 140
        },
        {
          text: '性别',
          value: 'sexStr',
          align: 'center'
        },
        {
          text: '身份证号码',
          value: 'idCard',
          align: 'center'
        },
        {
          text: '联系方式',
          value: 'phone',
          align: 'center'
        },
        {
          text: '体温',
          value: 'temperature',
          align: 'center'
        }
      ] // 显示列
    }
  },
  watch: {
    'authTimeType': function(val) {
      const weekDay = now.getDay() // 周几
      const monthDay = now.getDate() // 日期
      const month = now.getMonth() // 月份

      this.customTimeRange = false

      if (val === '1') {
        this.timeRange = [getDate(0, 'DATE'), getDate(0, 'DATE')]
      } else if (val === '2') {
        this.timeRange = [getDate(0, 'DATE'), getDate(7 - weekDay, 'DATE')]
      } else if (val === '3') {
        this.timeRange = [getDate(0, 'DATE'), getDate(daysInMonth[month + 1] - monthDay, 'DATE')]
      } else if (val === '4') {
        this.timeRange = []
        this.customTimeRange = true
      }
    }
  },
  mounted() {
    getDeptTreeList().then(response => {
      const list = response.data.list
      for (let i = 0; i < list.length; i++) {
        if (list[i].pid !== '-1' && list[i].pid !== '0') {
          this.deptList.push(list[i])
        }
      }
    })
    this.resetForm()
    this.initDateRange()
  },
  methods: {
    // 重置表单
    resetForm() {
      this.dataForm = {
        visitTime: '',
        deptname: '', // 访客所在单位
        city: '', // 访客所在城市
        deptid: '', // 接访部门
        personId: '', // 接访人员
        matter: '', // 来访原因
        beginTime: '',
        endTime: '',
        visitorBaseDTOList: []
      }

      // 清除验证
      this.$nextTick(() => {
        this.$refs['dataForm'].clearValidate()
      })
    },
    initDateRange() {
      this.authTimeType = '1' // 当日
      this.dataForm.beginTime = getDate(0, 'DATE')
      this.dataForm.endTime = getDate(0, 'DATE')
      this.timeRange = [getDate(0, 'DATE'), getDate(0, 'DATE')]
    },
    // 身份证号加密显示
    encrypIdCardNo(idCard) {
      return idCard
      // if (idCard.length > 6) {
      //   return idCard.substr(0, 6) + '********' + idCard.substr(14)
      // } else if (idCard) {
      //   return idCard
      // } else {
      //   return ''
      // }
    },
    // 打开访客登记页面
    checkin() {
      this.dialogFormVisible = true
      this.$refs.checkin.initDialog('create', this.dialogFormVisible)
    },
    // 一位访客登记完毕
    visitorCheckedIn(visitor) {
      if(visitor.sex === '2'){
        visitor.sexStr = '女'
      }else if(visitor.sex === '1'){
        visitor.sexStr = '男'
      }
      this.dataForm.visitorBaseDTOList.push(visitor)
    },
    detail(row) {
      this.dialogFormVisible = true
      this.$refs.checkin.initDialog('detail', this.dialogFormVisible, row)
    },
    del(idCard) {
      const that = this
      this.$confirm('是否确认删除?', '提示', {
        confirmButtonText: '是',
        cancelButtonText: '否',
        type: 'info'
      }).then(() => {
        that.dataForm.visitorBaseDTOList.forEach(function(item, index) {
          if (item.idCard === idCard) {
            that.dataForm.visitorBaseDTOList.splice(index, 1)
          }
        })
      }).catch(() => {
      })
    },
    // 保存数据
    saveData: function() {
      this.$refs['dataForm'].validate((valid) => {
        if (this.dataForm.visitorBaseDTOList.length === 0) {
          this.$message.error('来访人员列表不能为空')
        } else if (valid) {
          this.dataForm.visitTime = formatToString(now, 'SECOND')
          addVisitorPerson(this.dataForm).then(response => {
            if (response.code === 200) {
              // 注册成功后清除表单
              this.resetForm()

              this.$confirm('新增成功,是否继续新增?', '提示', {
                confirmButtonText: '是',
                cancelButtonText: '否',
                type: 'info'
              }).then(() => {
                this.$nextTick(() => {
                  this.$refs['dataForm'].clearValidate()
                })
              }).catch(() => {
                const code = this.$store.getters.currentSystem.code
                this.$router.replace({ path: '/' + code + '/visitor/today' })
              })
            } else {
              this.$message.error(response.message)
              this.btnLoading = false
            }
          }).catch(() => {
            // this.$message.error('保存失败,服务器异常')
          })
        }
      })
    },
    fetchStaffList() {
      getStaffByDept({ deptId: this.dataForm.deptid }).then(response => {
        this.dataForm.personId = ''
        this.staffList = response.data
      })
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" >
  .hide .el-upload--picture-card {
    display: none;
  }
  .main-form{
    margin: 0px 30px;
    margin-top: 20px;
    padding: 10px;
    overflow: auto;
  }
  .el-dialog{
    width:700px
  }
  .el-select{
    width: 100%;
  }
  .line{
    width: 50px;
    margin-left: 5px;
  }
  .hide .el-upload-–picture-card{
    display: none;
  }
  .imgBox{
    width: 100%;
    text-align: center;
  }
  .avatar-uploader .el-upload {
    margin-left: 12px;
    margin-top: 10px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .avatar-uploader .el-upload:hover {
    border-color: #409EFF;
  }
  .avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 238px;
    line-height: 238px;
    text-align: center;
  }
  .avatar {
    margin: 10px;
    display: block;
  }
  .id-card-btn{
    width:126px;
    margin-left: 12px;
    margin-top: 20px;
  }

  $tableTitleHeight:46px;
  .app-container{
    margin-bottom:20px
  }
  .table{
    margin-bottom: 20px;
  }
  .pagination-container{
    margin-bottom: 50px;
  }
  .table-title{
    background-color:rgba(76, 142, 226, 1);
    height: $tableTitleHeight;
    .title-header{
      line-height:$tableTitleHeight;
      color: white;
      font-size: 15px;
      i{
        margin-left: 5px;
        margin-right: 5px;
      }
    }
  }
  .edit_btns{
    .edit_btn{
      float:right;
      margin:7px 3px;//为了需要居中显示margin-top和bottom要用$tableTitleHeight减去按钮原高度除以2
    }
  }
</style>