|
|
@@ -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>
|
|
|
+
|