configForm.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <xn-form-container title="监测点配置" :width="'800px'" :visible="visible" :destroy-on-close="true" @close="onClose">
  3. <a-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. layout="inline"
  8. :label-col="{ style: { width: '110px', justifyContent: 'end' } }"
  9. >
  10. <a-row :gutter="10">
  11. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  12. <a-form-item label="监控对象" name="monitorTargetId">
  13. <a-select
  14. ref="select"
  15. v-model:value="formData.monitorTargetId"
  16. :options="monitorTargetOptions"
  17. placeholder="请选择监控对象"
  18. />
  19. </a-form-item>
  20. </a-col>
  21. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  22. <a-form-item label="点位名称" name="name">
  23. <a-input v-model:value="formData.name" placeholder="请输入点位名称" allow-clear />
  24. </a-form-item>
  25. </a-col>
  26. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  27. <a-form-item label="传感器类型" name="sensorType">
  28. <a-select
  29. ref="select"
  30. v-model:value="formData.sensorType"
  31. :options="sensorOptions"
  32. placeholder="请选择传感器类型"
  33. @change="sensorTypeChange"
  34. />
  35. </a-form-item>
  36. </a-col>
  37. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  38. <a-form-item label="监控设备" name="monitorDeviceId">
  39. <a-select
  40. ref="select"
  41. v-model:value="formData.monitorDeviceId"
  42. :options="memListOptions"
  43. placeholder="请选择监控设备"
  44. @change="monitorDeviceIdChange"
  45. />
  46. </a-form-item>
  47. </a-col>
  48. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  49. <a-form-item label="传感器编号" name="sensorCode">
  50. <a-input v-model:value="formData.sensorCode" disabled placeholder="请输入传感器编号" allow-clear />
  51. </a-form-item>
  52. </a-col>
  53. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  54. <a-form-item label="传感器路数" name="sensorRoute">
  55. <a-input-number
  56. v-model:value="formData.sensorRoute"
  57. style="width: 100%"
  58. :min="1"
  59. :max="sensorRouteMax"
  60. placeholder="请输入传感器路数"
  61. />
  62. </a-form-item>
  63. </a-col>
  64. <div
  65. class="form_item"
  66. v-if="formData.sensorType == 'W' || formData.sensorType == 'WS' || formData.sensorType == 'WSC'"
  67. >
  68. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  69. <a-form-item label="温度上限" name="temperatureUp">
  70. <a-input-number
  71. id="inputNumber"
  72. v-model:value="formData.temperatureUp"
  73. placeholder="请输入温度上限"
  74. allow-clear
  75. :min="temperatureMax.downMax"
  76. :max="temperatureMax.upMax"
  77. style="width: 100%"
  78. :disabled="temperatureMax.upMax == null || temperatureMax.upMax == undefined"
  79. />
  80. </a-form-item>
  81. </a-col>
  82. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  83. <a-form-item label="温度下限" name="temperatureDown">
  84. <a-input-number
  85. id="inputNumber"
  86. v-model:value="formData.temperatureDown"
  87. placeholder="请输入温度下限"
  88. allow-clear
  89. :min="temperatureMax.downMax"
  90. :max="temperatureMax.upMax"
  91. style="width: 100%"
  92. :disabled="!temperatureMax.downMax == null || temperatureMax.downMax == undefined"
  93. />
  94. </a-form-item>
  95. </a-col>
  96. </div>
  97. <div class="form_item" v-if="formData.sensorType == 'WS' || formData.sensorType == 'WSC'">
  98. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  99. <a-form-item label="湿度上限" name="humidityUp">
  100. <a-input-number
  101. id="inputNumber"
  102. v-model:value="formData.humidityUp"
  103. placeholder="请输入湿度上限"
  104. allow-clear
  105. :min="humidityMax.downMax"
  106. :max="humidityMax.upMax"
  107. style="width: 100%"
  108. :disabled="!humidityMax.upMax"
  109. />
  110. </a-form-item>
  111. </a-col>
  112. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  113. <a-form-item label="湿度下限" name="humidityDown">
  114. <a-input-number
  115. id="inputNumber"
  116. v-model:value="formData.humidityDown"
  117. placeholder="请输入湿度下限"
  118. allow-clear
  119. :min="humidityMax.downMax"
  120. :max="humidityMax.upMax"
  121. style="width: 100%"
  122. :disabled="!humidityMax.downMax"
  123. />
  124. </a-form-item>
  125. </a-col>
  126. </div>
  127. <div class="form_item" v-if="formData.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. :max="co2Max.upMax"
  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. :max="co2Max.downMax"
  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 tool from '@/utils/tool'
  163. import { required } from '@/utils/formRules'
  164. import locationApi from '@/api/basicset/locationApi.js'
  165. import setupApi from '@/api/basicset/setupApi'
  166. import memApi from '@/api/basicset/memApi'
  167. const emit = defineEmits({ successful: null })
  168. const visible = ref(false) // 默认是关闭状态
  169. const formRef = ref()
  170. const formData = ref() // 表单数据
  171. const sensorOptions = tool.dictList('SENSORTYPE') // 传感器类型
  172. const monitorTargetOptions = ref([]) // 监控对象
  173. const memListOptions = ref([]) // 监控设备数据
  174. const temperatureMax = ref({ upMax: Infinity, downMax: Infinity }) // 温度最大值
  175. const humidityMax = ref({ upMax: Infinity, downMax: Infinity }) // 湿度最大值
  176. const co2Max = ref({ upMax: Infinity, downMax: Infinity }) // CO2最大值
  177. const sensorRouteMax = ref(1) //传感器最大值默认1
  178. // 默认要校验的
  179. const formRules = {
  180. name: [required('请输入区域名称')],
  181. monitorTargetId: [required('请选择监控对象')],
  182. monitorDeviceId: [required('请选择监控设备')],
  183. sensorType: [required('请选择传感器类型')],
  184. sensorRoute: [required('请输入传感器路数')],
  185. temperatureUp: [{ validator: validateTemperature, trigger: ['change', 'blur'] }],
  186. temperatureDown: [{ validator: validateTemperature, trigger: ['change', 'blur'] }],
  187. humidityUp: [{ validator: validateHumidity, trigger: ['change', 'blur'] }],
  188. humidityDown: [{ validator: validateHumidity, trigger: ['change', 'blur'] }],
  189. co2Up: [{ validator: validateCo2, trigger: ['change', 'blur'] }],
  190. co2Down: [{ validator: validateCo2, trigger: ['change', 'blur'] }]
  191. }
  192. // 温度上下限校验
  193. function validateTemperature(rule, value, callback) {
  194. if (rule.field == 'temperatureDown') {
  195. if (formData.value.temperatureUp !== null && value >= formData.value.temperatureUp) {
  196. callback(new Error('温度下限不能大于或等于温度上限'))
  197. } else {
  198. callback()
  199. }
  200. } else if (rule.field == 'temperatureUp') {
  201. if (formData.value.temperatureDown !== null && value <= formData.value.temperatureDown) {
  202. callback(new Error('温度上限不能小于或等于温度下限'))
  203. } else {
  204. callback()
  205. }
  206. }
  207. }
  208. // 湿度上下限校验
  209. function validateHumidity(rule, value, callback) {
  210. if (rule.field == 'humidityDown') {
  211. if (formData.value.humidityUp !== null && value >= formData.value.humidityUp) {
  212. callback(new Error('湿度下限不能大于或等于湿度上限'))
  213. } else {
  214. callback()
  215. }
  216. } else if (rule.field == 'humidityUp') {
  217. if (formData.value.humidityDown !== null && value <= formData.value.humidityDown) {
  218. callback(new Error('湿度上限不能小于或等于湿度下限'))
  219. } else {
  220. callback()
  221. }
  222. }
  223. }
  224. // CO2上下限校验
  225. function validateCo2(rule, value, callback) {
  226. if (rule.field == 'co2Down') {
  227. if (formData.value.co2Up !== null && value >= formData.value.co2Up) {
  228. callback(new Error('CO2下限不能大于或等于CO2上限'))
  229. } else {
  230. callback()
  231. }
  232. } else if (rule.field == 'co2Up') {
  233. if (formData.value.co2Down !== null && value <= formData.value.co2Down) {
  234. callback(new Error('CO2上限不能小于或等于CO2下限'))
  235. } else {
  236. callback()
  237. }
  238. }
  239. }
  240. // 打开抽屉
  241. const onOpen = (record) => {
  242. setupListData()
  243. visible.value = true
  244. if (record) {
  245. formData.value = Object.assign({}, record)
  246. sensorType.value = formData.value.sensorType
  247. memListData(sensorType.value)
  248. } else {
  249. formData.value = {}
  250. memListData()
  251. }
  252. }
  253. // 获取监控对象
  254. const setupListData = () => {
  255. setupApi.setupList({ isAll: false }).then((res) => {
  256. monitorTargetOptions.value = (res || []).map((item) => {
  257. return {
  258. ...item,
  259. value: item['id'],
  260. label: item['name']
  261. }
  262. })
  263. })
  264. }
  265. const sensorType = ref() //选中的传感器类型
  266. // 监控设备通过传感器类型来获取, sensorType可为空
  267. const memListData = (value) => {
  268. memApi.memList({ isAll: false, sensorType: value }).then((res) => {
  269. memListOptions.value = (res || []).map((item) => {
  270. return {
  271. ...item,
  272. value: item['id'],
  273. label: item['deviceName'],
  274. modelName: item['modelName'],
  275. deviceCode: item['deviceCode'],
  276. sensorCount: item['sensorCount']
  277. }
  278. })
  279. })
  280. }
  281. // 选中传感器类型
  282. const sensorTypeChange = (value) => {
  283. if (value) {
  284. sensorType.value = value
  285. memListData(value)
  286. }
  287. }
  288. // 选中监控设备
  289. const monitorDeviceIdChange = (value) => {
  290. if (value) {
  291. const data = memListOptions.value.find((item) => item.value === value)
  292. modeData.value = data
  293. formData.value.sensorCode = data.deviceCode //传感器编号
  294. formData.value.modelName = data.modelName //监控设备型号
  295. formData.value.deviceCode = data.deviceCode //冷链编号
  296. formData.value.temperatureUp = data.temperatureUp //温度上限
  297. formData.value.temperatureDown = data.temperatureDown //温度下限
  298. formData.value.humidityUp = data.humidityUp //湿度上限
  299. formData.value.humidityDown = data.humidityDown //湿度下限
  300. formData.value.co2Up = data.co2Up //CO2上限
  301. formData.value.co2Down = data.co2Down //CO2下限
  302. sensorRouteMax.value = data.sensorCount //传感器路数的最大值
  303. temperatureMax.value = {
  304. upMax: data.temperatureUp,
  305. downMax: data.temperatureDown
  306. }
  307. humidityMax.value = {
  308. upMax: data.humidityUp,
  309. downMax: data.humidityDown
  310. }
  311. co2Max.value = {
  312. upMax: data.co2Up,
  313. downMax: data.co2Down
  314. }
  315. }
  316. }
  317. // 关闭抽屉
  318. const onClose = () => {
  319. formRef.value.resetFields()
  320. visible.value = false
  321. }
  322. // 验证并提交数据
  323. const onSubmit = () => {
  324. formRef.value
  325. .validate()
  326. .then(() => {
  327. locationApi.submitForm(formData.value, formData.value.id).then(() => {
  328. onClose()
  329. emit('successful')
  330. })
  331. })
  332. .catch((error) => {
  333. console.log(error)
  334. })
  335. }
  336. // 调用这个函数将子组件的一些数据和方法暴露出去
  337. defineExpose({
  338. onOpen
  339. })
  340. </script>
  341. <style lang="less" scoped>
  342. :deep(.ant-form-item) {
  343. width: 100%;
  344. margin-bottom: 10px;
  345. }
  346. .form_item {
  347. width: 100%;
  348. display: flex;
  349. align-items: center;
  350. justify-content: center;
  351. flex-wrap: wrap;
  352. }
  353. </style>