''
liukangdong
2024-06-17 e8e0e31be5f27e657de6f07f57a20fdf70e9bb9b
admin/src/components/operation/OperCarUseBookParamWindow.vue
@@ -7,39 +7,65 @@
    @confirm="confirm"
  >
    <div class="modal_wrap">
      <el-form :model="form" ref="form" class="el_form" :rules="rules">
      <el-form :model="form" ref="formRef" class="el_form" :rules="rules">
        <el-form-item label="用车范围" prop="type">
          <el-radio v-model="form.type" :label="0">室内用车</el-radio>
          <el-radio v-model="form.type" :label="1">室外用车</el-radio>
          <el-radio v-model="form.type" style="width: 80px;" :label="0">市内用车</el-radio>
          <el-radio v-model="form.type" style="width: 80px;" :label="1">市外用车</el-radio>
        </el-form-item>
        <el-form-item label="选择车辆" prop="carId">
          <el-select v-model="form.carId" placeholder="选择车辆">
            <el-option
              v-for="item in carsList"
              :key="item.carId"
              :label="item.carCode"
              :value="item.carId"
              :key="item.id"
              :label="item.code"
              :value="item.id"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="用车时间" prop="sortnum">
          <div></div>
          <div class="sel_btn" @click="openTime">选择时间</div>
        <el-form-item label="用车时间" prop="startTime">
          <div
            v-if="form.startTime && form.endTime"
            class="sel_btn text"
            @click="openTime"
          >
            {{ form.startTime }}-{{ form.endTime }}
          </div>
          <div v-else class="sel_btn" @click="openTime">选择时间</div>
        </el-form-item>
        <el-form-item label="预计出发时间" prop="sortnum">
        <el-form-item label="预计出发时间" prop="planUseDate">
          <el-date-picker
            v-model="form.a"
            :disabled="!form.startTime"
            v-model="form.planUseDate"
            format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss"
            :picker-options="pickerOptions"
            default-time="08:00:00"
            type="datetime"
            placeholder="选择日期时间"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="目的地" prop="sortnum">
        <el-form-item label="目的地" prop="addr">
          <el-input v-model="form.addr" placeholder="请输入内容"></el-input>
        </el-form-item>
        <el-form-item label="乘车人员" prop="sortnum"> </el-form-item>
        <el-form-item label="用车事由" prop="sortnum">
        <el-form-item label="乘车人员" prop="memberIds">
          <el-select
            v-model="form.memberIds"
            multiple
            filterable
            placeholder="请选择"
          >
            <el-option
              v-for="item in memberList"
              :key="item.id"
              :label="item.name"
              :value="item.id"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="用车事由" prop="content">
          <el-input
            v-model="form.content"
            type="textarea"
@@ -48,16 +74,23 @@
          ></el-input>
        </el-form-item>
      </el-form>
      <div class="tip_wrap">111</div>
      <div class="tip_wrap">
        <h1>注意事项:</h1>
        <div>1、公司车辆外出需办理用车申请表,经批准后方可外出(借出)。</div>
        <div>2、市外用车需领导审核。</div>
        <div>3、借出车辆必须遵守交通规则,安全行驶。对于车辆发生交通意外,对当事人及第三方造成人身伤害及损失,公司可以协助处理保险公司赔偿相关事宜,但不承担任何责任和费用。</div>
        <div>4、公司借给申请人用车,申请借车人为第一责任人,不允许转借给其他人使用,若要借给他人使用。责任人要承担全部责任。</div>
      </div>
    </div>
    <!-- 市内 -->
    <el-dialog
      title="选择用车时间"
      :visible.sync="isShowTime"
      append-to-body
      width="600px"
    >
      <el-form :model="form" ref="form" class="el_form" :rules="rules">
      <el-form :model="form" ref="modalRef" class="el_form" :rules="rules">
        <el-form-item label="用车日期" prop="dateDay">
          <el-date-picker
            v-model="form.dateDay"
@@ -80,12 +113,92 @@
                @click="datetimeClick(item, i)"
                v-for="(item, i) in timeList"
                :key="i"
                >{{ item.startHours }}-{{ item.endHours }}</div
              >
                {{ item.startHours }}-{{ item.endHours }}
              </div>
            </div>
          </div>
        </el-form-item>
      </el-form>
      <div class="color_op">
        <div class="item" v-for="item in colorOptions" :key="item.name">
          <div class="box" :style="{ background: item.color }"></div>
          <div class="">{{ item.name }}</div>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <div>已选择:{{ selDatetime }}</div>
        <div class="btn" @click="subTime">确认时间</div>
      </span>
    </el-dialog>
    <!-- 市外 -->
    <el-dialog
      title="选择用车时间"
      :visible.sync="isShowShiwai"
      append-to-body
      width="600px"
    >
      <el-form :model="form" ref="modalRef" class="el_form" :rules="rules">
        <el-form-item label="用车开始时间" prop="startTime">
          <el-date-picker
            v-model="form.startTime"
            format="yyyy-MM-dd HH:mm"
            value-format="yyyy-MM-dd HH:mm:ss"
            type="datetime"
            :picker-options="pickerOptions"
            default-time="08:00:00"
            @change="seletedShiwaiDate"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="用车结束时间" prop="endTime">
          <el-date-picker
            v-model="form.endTime"
            format="yyyy-MM-dd HH:mm"
            value-format="yyyy-MM-dd HH:mm:ss"
            type="datetime"
            :picker-options="pickerOptions"
            default-time="08:00:00"
            @change="seletedShiwaiDate"
          >
          </el-date-picker>
        </el-form-item>
      </el-form>
      <div class="have_info" v-if="info && info.length > 0">
        <div class="tit">您申请的用车时段已有车辆预约</div>
        <div class="content" v-for="(item, i) in info" :key="i">
          <div class="card">{{ item.carCode }}</div>
          <div class="line">
            <span>用车时段</span>
            <span>
              {{ item.startTime.slice(5, 16) }}至{{
                item.endTime.slice(5, 16)
              }}</span
            >
          </div>
          <div class="line">
            <span>目的地</span>
            <span>{{ item.addr }}</span>
          </div>
          <div class="line">
            <span>乘车人数</span>
            <span>{{ item.memberIds.split(",").length }}人</span>
          </div>
          <div class="line">
            <text>用车事由</text>
            <text>{{ item.content }}</text>
          </div>
          <div class="line">
            <span>申请人</span>
            <span>{{ item.memberName }} {{ item.memberMobile }}</span>
          </div>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <div>已选择:{{ selDatetime }}</div>
        <div class="btn" @click="subTime">确认时间</div>
      </span>
    </el-dialog>
  </GlobalWindow>
</template>
@@ -95,7 +208,8 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
import { allList as getCarList } from '@/api/business/cars'
import { carCanReservationDate } from '@/api/business/carUseBook'
import { carCanReservationDate, carUseBookCraete, carUseBookList } from '@/api/business/carUseBook'
import { findTypeMemberInfo } from '@/api/business/memberCard'
export default {
  name: 'OperCarUseBookParamWindow',
  extends: BaseOpera,
@@ -104,18 +218,45 @@
    return {
      // 表单数据
      isShowTime: false,
      isShowShiwai: false,
      memberList: [],
      timeList: [],
      selDatetime: '',
      colorOptions: [
        { color: this.$store.state.primaryColor, name: '已选择' },
        { color: '#F7F7F7', name: '可预约' },
        { color: '#cccccc', name: '不可预约' }
      ],
      info: [],
      carsList: [],
      form: {
        type: 0
        type: 0,
        memberIds: []
      },
      pickerOptions: {
        disabledDate: (time) => {
          if (this.form.startTime && this.form.endTime) {
            const minTime = new Date(this.form.startTime).getTime() - 8.64e7
            return (
              time.getTime() < minTime
            )
          } else {
            return time.getTime() < Date.now() - 8.64e7
          }
        }
      },
      // 验证规则
      rules: {
        name: [
          { required: true, message: '请输入名称' }
        ]
        type: [{ required: true, message: '请选择', trigger: 'change' }],
        carId: [{ required: true, message: '请选择', trigger: 'change' }],
        startTime: [{ required: true, message: '请选择', trigger: 'change' }],
        endTime: [{ required: true, message: '请选择', trigger: 'change' }],
        planUseDate: [{ required: true, message: '请选择', trigger: 'change' }],
        addr: [{ required: true, message: '请输入', trigger: 'blur' }],
        memberIds: [{ type: 'array', required: true, message: '请选择', trigger: 'change' }],
        content: [{ required: true, message: '请输入', trigger: 'blur' }]
      }
    }
  },
@@ -125,54 +266,161 @@
  methods: {
    open () {
      this.title = '新建公务车用车申请'
      this.form = {
        type: 0,
        memberIds: []
      }
      this.$nextTick(() => {
        this.$refs.formRef.clearValidate()
      })
      this.visible = true
    },
    confirm () {
      const form = JSON.parse(JSON.stringify(this.form))
      this.$refs.formRef.validate((valid) => {
        const memberList = []
        form.memberIds.forEach(i => {
          this.memberList.forEach(item => {
            if (i === item.id) {
              memberList.push(item)
            }
          })
        })
        form.memberNames = memberList.map(i => i.name).join(',')
        form.memberList = memberList
        form.memberIds = form.memberIds.join(',')
        if (valid) {
          carUseBookCraete({
            ...form
          }).then(res => {
            this.visible = false
            this.$emit('success')
          })
        }
      })
    },
    openTime () {
      const { form } = this
      if(!form.carId){
        this.$tip.warning('请先选择车辆')
      if (!form.carId) {
        return this.$tip.error('请先选择车辆')
      }
      this.isShowTime = true
      if (this.form.type === 0) {
        this.isShowTime = true
      } else {
        this.isShowShiwai = true
      }
    },
    subTime () {
      if (this.form.type === 0) {
        const selTimeList = this.timeList.filter(i => i.checked == '1')
        if (selTimeList.length === 0) {
          return this.$tip.error('请先选择用车时间段')
        }
        this.$set(this.form, 'startTime', selTimeList[0].startTime)
        this.$set(this.form, 'endTime', selTimeList[selTimeList.length - 1].endTime)
        this.isShowTime = false
        this.$set(this.form, 'planUseDate', null)
        this.$forceUpdate()
      } else {
        this.$refs.modalRef.validate((valid) => {
          this.isShowShiwai = false
        })
      }
    },
    datetimeClick (item, index) {
      if (item.isUse == '1') return
      const { timeList } = this
      const selTimeList = timeList.filter(i => i.checked == '1')
      if (selTimeList.length === 0) {
        this.timeList.forEach((ite, i) => {
          if (i === index) {
            ite.checked = '1'
            this.$forceUpdate()
          }
        })
      } else {
        const findIndex = selTimeList.findIndex(i => i.index === index)
        console.log('findIndex', findIndex)
        if (findIndex === -1) {
          const startNum = index - selTimeList[0].index
          const endNum = index - selTimeList[selTimeList.length - 1].index
          if (startNum == 1 || startNum == -1 || endNum == 1 || endNum == -1) {
            console.log('相邻')
            item.checked = true
            this.$forceUpdate()
          } else {
            return this.$tip.error('请选择相邻的时间段')
          }
        } else {
          if (index === selTimeList[0].index || index === selTimeList[selTimeList.length - 1].index) {
            item.checked = false
            this.$forceUpdate()
          } else {
            return this.$tip.error('请先取消最外层的时间段')
          }
        }
      }
      const selTimeLists = this.timeList.filter(i => i.checked == '1')
      // console.log('selTimeList', selTimeList);
      if (selTimeLists.length === 0) {
        this.selDatetime = ''
      } else {
        this.selDatetime = this.form.dateDay.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[selTimeLists.length - 1].endHours
      }
    },
    seletedDate (e) {
      console.log(e)
      const item = e.value[0]
      this.$set(this.param, 'carCode', item.code)
      this.$set(this.param, 'carId', item.id)
      if (this.param.carId && this.param.queryDate) {
        this.gettimes()
      this.gettimes()
    },
    seletedShiwaiDate () {
      const { form } = this
      if (form.startTime && form.endTime) {
        this.selDatetime = form.startTime + '-' + form.endTime
        carUseBookList({
          carId: form.carId,
          startTime: form.startTime,
          endTime: form.endTime
        }).then(res => {
          this.info = res || []
        })
      }
      this.isShowCar = false
    },
    gettimes () {
      const { param } = this
      const { form } = this
      carCanReservationDate({
        dateDay: param.queryDate,
        carId: param.carId
        dateDay: form.dateDay,
        carId: form.carId
      }).then(res => {
        if (res.code === 200) {
          this.timeList = res.data || []
          this.timeList.forEach((i, j) => {
            i.checked = '0',
            i.index = j
          })
        }
        this.timeList = res || []
        this.timeList.forEach((i, j) => {
          i.checked = '0',
          i.index = j
        })
      })
    },
    initData () {
      getCarList({
        type: 1
      }).then(res => {
        this.carsList = res.data || []
        this.carsList = res
      })
      findTypeMemberInfo({
        type: '2'
      }).then(res => {
        this.memberList = res || []
      })
    }
  }
}
</script>
<style lang="scss" scoped>
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
div{
  box-sizing: border-box;
}
.modal_wrap {
  display: flex;
  padding: 20px 0;
  .el_form {
    flex: 1;
    .sel_btn {
@@ -181,16 +429,109 @@
      border-radius: 4px;
      border: 1px solid #dcdfe6;
      margin-top: 32px;
      text-align: right;
      text-align: left;
      padding-left: 12px;
      color: #999999;
      padding-right: 12px;
      box-sizing: border-box;
      cursor: pointer;
    }
    .text {
      color: #606266;
    }
  }
  .tip_wrap {
    width: 460px;
    flex: 1;
    margin-left: 30px;
    padding: 0 30px;
    h1{
      margin-bottom: 20px;
    }
    div{
      line-height: 28px;
    }
  }
}
.time_list {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  .item {
    width: 154px;
    height: 32px;
    line-height: 32px;
    text-align: center;
    background: #f7f7f7;
    border-radius: 4px;
    margin-bottom: 10px;
  }
  .active {
    background-color: $primary-color;
    color: #fff;
  }
  .disable {
    background-color: #cccccc;
    color: #999999;
  }
}
.color_op {
  display: flex;
  .item {
    display: flex;
    align-items: center;
    margin-right: 10px;
    .box {
      margin-right: 4px;
      width: 16px;
      height: 16px;
    }
  }
}
.dialog-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  .btn {
    height: 42px;
    line-height: 42px;
    background-color: $primary-color;
    color: #fff;
    width: 120px;
    text-align: center;
  }
}
.have_info {
  padding: 0 0 120px;
  .tit {
    color: #ed4545;
    margin: 20px 0 12px;
  }
  .content {
    background: #f7f7f7;
    border-radius: 8px;
    padding: 15px 15px 5px;
    margin-bottom: 10px;
    .card {
      margin-bottom: 15px;
      font-weight: 500;
      font-size: 16px;
      color: #222222;
      background: #f7f7f7;
      padding: 0;
    }
    .line {
      display: flex;
      margin-bottom: 10px;
      text {
        &:nth-of-type(1) {
          width: 80px;
          color: #888888;
        }
        &:nth-of-type(2) {
          flex: 1;
        }
      }
    }
  }
}
</style>