formPerfectSensor.vue 16 KB

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