el-calendar 日历做排班、值班、打卡.......

效果图;

在这里插入图片描述

功能: 新增、修改
直接上代码说明:el-calendar 修改源码;

渲染层代码(el-calendar)

<div class="calendar">
    <el-calendar >
      <template slot="dateCell" slot-scope="{date,data}">
        <!--自定义内容
	1、先判断时间,进行颜色改变
	2、渲染先做好初始化格式,再循环渲染需要值班日期参数判断渲染
	3、点击事件区分两个(必须禁止冒泡):未值班点击事件,已有直班点击事件;
	-->
        <div :style="{color: time-86400000 > new Date(date).getTime() ? '#ccc':''}">
          <div class="calendar-day" slot="reference"  @click.stop="onClickDate(data.day,new Date(date).getTime(),$event)">
            {{ data.day.split('-').slice(2).join('-') }}
            <div v-for="(item,index) in attendanceDetailsData" :key="index" slot="reference" @click.stop="onClick(item,data.day,new Date(date).getTime(),$event )">
              <div v-if="data.day == item.time" style="height: 59px;margin-top: -23px;padding: 23px 0 0 6px;font-size: 12px;text-align: center;"> 
                <p >{{data.day == item.time ? item.doctorName : ''}} </p>
                <p >{{data.day == item.time ? item.doctorPhone : ''}} </p>
                <span  v-if="data.day === Time" >值班</span>
              </div>
          </div>
          </div>
        </div>
      </template>
    </el-calendar>
</div>

修改效果

在这里插入图片描述

修改代码(使用el-dropdown)

 <div class='tooltipEchartHeader' v-if="visible" :style="{ left: floatLeft, top: floatTop }" >
      <el-dropdown :show-timeout='10'>
        <span class="box">
        </span>
        <el-dropdown-menu slot="dropdown" align="center" >
            <el-dropdown-item v-for="item in userList"
          :key="item.userId" @click.native="handleCommand(item.userId)">{{item.realName}}</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
data() {
    return {
      titleName:'',
      dateTime:'',
      floatLeft:0,
      floatTop:0,
      visible:false,
      time:Date.now(),
      attendanceDetailsData:[],//排班列表
      userList:[],//医生
      ruleForm:{},
      addForm:{},//填表
      Time:this.TimeDate()
    };
  },

点击事件(监听(上个月–今天–下个月))

在这里插入图片描述

//监听(上个月--今天--下个月)
created() {
    this.$nextTick(() => {
    // 点击上一个月
      let prevBtn = document.querySelector(
        ".el-calendar__button-group .el-button-group>button:nth-child(1)"
      );
      prevBtn.addEventListener("click", e => {
        this.visible=false;
      });
      
      //点击下一个月
      let nextBtn = document.querySelector(
        ".el-calendar__button-group .el-button-group>button:nth-child(3)"
      );
      nextBtn.addEventListener("click", () => {
        this.visible=false;
      });
      
      //点击今天
      let todayBtn = document.querySelector(
        ".el-calendar__button-group .el-button-group>button:nth-child(2)"
      );
      todayBtn.addEventListener("click", () => {
        this.visible=false;
      });
    });
  },
methods: {
    handleCommand(val) {
      let Time = this.TimeDate();
      this.addForm.doctorId = val;
      this.addForm.time = this.dateTime;
      this.$request(scheduleSave, this.addForm).then((res) => {
        if (res.code === 0) {
          if (this.addForm.id) {
            this.$util.message("suc", "修改排班成功");
            this.getList();
            this.visible=false;
            if(this.dateTime === Time){
              this.$store.dispatch("downNumFn")
            }
          } else {
            this.$util.message("suc", "新增排班成功");
            this.getList();
            this.visible=false;
            if(this.dateTime === Time){
              this.$store.dispatch("downNumFn")
            }
          }
        }
      });
    },
    TimeDate() {
      let time = new Date();
      var year = time.getFullYear(); //得到年份
      var month = time.getMonth() + 1; //得到月份
      var date = time.getDate(); //得到日期
      month = month < 10 ? "0" + month : month;
      date = date < 10 ? "0" + date : date;
      return year + "-" + month + "-" + date;
    },
    getList(){
      this.$request(scheduleList, this.ruleForm).then((res) => {
        if(res.code === 0){
          this.attendanceDetailsData = res.data;
        }
      })
    },
    onClick(val,data,eleTime,e){
      this.titleName=data + '修改排班';
      this.dateTime=data;
      if(this.time-86400000 < eleTime){
        console.log('sck')
        this.visible=true;
      }else{
        this.visible=false;
      }
      console.log(val)
      this.floatLeft = e.clientX -50+ "px"; // 减去外层div的left距离
      this.floatTop = e.clientY -22 + "px";
      this.conceal=true;
      this.addForm =this.$util.superCopy(val) ;
      this.addForm.doctorId = Number(this.addForm.doctorId)
    },
    onClickDate(data,eleTime,e){
      this.floatLeft = e.clientX -50+ "px"; // 减去外层div的left距离
      this.floatTop = e.clientY -22 + "px";
      this.titleName=data + '新增排班';
      this.dateTime=data;
      console.log(this.time-86400000)
      if(this.time-86400000 <eleTime){
        this.visible=true;
      }else{
        this.visible=false;
      }
        this.conceal=true;
        this.addForm ={};
    },
  },
  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
全自动排班表使用说明 1、在设置好年份与表头。 "2、每年1月1日,在中按一个排班周期设置好人员名单,将自动生成全年排班表,   第一行就是1月1日上班人员,如使用该表时不是1月1日,可以通过调整中   的排班次序来获得之后日期的正确排班表。单元格内的多行人员代表当天几个班   (如三行就是早中晚),当天增加一个班,就在人员单元格内按[Alt-Enter]换行。" 3、在表中,请自行增加本年的节日,假日会以红底黑字增亮显示 4、在中设置好班次与工时。 5、在中可以自动统计每人每月或全年的工作量 "6、对于不规则情况的排班,如换班,可以在当月人员名单中手动更改,另外,如果每天   的班次大于三个,会出现单元格显示不下的情况,这时可以用快捷键来修改字体大小。" "7、快捷键:   Ctrl-q 所有表保护状态,只有人员显示栏可以更改   Ctrl-e 取消所有表的保护状态,所有栏都可编辑   Ctrl-r 所有表人员名称字体加大   Ctrl-t 所有表人员名称字体减小 Ctrl-p 下打印排班表 Alt-F4 退出EXECL" "8、注意事项:理论上没有限制,但由于单元格显示宽高度有限(字体太小影响显示效果),       本表建议适用一个班最多三人,一天最多四个班上班(四行)的情况,不符合       该条件的可以使用《排班表(考勤版)》解决。"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值