riku
2025-10-21 dca26bac2c05fcfc9c7ed477b32a7fab1295a688
2025.10.21 修改嫉妒报告生成逻辑
已修改9个文件
190 ■■■■■ 文件已修改
public/underway_season_report.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components.d.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chart/RealTimeLineChart.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/chart/chart-option.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/chart/chart-to-img.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/chart/factor-data-parser.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/historymode/component/MissionReport.vue 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sourcetrace/SourceTrace.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/underway_season_report.docx
Binary files differ
src/api/index.js
@@ -13,10 +13,10 @@
}
if (debug) {
  // ip1 = 'http://192.168.0.103:8084/';
  ip1 = 'http://localhost:8084/';
  // ws = `192.168.0.103:9031`;
  ws = `localhost:9031`;
  ip1 = 'http://192.168.0.103:8084/';
  // ip1 = 'http://localhost:8084/';
  ws = `192.168.0.103:9031`;
  // ws = `localhost:9031`;
}
const $http = axios.create({
src/components.d.ts
@@ -37,6 +37,7 @@
    ElForm: typeof import('element-plus/es')['ElForm']
    ElFormItem: typeof import('element-plus/es')['ElFormItem']
    ElIcon: typeof import('element-plus/es')['ElIcon']
    ElImage: typeof import('element-plus/es')['ElImage']
    ElInput: typeof import('element-plus/es')['ElInput']
    ElLink: typeof import('element-plus/es')['ElLink']
    ElOption: typeof import('element-plus/es')['ElOption']
src/components/chart/RealTimeLineChart.vue
@@ -33,7 +33,9 @@
      default: 1
    },
    // 异常数据索引范围集合,[[i1,i2], [i3,i4],...]
    exceptionIndexArr: Array
    exceptionIndexArr: Array,
    // 自定义Y轴范围
    customRange: Boolean
  },
  data() {
    return {
src/utils/chart/chart-option.js
@@ -161,7 +161,8 @@
  tag,
  animation = true,
  defaultGrid,
  title
  title,
  customRange
) {
  var fontSize = fGetChartFontSize();
  const _grid = defaultGrid
@@ -248,10 +249,14 @@
        minInterval: yMinInterval ? yMinInterval : 1,
        intervel: 1,
        min: function (value) {
          return Math.floor(value.min);
          if (customRange != false) {
            return Math.floor(value.min);
          }
        },
        max: function (value) {
          return Math.ceil(value.max);
          if (customRange != false) {
            return Math.ceil(value.max);
          }
        }
      },
      {
src/utils/chart/chart-to-img.js
@@ -27,7 +27,8 @@
    true,
    false,
    { left: '7%', right: '7%', top: '10%', bottom: '10%' },
    series.name
    series.name,
    false
  );
  if (exceptionIndexArr) {
    const visualMap = baseVisualMap(exceptionIndexArr);
src/utils/chart/factor-data-parser.js
@@ -9,7 +9,7 @@
  });
  return newTimes;
}
function refreshY(factorDatas) {
function refreshY(factorDatas, useRange) {
  const allSeries = new Map();
  for (const key in factorDatas.factor) {
    if (Object.hasOwnProperty.call(factorDatas.factor, key)) {
@@ -35,9 +35,11 @@
      const newSeries = e.datas.map((v) => v.factorData);
      series.data = series.data.concat(newSeries);
      // 计算数据范围
      const { min, max } = dataRange(series.data);
      series.min = min;
      series.max = max;
      if (useRange != false) {
        // const { min, max } = dataRange(series.data);
        // series.min = min;
        // series.max = max;
      }
      // 记录最新数据
      series.currentData =
        Math.round(series.data[series.data.length - 1] * 10) / 10;
@@ -72,9 +74,9 @@
}
export default {
  parseData(factorDatas, selectedFactors) {
  parseData(factorDatas, selectedFactors, useRange) {
    const xAxis = refreshX(factorDatas);
    const allSeries = refreshY(factorDatas);
    const allSeries = refreshY(factorDatas, useRange);
    return toList(xAxis, allSeries, selectedFactors);
  }
};
src/views/historymode/component/MissionReport.vue
@@ -14,14 +14,19 @@
        ></OptionLocation2>
      </el-form-item>
      <OptionTime v-model="formObj.timeArray"></OptionTime>
      <el-form-item label="移除其他区县" prop="removeOtherDistrict">
      <el-form-item label="区县筛选" prop="removeOtherDistrict">
        <el-checkbox v-model="formObj.removeOtherDistrict"
          >移除其他区县</el-checkbox
        >
      </el-form-item>
      <el-form-item label="移除未污染源" prop="removeNoPollutedSource">
      <el-form-item label="污染源筛选" prop="removeNoPollutedSource">
        <el-checkbox v-model="formObj.removeNoPollutedSource"
          >移除未发现污染源的线索</el-checkbox
        >
      </el-form-item>
      <el-form-item label="隐患区域" prop="showPollutedArea">
        <el-checkbox v-model="formObj.showPollutedArea"
          >将典型隐患区域表格作为附件展示</el-checkbox
        >
      </el-form-item>
      <el-form-item>
@@ -45,7 +50,7 @@
      <!-- <el-form-item>
        <el-image :src="base64Url" fit="fill" :preview-src-list="[base64Url]" />
      </el-form-item> -->
      <!-- <el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          class="el-button-custom"
@@ -63,7 +68,7 @@
            />
          </el-form-item>
        </el-form-item>
      </el-form-item> -->
      </el-form-item>
    </el-form>
  </CardDialog>
</template>
@@ -250,6 +255,10 @@
      new Date(res.data.startTime),
      new Date(res.data.endTime)
    );
    templateParam.subTitle =
      templateParam.sryTime.indexOf('季度') !== -1
        ? templateParam.sryTime.replace(/(.*)/, '')
        : templateParam.sryTime;
    templateParam.sryArea = res.data.area.districtName;
    templateParam.sryCount = res.data.count;
    templateParam.sryKm = Math.round(res.data.kilometres / 1000);
@@ -275,7 +284,7 @@
  return dataAnalysisApi.fetchMissionList(param).then((res) => {
    templateParam.missionInfoList = res.data.map((item) => {
      item._time = formatDateTimeRange(item.startTime, item.endTime);
      item._airQulity = `AQI:${item.aqi}(${item.pollutionDegree})`;
      item._airQulity = `${item.aqi}(${item.pollutionDegree})`;
      item._abnormalFactors = item.abnormalFactors
        .map((factor) => factorName[factor])
        .join('、');
@@ -312,7 +321,7 @@
      item._startTime = t[0];
      item._time = t[1];
      item._kilometres = Math.round(item.kilometres / 1000);
      item._airQulity = `AQI:${item.aqi}(${item.pollutionDegree})`;
      item._airQulity = `${item.aqi}(${item.pollutionDegree})`;
      const factorNames = radioOptions(TYPE0).map((e) => e.name);
      item._dataStatistics = item.dataStatistics.filter((e) => {
@@ -340,6 +349,7 @@
    removeNoPollutedSource: param.removeNoPollutedSource
  };
  return dataAnalysisApi.fetchClueByRiskArea(_param).then((res) => {
    templateParam.showPollutedArea = formObj.value.showPollutedArea;
    templateParam.clueByAreaList = res.data
      .groupBy((e) => e.township)
      .map((item, index) => {
@@ -359,19 +369,26 @@
                index: index2 + 1,
                factor: factorNames,
                clues: clues2.map((item3, index3) => {
                  // const _riskRegion = [];
                  // if (clue.pollutedArea.address) {
                  //   _riskRegion.push(clue.pollutedArea.address);
                  // }
                  // if (clue.pollutedArea.streetNumber) {
                  //   _riskRegion.push(clue.pollutedArea.streetNumber);
                  // }
                  // if (clue.pollutedArea.roadinter) {
                  //   _riskRegion.push(clue.pollutedArea.roadinter);
                  // }
                  const clue = item3.clue
                  const clue = item3.clue;
                  let _riskRegion = '';
                  if (
                    clue.pollutedArea.address.indexOf(
                      clue.pollutedArea.streetNumber
                    ) == -1
                  ) {
                    _riskRegion +=
                      (clue.pollutedArea.address ?? '') +
                      '(' +
                      (clue.pollutedArea.street ?? '') +
                      (clue.pollutedArea.streetNumber ?? '') +
                      (clue.pollutedArea.direction ?? '') +
                      ')';
                  } else {
                    _riskRegion = clue.pollutedArea.address;
                  }
                  return {
                    index: index3+1,
                    index: index3 + 1 + '',
                    showPollutedArea: formObj.value.showPollutedArea,
                    _title:
                      (clue.pollutedArea.street ?? '') +
                      (clue.pollutedArea.streetNumber ?? '') +
@@ -385,24 +402,25 @@
                      ) +
                      ' - ' +
                      moment(clue.pollutedData.endTime).format('HH:mm:ss'),
                    _riskRegion:
                      (clue.pollutedArea.address ?? '') +
                      (clue.pollutedArea.street ?? '') +
                      (clue.pollutedArea.streetNumber ?? '') +
                      (clue.pollutedArea.direction ?? ''),
                    _riskRegion: _riskRegion,
                    _exceptionType: clue.pollutedData.exception,
                    _images: generateChartImg(clue.pollutedData),
                    _conclusion: clue.pollutedSource.conclusion,
                    _hasScene: clue.pollutedSource.sceneList.length > 0,
                    _scenes:
                      clue.pollutedSource.sceneList.length > 0
                        ? clue.pollutedSource.sceneList
                            .map(
                              (s, index) =>
                                `${index + 1}. ${s.name},${s.type},位于${s.location},距${s.closestStation.name}${parseInt(s.length)}米;`
                            )
                            .join('\n')
                        : '无'
                    // _scenes:
                    //   clue.pollutedSource.sceneList.length > 0
                    //     ? clue.pollutedSource.sceneList
                    //         .map(
                    //           (s, index) =>
                    //             `${index + 1}. ${s.name},${s.type},位于${s.location},距${s.closestStation.name}${parseInt(s.length)}米;`
                    //         )
                    //         .join('\r\n')
                    //     : '无',
                    _scenes: clue.pollutedSource.sceneList.map((s, index) => {
                      return {
                        des: `${index + 1}. ${s.name},${s.type},位于${s.location},距${s.closestStation.name}${parseInt(s.length)}米;`
                      };
                    })
                  };
                })
              };
@@ -424,13 +442,17 @@
  factorDatas.setData(pollutedData.historyDataList, 0, () => {
    for (const key in pollutedData.statisticMap) {
      const value = pollutedData.statisticMap[key];
      const _chartOptions = factorDataParser.parseData(factorDatas, [
        {
          label: value.factorName,
          name: value.factorName,
          value: value.factorId + ''
        }
      ]);
      const _chartOptions = factorDataParser.parseData(
        factorDatas,
        [
          {
            label: value.factorName,
            name: value.factorName,
            value: value.factorId + ''
          }
        ],
        false
      );
      _chartOptions.forEach((o) => {
        images.push({
          url: chartToImg.generateEchartsImage(o, exceptionIndexArr, 20)
@@ -482,6 +504,19 @@
                : '网格内可能存在隐藏风险源'
          };
        });
        const infoDes2 = item.highRiskGridMap2[key].map((e) => {
          return {
            factorValue: e.factorValue,
            // 四至范围,顺序为最小经度,最大经度,最小纬度,最大纬度
            _boundsDes: `经度${e.bounds[0]}至${e.bounds[1]},纬度${e.bounds[2]}至${e.bounds[3]}`,
            // 涉及街镇
            town: e.town,
            _scenesDes:
              e.highRiskScenes.length > 0
                ? `涉及的污染场景包括${e.highRiskScenes.map((s) => s.name).join('、')}`
                : '网格内可能存在隐藏风险源'
          };
        });
        // })
        // item.highRiskGridList.forEach((g, i) => {
        // const g = item.highRiskGridList[0];
@@ -496,7 +531,8 @@
              gridImgUrl1: url1,
              // 对比色网格图
              gridImgUrl2: url2,
              infoDes: infoDes
              infoDes: infoDes,
              infoDes2: infoDes2
            });
          }
        );
@@ -677,19 +713,28 @@
  // 不是季度第一天则返回具体日期范围
  if (!quarter) {
    return `${startYear}年${startMonth + 1}月${startDate}日-${endYear}年${endMonth + 1}月${endDate}日`;
    // return `${startYear}年${startMonth + 1}月${startDate}日-${endYear}年${endMonth + 1}月${endDate}日`;
    return startYear == endYear
      ? `${startYear}年${startMonth + 1}月-${endMonth + 1}月`
      : `${startYear}年${startMonth + 1}月-${endYear}年${endMonth + 1}月`;
  }
  // 验证是否为对应季度最后一个月
  const expectedEndMonth = quarter * 3 - 1; // Q1:2(3月), Q2:5(6月), Q3:8(9月), Q4:11(12月)
  if (endMonth !== expectedEndMonth) {
    return `${startYear}年${startMonth + 1}月${startDate}日-${endYear}年${endMonth + 1}月${endDate}日`;
    // return `${startYear}年${startMonth + 1}月${startDate}日-${endYear}年${endMonth + 1}月${endDate}日`;
    return startYear == endYear
      ? `${startYear}年${startMonth + 1}月-${endMonth + 1}月`
      : `${startYear}年${startMonth + 1}月-${endYear}年${endMonth + 1}月`;
  }
  // 验证是否为季度最后一天
  const lastDayOfEndMonth = new Date(endYear, endMonth + 1, 0).getDate();
  if (endDate !== lastDayOfEndMonth) {
    return `${startYear}年${startMonth + 1}月${startDate}日-${endYear}年${endMonth + 1}月${endDate}日`;
    // return `${startYear}年${startMonth + 1}月${startDate}日-${endYear}年${endMonth + 1}月${endDate}日`;
    return startYear == endYear
      ? `${startYear}年${startMonth + 1}月-${endMonth + 1}月`
      : `${startYear}年${startMonth + 1}月-${endYear}年${endMonth + 1}月`;
  }
  const quarterNames = ['', '第一季度', '第二季度', '第三季度', '第四季度'];
src/views/sourcetrace/SourceTrace.vue
@@ -510,13 +510,17 @@
  factorDatas.setData(obj.pollutedData.historyDataList, 0, () => {
    for (const key in obj.pollutedData.statisticMap) {
      const value = obj.pollutedData.statisticMap[key];
      value._chartOptions = factorDataParser.parseData(factorDatas, [
        {
          label: value.factorName,
          name: value.factorName,
          value: value.factorId + ''
        }
      ]);
      value._chartOptions = factorDataParser.parseData(
        factorDatas,
        [
          {
            label: value.factorName,
            name: value.factorName,
            value: value.factorId + ''
          }
        ],
        false
      );
    }
    // obj._chartOptions = factorDataParser.parseData(factorDatas, [
    //   {