vehicleModel.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. <template>
  2. <div class="vehicleModelPanel">
  3. <model-list
  4. ref="modelList"
  5. class="modelList"
  6. @showInfo="showInfo"
  7. @addOne="addOne"
  8. @delOne="delOne"
  9. :getListApi="getListApi"
  10. :showName="showName"
  11. ></model-list>
  12. <div class="contentPanel">
  13. <el-form
  14. ref="form"
  15. :model="form"
  16. :rules="rules"
  17. label-width="160px"
  18. >
  19. <div class="inputBox flexBox">
  20. <span class="label">车辆ID</span>
  21. <div>{{ form.vehicleCode }}</div>
  22. </div>
  23. <div class="flexBox">
  24. <el-form-item label="车辆名称:" prop="vehicleName">
  25. <el-input
  26. placeholder="请输入"
  27. maxlength="60"
  28. v-autoTrim="{ obj: form, key: 'vehicleName' }"
  29. v-model="form.vehicleName"
  30. >
  31. </el-input>
  32. </el-form-item>
  33. <el-form-item label="车辆描述:" prop="description">
  34. <el-input
  35. v-autoTrim="{ obj: form, key: 'description' }"
  36. v-model="form.description"
  37. placeholder="请输入"
  38. maxlength="200"
  39. ></el-input>
  40. </el-form-item>
  41. <el-form-item label="车辆模型:" prop="modelLabel">
  42. <el-cascader
  43. ref="cascader"
  44. v-model="form.modelLabel"
  45. :options="modelLabelList"
  46. :props="props"
  47. @change="modelLabelChange"
  48. ></el-cascader>
  49. </el-form-item>
  50. <!-- <el-form-item label="车辆类型:" prop="vehicleType">
  51. <el-select v-model="form.vehicleType">
  52. <el-option
  53. v-for="item in vehicleTypeList"
  54. :label="item.caption"
  55. :value="item.code"
  56. :key="item.code"
  57. ></el-option>
  58. </el-select>
  59. </el-form-item> -->
  60. <!-- <el-form-item label="车辆型号:" prop="vehicleModel">
  61. <el-input
  62. placeholder="请输入"
  63. maxlength="60"
  64. v-autoTrim="{ obj: form, key: 'vehicleModel' }"
  65. v-model="form.vehicleModel"
  66. >
  67. </el-input>
  68. <el-select v-model="form.vehicleModel" disabled>
  69. <el-option
  70. v-for="item in vehicleModelList"
  71. :label="item.caption"
  72. :value="item.code"
  73. :key="item.code"
  74. ></el-option>
  75. </el-select>
  76. </el-form-item> -->
  77. <!-- <el-form-item label="车辆颜色:" prop="vehicleColour">
  78. <el-input
  79. placeholder="请输入"
  80. maxlength="60"
  81. v-autoTrim="{ obj: form, key: 'vehicleColour' }"
  82. v-model="form.vehicleColour"
  83. >
  84. </el-input>
  85. <el-select v-model="form.vehicleColour" disabled>
  86. <el-option
  87. v-for="item in vehicleColourList"
  88. :label="item.caption"
  89. :value="item.code"
  90. :key="item.code"
  91. ></el-option>
  92. </el-select>
  93. </el-form-item> -->
  94. </div>
  95. <div class="titlePanel">
  96. <div class="titlePanelBor">控制参数</div>
  97. </div>
  98. <div class="flexBox">
  99. <el-form-item label="最大速度(km/h):" prop="maxSpeed">
  100. <el-input
  101. placeholder="请输入"
  102. maxlength="15"
  103. v-autoTrim="{ obj: form, key: 'maxSpeed' }"
  104. v-model="form.maxSpeed"
  105. >
  106. </el-input>
  107. </el-form-item>
  108. <el-form-item label="发动机功率(kW):" prop="enginePower">
  109. <el-input
  110. placeholder="请输入"
  111. maxlength="15"
  112. v-autoTrim="{ obj: form, key: 'enginePower' }"
  113. v-model="form.enginePower"
  114. >
  115. </el-input>
  116. </el-form-item>
  117. <el-form-item
  118. label="最大减速度(m/s2):"
  119. prop="maxDeceleration"
  120. >
  121. <el-input
  122. placeholder="请输入"
  123. maxlength="15"
  124. v-autoTrim="{ obj: form, key: 'maxDeceleration' }"
  125. v-model="form.maxDeceleration"
  126. >
  127. </el-input>
  128. </el-form-item>
  129. <el-form-item
  130. label="最大转向角度(deg):"
  131. prop="maxSteeringAngle"
  132. >
  133. <el-input
  134. placeholder="请输入"
  135. maxlength="15"
  136. v-autoTrim="{ obj: form, key: 'maxSteeringAngle' }"
  137. v-model="form.maxSteeringAngle"
  138. >
  139. </el-input>
  140. </el-form-item>
  141. <el-form-item label="驱动方式:" prop="wheelDrive">
  142. <el-select v-model="form.wheelDrive">
  143. <el-option
  144. v-for="item in wheelDriveList"
  145. :label="item.caption"
  146. :value="item.code"
  147. :key="item.code"
  148. ></el-option>
  149. </el-select>
  150. </el-form-item>
  151. </div>
  152. <div class="titlePanel">
  153. <div class="titlePanelBor">效率参数</div>
  154. </div>
  155. <div class="flexBox">
  156. <el-form-item label="总效率:" prop="overallEfficiency">
  157. <el-input
  158. placeholder="请输入"
  159. maxlength="15"
  160. v-autoTrim="{ obj: form, key: 'overallEfficiency' }"
  161. v-model="form.overallEfficiency"
  162. >
  163. </el-input>
  164. </el-form-item>
  165. <el-form-item
  166. label="前表面有效面积(㎡):"
  167. prop="frontSurfaceEffective"
  168. >
  169. <el-input
  170. placeholder="请输入"
  171. maxlength="15"
  172. v-autoTrim="{
  173. obj: form,
  174. key: 'frontSurfaceEffective',
  175. }"
  176. v-model="form.frontSurfaceEffective"
  177. >
  178. </el-input>
  179. </el-form-item>
  180. <el-form-item
  181. label="空气阻力系数:"
  182. prop="airDragCoefficient"
  183. >
  184. <el-input
  185. placeholder="请输入"
  186. maxlength="15"
  187. v-autoTrim="{
  188. obj: form,
  189. key: 'airDragCoefficient',
  190. }"
  191. v-model="form.airDragCoefficient"
  192. >
  193. </el-input>
  194. </el-form-item>
  195. <el-form-item
  196. label="滚动阻力系数:"
  197. prop="rollingResistanceCoefficient"
  198. >
  199. <el-input
  200. placeholder="请输入"
  201. maxlength="15"
  202. v-autoTrim="{
  203. obj: form,
  204. key: 'rollingResistanceCoefficient',
  205. }"
  206. v-model="form.rollingResistanceCoefficient"
  207. >
  208. </el-input>
  209. </el-form-item>
  210. </div>
  211. <div class="titlePanel">
  212. <div class="titlePanelBor">几何参数</div>
  213. </div>
  214. <div class="flexBox">
  215. <el-form-item label="车轮直径(m):" prop="wheelDiameter">
  216. <el-input
  217. placeholder="请输入"
  218. maxlength="15"
  219. v-autoTrim="{ obj: form, key: 'wheelDiameter' }"
  220. v-model="form.wheelDiameter"
  221. >
  222. </el-input>
  223. </el-form-item>
  224. <el-form-item label="车前距(m):" prop="frontDistance">
  225. <el-input
  226. placeholder="请输入"
  227. maxlength="15"
  228. v-autoTrim="{ obj: form, key: 'frontDistance' }"
  229. v-model="form.frontDistance"
  230. >
  231. </el-input>
  232. </el-form-item>
  233. <el-form-item label="车后距(m):" prop="rearDistance">
  234. <el-input
  235. placeholder="请输入"
  236. maxlength="15"
  237. v-autoTrim="{ obj: form, key: 'rearDistance' }"
  238. v-model="form.rearDistance"
  239. >
  240. </el-input>
  241. </el-form-item>
  242. <el-form-item label="车左距(m):" prop="leftDistance">
  243. <el-input
  244. placeholder="请输入"
  245. maxlength="15"
  246. v-autoTrim="{ obj: form, key: 'leftDistance' }"
  247. v-model="form.leftDistance"
  248. >
  249. </el-input>
  250. </el-form-item>
  251. <el-form-item label="车右距(m):" prop="rightDistance">
  252. <el-input
  253. placeholder="请输入"
  254. maxlength="15"
  255. v-autoTrim="{ obj: form, key: 'rightDistance' }"
  256. v-model="form.rightDistance"
  257. >
  258. </el-input>
  259. </el-form-item>
  260. <el-form-item label="车高(m):" prop="heightDistance">
  261. <el-input
  262. placeholder="请输入"
  263. maxlength="15"
  264. v-autoTrim="{ obj: form, key: 'heightDistance' }"
  265. v-model="form.heightDistance"
  266. >
  267. </el-input>
  268. </el-form-item>
  269. <el-form-item label="轴距(m):" prop="wheelbase">
  270. <el-input
  271. placeholder="请输入"
  272. maxlength="15"
  273. v-autoTrim="{ obj: form, key: 'wheelbase' }"
  274. v-model="form.wheelbase"
  275. >
  276. </el-input>
  277. </el-form-item>
  278. <el-form-item label="质量(kg):" prop="mass">
  279. <el-input
  280. placeholder="请输入"
  281. maxlength="15"
  282. v-autoTrim="{ obj: form, key: 'mass' }"
  283. v-model="form.mass"
  284. >
  285. </el-input>
  286. </el-form-item>
  287. </div>
  288. <div class="titlePanel">
  289. <div class="titlePanelBor">3D视图</div>
  290. </div>
  291. <div class="modelBox">
  292. <img :src="modelImgSrc" width="100%" />
  293. </div>
  294. </el-form>
  295. <div class="btns">
  296. <!-- 新增和私有才能修改和保存 -->
  297. <!-- 私有才能分享 -->
  298. <!-- share有值 才能另存为 -->
  299. <el-button
  300. type="primary"
  301. v-show="form.share === '0' || form.share === ''"
  302. @click="save(false)"
  303. >保存</el-button
  304. >
  305. <el-button
  306. type="primary"
  307. v-show="form.share === '0'"
  308. @click="share"
  309. >分享</el-button
  310. >
  311. <el-button
  312. type="primary"
  313. v-show="form.share === '0' || form.share === '1'"
  314. @click="save(true)"
  315. >另存为</el-button
  316. >
  317. <el-button type="primary" plain @click="cancel">取消</el-button>
  318. </div>
  319. </div>
  320. </div>
  321. </template>
  322. <script>
  323. import modelList from "./components/modelList.vue";
  324. import { mapState } from "vuex";
  325. export default {
  326. name: "vehicleModel", // 车辆模型
  327. components: { modelList },
  328. data() {
  329. return {
  330. getListApi: this.$api.modelLibrary.getVehicleList, // 获取列表api
  331. showName: "vehicleName",
  332. typeList: [],
  333. // imgSrc: require("@/assets/common/image/car.png"),
  334. form: {
  335. vehicleCode: "", // 车辆ID
  336. vehicleName: "", // 车辆名称
  337. description: "", // 车辆描述
  338. // vehicleType: "", // 车辆类型
  339. // vehicleModel: "", // 车辆型号
  340. // vehicleColour: "", // 车辆颜色
  341. modelLabel: [], // 车辆模型
  342. maxSpeed: "", // 最大速度
  343. enginePower: "", // 发动机功率
  344. maxDeceleration: "", // 最大减速度
  345. maxSteeringAngle: "", // 最大转角
  346. wheelDrive: "", // 驱动方式
  347. overallEfficiency: "", // 总效率
  348. frontSurfaceEffective: "", // 前表面有效面积
  349. airDragCoefficient: "", // 空气阻力系数
  350. rollingResistanceCoefficient: "", // 滚动阻力系数
  351. wheelDiameter: "", // 车轮直径
  352. frontDistance: "", // 车前距
  353. rearDistance: "", // 车后距
  354. leftDistance: "", // 车左距
  355. rightDistance: "", // 车右距
  356. heightDistance: "", // 车高
  357. wheelbase: "", // 轴距
  358. mass: "", // 质量
  359. share: "", // 分享
  360. vehicleImage: "", // 对应的图片相对地址
  361. },
  362. vehicleTypeList: [],
  363. vehicleModelList: [],
  364. vehicleColourList: [],
  365. wheelDriveList: [],
  366. rules: {
  367. vehicleName: [
  368. { required: true, message: "请输入", trigger: "blur" },
  369. ],
  370. description: [
  371. { required: true, message: "请输入", trigger: "blur" },
  372. ],
  373. // vehicleModel: [
  374. // { required: true, message: "请输入", trigger: "blur" },
  375. // ],
  376. // vehicleColour: [
  377. // { required: true, message: "请输入", trigger: "blur" },
  378. // ],
  379. maxSpeed: [
  380. { required: true, message: "请输入", trigger: "blur" },
  381. ],
  382. enginePower: [
  383. { required: true, message: "请输入", trigger: "blur" },
  384. ],
  385. maxDeceleration: [
  386. { required: true, message: "请输入", trigger: "blur" },
  387. ],
  388. maxSteeringAngle: [
  389. { required: true, message: "请输入", trigger: "blur" },
  390. ],
  391. overallEfficiency: [
  392. { required: true, message: "请输入", trigger: "blur" },
  393. ],
  394. frontSurfaceEffective: [
  395. { required: true, message: "请输入", trigger: "blur" },
  396. ],
  397. airDragCoefficient: [
  398. { required: true, message: "请输入", trigger: "blur" },
  399. ],
  400. rollingResistanceCoefficient: [
  401. { required: true, message: "请输入", trigger: "blur" },
  402. ],
  403. wheelDiameter: [
  404. { required: true, message: "请输入", trigger: "blur" },
  405. ],
  406. frontDistance: [
  407. { required: true, message: "请输入", trigger: "blur" },
  408. ],
  409. rearDistance: [
  410. { required: true, message: "请输入", trigger: "blur" },
  411. ],
  412. leftDistance: [
  413. { required: true, message: "请输入", trigger: "blur" },
  414. ],
  415. rightDistance: [
  416. { required: true, message: "请输入", trigger: "blur" },
  417. ],
  418. heightDistance: [
  419. { required: true, message: "请输入", trigger: "blur" },
  420. ],
  421. wheelbase: [
  422. { required: true, message: "请输入", trigger: "blur" },
  423. ],
  424. mass: [{ required: true, message: "请输入", trigger: "blur" }],
  425. // vehicleType: [
  426. // { required: true, message: "请选择", trigger: "change" },
  427. // ],
  428. wheelDrive: [
  429. { required: true, message: "请选择", trigger: "change" },
  430. ],
  431. modelLabel: [
  432. { required: true, message: "请选择", trigger: "change" },
  433. ],
  434. },
  435. props: {
  436. multiple: false,
  437. label: "dictName",
  438. value: "dictCode",
  439. },
  440. modelLabelList: [],
  441. modelImgSrc: "",
  442. };
  443. },
  444. computed: {
  445. ...mapState(["fileHost", "fileUrl"]),
  446. },
  447. methods: {
  448. showInfo(id) {
  449. this.$axios({
  450. method: "post",
  451. url: this.$api.modelLibrary.getVehicleInfo,
  452. data: {
  453. id,
  454. },
  455. }).then((res) => {
  456. if (res.code == 200 && res.info) {
  457. this.$refs.form.clearValidate();
  458. this.form = res.info;
  459. this.modelImgSrc = this.getImgUrl(res.info.vehicleImage);
  460. } else {
  461. this.$message.error(res.message || "获取失败");
  462. }
  463. });
  464. },
  465. save(isAdd) {
  466. // console.log(this.form);
  467. this.$refs.form.validate((valid) => {
  468. if (valid) {
  469. // 判断是否新增
  470. if (isAdd || this.form.share === "") {
  471. this.form.id = "";
  472. }
  473. this.$axios({
  474. method: "post",
  475. url: this.$api.modelLibrary.saveVehicle,
  476. data: {
  477. ...this.form,
  478. },
  479. }).then((res) => {
  480. if (res.code == 200 && res.info) {
  481. this.form.id = res.info.id;
  482. this.form.share = res.info.share;
  483. this.$message.success("保存成功");
  484. this.$refs.modelList.getList();
  485. } else {
  486. this.$message.error(res.message || "保存失败");
  487. }
  488. });
  489. }
  490. });
  491. },
  492. addOne() {
  493. this.$refs.form.resetFields();
  494. this.form.vehicleCode = "";
  495. this.form.vehicleImage = "";
  496. this.form.share = "";
  497. this.form.id = "";
  498. this.modelImgSrc = "";
  499. },
  500. delOne(id) {
  501. this.$axios({
  502. method: "post",
  503. url: this.$api.modelLibrary.delVehicleById,
  504. data: {
  505. id,
  506. },
  507. }).then((res) => {
  508. if (res.code == 200) {
  509. this.$message.success("删除成功");
  510. this.$refs.modelList.getList();
  511. } else {
  512. this.$message.error(res.message || "删除失败");
  513. }
  514. });
  515. },
  516. share() {
  517. this.$axios({
  518. method: "post",
  519. url: this.$api.modelLibrary.shareVehicle,
  520. data: {
  521. ...this.form,
  522. },
  523. }).then((res) => {
  524. if (res.code == 200) {
  525. this.$message.success("分享成功");
  526. this.$refs.modelList.getList();
  527. } else {
  528. this.$message.error(res.message || "分享失败");
  529. }
  530. });
  531. },
  532. cancel() {
  533. if (this.form.id) {
  534. // 取消时有id则重新请求表单
  535. this.showInfo(this.form.id);
  536. } else {
  537. // 清空
  538. this.addOne();
  539. }
  540. },
  541. getImgUrl(addr) {
  542. let url = "";
  543. if (process.env.VUE_APP_IS_DEV == "true") {
  544. url = this.fileHost + this.fileUrl;
  545. } else {
  546. url = this.fileUrl;
  547. }
  548. let token = localStorage.getItem("Authorization").split(" ")[1];
  549. let src = `${url}?objectName=${addr}&access_token=${token}`;
  550. return src;
  551. },
  552. modelLabelChange() {
  553. let remark =
  554. this.$refs.cascader.getCheckedNodes(true)[0].data.remark;
  555. this.form.vehicleImage = remark;
  556. this.modelImgSrc = this.getImgUrl(remark);
  557. },
  558. async getModelLabelList() {
  559. await this.$axios({
  560. method: "post",
  561. url: this.$api.common.getDictTreesByTypes,
  562. data: {
  563. dictTypes: "modelLabel",
  564. },
  565. }).then((res) => {
  566. if (res.code == 200 && res.info) {
  567. this.modelLabelList = res.info.modelLabel;
  568. } else {
  569. this.$message.error(res.message || "获取车辆模型列表失败");
  570. }
  571. });
  572. },
  573. },
  574. async mounted() {
  575. await this.$dicsListsInit({
  576. vehicleTypeList: "vehicleType",
  577. wheelDriveList: "driveType",
  578. });
  579. this.getModelLabelList();
  580. },
  581. };
  582. </script>
  583. <style lang='less' scoped>
  584. .vehicleModelPanel {
  585. display: flex;
  586. flex: 1;
  587. padding: 15px 30px 30px;
  588. .modelList /deep/ .listPanel {
  589. min-height: 400px;
  590. height: calc(100vh - 120px);
  591. }
  592. .contentPanel {
  593. flex: 1;
  594. padding-left: 30px;
  595. }
  596. .inputBox.flexBox {
  597. margin-bottom: 22px;
  598. .label {
  599. width: 138px;
  600. }
  601. div {
  602. line-height: 32px;
  603. }
  604. }
  605. .titlePanel {
  606. padding: 22px 0;
  607. }
  608. .btns {
  609. padding-top: 30px;
  610. text-align: center;
  611. }
  612. .modelBox {
  613. width: 60%;
  614. min-width: 810px;
  615. }
  616. }
  617. </style>