Bladeren bron

方案筹划 w文件上传 子任务修改

zhaoen 4 maanden geleden
bovenliggende
commit
c3a8633fe3

+ 25 - 0
src/api/planningScheme/index.js

@@ -8,6 +8,30 @@ export function planningSchemePage(params) {
     });
 }
 
+export function planningSchemeUpdate(data) {
+    return request({
+        url: "/api/v1/planning-scheme/update",
+        method: "post",
+        data,
+    });
+}
+
+export function planningSchemeUpdateInte(data) {
+    return request({
+        url: "/api/v1/planning-scheme/update-interference",
+        method: "post",
+        data,
+    });
+}
+
+export function planningSchemeUpdateTarget(data) {
+    return request({
+        url: "/api/v1/planning-scheme/update-target",
+        method: "post",
+        data,
+    });
+}
+
 export function schemeChapterInsert(data) {
     return request({
         url: "/api/v1/schemechapter/insert",
@@ -33,6 +57,7 @@ export function schemeChapterUpdateList(data) {
 }
 
 
+
 export function flattenTree(tree, childrenKey = 'children') {
     const result = [];
 

+ 3 - 3
src/components/GlobalComponents/OverallCard.vue

@@ -78,7 +78,7 @@
               class="cursor-pointer"
               @click="viewIntePlan(plan.interferenceSchemeStatus)"
           >
-            {{ plan.interferenceSchemeStatus || "未编制" }}
+            {{ plan.interferenceSchemeStatus || "未导入" }}
           </el-tag>
         </div>
         <div class="info-row">
@@ -100,9 +100,9 @@
               size="small"
               effect="dark"
               class="cursor-pointer"
-              @click="viewTargetPlan(plan.targetSchemeStatus|| false)"
+              @click="viewTargetPlan(plan.targetSchemeStatus)"
           >
-            {{ plan.targetSchemeStatus || "未编制" }}
+            {{ plan.targetSchemeStatus || "未导入" }}
           </el-tag>
         </div>
         <div class="info-row">

+ 120 - 213
src/views/planAndDeduction/childsTask/index.vue

@@ -81,28 +81,48 @@
           <el-table-column
               label="任务名称"
               prop="taskName"
-              align="center"
-          />
+              align="center">
+            <template slot-scope="scope">
+              {{ `${scope.row.missileSerialNumber}-${scope.row.bulletType}` || "-" }}
+            </template>
+          </el-table-column>
           <el-table-column
               label="发射方式"
               prop="launchMethod"
               align="center"
-          />
+          >
+            <template slot-scope="scope">
+              {{ scope.row.launchMethod || "-" }}
+            </template>
+          </el-table-column>
           <el-table-column
               label="发射平台"
-              prop="firePlatform"
+              prop="launchPlatform"
               align="center"
-          />
+          >
+            <template slot-scope="scope">
+              {{ scope.row.launchPlatform || "-" }}
+            </template>
+          </el-table-column>
           <el-table-column
               label="攻击靶标"
-              prop="target"
+              prop="attackTheTarget"
               align="center"
-          />
+          >
+            <template slot-scope="scope">
+              {{ scope.row.attackTheTarget || "-" }}
+            </template>
+
+          </el-table-column>
           <el-table-column
               label="发射时刻"
               prop="launchTime"
               align="center"
-          />
+          >
+            <template slot-scope="scope">
+              {{ scope.row.launchTime || "-" }}
+            </template>
+          </el-table-column>
           <el-table-column
               label="操作"
               align="center"
@@ -140,218 +160,131 @@
         >
           <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="任务名称">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.name"
-                    placeholder="请输入任务名称"
-                />
+              <el-form-item label="导弹序号">
+                <el-input v-model="taskForm.missileSerialNumber" placeholder="请输入导弹序号"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="任务代号">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.code"
-                    placeholder="请输入任务代号"
-                />
+              <el-form-item label="弹种">
+                <el-input v-model="taskForm.bulletType" placeholder="请输入弹种"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="任务类型">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.type"
-                    placeholder="请输入任务类型"
-                />
+              <el-form-item label="射程/航程(km)">
+                <el-input v-model="taskForm.range" placeholder="请输入射程/航程"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="导弹总数">
-                <el-input
-                    type="number"
-                    style="width: 100%"
-                    v-model="missileSums"
-                    placeholder="请输入导弹总数"
-                    readonly
-                />
+              <el-form-item label="发射平台">
+                <el-input v-model="taskForm.launchPlatform"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="6">
-              <el-form-item label="导弹类型一">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.missileTypeOne"
-                    placeholder="请输入导弹类型"
-                />
+            <el-col :span="12">
+              <el-form-item label="发射方式">
+                <el-input v-model="taskForm.launchMethod" placeholder="请输入发射方式"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="6">
-              <el-form-item label="导弹数量">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.missileTypeOneNum"
-                    placeholder="请输入数量"
-                    type="number"
-                />
+            <el-col :span="12">
+              <el-form-item label="发射舷角(°)">
+                <el-input v-model="taskForm.firingAngle" placeholder="请输入发射舷角"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="6">
-              <el-form-item label="导弹类型二">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.missileTypeTwo"
-                    placeholder="请输入导弹类型"
-                />
+            <el-col :span="12">
+              <el-form-item label="舰船航向">
+                <el-input v-model="taskForm.shipHeading" placeholder="请输入舰船航向"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="6">
-              <el-form-item label="导弹数量">
-                <el-input
-                    style="width: 100%"
-                    v-model="taskForm.missileTypeTwoNum"
-                    placeholder="请输入数量"
-                    type="number"
-                />
+            <el-col :span="12">
+              <el-form-item label="发射航速(kn)">
+                <el-input v-model="taskForm.launchSpeed" placeholder="请输入发射航速"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="试验时间">
-                <el-input
-                    v-model="taskForm.testTime"
-                    placeholder="请输入任务时间"
-                />
+              <el-form-item label="发射时刻">
+                <el-input v-model="taskForm.launchTime" placeholder="请输入发射时刻"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="发射平台">
-                <el-input v-model="taskForm.firePlatform"></el-input>
+              <el-form-item label="海上飞行高度(m)">
+                <el-input v-model="taskForm.flightAltitudeAtSea" placeholder="请输入海上飞行高度"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="试验航区">
-                <el-input
-                    v-model="taskForm.testRegion"
-                    placeholder="请输入试验航区"
-                />
+              <el-form-item label="陆上飞行高度(m)">
+                <el-input v-model="taskForm.landFlightAltitude" placeholder="请输入陆上飞行高度"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="靶区">
-                <el-input
-                    v-model="taskForm.targetArea"
-                    placeholder="请输入靶区"
-                />
+              <el-form-item label="攻击目标方式">
+                <el-input v-model="taskForm.attackTargetMethod" placeholder="请输入攻击目标方式"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="温度">
-                <el-input
-                    v-model="taskForm.temperature"
-                    placeholder="请输入温度"
-                />
+              <el-form-item label="数据装定方式">
+                <el-input v-model="taskForm.dataInstallationMethod" placeholder="请输入数据装定方式"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="湿度">
-                <el-input
-                    v-model="taskForm.humidity"
-                    placeholder="请输入湿度"
-                />
+              <el-form-item label="中制导方式">
+                <el-input v-model="taskForm.mediumGuidanceMode" placeholder="请输入中制导方式"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="风速">
-                <el-input
-                    v-model="taskForm.windSpeed"
-                    placeholder="请输入风速"
-                />
+              <el-form-item label="远程管控方式">
+                <el-input v-model="taskForm.remoteControlMode" placeholder="请输入远程管控方式"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="降雨强度">
-                <el-input
-                    v-model="taskForm.precipitation"
-                    placeholder="请输入降雨强度"
-                />
+              <el-form-item label="攻击时段">
+                <el-input v-model="taskForm.attackPeriod" placeholder="请输入攻击时段"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="攻击角度(°)">
+                <el-input v-model="taskForm.angleOfAttack" placeholder="请输入攻击角度"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="电子对抗能力">
+                <el-input v-model="taskForm.electronicCounter" placeholder="请输入电子对抗能力"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="弹载卫导抗干扰">
+                <el-input v-model="taskForm.carrierGuard" placeholder="请输入弹载卫导抗干扰"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="弹载卫通抗干扰">
+                <el-input v-model="taskForm.antiJamming" placeholder="请输入弹载卫通抗干扰"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="打击维度">
-                <el-input
-                    v-model="taskForm.fightAway"
-                    placeholder="请输入打击维度"
-                />
+              <el-form-item label="引信工作方式">
+                <el-input v-model="taskForm.fuzeWorkingMethod" placeholder="请输入引信工作方式"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="海况">
-                <el-input
-                    v-model="taskForm.seaStatus"
-                    placeholder="请输入海况"
-                />
+              <el-form-item label="攻击靶标">
+                <el-input v-model="taskForm.attackTheTarget" placeholder="请输入攻击靶标"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="总时间(s)">
+                <el-input v-model="taskForm.totalTime" placeholder="请输入总时间"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="发射海况(级)">
+                <el-input v-model="taskForm.launchSeaConditions" placeholder="请输入发射海况"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="主要考核目的">
+                <el-input v-model="taskForm.theAssessment" type="textarea" :rows="5" placeholder="请输入主要考核目的"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
-
-          <el-form-item label="任务依据">
-            <el-input
-                v-model="taskForm.basis"
-                type="textarea"
-                :rows="5"
-                placeholder="请输入任务依据"
-            />
-          </el-form-item>
-
-          <el-form-item label="试验目的">
-            <el-input
-                v-model="taskForm.testPurpose"
-                type="textarea"
-                :rows="5"
-                placeholder="请输入试验目的"
-            />
-          </el-form-item>
-
-          <el-form-item label="靶标要求">
-            <el-input
-                v-model="taskForm.targetReq"
-                type="textarea"
-                :rows="6"
-                placeholder="请输入靶标要求"
-            />
-          </el-form-item>
-
-          <el-form-item label="测量要求">
-            <el-input
-                v-model="taskForm.measReq"
-                type="textarea"
-                :rows="6"
-                placeholder="请输入测量要求"
-            />
-          </el-form-item>
-
-          <el-form-item label="干扰要求">
-            <el-input
-                v-model="taskForm.inteReq"
-                type="textarea"
-                :rows="6"
-                placeholder="请输入干扰要求"
-            />
-          </el-form-item>
         </el-form>
       </div>
 
@@ -479,7 +412,13 @@
 import DarkLayout from '@/components/GlobalComponents/DarkLayout.vue'
 import childTaskCard from './components/childTaskCard.vue'
 import DarkDialog from "@/components/Components/DarkDialog.vue";
-import {findSubTaskPage, missileList, subTaskUpdate} from "@/api/taskMage/taskMage";
+import {
+  findSubTaskPage,
+  missileList,
+  missileTaskInsert,
+  missileTaskUpdate,
+  subTaskUpdate
+} from "@/api/taskMage/taskMage";
 import VabDictSelect from "@/components/VabDictSelect/VabDictSelect.vue";
 
 export default {
@@ -492,30 +431,7 @@ export default {
   data() {
     return {
       // 原数据保持不变...
-      taskForm: {
-        fightAway: "对陆",
-        measReq: "遥测参数测量及处理要求...",
-        inteReq: "弹载北斗卫星导航系统干扰装备...",
-        targetReq: "模拟指挥所靶标...",
-        seaStatus: "发射区域不大于5级...",
-        windSpeed: "发射区风速不大于20m/s",
-        precipitation: "不大于7.5mm/h",
-        humidity: "不大于98%(25℃)",
-        temperature: "-40℃~+60℃",
-        testPurpose: "主要试验目的如下:...",
-        missileTypeOne: "侵彻爆破战斗部状态导弹",
-        missileTypeOneNum: 8,
-        missileTypeTwoNum: 6,
-        missileTypeTwo: "反跑道子母战斗部状态导弹",
-        name: '鹰击-18C导弹武器系统性能鉴定飞行试验',
-        basis: "本方案依据下述文件编制:...",
-        type: '性能鉴定试验',
-        testTime: "2024-06至2024-09",
-        firePlatform: "851舰",
-        testRegion: "海陆结合综合试验航区",
-        targetArea: "A靶区",
-        code: "HJ-18C-2024-001"
-      },
+      taskForm: {},
       taskTableData: [],
       dialogVisible: false,
       showTaskTable: true,
@@ -666,36 +582,27 @@ export default {
     },
     handleTaskDetail(task) {
       this.currentTask = task;
-      this.setTaskFormData(task.formId);
+      this.taskForm = task;
       this.showTaskTable = false;
       this.isEditing = false;
     },
     handleTaskEdit(task) {
       this.currentTask = task;
-      this.setTaskFormData(task.formId);
+      this.taskForm = task;
       this.showTaskTable = false;
       this.isEditing = true;
     },
-    setTaskFormData(formId) {
-      switch(formId) {
-        case "task-001":
-          this.taskForm = { ...this.taskForm, name: "鹰击-18C首轮发射试验", code: "HJ-18C-2024-001" };
-          break;
-        case "task-002":
-          this.taskForm = { ...this.taskForm, name: "鹰击-18C次轮发射试验", code: "HJ-18C-2024-002" };
-          break;
-        case "task-003":
-          this.taskForm = { ...this.taskForm, name: "电子干扰环境发射试验", code: "HJ-18C-2024-003" };
-          break;
-        default:
-          break;
-      }
-    },
     handleFormCancel() {
       this.showTaskTable = true;
       this.isEditing = false;
     },
-    handleFormSave() {
+    async handleFormSave() {
+      if (this.taskForm.id){
+        await missileTaskUpdate(this.taskForm);
+      }else{
+        await missileTaskInsert(this.taskForm);
+      }
+      this.viewDetails(this.currentPlan);
       this.$message.success("任务数据保存成功!");
       this.showTaskTable = true;
       this.isEditing = false;

+ 229 - 29
src/views/planningSchem/comprehensive/index.vue

@@ -62,12 +62,14 @@
         width="50%">
       <el-upload
           class="upload-demo"
-          action="/api/upload/inte"
-          :on-success="handleInteUploadSuccess"
-          :on-error="handleUploadError"
+          ref="inteUpload"
+          action="#"
           :file-list="inteFileList"
           accept=".doc,.docx,.pdf,.xlsx,.xls"
-          :auto-upload="false">
+          :auto-upload="false"
+          :on-change="handleInteFileChange"
+          :limit="1"
+      >
         <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
         <el-button style="margin-left: 10px;" size="small" type="success" @click="submitInteUpload">
           上传到服务器
@@ -88,12 +90,14 @@
         width="50%">
       <el-upload
           class="upload-demo"
-          action="/api/upload/target"
-          :on-success="handleTargetUploadSuccess"
-          :on-error="handleUploadError"
+          ref="targetUpload"
+          action="#"
           :file-list="targetFileList"
           accept=".doc,.docx,.pdf,.xlsx,.xls"
-          :auto-upload="false">
+          :auto-upload="false"
+          :on-change="handleTargetFileChange"
+          :limit="1"
+      >
         <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
         <el-button style="margin-left: 10px;" size="small" type="success" @click="submitTargetUpload">
           上传到服务器
@@ -132,8 +136,16 @@
 import DarkLayout from '@/components/GlobalComponents/DarkLayout.vue'
 import InterferenceCard from '@/components/Components/InterferenceCard.vue'
 import DarkDialog from "@/components/Components/DarkDialog.vue";
-import {planningSchemePage} from "@/api/planningScheme";
+import {
+  planningSchemePage,
+  planningSchemeUpdate, planningSchemeUpdateInte,
+  planningSchemeUpdateTarget,
+  planningSchemeUploadTarget
+} from "@/api/planningScheme";
 import {exportSolutionToWord} from "@/views/planningSchem/comprehensive/wordExporter";
+import { baseURL,contentType,tokenName } from "@/config";
+import store from "@/store";
+import {doUpload} from "@/api/tool/ossTool";
 
 export default {
   components: {
@@ -240,6 +252,7 @@ export default {
         pageSize: 10,
         total: 0
       },
+      selectPlan:null,
       showAdvancedSearch: false,
       showInteUpload: false,    // 干扰方案上传弹窗
       showTargetUpload: false,  // 靶标方案上传弹窗
@@ -263,23 +276,85 @@ export default {
     },
 
     // 干扰方案上传成功处理
-    handleInteUploadSuccess(response, file, fileList) {
+    async handleInteUploadSuccess(response, file, fileList) {
+      if(response.code !==200){
+        this.$message.success('干扰方案上传失败');
+        return;
+      }
       this.$message.success('干扰方案上传成功');
-      this.showInteUpload = false;
-      this.inteFileList = [];
-      // 上传成功后可以刷新数据
-      this.fetchData();
+
+      const fileJson = JSON.stringify(
+          fileList.map(item => ({
+            fileName: item.name,
+            fileHttp: item.response?.data?.url || '',
+            fileType: item.response?.data?.type || '',
+            type: 1
+          })).filter(item => item.fileHttp)
+      );
+
+      try {
+        await planningSchemeUpdate({
+          id: this.selectPlan.id,
+          interferenceSchemeStatus: '已导入',
+          schemeSubPlan: fileJson
+        });
+
+        this.showInteUpload = false;
+        this.inteFileList = [];
+        this.handleQuery();
+      } catch (err) {
+        console.error('更新方案失败:', err);
+        this.$message.error('方案更新失败');
+      }
     },
 
 
 
     // 靶标方案上传成功处理
-    handleTargetUploadSuccess(response, file, fileList) {
+    async handleTargetUploadSuccess(response, file, fileList) {
+      if(response.code !==200){
+        this.$message.success('靶标方案上传失败');
+        return;
+      }
       this.$message.success('靶标方案上传成功');
-      this.showTargetUpload = false;
-      this.targetFileList = [];
-      // 上传成功后可以刷新数据
-      this.fetchData();
+
+      // 1. 将 fileList 转为 JSON(和干扰方案保持一致)
+      const fileJson = JSON.stringify(
+          fileList.map(item => ({
+            fileName: item.name,
+            fileHttp: item.response?.data?.url || '',
+            fileType: item.response?.data?.type || '',
+            type: 2
+          })).filter(item => item.fileHttp) // 过滤掉上传失败的文件
+      );
+
+      try {
+        // 2. 调用 API 更新靶标方案
+        await planningSchemeUpdate({
+          id: this.selectPlan.id,
+          schemeSubPlan: fileJson
+        });
+
+        // 3. 更新 UI 状态
+        this.showTargetUpload = false;
+        this.targetFileList = [];
+
+        // 4. 刷新数据
+        this.handleQuery();
+      } catch (err) {
+        console.error('靶标方案更新失败:', err);
+        this.$message.error('靶标方案保存失败,请重试');
+      }
+    },
+
+    // 同步干扰方案文件列表
+    handleInteFileChange(file, fileList) {
+      this.inteFileList = fileList; // ✅ 手动同步
+    },
+
+    // 同步靶标方案文件列表
+    handleTargetFileChange(file, fileList) {
+      this.targetFileList = fileList; // ✅ 手动同步
     },
 
     // 上传失败处理
@@ -287,28 +362,151 @@ export default {
       this.$message.error('文件上传失败,请重试');
     },
 
+    /**
+     * 合并 schemeSubPlan
+     * @param {Array} existingList - 已有的文件列表(解析后的)
+     * @param {Object} newFile - 新上传的文件信息 { fileName, fileHttp, fileType, type }
+     * @returns {Array} 合并后的列表
+     */
+    mergeSchemeSubPlan(existingList, newFile) {
+      // 1. 先过滤掉同 type 的旧文件(保证每个 type 只有一个)
+      const filtered = existingList.filter(item => item.type !== newFile.type);
+
+      // 2. 添加新文件
+      return [...filtered, newFile];
+    },
+
+    /**
+     * 解析 schemeSubPlan 字符串为数组
+     * @returns {Array} 解析后的文件列表
+     */
+    parseSchemeSubPlan() {
+      try {
+        console.log(this.selectPlan.schemeSubPlan)
+        const str = this.selectPlan.schemeSubPlan;
+        return str ? JSON.parse(str) : [];
+      } catch (error) {
+        console.error('解析 schemeSubPlan 失败:', error);
+        return [];
+      }
+    },
+
     // 提交干扰方案上传
-    submitInteUpload() {
+    async submitInteUpload() {
       if (this.inteFileList.length === 0) {
         this.$message.warning('请先选择文件');
         return;
       }
-      // 手动触发上传
-      document.querySelector('.upload-demo [type="file"]').dispatchEvent(
-          new Event('change', { bubbles: true })
-      );
+
+      const formData = new FormData();
+      this.inteFileList.forEach(file => {
+        if (file.raw) {
+          formData.append('files', file.raw);
+        }
+      });
+
+      try {
+        const response = await doUpload(formData);
+        if (response.code !== 0) {
+          this.$message.error(`上传失败: ${response.msg || '未知错误'}`);
+          return;
+        }
+
+        // ✅ 1. 构造新文件对象
+        const newFile = {
+          fileName: this.inteFileList[0].name,
+          fileHttp: response.data.fileStoragePath,
+          fileType: response.data.suffix,
+          type: 1 // 干扰方案
+        };
+
+        // ✅ 2. 解析已有数据
+        const existingList = this.parseSchemeSubPlan();
+
+        // ✅ 3. 合并
+        const mergedList = this.mergeSchemeSubPlan(existingList, newFile);
+
+        // ✅ 4. 转为 JSON 字符串
+        const fileJson = JSON.stringify(mergedList);
+
+        // ✅ 5. 更新干扰方案
+        await planningSchemeUpdateInte({
+          id: this.selectPlan.id,
+          schemeSubPlan: fileJson
+        });
+
+        // ✅ 6. 成功后清空
+        this.showInteUpload = false;
+        this.inteFileList = [];
+        this.$refs.inteUpload?.clearFiles(); // 注意:是 inteUpload,不是 targetUpload
+
+        // ✅ 7. 刷新
+        this.handleQuery();
+        this.$message.success('干扰方案上传并更新成功');
+
+      } catch (error) {
+        console.error('上传或更新失败:', error);
+        this.$message.error('操作失败:' + (error.message || '请重试'));
+      }
     },
 
     // 提交靶标方案上传
-    submitTargetUpload() {
+    async submitTargetUpload() {
       if (this.targetFileList.length === 0) {
         this.$message.warning('请先选择文件');
         return;
       }
-      // 手动触发上传
-      document.querySelector('.upload-demo [type="file"]').dispatchEvent(
-          new Event('change', { bubbles: true })
-      );
+
+      const formData = new FormData();
+      this.targetFileList.forEach(file => {
+        if (file.raw) {
+          formData.append('files', file.raw);
+        }
+      });
+
+      try {
+        const response = await doUpload(formData);
+        if (response.code !== 0) {
+          this.$message.error(`上传失败: ${response.msg || '未知错误'}`);
+          return;
+        }
+
+        // ✅ 1. 构造新文件对象
+        const newFile = {
+          fileName: this.targetFileList[0].name,
+          fileHttp: response.data.fileStoragePath,
+          fileType: response.data.suffix,
+          type: 2 // 靶标方案
+        };
+
+        // ✅ 2. 解析已有数据
+        const existingList = this.parseSchemeSubPlan();
+
+        // ✅ 3. 合并
+        const mergedList = this.mergeSchemeSubPlan(existingList, newFile);
+
+        // ✅ 4. 转为 JSON 字符串
+        const fileJson = JSON.stringify(mergedList);
+
+        // ✅ 5. 更新靶标方案
+        await planningSchemeUpdateTarget({
+          id: this.selectPlan.id,
+          schemeSubPlan: fileJson
+        });
+
+        // ✅ 6. 成功后清空
+        this.showTargetUpload = false;
+        this.targetFileList = [];
+        this.$refs.targetUpload?.clearFiles();
+
+        // ✅ 7. 刷新
+        this.handleQuery();
+        this.$message.success('靶标方案上传并更新成功');
+
+      } catch (error) {
+        console.error('上传或更新失败:', error);
+        this.$message.error('操作失败:' + (error.message || '请重试'));
+      }
     },
 
     handleClose(done) {
@@ -334,9 +532,11 @@ export default {
       // 根据不同类型和状态判断显示上传还是跳转
       if (val.type === "inte" && plan.interferenceSchemeStatus === '未导入') {
         console.log("干扰方案未导入,显示上传组件")
+        this.selectPlan = plan;
         this.showInteUpload = true;
       } else if (val.type === "target" && plan.targetSchemeStatus === '未导入') {
         console.log("靶标方案未导入,显示上传组件")
+        this.selectPlan = plan;
         this.showTargetUpload = true;
       } else if (val.type === "meas") {
         this.$router.push({path: "/childPlan/measPlan", query: {val, plan}})