zoukankan      html  css  js  c++  java
  • vue日历排班

    带我的师傅说能自己写出这个就算是可以了,人家都是script标签里面的代码写得多,我是template里面写得多,哎,慢慢来吧。这个代码是带我的人写的,放出来算是记录一下复杂的心情

    index.vue

    <template>
      <div class="g-mn">
        <div class="m-sch">
          <el-row :gutter="15">
            <el-col :span="6">
              <el-input
                v-model="query.search['empNo_eq']"
                placeholder="请输入员工姓名/工号"
                @keyup.enter.native="keyDown($event)"
              >
                <template slot="prepend">工号/姓名</template>
              </el-input>
            </el-col>
            <el-col :span="6">
              <div class="el-input el-input--medium el-input-group el-input-group--prepend">
                <div class="el-input-group__prepend">班组</div>
                <el-select
                  @change="search"
                  v-model="query.search['classId_eq']"
                  style="100%"
                  placeholder="请选择班组"
                >
                  <el-option
                    v-for="item in classInfos"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                  />
                </el-select>
              </div>
            </el-col>
            <el-col :span="6">
              <div class="el-input el-input--medium el-input-group el-input-group--prepend">
                <div class="el-input-group__prepend">排班年月</div>
                <el-date-picker
                  style="100%"
                  v-model="query.search['yearMonth_eq']"
                  @change="changeTime"
                  value-format="yyyy-MM"
                  type="month"
                  placeholder="选择日期"
                ></el-date-picker>
              </div>
            </el-col>
            <el-col :span="6">
              <el-button-group>
                <el-button type="info" icon="el-icon-search" @click="search">查询</el-button>
                <el-button type="info" icon="el-icon-refresh" @click="cleanSearch">重置</el-button>
              </el-button-group>
            </el-col>
          </el-row>
        </div>
        <div class="m-bd-tp">
          <el-row class="u-btns">
            <el-col :span="10">
              <div>
                <el-button-group v-if="showBtn">
                  <el-button
                    v-for="(item,index) in frequencies"
                    :key="index"
                    type="info"
                    icon="el-icon-alarm-clock"
                    @click="setWork(item.bsInfo)"
                  >{{ item.name }}({{ item.bsInfo }})</el-button>
                  <el-button type="primary" icon="el-icon-plus" @click="save()">保存</el-button>
                  <el-button type="warning" icon="el-icon-close" @click="cannelSelect()">取消选择</el-button>
                </el-button-group>
                <div v-else>.</div>
              </div>
            </el-col>
            <el-col :span="14" class="f-tar icon-btn">
              <el-button-group>
                <el-button type="primary" icon="el-icon-refresh" @click="cleanSearch()" />
              </el-button-group>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="24" class="m-db-tp">
              <div style="100%;background:#fff;display:flex">
                <div style>
                  <div style="display:flex">
                    <div class="u-table-tle" style="background:#EBEEF5 !important">工号</div>
                    <div class="u-table-tle" style="background:#EBEEF5 !important">姓名</div>
                  </div>
                  <div v-for="(data,index) in tableData" :key="index" style="display:flex">
                    <div class="u-table-tle">{{ data.no }}</div>
                    <div class="u-table-tle">{{ data.name }}</div>
                  </div>
                </div>
                <div style="calc(100vw - 510px);overflow-x:auto">
                  <div style="display:flex;100%">
                    <div
                      v-for="(item,index) in dayList"
                      :key="index"
                      class="u-day"
                      style="background:#EBEEF5 !important"
                      @click="selectColumn(index)"
                    >
                      <div
                        style="100%;height:100%;display:flex;justify-content:center;align-items:center;flex-direction:column;cursor:pointer"
                      >
                        <div>{{ item.day }}</div>
                        <div style="margin-top:5px">{{ item.week }}</div>
                      </div>
                    </div>
                  </div>
                  <div v-for="(data,dataIndex) in valueList" :key="dataIndex">
                    <div style="display:flex;100%">
                      <div
                        v-for="(item,index) in data"
                        :ref="index+'-'+dataIndex"
                        :key="index"
                        class="u-day"
                        @mousedown="down(index,dataIndex,$event)"
                        @mousemove="move(index,dataIndex,$event)"
                        @mouseup="up(index,dataIndex)"
                      >
                        <div
                          style="cursor:pointer;100%;height:100%;display:flex;justify-content:center;align-items:center"
                        >{{ item.value }}</div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <br />
              <div style="text-align:right">
                <el-pagination
                  :current-page="currentPage"
                  :page-sizes="pageSizes"
                  :page-size="pageSize"
                  :total="total"
                  layout="total, sizes, prev, pager, next, jumper"
                  @size-change="changeSize"
                  @current-change="changePage"
                />
              </div>
            </el-col>
          </el-row>
        </div>
        <create
          v-if="isShowCreate"
          ref="addModel"
          :drawer.sync="isShowCreate"
          :select-id="selectedId"
          @close="closeModel"
        />
      </div>
    </template>
    <script>
    import create from './create.vue'
    import dataTable from '@/mixins/dataTable'
    export default {
      components: {
        create: create
      },
      mixins: [dataTable],
      data () {
        return {
          frequencies: [],
          radio: '',
          valueList: [],
          dayList: [],
          isDown: false,
          starRow: -1,
          showBtn: true,
          starColumn: -1,
          row: -1,
          isInitData: false,
          value: '',
          classInfos: [],
          column: -1,
          url: 'freq/workforceManagements',
          query: { search: { 'classId_eq': '', 'yearMonth_eq': '', 'empNo_eq': '' } },
          input: '',
          loading: false,
          form: {},
          treeData: [],
          selectList: []
        }
      },
      created () {
        window.this = this
      },
      mounted () {
    
      },
      methods: {
        changeTime () {
          this.$http.get(this.url + '/getMonthInfo', {
            yearMonth: this.query.search['yearMonth_eq']
          }).then(data => {
            if (data.status === 200) {
              if (this.query.search['yearMonth_eq'] < new Date().getFullYear() + '-' + (new Date().getMonth() + 1)) {
                this.showBtn = false
              } else {
                this.showBtn = true
              }
              var weekList = data.content.weekList
              var dateList = data.content.dateList
              var list = []
              for (var i in weekList) {
                list = list.concat({
                  day: new Date(dateList[i]).getDate(),
                  week: weekList[i]
                })
              }
              this.dayList = list
              this.cannelSelect();
              this.search()
            }
          }).catch(res => { })
        },
        getOption () {
          this.$http.get(this.url + '/optionsData').then(data => {
            if (data.status === 200) {
              this.optionsData = data.content
              var weekList = this.optionsData.weekList
              var dateList = this.optionsData.dateList
              var list = []
              for (var i in weekList) {
                list = list.concat({
                  day: new Date(dateList[i]).getDate(),
                  week: weekList[i]
                })
              }
              this.dayList = list
              this.classInfos = this.optionsData.classInfos
              this.query.search['classId_eq'] = this.classInfos[0].id
              this.frequencies = this.optionsData.frequencies
              this.query.search['yearMonth_eq'] = new Date().getFullYear() + '-' + (new Date().getMonth() + 1)
              this.search()
            }
          })
        },
        getData () {
          this.tableLoading = true
          this.$http
            .get(this.url, {
              page: { pn: this.currentPage, size: this.pageSize },
              ...this.query
            })
            .then(data => {
              if (data.status === 200) {
                this.tableLoading = false
                this.total = data.content.total
                this.tableData = data.content.records
                var listOne = []
                for (var i in this.tableData) {
                  var listTwo = []
                  if (this.tableData[i].wmValue) {
                    this.tableData[i].wmValue = this.tableData[i].wmValue.split(',')
                  }
                  for (var j in this.dayList) {
                    listTwo = listTwo.concat({
                      id: this.tableData[i].employeeId,
                      row: i,
                      column: j,
                      value: this.tableData[i].wmValue ? this.tableData[i].wmValue[j] == '' ? null : this.tableData[i].wmValue[j] : null,
                      select: false
                    })
                  }
                  listOne.push(listTwo)
                }
                this.valueList = listOne
              }
            })
        },
        selectColumn (index) {
          this.row = index
          this.column = this.tableData.length - 1
          this.starRow = index
          this.starColumn = 0
          this.changStyle()
          this.getRed()
        },
        down (res, data, event) {
          this.starRow = res
          this.starColumn = data
          if (this.$refs[parseInt(res) + '-' + parseInt(data)][0].style.background === 'red') {
            this.$refs[parseInt(res) + '-' + parseInt(data)][0].style.background = 'white'
          } else {
            this.$refs[parseInt(res) + '-' + parseInt(data)][0].style.background = 'red'
          }
          this.isDown = true
        },
        move (res, data, event) {
          window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()
          if (!this.isDown) {
            return
          } else {
            if (this.row === res && this.column === data) {
              return
            } else {
              this.row = res
              this.column = data
              this.changStyle()
            }
          }
        },
        up (res, data) {
          this.isDown = false
          this.getRed()
        },
        getRed () {
          for (var i in this.tableData) {
            for (var j in this.dayList) {
              if (this.$refs[parseInt(j) + '-' + parseInt(i)][0].style.background === 'red') {
                this.valueList[i][j].select = true
              } else {
                this.valueList[i][j].select = false
              }
            }
          }
        },
        changStyle (type) {
          console.log('123')
          // eslint-disable-next-line no-unused-vars
          var a1 = 0
          // eslint-disable-next-line no-unused-vars
          var a2 = 0
          var s1 = 0
          var s2 = 0
          if (this.starColumn < this.column) {
            s1 = this.starColumn
            s2 = this.column
          } else {
            s1 = this.column
            s2 = this.starColumn
          }
          if (this.starRow < this.row) {
            a1 = this.starRow
            a2 = this.row
          } else {
            a1 = this.row
            a2 = this.starRow
          }
          for (var z in this.tableData) {
            for (var x in this.dayList) {
              this.$refs[parseInt(x) + '-' + parseInt(z)][0].style.background = 'white'
            }
          }
          for (var q in this.valueList) {
            for (var w in this.valueList[q]) {
              if (this.valueList[q][w].select) {
                this.$refs[parseInt(w) + '-' + parseInt(q)][0].style.background = 'red'
              }
            }
          }
          for (var i = a1; i <= a2; i++) {
            for (var j = s1; j <= s2; j++) {
              this.$refs[parseInt(i) + '-' + parseInt(j)][0].style.background = 'red'
            }
          }
        },
        cannelSelect () {
          for (var i in this.valueList) {
            for (var j in this.valueList[i]) {
              this.valueList[i][j].select = false
              this.$refs[parseInt(j) + '-' + parseInt(i)][0].style.background = 'white'
            }
          }
          this.starRow = -1
          this.starColumn = -1
          this.row = -1
          this.column = -1
        },
        setWork (name) {
          for (var i in this.tableData) {
            for (var j in this.dayList) {
              if (this.$refs[parseInt(j) + '-' + parseInt(i)][0].style.background === 'red') {
                this.valueList[i][j].value = name
              }
            }
          }
        },
        save () {
          console.log(this.valueList)
          var items = this.valueList.map(res => {
            var contValue = res.map(data => {
              if (data.value === null) {
                return ''
              } else {
                return data.value
              }
            })
            var wmValue = contValue.join(',')
            return {
              employeeId: res[0].id,
              wmValue: wmValue
            }
          })
          console.log(items)
          this.$http.postJSON(this.url + '/savaWorkManagement', {
            classId: this.query.search['classId_eq'],
            wmDate: this.query.search['yearMonth_eq'],
            items: items
          }).then(res => {
            if (res.success) {
              this.$message.success(res.message)
            }
          }).catch(res => { })
        },
        initData () {
          this.getTree()
          this.search()
        },
        handleNodeClick (res) {
          this.query.search['department_ids_like'] = '/' + res.id + '/'
          this.search()
        },
        newLabel (newList) {
          if (newList) {
            for (var i = 0; i < newList.length; i++) {
              newList[i].label = newList[i].name
              newList[i].value = newList[i].id + ''
              if (newList[i].children) {
                this.newLabel(newList[i].children)
              }
              if (newList[i].children == null || newList[i].children.length === 0) {
                newList[i].children = null
              }
            }
          }
        },
        getTree () {
          this.$http
            .get('base/departmentInfos/getLevel')
            .then(data => {
              if (data.success) {
                var tree = data.content
                this.newLabel(tree)
                this.treeData = tree
              }
            })
            .catch(data => { })
        },
        cleanSearch () {
          this.query.search['no_like,name_like'] = ''
          this.query.search['department_ids_like'] = ''
          this.search()
        }
      }
    }
    </script>
    <style scoped>
    .u-table-tle {
      width: 130px;
      height: 50px;
      background: #fff;
      border: 1px solid #ddd;
      text-align: center;
      line-height: 50px;
    }
    .u-day {
      width: 100%;
      min-width: 50px;
      height: 50px;
      background: #fff;
      border: 1px solid #ddd;
    }
    
    ::-webkit-scrollbar {
      width: 10px;
      height: 6px;
    }
    ::-webkit-scrollbar-thumb {
      border-radius: 5px;
      background-color: #ddd;
    }
    ::-webkit-scrollbar-track {
      box-shadow: inset 0 0 5px rgba(100, 100, 100, 0.1);
      background: #fff;
      border-radius: 5px;
    }
    </style>

    create.vue

    <template>
      <div>
        <el-drawer
          ref="drawer"
          :title="selectId!=''?'编辑排班管理信息':'添加排班管理信息'"
          :visible.sync="drawer"
          size="500px"
          direction="rtl"
          :destroy-on-close="true"
          :show-close="false"
          :wrapper-closable="false"
          @open="initDom"
        >
          <div class="drawer__content formData">
            <div class="content-rolling">
              <el-form ref="modelForm" class="myForm" :model="modelForm" label-width="30px">
                <el-row>
                  <el-col :span="24">
                    <el-form-item label=" " prop="id">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">ID</div>
                        <el-input-number class="qy-w-100p" v-model="modelForm.id" :controls="false"></el-input-number>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="wmDate">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">时间月份</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.wmDate" placeholder="请输入时间月份"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="employeeId">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">人员id</div>
                        <el-input-number class="qy-w-100p" v-model="modelForm.employeeId" :controls="false"></el-input-number>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="employeeNo">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">人员编码</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.employeeNo" placeholder="请输入人员编码"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="employeeName">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">人员姓名</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.employeeName" placeholder="请输入人员姓名"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="departmentId">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">所属部门id</div>
                        <el-input-number class="qy-w-100p" v-model="modelForm.departmentId" :controls="false"></el-input-number>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="departmentNo">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">所属部门no</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.departmentNo" placeholder="请输入所属部门no"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="departmentName">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">所属部门</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.departmentName" placeholder="请输入所属部门"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="departmentIds">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">部门ids</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.departmentIds" placeholder="请输入部门ids"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="classId">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">所属班组id</div>
                        <el-input-number class="qy-w-100p" v-model="modelForm.classId" :controls="false"></el-input-number>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="className">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">班组名称</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.className" placeholder="请输入班组名称"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                  <el-col :span="24">
                    <el-form-item label=" " prop="wmValue">
                      <div class="el-input el-input-group el-input-group--prepend">
                        <div class="el-input-group__prepend" tabIndex="-1">排班汇总</div>
                        <el-input class="qy-w-100p"  v-model="modelForm.wmValue" placeholder="请输入排班汇总"></el-input>
                      </div>
                    </el-form-item>
                  </el-col>
                </el-row>
              </el-form>
            </div>
            <div class="demo-drawer__footer">
              <el-button-group v-if="selectId==''">
                <el-button type="primary" icon="el-icon-finished" :disabled="subLoading" @click="save('modelForm')">{{ subLoading ? '提交中 ...' : '保 存' }}</el-button>
                <el-button type="danger" icon="el-icon-finished" :disabled="subLoading" @click="save('modelForm',true)">{{ subLoading ? '提交中 ...' : '保存并退出' }}</el-button>
                <el-button type="warning" icon="el-icon-arrow-left" @click="clearData(true)">返回</el-button>
              </el-button-group>
              <el-button-group v-else>
                <el-button type="primary" icon="el-icon-finished" :disabled="subLoading" @click="save('modelForm',true)">{{ subLoading ? '提交中 ...' : '保 存' }}</el-button>
                <el-button type="warning" icon="el-icon-arrow-left" @click="clearData(true)">返回</el-button>
              </el-button-group>
            </div>
          </div>
        </el-drawer>
      </div>
    </template>
    <script>
    // 注意路径
    import dataForm from '@/mixins/dataForm.js'
    export default {
      mixins: [dataForm],
      props: {
        drawer: {
          type: Boolean
        },
        selectId: {
          type: String,
          default: ''
        }
      },
      data() {
        return {
          url: 'freq/workforceManagements',
        }
      },
      methods: {
    
      }
    }
    </script>
    <style scoped>
    
    </style>

    show.vue

    <template>
      <div>
        <el-drawer
          ref="drawer"
          title="查看排班管理详情"
          :visible.sync="drawer"
          size="500px"
          direction="rtl"
          :destroy-on-close="true"
          :show-close="false"
          :wrapper-closable="false"
        >
          <div class="show-pd">
            <table style=" 100%;" border="0">
              <tr class="show-pd-tl">
                <th style="20%;text-align:center">序号</th>
                <th style="30%;text-align:center">属性</th>
                <th style="50%"></th>
              </tr>
              <tr>
                <td style="20%;text-align:center">2</td>
                <td style="30%;text-align:center">ID</td>
                <td style="50%">{{ detail.id }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">3</td>
                <td style="30%;text-align:center">时间月份</td>
                <td style="50%">{{ detail.wmDate }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">4</td>
                <td style="30%;text-align:center">人员id</td>
                <td style="50%">{{ detail.employeeId }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">5</td>
                <td style="30%;text-align:center">人员编码</td>
                <td style="50%">{{ detail.employeeNo }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">6</td>
                <td style="30%;text-align:center">人员姓名</td>
                <td style="50%">{{ detail.employeeName }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">7</td>
                <td style="30%;text-align:center">所属部门id</td>
                <td style="50%">{{ detail.departmentId }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">8</td>
                <td style="30%;text-align:center">所属部门no</td>
                <td style="50%">{{ detail.departmentNo }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">9</td>
                <td style="30%;text-align:center">所属部门</td>
                <td style="50%">{{ detail.departmentName }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">10</td>
                <td style="30%;text-align:center">部门ids</td>
                <td style="50%">{{ detail.departmentIds }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">11</td>
                <td style="30%;text-align:center">所属班组id</td>
                <td style="50%">{{ detail.classId }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">12</td>
                <td style="30%;text-align:center">班组名称</td>
                <td style="50%">{{ detail.className }}</td>
              </tr>
              <tr>
                <td style="20%;text-align:center">13</td>
                <td style="30%;text-align:center">排班汇总</td>
                <td style="50%">{{ detail.wmValue }}</td>
              </tr>
            </table>
          </div>
          <div class="demo-drawer__footer">
            <el-button type="warning" icon="el-icon-arrow-left" @click="back()"
              >返回</el-button
            >
          </div>
        </el-drawer>
      </div>
    </template>
    <script>
    // 注意路径
    import dataDetail from "@/mixins/dataDetail.js";
    export default {
      mixins: [dataDetail],
      props: {
        drawer: {
          type: Boolean
        },
        selectId: {
          type: Number,
          default: -1
        }
      },
      data() {
        return {
          url: "freq/workforceManagements"
        };
      }
    };
    </script>
    <style scoped></style>
  • 相关阅读:
    Python 正则表达式匹配两个指定字符串中间的内容
    Switch Case 和 If Else
    MYSQL LETT/RIGHT/INNER/FUll JOIN 注意事项
    MYSQL 批处理 Packet for query is too large
    Junit单元测试不支持多线程
    postman中 form-data、x-www-form-urlencoded、raw、binary的区别
    一个项目中:只能存在一个 WebMvcConfigurationSupport (添加swagger坑)
    Nginx 转发特点URL到指定服务
    基于UDP协议的程序设计
    TcpClient类与TcpListener类
  • 原文地址:https://www.cnblogs.com/vivin-echo/p/13954455.html
Copyright © 2011-2022 走看看