2 Commits 35a3be5dcc ... b338c6c4dd

Auteur SHA1 Message Date
  wangkeyi b338c6c4dd [Mod 0000]修改地图管理数据处理逻辑及预警等级字段文本渲染 il y a 2 semaines
  wangkeyi 52636bd83d [Mod 0000]修改矿端首页预警等级文本渲染 il y a 2 semaines

+ 37 - 5
src/components/Configurable/preset/BoardTable.vue

@@ -52,8 +52,11 @@
               :style="{ flexBasis: dataColumnFlexBasis }" 
               :style="{ flexBasis: dataColumnFlexBasis }" 
               :class="`table__content__list_item_${tableConfig.type}`"
               :class="`table__content__list_item_${tableConfig.type}`"
             >
             >
-              <slot :name="col.prop" :scope="row">
+              <!-- <slot :name="col.prop" :scope="row">
                 <span>{{ getter(row, col.prop) }}</span>
                 <span>{{ getter(row, col.prop) }}</span>
+              </slot> -->
+              <slot :name="col.prop" :scope="row">
+                <component :is="renderCellComponent(row, col)" />
               </slot>
               </slot>
             </div>
             </div>
           </div>
           </div>
@@ -101,9 +104,10 @@
 </template>
 </template>
 
 
 <script lang="ts" setup>
 <script lang="ts" setup>
-  import { computed, ref, watch, onMounted } from 'vue';
+  import { computed, ref, watch, onMounted, h } from 'vue';
   import { get, isNil } from 'lodash-es';
   import { get, isNil } from 'lodash-es';
   import MiniBoard from '../detail/MiniBoard.vue';
   import MiniBoard from '../detail/MiniBoard.vue';
+  import { StatusColorEnum } from '/@/enums/jeecgEnum';
 
 
   interface BoardItem {
   interface BoardItem {
     label: string;
     label: string;
@@ -248,6 +252,37 @@
     }
     }
   });
   });
 
 
+  
+// 在 script setup 中添加
+const riskMap = {
+  '1': '低风险',
+  '2': '一般风险',
+  '3': '较高风险',
+  '4': '高风险',
+};
+const riskColorMap = {
+  '1': StatusColorEnum.blue, // 蓝
+  '2': StatusColorEnum.gold, // 金
+  '3': StatusColorEnum.purple, // 紫
+  '4': StatusColorEnum.red, // 红
+};
+
+// 修改 getter 或创建一个专门的渲染函数
+const renderCellComponent = (row: any, col: TableColumn) => {
+  return {
+    render() {
+      const value = getter(row, col.prop);
+      if (col.prop === 'alarmLevel') {
+        const level = String(value);
+        const text = riskMap[level] || value;
+        const color = riskColorMap[level] || StatusColorEnum.blue;
+        return h('span', { style: { color } }, text);
+      }
+      return h('span', {}, value);
+    }
+  };
+};
+
   // 监听 tableData 变化,重置选中状态
   // 监听 tableData 变化,重置选中状态
   watch(() => props.tableData, (newData) => {
   watch(() => props.tableData, (newData) => {
     if (newData && newData.length > 0) {
     if (newData && newData.length > 0) {
@@ -524,9 +559,6 @@
   .table__content_list_row .table__content__list_item_D:nth-child(1) {
   .table__content_list_row .table__content__list_item_D:nth-child(1) {
     width: 50px;
     width: 50px;
   }
   }
-  .table__content_list_row .table__content__list_item_D:nth-child(3) {
-    color: #2b6ff0;
-  }
   .table__content_list_row .table__content__list_item_D:nth-child(4) {
   .table__content_list_row .table__content__list_item_D:nth-child(4) {
     color: #107f30;
     color: #107f30;
   }
   }

+ 35 - 2
src/views/system/cadFile/app.ts

@@ -8,6 +8,7 @@ import { updatateGoaf } from './cad.api';
 import { createApp, h } from 'vue';
 import { createApp, h } from 'vue';
 import GoafPopup from './components/GoafPopup.vue';
 import GoafPopup from './components/GoafPopup.vue';
 import { get } from 'lodash-es';
 import { get } from 'lodash-es';
+import { StatusColorEnum } from '/@/enums/jeecgEnum';
 
 
 // ===================== 全局状态 =====================
 // ===================== 全局状态 =====================
 let map: Map | null = null;
 let map: Map | null = null;
@@ -429,6 +430,17 @@ const bindMarkerEvents = (marker: any, id: string | number): void => {
  * 创建传感器标记 DOM 元素
  * 创建传感器标记 DOM 元素
  */
  */
 const createMarkerElement = (goafItem: any, showInfo: boolean = false): HTMLDivElement => {
 const createMarkerElement = (goafItem: any, showInfo: boolean = false): HTMLDivElement => {
+  const riskMap = {
+    '1': '低风险',
+    '2': '一般风险',
+    '3': '较高风险',
+    '4': '高风险',
+  };
+  
+  // 定义颜色映射,索引对应 alarmLevel - 1 
+  // StatusColorEnum.blue, gold, purple, red 分别对应 1, 2, 3, 4
+  const alarmLevelColor = [StatusColorEnum.blue, StatusColorEnum.gold, StatusColorEnum.purple, StatusColorEnum.red];
+  
   const customImage = `/src/assets/icons/location-icon.svg`;
   const customImage = `/src/assets/icons/location-icon.svg`;
   const customImage3D = `/src/assets/icons/location-icon3D.png`;
   const customImage3D = `/src/assets/icons/location-icon3D.png`;
   const el = document.createElement('div');
   const el = document.createElement('div');
@@ -440,14 +452,35 @@ const createMarkerElement = (goafItem: any, showInfo: boolean = false): HTMLDivE
     cursor: move;
     cursor: move;
   `;
   `;
 
 
+  // 获取当前等级对应的颜色
+  const level = parseInt(goafItem.alarmLevel, 10);
+  const color = (level >= 1 && level <= 4) ? alarmLevelColor[level - 1] : '#333';
+
   if (showInfo) {
   if (showInfo) {
     const alarmLevelDiv = document.createElement('div');
     const alarmLevelDiv = document.createElement('div');
     alarmLevelDiv.style.cssText = `
     alarmLevelDiv.style.cssText = `
       font-size: 14px;
       font-size: 14px;
-      color: #333;
       white-space: nowrap;
       white-space: nowrap;
+      font-weight: bold;
+      display: flex; /* 使用 flex 布局让文字并排 */
+      align-items: center;
     `;
     `;
-    alarmLevelDiv.textContent = goafItem.alarmLevel ? `预警等级:${goafItem.alarmLevel}` : '正常';
+    
+    // 1. 创建固定文本节点 "风险等级:"
+    const labelSpan = document.createElement('span');
+    labelSpan.textContent = '风险等级:';
+    labelSpan.style.color = '#333'; // 强制设置为深色/默认色
+    
+    // 2. 创建动态文本节点 (应用动态颜色)
+    const valueSpan = document.createElement('span');
+    const riskText = riskMap[String(goafItem.alarmLevel)] || '正常';
+    valueSpan.textContent = goafItem.alarmLevel ? riskText : '正常';
+    valueSpan.style.color = color; // 应用动态颜色
+    
+    // 组装
+    alarmLevelDiv.appendChild(labelSpan);
+    alarmLevelDiv.appendChild(valueSpan);
+    
     el.appendChild(alarmLevelDiv);
     el.appendChild(alarmLevelDiv);
   }
   }
 
 

+ 28 - 1
src/views/system/cadFile/cad.api.ts

@@ -1,9 +1,14 @@
 import { defHttp } from '/@/utils/http/axios';
 import { defHttp } from '/@/utils/http/axios';
 
 
-enum Api {
+export enum Api {
   getGoafList = '/province/device/getGoafList',
   getGoafList = '/province/device/getGoafList',
   updatateGoaf = '/province/device/updateGoaf',
   updatateGoaf = '/province/device/updateGoaf',
   getGoafData = '/province/device/getGoafData',
   getGoafData = '/province/device/getGoafData',
+  getMineFileList = '/province/mineData/getMineFileList',
+  uploadFile = '/sys/common/upload',
+  updateMineFile = 'province/mineData/updateMineFile',
+  addMineFile = 'province/mineData/addMineFile',
+  deleteMineFile = 'province/mineData/deleteMineFile',
 }
 }
 //查询密闭列表
 //查询密闭列表
 export function getGoafList(params: any) {
 export function getGoafList(params: any) {
@@ -18,3 +23,25 @@ export function updatateGoaf(params: any) {
 export function getGoafData(params: any) {
 export function getGoafData(params: any) {
   return defHttp.post({ url: Api.getGoafData, params }, { joinParamsToUrl: true });
   return defHttp.post({ url: Api.getGoafData, params }, { joinParamsToUrl: true });
 }
 }
+
+// 查询密闭监测数据
+export function getMineFileList(params: any) {
+  return defHttp.post({ url: Api.getMineFileList, params }, { joinParamsToUrl: true });
+}
+
+// cad文件上传
+export function uploadFile(params: any) {
+  return defHttp.post({ headers: { 'Content-Type': 'multipart/form-data' }, url: Api.uploadFile, params },{ isTransformResponse:false });
+};
+// 修改煤矿图纸信息
+export function updateMineFile(params: any) {
+  return defHttp.post({ url: Api.updateMineFile, params });
+}
+
+export function addMineFile(params: any) {
+  return defHttp.post({ url: Api.addMineFile, params });
+}
+
+export function deleteMineFile(params: any) {
+  return defHttp.post({ url: Api.deleteMineFile, params },{ joinParamsToUrl: true });
+}

+ 26 - 81
src/views/system/cadFile/cad.data.ts

@@ -1,8 +1,5 @@
 import { BasicColumn } from '/@/components/Table';
 import { BasicColumn } from '/@/components/Table';
 import { FormSchema } from '/@/components/Table';
 import { FormSchema } from '/@/components/Table';
-import { h } from 'vue';
-import { Ref } from 'vue';
-import { isEmpty } from 'lodash-es';
 
 
 // 3. 生成动态表格列(接收动态状态映射)
 // 3. 生成动态表格列(接收动态状态映射)
 export function getColumns(): BasicColumn[] {
 export function getColumns(): BasicColumn[] {
@@ -14,36 +11,17 @@ export function getColumns(): BasicColumn[] {
     },
     },
     {
     {
       title: '图纸名称',
       title: '图纸名称',
-      dataIndex: 'mappingName',
-      width: 100,
-    },
-    {
-      title: '图纸分类',
-      dataIndex: 'mappingClass',
+      dataIndex: 'fileName',
       width: 100,
       width: 100,
     },
     },
     {
     {
       title: '图纸类型',
       title: '图纸类型',
-      dataIndex: 'mappingType',
+      dataIndex: 'fileType',
       width: 100,
       width: 100,
     },
     },
-    // {
-    //   title: '在线状态',
-    //   dataIndex: 'status',
-    //   width: 100,
-    //   customRender: ({ record }) => {
-    //     const status = String(record.status);
-    //     if (isEmpty(status)) {
-    //       return h('span', '-');
-    //     }
-    //     const text = status === '1' ? '在线' : '离线';
-    //     const textColor = status === '1' ? StatusColorEnum.green : StatusColorEnum.red;
-    //     return h('span', { style: { color: textColor } }, text);
-    //   },
-    // },
     {
     {
       title: '更新时间',
       title: '更新时间',
-      dataIndex: 'updateTime',
+      dataIndex: 'createTime',
       width: 100,
       width: 100,
     },
     },
     {
     {
@@ -64,21 +42,22 @@ export function getSearchFormSchema(): FormSchema[] {
       colProps: { span: 6 },
       colProps: { span: 6 },
     },
     },
     {
     {
-      field: 'mappingName',
+      field: 'fileName',
       label: '图纸名称',
       label: '图纸名称',
       component: 'Input',
       component: 'Input',
       colProps: { span: 6 },
       colProps: { span: 6 },
     },
     },
     {
     {
-      field: 'mappingType',
+      field: 'fileType',
       label: '图纸分类',
       label: '图纸分类',
       component: 'Select',
       component: 'Select',
       componentProps: {
       componentProps: {
         options: [
         options: [
-          { label: '采掘类', value: '0' },
-          { label: '机电类', value: '1' },
-          { label: '通防类', value: '2' },
-          { label: '地测及防治水类', value: '3' },
+          { label: '安全监控部署图', value: '安全监控部署图' },
+          { label: '通风系统图', value: '通风系统图' },
+          { label: '防灭火图', value: '防灭火图' },
+          { label: '人员位置监测系统图', value: '人员位置监测系统图' },
+          { label: '采掘工程平面图', value: '采掘工程平面图' },
         ],
         ],
       },
       },
       colProps: { span: 6 },
       colProps: { span: 6 },
@@ -86,84 +65,50 @@ export function getSearchFormSchema(): FormSchema[] {
   ];
   ];
 }
 }
 
 
-export const mockData = [
-  {
-    mineCode: '610801006584',
-    mineName: '陕西益东矿业有限责任公司',
-    mappingName: '通风图1',
-    mappingClass: '1',
-    mappingType: '1',
-    updateTime: '2026-03-30 15:51:43',
-    remark: '1',
-  },
-  {
-    mineCode: '610801018251',
-    mineName: '神木县兴盛源矿业有限公司',
-    mappingName: '通风图2',
-    mappingClass: '2',
-    mappingType: '2',
-    updateTime: '2026-03-30 15:51:43',
-    remark: '2',
-  },
-  {
-    mineCode: '610801018252',
-    mineName: '神木市恒瑞源矿业有限公司',
-    mappingName: '通风图3',
-    mappingClass: '3',
-    mappingType: '3',
-    updateTime: '2026-03-30 15:51:43',
-    remark: '3',
-  },
-];
 
 
 // 地图编辑弹框表单
 // 地图编辑弹框表单
 export const mapEditForm: FormSchema[] = [
 export const mapEditForm: FormSchema[] = [
   {
   {
-    field: 'deptId',
-    label: '煤矿名称',
+    field: 'mineCode',
+    label: '煤矿编码',
     component: 'MineCascader',
     component: 'MineCascader',
     colProps: { span: 6 },
     colProps: { span: 6 },
     groupName: '常规查询',
     groupName: '常规查询',
+    // show: false,
   },
   },
   {
   {
-    field: 'mappingName',
-    label: '图纸名称',
+    field: 'mineName',
+    label: '煤矿名称',
     component: 'Input',
     component: 'Input',
     colProps: { span: 6 },
     colProps: { span: 6 },
     groupName: '常规查询',
     groupName: '常规查询',
   },
   },
   {
   {
-    field: 'mappingClass',
-    label: '图纸分类',
-    component: 'Select',
-    componentProps: {
-      options: [
-        { label: '采掘类', value: '0' },
-        { label: '机电类', value: '1' },
-        { label: '通防类', value: '2' },
-        { label: '地测及防治水类', value: '3' },
-      ],
-    },
+    field: 'fileName',
+    label: '图纸名称',
+    component: 'Input',
     colProps: { span: 6 },
     colProps: { span: 6 },
     groupName: '常规查询',
     groupName: '常规查询',
   },
   },
+
   {
   {
-    field: 'mappingType',
+    field: 'fileType',
     label: '图纸类型',
     label: '图纸类型',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [
-        { label: '矿井地质图', value: '0' },
-        { label: '矿井充水性图', value: '1' },
-        { label: '通风系统图', value: '2' },
-        { label: '通风系统立体示意图', value: '3' },
+        { label: '安全监控部署图', value: '安全监控部署图' },
+        { label: '通风系统图', value: '通风系统图' },
+        { label: '防灭火图', value: '防灭火图' },
+        { label: '人员位置监测系统图', value: '人员位置监测系统图' },
+        { label: '采掘工程平面图', value: '采掘工程平面图' },
       ],
       ],
     },
     },
     colProps: { span: 6 },
     colProps: { span: 6 },
     groupName: '常规查询',
     groupName: '常规查询',
   },
   },
   {
   {
-    field: 'mappingAttach',
+    field: 'fileAttach',
     label: '附件',
     label: '附件',
     component: 'Upload',
     component: 'Upload',
 
 

+ 6 - 5
src/views/system/cadFile/components/GoafPopup.vue

@@ -73,17 +73,17 @@ const monitorData = ref({
 const fetchData = async () => {
 const fetchData = async () => {
   try {
   try {
     if (!props.data.id || !props.data.mineCode) {
     if (!props.data.id || !props.data.mineCode) {
-      throw new Error('缺少 goafId 或 mineCode');
+      throw new Error('缺少 goafId 或 deptId');
     }
     }
 
 
     // 调用接口
     // 调用接口
     const res = await getGoafData({
     const res = await getGoafData({
       goafId: props.data.id,
       goafId: props.data.id,
-      mineCodeList: props.data.mineCode,
+      deptId: props.data.mineCode,
     });
     });
 
 
     // 从 res[0] 中取数据
     // 从 res[0] 中取数据
-    const data = res?.[0] || {};
+    const data = res?.records[0] || {};
     
     
     // 赋值到页面
     // 赋值到页面
     monitorData.value = {
     monitorData.value = {
@@ -133,7 +133,7 @@ onUnmounted(() => {
   padding: 12px;
   padding: 12px;
 }
 }
 .loading {
 .loading {
-  color: #666;
+  color: #000;
   font-size: 14px;
   font-size: 14px;
   text-align: center;
   text-align: center;
   padding: 20px 0;
   padding: 20px 0;
@@ -174,7 +174,8 @@ onUnmounted(() => {
   width:100%;
   width:100%;
   height: 100%;
   height: 100%;
   font-size: 13px;
   font-size: 13px;
-  color: #666;
+  color: #000;
+  background-color: #f5f5f5;
   padding-right: 8px;
   padding-right: 8px;
   word-break: break-all; /* 超长内容换行,避免溢出 */
   word-break: break-all; /* 超长内容换行,避免溢出 */
   border: 1px solid #ddd;
   border: 1px solid #ddd;

+ 191 - 34
src/views/system/cadFile/components/MapEditModal.vue

@@ -3,7 +3,7 @@
     v-bind="$attrs"
     v-bind="$attrs"
     @register="registerModal"
     @register="registerModal"
     @ok="handleSubmit"
     @ok="handleSubmit"
-    title="修改图纸管理"
+    title="图纸管理"
     width="900px"
     width="900px"
     :min-height="600"
     :min-height="600"
     :max-height="1000"
     :max-height="1000"
@@ -24,7 +24,7 @@
         <div class="mine-base-info">
         <div class="mine-base-info">
           <!-- 添加 key 强制重新渲染 -->
           <!-- 添加 key 强制重新渲染 -->
           <a-form-item 
           <a-form-item 
-            v-for="schema in mapEditForm" 
+            v-for="schema in visibleFormSchemas" 
             :key="schema.field + formKey" 
             :key="schema.field + formKey" 
             :name="schema.field" 
             :name="schema.field" 
             :label="schema.label"
             :label="schema.label"
@@ -35,6 +35,9 @@
               <a-upload
               <a-upload
                 v-model:file-list="formData[schema.field]"
                 v-model:file-list="formData[schema.field]"
                 v-bind="schema.componentProps"
                 v-bind="schema.componentProps"
+                @change="(info) => handleUploadChange(info, schema.field)"
+                :customRequest="handleCustomUpload" 
+                :maxCount="1"
               >
               >
                 <a-button>
                 <a-button>
                   <template #icon><UploadOutlined /></template>
                   <template #icon><UploadOutlined /></template>
@@ -48,6 +51,7 @@
                 :is="getComponent(schema.component)"
                 :is="getComponent(schema.component)"
                 :value="formData[schema.field]"
                 :value="formData[schema.field]"
                 @update:value="handleUpdateValue(schema.field, $event)"
                 @update:value="handleUpdateValue(schema.field, $event)"
+                @change="(val) => handleComponentChange(schema.field, val, schema)" 
                 v-bind="schema.componentProps"
                 v-bind="schema.componentProps"
                 :placeholder="`请输入${schema.label}`"
                 :placeholder="`请输入${schema.label}`"
                 style="width: 100%"
                 style="width: 100%"
@@ -64,13 +68,19 @@
   import { ref, computed, nextTick } from 'vue';
   import { ref, computed, nextTick } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { mapEditForm } from '../cad.data';
   import { mapEditForm } from '../cad.data';
-  import { Select, Input, Upload, message } from 'ant-design-vue';
+  import { Select, Input, message } from 'ant-design-vue';
   import { UploadOutlined } from '@ant-design/icons-vue';
   import { UploadOutlined } from '@ant-design/icons-vue';
   import MineCascader from '/@/components/Form/src/jeecg/components/MineCascader/MineCascader.vue';
   import MineCascader from '/@/components/Form/src/jeecg/components/MineCascader/MineCascader.vue';
   import type { FormInstance } from 'ant-design-vue/es/form';
   import type { FormInstance } from 'ant-design-vue/es/form';
+  import { uploadFile, updateMineFile, addMineFile } from '../cad.api';
+  import type { UploadChangeParam, UploadFile } from 'ant-design-vue/es/upload/interface';
+  import dayjs from 'dayjs';
+  import { useMineDepartmentStore } from '/@/store/modules/mine';
 
 
   // 表单 key(用于强制重新渲染)
   // 表单 key(用于强制重新渲染)
   const formKey = ref(0);
   const formKey = ref(0);
+  // 标识当前是否为新增模式
+  const isAddMode = ref(false);
 
 
   // 组件映射表(Upload 单独处理)
   // 组件映射表(Upload 单独处理)
   const componentMap: Record<string, any> = {
   const componentMap: Record<string, any> = {
@@ -88,13 +98,19 @@
   
   
   // 表单数据
   // 表单数据
   const formData = ref({
   const formData = ref({
-    mineCodeList: '',
-    mappingName: '',
-    mappingClass: '',
-    mappingType: '',
-    mappingAttach: [] as any[],
+    id: '',
+    mineCode: '',
+    mineName: '',
+    fileName: '',
+    fileType: '',
+    fileAttach: [] as any[],
     remark: '',
     remark: '',
+    filePath: '',
+    createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
   });
   });
+  
+  // 获取部门信息
+  const mineStore = useMineDepartmentStore();
 
 
   // 表单规则
   // 表单规则
   const formRules = computed(() => {
   const formRules = computed(() => {
@@ -107,56 +123,186 @@
     return rules;
     return rules;
   });
   });
 
 
+    const visibleFormSchemas = computed(() => {
+      // 定义新增模式下允许显示的字段
+      const allowedFieldsInAddMode = ['mineCode', 'fileName', 'fileType', 'fileAttach' , 'remark'];
+      const allowedFieldsInEditMode = ['mineCode', 'fileName', 'fileType', 'fileAttach', 'remark'];
+      
+      return mapEditForm.filter(item => {
+        // 1. 基础隐藏逻辑
+        if (item.ifShow === false || item.show === false) {
+          return false;
+        }
+        
+        // 2. 如果是新增模式,只保留允许显示的字段
+        if (isAddMode.value) {
+          return allowedFieldsInAddMode.includes(item.field);
+        }
+        
+        return allowedFieldsInEditMode.includes(item.field);;
+      });
+    });
+
   // 获取组件
   // 获取组件
   const getComponent = (componentName: string) => {
   const getComponent = (componentName: string) => {
     return componentMap[componentName] || Input;
     return componentMap[componentName] || Input;
   };
   };
 
 
-  // 处理值更新(替代 v-model)
+  // 处理值更新
   const handleUpdateValue = (field: string, value: any) => {
   const handleUpdateValue = (field: string, value: any) => {
     formData.value[field as keyof typeof formData.value] = value;
     formData.value[field as keyof typeof formData.value] = value;
   };
   };
 
 
+  const handleComponentChange = (field: string, value: any, schema: any) => {
+    console.log(`字段 ${field} 触发 change 事件,新值为:`, schema, value);
+    
+    if (field === 'mineCode') {
+      if (value) {
+        const depart = mineStore.findDepartById(value, mineStore.getDepartTree);
+        if (depart) {
+          // 同步更新 formData 中的 mineName
+          formData.value.mineName = depart.departName;
+          console.log('自动填充矿区名称:', depart.departName);
+        } else {
+          // 如果没找到,可能数据还没加载完,或者 ID 无效
+          console.warn('未找到对应的矿区名称');
+          formData.value.mineName = ''; 
+        }
+      } else {
+        // 如果清空了选择,也清空名称
+        formData.value.mineName = '';
+      }
+    }
+    
+  };
+
+  /**
+   * 自定义上传请求
+   * 使用 defHttp 封装的 uploadFile 接口
+   */
+  const handleCustomUpload = async (options: any) => {
+    const { file, onSuccess, onError } = options;
+    
+    // 构建 FormData
+    const formDataObj = new FormData();
+    formDataObj.append('file', file);
+    // 添加其他参数
+    // formDataObj.append('biz', 'cadFile'); 
+
+    try {
+      // 调用上传接口
+      const res = await uploadFile(formDataObj);
+
+      if (res&& res.success && res.message) {
+        // 成功回调,将后端返回的路径挂载到 file 对象上,方便后续提交或展示
+        formData.value.filePath = res.message;
+        const uploadedFileItem = {
+          uid: file.uid || Date.now(), // 唯一标识
+          name: file.name,             // 文件名
+          status: 'done',              // 状态:完成
+          url: res.message,            // 预览地址(如果有)
+          response: res                // 原始响应
+        };
+        
+        // 更新表单中的 fileAttach 数组,触发视图更新
+        formData.value.fileAttach = [uploadedFileItem];
+        onSuccess(res, file);
+      } else {
+        throw new Error(`${res.message}`);
+      }
+    } catch (err: any) {
+      console.error('上传错误:', err);
+      message.error(err.message || '文件上传失败');
+      onError(err);
+    }
+  };
+
+  /**
+   * 上传状态改变处理
+   * @param info 上传信息
+   * @param field 当前绑定的表单字段名
+   */
+  const handleUploadChange = async (info: UploadChangeParam, field: string) => {
+    const { fileList } = info;
+    // const status = info.file.status;
+    
+    // // 1. 更新文件列表显示
+    // // formData.value[field as keyof typeof formData.value] = fileList;
+
+    // // 2. 如果上传成功,提取 filePath 并存储
+  
+    // if (info.file.status === 'done') {
+    //   const response = info.file.response;
+    //   // 假设后端返回的 message 就是我们要的 filePath
+    //   const filePath = response?.message; 
+      
+    //   if (filePath) {
+    //     const currentFile = fileList[fileList.length - 1];
+    //     if(currentFile) {
+    //        currentFile.customPath = filePath;
+    //     }
+        
+    //     message.success(`${info.file.name} 文件上传成功`);
+    //   }
+    // } else if (info.file.status === 'error') {
+    //   message.error(`${info.file.name} 文件上传失败`);
+    // }
+  };
+
   // 注册模态框并初始化数据
   // 注册模态框并初始化数据
   const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
   const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
     setModalProps({ confirmLoading: false });
     setModalProps({ confirmLoading: false });
     // 先重置 formKey 强制重新渲染
     // 先重置 formKey 强制重新渲染
     formKey.value++;
     formKey.value++;
+    // 如果没有data或者id为空则为新增模式
+    isAddMode.value = !data || !data.id;
     
     
     // 重置表单数据
     // 重置表单数据
     await nextTick();
     await nextTick();
     formData.value = {
     formData.value = {
-      mineCodeList: '',
-      mappingName: '',
-      mappingClass: '',
-      mappingType: '',
-      mappingAttach: [],
+      id: '',
+      mineCode: '',
+      mineName: '',
+      fileName: '',
+      fileType: '',
+      fileAttach: [],
+      filePath: '',
       remark: '',
       remark: '',
+      createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
     };
     };
-    // 填充现有数据
-    if (data) {
+    // 编辑模式时填充现有数据
+    if (data && !isAddMode.value) {
       const record = data;
       const record = data;
-      console.log('当前记录数据:', record);
+      // 处理文件回显
+      let fileList: UploadFile[] = [];
+      if (record.filePath) {
+
+        const originalFileName = record.filePath.split('/').pop() || record.filePath.split('\\').pop() || '已上传文件';
+        // 后端返回了 filePath,构造一个 fake file 对象用于展示
+        fileList = [{
+          uid: '-1',
+          name: originalFileName, 
+          status: 'done',
+          url: record.filePath,
+          response: { message: record.filePath }
+        } as UploadFile];
+      }
       
       
       // 使用 nextTick 确保数据填充后视图更新
       // 使用 nextTick 确保数据填充后视图更新
       await nextTick();
       await nextTick();
       formData.value = {
       formData.value = {
-        mineCodeList: record.mineCode || record.mineCodeList || '',
-        mappingName: record.mappingName || '',
-        mappingClass: record.mappingClass || '',
-        mappingType: record.mappingType || '',
-        mappingAttach: record.mappingAttach || [],
+        id: record.id || '',
+        mineCode: record.mineCode || '',
+        mineName: record.mineName || '',
+        fileName: record.fileName || '',
+        fileType: record.fileType || '',
+        fileAttach: fileList || [],
+        filePath: record.filePath || '',
         remark: record.remark || '',
         remark: record.remark || '',
+        createTime: record.createTime || dayjs().format('YYYY-MM-DD HH:mm:ss'),
       };
       };
       
       
-      console.log('填充后的表单数据:', formData.value);
     }
     }
-
-    // 重置表单校验状态
-    // if (formRef.value) {
-    //   await nextTick();
-    //   formRef.value.resetFields();
-    // }
   });
   });
 
 
   // 提交表单处理
   // 提交表单处理
@@ -167,17 +313,28 @@
 
 
       setModalProps({ confirmLoading: true });
       setModalProps({ confirmLoading: true });
       
       
-      const result = {
+      // 构造提交数据
+      const submitData = {
         ...formData.value,
         ...formData.value,
-        mineCode: formData.value.mineCodeList,
       };
       };
+
+      submitData.createTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
+      delete submitData.fileAttach;
+
+      // 调用更新接口
+      await updateMineFile(submitData);
+      if (isAddMode.value) {
+        await addMineFile(submitData);
+      } else {
+        await updateMineFile(submitData);
+      }
       
       
-      console.log('最终提交数据:', result);
-      emit('success', result);
+      message.success(isAddMode.value ? '新增成功' : '修改成功');
+      emit('success',true);
       closeModal();
       closeModal();
     } catch (error: any) {
     } catch (error: any) {
       console.error('提交失败:', error);
       console.error('提交失败:', error);
-      message.error(error.message || '表单校验失败,请检查必填项');
+      message.error(error.message || '操作失败,请检查必填项');
     } finally {
     } finally {
       setModalProps({ confirmLoading: false });
       setModalProps({ confirmLoading: false });
     }
     }

+ 10 - 12
src/views/system/cadFile/index.vue

@@ -2,7 +2,8 @@
 <template>
 <template>
   <BasicTable @register="registerMapTable" :rowSelection="rowSelection">
   <BasicTable @register="registerMapTable" :rowSelection="rowSelection">
     <template #resetBefore>
     <template #resetBefore>
-      <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="onExportXls"> 下载 </a-button>
+      <!-- <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="onExportXls"> 下载 </a-button> -->
+      <a-button type="default" class="ml-8px" preIcon="mdi:plus" @click="handleOpenModal({})"> 新增 </a-button>
     </template>
     </template>
     <template #action="{ record }">
     <template #action="{ record }">
       <button @click="handleGoToPageQuery(record, `/manage/mapView`)" class="action-btn" title=""> 布点 </button>
       <button @click="handleGoToPageQuery(record, `/manage/mapView`)" class="action-btn" title=""> 布点 </button>
@@ -37,8 +38,8 @@
   import { SvgIcon } from '/@/components/Icon';
   import { SvgIcon } from '/@/components/Icon';
   import { message, Popconfirm } from 'ant-design-vue';
   import { message, Popconfirm } from 'ant-design-vue';
   // 引入动态列/表单配置函数 + 类型
   // 引入动态列/表单配置函数 + 类型
-  import { getColumns, getSearchFormSchema, mockData } from './cad.data';
-  // import { getMineData } from '../basicInfo.api';
+  import { getColumns, getSearchFormSchema } from './cad.data';
+  import { getMineFileList, deleteMineFile } from './cad.api';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { useIntervalFn } from '@vueuse/core';
   import { useIntervalFn } from '@vueuse/core';
   import { useModal } from '/@/components/Modal';
   import { useModal } from '/@/components/Modal';
@@ -55,8 +56,8 @@
   // ========== 表格注册 ==========
   // ========== 表格注册 ==========
   const { tableContext: mapManageTable, onExportXls } = useListPage({
   const { tableContext: mapManageTable, onExportXls } = useListPage({
     tableProps: {
     tableProps: {
-      // api: getMineData, // 数据统计接口
-      dataSource: mockData,
+      api: getMineFileList, // 数据统计接口
+      // dataSource: mockData,
       columns, // 绑定动态列
       columns, // 绑定动态列
       rowKey: 'mineCode',
       rowKey: 'mineCode',
       rowSelection: {
       rowSelection: {
@@ -75,7 +76,7 @@
       scroll: { x: 'max-content' },
       scroll: { x: 'max-content' },
     },
     },
     exportConfig: {
     exportConfig: {
-      url: '/ventanaly-province/province/mineData/exportMineData',
+      url: '/ventanaly-province/province/mineData/exportMineData', //后端接口未知
       name: '矿山信息',
       name: '矿山信息',
       params: {},
       params: {},
     },
     },
@@ -96,10 +97,7 @@
    * @param result 弹框数据
    * @param result 弹框数据
    */
    */
   async function handleModalSuccess(result: any) {
   async function handleModalSuccess(result: any) {
-    if (result) {
-      message.success('操作成功!');
-      mapTable.reload();
-    }
+      await mapTable.reload();
   }
   }
   /**
   /**
    * 删除记录方法
    * 删除记录方法
@@ -107,8 +105,8 @@
    */
    */
   async function handleDeleteRecord(record: any) {
   async function handleDeleteRecord(record: any) {
     try {
     try {
-      // await deleteDataQuaQue({ id: record.id });
-      await nextTick();
+      await deleteMineFile({ id: record.id });
+      await mapTable.reload();
     } catch (error) {
     } catch (error) {
       console.error('删除失败:', error);
       console.error('删除失败:', error);
     }
     }