已修改19个文件
已添加7个文件
1264 ■■■■■ 文件已修改
package-lock.json 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/fysp/problemApi.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/menu.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/enum/construction.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/echart-util.js 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/ComChangeEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemAddOrUpd.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemCard.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/base-data-product/ProdMonitorTaskInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/base-data-product/ProdScenseInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/base-data-product/ProdTreatmentDeviceInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/evaluation/EvalutationRecord.vue 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/scene/CompSceneMixingPlantInfo.vue 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/scene/CompSceneWharfInfo.vue 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/scene/components/BaseSceneInfo.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/TaskManage.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/TaskProxy.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompDayTask.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompMonitorPlan.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompSubTaskList.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompSubTaskSelect.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompTaskEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
@@ -18,6 +18,7 @@
        "docxtemplater": "^3.50.0",
        "docxtemplater-image-module": "^3.1.0",
        "docxtemplater-image-module-free": "^1.1.1",
        "echarts": "^5.5.1",
        "element-plus": "^2.8.3",
        "exceljs": "^4.4.0",
        "file-saver": "^2.0.5",
@@ -4036,6 +4037,22 @@
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "node_modules/echarts": {
      "version": "5.5.1",
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
      "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
      "license": "Apache-2.0",
      "dependencies": {
        "tslib": "2.3.0",
        "zrender": "5.6.0"
      }
    },
    "node_modules/echarts/node_modules/tslib": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
      "license": "0BSD"
    },
    "node_modules/electron-to-chromium": {
      "version": "1.4.284",
@@ -8431,6 +8448,21 @@
      "engines": {
        "node": ">= 10"
      }
    },
    "node_modules/zrender": {
      "version": "5.6.0",
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
      "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
      "license": "BSD-3-Clause",
      "dependencies": {
        "tslib": "2.3.0"
      }
    },
    "node_modules/zrender/node_modules/tslib": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
      "license": "0BSD"
    }
  },
  "dependencies": {
@@ -11046,6 +11078,22 @@
      "requires": {
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "echarts": {
      "version": "5.5.1",
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
      "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
      "requires": {
        "tslib": "2.3.0",
        "zrender": "5.6.0"
      },
      "dependencies": {
        "tslib": {
          "version": "2.3.0",
          "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
        }
      }
    },
    "electron-to-chromium": {
@@ -13849,6 +13897,21 @@
          }
        }
      }
    },
    "zrender": {
      "version": "5.6.0",
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
      "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
      "requires": {
        "tslib": "2.3.0"
      },
      "dependencies": {
        "tslib": {
          "version": "2.3.0",
          "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
        }
      }
    }
  }
}
package.json
@@ -23,6 +23,7 @@
    "docxtemplater": "^3.50.0",
    "docxtemplater-image-module": "^3.1.0",
    "docxtemplater-image-module-free": "^1.1.1",
    "echarts": "^5.5.1",
    "element-plus": "^2.8.3",
    "exceljs": "^4.4.0",
    "file-saver": "^2.0.5",
src/api/fysp/problemApi.js
@@ -15,7 +15,7 @@
  fetchProblemType({ cityCode, districtCode, sceneTypeId }) {
    const params = `?taskTypeId=1&cityCode=${cityCode}&districtCode=${districtCode}&sceneTypeId=${sceneTypeId}`;
    return $fysp.get(`problemtype/search${params}`).then((res) => res);
    return $fysp.get(`problemtype/search${params}`).then((res) => res.data);
  },
  /**
src/api/index.js
@@ -11,7 +11,7 @@
let ip2_file = 'https://fyami.com.cn/';
if (debug) {
  ip1 = 'http://192.168.0.138:9001/';
  ip1 = 'http://192.168.0.110:9001/';
  // ip1_file = 'http://192.168.0.138:8080/';
  // ip2 = 'http://192.168.0.138:8080/';
  // ip2_file = 'https://fyami.com.cn/';
src/constants/menu.js
@@ -45,6 +45,27 @@
  },
  {
    icon: 'DataAnalysis',
    name: '基础数据产品',
    children: [
      {
        path: '/fysp/data-product/ProdScenseInfo',
        icon: 'Document',
        name: '场景清单',
      },
      {
        path: '/fysp/data-product/ProdMonitorTaskInfo',
        icon: 'Document',
        name: '监管清单',
      },
      {
        path: '/fysp/data-product/ProdTreatmentDeviceInfo',
        icon: 'Document',
        name: '防治设备清单',
      },
    ]
  },
  {
    icon: 'DataAnalysis',
    name: '中间数据产品',
    children: [
      {
src/enum/construction.js
@@ -34,6 +34,10 @@
      value: '全部',
    },
    {
      label: '打桩',
      value: '打桩',
    },
    {
      label: '基础',
      value: '基础',
    },
@@ -50,6 +54,14 @@
      value: '室外总体',
    },
    {
      label: '即将完工',
      value: '即将完工',
    },
    {
      label: '竣工验收',
      value: '竣工验收',
    },
    {
      label: '装饰装修',
      value: '装饰装修',
    },
src/main.js
@@ -19,12 +19,16 @@
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
// echarts
import * as echarts from 'echarts'
dayjs.extend(isSameOrAfter);
dayjs.extend(isSameOrBefore);
const app = createApp(App);
app.config.globalProperties.$fm = timeUtil;
app.config.globalProperties.$echarts = echarts
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component);
src/router/index.js
@@ -161,6 +161,24 @@
    path: '/fysp/support',
    component: () => import('@/views/fysp/support/JingAnSupport.vue'),
  },
  {
    // åŸºç¡€äº§å“-场景清单
    name: 'ProdScenseInfo',
    path: '/fysp/data-product/ProdScenseInfo',
    component: () => import('@/views/fysp/data-product/base-data-product/ProdScenseInfo.vue')
  },
  {
    // åŸºç¡€äº§å“-监管清单
    name: 'ProdMonitorTaskInfo',
    path: '/fysp/data-product/ProdMonitorTaskInfo',
    component: () => import('@/views/fysp/data-product/base-data-product/ProdMonitorTaskInfo.vue')
  },
  {
    // åŸºç¡€äº§å“-防治设备清单
    name: 'ProdTreatmentDeviceInfo',
    path: '/fysp/data-product/ProdTreatmentDeviceInfo',
    component: () => import('@/views/fysp/data-product/base-data-product/ProdTreatmentDeviceInfo.vue')
  },
  /**********************************飞羽环境***********************************************/
  {
src/utils/echart-util.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
// é€’归的获取obj中的prop属性 è§£å†³æœ‰æ—¶éœ€è¦å–val.obj.prop的情况
function getPropValueLoop(obj, prop) {
  if (typeof prop !== 'string') {
    return obj;
  }
  const props = prop.split('.');
  let result = obj;
  props.forEach((item) => {
    result = result[item];
  });
  return result;
}
function getCount(array, element) {
  let count = 0;
  array.forEach((e) => {
    if (e == element) {
      count++;
    }
  });
  return count;
}
export default {
  /** å°†chart图表转化为图片url
   * @param chart: chart图表的实例
   *  */
  chartToImageUrl(chart) {
    const dataURL = chart.getDataURL({
      pixelRatio: 5, // æé«˜å›¾ç‰‡è´¨é‡
      backgroundColor: '#FFFFFF', // è®¾ç½®èƒŒæ™¯é¢œè‰²
      excludeComponents: ['toolbox'], // æŽ’除工具箱组件
      type: 'png' // è¾“出图片类型为PNG
    });
    return dataURL;
  },
  // å±•示 data æ•°ç»„中对象的 prop å±žæ€§çš„饼图, title æ˜¯é¥¼å›¾çš„æ ‡é¢˜
  getPieChartByDataAndProp(data, prop, label) {
    let chartData = [];
    function hasThisName(name) {
      for (let index = 0; index < chartData.length; index++) {
        const element = chartData[index];
        if (element.name === name) {
          return true;
        }
      }
      return false;
    }
    data.map((item) => {
      const name = getPropValueLoop(item, prop);
      if (hasThisName(name)) {
        chartData.map((item) => {
          if (item.name === name) {
            item.value++;
          }
        });
      } else {
        chartData.push({
          name: name,
          value: 1
        });
      }
    });
    return {
      title: {
        text: label,
        left: 'center'
      },
      tooltip: {
        trigger: 'item'
      },
      legend: {
        orient: 'vertical',
        left: 'left'
      },
      series: [
        {
          type: 'pie',
          radius: '50%',
          data: chartData,
          emphasis: {
            itemStyle: {
              shadowBlur: 10,
              shadowOffsetX: 0,
              shadowColor: 'rgba(0, 0, 0, 0.5)'
            }
          }
        }
      ]
    };
  },
  // å±•示 data æ•°ç»„中对象的 prop å±žæ€§çš„直方图, title æ˜¯ç›´æ–¹å›¾çš„æ ‡é¢˜
  getBarChartByDataAndProp(data, prop, title) {
    let series = data.map((item) => getPropValueLoop(item, prop));
    const option = {
      title: {
        text: title //设置标题
      },
      xAxis: {
        type: 'category',
        data: Array.from(new Set(series)),
        axisLabel: {
          rotate: 45, // æ—‹è½¬æ ‡ç­¾ï¼Œé¿å…é‡å 
          // æˆ–者
          interval: 0 // æ˜¾ç¤ºæ‰€æœ‰æ ‡ç­¾ï¼Œå¯èƒ½å¯¼è‡´é‡å ï¼Œæ ¹æ®éœ€æ±‚调整
        }
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: Array.from(new Set(series)).map((item) =>
            getCount(series, item)
          ),
          type: 'bar',
          smooth: true
        }
      ]
    };
    return option;
  }
};
src/views/fysp/check/components/ComChangeEdit.vue
@@ -126,7 +126,7 @@
  mounted() {},
  methods: {
    pictureValidate() {
      if (this.changeType == 1 && this.fileList.length < 1) {
      if (this.fileList.length < 1) {
        ElMessage({
          message: '至少上传一张图片',
          type: 'error'
src/views/fysp/check/components/CompProblemAddOrUpd.vue
@@ -422,7 +422,7 @@
        districtCode: this.topTask.districtcode
      };
      problemApi.fetchProblemType(data).then((res) => {
        this.problemTypeList = res.data;
        this.problemTypeList = res;
        if (this.type == 1) {
          let currProName = String(this.problem.problemname);
@@ -614,7 +614,7 @@
          });
          if (this.type == 1) {
            let deleteImgCopy = this.deleteImg;
            fileUtil.getImageFiles(picUrls, function (files) {
            fileUtil.getImageFiles(picUrls, (files) => {
              data.append('deleteImg', deleteImgCopy);
              deepCopyPro.advise = deepCopyPro.advice;
              delete deepCopyPro['advice'];
@@ -633,14 +633,13 @@
            });
          } else {
            const deepCopySubTask = useCloned(this.subtask).cloned.value;
            const that = this;
            fileUtil.getImageFiles(picUrls, function (files) {
            fileUtil.getImageFiles(picUrls, (files) => {
              deepCopyPro.insGuid = deepCopySubTask.insGuid;
              delete deepCopyPro['description'];
              deepCopyPro.proName = deepCopyPro.problemname;
              delete deepCopyPro['problemname'];
              deepCopyPro.ptGuid = that.findProTypeByGuid(
                that.currProTypeGuid
              deepCopyPro.ptGuid = this.findProTypeByGuid(
                this.currProTypeGuid
              ).guid;
              deepCopyPro.locationId = deepCopyPro.locationid;
              delete deepCopyPro['locationid'];
src/views/fysp/check/components/CompProblemCard.vue
@@ -38,7 +38,7 @@
      >
    </el-descriptions>
    <el-scrollbar>
    <el-scrollbar style="width: 70%;">
      <el-descriptions
        title=" "
        :column="2"
@@ -89,7 +89,7 @@
      </el-col>
      <el-col :span="12">
        <el-row justify="end" class="btn-group">
          <el-button type="danger" size="small" @click="deletePro" disabled
          <el-button type="danger" size="small" @click="deletePro" :disabled="true"
            >删除</el-button
          >
          <!-- <el-button
@@ -423,6 +423,7 @@
  width: 240px;
  height: 250px;
  border-radius: 4px;
  margin-bottom: 6px;
}
.d-index {
@@ -446,14 +447,14 @@
.d-extra {
}
.descriptions-label-1 {
  color: whitesmoke;
  background: var(--el-color-danger-light-3);
:deep(.descriptions-label-1) {
  /* color: whitesmoke; */
  /* background: var(--el-color-danger-light-3); */
}
.descriptions-label-2 {
  color: whitesmoke;
  background-color: var(--el-color-success-light-3);
  /* color: whitesmoke; */
  /* background-color: var(--el-color-success-light-3); */
}
</style>
src/views/fysp/data-product/base-data-product/ProdMonitorTaskInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
<template>
  1
</template>
<script></script>
src/views/fysp/data-product/base-data-product/ProdScenseInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
<template>
  1
</template>
<script></script>
src/views/fysp/data-product/base-data-product/ProdTreatmentDeviceInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
<template>
  1
</template>
<script></script>
src/views/fysp/evaluation/EvalutationRecord.vue
@@ -23,7 +23,11 @@
        v-model:value="formSearch.scenetype"
      ></FYOptionScene>
      <!-- æ—¶é—´ -->
      <FYOptionTime :initValue="false" type="month" v-model:value="formSearch.time"></FYOptionTime>
      <FYOptionTime
        :initValue="false"
        type="month"
        v-model:value="formSearch.time"
      ></FYOptionTime>
    </template>
    <template #buttons>
      <!-- <el-button icon="Download" size="default" type="success" @click="download"
@@ -43,9 +47,20 @@
    </template>
    <template #table-column="{ size }">
      <el-table-column fixed="left" sortable="custom" prop="sceneIndex" label="编号" width="80">
      <el-table-column
        fixed="left"
        sortable="custom"
        prop="sceneIndex"
        label="编号"
        width="80"
      >
      </el-table-column>
      <el-table-column prop="sceneName" :show-overflow-tooltip="true" label="名称" width="300">
      <el-table-column
        prop="sceneName"
        :show-overflow-tooltip="true"
        label="名称"
        width="300"
      >
      </el-table-column>
      <el-table-column
        prop="subTaskTime"
@@ -54,10 +69,21 @@
        sortable="custom"
        :formatter="timeFormat"
      />
      <el-table-column prop="evaluation.resultscorebef" label="得分" width="90" sortable="custom" />
      <el-table-column prop="evaluation.resultscorebef" label="环信码" width="100">
      <el-table-column
        prop="evaluation.resultscorebef"
        label="得分"
        width="90"
        sortable="custom"
      />
      <el-table-column
        prop="evaluation.resultscorebef"
        label="环信码"
        width="100"
      >
        <template #default="{ row }">
          <span :style="`color: ${toCode(row).color};`">{{ toCode(row).name }}</span>
          <span :style="`color: ${toCode(row).color};`">{{
            toCode(row).name
          }}</span>
        </template>
      </el-table-column>
@@ -112,12 +138,18 @@
            :loading="updateLoading"
            >上传</el-button
          >
          <el-button v-show="scoreShow" size="small" type="error" @click="scoreShow = false"
          <el-button
            v-show="scoreShow"
            size="small"
            type="error"
            @click="scoreShow = false"
            >取消</el-button
          >
        </template>
        <template #default="{ row }">
          <el-button type="primary" size="small" @click="editRow(row)">查看</el-button>
          <el-button type="primary" size="small" @click="editRow(row)"
            >查看</el-button
          >
        </template>
      </el-table-column>
    </template>
@@ -135,12 +167,25 @@
export default {
  setup() {
    const { cellClick, cellClassName, handlePaste, setTableData, addRefreshEvent, tableData } =
      useTablePaste({
        score1: 8,
        score2: 9
      });
    return { cellClick, cellClassName, handlePaste, setTableData, addRefreshEvent, tableData };
    const {
      cellClick,
      cellClassName,
      handlePaste,
      setTableData,
      addRefreshEvent,
      tableData
    } = useTablePaste({
      score1: 8,
      score2: 9
    });
    return {
      cellClick,
      cellClassName,
      handlePaste,
      setTableData,
      addRefreshEvent,
      tableData
    };
  },
  components: { CompReport },
  data() {
@@ -248,17 +293,21 @@
        if (res.data.length > 0) {
          this.evaluationRule = res.data[0];
          // èŽ·å–å…·ä½“å­è§„åˆ™
          return evaluateApi.getSubRules(this.evaluationRule.guid).then((res) => {
            this.evaluationSubRule = res.data;
            // æŸ¥æ‰¾å¯å¯¼å…¥å¾—分的规则id
            for (const key in this.ruleName) {
              const value = this.ruleName[key];
              const subrule = this.evaluationSubRule.find((v) => {
                return v.itemname == value.name;
              });
              value.id = subrule.guid;
            }
          });
          return evaluateApi
            .getSubRules(this.evaluationRule.guid)
            .then((res) => {
              this.evaluationSubRule = res.data;
              // æŸ¥æ‰¾å¯å¯¼å…¥å¾—分的规则id
              for (const key in this.ruleName) {
                const value = this.ruleName[key];
                const subrule = this.evaluationSubRule.find((v) => {
                  return v.itemname == value.name;
                });
                if (subrule) {
                  value.id = subrule.guid;
                }
              }
            });
        }
      });
    },
src/views/fysp/scene/CompSceneMixingPlantInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
<!-- æ…拌站专属信息编辑 -->
<template>
  <BaseSceneInfo ref="baseSceneInfo" :scene="scene" :formInfo="formInfo" :scene-type="sceneType">
    <template #form-items>
      <el-form
        v-show="showStyle == 'form'"
        :inline="false"
        :model="formObj"
        ref="formRef"
        :rules="rules"
        label-position="right"
        label-width="150px"
      >
        <!-- <el-form-item label="运营状态" prop="mpStatus">
      <el-select v-model="formObj.mpStatus" placeholder="运营状态">
        <el-option
          v-for="s in status"
          :key="s.value"
          :label="s.label"
          :value="s.value"
        />
      </el-select>
    </el-form-item> -->
        <el-form-item label="占地面积" prop="mpFloorSpace">
          <el-input
            clearable
            v-model="formObj.mpFloorSpace"
            placeholder="占地面积"
          >
            <template #append>㎡</template>
          </el-input>
        </el-form-item>
        <el-form-item label="规划面积" prop="mpPlanningArea">
          <el-input
            clearable
            v-model="formObj.mpPlanningArea"
            placeholder="规划面积"
          >
            <template #append>㎡</template>
          </el-input>
        </el-form-item>
        <el-form-item label="业主单位" prop="mpEmployerUnit">
          <el-input
            clearable
            v-model="formObj.mpEmployerUnit"
            placeholder="业主单位"
          />
        </el-form-item>
        <el-form-item label="业主单位联系人" prop="mpEmployerContacts">
          <el-input
            clearable
            v-model="formObj.mpEmployerContacts"
            placeholder="业主单位联系人"
          />
        </el-form-item>
        <el-form-item
          label="业主单位联系电话"
          prop="mpEmployerContactsTel"
          class="input-with-select"
        >
          <el-input
            clearable
            type="tel"
            v-model="formObj.mpEmployerContactsTel"
            placeholder="业主单位联系电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item label="是否为绿色环保站厂" prop="mpGreenPlant">
          <el-select
            v-model="formObj.mpGreenPlant"
            placeholder="是否为绿色环保站厂"
          >
            <el-option
              v-for="s in [
                { value: false, label: '否' },
                { value: true, label: '是' }
              ]"
              :key="s.value"
              :label="s.label"
              :value="s.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="是否为文明场站" prop="mpCivillyPlant">
          <el-select
            v-model="formObj.mpCivillyPlant"
            placeholder="是否为文明场站"
          >
            <el-option
              v-for="s in [
                { value: false, label: '否' },
                { value: true, label: '是' }
              ]"
              :key="s.value"
              :label="s.label"
              :value="s.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            :disabled="!edit"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button :disabled="!edit" @click="onReset">重置</el-button>
        </el-form-item>
      </el-form>
    </template>
    <template #description-items>
      <el-descriptions
        v-show="showStyle == 'descriptions'"
        :column="2"
        :size="fontSize"
        direction="horizontal"
        border
      >
        <template #title>
          <el-text tag="h1">{{ title }}</el-text>
        </template>
        <template #extra>
          <el-button
            :size="fontSize"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button
            :size="fontSize"
            :disabled="!edit && !ignoreEdit"
            @click="onReset"
            >重置</el-button
          >
        </template>
        <el-descriptions-item label="占地面积"
            ><el-input
              :size="fontSize"
              clearable
              v-model="formObj.mpFloorSpace"
              placeholder="占地面积"
            >
              <template #append>㎡</template>
            </el-input></el-descriptions-item
          >
          <el-descriptions-item label="规划面积"
            ><el-input
              :size="fontSize"
              clearable
              v-model="formObj.mpPlanningArea"
              placeholder="规划面积"
            >
              <template #append>㎡</template>
            </el-input></el-descriptions-item
          >
          <el-descriptions-item label="业主单位">
            <el-input
              clearable
              v-model="formObj.mpEmployerUnit"
              placeholder="业主单位"
            />
          </el-descriptions-item>
          <el-descriptions-item label="业主单位联系人">
            <el-input
              clearable
              v-model="formObj.mpEmployerContacts"
              placeholder="业主单位联系人"
            />
          </el-descriptions-item>
          <el-descriptions-item
            label="业主单位联系电话"
            prop="mpEmployerContactsTel"
            class="input-with-select"
            :span="2"
          >
            <el-input
              clearable
              type="tel"
              v-model="formObj.mpEmployerContactsTel"
              placeholder="业主单位联系电话"
            >
              <template #prepend>
                <el-icon><Iphone /></el-icon>
              </template>
            </el-input>
          </el-descriptions-item>
          <el-descriptions-item label="是否为绿色环保站厂">
            <el-select
              v-model="formObj.mpGreenPlant"
              placeholder="是否为绿色环保站厂"
            >
              <el-option
                v-for="s in [
                  { value: false, label: '否' },
                  { value: true, label: '是' }
                ]"
                :key="s.value"
                :label="s.label"
                :value="s.value"
              />
            </el-select>
          </el-descriptions-item>
          <el-descriptions-item label="是否为文明场站">
            <el-select
              v-model="formObj.mpCivillyPlant"
              placeholder="是否为文明场站"
            >
              <el-option
                v-for="s in [
                  { value: false, label: '否' },
                  { value: true, label: '是' }
                ]"
                :key="s.value"
                :label="s.label"
                :value="s.value"
              />
            </el-select>
          </el-descriptions-item>
          <el-descriptions-item label="施工地址" span="2"
            ><el-input
              clearable
              v-model="sceneObj.location"
              placeholder="施工地址"
              :size="fontSize"
          /></el-descriptions-item>
          <el-descriptions-item label="项目负责人"
            ><el-input
              :size="fontSize"
              clearable
              v-model="sceneObj.contacts"
              placeholder="项目负责人"
          /></el-descriptions-item>
          <el-descriptions-item label="项目负责人电话"
            ><el-input
              :size="fontSize"
              clearable
              type="tel"
              v-model="sceneObj.contactst"
              placeholder="项目负责人电话"
            >
              <template #prepend>
                <el-icon><Iphone /></el-icon>
              </template> </el-input
          ></el-descriptions-item>
      </el-descriptions>
    </template>
  </BaseSceneInfo>
</template>
<script setup>
import { reactive, ref, watch, computed } from 'vue';
import { useFormConfirm } from '@/composables/formConfirm';
import BaseSceneInfo from './BaseSceneInfo.vue';
const props = defineProps({
  scene: Object,
  //工地额外信息
  formInfo: Object,
  //场景类型:工地
  sceneType: {
    type: Number,
    default: 1
  },
  // å±•示样式 form:表单;descriptions:描述列表
  showStyle: {
    type: String,
    default: 'descriptions'
    // default:'form'
  },
  title: String
});
const fontSize = ref('small');
const emit = defineEmits([
  'onSubmit',
  'onCancel',
  'update:scene',
  'update:formInfo'
]);
const sceneObj = ref({});
const { formObj, formRef, edit, onSubmit, onReset } = useFormConfirm({
  submit: {
    do: submit
  },
  cancel: {
    do: cancel
  }
});
const ignoreEdit = computed(() => props.showStyle == 'descriptions');
const loading = ref(false);
const status = reactive([]);
const rules = reactive({});
const baseSceneInfo = ref(null);
function submit() {
  return baseSceneInfo.value.submit()
}
function cancel() {
  emit('onCancel');
}
watch(
  () => props.formInfo,
  (nValue) => {
    if (nValue) {
      formObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
watch(
  () => props.scene,
  (nValue) => {
    if (nValue) {
      sceneObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
</script>
<style>
/* .input-with-select .el-input-group__prepend {
  background-color: var(--el-fill-color-blank);
} */
.sub-title {
  font-size: var(--el-font-size-large);
  margin-bottom: 20px;
  margin-left: 20px;
}
</style>
src/views/fysp/scene/CompSceneWharfInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,305 @@
<!-- ç å¤´ä¸“属信息编辑 -->
<template>
  <BaseSceneInfo ref="baseSceneInfo" :scene="scene" :formInfo="formInfo" :scene-type="sceneType">
    <template #form-items>
      <el-form
        v-show="showStyle == 'form'"
        :inline="false"
        :model="formObj"
        ref="formRef"
        :rules="rules"
        label-position="right"
        label-width="150px"
      >
        <el-form-item label="类型" prop="wProjectType">
          <el-input
            clearable
            v-model="formObj.wProjectType"
            placeholder="类型"
          />
        </el-form-item>
        <!-- <el-form-item label="运营状态" prop="wStatus">
      <el-select v-model="formObj.wStatus" placeholder="运营状态">
        <el-option
          v-for="s in status"
          :key="s.value"
          :label="s.label"
          :value="s.value"
        />
      </el-select>
    </el-form-item> -->
        <el-form-item label="业主单位" prop="wEmployerUnit">
          <el-input
            clearable
            v-model="formObj.wEmployerUnit"
            placeholder="业主单位"
          />
        </el-form-item>
        <el-form-item label="业主单位联系人" prop="wEmployerContacts">
          <el-input
            clearable
            v-model="formObj.wEmployerContacts"
            placeholder="业主单位联系人"
          />
        </el-form-item>
        <el-form-item
          label="业主单位联系电话"
          prop="wEmployerContactsTel"
          class="input-with-select"
        >
          <el-input
            clearable
            type="tel"
            v-model="formObj.wEmployerContactsTel"
            placeholder="业主单位联系电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item label="租赁单位" prop="wRentUnit">
          <el-input
            clearable
            v-model="formObj.wRentUnit"
            placeholder="租赁单位"
          />
        </el-form-item>
        <el-form-item label="租赁单位联系人" prop="wRentContacts">
          <el-input
            clearable
            v-model="formObj.wRentContacts"
            placeholder="租赁单位联系人"
          />
        </el-form-item>
        <el-form-item label="租赁单位联系人电话" prop="wRentContactsTel">
          <el-input
            clearable
            type="tel"
            v-model="formObj.wRentContactsTel"
            placeholder="租赁单位联系人电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item>
          <el-button
            :disabled="!edit"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button :disabled="!edit" @click="onReset">重置</el-button>
        </el-form-item>
      </el-form>
    </template>
    <template #description-items>
      <el-descriptions
        v-show="showStyle == 'descriptions'"
        :column="2"
        :size="fontSize"
        direction="horizontal"
        border
      >
        <template #title>
          <el-text tag="h1">{{ title }}</el-text>
        </template>
        <template #extra>
          <el-button
            :disabled="!edit && !ignoreEdit"
            :size="fontSize"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button
            :size="fontSize"
            :disabled="!edit && !ignoreEdit"
            @click="onReset"
            >重置</el-button
          >
        </template>
        <el-descriptions-item label="类型" :span="2"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wProjectType"
            placeholder="类型"
        /></el-descriptions-item>
        <el-descriptions-item label="占地面积"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wFloorSpace"
            placeholder="占地面积"
          >
            <template #append>㎡</template>
          </el-input></el-descriptions-item
        >
        <el-descriptions-item label="规划面积"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wPlanningArea"
            placeholder="规划面积"
          >
            <template #append>㎡</template>
          </el-input></el-descriptions-item
        >
        <el-descriptions-item label="业主单位">
          <el-input
            clearable
            v-model="formObj.wEmployerUnit"
            placeholder="业主单位"
          />
        </el-descriptions-item>
        <el-descriptions-item label="业主单位联系人">
          <el-input
            clearable
            v-model="formObj.wEmployerContacts"
            placeholder="业主单位联系人"
          />
        </el-descriptions-item>
        <el-descriptions-item
          label="业主单位联系电话"
          prop="mpEmployerContactsTel"
          class="input-with-select"
          :span="2"
        >
          <el-input
            clearable
            type="tel"
            v-model="formObj.wEmployerContactsTel"
            placeholder="业主单位联系电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-descriptions-item>
        <el-descriptions-item label="施工地址" span="2"
          ><el-input
            clearable
            v-model="sceneObj.location"
            placeholder="施工地址"
            :size="fontSize"
        /></el-descriptions-item>
        <el-descriptions-item label="项目负责人"
          ><el-input
            :size="fontSize"
            clearable
            v-model="sceneObj.contacts"
            placeholder="项目负责人"
        /></el-descriptions-item>
        <el-descriptions-item label="项目负责人电话"
          ><el-input
            :size="fontSize"
            clearable
            type="tel"
            v-model="sceneObj.contactst"
            placeholder="项目负责人电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template> </el-input
        ></el-descriptions-item>
        <el-descriptions-item label="租赁单位"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wRentUnit"
            placeholder="租赁单位"
        /></el-descriptions-item>
      </el-descriptions>
    </template>
  </BaseSceneInfo>
</template>
<script setup>
import { reactive, ref, watch, computed } from 'vue';
import { useFormConfirm } from '@/composables/formConfirm';
import BaseSceneInfo from './BaseSceneInfo.vue';
const props = defineProps({
  scene: Object,
  //工地额外信息
  formInfo: Object,
  //场景类型:工地
  sceneType: {
    type: Number,
    default: 1
  },
  // å±•示样式 form:表单;descriptions:描述列表
  showStyle: {
    type: String,
    default: 'descriptions'
    // default:'form'
  },
  title: String
});
const fontSize = ref('small');
const emit = defineEmits([
  'onSubmit',
  'onCancel',
  'update:scene',
  'update:formInfo'
]);
const sceneObj = ref({});
const { formObj, formRef, edit, onSubmit, onReset } = useFormConfirm({
  submit: {
    do: submit
  },
  cancel: {
    do: cancel
  }
});
const ignoreEdit = computed(() => props.showStyle == 'descriptions');
const loading = ref(false);
const status = reactive([]);
const rules = reactive({});
const baseSceneInfo = ref(null);
function submit() {
  return baseSceneInfo.value.submit()
}
function cancel() {
  emit('onCancel');
}
watch(
  () => props.formInfo,
  (nValue) => {
    if (nValue) {
      formObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
watch(
  () => props.scene,
  (nValue) => {
    if (nValue) {
      sceneObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
</script>
<style>
/* .input-with-select .el-input-group__prepend {
  background-color: var(--el-fill-color-blank);
} */
.sub-title {
  font-size: var(--el-font-size-large);
  margin-bottom: 20px;
  margin-left: 20px;
}
</style>
src/views/fysp/scene/components/BaseSceneInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<template>
  <slot name="form-items"></slot>
  <slot name="description-items"></slot>
</template>
<script setup>
import { reactive, ref, watch, computed } from 'vue';
import { useDateFormat } from '@vueuse/core';
import sceneApi from '@/api/fysp/sceneApi';
expose({
  submit
});
const props = defineProps({
  scene: Object,
  //工地额外信息
  formInfo: Object,
  //场景类型:工地
  sceneType: {
    type: Number,
    default: 1
  },
});
const emit = defineEmits([
  'onSubmit',
  'onCancel',
  'update:scene',
  'update:formInfo'
]);
const loading = ref(false);
const formObj = ref({});
const sceneObj = ref({});
// åˆ›å»ºæˆ–更新场景详情
function createOrupdateSubScene() {
  loading.value = true;
  if (formObj.value._timeRange && formObj.value._timeRange.length == 2) {
    const t = formObj.value._timeRange;
    formObj.value.csStartTime = useDateFormat(t[0], 'YYYY-MM-DD');
    formObj.value.csEndTime = useDateFormat(t[1], 'YYYY-MM-DD');
  }
  return sceneApi
    .updateSubScene(props.sceneType, formObj.value)
    .then((res) => {
      emit('onSubmit', formObj);
      emit('update:formInfo', formObj);
      return res.data;
    })
    .finally(() => {
      loading.value = false;
    });
}
// æ›´æ–°åœºæ™¯
function updateScene() {
  return sceneApi.updateScene(sceneObj.value).then(() => {
    emit('update:scene', sceneObj);
  });
}
function submit() {
  updateScene();
  return createOrupdateSubScene();
}
function cancel() {
  emit('onCancel');
}
watch(
  () => props.formInfo,
  (nValue) => {
    if (nValue) {
      formObj.value = nValue;
      formObj.value._timeRange = [
        new Date(formObj.value.csStartTime),
        new Date(formObj.value.csEndTime)
      ];
    }
  },
  { deep: false, immediate: true }
);
watch(
  () => props.scene,
  (nValue) => {
    if (nValue) {
      sceneObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
</script>
src/views/fysp/task/TaskManage.vue
@@ -51,8 +51,9 @@
                    create
                    v-model="curSubTaskList"
                    :loading="subTaskLoading"
                    :create-loading="daytaskLoading"
                    height="56vh"
                    @add="subTaskDrawer = true"
                    @add="handleAddSubtask"
                    @submit="handleSubtaskSubmit"
                  ></CompSubTaskList>
                </el-col>
@@ -115,6 +116,9 @@
</template>
<script>
import { unref } from 'vue';
import { useCloned } from '@vueuse/core';
import dayjs from 'dayjs';
import taskApi from '@/api/fysp/taskApi';
import CompMonitorObj from './components/CompMonitorObj.vue';
import CompMonitorPlan from './components/CompMonitorPlan.vue';
@@ -181,11 +185,18 @@
      subTaskDrawer: false,
      // å½“前选择的日任务
      curDayTask: {},
      curDay: undefined,
      daytaskLoading: false,
      // å½“前选择的日任务下的子任务
      curSubTaskList: undefined,
      subTaskLoading: false,
      // æ€»ä»»åŠ¡æ–°å¢žå¼¹å‡ºæ¡†
      topTaskAddVisible: false
    };
  },
  provide() {
    return {
      topTask: this.curTask
    };
  },
  computed: {
@@ -273,7 +284,8 @@
        }
      });
    },
    onDateChange(dayTask) {
    onDateChange(dayTask, day) {
      this.curDay = day;
      if (dayTask) {
        this.subTaskLoading = true;
        // this.subTaskDrawer = true;
@@ -286,6 +298,7 @@
          .finally(() => (this.subTaskLoading = false));
      } else {
        this.curSubTaskList = [];
        this.curDayTask = {};
      }
    },
    navToTaskCreate(value) {
@@ -302,6 +315,43 @@
      this.$refs.planRef
        .fetchDayTasks()
        .finally(() => (this.subTaskLoading = false));
    },
    handleAddSubtask() {
      // åˆ¤æ–­å½“日是否有日任务,若没有,先创建在跳转子任务创建界面
      if (this.curDayTask.guid) {
        this.subTaskDrawer = true;
      } else {
        const _dayTask = useCloned(this.curTask.data).cloned.value;
        const taskDate = dayjs(this.curDay);
        _dayTask.tsguid = _dayTask.tguid;
        _dayTask.tguid = null;
        _dayTask.levelnum = null;
        _dayTask.name = `${taskDate.format('YYYYå¹´MM月DD日')}${
          _dayTask.cityname
        }${_dayTask.districtname}${_dayTask.typename}任务`;
        _dayTask.starttime = taskDate.startOf('day').toDate();
        _dayTask.endtime = taskDate.endOf('day').millisecond(0).toDate();
        _dayTask.settime = dayjs().toDate();
        _dayTask.t1stverifytime = dayjs().toDate();
        _dayTask.runingstatus = '未执行';
        this.daytaskLoading = true;
        taskApi
          .putTask(_dayTask)
          .then((res) => {
            this.curDayTask = {
              guid: res.data.tguid,
              tsGuid: res.data.tsguid,
              changedTaskNum: 0,
              check: true,
              completeTaskNum: 0,
              date: res.data.starttime,
              totalTaskNum: 0
            };
            this.subTaskDrawer = true;
            this.handleSubtaskSubmit();
          })
          .finally(() => (this.daytaskLoading = false));
      }
    }
  },
  mounted() {
src/views/fysp/task/TaskProxy.js
@@ -17,13 +17,13 @@
    executorOptions.forEach((e) => {
      const index = data.indexOf(e.value);
      if (index != -1) {
        ids.push(e.data.guid);
        uNames.push(e.data.acountname);
        rNames.push(e.data.realname);
        ids.push(e.data.id);
        uNames.push(e.data.userName);
        rNames.push(e.data.realName);
      }
    });
    return {
      id: ids.join('#'),
      ids: ids.join('#'),
      uName: uNames.join('#'),
      rName: rNames.join('#')
    };
src/views/fysp/task/components/CompDayTask.vue
@@ -47,7 +47,7 @@
  </el-row>
</template>
<script setup>
import { ref, watch, onMounted } from 'vue';
import { ref, watch, onMounted, inject } from 'vue';
import { useCloned } from '@vueuse/core';
import { useRoute, useRouter } from 'vue-router';
import { ElMessage, ElNotification, ElMessageBox } from 'element-plus';
src/views/fysp/task/components/CompMonitorPlan.vue
@@ -135,7 +135,7 @@
  if (isDayEnable(e)) {
    const day = dayjs(e).format('YYYY-MM-DD');
    const t = computeDayTask(day);
    emit('dateChange', t);
    emit('dateChange', t, day);
  }
}
src/views/fysp/task/components/CompSubTaskList.vue
@@ -44,7 +44,11 @@
      <div v-else>
        <el-empty description="无任务记录" />
        <el-row v-if="create" justify="center">
          <el-button type="success" size="small" @click="add"
          <el-button
            type="success"
            size="small"
            :loading="createLoading"
            @click="add"
            >添加任务</el-button
          >
        </el-row>
@@ -81,7 +85,8 @@
  },
  // æ˜¯å¦æ˜¾ç¤ºæ·»åŠ ä»»åŠ¡æŒ‰é’®
  create: Boolean,
  loading: Boolean
  loading: Boolean,
  createLoading:Boolean,
});
const dialogVisible = ref(false);
@@ -100,7 +105,7 @@
      return subtaskApi.deleteSubtask(item.stguid).then(res=>{
        if (res == 1) {
          const index = data.value.indexOf(item);
          data.value.splice(index, 1);
          data.value.splice(index, 1);
          emit('update:modelValue', data.value);
          emit('remove', item);
src/views/fysp/task/components/CompSubTaskSelect.vue
@@ -70,16 +70,12 @@
/**
 * å·¡æŸ¥å­ä»»åŠ¡åˆ›å»º
 */
import { ref, reactive, watch, computed, onMounted } from 'vue';
import { ref, reactive, watch, computed, onMounted, inject } from 'vue';
import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
import taskApi from '@/api/fysp/taskApi';
import TaskProxy from '../TaskProxy';
onMounted(() => {
  // if (props.height) {
  //   scrollHeight.value =
  // }
});
// const topTask = inject('topTask');
const props = defineProps({
  // å­ä»»åŠ¡é›†åˆ
@@ -122,12 +118,16 @@
  } else {
    success();
    // å°†ä»»åŠ¡æ‰§è¡Œäººæ ¼å¼åŒ–å¹¶ä¼ é€’
    const param = TaskProxy.getExecutors(v.value.executor, executors.value)
    emit('submit', param)
    const param = TaskProxy.getExecutors(v.value.executor, executors.value);
    emit('submit', param);
  }
}
/************************* ä»»åŠ¡æ‰§è¡Œäººä¸‹æ‹‰é€‰æ¡† *******************************/
// onMounted(() => {
//   getExecutors(topTask.value);
// });
const executors = ref([]);
// æ˜¯å¦å…¨é€‰
const checkAll = ref(false);
@@ -142,36 +142,46 @@
    formInfo.value.executor = [];
  }
}
function getExecutors(t) {
  const ids = t.executorguids.split('#');
  const userNames = t.executorusernames.split('#');
  const realNames = t.executorrealnames.split('#');
  const list = [];
  ids.forEach((e, i) => {
    if (i < userNames.length && i < realNames.length) {
      list.push({
        label: realNames[i],
        value: e,
        data: {
          id: e,
          userName: userNames[i],
          realName: realNames[i]
        }
      });
    }
  });
  executors.value = list;
}
// watch(topTask, (nV, oV) => {
//   if (nV != oV) {
//     getExecutors(nV);
//   }
// });
watch(
  () => props.dayTask,
  (nV, oV) => {
    if (nV != oV) {
      taskApi.fetchTaskById(nV.guid).then((res) => {
        const ids = res.executorguids.split('#');
        const userNames = res.executorusernames.split('#');
        const realNames = res.executorrealnames.split('#');
        const list = [];
        ids.forEach((e, i) => {
          if (i < userNames.length && i < realNames.length) {
            list.push({
              label: realNames[i],
              value: e,
              data: {
                id: e,
                userName: userNames[i],
                realName: realNames[i]
              }
            });
          }
        });
        executors.value = list;
        getExecutors(res);
      });
    }
  },
  { immediate: true }
);
//
watch(
  () => formInfo.value.executor,
  (val) => {
src/views/fysp/task/components/CompTaskEdit.vue
@@ -216,7 +216,7 @@
}
function genTaskName() {
  let name = dayjs(formRef.value.formObj._timeArr[0]).format('YYYYå¹´MM月');
  let name = dayjs(formRef.value.formObj._timeArr[0]).format('YYYYå¹´M月');
  name += locationText(formRef.value.formObj._locations);
  name += formRef.value.formObj._type.text;
  name += '任务';