From d4e7c11e06b643c9353444c839cec40c25945219 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期三, 30 十月 2024 17:37:05 +0800
Subject: [PATCH] 1. 场景报告模块编写(暂存)

---
 src/views/fysp/data-product/ProdSceneReport.vue             |  270 ++++++++++++
 src/enum/device/monitorDevice.js                            |   77 +++
 src/model/info                                              |    0 
 src/views/fysp/scene/CompSceneConstructionInfo.vue          |  211 +++++++++
 src/model/fysp/device.js                                    |   28 +
 src/enum/device/productionDevice.js                         |   67 +++
 src/components.d.ts                                         |   11 
 src/components/SideList.vue                                 |   62 +-
 src/constants/menu.js                                       |    8 
 src/views/fysp/data-product/components/CompImgInfo.vue      |   80 +++
 src/enum/device/device.js                                   |   24 +
 src/views/fysp/check/components/ArbitraryPhoto.vue          |  116 +++--
 src/views/fysp/data-product/components/CompProblemTable.vue |  116 +++++
 src/components/FYImageSelectDialog.vue                      |   99 ++++
 src/enum/device/treatmentDevice.js                          |   75 +++
 src/api/fysp/deviceApi.js                                   |   12 
 16 files changed, 1,155 insertions(+), 101 deletions(-)

diff --git a/src/api/fysp/deviceApi.js b/src/api/fysp/deviceApi.js
index 8dc9dd1..fe67087 100644
--- a/src/api/fysp/deviceApi.js
+++ b/src/api/fysp/deviceApi.js
@@ -13,11 +13,17 @@
   // 鑾峰彇璁惧
   async fetchDevices(sceneId, deviceTypeId) {
     const params = `?sceneId=${sceneId}&deviceTypeId=${deviceTypeId}`;
-    return await $fysp.get(`device${params}`).then((res) => res).then((res) => res.data);
+    return await $fysp
+      .get(`device${params}`)
+      .then((res) => res)
+      .then((res) => res.data);
   },
   // 鑾峰彇璁惧鐘舵�佷互鍙婅澶囪鎯�
-  async fetchDeviceStatus({deviceId, sceneId, deviceTypeId}) {
+  async fetchDeviceStatus({ deviceId, sceneId, deviceTypeId }) {
     const params = `?deviceId=${deviceId}&sceneId=${sceneId}&deviceTypeId=${deviceTypeId}`;
-    return await $fysp.get(`device/status${params}`).then((res) => res).then((res) => res.data);
+    return await $fysp
+      .get(`device/status${params}`)
+      .then((res) => res)
+      .then((res) => res.data);
   }
 };
diff --git a/src/components.d.ts b/src/components.d.ts
index 13c1bdc..e7b8095 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -12,17 +12,13 @@
     BasePanelLayout: typeof import('./components/core/BasePanelLayout.vue')['default']
     CompQuickSet: typeof import('./components/search-option/CompQuickSet.vue')['default']
     Content: typeof import('./components/core/Content.vue')['default']
-    ElAffix: typeof import('element-plus/es')['ElAffix']
     ElAside: typeof import('element-plus/es')['ElAside']
     ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
-    ElCalendar: typeof import('element-plus/es')['ElCalendar']
     ElCard: typeof import('element-plus/es')['ElCard']
-    ElCascader: typeof import('element-plus/es')['ElCascader']
-    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElCollapse: typeof import('element-plus/es')['ElCollapse']
     ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
@@ -41,19 +37,14 @@
     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']
     ElMain: typeof import('element-plus/es')['ElMain']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup']
     ElOption: typeof import('element-plus/es')['ElOption']
-    ElPagination: typeof import('element-plus/es')['ElPagination']
     ElPopover: typeof import('element-plus/es')['ElPopover']
-    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
-    ElSegmented: typeof import('element-plus/es')['ElSegmented']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSpace: typeof import('element-plus/es')['ElSpace']
     ElStep: typeof import('element-plus/es')['ElStep']
@@ -65,7 +56,6 @@
     ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
-    ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     Footer: typeof import('./components/core/Footer.vue')['default']
@@ -74,6 +64,7 @@
     FYBgTaskDialog: typeof import('./components/bg-task/FYBgTaskDialog.vue')['default']
     FYBgTaskItem: typeof import('./components/bg-task/FYBgTaskItem.vue')['default']
     FYForm: typeof import('./components/form/FYForm.vue')['default']
+    FYImageSelectDialog: typeof import('./components/FYImageSelectDialog.vue')['default']
     FYInfoSearch: typeof import('./components/search-option/FYInfoSearch.vue')['default']
     FYList: typeof import('./components/table/FYList.vue')['default']
     FYOptionLocation: typeof import('./components/search-option/FYOptionLocation.vue')['default']
diff --git a/src/components/FYImageSelectDialog.vue b/src/components/FYImageSelectDialog.vue
new file mode 100644
index 0000000..f9f249c
--- /dev/null
+++ b/src/components/FYImageSelectDialog.vue
@@ -0,0 +1,99 @@
+<template>
+  <el-dialog
+    v-model="anyPhotoDialog"
+    width="66%"
+    title="浠绘剰鍥剧墖"
+    destroy-on-close
+  >
+    <div class="main">
+      <el-row justify="end" class="btns" v-if="!readonly">
+        <el-text size="small" type="info" class="m-r-8"
+          >鏈�澶氶�夋嫨{{ maxSelect }}寮犲浘鐗�</el-text
+        >
+        <el-button
+          size="small"
+          type="primary"
+          @click="sendSelectedImg(true)"
+          :disabled="selectedImgUrlList.length == 0"
+          >纭畾</el-button
+        >
+        <el-button size="small" type="primary" @click="sendSelectedImg(false)"
+          >鍙栨秷</el-button
+        >
+      </el-row>
+
+      <div class="center">
+        <el-tabs v-if="typeList.length > 0" v-model="activeId" type="card">
+          <el-tab-pane
+            v-for="item in typeList"
+            :key="item.typeId"
+            :label="
+              item.typeName + ' (' + typeImgMap.get(activeId).length + ')'
+            "
+            :name="item.typeId"
+          >
+          </el-tab-pane>
+        </el-tabs>
+        <el-empty v-if="isEmpty" description="鏆傛棤璁板綍" />
+        <el-scrollbar class="imgs">
+          <el-image
+            v-for="(img, i) in typeImgMap.get(activeId)"
+            :key="i"
+            :class="[img.isSelect ? 'selected' : 'noActive', 'image']"
+            fit="cover"
+            :src="img.url"
+            lazy
+            @click="onSelect(img, i)"
+          />
+        </el-scrollbar>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+<script setup>
+import { ref, watch } from 'vue';
+
+const props = defineProps({
+  typeList: {
+    type: Array,
+    default: () => []
+  },
+  // 鏄惁浠ュ彧璇荤殑褰㈠紡鏌ョ湅褰撳墠椤甸潰
+  readonly: {
+    type: Boolean,
+    default: false
+  },
+  defaultFile: {
+    type: Array,
+    default: () => []
+  },
+  // 鍥剧墖鍙�夋暟閲忥紝褰撲紶鍏ユ暟瀛楁椂锛屼唬琛ㄥ浘鐗囨暟閲�
+  maxSelect: {
+    type: Number,
+    default: 3
+  }
+});
+
+const activeId = ref('');
+const typeImgMap = ref(new Map());
+const selectedImgList = ref([]);
+
+watch(typeImgMap, (newMap, oldMap) => {
+  if (newMap.get(activeId.value) == undefined) {
+    return;
+  }
+  newMap.get(activeId.value).forEach(
+    (i) => {
+      if (i.isSelect == true) {
+        return;
+      }
+      props.defaultFile.forEach((imgItem) => {
+        if (imgItem.url == i.url) {
+          i.isSelect = true;
+        }
+      });
+    },
+    { deep: true }
+  );
+});
+</script>
diff --git a/src/components/SideList.vue b/src/components/SideList.vue
index 4b440fe..fc8c61f 100644
--- a/src/components/SideList.vue
+++ b/src/components/SideList.vue
@@ -11,24 +11,26 @@
     empty-text="鏆傛棤璁板綍"
   >
     <template #default="{ node, data }">
-      <div
-        :class="
-          data.selected
-            ? 'selected-tree-node custom-tree-node'
-            : 'custom-tree-node'
-        "
-      >
-        <el-icon v-if="data.type == 2" color="var(--el-color-success)"
-          ><SuccessFilled
-        /></el-icon>
-        <el-icon v-else-if="data.type == 1" color="var(--el-color-warning)"
-          ><WarningFilled
-        /></el-icon>
-        <el-icon v-else-if="data.type == 0" color="var(--el-color-danger)"
-          ><WarningFilled
-        /></el-icon>
-        <div>{{ node.label }}</div>
-      </div>
+      <slot :node="node" :data="data">
+        <div
+          :class="
+            data.selected
+              ? 'selected-tree-node custom-tree-node'
+              : 'custom-tree-node'
+          "
+        >
+          <el-icon v-if="data.type == 2" color="var(--el-color-success)"
+            ><SuccessFilled
+          /></el-icon>
+          <el-icon v-else-if="data.type == 1" color="var(--el-color-warning)"
+            ><WarningFilled
+          /></el-icon>
+          <el-icon v-else-if="data.type == 0" color="var(--el-color-danger)"
+            ><WarningFilled
+          /></el-icon>
+          <div>{{ node.label }}</div>
+        </div>
+      </slot>
     </template>
   </el-tree>
 </template>
@@ -43,20 +45,20 @@
           type: 0,
           title: 'title',
           categoly: '2022-10-10',
-          data: {},
-        },
-      ],
+          data: {}
+        }
+      ]
     },
-    loading: Boolean,
+    loading: Boolean
   },
   emits: ['itemClick'],
   data() {
     return {
       defaultProps: {
         children: 'children',
-        label: 'title',
+        label: 'title'
       },
-      isLoading: this.loading,
+      isLoading: this.loading
     };
   },
   computed: {
@@ -75,7 +77,7 @@
       for (const [key, value] of itemMap) {
         const i = {
           title: key,
-          children: [],
+          children: []
         };
         value.forEach((v) => {
           i.children.push(v);
@@ -92,11 +94,11 @@
         }
       });
       return list;
-    },
+    }
   },
   watch: {
     loading(nValue) {
-      this.isLoading = nValue
+      this.isLoading = nValue;
     },
     //褰撴暟鎹涓�娆℃洿鏂版椂
     dataList(nValue) {
@@ -117,7 +119,7 @@
         }
         this.isLoading = false;
       }
-    },
+    }
   },
   methods: {
     handleNodeClick(data) {
@@ -131,8 +133,8 @@
       if (data.children == undefined) {
         this.$emit('itemClick', data);
       }
-    },
-  },
+    }
+  }
 };
 </script>
 
diff --git a/src/constants/menu.js b/src/constants/menu.js
index 9e744ee..6add49c 100644
--- a/src/constants/menu.js
+++ b/src/constants/menu.js
@@ -37,7 +37,7 @@
   },
   {
     icon: 'DataAnalysis',
-    name: '鏁版嵁浜у搧',
+    name: '涓棿鏁版嵁浜у搧',
     children: [
       {
         path: '/fysp/data-product/profollow',
@@ -59,6 +59,12 @@
         icon: 'Document',
         name: '鏃ユ姤绠$悊',
       },
+    ],
+  },
+  {
+    icon: 'DataAnalysis',
+    name: '鏈�缁堟暟鎹骇鍝�',
+    children: [
       {
         path: '/fysp/data-product/scenereport',
         icon: 'Document',
diff --git a/src/enum/device/device.js b/src/enum/device/device.js
new file mode 100644
index 0000000..842bd36
--- /dev/null
+++ b/src/enum/device/device.js
@@ -0,0 +1,24 @@
+import monitor from './monitorDevice';
+import treatment from './treatmentDevice';
+import production from './productionDevice';
+
+function enumDevice() {
+  return [
+    { value: 0, label: '鐩戞帶璁惧' },
+    { value: 1, label: '娌荤悊璁惧' },
+    { value: 2, label: '鐢熶骇璁惧' }
+  ];
+}
+
+function toLabel(sceneType, deviceType, valueArr) {
+  switch (deviceType + '') {
+    case '0':
+      return monitor.toLabel(sceneType, valueArr);
+    case '1':
+      return treatment.toLabel(sceneType, valueArr);
+    case '2':
+      return production.toLabel(sceneType, valueArr);
+  }
+}
+
+export { enumDevice, toLabel };
diff --git a/src/enum/device/monitorDevice.js b/src/enum/device/monitorDevice.js
new file mode 100644
index 0000000..987b173
--- /dev/null
+++ b/src/enum/device/monitorDevice.js
@@ -0,0 +1,77 @@
+const dustDeviceType = [
+  {
+    label: '鎵皹鐩戞祴',
+    value: '1',
+    children: [
+      {
+        label: '鎵皹鐩戞祴',
+        value: '1',
+      },
+    ],
+  },
+];
+
+const fumeDeviceType = [
+  {
+    label: '娌圭儫鐩戞祴',
+    value: '1',
+    children: [
+      {
+        label: '娌圭儫鐩戞祴',
+        value: '1',
+      },
+    ],
+  },
+];
+
+const vocDeviceType = [
+  {
+    label: 'VOC鐩戞祴',
+    value: '1',
+    children: [
+      {
+        label: 'VOC鐩戞祴',
+        value: '1',
+      },
+    ],
+  },
+];
+
+// 鐩戞祴璁惧绫诲瀷
+function monitorDevices(sceneType) {
+  switch (parseInt(sceneType)) {
+    // 宸ュ湴,鐮佸ご,鎼呮媽绔�,鍫嗗満
+    case 1:
+    case 2:
+    case 3:
+    case 14:
+      return dustDeviceType;
+    // 椁愰ギ
+    case 5:
+      return fumeDeviceType;
+    // 宸ヤ笟浼佷笟,姹戒慨
+    case 4:
+    case 6:
+      return vocDeviceType;
+    default:
+      return dustDeviceType;
+  }
+}
+
+function toLabel(sceneType, valueArr) {
+  const labelArr = [];
+  let options = monitorDevices(sceneType);
+  valueArr.forEach(v => {
+    if (options) {
+      const op = options.find(o => {
+        return (o.value + '') == (v + '');
+      });
+      labelArr.push(op.label);
+      options = op.children;
+    }
+  });
+  
+  return labelArr;
+}
+
+export default { monitorDevices, toLabel };
diff --git a/src/enum/device/productionDevice.js b/src/enum/device/productionDevice.js
new file mode 100644
index 0000000..70ba509
--- /dev/null
+++ b/src/enum/device/productionDevice.js
@@ -0,0 +1,67 @@
+const dustDeviceType = [
+  {
+    label: '闈為亾',
+    value: '1',
+    children: [
+      { label: '鎸栨帢鏈�', value: '1' },
+      { label: '鍙夎溅', value: '2' },
+      { label: '灞ュ甫鍚�', value: '3' },
+      { label: '閾茶溅', value: '4' },
+      { label: '鍙戝姩鏈�', value: '5' },
+    ],
+  },
+];
+
+const fumeDeviceType = [
+  {
+    label: '鍘ㄥ叿',
+    value: '1',
+    children: [{ label: '鍘ㄥ叿', value: '1' }],
+  },
+];
+
+const vocDeviceType = [
+  {
+    label: 'VOC',
+    value: '1',
+    children: [{ label: 'VOC', value: '1' }],
+  },
+];
+
+// 鐢熶骇璁惧绫诲瀷
+function productionDevices(sceneType) {
+  switch (parseInt(sceneType)) {
+    // 宸ュ湴,鐮佸ご,鎼呮媽绔�,鍫嗗満
+    case 1:
+    case 2:
+    case 3:
+    case 14:
+      return dustDeviceType;
+    // 椁愰ギ
+    case 5:
+      return fumeDeviceType;
+    // 宸ヤ笟浼佷笟,姹戒慨
+    case 4:
+    case 6:
+      return vocDeviceType;
+    default:
+      return dustDeviceType;
+  }
+}
+
+function toLabel(sceneType, valueArr) {
+  const labelArr = [];
+  let options = productionDevices(sceneType);
+  valueArr.forEach(v => {
+    if (options) {
+      const op = options.find(o => {
+        return (o.value + '') == (v + '');
+      });
+      labelArr.push(op.label);
+      options = op.children;
+    }
+  });
+  return labelArr;
+}
+
+export default { productionDevices, toLabel };
diff --git a/src/enum/device/treatmentDevice.js b/src/enum/device/treatmentDevice.js
new file mode 100644
index 0000000..28efcf5
--- /dev/null
+++ b/src/enum/device/treatmentDevice.js
@@ -0,0 +1,75 @@
+const dustDeviceType = [
+  {
+    label: '鎶�闃�',
+    value: '1',
+    children: [
+      { label: '鐜繚娲掓按杞︼紙澶у瀷闈炵數鍔級', value: '1' },
+      { label: '鐢靛姩闆剧偖杞�', value: '2' },
+      { label: '鐢靛姩娲掓按杞︼紙灏忓瀷锛�', value: '3' },
+      { label: '闆剧偖杞︼紙鍥哄畾鎴栬疆寮忥級', value: '4' },
+      { label: '鑷姩鍐叉礂瑁呯疆锛堝皝闂紡锛�', value: '5' },
+      { label: '楂樻晥娲楄疆鏈�', value: '6' },
+      { label: '楂樺帇姘存灙', value: '7' },
+      { label: '鏅�氭按绠℃垨娑堥槻鏍�', value: '8' },
+      { label: '濉斿悐鍠锋穻', value: '9' },
+      { label: '鍥村鍠锋穻', value: '10' },
+      { label: '鎵皹鐩戞祴涓庡柗娣嬭仈鍔�', value: '11' },
+      { label: '鍫嗗満鍠锋穻', value: '12' },
+      { label: '鐢熶骇鍖哄柗娣�', value: '13' },
+    ],
+  },
+];
+
+const fumeDeviceType = [
+  {
+    label: '鍑�鍖�',
+    value: '1',
+    children: [{ label: '娌圭儫鍑�鍖�', value: '1' }],
+  },
+];
+
+const vocDeviceType = [
+  {
+    label: '鍑�鍖�',
+    value: '1',
+    children: [{ label: '鍥哄簾鍑�鍖�', value: '1' }],
+  },
+];
+
+// 娌荤悊璁惧绫诲瀷
+function treatmentDevices(sceneType) {
+  switch (parseInt(sceneType)) {
+    // 宸ュ湴,鐮佸ご,鎼呮媽绔�,鍫嗗満
+    case 1:
+    case 2:
+    case 3:
+    case 14:
+      return dustDeviceType;
+    // 椁愰ギ
+    case 5:
+      return fumeDeviceType;
+    // 宸ヤ笟浼佷笟,姹戒慨
+    case 4:
+    case 6:
+      return vocDeviceType;
+    default:
+      return dustDeviceType;
+  }
+}
+
+function toLabel(sceneType, valueArr) {
+  const labelArr = [];
+  let options = treatmentDevices(sceneType);
+  valueArr.forEach(v => {
+    if (options) {
+      const op = options.find(o => {
+        return (o.value + '') == (v + '');
+      });
+      labelArr.push(op.label);
+      options = op.children;
+    }
+  });
+  return labelArr;
+}
+
+export default { treatmentDevices, toLabel };
diff --git a/src/model/fysp/device.js b/src/model/fysp/device.js
new file mode 100644
index 0000000..fb7eb1b
--- /dev/null
+++ b/src/model/fysp/device.js
@@ -0,0 +1,28 @@
+/**
+ * 鏍囧噯鍖栧睘鎬у悕
+ * 灏嗕笁绉嶈澶嘯鐩戞帶璁惧],[娌荤悊璁惧],[鐢熶骇璁惧]瀵硅薄鐨勫睘鎬у悕缁熶竴鏍煎紡鍖�
+ * @param {*} data
+ */
+function formatDevice(data) {
+  // 灏嗕竴涓猨s瀵硅薄涓墍鏈塪i锛寃i锛宲i寮�澶寸殑灞炴�у叏閮ㄦ敼鎴愬幓鎺夎繖浜涘墠缂�骞朵笖閲嶆柊鍙樹负椹煎嘲寮忓懡鍚�
+  const newObj = {};
+  for (const key in data) {
+    let newKey = key;
+    if (key.startsWith('di')) {
+      newKey = key.substring(2);
+    } else if (key.startsWith('wi')) {
+      newKey = key.substring(2);
+    } else if (key.startsWith('pi')) {
+      newKey = key.substring(2);
+    }
+    newKey = newKey.charAt(0).toLowerCase() + newKey.slice(1);
+    newObj[newKey] = data[key];
+  }
+  return newObj;
+}
+
+function formatDeviceList(dataList) {
+  return dataList.map((v) => formatDevice(v));
+}
+
+export { formatDevice, formatDeviceList };
diff --git a/src/model/info b/src/model/info
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/model/info
diff --git a/src/views/fysp/check/components/ArbitraryPhoto.vue b/src/views/fysp/check/components/ArbitraryPhoto.vue
index 854296c..bd24994 100644
--- a/src/views/fysp/check/components/ArbitraryPhoto.vue
+++ b/src/views/fysp/check/components/ArbitraryPhoto.vue
@@ -1,49 +1,50 @@
 <template>
   <div class="main">
-    <div class="filters" v-if="false">
-      <el-select
-        v-for="(key_select, index_select) of filters.keys()"
-        :placeholder="key_select.text"
+    <el-row justify="end" class="btns" v-if="!readonly">
+      <el-text size="small" type="info" class="m-r-8"
+        >鏈�澶氶�夋嫨{{ maxSelect }}寮犲浘鐗�</el-text
       >
-        <el-option
-          v-for="(key_option) in filters.get(key_select.key)"
-          :key="key_option.key"
-          :value="key_option.value"
-          :label="key_option.label"
-        >
-        </el-option>
-      </el-select>
-    </div>
-    <div class="btns" v-if="!readonly">
-      <el-button size="small" type="primary" @click="sendSelectedImg(true)">纭畾</el-button>
-      <el-button size="small" type="primary" @click="sendSelectedImg(false)">鍙栨秷</el-button>
-    </div>
+      <el-button
+        size="small"
+        type="primary"
+        @click="sendSelectedImg(true)"
+        :disabled="selectedImgUrlList.length == 0"
+        >纭畾</el-button
+      >
+      <el-button size="small" type="primary" @click="sendSelectedImg(false)"
+        >鍙栨秷</el-button
+      >
+    </el-row>
 
     <div class="center">
-      <el-descriptions>
+      <!-- <el-descriptions>
         <el-descriptions-item label="鎬绘暟">
           <span>{{ this.imgUrlList.length }}</span>
         </el-descriptions-item>
-      </el-descriptions>
+      </el-descriptions> -->
       <el-tabs v-model="activeId" type="card">
         <el-tab-pane
           v-for="item in typeList"
-          :label="item.businesstype"
+          :key="item.businesstypeid"
+          :label="
+            item.businesstype + ' (' + typeImgMap.get(activeId).length + ')'
+          "
           :name="item.businesstypeid"
         >
         </el-tab-pane>
       </el-tabs>
       <el-empty v-if="isEmpty" description="鏆傛棤璁板綍" />
-      <div class="imgs">
+      <el-scrollbar class="imgs">
         <el-image
           v-for="(img, i) in typeImgMap.get(activeId)"
+          :key="i"
           :class="[Boolean(img.isSelect) ? 'selected' : 'noActive', 'image']"
           fit="cover"
           :src="img.url"
           lazy
           @click="onSelect(img, i)"
         />
-      </div>
+      </el-scrollbar>
     </div>
   </div>
 </template>
@@ -70,6 +71,11 @@
     defaultFile: {
       type: Array,
       default: () => []
+    },
+    // 鍥剧墖鍙�夋暟閲忥紝褰撲紶鍏ユ暟瀛楁椂锛屼唬琛ㄥ浘鐗囨暟閲�
+    maxSelect: {
+      type: Number,
+      default: 3
     }
   },
   data() {
@@ -95,10 +101,19 @@
         // { businesstypeid: 60, businesstype: '鎵╁睍绫诲崄' }
       ],
       typeImgMap: new Map(),
-      imgUrlList: []
+      imgUrlList: [],
+      selectedImgUrlList: []
     };
   },
   watch: {
+    subtask: {
+      handler(nV, oV) {
+        if (nV != oV && nV) {
+          this.getAllImgList();
+        }
+      },
+      immediate: true
+    },
     defaultFile: {
       handler(newFileList, oldFileList) {
         if (this.isClose) {
@@ -128,9 +143,9 @@
     }
   },
   mounted() {
-    if (this.subtask) {
-      this.getAllImgList();
-    }
+    // if (this.subtask) {
+    //   this.getAllImgList();
+    // }
   },
   methods: {
     // 鍒濆鍖栧垰寮�濮嬮�変腑鐨勬爣绛�
@@ -139,11 +154,13 @@
         this.activeId = this.typeList[0].businesstypeid;
       }
     },
-    async getAllImgList() {
+    getAllImgList() {
       // for(var k of this.typeImgMap.keys()) {
       //     this.typeImgMap.set(k, [])
       // }
-      await mediafileApi.getRoutineByStGuid(this.subtask.stGuid).then((res) => {
+      this.typeImgMap.clear();
+      this.typeList = [];
+      mediafileApi.getRoutineByStGuid(this.subtask.stGuid).then((res) => {
         this.isEmpty = false;
         let data = res.data;
         if (data.length == 0) {
@@ -179,7 +196,6 @@
           this.imgUrlList.push(e);
           // TODO imgUrl鍏ㄥ眬閰嶇疆
           e.url = $fysp.imgUrl + e.extension1 + e.guid + '.jpg';
-          // e.url = "http://47.100.191.150:9005/images/" + e.extension1 + e.guid + '.jpg'
           e.isSelect = false;
         }
         this.initSelectedTab();
@@ -217,20 +233,31 @@
       });
     },
     onSelect(img, i) {
-      // if (i == 2 && !this.isAll) {
-      //   this.getAllImgList();
-      //   this.isAll = true;
-      // } else {
-      //   if (this.readonly) {
-      //     return;
-      //   }
-      //   img.isSelect = !Boolean(img.isSelect);
-      // }
-
       if (this.readonly) {
         return;
       }
-      img.isSelect = !img.isSelect;
+      const index = this.selectedImgUrlList.indexOf(img);
+      if (index == -1) {
+        if (this.maxSelect == 1) {
+          img.isSelect = true;
+          this.selectedImgUrlList.push(img);
+          if (this.selectedImgUrlList.length > 1) {
+            this.selectedImgUrlList.splice(0, 1).forEach((e) => {
+              e.isSelect = false;
+            });
+          }
+        } else if (this.maxSelect > 1) {
+          if (this.selectedImgUrlList.length < this.maxSelect) {
+            img.isSelect = true;
+            this.selectedImgUrlList.push(img);
+          }
+        }
+      } else {
+        this.selectedImgUrlList.splice(index, 1);
+        img.isSelect = false;
+      }
+
+      // img.isSelect = !img.isSelect;
     },
     sendSelectedImg(isOk) {
       let result = [];
@@ -280,7 +307,7 @@
 } */
 
 .imgs {
-  height: 650px;
+  height: 50vh;
   width: 90%;
   min-height: 100px !important;
   /* border-style:solid;
@@ -295,6 +322,7 @@
 }
 
 .image {
+  margin: 5px;
   height: 210px;
   width: 200px;
   border-radius: 4px;
@@ -308,10 +336,10 @@
 }
 
 .selected {
-  padding: 5px;
+  margin: 3px;
   color: #4abe84;
   box-shadow: 0 2px 7px 0 rgba(85, 110, 97, 0.35);
-  border: 1px solid rgba(74, 190, 132, 1);
+  border: 2px solid rgba(74, 190, 132, 1);
 }
 
 .selected:before {
@@ -338,7 +366,7 @@
 }
 
 .noActive {
-  padding: 5px;
+  /* padding: 5px; */
 }
 
 .blurry {
diff --git a/src/views/fysp/data-product/ProdSceneReport.vue b/src/views/fysp/data-product/ProdSceneReport.vue
index c2d8d05..a6abc18 100644
--- a/src/views/fysp/data-product/ProdSceneReport.vue
+++ b/src/views/fysp/data-product/ProdSceneReport.vue
@@ -1,3 +1,271 @@
 <template>
-  鍦烘櫙鎶ュ憡绠$悊
+  <BaseContentLayout>
+    <template #header>
+      <SearchBar @on-submit="search"> </SearchBar>
+    </template>
+    <template #aside>
+      <SideList
+        :items="subtasks"
+        :loading="sideLoading"
+        @item-click="chooseSubtask"
+      ></SideList>
+    </template>
+    <template #main>
+      <el-scrollbar class="el-scrollbar" v-loading="mainLoading">
+        <CompSceneConstructionInfo
+          title="A銆佸伐鍦板熀鏈俊鎭�"
+          :form-info="formSubScene"
+        />
+        <div><el-text type="">闄勫浘鐗囷細</el-text></div>
+        <CompImgInfo
+          title="鏂藉伐閾墝"
+          :img-src="sceneImg.url"
+          @change="anyPhotoDialog = true"
+        ></CompImgInfo>
+        <el-divider />
+        <el-text tag="h1">B銆佷富瑕佹薄鏌撻槻娌昏鏂�</el-text>
+        <el-space wrap>
+          <CompImgInfo
+            v-for="(item, i) in deviceList"
+            :key="i"
+            down-title
+            :title="item._deviceTypeName"
+            :img-src="item._showStatusPic"
+            @change="showDevicePhotoDialog(item)"
+          ></CompImgInfo>
+        </el-space>
+        <el-divider />
+        <el-text tag="h1">C銆佺幇鍦烘薄鏌撻棶棰樹笌鏁存敼鎯呭喌</el-text>
+      </el-scrollbar>
+    </template>
+  </BaseContentLayout>
+  <el-dialog
+    v-model="anyPhotoDialog"
+    width="66%"
+    title="浠绘剰鍥剧墖"
+    destroy-on-close
+  >
+    <ArbitraryPhoto
+      :max-select="1"
+      :readonly="false"
+      :subtask="curSubtask.data"
+      @selectByAnyPhonoEvent="handleSelectAnyPhoto"
+      :defaultFile="[sceneImg]"
+    >
+    </ArbitraryPhoto>
+  </el-dialog>
+  <el-dialog
+    title="璁惧鍥剧墖"
+    width="66%"
+    v-model="deiveceImgDialog"
+    destroy-on-close
+  >
+    <CompDevicePhono
+      @selectPhonoEvent="handleSelectDevicePhoto"
+      :imgPathsDataSource="showDeviceImgList"
+    >
+    </CompDevicePhono>
+  </el-dialog>
 </template>
+<script setup>
+import { ref, computed } from 'vue';
+
+import { $fysp } from '@/api/index';
+import taskApi from '@/api/fysp/taskApi';
+import sceneApi from '@/api/fysp/sceneApi';
+import deviceApi from '@/api/fysp/deviceApi';
+import { formatDeviceList } from '@/model/fysp/device';
+import { enumDevice, toLabel } from '@/enum/device/device';
+
+import CompSceneConstructionInfo from '@/views/fysp/scene/CompSceneConstructionInfo.vue';
+import ArbitraryPhoto from '@/views/fysp/check/components/ArbitraryPhoto.vue';
+import CompDevicePhono from '@/views/fysp/check/components/CompDevicePhono.vue';
+import CompImgInfo from '@/views/fysp/data-product/components/CompImgInfo.vue';
+
+/************************* 宸︿晶宸℃煡浠诲姟閫夊崟 **********************************/
+const curSubtask = ref({});
+const subtasks = ref([]);
+const sideLoading = ref(false);
+const mainLoading = ref(false);
+//鑾峰彇浠诲姟闂鐨勫鏍告儏鍐�
+function 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;
+}
+//鏌ヨ瀛愪换鍔$粺璁′俊鎭�
+function search(formSearch) {
+  // this.topTask = formSearch.topTask;
+  sideLoading.value = true;
+  mainLoading.value = true;
+  // this.curProList = [];
+  curSubtask.value = {};
+  const param = {
+    topTaskId: formSearch.topTask.tguid,
+    sceneTypeId: formSearch.sceneTypeId
+  };
+  taskApi.getSubtaskSummary(param).then((res) => {
+    const list = [];
+    res.forEach((s) => {
+      const t = getSubtaskType(s);
+      list.push({
+        type: t,
+        title: s.stName,
+        categoly: s.stPlanTime.split('T')[0],
+        data: s
+      });
+    });
+    subtasks.value = list;
+    if (list.length == 0) {
+      sideLoading.value = false;
+      mainLoading.value = false;
+    }
+  });
+}
+//鐐瑰嚮宸︿晶鑿滃崟浠诲姟浜嬩欢
+function chooseSubtask(s) {
+  sideLoading.value = false;
+  mainLoading.value = true;
+  curSubtask.value = s;
+
+  fetchSceneInfo(s.data.sceneId).finally(() => {
+    mainLoading.value = false;
+  });
+  fetchDeviceList(s);
+  fetchProblems(s)
+}
+
+/************************* 鍦烘櫙鍩烘湰淇℃伅 **********************************/
+const formSubScene = ref({});
+function fetchSceneInfo(sceneId) {
+  return sceneApi.getSceneDetail(sceneId).then((res) => {
+    //鍦烘櫙
+    // if (res.data.scense) formScene = res.data.scense;
+    formSubScene.value = res.data.subScene ? res.data.subScene : {};
+    // if (res.data.sceneDevice) {
+    //   formSceneDevice = res.data.sceneDevice;
+    // } else {
+    //   formSceneDevice = {
+    //     sGuid: formScene.guid,
+    //   };
+    // }
+  });
+}
+
+// 浠绘剰鎷嶅浘鐗囬�夋嫨瀵硅瘽妗�
+const anyPhotoDialog = ref(false);
+const sceneImg = ref({});
+function handleSelectAnyPhoto(data) {
+  anyPhotoDialog.value = false;
+  if (data.length > 0) {
+    sceneImg.value = { url: data[0].url };
+  }
+}
+/************************* 鍦烘櫙璁惧淇℃伅 **********************************/
+
+// 璁惧鍥剧墖閫夋嫨瀵硅瘽妗�
+const deiveceImgDialog = ref(false);
+const showDeviceImg = ref({});
+const showDeviceImgList = ref([]);
+// 璁惧鍥剧墖鍒楄〃
+const deviceList = ref([]);
+
+function showDevicePhotoDialog(device) {
+  deiveceImgDialog.value = true;
+  showDeviceImgList.value = [];
+  let imgList = [];
+  device._status
+    .map((s) => s._picUrls)
+    .forEach((pics) => {
+      imgList = imgList.concat(
+        pics.map((p) => {
+          return {
+            topTypeId: device.topTypeId,
+            _picUrl: p
+          };
+        })
+      );
+    });
+  console.log(imgList);
+
+  showDeviceImgList.value = imgList;
+}
+
+function handleSelectDevicePhoto(data) {
+  deiveceImgDialog.value = false;
+  if (data.length > 0) {
+    showDeviceImg.value = { url: data[0].url };
+  }
+}
+
+const deviceTopTypes = [
+  { id: 0, label: '鐩戞帶璁惧' },
+  { id: 1, label: '娌荤悊璁惧' }
+  // { id: 2, label: '鐢熶骇璁惧' }
+];
+
+function fetchDeviceList(s) {
+  deviceList.value = [];
+  for (const deviceTopTypeElement of deviceTopTypes) {
+    const topTypeId = deviceTopTypeElement.id;
+    deviceApi
+      .fetchDevices(s.data.sceneId, topTypeId)
+      .then((res) => {
+        return formatDeviceList(res.data);
+      })
+      .then((result) => {
+        result.forEach((r) => {
+          const param = {
+            deviceId: r.id,
+            sceneId: r.sceneGuid,
+            deviceTypeId: topTypeId
+          };
+          deviceApi
+            .fetchDeviceStatus(param)
+            .then((res) => {
+              res.data.forEach((e) => {
+                if (e.dlPicUrl && e.dlPicUrl.trim() != '') {
+                  e._picUrls = e.dlPicUrl
+                    .split(';')
+                    .map((v) => $fysp.imgUrl + v);
+                } else {
+                  e._picUrls = [];
+                }
+              });
+              return res;
+            })
+            .then((res) => {
+              if (res.data.length > 0 && res.data[0]._picUrls.length > 0) {
+                r._showStatusPic = res.data[0]._picUrls[0];
+              }
+              r._status = res.data;
+              r.topTypeId = topTypeId;
+              r._deviceTypeName = toLabel(r.sceneTypeId, topTypeId, [
+                r.typeId,
+                r.subtypeId
+              ]).join('-');
+              deviceList.value.push(r);
+            });
+        });
+      });
+  }
+}
+/************************* 鐜板満宸℃煡鎯呭喌锛堥棶棰樹笌鏁存敼锛� **********************************/
+//褰撳墠浠诲姟鐨勯棶棰樺垪琛�
+const curProList = ref([]);
+
+function fetchProblems(s) {
+  taskApi.getProBySubtask(s.data.stGuid).then((res) => {
+    curProList.value = res;
+  });
+}
+/************************* 鎵皹闃叉不寤鸿 **********************************/
+</script>
diff --git a/src/views/fysp/data-product/components/CompImgInfo.vue b/src/views/fysp/data-product/components/CompImgInfo.vue
new file mode 100644
index 0000000..5fcfd7e
--- /dev/null
+++ b/src/views/fysp/data-product/components/CompImgInfo.vue
@@ -0,0 +1,80 @@
+<template>
+  <table>
+    <tbody>
+      <tr v-if="!downTitle">
+        <td>
+          <el-row justify="space-between" align="middle">
+            {{ title }}
+            <el-button size="small" @click="$emit('change')">{{
+              btnName
+            }}</el-button>
+          </el-row>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <el-image
+            class="image"
+            :src="imgSrc"
+            :preview-src-list="[imgSrc]"
+            :initial-index="0"
+            fit="cover"
+            lazy
+          />
+        </td>
+      </tr>
+      <tr v-if="downTitle">
+        <td>
+          <el-row justify="space-between" align="middle">
+            {{ title }}
+            <el-button size="small" @click="$emit('change')">{{
+              btnName
+            }}</el-button>
+          </el-row>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</template>
+<script setup>
+import { ref } from 'vue';
+
+const props = defineProps({
+  // 鏍囬鏄惁鍦ㄥ浘鐗囦笅鏂�
+  downTitle: Boolean,
+  title: String,
+  imgSrc: String,
+  btnName: {
+    type: String,
+    default: '淇敼'
+  }
+});
+
+const emit = defineEmits(['change']);
+</script>
+<style scoped>
+.image {
+  width: 200px;
+  height: 210px;
+  border-radius: 4px;
+}
+
+table {
+  color: #333333;
+  border-color: #666666;
+  border-collapse: collapse;
+}
+
+tr {
+  font-size: var(--el-font-size-small);
+}
+
+td {
+  border: 1px solid black;
+  padding: 2px 6px;
+  /* border-width: 1px;
+  padding: 8px;
+  border-style: solid;
+  border-color: #666666; */
+}
+</style>
diff --git a/src/views/fysp/data-product/components/CompProblemTable.vue b/src/views/fysp/data-product/components/CompProblemTable.vue
new file mode 100644
index 0000000..0d3d6df
--- /dev/null
+++ b/src/views/fysp/data-product/components/CompProblemTable.vue
@@ -0,0 +1,116 @@
+<template>
+  <table>
+    <tbody>
+      <tr>
+        <td>{{ title }}</td>
+      </tr>
+      <tr>
+        <td>
+          <el-image
+            class="image"
+            :src="seletcedProblemPic"
+            :preview-src-list="[seletcedProblemPic]"
+            :initial-index="0"
+            fit="cover"
+            lazy
+          />
+        </td>
+        <td>
+          <el-image
+            class="image"
+            :src="seletcedChangePic"
+            :preview-src-list="[seletcedChangePic]"
+            :initial-index="0"
+            fit="cover"
+            lazy
+          />
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <el-row justify="space-between" align="middle">
+            <div>浣嶇疆锛歿{ problem.location }}</div>
+            <div>鎻忚堪锛歿{ problem.problemname }}</div>
+            <el-button size="small" @click="$emit('change')">{{
+              btnName
+            }}</el-button>
+          </el-row>
+        </td>
+        <td>
+          <el-row justify="space-between" align="middle">
+            <div>浣嶇疆锛歿{ problem.location }}</div>
+            <div>鎻忚堪锛歿{ problem.problemname }}</div>
+            <el-button size="small" @click="$emit('change')">{{
+              btnName
+            }}</el-button>
+          </el-row>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</template>
+<script setup>
+import { ref, watch } from 'vue';
+import ProCheckProxy from '@/views/check/ProCheckProxy';
+
+const props = defineProps({
+  problem: {
+    type: Object,
+    default: () => {
+      return {};
+    }
+  }
+});
+
+const emit = defineEmits(['change']);
+
+const pics = ref([]);
+const seletcedProblemPic = ref();
+const seletcedChangePic = ref();
+
+function getPics() {
+  pics.value = ProCheckProxy.proPics(props.problem);
+  if (pics.value[0].path.length > 0) {
+    seletcedProblemPic.value = pics.value[0].path[0];
+  }
+  if (pics.value[1].path.length > 0) {
+    seletcedChangePic.value = pics.value[1].path[0];
+  }
+}
+
+watch(
+  () => props.problem,
+  (nV, oV) => {
+    if (nV != oV) {
+      getPics();
+    }
+  },
+  { immediate: true }
+);
+</script>
+<style scoped>
+.image {
+  width: 200px;
+  height: 210px;
+  border-radius: 4px;
+}
+
+table {
+  color: #333333;
+  border-color: #666666;
+  border-collapse: collapse;
+}
+
+tr {
+  font-size: var(--el-font-size-small);
+}
+
+td {
+  border: 1px solid black;
+  padding: 2px 6px;
+  /* border-width: 1px;
+  padding: 8px;
+  border-style: solid;
+  border-color: #666666; */
+}
+</style>
diff --git a/src/views/fysp/scene/CompSceneConstructionInfo.vue b/src/views/fysp/scene/CompSceneConstructionInfo.vue
index 4ff7cfb..6d2c70f 100644
--- a/src/views/fysp/scene/CompSceneConstructionInfo.vue
+++ b/src/views/fysp/scene/CompSceneConstructionInfo.vue
@@ -1,6 +1,7 @@
 <!-- 宸ュ湴涓撳睘淇℃伅缂栬緫 -->
 <template>
   <el-form
+    v-if="showStyle == 'form'"
     :inline="false"
     :model="formObj"
     ref="formRef"
@@ -161,6 +162,183 @@
       <el-button :disabled="!edit" @click="onReset">閲嶇疆</el-button>
     </el-form-item>
   </el-form>
+
+  <el-descriptions
+    v-else-if="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"
+        :disabled="!edit"
+        type="primary"
+        @click="onSubmit"
+        :loading="loading"
+        >鎻愪氦</el-button
+      >
+      <el-button :size="fontSize" :disabled="!edit" @click="onReset"
+        >閲嶇疆</el-button
+      >
+    </template>
+    <el-descriptions-item label="宸ョ▼绫诲瀷"
+      ><el-input
+        :size="fontSize"
+        clearable
+        v-model="formObj.csProjectType"
+        placeholder="宸ョ▼绫诲瀷"
+    /></el-descriptions-item>
+    <!-- <el-descriptions-item label="寤鸿鐘舵��"
+      ><el-select
+        v-model="formObj.csStatus"
+        placeholder="寤鸿鐘舵��"
+      >
+        <el-option
+          v-for="s in status"
+          :key="s.value"
+          :label="s.label"
+          :value="s.value"
+        /> </el-select
+    ></el-descriptions-item> -->
+    <el-descriptions-item label="鏂藉伐闃舵"
+      ><el-select
+        v-model="formObj.siExtension1"
+        placeholder="鏂藉伐闃舵"
+        :size="fontSize"
+      >
+        <el-option
+          v-for="s in stage"
+          :key="s.value"
+          :label="s.label"
+          :value="s.value"
+        /> </el-select
+    ></el-descriptions-item>
+    <el-descriptions-item label="鏂藉伐鏃堕棿"
+      ><el-date-picker
+        :size="fontSize"
+        v-model="formObj._timeRange"
+        type="daterange"
+        range-separator="鑷�"
+        start-placeholder="寮�宸ユ椂闂�"
+        end-placeholder="瀹屽伐鏃堕棿"
+    /></el-descriptions-item>
+    <el-descriptions-item label="鍓╀綑宸ユ湡"
+      ><el-input
+        :size="fontSize"
+        clearable
+        v-model="formObj.csLeftTime"
+        placeholder="鍓╀綑宸ユ湡锛屼緥濡傚嚑骞淬�佸嚑鏈堛�佸嚑鍛ㄣ�佸嚑澶╃瓑"
+    /></el-descriptions-item>
+    <el-descriptions-item label="鏂藉伐鍦板潃" span="2"
+      ><el-input
+        clearable
+        v-model="formObj.location"
+        placeholder="鏂藉伐鍦板潃"
+        :size="fontSize"
+    /></el-descriptions-item>
+    <el-descriptions-item label="鍗犲湴闈㈢Н" rowspan="2"
+      ><el-input
+        :size="fontSize"
+        clearable
+        v-model="formObj.csFloorSpace"
+        placeholder="鍗犲湴闈㈢Н"
+      >
+        <template #append>銕�</template>
+      </el-input></el-descriptions-item
+    >
+    <el-descriptions-item label="鏂藉伐闈㈢Н"
+      ><el-input
+        :size="fontSize"
+        clearable
+        v-model="formObj.csConstructionArea"
+        placeholder="鏂藉伐闈㈢Н"
+      >
+        <template #append>銕�</template>
+      </el-input></el-descriptions-item
+    >
+    <el-descriptions-item label="姣忔湀鏂藉伐闈㈢Н"
+      ><el-input
+        :size="fontSize"
+        clearable
+        v-model="formObj.csConstructionAreaPerMonth"
+        placeholder="姣忔湀鏂藉伐闈㈢Н"
+      >
+        <template #append>銕�</template>
+      </el-input></el-descriptions-item
+    >
+    <el-descriptions-item label="瀹夊叏鍛�"
+      ><el-input
+        :size="fontSize"
+        clearable
+        v-model="formObj.csSecurityOfficer"
+        placeholder="瀹夊叏鍛�"
+    /></el-descriptions-item>
+    <el-descriptions-item label="瀹夊叏鍛樼數璇�"
+      ><el-input
+        :size="fontSize"
+        clearable
+        type="tel"
+        v-model="formObj.csSecurityOfficerTel"
+        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.csConstructionUnit"
+        placeholder="鎬诲寘鍗曚綅"
+    /></el-descriptions-item>
+    <!-- <el-descriptions-item label="鏂藉伐鍗曚綅鑱旂郴浜�"
+      ><el-input
+        clearable
+        v-model="formObj.csConstructionContacts"
+        placeholder="鏂藉伐鍗曚綅鑱旂郴浜�"
+    /></el-descriptions-item>
+    <el-descriptions-item label="鏂藉伐鍗曚綅鑱旂郴鐢佃瘽"
+      ><el-input
+        clearable
+        type="tel"
+        v-model="formObj.csConstructionContactsTel"
+        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.csEmployerUnit"
+        placeholder="寤鸿鍗曚綅"
+    /></el-descriptions-item>
+    <!-- <el-descriptions-item label="涓氫富鍗曚綅鑱旂郴浜�"
+      ><el-input
+        clearable
+        v-model="formObj.csEmployerContacts"
+        placeholder="涓氫富鍗曚綅鑱旂郴浜�"
+    /></el-descriptions-item>
+    <el-descriptions-item label="涓氫富鍗曚綅鑱旂郴鐢佃瘽"
+      ><el-input
+        clearable
+        type="tel"
+        v-model="formObj.csEmployerContactsTel"
+        placeholder="涓氫富鍗曚綅鑱旂郴鐢佃瘽"
+      >
+        <template #prepend>
+          <el-icon><Iphone /></el-icon>
+        </template> </el-input
+    ></el-descriptions-item> -->
+  </el-descriptions>
 </template>
 
 <script setup>
@@ -171,23 +349,32 @@
 import { useFormConfirm } from '@/composables/formConfirm';
 
 const props = defineProps({
+  scene: Object,
   //宸ュ湴棰濆淇℃伅
   formInfo: Object,
   //鍦烘櫙绫诲瀷锛氬伐鍦�
   sceneType: {
     type: Number,
-    default: 1,
+    default: 1
   },
+  // 灞曠ず鏍峰紡 form锛氳〃鍗曪紱descriptions锛氭弿杩板垪琛�
+  showStyle: {
+    type: String,
+    default: 'descriptions'
+    // default:'form'
+  },
+  title: String
 });
+const fontSize = ref('small');
 const emit = defineEmits(['onSubmit', 'onCancel']);
 
 const { formObj, formRef, edit, onSubmit, onReset } = useFormConfirm({
   submit: {
-    do: submit,
+    do: submit
   },
   cancel: {
-    do: cancel,
-  },
+    do: cancel
+  }
 });
 const loading = ref(false);
 const status = reactive(enumStatusNA());
@@ -197,23 +384,23 @@
     {
       required: true,
       message: '宸ョ▼绫诲瀷涓嶈兘涓虹┖',
-      trigger: 'blur',
-    },
+      trigger: 'blur'
+    }
   ],
   csStatus: [
     {
       required: true,
       message: '寤鸿鐘舵�佷笉鑳戒负绌�',
-      trigger: 'change',
-    },
+      trigger: 'change'
+    }
   ],
   siExtension1: [
     {
       required: true,
       message: '鏂藉伐闃舵涓嶈兘涓虹┖',
-      trigger: 'change',
-    },
-  ],
+      trigger: 'change'
+    }
+  ]
 });
 
 // 鍒涘缓鎴栨洿鏂板満鏅鎯�
@@ -252,7 +439,7 @@
       formObj.value = nValue;
       formObj.value._timeRange = [
         new Date(formObj.value.csStartTime),
-        new Date(formObj.value.csEndTime),
+        new Date(formObj.value.csEndTime)
       ];
     }
   },

--
Gitblit v1.9.3