index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="68px"
  10. >
  11. <el-form-item label="任务名称" prop="bizName">
  12. <el-input
  13. v-model="queryParams.bizName"
  14. placeholder="请输入任务名称"
  15. clearable
  16. @keyup.enter.native="handleQuery"
  17. />
  18. </el-form-item>
  19. <el-form-item label="状态" prop="status">
  20. <el-select
  21. v-model="queryParams.status"
  22. placeholder="请选择状态"
  23. clearable
  24. >
  25. <el-option
  26. v-for="dict in dict.type.uavps_task_status"
  27. :key="dict.value"
  28. :label="dict.label"
  29. :value="dict.value"
  30. />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item label="开始时间" prop="startTime">
  34. <el-date-picker
  35. clearable
  36. v-model="queryParams.startTime"
  37. type="date"
  38. value-format="yyyy-MM-dd"
  39. placeholder="请选择开始时间"
  40. >
  41. </el-date-picker>
  42. </el-form-item>
  43. <el-form-item label="结束时间" prop="endTime">
  44. <el-date-picker
  45. clearable
  46. v-model="queryParams.endTime"
  47. type="date"
  48. value-format="yyyy-MM-dd"
  49. placeholder="请选择结束时间"
  50. >
  51. </el-date-picker>
  52. </el-form-item>
  53. <el-form-item label="创建时间">
  54. <el-date-picker
  55. v-model="daterangeCreateTime"
  56. style="width: 240px"
  57. value-format="yyyy-MM-dd"
  58. type="daterange"
  59. range-separator="-"
  60. start-placeholder="开始日期"
  61. end-placeholder="结束日期"
  62. ></el-date-picker>
  63. </el-form-item>
  64. <el-form-item>
  65. <el-button
  66. type="primary"
  67. icon="el-icon-search"
  68. size="mini"
  69. @click="handleQuery"
  70. >搜索</el-button
  71. >
  72. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  73. >重置</el-button
  74. >
  75. </el-form-item>
  76. </el-form>
  77. <el-row :gutter="10" class="mb8">
  78. <el-col :span="1.5">
  79. <el-button
  80. type="primary"
  81. plain
  82. icon="el-icon-plus"
  83. size="mini"
  84. @click="handleAdd"
  85. v-hasPermi="['system:task:add']"
  86. >新增</el-button
  87. >
  88. </el-col>
  89. <el-col :span="1.5">
  90. <el-button
  91. type="success"
  92. plain
  93. icon="el-icon-edit"
  94. size="mini"
  95. :disabled="single"
  96. @click="handleUpdate"
  97. v-hasPermi="['system:task:edit']"
  98. >修改</el-button
  99. >
  100. </el-col>
  101. <el-col :span="1.5">
  102. <el-button
  103. type="danger"
  104. plain
  105. icon="el-icon-delete"
  106. size="mini"
  107. :disabled="multiple"
  108. @click="handleDelete"
  109. v-hasPermi="['system:task:remove']"
  110. >删除</el-button
  111. >
  112. </el-col>
  113. <el-col :span="1.5">
  114. <el-button
  115. type="warning"
  116. plain
  117. icon="el-icon-download"
  118. size="mini"
  119. @click="handleExport"
  120. v-hasPermi="['system:task:export']"
  121. >导出</el-button
  122. >
  123. </el-col>
  124. <right-toolbar
  125. :showSearch.sync="showSearch"
  126. @queryTable="getList"
  127. ></right-toolbar>
  128. </el-row>
  129. <el-table
  130. v-loading="loading"
  131. :data="taskList"
  132. @selection-change="handleSelectionChange"
  133. >
  134. <el-table-column type="selection" width="55" align="center" />
  135. <el-table-column label="业务ID" align="center" prop="bizId" />
  136. <el-table-column label="任务名称" align="center" prop="bizName" />
  137. <el-table-column label="状态" align="center" prop="status">
  138. <template slot-scope="scope">
  139. <dict-tag
  140. :options="dict.type.uavps_task_status"
  141. :value="scope.row.status"
  142. />
  143. </template>
  144. </el-table-column>
  145. <el-table-column
  146. label="开始时间"
  147. align="center"
  148. prop="startTime"
  149. width="180"
  150. >
  151. <template slot-scope="scope">
  152. <span>{{ parseTime(scope.row.startTime, "{y}-{m}-{d}") }}</span>
  153. </template>
  154. </el-table-column>
  155. <el-table-column
  156. label="结束时间"
  157. align="center"
  158. prop="endTime"
  159. width="180"
  160. >
  161. <template slot-scope="scope">
  162. <span>{{ parseTime(scope.row.endTime, "{y}-{m}-{d}") }}</span>
  163. </template>
  164. </el-table-column>
  165. <el-table-column
  166. label="创建时间"
  167. align="center"
  168. prop="createTime"
  169. width="180"
  170. >
  171. <template slot-scope="scope">
  172. <span>{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}</span>
  173. </template>
  174. </el-table-column>
  175. <el-table-column
  176. label="更新时间"
  177. align="center"
  178. prop="updateTime"
  179. width="180"
  180. >
  181. <template slot-scope="scope">
  182. <span>{{ parseTime(scope.row.updateTime, "{y}-{m}-{d}") }}</span>
  183. </template>
  184. </el-table-column>
  185. <el-table-column
  186. label="操作"
  187. align="center"
  188. class-name="small-padding fixed-width"
  189. >
  190. <template slot-scope="scope">
  191. <el-button
  192. v-hasPermi="['system:task:edit']"
  193. size="mini"
  194. type="text"
  195. icon="el-icon-s-operation"
  196. @click="handleRun(scope.row)"
  197. >运行</el-button
  198. >
  199. <el-button
  200. size="mini"
  201. type="text"
  202. icon="el-icon-edit"
  203. @click="handleUpdate(scope.row)"
  204. v-hasPermi="['system:task:edit']"
  205. >修改</el-button
  206. >
  207. <el-button
  208. size="mini"
  209. type="text"
  210. icon="el-icon-delete"
  211. @click="handleDelete(scope.row)"
  212. v-hasPermi="['system:task:remove']"
  213. >删除</el-button
  214. >
  215. </template>
  216. </el-table-column>
  217. </el-table>
  218. <pagination
  219. v-show="total > 0"
  220. :total="total"
  221. :page.sync="queryParams.pageNum"
  222. :limit.sync="queryParams.pageSize"
  223. @pagination="getList"
  224. />
  225. <!-- 添加或修改任务数据对话框 -->
  226. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  227. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  228. <el-form-item label="任务名称" prop="bizName">
  229. <el-input v-model="form.bizName" placeholder="请输入任务名称" />
  230. </el-form-item>
  231. <el-form-item label="多目标类型" prop="multiTarget">
  232. <el-select v-model="form.multiTarget" placeholder="请选择多目标类型">
  233. <el-option
  234. v-for="dict in dict.type.uavps_target_formation_type"
  235. :key="dict.value"
  236. :label="dict.label"
  237. :value="dict.value"
  238. ></el-option>
  239. </el-select>
  240. </el-form-item>
  241. <el-form-item label="噪声类型" prop="noiseType">
  242. <el-select v-model="form.noiseType" placeholder="请选择噪声类型">
  243. <el-option
  244. v-for="dict in dict.type.uavps_task_nose_type"
  245. :key="dict.value"
  246. :label="dict.label"
  247. :value="dict.value"
  248. ></el-option>
  249. </el-select>
  250. </el-form-item>
  251. <el-form-item label="噪声方差" prop="noiseVariance">
  252. <el-input v-model="form.noiseVariance" placeholder="请输入噪声方差" />
  253. </el-form-item>
  254. <el-form-item label="噪声均值" prop="noiseMean">
  255. <el-input v-model="form.noiseMean" placeholder="请输入噪声均值" />
  256. </el-form-item>
  257. </el-form>
  258. <div slot="footer" class="dialog-footer">
  259. <el-button type="primary" @click="submitForm">确 定</el-button>
  260. <el-button @click="cancel">取 消</el-button>
  261. </div>
  262. </el-dialog>
  263. <el-dialog
  264. :title="title"
  265. :visible.sync="showTrajectory"
  266. @opened="initTrajectory"
  267. :before-close="destroyTrajectory"
  268. :fullscreen="true"
  269. append-to-body
  270. destroy-on-close
  271. >
  272. <div class="container">
  273. <div>
  274. <el-row type="flex" align="middle" style="height: 40px">
  275. <el-col :span="7">
  276. <el-button @click="transFormation" type="danger"
  277. >转换队形</el-button
  278. >
  279. <el-button @click="" type="success">回放</el-button>
  280. </el-col>
  281. <el-col :span="17">
  282. <!-- <el-progress v-show="isShow" :percentage="percentage"></el-progress>-->
  283. </el-col>
  284. </el-row>
  285. <el-row>
  286. <div ref="pixiContainer" class="pixi-container"></div>
  287. </el-row>
  288. </div>
  289. <!-- <div class="right-board">
  290. <div style="float: right">
  291. <el-link type="primary" @click="showConfig">显示配置</el-link>
  292. </div>
  293. <el-divider content-position="left">目标无人机群</el-divider>
  294. <li v-for="(item, index) in targetLblAry" :key="index">
  295. <div @click="showSprite(item.id)" style="cursor: pointer">
  296. <span>编号:&nbsp;&nbsp;</span><label>{{ item.showNo }}</label>
  297. <span style="margin-left: 10px" v-if="hideList.includes(item.id)"
  298. >( 隐 藏 )</span
  299. >
  300. </div>
  301. <div v-if="configList.includes('经度')">
  302. <span>经度:&nbsp;&nbsp;</span><label>{{ item.longitude }}</label>
  303. </div>
  304. <div v-if="configList.includes('纬度')">
  305. <span>纬度:&nbsp;&nbsp;</span><label>{{ item.latitude }}</label>
  306. </div>
  307. <div v-if="configList.includes('海拔')">
  308. <span>海拔:&nbsp;&nbsp;</span><label>{{ item.altitude }}</label>
  309. </div>
  310. <div v-if="configList.includes('东向速度')">
  311. <span>东向速度:&nbsp;&nbsp;</span
  312. ><label>{{ item.eastSpeed }}</label>
  313. </div>
  314. <div v-if="configList.includes('北向速度')">
  315. <span>北向速度:&nbsp;&nbsp;</span
  316. ><label>{{ item.northSpeed }}</label>
  317. </div>
  318. <div v-if="configList.includes('天向速度')">
  319. <span>天向速度:&nbsp;&nbsp;</span
  320. ><label>{{ item.skySpeed }}</label>
  321. </div>
  322. </li>
  323. </div> -->
  324. </div>
  325. </el-dialog>
  326. </div>
  327. </template>
  328. <script>
  329. import {
  330. listTask,
  331. getTask,
  332. delTask,
  333. addTask,
  334. updateTask,
  335. } from "@/api/system/task";
  336. export default {
  337. name: "Task",
  338. dicts: [
  339. "uavps_task_status",
  340. "uavps_target_formation_type",
  341. "uavps_task_nose_type",
  342. ],
  343. data() {
  344. return {
  345. // 遮罩层
  346. loading: true,
  347. // 选中数组
  348. ids: [],
  349. // 非单个禁用
  350. single: true,
  351. // 非多个禁用
  352. multiple: true,
  353. // 显示搜索条件
  354. showSearch: true,
  355. // 总条数
  356. total: 0,
  357. // 任务数据表格数据
  358. taskList: [],
  359. // 弹出层标题
  360. title: "",
  361. // 是否显示弹出层
  362. open: false,
  363. // 噪声数据文件路径时间范围
  364. daterangeCreateTime: [],
  365. // 查询参数
  366. queryParams: {
  367. pageNum: 1,
  368. pageSize: 10,
  369. bizName: null,
  370. status: null,
  371. startTime: null,
  372. endTime: null,
  373. createTime: null,
  374. },
  375. // 表单参数
  376. form: {},
  377. // 表单校验
  378. rules: {},
  379. parameterId: 0,
  380. showTrajectory: false,
  381. webSocket: null,
  382. };
  383. },
  384. created() {
  385. this.getList();
  386. },
  387. methods: {
  388. /** 查询任务数据列表 */
  389. getList() {
  390. this.loading = true;
  391. this.queryParams.params = {};
  392. if (null != this.daterangeCreateTime && "" != this.daterangeCreateTime) {
  393. this.queryParams.params["beginCreateTime"] =
  394. this.daterangeCreateTime[0];
  395. this.queryParams.params["endCreateTime"] = this.daterangeCreateTime[1];
  396. }
  397. listTask(this.queryParams).then((response) => {
  398. this.taskList = response.rows;
  399. this.total = response.total;
  400. this.loading = false;
  401. });
  402. },
  403. // 取消按钮
  404. cancel() {
  405. this.open = false;
  406. this.reset();
  407. },
  408. // 表单重置
  409. reset() {
  410. this.form = {
  411. bizId: null,
  412. bizName: null,
  413. bizType: null,
  414. multiTarget: null,
  415. noiseType: null,
  416. noiseVariance: null,
  417. noiseMean: null,
  418. platformUavStr: null,
  419. fixedMultiTargetFormationStr: null,
  420. customizedMultiTargetFormationStr: null,
  421. status: null,
  422. startTime: null,
  423. endTime: null,
  424. filePath: null,
  425. createBy: null,
  426. createTime: null,
  427. updateBy: null,
  428. updateTime: null,
  429. };
  430. this.resetForm("form");
  431. },
  432. /** 搜索按钮操作 */
  433. handleQuery() {
  434. this.queryParams.pageNum = 1;
  435. this.getList();
  436. },
  437. /** 重置按钮操作 */
  438. resetQuery() {
  439. this.daterangeCreateTime = [];
  440. this.resetForm("queryForm");
  441. this.handleQuery();
  442. },
  443. // 多选框选中数据
  444. handleSelectionChange(selection) {
  445. this.ids = selection.map((item) => item.bizId);
  446. this.single = selection.length !== 1;
  447. this.multiple = !selection.length;
  448. },
  449. /** 新增按钮操作 */
  450. handleAdd() {
  451. this.reset();
  452. this.open = true;
  453. this.title = "添加任务数据";
  454. },
  455. /** 修改按钮操作 */
  456. handleUpdate(row) {
  457. this.reset();
  458. const bizId = row.bizId || this.ids;
  459. getTask(bizId).then((response) => {
  460. this.form = response.data;
  461. this.open = true;
  462. this.title = "修改任务数据";
  463. });
  464. },
  465. /** 提交按钮 */
  466. submitForm() {
  467. this.$refs["form"].validate((valid) => {
  468. if (valid) {
  469. if (this.form.bizId != null) {
  470. updateTask(this.form).then((response) => {
  471. this.$modal.msgSuccess("修改成功");
  472. this.open = false;
  473. this.getList();
  474. });
  475. } else {
  476. addTask(this.form).then((response) => {
  477. this.$modal.msgSuccess("新增成功");
  478. this.open = false;
  479. this.getList();
  480. });
  481. }
  482. }
  483. });
  484. },
  485. /** 删除按钮操作 */
  486. handleDelete(row) {
  487. const bizIds = row.bizId || this.ids;
  488. this.$modal
  489. .confirm('是否确认删除任务数据编号为"' + bizIds + '"的数据项?')
  490. .then(function () {
  491. return delTask(bizIds);
  492. })
  493. .then(() => {
  494. this.getList();
  495. this.$modal.msgSuccess("删除成功");
  496. })
  497. .catch(() => {});
  498. },
  499. /** 导出按钮操作 */
  500. handleExport() {
  501. this.download(
  502. "system/task/export",
  503. {
  504. ...this.queryParams,
  505. },
  506. `task_${new Date().getTime()}.xlsx`
  507. );
  508. },
  509. handleRun(row) {
  510. this.parameterId = row.bizId || this.ids;
  511. this.showTrajectory = true;
  512. this.title = "飞行轨迹";
  513. },
  514. initWebSocket() {
  515. const wsUri = "ws://127.0.0.1:8080/websocket/message";
  516. this.webSocket = new WebSocket(wsUri);
  517. const self = this;
  518. this.webSocket.onopen = function (event) {
  519. self.webSocket.send("RUN:" + self.parameterId);
  520. console.log("WebSocket连接成功!");
  521. };
  522. this.webSocket.onmessage = function (event) {
  523. self.processMessage(JSON.parse(event.data));
  524. };
  525. this.webSocket.onclose = function (event) {
  526. console.log("WebSocket连接断开!");
  527. };
  528. this.webSocket.onerror = function (event) {
  529. console.log(
  530. "WebSocket连接异常: " +
  531. event.code +
  532. " " +
  533. event.reason +
  534. " " +
  535. event.wasClean
  536. );
  537. };
  538. },
  539. transFormation() {
  540. // debugger;
  541. let msg = "TRANSFORMATION:" + this.parameterId;
  542. console.info("transFormation", msg);
  543. this.webSocket.send(msg);
  544. // this.pixiApp.stage.removeChildren();
  545. // this.clearAllAry();
  546. },
  547. destroyTrajectory() {
  548. if (this.webSocket) {
  549. this.webSocket.close();
  550. }
  551. this.showTrajectory = false;
  552. },
  553. initTrajectory() {
  554. this.initWebSocket();
  555. },
  556. processMessage(json) {
  557. console.info(json);
  558. },
  559. },
  560. };
  561. </script>