form.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <template>
  2. <xn-form-container
  3. :title="formData.id ? '编辑监测器' : '新增监测器'"
  4. :width="'800px'"
  5. :visible="visible"
  6. :destroy-on-close="true"
  7. @close="onClose"
  8. >
  9. <a-form
  10. ref="formRef"
  11. :model="formData"
  12. :rules="formRules"
  13. layout="inline"
  14. :label-col="{ style: { width: '105px', justifyContent: 'end' } }"
  15. >
  16. <a-row :gutter="10">
  17. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  18. <a-form-item label="设备型号" name="modelName">
  19. <a-select
  20. ref="select"
  21. v-model:value="formData.modelName"
  22. :options="modeOptions"
  23. placeholder="请选择设备型号"
  24. @change="modelNameChange"
  25. />
  26. </a-form-item>
  27. </a-col>
  28. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  29. <a-form-item label="设备编号" name="deviceCode">
  30. <a-input
  31. v-model:value="formData.deviceCode"
  32. placeholder="请输入设备编号"
  33. allow-clear
  34. :maxlength="10"
  35. @change="deviceCodeChange(formData.deviceCode)"
  36. :disabled="formData.id"
  37. />
  38. </a-form-item>
  39. </a-col>
  40. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  41. <a-form-item label="设备名称" name="deviceName">
  42. <a-input v-model:value="formData.deviceName" placeholder="请输入设备名称" allow-clear />
  43. </a-form-item>
  44. </a-col>
  45. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  46. <a-form-item label="传感器总路数" name="sensorCount">
  47. <a-input-number
  48. v-model:value="formData.sensorCount"
  49. placeholder="请输入传感器总路数"
  50. allow-clear
  51. :min="1"
  52. :max="sensorRouteMax"
  53. style="width: 100%"
  54. :precision="0"
  55. disabled
  56. />
  57. </a-form-item>
  58. </a-col>
  59. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  60. <a-form-item label="设备状态" name="status">
  61. <a-select ref="select" v-model:value="formData.status" placeholder="请选择设备状态">
  62. <a-select-option value="1">正常</a-select-option>
  63. <a-select-option value="2">闲置</a-select-option>
  64. </a-select>
  65. </a-form-item>
  66. </a-col>
  67. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  68. <a-form-item label="排序:" name="sortCode">
  69. <a-input-number class="xn-wd" v-model:value="formData.sortCode" :max="100" />
  70. </a-form-item>
  71. </a-col>
  72. <div
  73. class="form_item"
  74. v-if="modeData.sensorType == 'W' || modeData.sensorType == 'WS' || modeData.sensorType == 'WSC'"
  75. >
  76. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  77. <a-form-item label="温度上限" name="temperatureUp">
  78. <a-input-number
  79. id="inputNumber"
  80. v-model:value="formData.temperatureUp"
  81. placeholder="请输入温度上限"
  82. allow-clear
  83. disabled
  84. style="width: 100%"
  85. />
  86. </a-form-item>
  87. </a-col>
  88. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  89. <a-form-item label="温度下限" name="temperatureDown">
  90. <a-input-number
  91. id="inputNumber"
  92. v-model:value="formData.temperatureDown"
  93. placeholder="请输入温度下限"
  94. allow-clear
  95. disabled
  96. style="width: 100%"
  97. />
  98. </a-form-item>
  99. </a-col>
  100. </div>
  101. <div class="form_item" v-if="modeData.sensorType == 'WS' || modeData.sensorType == 'WSC'">
  102. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  103. <a-form-item label="湿度上限" name="humidityUp">
  104. <a-input-number
  105. id="inputNumber"
  106. v-model:value="formData.humidityUp"
  107. placeholder="请输入湿度上限"
  108. allow-clear
  109. disabled
  110. style="width: 100%"
  111. />
  112. </a-form-item>
  113. </a-col>
  114. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  115. <a-form-item label="湿度下限" name="humidityDown">
  116. <a-input-number
  117. id="inputNumber"
  118. v-model:value="formData.humidityDown"
  119. placeholder="请输入湿度下限"
  120. allow-clear
  121. disabled
  122. style="width: 100%"
  123. />
  124. </a-form-item>
  125. </a-col>
  126. </div>
  127. <div class="form_item" v-if="modeData.sensorType == 'WSC'">
  128. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  129. <a-form-item label="CO2上限" name="co2Up">
  130. <a-input-number
  131. id="inputNumber"
  132. v-model:value="formData.co2Up"
  133. placeholder="请输入CO2上限"
  134. allow-clear
  135. disabled
  136. style="width: 100%"
  137. />
  138. </a-form-item>
  139. </a-col>
  140. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  141. <a-form-item label="CO2下限" name="co2Down">
  142. <a-input-number
  143. id="inputNumber"
  144. v-model:value="formData.co2Down"
  145. placeholder="请输入CO2下限"
  146. allow-clear
  147. disabled
  148. style="width: 100%"
  149. />
  150. </a-form-item>
  151. </a-col>
  152. </div>
  153. </a-row>
  154. </a-form>
  155. <template #footer>
  156. <a-button class="xn-mr8" @click="onClose">退出</a-button>
  157. <a-button type="primary" @click="onSubmit">保存</a-button>
  158. </template>
  159. </xn-form-container>
  160. </template>
  161. <script setup>
  162. import { required, rules } from '@/utils/formRules'
  163. import devicetypeApi from '@/api/basicset/devicetypeApi'
  164. import memApi from '@/api/basicset/memApi'
  165. const emit = defineEmits({ successful: null })
  166. const visible = ref(false) // 默认是关闭状态
  167. const formRef = ref()
  168. const formData = ref({ sortCode: 99 }) // 表单数据
  169. const modeOptions = ref([]) // 设备型号
  170. const sensorRouteMax = ref(1) //传感器最大值默认1
  171. // 默认要校验的
  172. const formRules = {
  173. deviceName: [required('请输入设备名称')],
  174. deviceCode: [required('请输入设备编号'), rules.number],
  175. modelName: [required('请选择设备型号')],
  176. status: [required('请选择设备状态')],
  177. sensorCount: [required('请输入传感器总路数')]
  178. }
  179. // 获取设备型号
  180. const loadData = () => {
  181. devicetypeApi.devicetypeList().then((res) => {
  182. modeOptions.value = (res || []).map((item) => {
  183. return {
  184. ...item,
  185. value: item['id'],
  186. label: item['name']
  187. }
  188. })
  189. })
  190. }
  191. const modeData = ref({ sensorType: '' }) //选中的设备型号
  192. // 选中设备型号获取上下限值
  193. const modelNameChange = (value) => {
  194. if (value) {
  195. const data = modeOptions.value.find((item) => item.value === value)
  196. modeData.value = data
  197. formData.value.temperatureUp = data.temperatureUp
  198. formData.value.temperatureDown = data.temperatureDown
  199. formData.value.humidityUp = data.humidityUp
  200. formData.value.humidityDown = data.humidityDown
  201. formData.value.co2Up = data.co2Up
  202. formData.value.co2Down = data.co2Down
  203. formData.value.sensorCount = data.sensorCount
  204. sensorRouteMax.value = data.sensorCount
  205. }
  206. }
  207. // 打开抽屉
  208. const onOpen = (record) => {
  209. modeData.value = { sensorType: '' }
  210. loadData()
  211. visible.value = true
  212. if (record) {
  213. formData.value = Object.assign({}, record)
  214. setTimeout(() => {
  215. modelNameChange(formData.value.modelName)
  216. }, 300)
  217. } else {
  218. formData.value = { sortCode: 99 }
  219. }
  220. }
  221. // 设备名称同步设备编号
  222. const deviceCodeChange = (e) => {
  223. if (!formData.value.id) {
  224. formData.value.deviceName = e
  225. }
  226. }
  227. // 关闭抽屉
  228. const onClose = () => {
  229. formRef.value.resetFields()
  230. visible.value = false
  231. }
  232. // 验证并提交数据
  233. const onSubmit = () => {
  234. formRef.value
  235. .validate()
  236. .then(() => {
  237. memApi.submitForm(formData.value, formData.value.id).then(() => {
  238. onClose()
  239. emit('successful')
  240. })
  241. })
  242. .catch((error) => {
  243. console.log(error)
  244. })
  245. }
  246. // 调用这个函数将子组件的一些数据和方法暴露出去
  247. defineExpose({
  248. onOpen
  249. })
  250. </script>
  251. <style lang="less" scoped>
  252. :deep(.ant-form-item) {
  253. width: 100%;
  254. margin-bottom: 10px;
  255. }
  256. .form_item {
  257. width: 100%;
  258. display: flex;
  259. align-items: center;
  260. justify-content: center;
  261. flex-wrap: wrap;
  262. }
  263. </style>