siteForm.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <!-- 测点操作表单 -->
  3. <div>
  4. <BasicForm
  5. :model="site"
  6. :schemas="schemas"
  7. :label-col="{ span: 8 }"
  8. :wrapper-col="{ span: 16 }"
  9. label-align="right"
  10. :showActionButtonGroup="false"
  11. @register="register"
  12. >
  13. <template #create-btn>
  14. <Button type="primary" :rounded="true" @click="createSite">新建测点</Button>
  15. </template>
  16. <template #copy-btn>
  17. <Button type="primary" :rounded="true" @click="copySite">复制测点</Button>
  18. </template>
  19. <template #edit-btn>
  20. <Button type="primary" :rounded="true" @click="editSite">编辑测点</Button>
  21. </template>
  22. </BasicForm>
  23. <Button type="primary" shape="circle" @click="targetSite">
  24. <template #icon>
  25. <Icon icon="mdi:target" />
  26. </template>
  27. </Button>
  28. </div>
  29. </template>
  30. <script setup lang="ts">
  31. import {
  32. MonitorSiteTreeNode,
  33. MonitorSiteOperationParams,
  34. SaveMonitorSiteParams,
  35. } from '@/api/sys/model/monitorModel';
  36. import { defineProps } from 'vue';
  37. import { BasicForm, FormSchema, useForm } from '@/components/Form/index';
  38. import { Button } from 'ant-design-vue';
  39. import { SensorDict, SystemSourceDict } from '../const';
  40. import Icon from '@/components/Icon/Icon.vue';
  41. // props & emits
  42. defineProps<{ site?: MonitorSiteTreeNode }>();
  43. const emit = defineEmits<{
  44. save: [value: SaveMonitorSiteParams];
  45. message: [value: MonitorSiteOperationParams];
  46. }>();
  47. // 生成输入类表单项的帮助函数
  48. function generateInputSchema({
  49. field,
  50. label,
  51. span = 5,
  52. placeholder,
  53. required = false,
  54. }: {
  55. field: string;
  56. label: string;
  57. span?: number;
  58. placeholder?: string;
  59. required?: boolean;
  60. }): FormSchema {
  61. return {
  62. component: 'Input',
  63. field,
  64. label,
  65. rules: [{ required }],
  66. colProps: {
  67. span,
  68. },
  69. componentProps: {
  70. placeholder: placeholder || `请输入${label}`,
  71. },
  72. };
  73. }
  74. // 生成按钮类表单项的帮助函数,具体的按钮写在BasicForm对应的slot下
  75. function generateButtonSchema({ slot }: { slot: string }): FormSchema {
  76. return {
  77. field: slot,
  78. slot,
  79. component: 'Render',
  80. colProps: {
  81. span: 1,
  82. },
  83. componentProps: {
  84. size: 'small',
  85. },
  86. };
  87. }
  88. // 生成选择框类表单项的帮助函数
  89. function generateSelectSchema({
  90. field,
  91. label,
  92. span = 5,
  93. placeholder,
  94. required = true,
  95. dict,
  96. }: {
  97. field: string;
  98. label: string;
  99. span?: number;
  100. placeholder?: string;
  101. required?: boolean;
  102. dict: Record<string, unknown>;
  103. }): FormSchema {
  104. return {
  105. component: 'Select',
  106. field,
  107. label,
  108. rules: [{ required }],
  109. colProps: {
  110. span,
  111. },
  112. componentProps: {
  113. placeholder: placeholder || `请输入${label}`,
  114. options: Object.keys(dict).reduce<{ value: string; label: unknown }[]>((result, key) => {
  115. result.push({ value: key, label: dict[key] });
  116. return result;
  117. }, []),
  118. },
  119. };
  120. }
  121. // 表单配置项
  122. const schemas: FormSchema[] = [
  123. generateButtonSchema({ slot: 'create-btn' }),
  124. generateInputSchema({ field: 'id', label: '测点编号', required: true }),
  125. generateSelectSchema({ field: 'sensorType', label: '测点类型', dict: SensorDict }),
  126. generateInputSchema({ field: 'sensorStatus', label: '测点使用状态', required: true }),
  127. generateInputSchema({ field: 'pos', label: '所属位置', required: true }),
  128. generateInputSchema({ field: 'x', label: 'X', required: true, span: 3 }),
  129. generateButtonSchema({ slot: 'copy-btn' }),
  130. generateSelectSchema({ field: 'srouce', label: '系统来源', dict: SystemSourceDict }),
  131. generateInputSchema({ field: 'data_type', label: '数据类型', required: true }),
  132. generateInputSchema({ field: 'nuit', label: '单位', required: true }),
  133. generateInputSchema({ field: 'distance', label: '巷道距离' }),
  134. generateInputSchema({ field: 'y', label: 'Y', required: true, span: 3 }),
  135. generateButtonSchema({ slot: 'edit-btn' }),
  136. generateInputSchema({ field: 'max_messure', label: '高量程' }),
  137. generateInputSchema({ field: 'min_messure', label: '低量程' }),
  138. generateInputSchema({ field: 'warn_limit', label: '报警上限', required: true }),
  139. generateInputSchema({ field: 'warn_deadline', label: '报警下限', required: true }),
  140. generateInputSchema({ field: 'z', label: 'Z', span: 3 }),
  141. ];
  142. // 后续操作表单必要的函数
  143. const [register, { validate }] = useForm();
  144. // 提交创建测点所需的数据
  145. function createSite() {
  146. validate().then((v) => {
  147. emit('save', v as SaveMonitorSiteParams);
  148. });
  149. }
  150. // 提交复制测点所需的数据
  151. function copySite() {
  152. validate().then((v) => {
  153. emit('save', v as SaveMonitorSiteParams);
  154. });
  155. }
  156. // 提交编辑测点所需的数据
  157. function editSite() {
  158. validate().then((v) => {
  159. emit('save', v as SaveMonitorSiteParams);
  160. });
  161. }
  162. // 定位测点
  163. function targetSite() {
  164. emit('message', {
  165. clickType: 'pickPiont', // 拾取坐标
  166. from: 'tank',
  167. });
  168. }
  169. defineExpose({
  170. schemas,
  171. register,
  172. });
  173. </script>