manualRunProjectDetail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <template>
  2. <div>
  3. <el-form
  4. ref="form"
  5. :model="form"
  6. :rules="rules"
  7. label-width="120px"
  8. class="flexBox"
  9. >
  10. <div class="formItemBox">
  11. <el-form-item label="项目名称:" prop="projectName">
  12. <el-input
  13. placeholder="请输入"
  14. maxlength="30"
  15. v-autoTrim="{ obj: form, key: 'projectName' }"
  16. v-model="form.projectName"
  17. >
  18. </el-input>
  19. </el-form-item>
  20. <el-form-item label="项目描述:" prop="projectDescribe">
  21. <el-input
  22. type="textarea"
  23. :autosize="{ minRows: 4, maxRows: 4 }"
  24. placeholder="请输入"
  25. maxlength="300"
  26. v-autoTrim="{ obj: form, key: 'projectDescribe' }"
  27. v-model="form.projectDescribe"
  28. >
  29. </el-input>
  30. </el-form-item>
  31. <el-form-item label="选择算法:" prop="algorithm">
  32. <el-select v-model="form.algorithm">
  33. <el-option
  34. v-for="item in algorithmList"
  35. :label="item.name"
  36. :value="item.id"
  37. :key="item.id"
  38. ></el-option>
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="选择车辆:" prop="vehicle">
  42. <el-select v-model="form.vehicle">
  43. <el-option
  44. v-for="item in vehicleList"
  45. :label="item.name"
  46. :value="item.id"
  47. :key="item.id"
  48. ></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="选择场景:" prop="scene">
  52. <el-select v-model="form.scene" @change="sceneSelChange">
  53. <el-option
  54. v-for="item in sceneList"
  55. :label="item.name"
  56. :value="item.id"
  57. :key="item.id"
  58. ></el-option>
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item label="并行度:" prop="parallelism">
  62. <el-input
  63. placeholder="请输入"
  64. maxlength="100"
  65. v-autoTrim="{ obj: form, key: 'parallelism' }"
  66. v-model="form.parallelism"
  67. >
  68. </el-input>
  69. </el-form-item>
  70. <el-form-item label="最大仿真时间:" prop="maxSimulationTime">
  71. <el-input
  72. placeholder="请输入"
  73. maxlength="100"
  74. v-autoTrim="{ obj: form, key: 'maxSimulationTime' }"
  75. v-model="form.maxSimulationTime"
  76. >
  77. </el-input>
  78. </el-form-item>
  79. <el-form-item label="是否选择GPU:" prop="isChoiceGpu">
  80. <el-radio v-model="form.isChoiceGpu" label="0">是</el-radio>
  81. <el-radio v-model="form.isChoiceGpu" label="1">否</el-radio>
  82. </el-form-item>
  83. </div>
  84. <div class="tipBox">
  85. <div class="tip tipA">
  86. (传感器1:根据车辆自动带出;传感器2:根据车辆自动带出)
  87. </div>
  88. <div class="tip">(场景数量:{{ sceneCount }})</div>
  89. <!-- <div class="tip flexBox">
  90. <div>(下次运行时间:XX时XX分XX秒)</div>
  91. <div class="tipBtnBox">
  92. <el-button type="primary">规则查看</el-button>
  93. </div>
  94. </div> -->
  95. <div class="tip">(最多可用资源{{ maxCount }})</div>
  96. <div class="tip">(最小是5,最大是60)</div>
  97. </div>
  98. </el-form>
  99. <div class="btns">
  100. <el-button type="primary" @click="save(false)">保存</el-button>
  101. <el-button
  102. type="primary"
  103. @click="save(true)"
  104. v-if="this.$route.query.formData"
  105. >另存为</el-button
  106. >
  107. <el-button type="primary" @click="save(false, true)"
  108. >提交</el-button
  109. >
  110. <el-button type="primary" plain @click="cancel">取消</el-button>
  111. </div>
  112. </div>
  113. </template>
  114. <script>
  115. //import from '';
  116. let maxCount = 0; // 用于校验
  117. export default {
  118. name: "manualRunProjectDetail", // 手动运行项目详情
  119. components: {},
  120. data() {
  121. let validateNum = (rule, value, callback) => {
  122. !/^(\d+)$/.test(value) && callback(new Error(rule.message));
  123. if (value > maxCount) callback(new Error(rule.message));
  124. callback();
  125. };
  126. let validateNumA = (rule, value, callback) => {
  127. !/^(\d+)$/.test(value) && callback(new Error(rule.message));
  128. if (value < 5 || value > 60) callback(new Error(rule.message));
  129. callback();
  130. };
  131. return {
  132. form: {
  133. id: "",
  134. projectName: "", // 项目名称
  135. projectDescribe: "", // 项目描述
  136. algorithm: "", // 选择算法
  137. vehicle: "", // 选择车辆
  138. scene: "", // 选择场景
  139. parallelism: "", // 并行度
  140. maxSimulationTime: "", // 最大仿真时间
  141. isChoiceGpu: "0", // 是否选择GPU
  142. nowRunState: "10", // 运行状态
  143. },
  144. algorithmList: [],
  145. vehicleList: [],
  146. sceneList: [],
  147. maxCount: 0, // 最多可用资源
  148. sceneCount: 0, // 场景数量
  149. rules: {
  150. projectName: [
  151. { required: true, message: "请输入", trigger: "blur" },
  152. ],
  153. projectDescribe: [
  154. { required: true, message: "请输入", trigger: "blur" },
  155. ],
  156. algorithm: [
  157. { required: true, message: "请选择", trigger: "change" },
  158. ],
  159. vehicle: [
  160. { required: true, message: "请选择", trigger: "change" },
  161. ],
  162. scene: [
  163. { required: true, message: "请选择", trigger: "change" },
  164. ],
  165. parallelism: [
  166. { required: true, message: "请输入", trigger: "blur" },
  167. {
  168. validator: validateNum,
  169. message: "请输入不大于最多可用资源的正整数",
  170. trigger: ["blur"],
  171. },
  172. ],
  173. maxSimulationTime: [
  174. { required: true, message: "请输入", trigger: "blur" },
  175. {
  176. validator: validateNumA,
  177. message: "请输入不小于5且不大于60的正整数",
  178. trigger: ["blur"],
  179. },
  180. ],
  181. isChoiceGpu: [
  182. { required: true, message: "请选择", trigger: "change" },
  183. ],
  184. },
  185. };
  186. },
  187. computed: {},
  188. methods: {
  189. getLists() {
  190. this.$axios({
  191. method: "post",
  192. url: this.$api.workManagement.selectDropDownByType,
  193. data: {
  194. dropDownType: "",
  195. },
  196. }).then((res) => {
  197. if (res.code == 200 && res.info) {
  198. res.info.forEach((item) => {
  199. if (item.type === "1") {
  200. this.algorithmList = item.dropDownList;
  201. } else if (item.type === "2") {
  202. this.vehicleList = item.dropDownList;
  203. } else if (item.type === "3") {
  204. this.sceneList = item.dropDownList;
  205. }
  206. });
  207. } else {
  208. this.$message.error(res.message || "获取信息失败");
  209. }
  210. });
  211. },
  212. getMaxSimulationTime() {
  213. this.$axios({
  214. method: "post",
  215. url: this.$api.workManagement.selectMaxParallelism,
  216. data: {},
  217. }).then((res) => {
  218. if (res.code == 200 && res.info) {
  219. this.maxCount = maxCount = res.info;
  220. } else if (res.code == 200 && res.info == 0) {
  221. this.maxCount = maxCount = 0;
  222. } else {
  223. this.$message.error(res.message || "获取信息失败");
  224. }
  225. });
  226. },
  227. sceneSelChange(item) {
  228. this.sceneCount = this.sceneList.find(
  229. (i) => i.id === item
  230. ).sceneNum;
  231. },
  232. save(isAdd = false, needChange = false) {
  233. // isAdd是否强制新增,needChange是否需要改变状态
  234. this.$refs.form.validate((valid) => {
  235. if (valid) {
  236. if (isAdd) {
  237. // 另存为
  238. this.form.id = "";
  239. }
  240. this.form.nowRunState = "10";
  241. this.$axios({
  242. method: "post",
  243. url: this.$api.workManagement.addOrUpdateProject,
  244. data: {
  245. ...this.form,
  246. },
  247. }).then((res) => {
  248. if (res.code == 200) {
  249. this.$message.success("保存成功");
  250. if (needChange) {
  251. this.stateChange();
  252. } else {
  253. this.cancel();
  254. }
  255. } else {
  256. this.$message.error(res.message || "保存失败");
  257. }
  258. });
  259. }
  260. });
  261. },
  262. cancel() {
  263. this.$router.replace({ path: "/manualRunProjectList" });
  264. },
  265. stateChange() {
  266. this.$axios({
  267. method: "post",
  268. url: this.$api.workManagement.updateProjectNowRunState,
  269. data: {
  270. id: this.form.id,
  271. nowRunState: "20",
  272. },
  273. }).then((res) => {
  274. if (res.code == 200) {
  275. this.$message.success("提交成功");
  276. this.cancel();
  277. } else {
  278. this.$message.error(res.message || "提交失败");
  279. }
  280. });
  281. },
  282. },
  283. mounted() {
  284. /* this.getLists();
  285. this.getMaxSimulationTime(); */
  286. if (this.$route.query.formData) {
  287. let id = "";
  288. this.form.id = id = this.$route.query.formData.id;
  289. if (id) {
  290. this.$axios({
  291. method: "post",
  292. url: this.$api.workManagement.selectProjectById,
  293. data: {
  294. id,
  295. },
  296. }).then((res) => {
  297. if (res.code == 200 && res.info) {
  298. this.form = res.info;
  299. this.getLists();
  300. this.getMaxSimulationTime();
  301. } else {
  302. this.$message.error(res.message || "获取信息失败");
  303. }
  304. });
  305. }
  306. }
  307. },
  308. };
  309. </script>
  310. <style lang='less' scoped>
  311. .el-form {
  312. width: 60%;
  313. min-width: 900px;
  314. padding-top: 60px;
  315. margin: 0 auto;
  316. .formItemBox {
  317. flex: 1;
  318. /deep/ .el-input,
  319. .el-select {
  320. width: 100%;
  321. }
  322. }
  323. .el-textarea {
  324. height: 96px;
  325. }
  326. .tipBox {
  327. margin-left: 20px;
  328. .tip {
  329. margin-bottom: 22px;
  330. line-height: 32px;
  331. }
  332. .tipA {
  333. margin-top: 226px;
  334. }
  335. .tipB {
  336. padding-top: 54px;
  337. }
  338. .tipBtnBox {
  339. margin-left: 20px;
  340. }
  341. }
  342. }
  343. .btns {
  344. padding-top: 30px;
  345. text-align: center;
  346. }
  347. </style>