vehicleConfigurationDetail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. <template>
  2. <div class="vehicleConfigurationDetailPanel">
  3. <el-form ref="form" :model="form" :rules="rules" label-width="108px">
  4. <div class="inputBox flexBox">
  5. <span class="label">配置ID</span>
  6. <div>{{ form.configCode }}</div>
  7. </div>
  8. <div class="flexBox headBox">
  9. <el-form-item label="配置名称:" prop="configName">
  10. <el-input
  11. placeholder="请输入"
  12. maxlength="60"
  13. v-autoTrim="{ obj: form, key: 'configName' }"
  14. v-model="form.configName"
  15. >
  16. </el-input>
  17. </el-form-item>
  18. <el-form-item label="配置描述:" prop="configDescription">
  19. <el-input
  20. placeholder="请输入"
  21. maxlength="200"
  22. v-autoTrim="{ obj: form, key: 'configDescription' }"
  23. v-model="form.configDescription"
  24. >
  25. </el-input>
  26. </el-form-item>
  27. <!-- <el-form-item label="车辆名称:" prop="vehicleName">
  28. <el-select
  29. v-model="form.vehicleName"
  30. @change="vehicleChange"
  31. >
  32. <el-option
  33. v-for="item in vehicleNameList"
  34. :label="item.vehicleName"
  35. :value="item.id"
  36. :key="item.id"
  37. ></el-option>
  38. </el-select>
  39. </el-form-item> -->
  40. <el-form-item label="车辆名称:" prop="vehicleId">
  41. <el-select v-model="form.vehicleId" @change="vehicleChange">
  42. <el-option
  43. v-for="item in vehicleNameList"
  44. :label="item.vehicleName"
  45. :value="item.id"
  46. :key="item.id"
  47. ></el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item label="车辆描述:" prop="vehicleDescription">
  51. <el-input
  52. placeholder="请输入"
  53. maxlength="200"
  54. v-autoTrim="{ obj: form, key: 'vehicleDescription' }"
  55. v-model="form.vehicleDescription"
  56. disabled
  57. >
  58. </el-input>
  59. </el-form-item>
  60. </div>
  61. </el-form>
  62. <div class="contentBox">
  63. <div>
  64. <handle-config-list
  65. @curItem="curItem"
  66. @addOne="addOne"
  67. @delOne="delOne"
  68. :configList="configList"
  69. :curOne="curOne"
  70. ></handle-config-list>
  71. </div>
  72. <div
  73. class="model"
  74. v-bind:style="{ width: width + 'px', height: width / 2 + 'px' }"
  75. >
  76. <img :src="modelImgSrc" width="100%" />
  77. <!-- <canvas-sensor></canvas-sensor> -->
  78. </div>
  79. <div class="conditions">
  80. <div class="btnBox">
  81. <el-button type="primary" @click="saveConfig"
  82. >保存设置</el-button
  83. >
  84. </div>
  85. <el-form
  86. ref="formA"
  87. :model="formA"
  88. :rules="rulesA"
  89. label-width="108px"
  90. >
  91. <div class="forms">
  92. <el-form-item label="X(M):" prop="sensorX">
  93. <el-input
  94. placeholder="请输入"
  95. maxlength="10"
  96. v-autoTrim="{ obj: formA, key: 'sensorX' }"
  97. v-model="formA.sensorX"
  98. >
  99. </el-input>
  100. </el-form-item>
  101. <el-form-item label="Y(M):" prop="sensorY">
  102. <el-input
  103. placeholder="请输入"
  104. maxlength="10"
  105. v-autoTrim="{ obj: formA, key: 'sensorY' }"
  106. v-model="formA.sensorY"
  107. >
  108. </el-input>
  109. </el-form-item>
  110. <el-form-item label="Z(M):" prop="sensorZ">
  111. <el-input
  112. placeholder="请输入"
  113. maxlength="10"
  114. v-autoTrim="{ obj: formA, key: 'sensorZ' }"
  115. v-model="formA.sensorZ"
  116. >
  117. </el-input>
  118. </el-form-item>
  119. <el-form-item label="横摆角(deg):" prop="sensorH">
  120. <el-input
  121. placeholder="请输入"
  122. maxlength="10"
  123. v-autoTrim="{ obj: formA, key: 'sensorH' }"
  124. v-model="formA.sensorH"
  125. >
  126. </el-input>
  127. </el-form-item>
  128. <el-form-item label="俯仰角(deg):" prop="sensorP">
  129. <el-input
  130. placeholder="请输入"
  131. maxlength="10"
  132. v-autoTrim="{ obj: formA, key: 'sensorP' }"
  133. v-model="formA.sensorP"
  134. >
  135. </el-input>
  136. </el-form-item>
  137. <el-form-item label="翻滚角(deg):" prop="sensorR">
  138. <el-input
  139. placeholder="请输入"
  140. maxlength="10"
  141. v-autoTrim="{ obj: formA, key: 'sensorR' }"
  142. v-model="formA.sensorR"
  143. >
  144. </el-input>
  145. </el-form-item>
  146. <el-form-item
  147. label="端口"
  148. prop="sensorPort"
  149. v-show="curOne.name === 'ogt'"
  150. >
  151. <el-input
  152. placeholder="请输入"
  153. maxlength="10"
  154. v-autoTrim="{ obj: formA, key: 'sensorPort' }"
  155. v-model="formA.sensorPort"
  156. >
  157. </el-input>
  158. </el-form-item>
  159. </div>
  160. </el-form>
  161. </div>
  162. </div>
  163. <div class="btns">
  164. <el-button
  165. v-if="form.share === '0' || form.share === ''"
  166. type="primary"
  167. @click="save(false)"
  168. >保存</el-button
  169. >
  170. <el-button
  171. v-if="form.share === '0' || form.share === '1'"
  172. type="primary"
  173. @click="save(true)"
  174. >另存为</el-button
  175. >
  176. <el-button type="primary" plain @click="cancel">取消</el-button>
  177. </div>
  178. </div>
  179. </template>
  180. <script>
  181. import handleConfigList from "./components/handleConfigList.vue";
  182. import canvasSensor from "./components/canvasSensor.vue";
  183. import { mapState } from "vuex";
  184. export default {
  185. name: "vehicleConfigurationDetail", // 车辆配置详情
  186. components: { handleConfigList, canvasSensor },
  187. data() {
  188. let validateNum = (rule, value, callback) => {
  189. // !/^(-?\d+)(\.\d{1,2})?$/.test(value) &&
  190. // !(/^(-?(0|[1-9][0-9]+))(\.\d{1,2})?$/.test(value)) &&
  191. !/^(-?(0|[1-9]+))[(\.\d{1,2})]?$/.test(value) &&
  192. callback(new Error(rule.message));
  193. callback();
  194. };
  195. return {
  196. vehicleNameList: [],
  197. form: {
  198. id: "",
  199. configCode: "", // 配置ID
  200. configName: "", // 配置名称
  201. configDescription: "", // 配置描述
  202. vehicleName: "", // 车辆名称
  203. vehicleId: "", // 车辆名称
  204. vehicleDescription: "", // 车辆描述
  205. share: "",
  206. },
  207. formA: {
  208. sensorX: "", // 传感器横向偏移量(x轴)
  209. sensorY: "", // 传感器横向偏移量(y轴)
  210. sensorZ: "", // 传感器横向偏移量(z轴)
  211. sensorH: "", // 横摆角
  212. sensorP: "", // 俯仰角
  213. sensorR: "", // 横滚角
  214. sensorPort: "", // 端口
  215. },
  216. rules: {
  217. configName: [
  218. { required: true, message: "请输入", trigger: "blur" },
  219. ],
  220. configDescription: [
  221. { required: true, message: "请输入", trigger: "blur" },
  222. ],
  223. vehicleId: [
  224. {
  225. required: true,
  226. message: "请选择",
  227. trigger: "change",
  228. },
  229. ],
  230. vehicleDescription: [
  231. { required: true, message: "请输入", trigger: "blur" },
  232. ],
  233. },
  234. rulesA: {
  235. sensorX: [
  236. {
  237. required: true,
  238. message: "请输入",
  239. trigger: "blur",
  240. },
  241. {
  242. validator: validateNum,
  243. message: "请输入最多带有2位小数的数字",
  244. trigger: ["blur"],
  245. },
  246. ],
  247. sensorY: [
  248. {
  249. required: true,
  250. message: "请输入",
  251. trigger: "blur",
  252. },
  253. {
  254. validator: validateNum,
  255. message: "请输入最多带有2位小数的数字",
  256. trigger: ["blur"],
  257. },
  258. ],
  259. sensorZ: [
  260. {
  261. required: true,
  262. message: "请输入",
  263. trigger: "blur",
  264. },
  265. {
  266. validator: validateNum,
  267. message: "请输入最多带有2位小数的数字",
  268. trigger: ["blur"],
  269. },
  270. ],
  271. sensorH: [
  272. { required: true, message: "请输入", trigger: "blur" },
  273. ],
  274. sensorP: [
  275. { required: true, message: "请输入", trigger: "blur" },
  276. ],
  277. sensorR: [
  278. { required: true, message: "请输入", trigger: "blur" },
  279. ],
  280. sensorPort: [
  281. { required: false, message: "请输入", trigger: "blur" },
  282. ],
  283. },
  284. // 传感器对象集合
  285. configList: {
  286. camera: [],
  287. ogt: [],
  288. lidar: [],
  289. gps: [],
  290. },
  291. // 用于当前选中项的展示
  292. curOne: {
  293. name: "",
  294. index: -1,
  295. },
  296. modelImgSrc: require("@/assets/common/image/others/carTopView.png"),
  297. canDraw: false,
  298. width: 300,
  299. };
  300. },
  301. watch: {
  302. curOne(val) {
  303. if (val.name === "ogt") {
  304. this.rulesA.sensorPort[0].required = true;
  305. } else {
  306. this.rulesA.sensorPort[0].required = false;
  307. }
  308. },
  309. },
  310. computed: {
  311. ...mapState(["fileHost", "fileUrl"]),
  312. },
  313. methods: {
  314. // 获取车辆名称私有下拉列表
  315. async getMyVehicleList() {
  316. await this.$axios({
  317. method: "post",
  318. url: this.$api.modelLibrary.getMyVehicleList,
  319. data: {},
  320. }).then((res) => {
  321. if (res.code == 200 && res.info) {
  322. this.vehicleNameList = res.info;
  323. } else {
  324. this.$message.error(res.message || "获取信息失败");
  325. }
  326. });
  327. },
  328. getImgUrl(addr) {
  329. let url = "";
  330. if (process.env.VUE_APP_IS_DEV == "true") {
  331. url = this.fileHost + this.fileUrl;
  332. } else {
  333. url = this.fileUrl;
  334. }
  335. let token = localStorage.getItem("Authorization").split(" ")[1];
  336. let src = `${url}?objectName=${addr}&access_token=${token}`;
  337. return src;
  338. },
  339. vehicleChange(id) {
  340. let item = this.vehicleNameList.find((i) => i.id == id);
  341. this.form.vehicleDescription = item.description;
  342. this.modelImgSrc = this.getImgUrl(item.vehicleImage);
  343. },
  344. // 验证各传感器数组的每一项表单数据是否齐全
  345. validateSensorsList() {
  346. // console.log(Object.keys(this.configList));
  347. // console.log(Object.values(this.configList));
  348. // console.log(Object.entries(this.configList));
  349. let lists = Object.values(this.configList);
  350. },
  351. save(isAdd) {
  352. this.$refs.form.validate((valid) => {
  353. if (valid) {
  354. if (isAdd) {
  355. this.form.id = "";
  356. }
  357. // if(!validateSensorsList) return;
  358. // console.log(this.configList);
  359. // console.log(Object.keys(this.configList));
  360. // console.log(Object.values(this.configList));
  361. // console.log(Object.entries(this.configList));
  362. // this.curOne = {
  363. // name: "gps",
  364. // index: 0,
  365. // };
  366. // return;
  367. let data = Object.assign({}, this.form, {
  368. configSensors: this.configList,
  369. });
  370. this.$axios({
  371. method: "post",
  372. url: this.$api.modelLibrary.saveConfig,
  373. data,
  374. }).then((res) => {
  375. if (res.code == 200) {
  376. this.$message.success("保存成功");
  377. this.cancel();
  378. } else {
  379. this.$message.error(res.message || "保存失败");
  380. }
  381. });
  382. }
  383. });
  384. },
  385. /**
  386. * info 新增传感器信息
  387. * type 传感器类型
  388. */
  389. addOne(info, type) {
  390. // 如果列表里没有对应类型的数组则需手动添加
  391. if (!this.configList[type]) {
  392. this.configList[type] = [];
  393. }
  394. //若直接传info即this.form,可能是由于传入了响应式,造成数据会变动
  395. this.configList[type].unshift({ ...info });
  396. },
  397. delOne(type, index) {
  398. this.configList[type].splice(index, 1);
  399. },
  400. curItem(item, isAdd) {
  401. this.$refs.formA.resetFields();
  402. this.curOne = item;
  403. if (isAdd) {
  404. this.formA.sensorX = "0";
  405. this.formA.sensorY = "0";
  406. this.formA.sensorZ = "0";
  407. this.formA.sensorH = "0";
  408. this.formA.sensorP = "0";
  409. this.formA.sensorR = "0";
  410. if (this.curOne.name === "ogt") {
  411. this.formA.sensorPort = "62001";
  412. }
  413. } else {
  414. Object.assign(
  415. this.formA,
  416. this.configList[item.name][item.index]
  417. );
  418. }
  419. },
  420. saveConfig() {
  421. if (this.curOne.index < 0) {
  422. this.$message.info("请先选择传感器");
  423. return;
  424. }
  425. this.$refs.formA.validate((valid) => {
  426. if (valid) {
  427. Object.assign(
  428. this.configList[this.curOne.name][this.curOne.index],
  429. this.formA
  430. );
  431. this.$message.success("保存设置成功");
  432. }
  433. });
  434. },
  435. cancel() {
  436. this.$router.replace({ path: "/vehicleConfigurationList" });
  437. },
  438. domHandle() {
  439. $(document).ready(() => {
  440. this.width = $(
  441. ".vehicleConfigurationDetailPanel .model"
  442. ).outerWidth();
  443. this.canDraw = true;
  444. console.log(
  445. $(".vehicleConfigurationDetailPanel .model").width()
  446. );
  447. // console.log($('.vehicleConfigurationDetailPanel .model').outerWidth());
  448. });
  449. },
  450. },
  451. mounted() {
  452. setTimeout(() => {
  453. this.domHandle();
  454. }, 0);
  455. this.getMyVehicleList();
  456. if (this.$route.query.id) {
  457. let id = "";
  458. this.form.id = id = this.$route.query.id;
  459. this.form.share = this.$route.query.share;
  460. if (id) {
  461. this.$axios({
  462. method: "post",
  463. url: this.$api.modelLibrary.getConfigInfo,
  464. data: {
  465. id,
  466. },
  467. }).then((res) => {
  468. if (res.code == 200 && res.info) {
  469. this.form = res.info;
  470. this.configList = res.info.configSensors;
  471. this.modelImgSrc = this.getImgUrl(
  472. res.info.vehicleImage
  473. );
  474. this.validateSensorsList();
  475. } else {
  476. this.$message.error(res.message || "获取信息失败");
  477. }
  478. });
  479. }
  480. }
  481. },
  482. };
  483. </script>
  484. <style lang='less' scoped>
  485. .vehicleConfigurationDetailPanel {
  486. margin: 55px 50px 0;
  487. }
  488. .headBox {
  489. .el-form-item {
  490. margin-right: 20px;
  491. }
  492. }
  493. .inputBox.flexBox {
  494. margin-bottom: 22px;
  495. .label {
  496. width: 88px;
  497. }
  498. div {
  499. line-height: 32px;
  500. }
  501. }
  502. .contentBox {
  503. display: flex;
  504. justify-content: space-between;
  505. margin-top: 30px;
  506. .model {
  507. // width: 400px;
  508. flex: 1;
  509. margin: 0 10%;
  510. }
  511. .conditions {
  512. .btnBox {
  513. padding: 0 0 30px;
  514. }
  515. .forms /deep/ .el-form-item__label {
  516. width: 120px !important;
  517. }
  518. .forms /deep/ .el-form-item__content {
  519. margin-left: 120px !important;
  520. }
  521. }
  522. }
  523. .btns {
  524. padding-top: 30px;
  525. text-align: center;
  526. }
  527. </style>