formPerfectSensor.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. <template>
  2. <div>
  3. <el-form ref="form" :model="form" :rules="rules" label-width="160px">
  4. <div class="inputBox flexBox">
  5. <span class="label">传感器ID</span>
  6. <div>{{ form.sensorCode }}</div>
  7. </div>
  8. <el-form-item label="传感器名称:" prop="sensorName">
  9. <el-input
  10. placeholder="请输入"
  11. maxlength="60"
  12. v-autoTrim="{ obj: form, key: 'sensorName' }"
  13. v-model="form.sensorName"
  14. >
  15. </el-input>
  16. </el-form-item>
  17. <el-form-item label="传感器描述:" prop="description">
  18. <el-input
  19. v-autoTrim="{
  20. obj: form,
  21. key: 'description',
  22. }"
  23. v-model="form.description"
  24. type="textarea"
  25. placeholder="请输入传感器描述"
  26. :autosize="{ minRows: 4, maxRows: 4 }"
  27. maxlength="200"
  28. ></el-input>
  29. </el-form-item>
  30. <div class="titlePanel">
  31. <div class="titlePanelBor">内参</div>
  32. </div>
  33. <el-form-item label="盲区距离(m):" prop="nearDistance">
  34. <el-input
  35. placeholder="请输入"
  36. maxlength="12"
  37. v-autoTrim="{ obj: form, key: 'nearDistance' }"
  38. v-model="form.nearDistance"
  39. @change="inputChange"
  40. >
  41. </el-input>
  42. </el-form-item>
  43. <el-form-item label="探测距离(m):" prop="farDistance">
  44. <el-input
  45. placeholder="请输入"
  46. maxlength="12"
  47. v-autoTrim="{ obj: form, key: 'farDistance' }"
  48. v-model="form.farDistance"
  49. @change="inputChange"
  50. >
  51. </el-input>
  52. </el-form-item>
  53. <el-form-item label="水平视场角左(deg):" prop="fovHLeft">
  54. <el-input
  55. placeholder="请输入"
  56. maxlength="12"
  57. v-autoTrim="{ obj: form, key: 'fovHLeft' }"
  58. v-model="form.fovHLeft"
  59. @change="inputChange"
  60. >
  61. </el-input>
  62. </el-form-item>
  63. <el-form-item label="水平视场角右(deg):" prop="fovHRight">
  64. <el-input
  65. placeholder="请输入"
  66. maxlength="12"
  67. v-autoTrim="{ obj: form, key: 'fovHRight' }"
  68. v-model="form.fovHRight"
  69. @change="inputChange"
  70. >
  71. </el-input>
  72. </el-form-item>
  73. <el-form-item label="垂直视场角顶(deg):" prop="fovVTop">
  74. <el-input
  75. placeholder="请输入"
  76. maxlength="12"
  77. v-autoTrim="{ obj: form, key: 'fovVTop' }"
  78. v-model="form.fovVTop"
  79. @change="inputChange"
  80. >
  81. </el-input>
  82. </el-form-item>
  83. <el-form-item label="垂直视场角底(deg):" prop="fovVBottom">
  84. <el-input
  85. placeholder="请输入"
  86. maxlength="12"
  87. v-autoTrim="{ obj: form, key: 'fovVBottom' }"
  88. v-model="form.fovVBottom"
  89. @change="inputChange"
  90. >
  91. </el-input>
  92. </el-form-item>
  93. <div class="titlePanel">
  94. <div class="titlePanelBor">其他</div>
  95. </div>
  96. <el-form-item label="显示探测锥:" prop="rangeDisplay">
  97. <el-radio v-model="form.rangeDisplay" label="1">是</el-radio>
  98. <el-radio v-model="form.rangeDisplay" label="0">否</el-radio>
  99. </el-form-item>
  100. <el-form-item label="最大目标物数量(个):" prop="maxObjects">
  101. <el-input
  102. placeholder="请输入"
  103. maxlength="9"
  104. v-autoTrim="{ obj: form, key: 'maxObjects' }"
  105. v-model="form.maxObjects"
  106. >
  107. </el-input>
  108. </el-form-item>
  109. <el-form-item label="坐标系:" prop="coordinateSystem">
  110. <el-select v-model="form.coordinateSystem">
  111. <el-option
  112. v-for="item in coordinateSystemList"
  113. :label="item.caption"
  114. :value="item.code"
  115. :key="item.code"
  116. ></el-option>
  117. </el-select>
  118. </el-form-item>
  119. <el-form-item label="目标物筛选:" prop="targetFilter">
  120. <el-checkbox
  121. :indeterminate="isIndeterminate"
  122. v-model="checkAll"
  123. @change="handleCheckAllChange"
  124. >全选</el-checkbox
  125. >
  126. <el-checkbox-group
  127. v-model="form.targetFilter"
  128. @change="handleCheckedTargetChange"
  129. >
  130. <el-checkbox
  131. v-for="target in targetOptions"
  132. :label="target.code"
  133. :key="target.code"
  134. >{{ target.caption }}</el-checkbox
  135. >
  136. </el-checkbox-group>
  137. </el-form-item>
  138. </el-form>
  139. </div>
  140. </template>
  141. <script>
  142. //import from '';
  143. export default {
  144. name: "formPerfectSensor", // form-完美传感器
  145. components: {},
  146. data() {
  147. // 校验非负且最多4位小数
  148. let validateNum = (rule, value, callback) => {
  149. !/^(0|[1-9][0-9]*)(\.\d{1,4})?$/.test(value) &&
  150. callback(new Error(rule.message));
  151. callback();
  152. };
  153. // 校验不大于1000
  154. let validateNoMore1000 = (rule, value, callback) => {
  155. if (value > 1000) {
  156. callback(new Error(rule.message));
  157. return;
  158. }
  159. callback();
  160. };
  161. // 校验不大于90
  162. let validateNoMore90 = (rule, value, callback) => {
  163. if (value > 90) {
  164. callback(new Error(rule.message));
  165. return;
  166. }
  167. callback();
  168. };
  169. // 校验不小于1且不大于20的正整数
  170. let validateNumA = (rule, value, callback) => {
  171. if (value < 1 || value > 20) {
  172. callback(new Error(rule.message));
  173. return;
  174. }
  175. !/^[1-9]+[0]*$/.test(value) && callback(new Error(rule.message));
  176. callback();
  177. };
  178. return {
  179. coordinateSystemList: [],
  180. checkAll: false,
  181. isIndeterminate: false,
  182. targetOptions: [],
  183. form: {
  184. id: "", // id
  185. sensorCode: "", // 传感器编码
  186. sensorName: "", // 传感器名称
  187. description: "", // 传感器描述
  188. nearDistance: "", // 盲区距离
  189. farDistance: "", // 探测距离
  190. fovHLeft: "", // 水平现场角左
  191. fovHRight: "", // 水平现场角右
  192. fovVTop: "", // 垂直现场角顶
  193. fovVBottom: "", // 垂直现场角底
  194. rangeDisplay: "1", // 显示探测锥
  195. maxObjects: "", // 最大目标物个数
  196. coordinateSystem: "", // 坐标系
  197. targetFilter: [], // 目标物筛选
  198. share: "", // 是否分享
  199. },
  200. rules: {
  201. sensorName: [
  202. { required: true, message: "请输入", trigger: "blur" },
  203. ],
  204. description: [
  205. { required: true, message: "请输入", trigger: "blur" },
  206. ],
  207. nearDistance: [
  208. { required: true, message: "请输入", trigger: "blur" },
  209. {
  210. validator: validateNum,
  211. message: "请输入最多带有4位小数的非负数",
  212. trigger: ["blur"],
  213. },
  214. ],
  215. farDistance: [
  216. { required: true, message: "请输入", trigger: "blur" },
  217. {
  218. validator: validateNum,
  219. message: "请输入最多带有4位小数的非负数",
  220. trigger: ["blur"],
  221. },
  222. {
  223. validator: validateNoMore1000,
  224. message: "请输入不大于1000的非负数",
  225. trigger: ["blur"],
  226. },
  227. ],
  228. fovHLeft: [
  229. { required: true, message: "请输入", trigger: "blur" },
  230. {
  231. validator: validateNum,
  232. message: "请输入最多带有4位小数的非负数",
  233. trigger: ["blur"],
  234. },
  235. {
  236. validator: validateNoMore90,
  237. message: "请输入不大于90的非负数",
  238. trigger: ["blur"],
  239. },
  240. ],
  241. fovHRight: [
  242. { required: true, message: "请输入", trigger: "blur" },
  243. {
  244. validator: validateNum,
  245. message: "请输入最多带有4位小数的非负数",
  246. trigger: ["blur"],
  247. },
  248. {
  249. validator: validateNoMore90,
  250. message: "请输入不大于90的非负数",
  251. trigger: ["blur"],
  252. },
  253. ],
  254. fovVTop: [
  255. { required: true, message: "请输入", trigger: "blur" },
  256. {
  257. validator: validateNum,
  258. message: "请输入最多带有4位小数的非负数",
  259. trigger: ["blur"],
  260. },
  261. {
  262. validator: validateNoMore90,
  263. message: "请输入不大于90的非负数",
  264. trigger: ["blur"],
  265. },
  266. ],
  267. fovVBottom: [
  268. { required: true, message: "请输入", trigger: "blur" },
  269. {
  270. validator: validateNum,
  271. message: "请输入最多带有4位小数的非负数",
  272. trigger: ["blur"],
  273. },
  274. {
  275. validator: validateNoMore90,
  276. message: "请输入不大于90的非负数",
  277. trigger: ["blur"],
  278. },
  279. ],
  280. rangeDisplay: [
  281. { required: true, message: "请选择", trigger: "change" },
  282. ],
  283. maxObjects: [
  284. { required: true, message: "请输入", trigger: "blur" },
  285. {
  286. validator: validateNumA,
  287. message: "请输入不小于1且不大于20的正整数",
  288. trigger: ["blur"],
  289. },
  290. ],
  291. coordinateSystem: [
  292. { required: true, message: "请选择", trigger: "change" },
  293. ],
  294. targetFilter: [
  295. { required: true, message: "请选择", trigger: "change" },
  296. ],
  297. },
  298. };
  299. },
  300. computed: {},
  301. methods: {
  302. showInfo(id) {
  303. this.$axios({
  304. method: "post",
  305. url: this.$api.modelLibrary.getOgtInfo,
  306. data: {
  307. id,
  308. },
  309. }).then((res) => {
  310. if (res.code == 200 && res.info) {
  311. this.$refs.form.clearValidate();
  312. this.form = res.info;
  313. this.form.targetFilter = res.info.targetFilter.split(",");
  314. // 传回当前展示form的share,从而改变按钮的展示
  315. this.$emit("changeShare", this.form);
  316. // 数据加载完毕,可展示canvas
  317. this.$emit("showDone");
  318. } else {
  319. this.$message.error(res.message || "获取失败");
  320. }
  321. });
  322. },
  323. save(isAdd = false) {
  324. this.$refs.form.validate((valid) => {
  325. if (valid) {
  326. // 判断是否新增
  327. if (isAdd) {
  328. this.form.id = "";
  329. }
  330. let data = {
  331. ...this.form,
  332. targetFilter: this.form.targetFilter.join(","),
  333. };
  334. this.$axios({
  335. method: "post",
  336. url: this.$api.modelLibrary.saveOgt,
  337. data,
  338. }).then((res) => {
  339. if (res.code == 200 && res.info) {
  340. this.form.id = res.info.id;
  341. this.form.share = res.info.share;
  342. this.$message.success("保存成功");
  343. this.$emit("changeShare", this.form);
  344. this.$emit("getList");
  345. } else {
  346. this.$message.error(res.message || "保存失败");
  347. }
  348. });
  349. }
  350. });
  351. },
  352. share() {
  353. let data = {
  354. ...this.form,
  355. targetFilter: this.form.targetFilter.join(","),
  356. };
  357. this.$axios({
  358. method: "post",
  359. url: this.$api.modelLibrary.shareOgt,
  360. data,
  361. }).then((res) => {
  362. if (res.code == 200) {
  363. this.$message.success("分享成功");
  364. this.$emit("getList");
  365. } else {
  366. this.$message.error(res.message || "分享失败");
  367. }
  368. });
  369. },
  370. cancel() {
  371. if (this.form.id) {
  372. // 取消时有id则重新请求表单
  373. this.showInfo(this.form.id);
  374. } else {
  375. // 清空
  376. this.$emit("clearForm");
  377. }
  378. },
  379. handleCheckAllChange(val) {
  380. this.form.targetFilter = val
  381. ? this.targetOptions.map((i) => i.code)
  382. : [];
  383. this.isIndeterminate = false;
  384. },
  385. handleCheckedTargetChange(value) {
  386. let checkedCount = value.length;
  387. this.checkAll = checkedCount === this.form.targetFilter.length;
  388. this.isIndeterminate =
  389. checkedCount > 0 && checkedCount < this.targetOptions.length;
  390. },
  391. inputChange() {
  392. if (
  393. this.form.farDistance === "" ||
  394. this.form.nearDistance === "" ||
  395. this.form.fovHLeft === "" ||
  396. this.form.fovHRight === "" ||
  397. this.form.fovVTop === "" ||
  398. this.form.fovVBottom === ""
  399. )
  400. return;
  401. this.$emit("inputChange", {
  402. n: +this.form.nearDistance,
  403. f: +this.form.farDistance,
  404. hl: +this.form.fovHLeft,
  405. hr: +this.form.fovHRight,
  406. vt: +this.form.fovVTop,
  407. vb: +this.form.fovVBottom,
  408. });
  409. },
  410. },
  411. async mounted() {
  412. await this.$dicsListsInit({
  413. coordinateSystemList: "coordinate",
  414. targetOptions: "targetFilter",
  415. });
  416. },
  417. };
  418. </script>
  419. <style lang='less' scoped>
  420. @import "../common/util.less";
  421. </style>