Ver Fonte

Merge remote-tracking branch 'origin/master'

zhaoen há 4 meses atrás
pai
commit
e72d5846df

+ 22 - 1
src/api/taskMage/taskMage.js

@@ -44,9 +44,22 @@ export function taskUpdate(data) {
   });
 }
 
+export function subTaskUpdate(data) {
+  return request({
+    url: "/api/v1/test-task/update-sub-task",
+    method: "post",
+    data,
+  });
+}
 
+export function missileList(params){
+  return request({
+    url: "/api/v1/test-task/missile-list",
+    method: "get",
+    params,
+  });
+}
 export function findPageTask(params){
-
   return request({
     url: "/api/v1/test-task/findPage",
     method: "get",
@@ -54,6 +67,14 @@ export function findPageTask(params){
   });
 }
 
+export function findSubTaskPage(params){
+  return request({
+    url: "/api/v1/test-task/findSubTaskPage",
+    method: "get",
+    params,
+  });
+}
+
 export function getTask(params){
   return request({
     url: "/api/v1/test-task/get",

+ 14 - 0
src/router/index.js

@@ -232,6 +232,20 @@ export const constantRoutes = [
     component: () => import("@/views/planningSchem/childsPlan/linkToPage/measPlan.vue"),
     hidden: false,
   },
+  /*方案筹划--关联任务*/
+  {
+    path: "/childPlans/associationTask",
+    name: "associationTask",
+    component: () => import("@/views/planningSchem/comprehensive/components/associationTask.vue"),
+    hidden: false,
+  },
+  /*试验任务创建-子任务*/
+  {
+    path: "/childsTask/index",
+    name: "childsTask",
+    component: () => import("@/views/planAndDeduction/childsTask/index.vue"),
+    hidden: false,
+  },
 ];
 
 

+ 382 - 0
src/views/planAndDeduction/childsTask/components/childTaskCard.vue

@@ -0,0 +1,382 @@
+<template>
+  <el-card shadow="hover" class="p-0">
+    <template #header>
+      <div class="plan-header">
+        <!--        <div class="plan-secret-tag" :style="secretTagStyle">
+          {{ plan.secretLevel }}
+        </div>-->
+        <div></div>
+        <el-tooltip
+            :content="`${plan.subTaskName}-${plan.subTaskType}`"
+            placement="top"
+            :disabled="!isPlanNameOverflow"
+        >
+          <h3 ref="planNameRef" class="plan-name" style="color: #e0e6ed">
+            {{ `${plan.subTaskName}-${plan.subTaskType}` }}
+          </h3>
+        </el-tooltip>
+      </div>
+    </template>
+
+    <div class="plan-content">
+      <div class="plan-main-info">
+        <div class="info-row">
+          <span class="info-label dark-label">方案名称:</span>
+          <el-tooltip
+              :content="plan.subTaskName"
+              placement="top"
+              :disabled="!isTaskNameOverflow"
+          >
+            <span ref="taskNameRef" class="info-value dark-value text-ellipsis">
+              {{ plan.subTaskName || "-" }}
+            </span>
+          </el-tooltip>
+        </div>
+        <div class="info-row">
+          <span class="info-label dark-label">任务类型:</span>
+          <el-tooltip
+              :content="plan.subTaskType"
+              placement="top"
+              :disabled="!isTaskTypeOverflow"
+          >
+            <span ref="taskNameRef" class="info-value dark-value text-ellipsis">
+              {{ $getDictNameByValue('task_type', plan.subTaskType) || "-" }}
+            </span>
+          </el-tooltip>
+        </div>
+        <div class="info-row">
+          <span class="info-label dark-label">任务代号:</span>
+          <el-tooltip
+              :content="plan.subTaskCode"
+              placement="top"
+              :disabled="!isTaskCodeOverflow"
+          >
+            <span ref="taskCodeRef" class="info-value dark-value text-ellipsis">
+              {{ plan.subTaskCode || "-" }}
+            </span>
+          </el-tooltip>
+        </div>
+        <div class="info-row">
+          <span class="info-label dark-label">任务时间:</span>
+          <el-tooltip
+              :content="plan.subTestTime"
+              placement="top"
+              :disabled="!isEndTimeOverflow"
+          >
+            <span ref="endTimeRef" class="info-value dark-value text-ellipsis">
+              {{ plan.subTestTime || "-" }}
+            </span>
+          </el-tooltip>
+        </div>
+        <div class="info-row">
+          <span class="info-label dark-label">打击维度:</span>
+          <el-tooltip
+              :content="plan.fightAway"
+              placement="top"
+              :disabled="!isFightAwayOverflow"
+          >
+            <span ref="fightAway" class="info-value dark-value text-ellipsis">
+              {{ plan.fightAway || "对陆" }}
+            </span>
+          </el-tooltip>
+        </div>
+      </div>
+
+      <div class="plan-additional-info">
+        <div class="info-row">
+          <span class="info-label dark-label">处理状态:</span>
+          <el-tag :type="compileStatusTagType" effect="dark" class="info-value">
+            {{ plan.applyStatus }}
+          </el-tag>
+        </div>
+
+        <div class="info-row">
+          <span class="info-label dark-label">创建时间:</span>
+          <el-tooltip
+              :content="plan.createTime"
+              placement="top"
+              :disabled="!isSecretYearsOverflow"
+          >
+            <span
+                ref="secretYearsRef"
+                class="info-value dark-value text-ellipsis"
+            >
+              {{ plan.createTime || "-" }}
+            </span>
+          </el-tooltip>
+        </div>
+      </div>
+    </div>
+
+    <div class="plan-actions">
+      <el-button icon="el-icon-view" type="success" @click="viewDetail">
+        详情
+      </el-button>
+      <el-button icon="el-icon-edit" @click="editPlan">编辑</el-button>
+    </div>
+  </el-card>
+</template>
+
+<script>
+export default {
+  name: "childTaskCard",
+  props: {
+    plan: {
+      type: Object,
+      required: true,
+      default: () => ({
+        id: "",
+        taskTime: "",
+        planName: "",
+        taskType: "",
+        taskName: "",
+        taskCode: "",
+        startTime: "",
+        endTime: "",
+        compileStatus: "",
+        fightAway: "",
+      }),
+    },
+  },
+  data() {
+    return {
+      isPlanNameOverflow: false, //任务名称
+      isTaskNameOverflow: false, //任务名称
+      isTaskTypeOverflow: false, //任务类型
+      isTaskCodeOverflow: false,
+      isTimeRangeOverflow: false,
+      isSecretYearsOverflow: false,
+      isStartTimeOverflow: false,
+      isEndTimeOverflow: false,
+      isFightAwayOverflow: false,
+    };
+  },
+  computed: {
+    cardClass() {
+      return {
+        "top-secret": this.plan.secretLevel === "绝密",
+        secret: this.plan.secretLevel === "秘密",
+        confidential: this.plan.secretLevel === "机密",
+        invalid: this.plan.status === "已失效",
+      };
+    },
+    secretTagStyle() {
+      const colors = {
+        绝密: "#c45656",
+        机密: "#b88230",
+        秘密: "#3475b5",
+      };
+      return {
+        backgroundColor: colors[this.plan.secretLevel] || "#6b7280",
+      };
+    },
+    statusTagType() {
+      const statusMap = {
+        已确认: "success",
+        未确认: "warning",
+        已失效: "danger",
+        草稿: "info",
+      };
+      return statusMap["warring"] || "info";
+    },
+    compileStatusTagType() {
+      const statusMap = {
+        定稿: "success",
+        暂存: "warning",
+      };
+      return statusMap[this.plan.subTaskStatus] || "info";
+    },
+  },
+  mounted() {
+    this.checkOverflows();
+  },
+  updated() {
+    this.checkOverflows();
+  },
+  methods: {
+    checkOverflows() {
+      this.isStartTimeOverflow = this.checkElementOverflow(
+          this.$refs.startTimeRef
+      );
+      this.isEndTimeOverflow = this.checkElementOverflow(
+          this.$refs.endTimeRef
+      );
+      this.isFightAwayOverflow = this.checkElementOverflow(
+          this.$refs.fightAway
+      );
+
+      this.isPlanNameOverflow = this.checkElementOverflow(
+          this.$refs.planNameRef
+      );
+      this.isTaskNameOverflow = this.checkElementOverflow(
+          this.$refs.taskNameRef
+      );
+      this.isTaskCodeOverflow = this.checkElementOverflow(
+          this.$refs.taskCodeRef
+      );
+      this.isTimeRangeOverflow = this.checkElementOverflow(
+          this.$refs.timeRangeRef
+      );
+      this.isSecretYearsOverflow = this.checkElementOverflow(
+          this.$refs.secretYearsRef
+      );
+    },
+    checkElementOverflow(element) {
+      return element ? element.scrollWidth > element.clientWidth : false;
+    },
+    selectPlan() {
+      this.$emit("select", this.plan);
+    },
+    editPlan() {
+      this.$emit("edit", this.plan);
+    },
+    viewDetail() {
+      this.$emit("view-detail", this.plan);
+    },
+  },
+};
+</script>
+
+<style scoped>
+::v-deep .el-card__header {
+  background-color: #123e7f;
+}
+
+.target-plan-card {
+  margin-bottom: 15px;
+  transition: all 0.3s ease;
+  border-radius: 4px;
+  border: 1px solid #425163;
+  display: flex;
+  flex-direction: column;
+}
+
+.target-plan-card:hover {
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);
+}
+
+.plan-header {
+  display: flex;
+  align-items: center;
+//margin-bottom: 12px;
+}
+
+.plan-secret-tag {
+  padding: 2px 8px;
+  border-radius: 4px;
+  color: white;
+  font-size: 12px;
+  margin-right: 8px;
+}
+
+.plan-name {
+  flex: 1;
+  margin: 0;
+  font-size: 18px;
+  font-weight: bold;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  text-align: center;
+  /*max-width: 180px*/
+}
+
+.plan-status {
+  /*margin-left: 8px;*/
+  float: right;
+}
+
+.plan-content {
+  padding: 14px 16px;
+  flex: 1;
+}
+
+.plan-main-info {
+  margin-bottom: 10px;
+}
+
+.plan-additional-info {
+  padding-top: 10px;
+  border-top: 1px dashed #425163;
+}
+
+.info-row {
+  display: flex;
+  margin-bottom: 8px;
+  font-size: 16px;
+  align-items: center;
+}
+
+.dark-label {
+  color: #8796ad;
+  width: 70px;
+  display: inline-block;
+  flex-shrink: 0;
+}
+
+.dark-value {
+  color: #e0e6ed;
+  flex: 1;
+}
+
+.text-ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  display: inline-block;
+  max-width: 100%;
+}
+
+.plan-actions {
+  display: flex;
+  justify-content: space-between;
+  padding: 14px 16px;
+  border-top: 1px solid #425163;
+}
+
+.dark-button {
+  background-color: #425163;
+  border-color: #5a6b7d;
+  color: #e0e6ed;
+}
+
+.dark-button:hover {
+  background-color: #5a6b7d;
+  border-color: #677a8c;
+  color: #ffffff;
+}
+
+/* 不同秘级的边框颜色 */
+.top-secret {
+  border-top: 3px solid #c45656;
+}
+
+.secret {
+  border-top: 3px solid #3475b5;
+}
+
+.confidential {
+  border-top: 3px solid #b88230;
+}
+
+/* 失效状态的样式 */
+.invalid {
+  opacity: 0.7;
+  position: relative;
+}
+
+.invalid::after {
+  content: "已失效";
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%) rotate(-15deg);
+  font-size: 24px;
+  font-weight: bold;
+  color: #f56c6c;
+  background-color: rgba(0, 0, 0, 0.7);
+  padding: 5px 15px;
+  border-radius: 4px;
+  z-index: 1;
+}
+</style>

+ 821 - 5
src/views/planAndDeduction/childsTask/index.vue

@@ -1,13 +1,829 @@
-<script setup>
+<template>
+  <div>
+    <DarkLayout :query-form="queryForm">
+      <!-- 查询表单插槽 -->
+      <template #query-form>
+        <el-form-item label="方案名称">
+          <el-input
+              v-model="queryForm.name"
+              clearable
+              placeholder="请输入任务名称"
+          />
+        </el-form-item>
+        <el-form-item label="任务类型">
+          <vab-dict-select placeholder="请选择任务类型" v-model="queryForm.taskType" clearable dict-code="task_type" />
+        </el-form-item>
+        <el-form-item label="创建时间">
+          <el-date-picker
+              v-model="queryForm.taskTime"
+              format="yyyy-MM-dd"
+              placeholder="选择试验时间"
+              range-separator="至"
+              type="datetimerange"
+              value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+      </template>
 
-</script>
+      <!-- Header右侧操作按钮 -->
+      <template #header-actions>
+        <el-button icon="el-icon-search" type="primary" @click="handleQuery">
+          查询
+        </el-button>
+        <el-button
+            class="blue-btn"
+            icon="el-icon-plus" @click="showParseMethodModal"
+        > 添加
+        </el-button>
+      </template>
 
-<template>
-<h1>子任务
+      <!-- 主要内容:任务卡片 -->
+      <template #main>
+        <childTaskCard
+            v-for="plan in planList"
+            v-if="planList.length > 0"
+            :key="plan.id"
+            :plan="plan"
+            @edit="handleEdit"
+            @select="handleSelect"
+            @view-detail="viewDetails"
+        />
+        <el-empty v-else description="暂无方案数据"/>
+      </template>
+
+      <!-- 底部右侧分页 -->
+      <template #footer-actions>
+        <el-pagination
+            :current-page="pagination.currentPage"
+            :page-size="pagination.pageSize"
+            :page-sizes="[10, 20, 50, 100]"
+            :total="pagination.total"
+            layout="total, sizes, prev, pager, next, jumper"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+        />
+      </template>
+    </DarkLayout>
+
+    <!-- 1. 任务详情抽屉(原功能保留) -->
+    <el-drawer
+        :before-close="handleClose"
+        :visible.sync="dialogVisible"
+        :title="showTaskTable ? '任务列表' : (isEditing ? '任务编辑' : '任务详情')"
+        size="70%"
+    >
+      <!-- 任务表格(默认显示) -->
+      <div v-if="showTaskTable" >
+        <el-table
+            :data="taskTableData"
+            style="width: 100%"
+        >
+          <el-table-column
+              label="任务名称"
+              prop="taskName"
+              align="center"
+          />
+          <el-table-column
+              label="发射方式"
+              prop="launchMethod"
+              align="center"
+          />
+          <el-table-column
+              label="发射平台"
+              prop="firePlatform"
+              align="center"
+          />
+          <el-table-column
+              label="攻击靶标"
+              prop="target"
+              align="center"
+          />
+          <el-table-column
+              label="发射时刻"
+              prop="launchTime"
+              align="center"
+          />
+          <el-table-column
+              label="操作"
+              align="center"
+              width="180"
+          >
+            <template #default="scope">
+              <el-button
+                  type="text"
+                  size="small"
+                  @click="handleTaskDetail(scope.row)"
+                  style="color: #409EFF"
+              >
+                详情
+              </el-button>
+              <el-button
+                  type="text"
+                  size="small"
+                  @click="handleTaskEdit(scope.row)"
+                  style="color: #67C23A"
+              >
+                编辑
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <!-- 任务表单(详情/编辑模式) -->
+      <div v-else class="task-form-container">
+        <el-form
+            :model="taskForm"
+            label-width="120px"
+            size="small"
+            :disabled="!isEditing"
+        >
+          <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>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="任务代号">
+                <el-input
+                    style="width: 100%"
+                    v-model="taskForm.code"
+                    placeholder="请输入任务代号"
+                />
+              </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>
+            </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>
+            </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-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-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="导弹类型二">
+                <el-input
+                    style="width: 100%"
+                    v-model="taskForm.missileTypeTwo"
+                    placeholder="请输入导弹类型"
+                />
+              </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-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>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="发射平台">
+                <el-input v-model="taskForm.firePlatform"></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>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="靶区">
+                <el-input
+                    v-model="taskForm.targetArea"
+                    placeholder="请输入靶区"
+                />
+              </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>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="湿度">
+                <el-input
+                    v-model="taskForm.humidity"
+                    placeholder="请输入湿度"
+                />
+              </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>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="降雨强度">
+                <el-input
+                    v-model="taskForm.precipitation"
+                    placeholder="请输入降雨强度"
+                />
+              </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>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="海况">
+                <el-input
+                    v-model="taskForm.seaStatus"
+                    placeholder="请输入海况"
+                />
+              </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>
+
+      <!-- 抽屉底部按钮 -->
+      <div class="drawer-footer">
+        <!-- 表格模式:只显示关闭按钮 -->
+        <el-button
+            v-if="showTaskTable"
+            @click="dialogVisible = false"
+        >
+          关闭
+        </el-button>
+
+        <!-- 表单模式:显示取消/保存按钮(编辑模式)或取消按钮(详情模式) -->
+        <template v-else>
+          <el-button @click="handleFormCancel">取消</el-button>
+          <el-button
+              type="primary"
+              @click="handleFormSave"
+              v-if="isEditing"
+              style="margin-left: 10px"
+          >
+            保存
+          </el-button>
+        </template>
+      </div>
+    </el-drawer>
+
+    <!-- 2. 卡片编辑弹窗(新增核心功能) -->
+    <el-dialog
+        title="修改任务卡片"
+        :visible.sync="editDialogVisible"
+        width="50%"
+        :before-close="handleEditClose"
+        destroy-on-close
+    >
+      <!-- 编辑表单 + 规则校验 -->
+      <el-form
+          ref="editFormRef"
+          :model="editForm"
+          :rules="editFormRules"
+          label-width="120px"
+          size="small"
+          class="edit-form"
+      >
+        <!-- 任务名称(必填) -->
+        <el-form-item label="任务名称" prop="subTaskName">
+          <el-input
+              v-model="editForm.subTaskName"
+              clearable
+              placeholder="请输入任务名称"
+              maxLength="50"
+          />
+        </el-form-item>
+
+        <!-- 任务类型(必填) -->
+        <el-form-item label="任务类型" prop="subTaskType">
+          <vab-dict-select placeholder="请选择任务类型" v-model="editForm.subTaskType" clearable dict-code="task_type" />
+        </el-form-item>
+
+        <!-- 任务时间范围(必填) -->
+        <el-form-item label="任务时间" prop="subTestTime">
+          <el-date-picker
+              v-model="editForm.subTestTime"
+              format="yyyy-MM"
+              placeholder="选择任务时间范围"
+              range-separator="至"
+              type="monthrange"
+              value-format="yyyy-MM"
+              style="width: 100%"
+          />
+        </el-form-item>
+
+        <!-- 任务状态(必填) -->
+        <el-form-item label="任务状态" prop="applyStatus">
+          <el-select
+              v-model="editForm.applyStatus"
+              placeholder="请选择任务状态"
+          >
+            <el-option label="暂存" value="暂存"></el-option>
+            <el-option label="定稿" value="定稿"></el-option>
+            <el-option label="已确认" value="已确认"></el-option>
+            <el-option label="已完成" value="已完成"></el-option>
+          </el-select>
+        </el-form-item>
 
-</h1>
+        <!-- 任务代号(选填) -->
+        <el-form-item label="任务代号" prop="subTaskCode">
+          <el-input
+              v-model="editForm.subTaskCode"
+              clearable
+              placeholder="请输入任务代号"
+              maxLength="20"
+          />
+        </el-form-item>
+      </el-form>
+
+      <!-- 弹窗底部按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="editDialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleEditSubmit">确认修改</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 3. 解析方式选择弹窗(原功能保留) -->
+    <el-dialog
+        title="选择解析方式"
+        :visible.sync="parseMethodVisible"
+        width="30%"
+        destroy-on-close
+    >
+      <el-radio-group v-model="parseForm.method" style="display: block">
+        <el-radio label="upload">文件上传解析</el-radio>
+        <el-radio label="manual">手动录入</el-radio>
+      </el-radio-group>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="parseMethodVisible = false">取消</el-button>
+        <el-button type="primary" @click="confirmParseMethod">确认</el-button>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
+<script>
+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 VabDictSelect from "@/components/VabDictSelect/VabDictSelect.vue";
+
+export default {
+  components: {
+    VabDictSelect,
+    DarkDialog,
+    DarkLayout,
+    childTaskCard
+  },
+  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"
+      },
+      taskTableData: [],
+      dialogVisible: false,
+      showTaskTable: true,
+      isEditing: false,
+      parseMethodVisible: false,
+      currentPlan: {},
+      currentTask: {},
+      taskId:null,
+      queryForm: {
+        name: '',
+        taskType: '',
+        taskTime: ["2024-06-22", "2024-09-01"],
+      },
+      parseForm: {
+        method: 'upload'
+      },
+      planList: [
+        {
+          id: '1',
+          fightAway: "对陆",
+          status: '已确认',
+          taskCode: 'plan-001',
+          taskTime: "2022年4月至2022年12月", // 原格式:字符串
+          taskName: '侵彻爆破战斗部状态导弹飞行试验',
+          taskType: '性能鉴定试验',
+          taskStartTime: '2023-06-15',
+          taskEndTime: '2023-06-20',
+          taskStatus: '定稿',
+          createTime: "2023-01-01",
+          tasks: [{
+            taskName: '任务1',
+            launchMethod: '直接发射',
+            firePlatform: '851舰',
+            target: 'A靶标',
+            launchTime: '2023-06-15 08:00',
+            formId: 'task-001'
+          },]
+        },
+        {
+          id: '2',
+          fightAway: "对陆",
+          status: '已确认',
+          taskCode: 'plan-002',
+          taskTime: "2022年4月至2022年11月",
+          taskName: '反跑道子母战斗部状态导弹发射飞行试验',
+          taskType: '性能鉴定试验',
+          taskStartTime: '2023-07-10',
+          taskEndTime: '2023-07-15',
+          taskStatus: '暂存',
+          createTime: "2023-01-01",
+          tasks: [
+            {
+              taskName: '任务1',
+              launchMethod: '直接发射',
+              firePlatform: '851舰',
+              target: 'A靶标',
+              launchTime: '2023-06-15 08:00',
+              formId: 'task-001'
+            },
+            {
+              taskName: '任务2',
+              launchMethod: '间接发射',
+              firePlatform: '851舰',
+              target: 'B靶标',
+              launchTime: '2023-06-16 10:00',
+              formId: 'task-002'
+            }
+          ]
+        },
+      ],
+      pagination: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 2
+      },
+      showAdvancedSearch: false,
+
+      // ---------------------- 新增:卡片编辑相关数据 ----------------------
+      editDialogVisible: false, // 编辑弹窗显示控制
+      editForm: { // 编辑表单数据(与卡片字段对应)
+        id: '', // 卡片ID(用于定位修改项)
+        subTaskName: '', // 任务名称
+        subTaskType: '', // 任务类型
+        subTestTime: [], // 任务时间范围(数组格式,对应日期选择器)
+        applyStatus: '', // 任务状态
+        subTaskCode: '' // 任务代号
+      },
+      // 编辑表单校验规则(核心:必填项、格式校验)
+      editFormRules: {
+        subTaskName: [
+          { required: true, message: '请输入任务名称', trigger: 'blur' },
+          { max: 50, message: '任务名称长度不能超过50个字符', trigger: 'blur' }
+        ],
+        subTaskType: [
+          { required: true, message: '请选择任务类型', trigger: 'change' }
+        ],
+        subTestTime: [
+          { required: true, message: '请选择任务时间范围', trigger: 'change' }
+        ],
+        applyStatus: [
+          { required: true, message: '请选择任务状态', trigger: 'change' }
+        ],
+        subTaskCode: [
+          { max: 20, message: '任务代号长度不能超过20个字符', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  computed: {
+    missileSums() {
+      const num1 = Number(this.taskForm.missileTypeOneNum) || 0;
+      const num2 = Number(this.taskForm.missileTypeTwoNum) || 0;
+      return num1 + num2;
+    }
+  },
+  created() {
+    this.taskId = this.$route.query.id;
+    this.handleQuery();
+  },
+  methods: {
+    // 原方法保持不变...
+    handleClose(done) {
+      this.showTaskTable = true;
+      this.isEditing = false;
+      this.currentTask = {};
+      done();
+    },
+    handleSelect(plan) {
+      this.currentPlan = plan;
+    },
+    showParseMethodModal() {
+      this.parseMethodVisible = true;
+    },
+    confirmParseMethod() {
+      this.parseMethodVisible = false;
+      this.$router.push({ path: '/home/taskCreate' });
+    },
+    async viewDetails(plan) {
+      const res = await missileList({
+        taskId:this.taskId,
+        subTaskId:plan.id
+      })
+      this.currentPlan = plan;
+      this.taskTableData = res.data || [];
+      this.dialogVisible = true;
+      this.showTaskTable = true;
+      this.isEditing = false;
+    },
+    handleTaskDetail(task) {
+      this.currentTask = task;
+      this.setTaskFormData(task.formId);
+      this.showTaskTable = false;
+      this.isEditing = false;
+    },
+    handleTaskEdit(task) {
+      this.currentTask = task;
+      this.setTaskFormData(task.formId);
+      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() {
+      this.$message.success("任务数据保存成功!");
+      this.showTaskTable = true;
+      this.isEditing = false;
+    },
+    async handleQuery() {
+      const params = {
+        subTaskId_EQ:this.taskId,
+        subTaskName_LIKE:this.queryForm.name,
+        subTaskType_EQ:this.queryForm.taskType,
+        pageNo:this.pagination.currentPage,
+        pageSize:this.pagination.pageSize
+      }
+      if (this.queryForm.createTime?.length == 2){
+        params.createTime_BEGIN= this.queryForm.createTime[0];
+        params.createTime_END =this.queryForm.createTime[1];
+      }
+      const res = await findSubTaskPage(params);
+      this.planList = res.data.rows
+      this.pagination.total = res.data.total
+    },
+    resetQuery() {
+      this.queryForm = { name: '', taskType: '', taskTime: ["2024-06-22", "2024-09-01"] };
+      this.handleQuery();
+    },
+    handleSizeChange(val) {
+      this.pagination.pageSize = val;
+      this.fetchData();
+    },
+    handleCurrentChange(val) {
+      this.pagination.currentPage = val;
+      this.fetchData();
+    },
+    fetchData() {
+      console.log("获取第", this.pagination.currentPage, "页数据");
+    },
+
+    // ---------------------- 新增:卡片编辑核心方法 ----------------------
+    /**
+     * 1. 触发编辑:打开弹窗 + 赋值卡片数据
+     * @param {Object} plan - 当前点击的卡片数据
+     */
+    handleEdit(plan) {
+      // 1.1 重置表单(清空校验状态 + 清空数据)
+      this.$nextTick(() => {
+        const editFormRef = this.$refs.editFormRef;
+        if (editFormRef) editFormRef.resetFields();
+      });
+
+      // 1.2 深拷贝卡片数据到编辑表单(避免直接修改原数据)
+      this.editForm = {
+        id: plan.id, // 保存卡片ID,用于后续定位修改
+        subTaskName: plan.subTaskName,
+        subTaskType: plan.subTaskType,
+        applyStatus: plan.applyStatus,
+        subTaskCode: plan.subTaskCode,
+        // 关键:处理时间格式(原数据是字符串“2022年4月至2022年12月” → 转日期数组)
+        subTestTime: this.formatTaskTimeToRange(plan.subTestTime)
+      };
+
+      // 1.3 打开编辑弹窗
+      this.editDialogVisible = true;
+    },
+
+    /**
+     * 2. 时间格式转换:字符串“2022年4月至2022年12月” → 日期数组['2022-04-01', '2022-12-31']
+     * @param {String} timeStr - 原卡片时间字符串
+     * @returns {Array} 日期范围数组
+     */
+    formatTaskTimeToRange(timeStr) {
+      if (!timeStr) return [];
+      // 匹配“年、月”格式(如“2022年4月”)
+      const timeReg = /(\d{4})年(\d{1,2})月/gi;
+      const matches = [...timeStr.matchAll(timeReg)];
+      if (matches.length < 2) return [];
+
+      // 处理开始时间(补“01日”)
+      const startYear = matches[0][1];
+      const startMonth = String(matches[0][2]).padStart(2, '0');
+      const startTime = `${startYear}-${startMonth}-01`;
+
+      // 处理结束时间(补当月最后一天)
+      const endYear = matches[1][1];
+      const endMonth = String(matches[1][2]).padStart(2, '0');
+      const endTime = new Date(endYear, endMonth, 0).toISOString().split('T')[0];
+
+      return [startTime, endTime];
+    },
+
+    /**
+     * 3. 编辑提交:表单校验 + 更新卡片数据
+     */
+    handleEditSubmit() {
+      // 3.1 表单校验
+      this.$refs.editFormRef.validate(async (isValid) => {
+        if (!isValid) return; // 校验失败,终止
+
+        // 3.2 校验成功:处理时间格式(数组 → 原字符串格式)
+        const [startTime, endTime] = this.editForm.subTestTime;
+        const startDate = new Date(startTime);
+        const endDate = new Date(endTime);
+        const taskTimeStr = `${startDate.getFullYear()}年${startDate.getMonth() + 1}月至${endDate.getFullYear()}年${endDate.getMonth() + 1}月`;
+        await subTaskUpdate({
+          id: this.editForm.id,
+          subTaskName: this.editForm.subTaskName,
+          subTaskType: this.editForm.subTaskType,
+          subTestTime: taskTimeStr, // 回显原格式字符串
+          applyStatus: this.editForm.applyStatus,
+          subTaskCode: this.editForm.subTaskCode
+        })
+        this.$message.success("修改成功");
+        this.handleEditClose();
+        this.handleQuery();
+      });
+    },
+
+    /**
+     * 4. 关闭编辑弹窗:重置表单
+     */
+    handleEditClose() {
+      const editFormRef = this.$refs.editFormRef;
+      if (editFormRef) editFormRef.resetFields();
+      this.editDialogVisible = false;
+    }
+  }
+}
+</script>
+
 <style scoped>
 
 </style>
+

+ 186 - 24
src/views/planAndDeduction/taskMage/index.vue

@@ -68,25 +68,171 @@
     </DarkLayout>
 
     <!-- 任务详情弹窗 -->
-    <DarkDialog title="任务详情"
-                :visible.sync="dialogVisible"
-                width="50%"
-                :before-close="handleClose">
-      <el-descriptions :column="2" border>
-        <el-descriptions-item label="任务名称">{{ currentPlan.taskName }}</el-descriptions-item>
-        <el-descriptions-item label="任务名称">{{ currentPlan.taskName }}</el-descriptions-item>
-        <el-descriptions-item label="任务代号">{{ currentPlan.taskCode }}</el-descriptions-item>
-        <el-descriptions-item label="开始时间">{{ currentPlan.taskStartTime }}</el-descriptions-item>
-        <el-descriptions-item label="结束时间">{{ currentPlan.taskEndTime }}</el-descriptions-item>
-        <el-descriptions-item label="处理状态">{{ currentPlan.taskStatus }}</el-descriptions-item>
-        <el-descriptions-item label="密级">{{ currentPlan.secretLevel }}</el-descriptions-item>
-        <el-descriptions-item label="保密期限">{{ currentPlan.confidentialLevelYears }}</el-descriptions-item>
-        <el-descriptions-item label="状态">{{ currentPlan.status }}</el-descriptions-item>
-      </el-descriptions>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="dialogVisible = false">确认</el-button>
-      </span>
-    </DarkDialog>
+    <el-drawer :before-close="handleClose"
+               :visible.sync="dialogVisible"
+               title="任务详情"
+               size="50%">
+      <el-form :model="currentPlan" disabled label-width="120px" size="small">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="任务名称">
+              <el-input style="width: 100%" v-model="currentPlan.taskName" placeholder="请输入任务名称"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="任务代号">
+              <el-input style="width: 100%" v-model="currentPlan.taskCode" placeholder="请输入任务代号"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="任务类型">
+              <vab-dict-select ref="dict" style="width: 100%" placeholder="请选择任务类型" v-model="currentPlan.taskType" clearable dict-code="task_type" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="导弹总数">
+              <el-input type="number" style="width: 100%" v-model="currentPlan.totalNumberOfMissiles" placeholder="请输入导弹总数" readonly/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <template v-for="(item,index) in currentPlan.missileDataJson">
+            <el-col :span="6" >
+              <el-form-item :label="`导弹类型${index+1}`">
+                <el-input style="width: 100%" v-model="item['missile_type']" placeholder="请输入导弹类型"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="导弹数量">
+                <el-input-number :controls="false" style="width: 100%" v-model="item['missile_count']" placeholder="请输入数量"/>
+              </el-form-item>
+            </el-col>
+          </template>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="试验时间">
+              <el-input v-model="currentPlan.testTime" placeholder="请输入任务时间"/>
+              <!--el-date-picker
+                style="width: 100%"
+                v-model="currentPlan.testTime"
+                type="datetimerange"
+                range-separator="至"
+                placeholder="选择试验时间"
+                format="yyyy-MM"
+                value-format="yyyy-MM"
+              />-->
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="发射平台">
+              <el-input v-model="currentPlan.launchPlatform"></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="currentPlan.testArea" placeholder="请输入试验航区"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="靶区">
+              <el-input v-model="currentPlan.targetArea" 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="currentPlan.temperature" placeholder="请输入温度"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="湿度">
+              <el-input v-model="currentPlan.humidity" 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="currentPlan.windVelocity" placeholder="请输入风速"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="降雨强度">
+              <el-input v-model="currentPlan.rainfallIntensity" 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="currentPlan.fightAway"
+                  placeholder="请输入打击维度"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="海况">
+              <el-input v-model="currentPlan.sea" placeholder="请输入海况"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="任务依据">
+          <el-input
+              v-model="currentPlan.missionBasis"
+              type="textarea"
+              :rows="5"
+              placeholder="请输入任务依据"
+          />
+        </el-form-item>
+
+        <el-form-item label="试验目的">
+          <el-input
+              v-model="currentPlan.purposeOfTheTrial"
+              type="textarea"
+              :rows="5"
+              placeholder="请输入试验目的"
+          />
+        </el-form-item>
+
+        <el-form-item label="靶标要求">
+          <el-input
+              v-model="currentPlan.bbRequirements"
+              type="textarea"
+              :rows="6"
+              placeholder="请输入靶标要求"
+          />
+        </el-form-item>
+
+        <el-form-item label="测量要求">
+          <el-input
+              v-model="currentPlan.measurementRequirements"
+              type="textarea"
+              :rows="6"
+              placeholder="请输入测量要求"
+          />
+        </el-form-item>
+
+        <el-form-item label="干扰要求">
+          <el-input
+              v-model="currentPlan.interferenceRequirements"
+              type="textarea"
+              :rows="6"
+              placeholder="请输入干扰要求"
+          />
+        </el-form-item>
+      </el-form>
+      <div class="drawer-footer">
+        <el-button @click="dialogVisible = false">取消</el-button>
+      </div>
+    </el-drawer>
 
     <!-- 解析方式选择弹窗 -->
     <DarkDialog
@@ -121,7 +267,7 @@ import DarkLayout from '@/components/GlobalComponents/DarkLayout.vue'
 import TaskUserCard from '@/components/Components/TaskUserCard.vue'
 import DarkDialog from "@/components/Components/DarkDialog.vue";
 import VabDictSelect from "@/components/VabDictSelect/VabDictSelect.vue";
-import {deleteTask, findPageTask} from "@/api/taskMage/taskMage";
+import {deleteTask, findPageTask, getTask} from "@/api/taskMage/taskMage";
 
 export default {
   components: {
@@ -299,13 +445,29 @@ export default {
       }
 
     },
-    viewDetails(plan) {
-      this.currentPlan = plan;
+    async viewDetails(plan) {
+      await this.getCurrentPlan(plan.id)
       this.dialogVisible = true;
     },
+
+    async getCurrentPlan(id){
+      const res = await getTask({id:id})
+      this.currentPlan = res.data;
+      if (this.currentPlan.missileDataJson){
+        const list = JSON.parse(this.currentPlan.missileDataJson);
+        this.currentPlan.missileDataJson = []
+        for (const item of list){
+          this.currentPlan.missileDataJson.push({
+            ...item
+          })
+        }
+      }
+    },
     //查看子任务
-    viewChildsDetails(){
-      console.log("查看子任务")
+    viewChildsDetails(plan){
+      this.$router.push({name: 'childsTask',query:{
+        id:plan.id
+        }})
     },
     async handleQuery() {
       const params = {

+ 9 - 1
src/views/planAndDeduction/taskMage/taskMage.vue

@@ -117,7 +117,15 @@
             </el-col>
           </el-row>
           <el-row :gutter="20">
-            <el-col :span="24">
+            <el-col :span="12">
+              <el-form-item label="打击维度">
+                <el-input
+                    v-model="taskForm.fightAway"
+                    placeholder="请输入打击维度"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
               <el-form-item label="海况">
                 <el-input v-model="taskForm.sea" placeholder="请输入海况"></el-input>
               </el-form-item>

+ 166 - 0
src/views/planningSchem/comprehensive/components/associationTask.vue

@@ -0,0 +1,166 @@
+<template>
+  <div class="create-plan-page bg-gray-900 text-white min-h-screen p-6">
+    <div class="flex justify-between items-center mb-8">
+      <h1 class="text-2xl font-bold">选择试验任务</h1>
+      <el-button class="blue-btn" @click="back">返回主界面</el-button>
+    </div>
+
+    <div class="min-h-[400px] transition-all duration-300 ease-in-out">
+      <!-- 仅保留步骤一内容:选择试验任务 -->
+      <div class="animate-fadeIn space-y-6">
+        <!-- 选择试验任务区域 -->
+        <el-card class="bg-gray-800 border-none mb-8">
+          <div class="flex items-center mb-2">
+            <i class="el-icon-document mr-3 text-blue-400"></i>
+            <h2 class="text-xl font-bold">选择试验任务</h2>
+          </div>
+          <el-divider></el-divider>
+          <p class="text-gray-400 mb-6">
+            请选择要创建筹划方案的试验任务,系统将根据任务要求自动推荐相应的方案类型
+          </p>
+
+          <el-row :gutter="20">
+            <el-col :span="8" v-for="(task, index) in taskList" :key="index">
+              <el-card
+                  :class="`bg-gray-800 border-4 border-gray-700 rounded-md transition-all duration-300 ${selectedTask && selectedTask.name === task.name ? 'border-blue-500 shadow-lg transform scale-[1.02]' : ''}`"
+              >
+                <div class="flex justify-between items-start mb-3">
+                  <h3 class="text-lg font-bold">{{ task.name }}</h3>
+                  <el-tag
+                      :type="getTagType(task.status)"
+                      size="mini"
+                  >
+                    {{ task.statusText }}
+                  </el-tag>
+                </div>
+                <ul class="text-gray-400 space-y-2 mb-4">
+                  <li>任务代号: {{ task.code }}</li>
+                  <li>开始时间: {{ task.startTime }}</li>
+                  <li>结束时间: {{ task.endTime }}</li>
+                  <li>任务类型: {{ task.type }}</li>
+                </ul>
+                <el-button @click="handleTaskSelect(task)" class="blue-btn w-full text-lg">选择此任务</el-button>
+              </el-card>
+            </el-col>
+          </el-row>
+        </el-card>
+      </div>
+    </div>
+
+    <!-- 底部按钮 -->
+    <div class="flex justify-center gap-4 mt-8">
+      <el-button class="blue-btn" @click="back">返回</el-button>
+      <el-button
+          class="blue-btn"
+          @click="confirmSelection"
+          :disabled="!selectedTask"
+      >
+        确认选择
+      </el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      selectedTask: null,
+      taskList: [
+        {
+          name: '新型DB打击试验',
+          status: 'creatable',
+          statusText: '正式任务',
+          code: 'TASK-2023-001',
+          startTime: '2023-01-01',
+          endTime: '2023-12-31',
+          type: 'DB试验'
+        },
+        {
+          name: '电子对抗演练',
+          status: 'creatable',
+          statusText: '正式任务',
+          code: 'TASK-2023-002',
+          startTime: '2023-02-01',
+          endTime: '2023-11-30',
+          type: '电子对抗'
+        },
+        {
+          name: '综合试验验证',
+          status: 'inProgress',
+          statusText: '日常任务',
+          code: 'TASK-2023-003',
+          startTime: '2023-03-01',
+          endTime: '2023-10-31',
+          type: '综合验证'
+        }
+      ]
+    };
+  },
+  methods: {
+    handleTaskSelect(task) {
+      this.selectedTask = task;
+    },
+    getTagType(status) {
+      if (status === 'creatable') return 'success';
+      else if (status === 'inProgress') return 'warning';
+      return 'info';
+    },
+    back() {
+      this.$router.push({path: '/scheme/comprehensive'});
+    },
+    confirmSelection() {
+      // 处理选中任务后的逻辑
+      this.$message.success(`已选择任务: ${this.selectedTask.name}`);
+      // 可以在这里添加跳转或其他处理逻辑
+    }
+  }
+};
+</script>
+
+<style scoped>
+.el-card__header {
+  background-color: transparent !important;
+  border-bottom: none !important;
+}
+
+.el-card__body {
+  background-color: transparent !important;
+  padding: 20px !important;
+}
+
+/* 标签样式 */
+.el-tag--success {
+  background-color: rgba(103, 194, 58, 0.2) !important;
+  border-color: #67c23a !important;
+  color: #67c23a !important;
+}
+
+.el-tag--warning {
+  background-color: rgba(245, 159, 0, 0.2) !important;
+  border-color: #f59f00 !important;
+  color: #f59f00 !important;
+}
+
+.el-tag--info {
+  background-color: rgba(144, 195, 255, 0.2) !important;
+  border-color: #90c3ff !important;
+  color: #90c3ff !important;
+}
+
+/* 动画效果 */
+.animate-fadeIn {
+  animation: fadeIn 0.5s ease-in-out;
+}
+
+@keyframes fadeIn {
+  from {
+    opacity: 0;
+    transform: translateY(10px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+</style>

+ 159 - 28
src/views/planningSchem/comprehensive/index.vue

@@ -30,12 +30,12 @@
       <template #main>
         <OverallCard
           v-if="plans.length > 0"
-          v-for="plan in plans"
+          v-for="plan in planss"
           :key="plan.id"
           :plan="plan"
           @view-detail="handleViewDetail"
           @export-plan="handleExportPlan"
-          @link-to="linkTo"
+          @link-to="(val) => linkTo(val, plan)"
         />
         <el-empty v-else description="暂无方案数据" />
       </template>
@@ -54,6 +54,58 @@
       </template>
 
     </DarkLayout>
+
+    <!-- 干扰方案上传弹窗 -->
+    <DarkDialog
+        :visible.sync="showInteUpload"
+        title="上传干扰方案"
+        width="50%">
+      <el-upload
+          class="upload-demo"
+          action="/api/upload/inte"
+          :on-success="handleInteUploadSuccess"
+          :on-error="handleUploadError"
+          :file-list="inteFileList"
+          accept=".doc,.docx,.pdf,.xlsx,.xls"
+          :auto-upload="false">
+        <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
+        <el-button style="margin-left: 10px;" size="small" type="success" @click="submitInteUpload">
+          上传到服务器
+        </el-button>
+        <div slot="tip" class="el-upload__tip">
+          只能上传doc、docx、pdf、xlsx、xls格式的文件
+        </div>
+      </el-upload>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="showInteUpload = false">取消</el-button>
+      </span>
+    </DarkDialog>
+
+    <!-- 靶标方案上传弹窗 -->
+    <DarkDialog
+        :visible.sync="showTargetUpload"
+        title="上传靶标方案"
+        width="50%">
+      <el-upload
+          class="upload-demo"
+          action="/api/upload/target"
+          :on-success="handleTargetUploadSuccess"
+          :on-error="handleUploadError"
+          :file-list="targetFileList"
+          accept=".doc,.docx,.pdf,.xlsx,.xls"
+          :auto-upload="false">
+        <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
+        <el-button style="margin-left: 10px;" size="small" type="success" @click="submitTargetUpload">
+          上传到服务器
+        </el-button>
+        <div slot="tip" class="el-upload__tip">
+          只能上传doc、docx、pdf、xlsx、xls格式的文件
+        </div>
+      </el-upload>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="showTargetUpload = false">取消</el-button>
+      </span>
+    </DarkDialog>
     <!-- 任务详情弹窗 -->
     <DarkDialog title="任务详情"
                 :visible.sync="dialogVisible"
@@ -81,6 +133,7 @@ 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 {exportSolutionToWord} from "@/views/planningSchem/comprehensive/wordExporter";
 
 export default {
   components: {
@@ -108,71 +161,77 @@ export default {
         taskName: '',
         taskCode: ''
       },
-      plans: [
+      plans:[],
+      planss: [
         {
           id: '1',
+          fightAway:"对陆",
           planName: '新型导弹打击试验',
           taskName: '新型导弹打击试验',
           taskCode: 'TASK-2023-001',
           startTime: '2023-01-01',
           endTime: '2023-12-31',
           status: '有效',
-          interferenceSchemeStatus: '已编制',
+          interferenceSchemeStatus: '已导入',
           measurementSchemeStatus: '已编制',
-          targetSchemeStatus: '已编制',
+          targetSchemeStatus: '已导入',
           version: 'V1.0.0'
         },
         {
           id: '2',
+          fightAway:"对陆",
           planName: '电子对抗演练',
           taskName: '电子对抗演练',
           taskCode: 'TASK-2023-002',
           startTime: '2023-02-01',
           endTime: '2023-11-30',
           status: '待审核',
-          interferenceSchemeStatus: '已编制',
+          interferenceSchemeStatus: '已导入',
           measurementSchemeStatus: '已编制',
-          targetSchemeStatus: '编制中',
+          targetSchemeStatus: '未导入',
           version: 'V1.1.0'
         },
         {
-          id: '3',
+          id: '4',
+          fightAway:"对陆",
           planName: '电子对抗演练',
           taskName: '电子对抗演练',
           taskCode: 'TASK-2023-003',
           startTime: '2023-03-01',
           endTime: '2023-10-31',
           status: '草稿',
-          interferenceSchemeStatus: '未编制',
-          measurementSchemeStatus: '编制',
-          targetSchemeStatus: '未编制',
+          interferenceSchemeStatus: '未导入',
+          measurementSchemeStatus: '编制',
+          targetSchemeStatus: '未导入',
           version: 'V0.9.0'
         },
 
         {
           id: '3',
+          fightAway:"对陆",
           planName: '新型导弹打击试验',
           taskName: '新型导弹打击试验',
           taskCode: 'TASK-2023-003',
           startTime: '2023-03-01',
           endTime: '2023-10-31',
           status: '草稿',
-          interferenceSchemeStatus: '未编制',
-          measurementSchemeStatus: '编制',
-          targetSchemeStatus: '未编制',
+          interferenceSchemeStatus: '已导入',
+          measurementSchemeStatus: '编制',
+          targetSchemeStatus: '未导入',
           version: 'V0.9.0'
         },
         {
-          id: '1',
+          id: '9',
+          fightAway:"对陆",
           planName: '电子对抗演练',
           taskName: '电子对抗演练',
           taskCode: 'TASK-2023-001',
           startTime: '2023-01-01',
           endTime: '2023-12-31',
           status: '有效',
-          interferenceSchemeStatus: '已编制',
+          interferenceSchemeStatus: '已导入',
           measurementSchemeStatus: '已编制',
-          targetSchemeStatus: '已编制',
+          targetSchemeStatus: '未导入',
           version: 'V1.0.0'
         },
       ],
@@ -181,17 +240,81 @@ export default {
         pageSize: 10,
         total: 0
       },
-      showAdvancedSearch: false
+      showAdvancedSearch: false,
+      showInteUpload: false,    // 干扰方案上传弹窗
+      showTargetUpload: false,  // 靶标方案上传弹窗
+      inteFileList: [],         // 干扰方案文件列表
+      targetFileList: []        // 靶标方案文件列表
     }
   },
   mounted() {
     this.handleQuery();
   },
   methods: {
+
+    // 页面导航方法
+    navigateTo(type, isOk) {
+      if (type === "inte") {
+        console.log("跳转至干扰方案", {isOk})
+        this.$router.push({path: "/childPlan/intePlan", query: {isOk}})
+      } else if (type === "target") {
+        this.$router.push({path: "/childPlan/targetPlan", query: {isOk}})
+      }
+    },
+
+    // 干扰方案上传成功处理
+    handleInteUploadSuccess(response, file, fileList) {
+      this.$message.success('干扰方案上传成功');
+      this.showInteUpload = false;
+      this.inteFileList = [];
+      // 上传成功后可以刷新数据
+      this.fetchData();
+    },
+
+
+
+    // 靶标方案上传成功处理
+    handleTargetUploadSuccess(response, file, fileList) {
+      this.$message.success('靶标方案上传成功');
+      this.showTargetUpload = false;
+      this.targetFileList = [];
+      // 上传成功后可以刷新数据
+      this.fetchData();
+    },
+
+    // 上传失败处理
+    handleUploadError(err, file, fileList) {
+      this.$message.error('文件上传失败,请重试');
+    },
+
+    // 提交干扰方案上传
+    submitInteUpload() {
+      if (this.inteFileList.length === 0) {
+        this.$message.warning('请先选择文件');
+        return;
+      }
+      // 手动触发上传
+      document.querySelector('.upload-demo [type="file"]').dispatchEvent(
+          new Event('change', { bubbles: true })
+      );
+    },
+
+    // 提交靶标方案上传
+    submitTargetUpload() {
+      if (this.targetFileList.length === 0) {
+        this.$message.warning('请先选择文件');
+        return;
+      }
+      // 手动触发上传
+      document.querySelector('.upload-demo [type="file"]').dispatchEvent(
+          new Event('change', { bubbles: true })
+      );
+    },
+
     handleClose(done) {
-      // 可以在这里添加关闭前的确认逻辑
-      done()
+      done();
     },
+
     handleViewDetail(plan) {
       this.$router.push({ path: '/planningSchem/overallPlanDesign',query:{batchId:plan.batchId} })
     },
@@ -205,16 +328,24 @@ export default {
       }
       // this.$message.success("导出成功!")
     },
-    linkTo(val) {
-      console.log(val)
-      if (val.type === "inte") {
-        this.$router.push({path: "/childPlan/intePlan",query:{isOk:val.isOk}},)
-      } else if (val.type === "target") {
-        this.$router.push({path: "/childPlan/targetPlan",query:{isOk:val.isOk}})
+    // 子方案跳转,增加plan参数用于获取方案状态
+    linkTo(val, plan) {
+      console.log('linkTo参数:', val, '方案状态:', plan)
+      // 根据不同类型和状态判断显示上传还是跳转
+      if (val.type === "inte" && plan.interferenceSchemeStatus === '未导入') {
+        console.log("干扰方案未导入,显示上传组件")
+        this.showInteUpload = true;
+      } else if (val.type === "target" && plan.targetSchemeStatus === '未导入') {
+        console.log("靶标方案未导入,显示上传组件")
+        this.showTargetUpload = true;
+      } else if (val.type === "meas") {
+        this.$router.push({path: "/childPlan/measPlan", query: {val, plan}})
       } else {
-        this.$router.push({path: "/childPlan/measPlan",query:{isOk:val.isOk}})
+        // 已导入/已编制状态正常跳转
+        this.navigateTo(val.type, val.isOk);
       }
     },
+
     async handleQuery() {
       // 查询逻辑
       const res = await planningSchemePage({
@@ -233,7 +364,7 @@ export default {
       this.handleQuery()
     },
     handleAdd() {
-      this.$router.push({ path: '/home/planCreate' })
+      this.$router.push({path: '/childPlans/associationTask'})
     },
     handleSizeChange(val) {
       this.pagination.pageSize = val