form.vue 11 KB

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