benchmarkScenarioList.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. <template>
  2. <div class="generalizationScenarioListPanel">
  3. <search-layout :needBox="true">
  4. <template slot="searchItem1">
  5. <span class="label">场景名称</span>
  6. <el-input
  7. v-model="searchParams.sceneName"
  8. size="small"
  9. clearable
  10. placeholder="请输入"
  11. maxlength="60"
  12. @keyup.enter.native="doSearch"
  13. >
  14. </el-input>
  15. </template>
  16. <template slot="searchItem1">
  17. <span class="label">主车动作</span>
  18. <el-select
  19. v-model="searchParams.mainBehavior[0][1]"
  20. size="small"
  21. clearable
  22. >
  23. <el-option
  24. v-for="item in dictionaryList['egoAction']"
  25. :label="item.dictName"
  26. :value="item.dictName"
  27. :key="item.id"
  28. ></el-option>
  29. </el-select>
  30. </template>
  31. <template slot="searchItem2">
  32. <span class="label">他车动作</span>
  33. <el-select
  34. v-model="searchParams.otherBehavior[0][1]"
  35. size="small"
  36. clearable
  37. >
  38. <el-option
  39. v-for="item in dictionaryList['targetAction']"
  40. :label="item.dictName"
  41. :value="item.dictName"
  42. :key="item.id"
  43. ></el-option>
  44. </el-select>
  45. </template>
  46. <template slot="searchItem2">
  47. <span class="label">天气</span>
  48. <el-select v-model="searchParams.weather[0][1]" size="small" clearable>
  49. <el-option
  50. v-for="item in dictionaryList['sceneLibWeather']"
  51. :label="item.dictName"
  52. :value="item.dictName"
  53. :key="item.id"
  54. ></el-option>
  55. </el-select>
  56. </template>
  57. <template slot="searchItem3">
  58. <span class="label">道路类型</span>
  59. <el-select v-model="searchParams.roadType[0][1]" size="small" clearable>
  60. <el-option
  61. v-for="item in dictionaryList['sceneLibrodeType']"
  62. :label="item.dictName"
  63. :value="item.dictName"
  64. :key="item.id"
  65. ></el-option>
  66. </el-select>
  67. </template>
  68. <template slot="searchItem3">
  69. <span class="label">道路几何-平面</span>
  70. <el-select
  71. v-model="searchParams.roadGeometryPlane[0][1]"
  72. size="small"
  73. clearable
  74. >
  75. <el-option
  76. v-for="item in dictionaryList['roadPlaneGeometry']"
  77. :label="item.dictName"
  78. :value="item.dictName"
  79. :key="item.id"
  80. ></el-option>
  81. </el-select>
  82. </template>
  83. <template slot="searchItem4">
  84. <span class="label">道路几何-纵断面</span>
  85. <el-select
  86. v-model="searchParams.roadGeometryVertical[0][1]"
  87. size="small"
  88. clearable
  89. >
  90. <el-option
  91. v-for="item in dictionaryList['roadProfileGeometry']"
  92. :label="item.dictName"
  93. :value="item.dictName"
  94. :key="item.id"
  95. ></el-option>
  96. </el-select>
  97. </template>
  98. <template slot="searchItem4">
  99. <span class="label">智能驾驶</span>
  100. <el-select
  101. v-model="searchParams.autoDriveFunction[0][1]"
  102. size="small"
  103. clearable
  104. >
  105. <el-option
  106. v-for="item in dictionaryList['supportedAdas']"
  107. :label="item.dictName"
  108. :value="item.dictName"
  109. :key="item.id"
  110. ></el-option>
  111. </el-select>
  112. </template>
  113. <template slot="searchItem5">
  114. <span class="label">运行区域</span>
  115. <el-select
  116. v-model="searchParams.operationArea[0][1]"
  117. size="small"
  118. clearable
  119. >
  120. <el-option
  121. v-for="item in dictionaryList['rodeSection']"
  122. :label="item.dictName"
  123. :value="item.dictName"
  124. :key="item.id"
  125. ></el-option>
  126. </el-select>
  127. </template>
  128. <!-- 复杂度 -->
  129. <template slot="searchItem5">
  130. <span class="label">复杂度</span>
  131. <el-input
  132. v-model="searchParams.minComplexity"
  133. size="small"
  134. clearable
  135. placeholder="请输入"
  136. maxlength="60"
  137. style="width: 100px"
  138. >
  139. </el-input>
  140. <span class="dateSeparator">至</span>
  141. <el-input
  142. v-model="searchParams.maxComplexity"
  143. size="small"
  144. clearable
  145. placeholder="请输入"
  146. maxlength="60"
  147. style="width: 100px"
  148. >
  149. </el-input>
  150. </template>
  151. <!-- 危险度 -->
  152. <template slot="searchItem6">
  153. <span class="label">危险度</span>
  154. <el-input
  155. v-model="searchParams.minRisk"
  156. size="small"
  157. clearable
  158. placeholder="请输入"
  159. maxlength="60"
  160. style="width: 100px"
  161. >
  162. </el-input>
  163. <span class="dateSeparator">至</span>
  164. <el-input
  165. v-model="searchParams.maxRisk"
  166. size="small"
  167. clearable
  168. placeholder="请输入"
  169. maxlength="60"
  170. style="width: 100px"
  171. >
  172. </el-input>
  173. </template>
  174. <template slot="searchItem6">
  175. <span class="label">复杂度等级</span>
  176. <el-select
  177. v-model="searchParams.complexityLevel"
  178. size="small"
  179. clearable
  180. >
  181. <el-option
  182. v-for="item in dictionaryList['complexityLevel']"
  183. :label="item.dictName"
  184. :value="item.dictName"
  185. :key="item.id"
  186. ></el-option>
  187. </el-select>
  188. </template>
  189. <template slot="searchItem7">
  190. <span class="label">危险度等级</span>
  191. <el-select v-model="searchParams.riskLevel" size="small" clearable>
  192. <el-option
  193. v-for="item in dictionaryList['riskLevel']"
  194. :label="item.dictName"
  195. :value="item.dictName"
  196. :key="item.id"
  197. ></el-option>
  198. </el-select>
  199. </template>
  200. <template slot="searchItem7">
  201. <span class="label">标签</span>
  202. <el-input
  203. v-model="searchParams.label"
  204. size="small"
  205. clearable
  206. placeholder="请输入"
  207. maxlength="60"
  208. >
  209. </el-input>
  210. </template>
  211. <template slot="searchItem8">
  212. <span class="label">场景描述</span>
  213. <el-input
  214. v-model="searchParams.sceneDescription"
  215. size="small"
  216. clearable
  217. placeholder="请输入"
  218. maxlength="60"
  219. >
  220. </el-input>
  221. </template>
  222. <template slot="searchBtn1">
  223. <el-button type="primary" @click="doSearch">查询</el-button>
  224. </template>
  225. <template slot="searchBtn2">
  226. <el-button type="primary" @click="doReset">重置</el-button>
  227. </template>
  228. <template slot="searchBtn2">
  229. <el-button type="primary" @click="benchmarkEditShow=true">筛选编辑</el-button>
  230. </template>
  231. </search-layout>
  232. <tableList
  233. ref="table"
  234. style="margin: 40px 30px 30px"
  235. :columns="columns"
  236. :getDataWay="getDataWay"
  237. :pagination="pagination"
  238. index
  239. indexFixed
  240. >
  241. <el-table-column
  242. label="操作"
  243. slot="cgInfos"
  244. align="center"
  245. width="180"
  246. fixed="right"
  247. >
  248. <template v-slot="scope">
  249. <span @click="viewRow(scope.row)" class="elIcon"> 查看 </span>
  250. <span @click="editHandle(scope.row)" class="elIcon"> 编辑 </span>
  251. <span @click="jumpScene(scope.row)" class="elIcon"> 场景评价 </span>
  252. </template>
  253. </el-table-column>
  254. </tableList>
  255. <el-dialog
  256. v-if="generalizationVisible"
  257. :visible.sync="generalizationVisible"
  258. :title="generalizationDiaTitle"
  259. width="90%"
  260. class="generalizationDia"
  261. :close-on-click-modal="false"
  262. :close-on-press-escape="false"
  263. :before-close="generalizationCancel"
  264. >
  265. <div>
  266. <generalization-detail
  267. ref="generalizationDetail"
  268. :disabled="true"
  269. :id="generalizationId"
  270. :genUrlType="1"
  271. ></generalization-detail>
  272. </div>
  273. </el-dialog>
  274. <!-- 查看视频弹窗 -->
  275. <el-dialog
  276. :title="videoDiaTitle"
  277. :visible.sync="dialogVisible"
  278. width="690px"
  279. :close-on-click-modal="false"
  280. :close-on-press-escape="false"
  281. :destroy-on-close="true"
  282. >
  283. <div class="videoBox">
  284. <video :src="videoSrc" controls></video>
  285. </div>
  286. </el-dialog>
  287. <!-- 编辑表格 -->
  288. <el-dialog
  289. title="编辑"
  290. :visible.sync="editVisible"
  291. width="780px"
  292. :close-on-click-modal="false"
  293. :close-on-press-escape="false"
  294. >
  295. <el-form
  296. ref="editInfo"
  297. :model="editInfo"
  298. label-width="150px"
  299. style="display: flex; flex-wrap: wrap; justify-content: space-between"
  300. >
  301. <el-form-item label="场景名称">
  302. <el-input v-model="editInfo.sceneName" :disabled="true"></el-input>
  303. </el-form-item>
  304. <el-form-item label="场景描述">
  305. <el-input v-model="editInfo.sceneDescription"></el-input>
  306. </el-form-item>
  307. <el-form-item label="主车动作">
  308. <el-select v-model="editInfo.mainBehavior">
  309. <el-option
  310. v-for="item in ['汇入']"
  311. :label="item"
  312. :value="item"
  313. :key="item"
  314. ></el-option>
  315. </el-select>
  316. </el-form-item>
  317. <el-form-item label="他车动作">
  318. <el-select v-model="editInfo.otherBehavior">
  319. <el-option
  320. v-for="item in ['直行']"
  321. :label="item"
  322. :value="item"
  323. :key="item"
  324. ></el-option>
  325. </el-select>
  326. </el-form-item>
  327. <el-form-item label="天气">
  328. <el-select v-model="editInfo.weather">
  329. <el-option
  330. v-for="item in ['晴']"
  331. :label="item"
  332. :value="item"
  333. :key="item"
  334. ></el-option
  335. ></el-select>
  336. </el-form-item>
  337. <el-form-item label="道路类型">
  338. <el-select v-model="editInfo.roadType">
  339. <el-option
  340. v-for="item in ['高速']"
  341. :label="item"
  342. :value="item"
  343. :key="item"
  344. ></el-option>
  345. </el-select>
  346. </el-form-item>
  347. <el-form-item label="道路几何-平面">
  348. <el-select v-model="editInfo.roadGeometryPlane">
  349. <el-option
  350. v-for="item in ['直道']"
  351. :label="item"
  352. :value="item"
  353. :key="item"
  354. ></el-option>
  355. </el-select>
  356. </el-form-item>
  357. <el-form-item label="道路几何-纵断面">
  358. <el-select v-model="editInfo.roadGeometryVertical">
  359. <el-option
  360. v-for="item in ['上坡']"
  361. :label="item"
  362. :value="item"
  363. :key="item"
  364. ></el-option>
  365. </el-select>
  366. </el-form-item>
  367. <el-form-item label="自动驾驶功能">
  368. <el-select v-model="editInfo.autoDriveFunction">
  369. <el-option
  370. v-for="item in ['ACC', 'AEB']"
  371. :label="item"
  372. :value="item"
  373. :key="item"
  374. ></el-option>
  375. </el-select>
  376. </el-form-item>
  377. <el-form-item label="运行区域">
  378. <el-select v-model="editInfo.operationArea">
  379. <el-option
  380. v-for="item in ['主路']"
  381. :label="item"
  382. :value="item"
  383. :key="item"
  384. ></el-option>
  385. </el-select>
  386. </el-form-item>
  387. <el-form-item label="标签">
  388. <el-input v-model="editInfo.label"></el-input>
  389. </el-form-item>
  390. </el-form>
  391. <div style="width: 100%; display: flex; justify-content: center">
  392. <el-button @click="editVisible = false">取消</el-button>
  393. <el-button type="primary" @click="editUpdate">更新</el-button>
  394. </div>
  395. </el-dialog>
  396. <benchmark-edit v-if="benchmarkEditShow" @closeHandle="editCloseHandle"></benchmark-edit>
  397. </div>
  398. </template>
  399. <script>
  400. import searchLayout from '@/components/grid/searchLayout'
  401. import tableList from '@/components/grid/TableList'
  402. import benchmarkEdit from './components/benchmarkEdit'
  403. import { mapState } from 'vuex'
  404. export default {
  405. name: 'benchmarkScenarioList', // 基准场景库
  406. components: { searchLayout, tableList,benchmarkEdit },
  407. data() {
  408. return {
  409. benchmarkEditShow:false,
  410. //搜索参数
  411. searchParams: {
  412. sceneName: '', // 场景名称
  413. share: '0',
  414. mainBehavior: [['mainBehavior', '']], // 主车动作
  415. otherBehavior: [['otherBehavior', '']],
  416. weather: [['weather', '']],
  417. roadType: [['roadType', '']],
  418. roadGeometryPlane: [['roadGeometryPlane', '']],
  419. roadGeometryVertical: [['roadGeometryVertical', '']],
  420. autoDriveFunction: [['autoDriveFunction', '']],
  421. operationArea: [['operationArea', '']],
  422. minComplexity: '',
  423. maxComplexity: '',
  424. minRisk: '',
  425. maxRisk: '',
  426. complexityLevel: '',
  427. riskLevel: '',
  428. sceneDescription: '',
  429. label: '',
  430. },
  431. // 编辑信息
  432. editVisible: false,
  433. // 编辑内容数据回填
  434. editInfo: {
  435. sceneName: '', //场景名称
  436. sceneDescription: '', // 场景描述
  437. mainBehavior: '', //主车动作
  438. weather: '', // 天气
  439. roadGeometryPlane: '', // 道路几何-平面
  440. autoDriveFunction: '', // 自动驾驶功能
  441. label: '', // 标签
  442. otherBehavior: '', // 他车动作
  443. roadType: '', // 道路类型
  444. roadGeometryVertical: '', // 道路几何-纵断面
  445. operationArea: '', // 运行区域
  446. },
  447. fileNameList: [
  448. {
  449. label: '汇入',
  450. value: '',
  451. },
  452. ],
  453. scenarioRoadTypeList: [],
  454. // scenarioWeatherList: [],
  455. props: {
  456. multiple: true,
  457. label: 'dictName',
  458. value: 'dictCode',
  459. },
  460. columns: [
  461. //表格列
  462. {
  463. label: '场景名称',
  464. prop: 'sceneName',
  465. fixed: 'left',
  466. },
  467. {
  468. label: '主车动作',
  469. prop: 'mainBehavior',
  470. },
  471. {
  472. label: '他车动作',
  473. prop: 'otherBehavior',
  474. },
  475. {
  476. label: '天气',
  477. prop: 'weather',
  478. },
  479. {
  480. label: '道路类型',
  481. prop: 'roadType',
  482. },
  483. {
  484. label: '道路几何-平面',
  485. prop: 'roadGeometryPlane',
  486. },
  487. {
  488. label: '道路几何-纵断面',
  489. prop: 'roadGeometryVertical',
  490. },
  491. {
  492. label: '支持智驾功能',
  493. prop: 'autoDriveFunction',
  494. },
  495. {
  496. label: '运行区域',
  497. prop: 'operationArea',
  498. },
  499. {
  500. label: '复杂度',
  501. prop: 'complexity',
  502. },
  503. {
  504. label: '复杂度等级',
  505. prop: 'complexityLevel',
  506. },
  507. {
  508. label: '危险度',
  509. prop: 'risk',
  510. },
  511. {
  512. label: '危险度等级',
  513. prop: 'riskLevel',
  514. },
  515. {
  516. label: '便签',
  517. prop: 'label',
  518. },
  519. {
  520. label: '场景描述',
  521. prop: 'sceneDescription',
  522. },
  523. {
  524. label: '操作',
  525. prop: 'cgInfos',
  526. template: true,
  527. },
  528. ],
  529. pagination: {
  530. //分页使用
  531. currentPage: 1,
  532. pageSize: 10,
  533. position: 'right',
  534. pageSizes: [10, 30, 50, 100, 200],
  535. layout: 'sizes, total, prev, pager, next, jumper',
  536. },
  537. getDataWay: {
  538. //加载表格数据
  539. dataType: 'url',
  540. type: 'post',
  541. data: this.$api.sceneLibrary.querybenchmarkList,
  542. param: {
  543. share: '0',
  544. },
  545. },
  546. generalizationVisible: false, // 泛化dialog
  547. generalizationId: '', // 泛化详情id
  548. generalizationDiaTitle: '',
  549. // 视频弹窗信息
  550. dialogVisible: false,
  551. autoplay: false,
  552. videoSrc: '',
  553. objectPath: '',
  554. videoDiaTitle: '',
  555. dictionaryList:{},
  556. }
  557. },
  558. computed: {
  559. ...mapState(['fileHost', 'fileUrl']),
  560. },
  561. methods: {
  562. // 编辑弹窗更新
  563. editUpdate() {
  564. this.$axios({
  565. method: 'post',
  566. url: this.$api.sceneLibrary.saveSceneReferenceById,
  567. data: {...this.editInfo},
  568. }).then(res=>{
  569. if(res.code ==200){
  570. this.editVisible = false
  571. this.$message.success("更新成功");
  572. }else{
  573. this.$message.error(res.message || "更新失败");
  574. }
  575. })
  576. },
  577. // 搜索查询
  578. doSearch() {
  579. this.searchParams.share = '0'
  580. const specialParams = [
  581. 'mainBehavior',
  582. 'otherBehavior',
  583. 'weather',
  584. 'roadType',
  585. 'roadGeometryPlane',
  586. 'roadGeometryVertical',
  587. 'autoDriveFunction',
  588. 'operationArea',
  589. ]
  590. const obj = JSON.parse(JSON.stringify(this.searchParams))
  591. Object.keys(obj).forEach((item) => {
  592. if(specialParams.includes(item)){
  593. if(!obj[item][0][1]){
  594. obj[item] = []
  595. }
  596. }
  597. })
  598. this.refreshList(obj)
  599. },
  600. //刷新table
  601. refreshList(param) {
  602. param
  603. ? this.$refs['table'].loadData(param)
  604. : this.$refs['table'].loadData()
  605. },
  606. doReset() {
  607. this.searchParams = {
  608. sceneName: '', // 场景名称
  609. share: '0',
  610. mainBehavior: [['mainBehavior', '']], // 主车动作
  611. otherBehavior: [['otherBehavior', '']],
  612. weather: [['weather', '']],
  613. roadType: [['roadType', '']],
  614. roadGeometryPlane: [['roadGeometryPlane', '']],
  615. roadGeometryVertical: [['roadGeometryVertical', '']],
  616. autoDriveFunction: [['autoDriveFunction', '']],
  617. operationArea: [['operationArea', '']],
  618. minComplexity: '',
  619. maxComplexity: '',
  620. minRisk: '',
  621. maxRisk: '',
  622. complexityLevel: '',
  623. riskLevel: '',
  624. sceneDescription: '',
  625. label: '',
  626. }
  627. this.doSearch()
  628. },
  629. pageControl(data) {
  630. this.activeName = data.name
  631. this.doSearch()
  632. },
  633. viewRow(row) {
  634. this.dialogVisible = true
  635. this.videoSrc = 'https://media.w3.org/2010/05/sintel/trailer.mp4'
  636. },
  637. // 编辑
  638. editHandle(e) {
  639. this.editInfo = JSON.parse(JSON.stringify(e))
  640. this.editVisible = true
  641. },
  642. // 跳转场景评价
  643. jumpScene(row) {
  644. this.$store.commit("getSceneId",row.sceneId);
  645. this.$router.push({
  646. path: '/sceneEvaluation',
  647. query:{id:row.sceneId}
  648. })
  649. },
  650. // 筛选项编辑关闭 -- 刷新筛选列表
  651. editCloseHandle(){
  652. this.benchmarkEditShow = false
  653. this.searchInit()
  654. },
  655. searchInit() {
  656. this.$axios({
  657. method: 'post',
  658. url: this.$api.common.getDictListsByTypes,
  659. data: { dictTypes: "egoAction,targetAction,sceneLibWeather,sceneLibrodeType,roadPlaneGeometry,roadProfileGeometry,supportedAdas,rodeSection,complexityLevel,riskLevel" },
  660. }).then((res) => {
  661. if (res.code == 200) {
  662. this.dictionaryList = res.info
  663. } else {
  664. this.$message.error(res.message || '查询失败')
  665. }
  666. })
  667. },
  668. },
  669. async mounted() {
  670. this.searchInit()
  671. },
  672. }
  673. </script>
  674. <style lang='less' scoped>
  675. @import './common/util.less';
  676. .generalizationScenarioListPanel {
  677. .inputBox {
  678. .label {
  679. min-width: 90px;
  680. }
  681. }
  682. .btnsPanel {
  683. text-align: right;
  684. }
  685. .generalizationDia {
  686. /deep/ .el-dialog__body {
  687. position: relative;
  688. padding: 20px 60px;
  689. .changeBtn {
  690. position: absolute;
  691. top: 20px;
  692. right: 60px;
  693. }
  694. }
  695. }
  696. }
  697. </style>