feiyu02
2025-09-17 b330e57051e54789eb83d10dc58c4d9d10c608e1
src/views/fysp/check/ProCheck.vue
@@ -3,59 +3,120 @@
    <template #header>
      <SearchBar @on-submit="search">
        <template #summary>
          <CompSubTaskStatistic :subtasks="subtasks"/>
          <CompSubTaskStatistic
            :loading="sideLoading"
            :sceneType="sceneTypeId"
            :subtasks="subtasks"
            :monitorObjList="curMonitorObjList"
          />
        </template>
      </SearchBar>
    </template>
    <template #aside>
      <SideList
        legend
        :items="subtasks"
        :loading="sideLoading"
        @item-click="chooseSubtask"
      ></SideList>
    </template>
    <template #main>
      <ToolBar
        :title="curSubtask.title"
        :descriptions="proStatus"
        :buttons="buttons"
        :loading="mainLoading"
      ></ToolBar>
      <el-scrollbar
        v-if="curProList.length > 0"
        class="el-scrollbar"
        v-loading="mainLoading"
      >
        <CompProblemCard
          v-for="(p, i) in curProList"
          :key="i"
          :index="i+1"
          :problem="p"
          @submit="updateSubtask"
        ></CompProblemCard>
      <el-scrollbar>
        <ToolBar
          :title="curSubtask.title"
          :descriptions="proStatus"
          :buttons="buttons"
          :loading="mainLoading"
        ></ToolBar>
        <el-scrollbar
          v-if="curProList.length > 0"
          class="scrollbar-inner"
          v-loading="mainLoading"
        >
          <CompProblemCard
            :key="i"
            v-for="(p, i) in curProList"
            :index="i + 1"
            :problem="p"
            :subtask="curSubtask.data"
            :topTask="topTask"
            @submit="updateSubtask"
            @check="handleProblemCheck"
          ></CompProblemCard>
        </el-scrollbar>
        <el-empty v-else description="暂无问题" v-loading="mainLoading" />
      </el-scrollbar>
      <el-empty v-else description="暂无记录" v-loading="mainLoading" />
    </template>
  </BaseContentLayout>
  <CompProblemAddOrUpd
    title="新增问题"
    v-if="proAddOrUpdDialogVisible"
    v-model:visible="proAddOrUpdDialogVisible"
    :subtask="curSubtask.data"
    :topTask="topTask"
    ref="compProblemAddOrUpdRef"
    @cancel="onAddProCanceled"
    @submit="updateSubtask"
  />
  <ArbitraryPhoto
    v-if="anyPhotoDialog"
    v-model:dialog-visible="anyPhotoDialog"
    :readonly="true"
    :subtask="curSubtask.data"
    ref="arbitraryPhotoRef"
  ></ArbitraryPhoto>
  <CompDeviceShowTest
    title="设施设备"
    v-model:visible="deviceShowDialog"
    v-if="deviceShowDialog"
    ref="deviceShowRef"
  >
  </CompDeviceShowTest>
  <SceneEditDialog
    v-model="sceneInfoDialog"
    :sceneId="curSubtask.data ? curSubtask.data.sceneId : undefined"
  ></SceneEditDialog>
</template>
<script>
import ArbitraryPhoto from './components/ArbitraryPhoto.vue';
import taskApi from '@/api/fysp/taskApi';
import problemApi from '@/api/fysp/problemApi';
import ProCheckProxy from './ProCheckProxy';
import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
import CompProblemAddOrUpd from './components/CompProblemAddOrUpd.vue';
import CompProblemCard from './components/CompProblemCard.vue';
import CompSubTaskStatistic from './components/CompSubTaskStatistic.vue';
import CompDeviceShowTest from './components/CompDeviceShowTest.vue';
import SceneEditDialog from '@/views/fysp/scene/SceneEditDialog.vue';
export default {
  components: { CompProblemCard, CompSubTaskStatistic },
  components: {
    CompProblemCard,
    CompSubTaskStatistic,
    CompProblemAddOrUpd,
    ArbitraryPhoto,
    CompDeviceShowTest,
    SceneEditDialog
  },
  data() {
    return {
      // 设备图对话框
      deviceShowDialog: false,
      // 任意图对话框
      anyPhotoDialog: false,
      // 新增问题对话框
      proAddOrUpdDialogVisible: false,
      // 基本信息对话框
      sceneInfoDialog: false,
      //左侧菜单栏加载状态
      sideLoading: false,
      //右侧内容栏加载状态
      mainLoading: false,
      // 总任务
      topTask: {},
      // 场景类型id
      sceneTypeId: undefined,
      // 总任务巡查计划清单
      curMonitorObjList: [],
      //子任务列表
      subtasks: [],
      //当前选中的任务
@@ -65,117 +126,80 @@
      //操作按钮
      buttons: [
        {
          name: '新增问题',
          name: '场景信息',
          color: 'success',
          // color: 'primary',
          click: () => {
            this.sceneInfoDialog = true;
          }
        },
        {
          name: '任意图片',
          color: 'warning',
        },
        {
          name: '批量审核',
          name: '新增问题',
          // color: 'success',
          color: 'primary',
          click: () => {
            this.proAddOrUpdDialogVisible = true;
          }
        },
      ],
        {
          name: '场景图片',
          // color: 'warning',
          color: 'primary',
          click: () => {
            this.anyPhotoDialog = true;
          }
        },
        {
          name: '设施设备',
          color: 'primary',
          click: () => {
            this.openDeviceShowDialog();
          }
        }
        // {
        //   name: '批量审核',
        //   color: 'primary',
        //   click: () => {}
        // }
      ]
    };
  },
  computed: {
    //问题状态
    proStatus() {
      return ProCheckProxy.proStatusArray(this.curProList);
    },
    //任务问题审核情况统计信息
    summary() {
      const _summary = [
        {
          name: '任务总计',
          value: 0,
          type: 'info',
        },
        {
          name: '问题未审核',
          value: 0,
          type: 'success',
          icon: 'SuccessFilled',
        },
        {
          name: '问题部分审核',
          value: 0,
          type: 'success',
          icon: 'SuccessFilled',
        },
        {
          name: '问题全部审核',
          value: 0,
          type: 'success',
          icon: 'SuccessFilled',
        },
        {
          name: '未整改',
          value: 0,
          type: 'info',
          icon: 'WarningFilled',
        },
        {
          name: '整改未审核',
          value: 0,
          type: 'info',
          icon: 'WarningFilled',
        },
        {
          name: '整改部分审核',
          value: 0,
          type: 'warning',
          icon: 'WarningFilled',
        },
        {
          name: '整改全部审核',
          value: 0,
          type: 'warning',
          icon: 'WarningFilled',
        },
      ];
      this.subtasks.forEach((s) => {
        _summary[0].value++;
        if (s.data.proNum == 0) {
          _summary[1].value++;
        } else if (s.data.proCheckedNum == 0) {
          _summary[3].value++;
        } else if (s.data.proCheckedNum < s.data.proNum) {
          _summary[2].value++;
        } else {
          _summary[1].value++;
        }
      });
      _summary.forEach((s, i) => {
        if (i > 0) {
          let per = Math.round((s.value / _summary[0].value) * 1000) / 10;
          if (isNaN(per)) per = 0;
          s.value = `${s.value}(${per}%)`;
        }
      });
      return _summary;
    },
    }
  },
  methods: {
    // 打开设备图
    openDeviceShowDialog() {
      this.deviceShowDialog = true;
      this.$nextTick(() => {
        this.$refs.deviceShowRef.init(this.curSubtask.data.scene);
      });
    },
    //查询子任务统计信息
    search(formSearch) {
      this.topTask = formSearch.topTask;
      this.sideLoading = true;
      this.mainLoading = true;
      this.curProList = [];
      this.curSubtask = {};
      taskApi.getSubtaskSummary(formSearch).then((res) => {
      this.sceneTypeId = formSearch.sceneTypeId;
      const param = {
        topTaskId: formSearch.topTask.tguid,
        sceneTypeId: formSearch.sceneTypeId
      };
      taskApi.getSubtaskSummary(param).then((res) => {
        const list = [];
        res.forEach((s) => {
          const t = this.getSubtaskType(s);
          const t = ProCheckProxy.getSubtaskType(s);
          list.push({
            status: s.subtask.status,
            type: t,
            title: s.stName,
            categoly: s.stPlanTime.split('T')[0],
            data: s,
            data: s
          });
        });
        this.subtasks = list;
@@ -184,27 +208,17 @@
          this.mainLoading = false;
        }
      });
    },
    //获取任务问题的审核情况
    getSubtaskType(s) {
      let type = 0;
      if (s.proNum == 0) {
        type = 2;
      } else if (s.proCheckedNum == 0) {
        type = 0;
      } else if (s.proCheckedNum < s.proNum) {
        type = 1;
      } else {
        type = 2;
      }
      return type;
      taskApi.fetchMonitorObjectVersion(param.topTaskId).then((res) => {
        this.curMonitorObjList = res;
      });
    },
    //点击左侧菜单任务事件
    chooseSubtask(s) {
      // this.currInsGuid = s.data.insGuid
      this.sideLoading = false;
      this.mainLoading = true;
      // const controller = new AbortController();
      taskApi
      problemApi
        .getProBySubtask(s.data.stGuid)
        .then((res) => {
          this.curProList = res;
@@ -214,17 +228,66 @@
          this.mainLoading = false;
        });
    },
    updateSubtask() {
    onAddProCanceled() {},
    // 问题卡片组件主动发起刷新父组件数据
    updateSubtask(refresh = false) {
      this.curSubtask.data.proCheckedNum++;
      this.curSubtask.type = this.getSubtaskType(this.curSubtask.data);
      this.curSubtask.type = ProCheckProxy.getSubtaskType(this.curSubtask.data);
      if (this.proAddOrUpdDialogVisible) {
        this.proAddOrUpdDialogVisible = false;
      }
      this.refreshCurrSubtask(refresh);
    },
    // 刷新当前选中子任务
    refreshCurrSubtask(refresh) {
      this.sideLoading = false;
      setTimeout(() => {
        this.mainLoading = true;
        problemApi
          .getProBySubtask(this.curSubtask.data.stGuid)
          .then((res) => {
            if (refresh) {
              this.curProList = res;
              return;
            }
            const currProLen = this.curProList.length;
            // 不改变数组对像引用的前提下重新赋值
            for (let index = 0; index < res.length; index++) {
              const element = res[index];
              if (currProLen < index + 1) {
                this.curProList.push(element);
              } else {
                this.curProList[index] = element;
              }
            }
            // this.curSubtask = s;
          })
          .finally(() => {
            this.mainLoading = false;
          });
      }, 500);
    },
    // 问题审核完成后,更新左侧列表对应子任务状态
    handleProblemCheck() {
      const status = ProCheckProxy.calProStatus(this.curProList);
      this.curSubtask.data.proNum = status.proNum;
      this.curSubtask.data.proCheckedNum = status.proCheckedNum;
      this.curSubtask.data.changeNum = status.changeNum;
      this.curSubtask.data.changeCheckedNum = status.changeCheckedNum;
      this.curSubtask.type = ProCheckProxy.getSubtaskType(this.curSubtask.data);
    }
  },
  mounted() {},
  mounted() {}
};
</script>
<style scoped>
.el-scrollbar {
.scrollbar-outer {
  height: calc(100vh - 60px * 2 - 24px);
  background-color: aliceblue;
}
.scrollbar-inner {
  height: calc(100vh - 60px * 2 - 20px * 2 - var(--height-toolbar));
}
</style>