hejianhao
2026-01-23 98131fa9a02d5ee7b6464776f5a16abb196e19d2
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/smartBuilding
2个文件已删除
2个文件已添加
3个文件已修改
1028 ■■■■■ 已修改文件
screen/src/utils/riskSourceMap.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/accidentCase/api.txt 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/accidentCase/detail.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/accidentCase/index.vue 474 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/accidentCase/service.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/hiddenDanger/README.md 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/hiddenDanger/api.txt 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/utils/riskSourceMap.js
@@ -102,6 +102,39 @@
  PARTIAL_REFORMED: '部分整改',
  REFORMED: '已整改'
}
export const provinceArr = [
  { value: '110000', label: '北京' },
  { value: '120000', label: '天津' },
  { value: '130000', label: '河北省' },
  { value: '140000', label: '山西省' },
  { value: '150000', label: '内蒙古自治区' },
  { value: '210000', label: '辽宁省' },
  { value: '220000', label: '吉林省' },
  { value: '230000', label: '黑龙江省' },
  { value: '310000', label: '上海' },
  { value: '320000', label: '江苏省' },
  { value: '330000', label: '浙江省' },
  { value: '340000', label: '安徽省' },
  { value: '350000', label: '福建省' },
  { value: '360000', label: '江西省' },
  { value: '370000', label: '山东省' },
  { value: '410000', label: '河南省' },
  { value: '420000', label: '湖北省' },
  { value: '430000', label: '湖南省' },
  { value: '440000', label: '广东省' },
  { value: '450000', label: '广西壮族自治区' },
  { value: '460000', label: '海南省' },
  { value: '500000', label: '重庆' },
  { value: '510000', label: '四川省' },
  { value: '520000', label: '贵州省' },
  { value: '530000', label: '云南省' },
  { value: '540000', label: '西藏自治区' },
  { value: '610000', label: '陕西省' },
  { value: '620000', label: '甘肃省' },
  { value: '630000', label: '青海省' },
  { value: '640000', label: '宁夏回族自治区' },
  { value: '650000', label: '新疆维吾尔自治区' }
]
/**
 * 根据类型和 code 获取对应的中文名称
screen/src/view/accidentCase/api.txt
New file
@@ -0,0 +1,47 @@
看我打开的index.vue,detail.vue,accidentMessageSetting.jsx,edit-accidentMessage-form.jsx这四个页面。
index.vue 和detail.vue页面是大屏的页面文件,accidentMessageSetting.jsx,edit-accidentMessage-form.jsx是后台配置的页页。
现在需要对接大屏两个页面的接口,接口在service.js文件中。
接口包括:城市信息查询,事故分类列表,简讯列表,简讯详情。城市和事故的接口和逻辑已处理可以参考一下后台新增页面的逻辑。两者接口的请求和响应是一致的。
下面是简讯列表的接口的传参和响应:
   简讯列表: /dashboard-statistics/getStoryPage post json
        请求:city    城市
              classifyId    类型id
              content    内容
              pageNum    分页参数,当前页码
              pageSize    分页参数,每页数量,默认为10
              time    时间
       响应:
            area    区    string
              casualties    伤亡情况    string
              city    市    string
              classifyId    类别idaccident_classification id    integer
              classifyName    类别名称    string
              content    情况简述    string
              createTime        string
              creatorId        integer
              deleted    false正常true删除    boolean
              detail    详情    string
              id        integer
              img    封面图    string
              province    省    string
              state    1启用 2关闭    integer
              time    发生时间    string
              title    标题    string
简讯详情: /dashboard-statistics/getStoryDetail/{id} get
       响应:area    区    string
              casualties    伤亡情况    string
              city    市    string
              classifyId    类别idaccident_classification id    integer(int32)
              classifyName    类别名称    string
              content    情况简述    string
              createTime        string(date-time)
              creatorId        integer(int32)
              deleted    false正常true删除    boolean
              detail    详情    string
              id        integer(int32)
              img    封面图    string
              province    省    string
              state    1启用 2关闭    integer(int32)
              time    发生时间    string(date)
              title    标题    string
screen/src/view/accidentCase/detail.vue
@@ -10,48 +10,72 @@
          class="w--22 h--20 shrink0 mr--13 cursor-pointer"
        />
      </div>
      <div class="bgcolor1 mt--25 oa" style="height: 900px">
        <div class="flex a-center">
          <div class="fs--30 lh--30 c-fff SHSBold mr--8">
            德国模德机床中国总部及研发生产基地项目落户成都东部新区
          </div>
          <div class="typeBox">塔吊倒塌</div>
        </div>
        <div class="flex a-center j-between mt--24">
      <div class="bgcolor1 mt--25 oa" style="height: 900px" v-loading="loading">
        <template v-if="detailData.id">
          <div class="flex a-center">
            <img
              src="../../assets/img/home/Shape@2x (1).png"
              class="mr--6 w--9 h--10"
            />
            <div class="SHSN fs--12 lh--12 c-fff">伤亡:造成 1 人死亡</div>
            <div class="fs--30 lh--30 c-fff SHSBold mr--8">
              {{ detailData.title }}
            </div>
            <div class="typeBox" v-if="detailData.classifyName">
              {{ detailData.classifyName }}
            </div>
          </div>
          <div class="flex a-center">
            <img
              src="../../assets/img/home/Shape@2x (2).png"
              class="mr--6 w--8 h--10"
            />
            <div class="SHSN fs--12 lh--12 c-fff">河北省秦皇岛市昌黎县</div>
          <div class="flex a-center j-between mt--24">
            <div class="flex a-center" v-if="detailData.casualties">
              <img
                src="../../assets/img/home/Shape@2x (1).png"
                class="mr--6 w--9 h--10"
              />
              <div class="SHSN fs--12 lh--12 c-fff">
                伤亡:{{ detailData.casualties }}
              </div>
            </div>
            <div class="flex a-center">
              <img
                src="../../assets/img/home/Shape@2x (2).png"
                class="mr--6 w--8 h--10"
              />
              <div class="SHSN fs--12 lh--12 c-fff">
                {{ detailData.province }}{{ detailData.city
                }}{{ detailData.area }}
              </div>
            </div>
            <div class="flex a-center" v-if="detailData.time">
              <img
                src="../../assets/img/home/Shape@2x (3).png"
                class="mr--6 w--10 h--9"
              />
              <div class="SHSN fs--12 lh--12 c-fff">
                {{ formatDate(detailData.time) }}
              </div>
            </div>
          </div>
          <div class="flex a-center">
            <img
              src="../../assets/img/home/Shape@2x (3).png"
              class="mr--6 w--10 h--9"
            />
            <div class="SHSN fs--12 lh--12 c-fff">2025年11月10日</div>
          <div class="mt--18 fs--14 c-fff SHSN" v-if="detailData.content">
            {{ detailData.content }}
          </div>
        </div>
        <div class="mt--18 fs--14 c-fff SHSN">
          德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区德国模德机床中国总部及研发生产基地项目落户成都东部新区
        </div>
        <div class="mt--26 flex flex-column a-center gap--18">
          <img
            style="width: 730px; height: 348px"
            src="../../assets/img/home/Shape@2x (3).png"
          />
          <img
            style="width: 730px; height: 348px"
            src="../../assets/img/home/Shape@2x (3).png"
          />
          <div class="mt--26 flex flex-column a-center gap--18">
            <div
              class="detail-content c-fff"
              v-if="detailData.detail"
              v-html="detailData.detail"
            ></div>
            <img
              v-if="detailData.img"
              style="width: 730px; height: 348px; object-fit: cover"
              :src="
                'http://47.108.113.190:8181/public/file/download' +
                detailData.img
              "
              @error="handleImageError"
            />
          </div>
        </template>
        <div
          v-if="!loading && !detailData.id"
          class="flex a-center j-center c-fff fs--16"
          style="height: 100%"
        >
          暂无数据
        </div>
      </div>
    </div>
@@ -61,17 +85,57 @@
<script>
import HeaderBox from "../header/index.vue";
import moment from "moment";
import { getStoryDetail } from "./service";
export default {
  components: { HeaderBox },
  props: {},
  data() {
    return {};
    return {
      detailData: {},
      loading: false,
    };
  },
  computed: {},
  watch: {},
  created() {},
  created() {
    this.loadDetail();
  },
  mounted() {},
  methods: {
    // 加载详情
    async loadDetail() {
      const id = this.$route.query.id;
      if (!id) {
        this.$message.error("缺少ID参数");
        return;
      }
      try {
        this.loading = true;
        const res = await getStoryDetail(id);
        if (res && res) {
          this.detailData = res;
        }
      } catch (error) {
        console.error("加载详情失败:", error);
        this.$message.error("加载详情失败");
      } finally {
        this.loading = false;
      }
    },
    // 格式化日期
    formatDate(dateStr) {
      if (!dateStr) return "";
      return moment(dateStr).format("YYYY年MM月DD日");
    },
    // 图片加载失败处理
    handleImageError(e) {
      e.target.src = require("../../assets/img/logo.png");
    },
    backFun() {
      this.$router.go(-1);
    },
@@ -79,6 +143,32 @@
};
</script>
<style scoped lang="less">
.detail-content {
  width: 100%;
  line-height: 1.8;
  word-wrap: break-word;
  ::v-deep img {
    max-width: 100%;
    height: auto;
    display: block;
    margin: 10px auto;
  }
  ::v-deep p {
    margin: 10px 0;
  }
  ::v-deep h1,
  ::v-deep h2,
  ::v-deep h3,
  ::v-deep h4,
  ::v-deep h5,
  ::v-deep h6 {
    margin: 15px 0 10px;
  }
}
.typeBox {
  min-width: 60px;
  line-height: 20px;
@@ -97,4 +187,4 @@
  padding: 45px 50px;
  height: 100%;
}
</style>
</style>
screen/src/view/accidentCase/index.vue
@@ -13,48 +13,61 @@
      <!-- 搜索 -->
      <div class="flex a-center gap--16 mt--24 mb--20">
        <div
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox cascader-box"
        >
          <el-select
            filterable
            v-model="projectId"
          <el-cascader
            v-model="cascaderValue"
            :options="cityOptions"
            :props="cascaderProps"
            placeholder="选择城市"
            class="flex1"
            clearable
            @change="handleCityChange"
            filterable
          >
            <el-option
              v-for="item in [1, 2]"
              :key="item"
              :label="item"
              :value="item"
            >
            </el-option>
          </el-select>
          <img
            src="../../assets/img/down-circle@2x.png"
            class="w--15 h--16 shrink0"
          />
          </el-cascader>
          <div class="flex a-center gap--5">
            <i
              @click.stop="handleClearCity"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="cascaderValue && cascaderValue.length > 0"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
          </div>
        </div>
        <div
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox"
        >
          <el-select
            filterable
            v-model="projectId"
            placeholder="选择工作类型"
            v-model="classifyId"
            placeholder="选择事故类型"
            class="flex1"
            clearable
            @change="handleSearch"
          >
            <el-option
              v-for="item in [1, 2]"
              :key="item"
              :label="item"
              :value="item"
              v-for="item in classifyList"
              :key="item.id"
              :label="item.name"
              :value="item.id"
            >
            </el-option>
          </el-select>
          <img
            src="../../assets/img/down-circle@2x.png"
            class="w--15 h--16 shrink0"
          />
          <div class="flex a-center gap--5">
            <i
              @click.stop="handleClearClassify"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="classifyId"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
          </div>
        </div>
        <div
          @click="handleClick(1)"
@@ -65,95 +78,100 @@
            ref="datetime1"
            type="datetime"
            placeholder=""
            @change="handleDateChange"
          >
          </el-date-picker>
          <div
            class="absolute w100 h100 flex a-center c-fff fs--14 SHS"
            style="width: calc(100% - 20px)"
            v-if="dateTxt"
            class="absolute w100 h100 flex a-center px--20"
            style="pointer-events: none"
          >
            {{ dateTxt }}
            <div
              class="flex a-center c-fff fs--14 SHS"
              style="width: calc(100% - 20px)"
            >
              {{ dateTxt || "请选择开始日期" }}
            </div>
            <div class="flex a-center gap--5" style="pointer-events: auto">
              <i
                @click.stop="handleClearStartDate"
                class="el-icon-circle-close c-fff cursor-pointer"
                v-show="dateTxt"
              />
              <img
                src="../../assets/img/home/Shape@2x (6).png"
                class="w--13 h--13 shrink0"
              />
            </div>
          </div>
          <div
            v-else
            class="absolute w100 h100 flex a-center c-fff fs--14 SHSR"
          >
            请选择日期
          </div>
          <img
            src="../../assets/img/home/Shape@2x (6).png"
            class="w--13 h--13 shrink0"
          />
        </div>
        <div
          @click="handleClick(2)"
          class="flex a-center j-between px--20 w--300 h--40 relative bgcolor1 picker"
        >
          <el-date-picker
            v-model="dateTime"
            v-model="dateTime2"
            ref="datetime2"
            type="datetime"
            placeholder=""
            @change="handleDateChange"
          >
          </el-date-picker>
          <div
            class="absolute w100 h100 flex a-center c-fff fs--14 SHS"
            style="width: calc(100% - 20px)"
            v-if="dateTxt"
            class="absolute w100 h100 flex a-center px--20"
            style="pointer-events: none"
          >
            {{ dateTxt }}
            <div
              class="flex a-center c-fff fs--14 SHS"
              style="width: calc(100% - 20px)"
            >
              {{ dateTxt2 || "请选择结束日期" }}
            </div>
            <div class="flex a-center gap--5" style="pointer-events: auto">
              <i
                @click.stop="handleClearEndDate"
                class="el-icon-circle-close c-fff cursor-pointer"
                v-show="dateTxt2"
              />
              <img
                src="../../assets/img/home/Shape@2x (6).png"
                class="w--13 h--13 shrink0"
              />
            </div>
          </div>
          <div
            v-else
            class="absolute w100 h100 flex a-center c-fff fs--14 SHSR"
          >
            请选择日期
          </div>
          <img
            src="../../assets/img/home/Shape@2x (6).png"
            class="w--13 h--13 shrink0"
          />
        </div>
        <div
          class="flex a-center j-between w--300 pl--20 h--40 relative bgcolor1 searchBox"
        >
          <el-select
            filterable
            v-model="projectId"
          <el-input
            v-model="content"
            placeholder="请输入搜索内容"
            class="flex1"
            @keyup.enter.native="handleSearch"
          >
            <el-option
              v-for="item in [1, 2]"
              :key="item"
              :label="item"
              :value="item"
            >
            </el-option>
          </el-select>
          <div class="btn SHSR">搜索</div>
          </el-input>
          <div class="btn SHSR" @click="handleSearch">搜索</div>
        </div>
      </div>
      <!-- 表格 -->
      <div class="mt--20 border1 oa" style="height: 800px">
      <div class="mt--20 border1 oa" style="height: 800px" v-loading="loading">
        <div
          v-for="(item, index) in 10"
          :key="item"
          v-for="(item, index) in storyList"
          :key="item.id"
          class="flex a-center j-between px--32 py--20 c-fff cursor-pointer tableItem"
          :class="{ bgcolor2: (index + 1) % 2 != 0 }"
          @click="toDetail(item)"
        >
          <div class="flex a-center">
            <div class="fs--29 lh--29 SHSN">31</div>
            <div class="fs--29 lh--29 SHSN">{{ formatDay(item.time) }}</div>
            <div class="border2 ml--15 mr--16"></div>
            <div class="fs--12 lh--14 SHSN color1">
              <p>2025</p>
              <p>12</p>
              <p>{{ formatYearMonth(item.time).year }}</p>
              <p>{{ formatYearMonth(item.time).month }}</p>
            </div>
          </div>
          <div class="ml--79 flex1">
            <div class="fs--20 lh--20 SHSBold mt--2">
              秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢
              {{ item.title }}
            </div>
            <div class="flex a-center j-between mt--6">
              <div class="flex a-center gap--7">
@@ -161,27 +179,45 @@
                  src="../../assets/img/home/Shape@2x (2).png"
                  class="shrink0 w--8 h--9"
                />
                <div class="fs--12 lh--12 c-fff SHSN">河北省秦皇岛市昌黎县</div>
                <div class="fs--12 lh--12 c-fff SHSN">
                  {{ item.province }}{{ item.city }}{{ item.area }}
                </div>
              </div>
              <div class="typeBox">塔吊倒塌</div>
              <div class="typeBox" v-if="item.classifyName">
                {{ item.classifyName }}
              </div>
            </div>
            <div class="mt--5 fs--14 lh--20 SHSR c-fff">
              秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故秦皇岛市钢铁厂发生塔吊倒塌事故
            <div class="mt--5 fs--14 lh--20 SHSR c-fff text-ellipsis-3">
              {{ item.content }}
            </div>
          </div>
          <img
            v-if="item.img"
            :src="'http://47.108.113.190:8181/public/file/download' + item.img"
            class="w--264 h--160 shrink0 ml--54 br--10"
            @error="handleImageError"
          />
          <img
            v-else
            src="../../assets/img/logo.png"
            class="w--264 h--160 shrink0 ml--54 br--10"
          />
        </div>
        <div
          v-if="!loading && storyList.length === 0"
          class="flex a-center j-center c-fff fs--16"
          style="height: 100%"
        >
          暂无数据
        </div>
      </div>
      <CustomPagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="currentPage"
        :page-sizes="[100, 200, 300, 400]"
        :page-size="10"
        :total="400"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="pageSize"
        :total="total"
      />
    </div>
  </div>
@@ -190,15 +226,33 @@
<script>
import HeaderBox from "../header/index.vue";
import moment from "moment";
import { getAccidentClassify, getStoryPage } from "./service";
export default {
  components: { HeaderBox },
  props: {},
  data() {
    return {
      dateTime: null,
      projectId: null,
      dateTime2: null,
      city: null,
      classifyId: null,
      content: "",
      dateTxt: "",
      dateTxt2: "",
      currentPage: 1,
      pageSize: 10,
      total: 0,
      cityOptions: [],
      cascaderValue: [],
      cascaderProps: {
        lazy: true,
        lazyLoad: this.loadCityData,
        checkStrictly: true,
      },
      classifyList: [],
      storyList: [],
      loading: false,
    };
  },
  computed: {},
@@ -207,14 +261,176 @@
      handler(newVal, oldVal) {
        if (newVal) {
          this.dateTxt = moment(newVal).format("YYYY年MM月DD日 HH:mm:ss");
        } else {
          this.dateTxt = "";
        }
      },
      immediate: true,
    },
    dateTime2: {
      handler(newVal, oldVal) {
        if (newVal) {
          this.dateTxt2 = moment(newVal).format("YYYY年MM月DD日 HH:mm:ss");
        } else {
          this.dateTxt2 = "";
        }
      },
      immediate: true,
    },
  },
  created() {},
  created() {
    this.initCityOptions();
    this.loadClassifyList();
    this.loadStoryList();
  },
  mounted() {},
  methods: {
    // 初始化城市选项(加载省份)
    async initCityOptions() {
      try {
        const provinces = await this.getDistrictData();
        this.cityOptions = provinces;
      } catch (error) {
        console.error("加载省份数据失败:", error);
      }
    },
    // 获取高德地图区域数据
    getDistrictData(keyword = "", level = 0) {
      const url = `https://restapi.amap.com/v3/config/district?keywords=${keyword}&subdistrict=1&key=aeec2a4b436322753dd2458fde89506b`;
      return fetch(url)
        .then((response) => response.json())
        .then((data) => {
          if (
            data.status === "1" &&
            data.districts &&
            data.districts.length > 0
          ) {
            const root = data.districts[0];
            const list = root.districts || [];
            return list.map((node) => ({
              value: node.name,
              label: node.name,
              leaf: node.level === "district", // 区县级为叶子节点
              level: node.level,
            }));
          }
          return [];
        })
        .catch((e) => {
          console.error("加载城市数据失败", e);
          return [];
        });
    },
    // 级联选择器懒加载
    async loadCityData(node, resolve) {
      const { level, value } = node;
      if (level === 0) {
        // 加载省份
        const provinces = await this.getDistrictData();
        resolve(provinces);
      } else {
        // 加载市或区
        const children = await this.getDistrictData(value);
        resolve(children);
      }
    },
    // 城市选择变化
    handleCityChange(value) {
      if (value && value.length > 0) {
        // 取最后一级作为城市
        this.city = value[value.length - 1];
      } else {
        this.city = null;
      }
      this.handleSearch();
    },
    // 加载事故分类列表
    async loadClassifyList() {
      try {
        const res = await getAccidentClassify();
        if (res && res) {
          this.classifyList = res;
        }
      } catch (error) {
        console.error("加载事故分类列表失败:", error);
      }
    },
    // 加载简讯列表
    async loadStoryList() {
      try {
        this.loading = true;
        const params = {
          pageNum: this.currentPage,
          pageSize: this.pageSize,
        };
        // 添加筛选条件
        if (this.city) {
          params.city = this.city;
        }
        if (this.classifyId) {
          params.classifyId = this.classifyId;
        }
        if (this.content) {
          params.content = this.content;
        }
        // 时间范围筛选:只有当开始时间和结束时间都选择时才添加
        // 格式:2022-02-02 - 2023-03-03
        if (this.dateTime && this.dateTime2) {
          const startTime = moment(this.dateTime).format("YYYY-MM-DD");
          const endTime = moment(this.dateTime2).format("YYYY-MM-DD");
          params.time = `${startTime} - ${endTime}`;
        }
        const res = await getStoryPage(params);
        if (res && res) {
          this.storyList = res.records || [];
          this.total = res.total || 0;
        }
      } catch (error) {
        console.error("加载简讯列表失败:", error);
        this.$message.error("加载数据失败");
      } finally {
        this.loading = false;
      }
    },
    // 时间选择变化处理
    handleDateChange() {
      // 如果两个时间都选择了,进行验证
      if (this.dateTime && this.dateTime2) {
        const startTime = moment(this.dateTime);
        const endTime = moment(this.dateTime2);
        // 验证开始时间必须小于结束时间
        if (startTime.isAfter(endTime)) {
          this.$message.warning("开始时间不能大于结束时间");
          return;
        }
        // 验证通过,执行搜索
        this.handleSearch();
      } else if (!this.dateTime && !this.dateTime2) {
        // 如果两个时间都清空了,也执行搜索
        this.handleSearch();
      }
      // 如果只选择了一个时间,不执行搜索,等待用户选择另一个时间
    },
    // 搜索
    handleSearch() {
      this.currentPage = 1;
      this.loadStoryList();
    },
    toDetail(item) {
      this.$router.push({
        path: "/accidentCase/detail",
@@ -225,11 +441,13 @@
    },
    handleSizeChange(val) {
      console.log(`每页 ${val} 条`);
      this.pageSize = val;
      this.loadStoryList();
    },
    handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
      this.currentPage = val;
      this.loadStoryList();
    },
    handleClick(type) {
@@ -239,10 +457,75 @@
    backFun() {
      this.$router.go(-1);
    },
    // 格式化日期显示
    formatDate(dateStr) {
      if (!dateStr) return "";
      return moment(dateStr).format("YYYY年MM月DD日");
    },
    // 格式化日期的日
    formatDay(dateStr) {
      if (!dateStr) return "";
      return moment(dateStr).format("DD");
    },
    // 格式化日期的年月
    formatYearMonth(dateStr) {
      if (!dateStr) return { year: "", month: "" };
      return {
        year: moment(dateStr).format("YYYY"),
        month: moment(dateStr).format("MM"),
      };
    },
    // 图片加载失败处理
    handleImageError(e) {
      e.target.src = require("../../assets/img/logo.png");
    },
    // 清除城市选择
    handleClearCity() {
      this.cascaderValue = [];
      this.city = null;
      this.handleSearch();
    },
    // 清除事故类型
    handleClearClassify() {
      this.classifyId = null;
      this.handleSearch();
    },
    // 清除开始日期
    handleClearStartDate() {
      this.dateTime = null;
      // 如果结束日期也为空,触发搜索
      if (!this.dateTime2) {
        this.handleSearch();
      }
    },
    // 清除结束日期
    handleClearEndDate() {
      this.dateTime2 = null;
      // 如果开始日期也为空,触发搜索
      if (!this.dateTime) {
        this.handleSearch();
      }
    }
  },
};
</script>
<style scoped lang="less">
.text-ellipsis-3 {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
  text-overflow: ellipsis;
}
.tableItem:hover {
  background-color: rgba(17, 40, 255, 0.2) !important;
}
@@ -338,6 +621,27 @@
  }
}
.cascader-box {
  ::v-deep .el-cascader {
    width: 100%;
    .el-input__inner {
      background: transparent;
      border: none;
      color: #fff;
      padding: 0;
    }
    .el-input__suffix {
      display: none;
    }
    .el-input__icon {
      display: none;
    }
  }
}
.btnColor {
  color: #00ebfc;
}
screen/src/view/accidentCase/service.js
New file
@@ -0,0 +1,23 @@
import request from '@/utils/request'
// 获取事故分类列表
export const getAccidentClassify = async () => {
  return request(`/dashboard-statistics/getStoryClassify`, {
    method: 'get'
  })
}
// 获取简讯列表
export const getStoryPage = async (data) => {
  return request(`/dashboard-statistics/getStoryPage`, {
    method: 'post',
    data
  })
}
// 获取简讯详情
export const getStoryDetail = async (id) => {
  return request(`/dashboard-statistics/getStoryDetail/${id}`, {
    method: 'get'
  })
}
screen/src/view/hiddenDanger/README.md
File was deleted
screen/src/view/hiddenDanger/api.txt
File was deleted