Explorar o código

方案筹划 测量方案编制

zhaoen hai 4 meses
pai
achega
169c68d9d5

+ 54 - 0
src/api/subPlanZb/index.js

@@ -0,0 +1,54 @@
+import request from "@/utils/request";
+
+export function getSubPlanZb(data) {
+    return request({
+        url: "/api/v1/subplanzb/get",
+        method: "post",
+        data,
+    });
+}
+export function getSubPlanZbZbList(params) {
+    return request({
+        url: "/api/v1/subplanzb/findPage",
+        method: "get",
+        params:params,
+    });
+}
+export function getZbList(params) {
+    return request({
+        url: "/api/v1/subplanzb/get-equipment",
+        method: "get",
+        params:params,
+    });
+}
+export function installSubPlanZb(data) {
+    return request({
+        url: "/api/v1/subplanzb/install",
+        method: "post",
+        data,
+    });
+}
+// 一次性添加
+export function installSubPlanZbList(data) {
+    return request({
+        url: "/api/v1/subplanzb/insert-list",
+        method: "post",
+        data,
+    });
+}
+
+export function updateSubPlanZb(data) {
+    return request({
+        url: "/api/v1/subplanzb/update",
+        method: "post",
+        data,
+    });
+}
+export function deleteSubPlanZb(data) {
+    return request({
+        url: "/api/v1/subplanzb/delete",
+        method: "post",
+        data,
+    });
+}
+

+ 5 - 5
src/components/GlobalComponents/viewHistory.vue

@@ -21,9 +21,9 @@
 
       <!-- Header右侧操作按钮 -->
       <template #header-actions>
-        <el-button type="primary" @click="handleQuery">查询</el-button>
-        <el-button class="blue-btn" @click="resetQuery">重置</el-button>
-        <el-button class="blue-btn" @click="handleAdd">新增</el-button>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">查询</el-button>
+        <el-button class="blue-btn" icon="el-icon-delete" @click="resetQuery">重置</el-button>
+        <el-button class="blue-btn" icon="el-icon-plus" @click="handleAdd">新增</el-button>
       </template>
 
       <!-- 主要内容 -->
@@ -633,7 +633,7 @@
       handleViewDetail(plan) {
         this.$router.push({
           path: "/planningSchem/overallPlanDesign",
-          query: { batchId: plan.batchId, isDef: this.isDef },
+          query: { batchId: plan.batchId, isDef: this.isDef, planId:plan.id },
         });
       },
       //导出
@@ -677,7 +677,7 @@
         ) {
           this.$router.push({
             path: "/home/collaborativeCreate_Cl",
-            query: { plan: JSON.stringify(plan), isEdit: "false" },
+            query: { plan: JSON.stringify(plan), isEdit: "false",IsDel: false },
           });
         } else if (
           val.type === "inte" &&

+ 42 - 0
src/styles/scrollbar.scss

@@ -0,0 +1,42 @@
+/* ====== 全局滚动条样式 · 深蓝玻璃感主题适配 ====== */
+::-webkit-scrollbar {
+  width: 10px; /* 垂直滚动条宽度 */
+  height: 10px; /* 水平滚动条高度(可选) */
+}
+
+/* 滚动条轨道 */
+::-webkit-scrollbar-track {
+  background: rgba(13, 35, 70, 0.8); /* 与 dialog 背景色融合 */
+  border-radius: 6px;
+  border-left: 1px solid var(--dlg-border); /* 左侧细高光边 */
+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
+}
+
+/* 滚动条滑块 */
+::-webkit-scrollbar-thumb {
+  background: linear-gradient(180deg, #1a4a8c, #0d3366);
+  border-radius: 6px;
+  border: 1px solid rgba(102, 177, 255, 0.2); /* 蓝边光晕 */
+  box-shadow: 0 0 8px rgba(66, 150, 255, 0.3);
+  transition: all 0.2s ease;
+}
+
+/* 鼠标悬停时 */
+::-webkit-scrollbar-thumb:hover {
+  background: linear-gradient(180deg, #2b6edf, #10407a);
+  border-color: rgba(102, 177, 255, 0.4);
+  box-shadow: 0 0 12px rgba(66, 150, 255, 0.5);
+}
+
+/* 滚动条两端按钮(通常隐藏更美观) */
+::-webkit-scrollbar-button {
+  display: none;
+}
+
+/* 水平滚动条轨道(底部) */
+::-webkit-scrollbar-track-piece:start {
+  background: rgba(13, 35, 70, 0.8);
+}
+::-webkit-scrollbar-track-piece:end {
+  background: rgba(13, 35, 70, 0.8);
+}

+ 1 - 0
src/styles/vab.scss

@@ -12,6 +12,7 @@
 @import "./themes/green.scss";
 @import "./themes/glory.scss";
 @import "./themes/dark.scss";
+@import "./scrollbar.scss";
 $base: ".vab";
 
 @mixin scrollbar {

+ 2 - 1
src/views/decision/testBuild/index.vue

@@ -12,7 +12,7 @@
         </el-form-item>
         <el-form-item label="试验任务类型">
           <el-select v-model="queryForm.testTaskType" clearable placeholder="请选择试验任务类型">
-            <el-option v-for="item in $getDictList('test_task_type')" key="item" :value="item.dictValue"
+            <el-option v-for="item in $getDictList('test_task_type')" :key="item.id" :value="item.dictValue"
                        :label="item.dictName"></el-option>
           </el-select>
         </el-form-item>
@@ -220,6 +220,7 @@
         :visible.sync="detailDrawerVisible"
         size="50%"
         title="任务详情"
+
     >
       <div class="detail-container">
         <!-- 头部 -->

+ 17 - 17
src/views/planningSchem/childsPlan/measPlan.vue

@@ -228,6 +228,7 @@ import autoPlanCreate from "@/views/planningSchem/comprehensive/components/autoP
 import semiPlanCreate from "@/views/planningSchem/comprehensive/components/semiPlanCreate.vue";
 import {getAlluser, getList} from "@/api/system/user/userManagement";
 import {planningSchemeUpdateMeasurement} from "@/api/planningScheme";
+import {installSubPlanZbList} from "@/api/subPlanZb";
 export default {
   components:{
     autoPlanCreate,
@@ -479,7 +480,7 @@ export default {
       }*/
     },
     // 提交表单
-    submitForm() {
+   async submitForm() {
       const planId = JSON.parse(this.$route.query.plan).id
       const userIds = this.selectedUsers.map(user => user.id);
       console.log(JSON.parse(this.planJson))
@@ -489,23 +490,22 @@ export default {
         algorithmJson: data.algorithmJson,
         xml: data.xml,
       })
-      planningSchemeUpdateMeasurement({
-        id:planId,
-        // schemeContent:this.planJson,
-        schemeContent: schemeContent,
-        schemeSubPlan: schemeSubPlan,
-        userIds:userIds,
-      })
-
-      console.log(JSON.parse(schemeContent))
-      console.log(JSON.parse(schemeSubPlan))
-
-      // 这里可以添加表单验证和提交逻辑
-      this.$message.success('筹划方案创建成功!');
-      // 提交成功后返回主界面
-      setTimeout(() => {
+      try {
+        await planningSchemeUpdateMeasurement({
+          id:planId,
+          // schemeContent:this.planJson,
+          schemeContent: schemeContent,
+          schemeSubPlan: schemeSubPlan,
+          zbDto:data.zbInfoList,
+          userIds:userIds,
+        })
+        // 这里可以添加表单验证和提交逻辑
+        this.$message.success('筹划方案创建成功!');
+        // 提交成功后返回主界面
         this.back();
-      }, 1500);
+      } catch (e) {
+        // this.$message.error('筹划方案创建失败!');
+      }
     },
 
     savePlanJson(data){

+ 126 - 26
src/views/planningSchem/comprehensive/components/semiPlanCreate.vue

@@ -97,7 +97,7 @@
               <template #default="scope">
                 <!-- 使用按钮 -->
                 <el-button
-                  type="success"
+                  type="primary"
                   size="small"
                   @click="handleUse(scope.row)"
                 >
@@ -261,7 +261,7 @@
           <div class="editor-container">
             <WangEditor
               v-model="content"
-              :height="400"
+              :height="300"
               style="max-width: 1350px"
               :disabled="false"
               @change="handleContentChange"
@@ -272,19 +272,30 @@
           <el-row>
             <el-col :span="24">
               <el-button icon="el-icon-plus" @click="openAdd">添加</el-button>
+              <el-input
+                  v-model="searchKeyword"
+                  placeholder="请输入关键词(装备名称、位置、任务描述)"
+                  clearable
+                  style="width: 300px;margin-left: 20px"
+              />
             </el-col>
           </el-row>
           <el-table
-            :data="zbInfoList"
-            style="width: 100%"
-            border
+              :data="filteredZbInfoList"
+              style="width: 100%"
+              border
+              height="300"
             :header-cell-style="{ 'text-align': 'center' }"
             :cell-style="{ 'text-align': 'center' }"
           >
-            <el-table-column label="序号" prop="89"></el-table-column>
-            <el-table-column label="装备" prop="89"></el-table-column>
-            <el-table-column label="位置" prop="89"></el-table-column>
-            <el-table-column label="任务" prop="89"></el-table-column>
+            <el-table-column label="序号" width="55" type="index"></el-table-column>
+            <el-table-column label="装备名称" prop="zbName"></el-table-column>
+            <el-table-column label="位置" prop="positionDescription">
+              <template slot-scope="scope">
+                {{ scope.row.positionDescription ? scope.row.positionDescription : scope.row.equipPositionX + ',' + scope.row.equipPositionY }}
+              </template>
+            </el-table-column>
+            <el-table-column label="任务描述" prop="taskRemark"></el-table-column>
             <el-table-column label="操作">
               <template slot-scope="{ row }">
                 <el-button type="danger" @click="delZbInfo(row)">删除</el-button>
@@ -292,15 +303,6 @@
               </template>
             </el-table-column>
           </el-table>
-          <el-pagination
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-            :current-page="zbQueryForm.pageNo"
-            :page-sizes="[10, 20, 50, 100]"
-            :page-size="zbQueryForm.pageSize"
-            layout="total, sizes, prev, pager, next, jumper"
-            :total="zbQueryForm.total"
-          />
         </div>
       </div>
     </div>
@@ -308,7 +310,7 @@
     <!-- 添加装备弹窗 -->
     <el-dialog
       :title="addOrUpdateTitle"
-      :visible.sync="addOrUpdateTVisible"
+      :visible.sync="addOrUpdateVisible"
       class="dark-dialog"
       width="60%"
       :close-on-click-modal="false"
@@ -317,7 +319,22 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="装备名称" prop="zbName">
-              <el-input v-model="addForm.zbName" placeholder="请输入任务名称"/>
+              <el-select
+                  v-model="addForm.zbName"
+                  placeholder="请输入装备名称"
+                  filterable
+                  remote
+                  :remote-method="handleRemoteSearch"
+                  :loading="loading"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="zb in zbList"
+                    :key="zb.id"
+                    :label="zb.zbName"
+                    :value="zb.zbName"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -341,7 +358,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="20">
+        <el-row :gutter="20" v-if="addForm.isExactLocation === 0">
           <el-col :span="24">
             <el-form-item label="位置描述" prop="positionDescription">
               <el-input type="textarea" :rows="4" v-model="addForm.positionDescription" placeholder="请输入位置描述"/>
@@ -358,7 +375,7 @@
       </el-form>
 
       <div slot="footer" class="dialog-footer">
-        <el-button @click="addOrUpdateTVisible = false">取 消</el-button>
+        <el-button @click="addOrUpdateVisible = false">取 消</el-button>
         <el-button type="primary" @click="handleAddSubmit">确 定</el-button>
       </div>
     </el-dialog>
@@ -396,6 +413,7 @@ import WangEditor from "@/components/Components/WangEditor.vue";
 import QAChat from "@/components/Components/QAChat.vue"
 import DrawioEmbed from "@/components/DrawioEmbed/index.vue";
 import {getSynergismScheme, zbAdd, zbPage, zbGet, zbUpdate, zbDel} from "@/api/planningScheme";
+import {getSubPlanZbZbList, getZbList} from "@/api/subPlanZb";
 
 export default {
   props: {
@@ -419,8 +437,12 @@ export default {
     return {
       // 表格编辑相关
       zbInfoList: [],
+      searchKeyword: '', // 搜索关键词
+      zbList:[],
+
+      loading:false,
       addOrUpdateTitle: '新增装备信息',
-      addOrUpdateTVisible: false,
+      addOrUpdateVisible: false,
       addForm: {
         zbName: '',
         isExactLocation: 0,
@@ -521,6 +543,19 @@ export default {
     };
   },
   computed: {
+    filteredZbInfoList() {
+      const keyword = this.searchKeyword.trim().toLowerCase();
+      if (!keyword) {
+        return this.zbInfoList; // 无关键词,显示全部
+      }
+
+      // 在 zbName、positionDescription、taskRemark 中搜索
+      return this.zbInfoList.filter(item =>
+          item.zbName?.toLowerCase().includes(keyword) ||
+          item.positionDescription?.toLowerCase().includes(keyword) ||
+          item.taskRemark?.toLowerCase().includes(keyword)
+      );
+    },
     // 过滤模板数据
     filteredTemplates() {
       if (!this.templateSearch) {
@@ -555,16 +590,75 @@ export default {
       // }
       // if (data) {
     },
+
+    // 远程搜索方法
+    handleRemoteSearch(query) {
+      // query 就是用户输入的内容
+      if (!query) {
+        this.zbList = [];
+        return;
+      }
+
+      this.loading = true;
+
+      // 防抖优化(可选):避免输入过快频繁请求
+      clearTimeout(this._searchTimer);
+      this._searchTimer = setTimeout(async () => {
+        try {
+          const res = await getZbList({zbName: query})
+          this.zbList = res.data || [];
+        } catch (err) {
+          this.zbList = [];
+          console.error('搜索失败:', err);
+        } finally {
+          this.loading = false;
+        }
+      }, 300); // 防抖 300ms
+    },
     // 添加装备
     openAdd(row) {
-      this.addOrUpdateTVisible = true
+      if(row.tempId){
+        this.addForm = { ...row }
+      }
+      this.addOrUpdateVisible = true
     },
     // 添加装备确认按钮
     handleAddSubmit() {
+      console.log(this.addForm)
+      if (this.addForm.tempId || this.addForm.id) {
+        // 编辑:找到列表中 id 相同的项,替换它
+        let index = null
+        if(this.addForm.tempId){
+          index = this.zbInfoList.findIndex(item => item.tempId === this.addForm.tempId);
+        }else {
+          index = this.zbInfoList.findIndex(item => item.id === this.addForm.id);
+        }
 
+        if (index > -1) {
+          this.zbInfoList.splice(index, 1, { ...this.addForm });
+        }
+      } else {
+        // 新增:添加新项,生成 id
+        this.zbInfoList.push({
+          tempId: Date.now(),
+          ...this.addForm
+        });
+        console.log(this.zbInfoList)
+      }
+
+      this.addForm = {
+        zbName: '',
+            isExactLocation: 0,
+            equipPositionX: '',
+            equipPositionY: '',
+            positionDescription: '',
+            taskRemark: '',
+      }
+      this.addOrUpdateVisible = false
     },
     // 删除装备信息
     delZbInfo(row) {
+      this.zbInfoList = this.zbInfoList.filter(item => item.zbName !== row.zbName)
     },
     async loadDefaultData(xml) {
       try {
@@ -589,7 +683,8 @@ export default {
       const planJson = JSON.stringify({
         algorithmJson: this.algorithmParams,   // 布设算法
         textJson: this.content,   // 富文本
-        xml: xml
+        xml: xml, //图编辑器
+        zbInfoList: this.zbInfoList
       })
 
       this.$emit("save-plan", {planJson: planJson});
@@ -600,7 +695,8 @@ export default {
       return JSON.stringify({
         algorithmJson: this.algorithmParams,   // 布设算法
         textJson: this.content,   // 富文本
-        xml: xml
+        xml: xml,
+        zbInfoList: this.zbInfoList,
       })
     },
     handleUse(plan) {
@@ -673,11 +769,15 @@ export default {
     getSynergismScheme({id: this.planInfo.id}).then((res) => {
       this.schemeInfo = res.data;
     })
+    getZbList({zbName:''}).then((res)=>{
+      this.zbList = res.data
+    })
     if (this.dataJson) {
       const data = JSON.parse(this.dataJson)
       console.log(data)
       this.algorithmParams = data.algorithmJson;
       this.content = data.textJson;
+      this.zbInfoList = data.zbInfoList || [];
       this.loadDefaultData(data.xml.xmlData);
     }
     window.addEventListener('resize', () => {

+ 0 - 12
src/views/planningSchem/comprehensive/index.vue

@@ -346,18 +346,6 @@ export default {
       if (
         // Xls === "xls" ||
         Xls === "docx"
-        // Xls === "doc" ||
-        // Xls === "xlsx" ||
-        // Xls === "txt" ||
-        // Xls === "png" ||
-        // Xls === "jpg" ||
-        // Xls === "gif" ||
-        // Xls === "pdf" ||
-        // Xls === "ppt" ||
-        // Xls === "pptx"
-        // Xls != 'exe' &&
-        // Xls != 'bat' &&
-        // Xls != 'sh'
       ) {
         if (!isLt4M) {
           this.$message({

+ 12 - 13
src/views/planningSchem/comprehensive/overallPlanDesign.vue

@@ -6,18 +6,17 @@
         <div class="header-actions">
           <el-button v-if="$route.query.isDef === 'true'" type="success" @click="saveSolution">保存方案</el-button>
           <el-button type="primary" @click="exportAsWord">导出为Word</el-button>
-          <el-button class="blue-btn">查看试验任务详情</el-button>
-          <!-- 查看子方案下拉菜单 -->
-          <el-dropdown trigger="click" @command="handleCommand">
-            <el-button type="info" icon="el-icon-folder-opened">
-              查看子方案<i class="el-icon-arrow-down el-icon--right"></i>
-            </el-button>
-            <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item command="interference" icon="el-icon-warning-outline">干扰方案</el-dropdown-item>
-              <el-dropdown-item command="measurement" icon="el-icon-odometer">测量方案</el-dropdown-item>
-              <el-dropdown-item command="target" icon="el-icon-aim">靶标方案</el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown>
+          <!--&lt;!&ndash; 查看子方案下拉菜单 &ndash;&gt;-->
+          <!--<el-dropdown trigger="click" @command="handleCommand">-->
+          <!--  <el-button type="info" icon="el-icon-folder-opened">-->
+          <!--    查看子方案<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>-->
+          <!--  </el-button>-->
+          <!--  <el-dropdown-menu slot="dropdown">-->
+          <!--    <el-dropdown-item command="interference" icon="el-icon-warning-outline">干扰方案</el-dropdown-item>-->
+          <!--    <el-dropdown-item command="measurement" icon="el-icon-odometer">测量方案</el-dropdown-item>-->
+          <!--    <el-dropdown-item command="target" icon="el-icon-aim">靶标方案</el-dropdown-item>-->
+          <!--  </el-dropdown-menu>-->
+          <!--</el-dropdown>-->
         </div>
       </template>
 
@@ -517,7 +516,7 @@ export default {
 
     async getTree() {
       try {
-        const res = await schemeChapterTree({ batchId: this.batchId })
+        const res = await schemeChapterTree({ batchId: this.batchId,isDef:this.$route.query.isDef,id:this.$route.query.planId })
         this.treeList = res.data || [];
 
         function setTable(item) {

+ 53 - 19
src/views/programPlanning/collaborativePlanning/collaborativeCreate_CL.vue

@@ -342,6 +342,35 @@
               :disabled="!isEdit"
               @change="handleContentChange"
           />
+
+          <!-- 筛选框 -->
+          <div style="margin-bottom: 10px;">
+            <el-input
+                v-model="searchKeyword"
+                placeholder="请输入关键词(装备名称、位置、任务描述)"
+                clearable
+                style="width: 300px;"
+            />
+          </div>
+
+          <!-- 表格 -->
+          <el-table
+              :data="filteredZbInfoList"
+              style="width: 100%"
+              border
+              height="400"
+          :header-cell-style="{ 'text-align': 'center' }"
+          :cell-style="{ 'text-align': 'center' }"
+          >
+          <el-table-column label="序号" width="55" type="index"></el-table-column>
+          <el-table-column label="装备名称" prop="zbName"></el-table-column>
+            <el-table-column label="位置" prop="positionDescription">
+              <template slot-scope="scope">
+                {{ scope.row.positionDescription ? scope.row.positionDescription : scope.row.equipPositionX + ',' + scope.row.equipPositionY }}
+              </template>
+            </el-table-column>
+          <el-table-column label="任务描述" prop="taskRemark"></el-table-column>
+          </el-table>
         </div>
       </div>
     </div>
@@ -379,6 +408,7 @@ import WangEditor from "@/components/Components/WangEditor.vue";
 import QAChat from "@/components/Components/QAChat.vue"
 import DrawioEmbed from "@/components/DrawioEmbed/index.vue";
 import {getSynergismScheme, planningSchemeUpdate} from "@/api/planningScheme";
+import {getSubPlanZbZbList} from "@/api/subPlanZb";
 export default {
   components:{
     DrawioEmbed,
@@ -387,6 +417,10 @@ export default {
   },
   data() {
     return {
+      // 装备表格
+      zbInfoList: [],
+      searchKeyword: '', // 搜索关键词
+
       dist:{},
       content:'',
       selectedTemplate: null,
@@ -467,6 +501,19 @@ export default {
     };
   },
   computed: {
+    filteredZbInfoList() {
+      const keyword = this.searchKeyword.trim().toLowerCase();
+      if (!keyword) {
+        return this.zbInfoList; // 无关键词,显示全部
+      }
+
+      // 在 zbName、positionDescription、taskRemark 中搜索
+      return this.zbInfoList.filter(item =>
+          item.zbName?.toLowerCase().includes(keyword) ||
+          item.positionDescription?.toLowerCase().includes(keyword) ||
+          item.taskRemark?.toLowerCase().includes(keyword)
+      );
+    },
     // 过滤模板数据
     filteredTemplates() {
       if (!this.templateSearch) {
@@ -488,8 +535,9 @@ export default {
 
     },
     async fetchData(){
-      let res = await getSynergismScheme({id:this.planInfo.id})
-        if(res.data.schemeContent){
+      let res = await getSynergismScheme({id:this.planInfo.id,IsDef:this.$route.query.IsDel})
+      this.schemeInfo = res.data;
+      if(res.data.schemeContent){
           const data = JSON.parse(res.data.schemeContent)
           console.log(data)
           this.$nextTick(()=>{
@@ -502,23 +550,9 @@ export default {
           this.algorithmParams = data.algorithmJson;
           this.loadDefaultData(data.xml.xmlData);
         }
-      // await getSynergismScheme({id:this.planInfo.id}).then((res)=>{
-      //   this.schemeInfo = res.data;
-      //   console.log(res.data, '============')
-      //   if(res.data.schemeContent){
-      //     const data = JSON.parse(res.data.schemeContent)
-      //     console.log(data)
-      //     this.$nextTick(()=>{
-      //       this.content = data;
-      //     })
-      //   }
-      //   if (res.data.schemeSubPlan) {
-      //     const data = JSON.parse(res.data.schemeSubPlan)
-      //     console.log(data)
-      //     this.algorithmParams = data.schemeSubPlan;
-      //     this.loadDefaultData(data.xml.xmlData);
-      //   }
-      // })
+      await getSubPlanZbZbList({schemeId_EQ:this.planInfo.id,pageNo:1,pageSize:9999}).then((res)=>{
+        this.zbInfoList = res.data.rows
+      })
     },
     async loadDefaultData(xml) {
       try {

BIN=BIN
tabsbar_0824.zip