index.vue 9.59 KB
<template>
  <div class="app-container">
    <div class="query-from">
      <el-form :inline="true" :model="fromParams" class="demo-form-inline">
        <el-form-item label="员工工号">
          <el-input v-model="fromParams.jobCode" placeholder="请输入工号" />
        </el-form-item>
        <el-form-item label="线路">
          <el-input v-model="fromParams.lineName" placeholder="请输入线路" />
        </el-form-item>
        <el-form-item label="车队|部门">
          <el-input v-model="fromParams.fleetName" placeholder="请输入车队|部门" />
        </el-form-item>
        <el-form-item label="异常类型">
          <el-select v-model="fromParams.errorType" width="80" placeholder="选着异常类型" clearable>
            <el-option v-for="dict in error_type" :key="dict.value" :label="dict.label" :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="报表日期" props="date" clearable>
          <!-- 日期 -->
          <el-date-picker v-model="fromParams.date" type="date" align="right" unlink-panels format="YYYY/MM/DD"
            value-format="YYYY-MM-DD"></el-date-picker>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onQuery">查询</el-button>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onExport">导出</el-button>
        </el-form-item>
      </el-form>
    </div>
    <el-col :span="24" class="card-box">
      <el-card>
        <div class="el-table el-table--enable-row-hover el-table--medium">
          <table cellspacing="0" style="width: 100%">
            <tbody>
              <tr>
                <td class="el-table__cell is-leaf">
                  <div class="cell">打卡异常</div>
                </td>
                <td class="el-table__cell is-leaf">
                  <div class="cell">{{ signErrorCount }}</div>
                </td>
                <td class="el-table__cell is-leaf">
                  <div class="cell">设备异常</div>
                </td>
                <td class="el-table__cell is-leaf">
                  <div class="cell">{{ equipmentErrorCount }}</div>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
      </el-card>
    </el-col>
    <el-dropdown :hide-on-click="false">
      <span class="el-dropdown-link">
        选中展示字段
        <el-icon class="el-icon--right">
          <el-icon>
            <Setting />
          </el-icon>
        </el-icon>
      </span>
      <template #dropdown>
        <el-dropdown-menu>
          <el-dropdown-item v-for="(item, index) in showFields">
            <el-checkbox v-model="item.showFlag" :label="item.label" size="large" />
          </el-dropdown-item>
        </el-dropdown-menu>
      </template>
    </el-dropdown>
    <el-table max-height="500" v-loading="loading" row-key="id" :data="tableData"
      @selection-change="handleSelectionChange" border default-expand-all>
      <el-table-column label="序号" fixed="left" type="index" width="60" align="center">
        <template #default="scope">
          {{ (currentPage - 1) * size + scope.$index + 1 }}
        </template>
      </el-table-column>
      <el-table-column label="工号" align="center" v-if="showFields[0].showFlag" prop="jobCode" fixed="left" sortable />
      <el-table-column label="姓名" align="center" v-if="showFields[1].showFlag" prop="name" fixed="left" sortable />
      <el-table-column label="部门" align="center" v-if="showFields[2].showFlag" prop="fleetName" fixed="left" sortable />
      <el-table-column label="车辆自编号" align="center" v-if="showFields[3].showFlag" prop="nbbm" sortable width="200" />
      <el-table-column label="线路" align="center" v-if="showFields[4].showFlag" prop="lineName" sortable />
      <el-table-column label="计划时间" align="center" v-if="showFields[6].showFlag" prop="planTime" width="160" sortable />
      <el-table-column label="时间" align="center" v-if="showFields[5].showFlag" prop="createTime" width="160" sortable />
      <el-table-column label="场地" align="center" v-if="showFields[7].showFlag" prop="siteName" sortable width="160" />
      <el-table-column label="图片" align="center" v-if="showFields[8].showFlag" prop="image">
        <template #default="scope">
          <image-preview :src="scope.row.image" :width="50" :height="50" />
        </template>
      </el-table-column>
      <el-table-column label="异常类型" align="center" width="130" fixed="right" v-if="showFields[9].showFlag" prop="exType"
        sortable>
        <template #default="scope">
          <dict-tag :options="error_type" :value="scope.row.exType" />
        </template>
      </el-table-column>
      <el-table-column label="类型" align="center" v-if="showFields[10].showFlag" prop="title" sortable fixed="right"
        width="180" />
      <el-table-column label="详情" align="center" v-if="showFields[11].showFlag" prop="remark" width="300" fixed="right" />
    </el-table>
    <div style=" padding: 32px 16px; ">
      <div style="position: absolute;right: 0;">
        <el-pagination v-model:current-page="currentPage" v-model:page-size="size" :page-sizes="pageSizes"
          layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
          @current-change="handleCurrentChange" />
      </div>
    </div>

    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
      <el-text style=" white-space: pre-line; color: red;" class="mx-1" type="danger">{{ notice.noticeContent }}</el-text>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="handleNotice">确 定</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import { getErrorReportList, getNotice, sureNotice } from "@/api/report/report.js";
import moment from "moment";
import { computed, onMounted, ref } from "vue";
const { proxy } = getCurrentInstance();
const { error_type } = proxy.useDict('error_type');
const open = ref(false);
const fromParams = ref({});
const ids = ref([]);
const inList = ref([]);
const loading = ref(false);
const page = ref(1) //第几页
const size = ref(10) //一页多少条
const total = ref(0); //总条目数
const pageSizes = [5, 10, 20, 50]; //每页显示多少条
const tableData = ref([]) // 表格数据
const currentPage = ref(1) // 当前页
const timer = ref(0);
const notice = ref({})
const title = ref("")
// 获取间隔
const timeCount = ref(10000);

// 设置显示字段
const showFields = ref([{
  showFlag: true,
  label: "工号"
}, {
  showFlag: true,
  label: "姓名"
}, {
  showFlag: true,
  label: "部门"
}, {
  showFlag: true,
  label: "车辆自编号"
}, {
  showFlag: true,
  label: "线路"
}, {
  showFlag: true,
  label: "时间"
}, {
  showFlag: true,
  label: "计划时间"
}, {
  showFlag: false,
  label: "场地"
}, {
  showFlag: false,
  label: "图片"
}, {
  showFlag: true,
  label: "异常类型"
}, {
  showFlag: false,
  label: "类型"
}, {
  showFlag: true,
  label: "原因"
}])

const signErrorCount = computed(() => {
  return inList.value.filter(item => item.exType != 4).length
})
const equipmentErrorCount = computed(() => {
  return inList.value.filter(item => item.exType == 4).length
})

onDeactivated(() => {
  clearInterval(timer.value)
})
onBeforeUnmount(() => {
  clearInterval(timer.value)
})

onMounted(() => {
  const currentTime = moment().format('HH:mm');
  if (currentTime < '02:30') {
    fromParams.value.date = moment().subtract(1, 'day').format('YYYY-MM-DD');
  } else {
    fromParams.value.date = moment().format("YYYY-MM-DD");
  }
  // 初始化数据
  getList();

  // 获取通告
  timer.value = setInterval(() => {
    getNotice().then(res => {
      notice.value = res.data
      if (notice.value) {
        open.value = true
        title.value = notice.value.noticeTitle
        clearInterval(timer.value)
      }
    });
  }, timeCount.value);
});
const getTabelData = () => {
  //inList为全部数据
  tableData.value = inList.value.slice(
    (page.value - 1) * size.value,
    page.value * size.value
  );
  total.value = inList.value.length;
}
const handleSizeChange = (val) => {
  size.value = val;
  getTabelData();
}
const handleCurrentChange = (val) => {
  page.value = val;
  getTabelData();
}

const getList = () => {
  loading.value = true;
  getErrorReportList({
    jobCode: fromParams.value.jobCode ? fromParams.value.jobCode : "",
    exType: fromParams.value.errorType ? fromParams.value.errorType : "",
    startTime: fromParams.value.dateRange ? fromParams.value.dateRange[0] : "",
    date: fromParams.value.date ? fromParams.value.date : "",
    fleetName: fromParams.value.fleetName ? fromParams.value.fleetName : "",
    lineName: fromParams.value.lineName ? fromParams.value.lineName : ""

  }).then((res) => {
    inList.value = res.data
    loading.value = false;
    getTabelData();
  });
};
const onQuery = () => {
  getList();
};
// 导出
const onExport = () => {
  proxy.download('report/error/export', { ...fromParams.value }, `${fromParams.value.date}异常报表.xlsx`)
}
const handleSelectionChange = (val) => {
  ids.value = val.map(item => item.id)
};
const handleNotice = () => {
  sureNotice(notice.value).then(res => {
    open.value = false;
  })
}
watch(open, (val1, val2) => {
  if (!open.value) {
    clearInterval(timer.value)
    timer.value = setInterval(() => {
      getNotice().then(res => {
        notice.value = res.data
        if (notice.value) {
          open.value = true
          clearInterval(timer.value)
        }
      });
    }, timeCount.value);
  }

})
</script>

<style lang="scss" scoped>
</style>