riku
2025-07-08 91513e171078ed6b0887f87b9fced33895d6d3fb
src/components/inspection/TaskItem.vue
@@ -1,110 +1,155 @@
<template>
  <el-row justify="start">
    <el-text>{{ name }}</el-text>
  </el-row>
  <div>
    <el-text>总量</el-text>
    <el-text size="default">{{ completetask + '/' + totaltask }}</el-text>
    <el-progress
      style="width: 300px"
      type="line"
      status="warning"
      :text-inside="true"
      :stroke-width="18"
      :striped="percentFormat(completetask, totaltask) < 100"
      striped-flow
      :percentage="percentFormat(completetask, totaltask)"
    >
      <template #default="{ percentage }">
        <span class="percentage-value">{{ percentage }}%</span>
  <div v-if="value" class="wrapper">
    <el-row justify="center">
      <el-text size="large">{{ value.districtName }}</el-text>
      <!-- <el-tag type="info">{{ value.districtName }}</el-tag> -->
    </el-row>
    <div>
      <div class="text_title">实施进度</div>
      <template v-if="value._totaltask > 0">
        <el-space>
          <!-- <el-text size="default">{{ value._completetask + '/' + value._totaltask }}</el-text> -->
          <el-text>总计</el-text>
          <el-progress
            style="width: 350px"
            type="line"
            status="warning"
            :text-inside="true"
            :stroke-width="22"
            :striped="percentFormat(value._completetask, value._totaltask) < 100"
            striped-flow
            :percentage="percentFormat(value._completetask, value._totaltask)"
          >
            <template #default="{ percentage }">
              <span class="percentage-value">{{
                `${value._completetask}/${value._totaltask} (${percentage}%)`
              }}</span>
            </template>
          </el-progress>
        </el-space>
      </template>
    </el-progress>
  </div>
  <!-- </el-col> -->
  <!-- <el-col span="12" class="flex-bottom"> -->
  <!-- <div>{{ name }}</div> -->
  <!-- <div>{{ planTime }}</div> -->
  <!-- <div>{{ userName }}</div> -->
  <el-row class="m-t-8">
    <div
      align="center"
      :style="'width: ' + 300 / count.length + 'px'"
      v-for="item in count"
      :key="item.sceneType"
    >
      <el-progress
        :stroke-width="18"
        status="exception"
        :text-inside="true"
        :striped="percentFormat(item.finish, item.total) < 100"
        striped-flow
        :percentage="percentFormat(item.finish, item.total)"
      >
        <template #default="{ percentage }">
          <span class="percentage-value-small">{{ percentage }}%</span>
        </template>
      </el-progress>
      <el-text size="small" truncated>{{ item.sceneType }}</el-text>
      <!-- <el-text size="small">{{ item.finish + '/' + item.total }}</el-text> -->
      <!-- <span class="percentage-value-small">{{ percentFormat(item.finish, item.total) }}%</span> -->
      <!-- <div class="percentage-label-small">{{ item.sceneType }}</div> -->
      <!-- <span class="percentage-label-small">{{ item.finish + '/' + item.total }} </span> -->
      <template v-else>
        <el-space>
          <!-- <el-text size="default">{{ value.completetask + '/' + value.totaltask }}</el-text> -->
          <el-text>总计</el-text>
          <el-progress
            style="width: 350px"
            type="line"
            status="warning"
            :text-inside="true"
            :stroke-width="22"
            :striped="percentFormat(value.completetask, value.totaltask) < 100"
            striped-flow
            :percentage="percentFormat(value.completetask, value.totaltask)"
          >
            <template #default="{ percentage }">
              <span class="percentage-value">{{
                `${value.completetask}/${value.totaltask} (${percentage}%)`
              }}</span>
            </template>
          </el-progress>
        </el-space>
      </template>
    </div>
  </el-row>
    <!-- </el-col> -->
    <!-- <el-col span="12" class="flex-bottom"> -->
    <!-- <div>{{ name }}</div> -->
    <!-- <div>{{ planTime }}</div> -->
    <!-- <div>{{ userName }}</div> -->
    <!-- :style="'width: ' + 300 / value.count.length + 'px'" -->
    <!-- <el-row class="m-t-8"> -->
    <div v-for="item in value.count" :key="item.sceneType">
      <el-space v-if="item.finish > 0">
        <el-text size="default" truncated>{{ item.sceneType }}</el-text>
        <el-progress
          :style="'width:' + width"
          :stroke-width="16"
          status="exception"
          :text-inside="true"
          :striped="percentFormat(item.finish, item.total) < 100"
          striped-flow
          :percentage="percentFormat(item.finish, item.total)"
        >
          <template #default="{ percentage }">
            <span class="percentage-value-small">{{
              `${item.finish}/${item.total} (${percentage}%)`
            }}</span>
          </template>
        </el-progress>
        <!-- <el-text size="small">{{ item.finish + '/' + item.total }}</el-text> -->
        <!-- <span class="percentage-value-small">{{ percentFormat(item.finish, item.total) }}%</span> -->
        <!-- <div class="percentage-label-small">{{ item.sceneType }}</div> -->
        <!-- <span class="percentage-label-small">{{ item.finish + '/' + item.total }} </span> -->
      </el-space>
    </div>
    <div>
      <div class="text_title">日程进度</div>
      <el-space>
        <el-text style="color: transparent">日程</el-text>
        <el-progress
          style="width: 350px"
          type="line"
          color="#00b487"
          :text-inside="true"
          :stroke-width="22"
          :percentage="percentFormat(date, dayCount)"
        >
          <template #default="{ percentage }">
            <span class="percentage-value">{{ `${dateStr} (${percentage}%)` }}</span>
          </template>
        </el-progress>
      </el-space>
    </div>
    <!-- </el-row> -->
  </div>
</template>
<script>
<script setup>
import { ref, computed } from 'vue'
import { useAreaStore } from '@/stores/area.js'
import dayjs from 'dayjs'
/**
 * 巡查任务区域统计信息
 */
export default {
  props: {
    name: String,
    province: String,
    district: String,
    planTime: String,
    startTime: String,
    endTime: String,
    userName: String,
    status: String,
    totaltask: Number,
    completetask: Number,
const areaStore = useAreaStore()
    count: Array
  },
  data() {
    return {}
  },
  watch: {},
  computed: {
    // total() {
    //   let t = 0
    //   this.count.forEach((c) => {
    //     t += c.total
    //   })
    //   return t
    // },
    // finish() {
    //   let t = 0
    //   this.count.forEach((c) => {
    //     t += c.finish
    //   })
    //   return t
    // }
  },
  methods: {
    percentFormat(finish, total) {
      if (total == 0) {
        return 0
      } else {
        const per = finish / total > 1 ? 1 : finish / total
        return Math.round(per * 100)
      }
    },
    format(percentage) {
      percentage === 100 ? 'Full' : `${percentage}%`
    }
const props = defineProps({
  value: Object
})
const width = ref('300px')
const dayCount = computed(() => dayjs(areaStore.area.endtime).daysInMonth())
const date = computed(() => {
  const today = dayjs()
  const planEndTime = dayjs(areaStore.area.endtime)
  if (today.isBefore(planEndTime)) {
    return today.date()
  } else {
    return planEndTime.daysInMonth()
  }
})
const dateStr = computed(() => {
  const today = dayjs()
  const planEndTime = dayjs(areaStore.area.endtime)
  if (today.isBefore(planEndTime)) {
    return today.format('MM月DD日')
  } else {
    return today.format('MM月DD日')
  }
})
function percentFormat(finish, total) {
  if (total == 0) {
    return 0
  } else {
    const per = finish / total > 1 ? 1 : finish / total
    return Math.round(per * 100)
  }
}
function format(percentage) {
  percentage === 100 ? 'Full' : `${percentage}%`
}
</script>
@@ -112,6 +157,20 @@
.wrapper {
  border: var(--el-border);
  border-radius: var(--el-border-radius-base);
  box-shadow: var(--el-box-shadow-lighter);
  background-color: rgba(161, 161, 161, 0.068);
  padding: 8px 8px;
  margin-bottom: 4px;
}
.text_title {
  border-left: 6px solid rgb(49, 221, 6);
  border-bottom: 1px solid rgb(49, 221, 6);
  padding: 0px 4px 0px 4px;
  width: 100px;
  font-size: 15px;
  margin-bottom: 4px;
  /* color: #00b487; */
}
.flex-bottom {
@@ -139,4 +198,7 @@
  /* margin-top: 10px; */
  font-size: var(--el-font-size-small);
}
:deep(.el-progress-bar__outer) {
  background-color: rgba(211, 211, 211, 0.411);
}
</style>