form.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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. :disabled="formData.id"
  26. />
  27. </a-form-item>
  28. </a-col>
  29. <!-- 只做展示,不能做任何修改 -->
  30. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  31. <a-form-item label="型号编码" name="deviceCode">
  32. <a-input v-model:value="formData.modelName" placeholder="请输入型号编码" allow-clear disabled />
  33. </a-form-item>
  34. </a-col>
  35. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  36. <a-form-item label="设备编号" name="deviceCode">
  37. <a-input
  38. v-model:value="formData.deviceCode"
  39. placeholder="请输入设备编号"
  40. allow-clear
  41. :maxlength="10"
  42. @change="deviceCodeChange(formData.deviceCode)"
  43. :disabled="formData.id"
  44. />
  45. </a-form-item>
  46. </a-col>
  47. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  48. <a-form-item label="设备名称" name="deviceName">
  49. <a-input
  50. :value="formData.deviceName"
  51. :disabled="!formData.deviceCode"
  52. placeholder="请输入设备名称"
  53. allow-clear
  54. @input="deviceNameInput"
  55. />
  56. </a-form-item>
  57. </a-col>
  58. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  59. <a-form-item label="传感器总路数" name="sensorCount">
  60. <a-input-number
  61. v-model:value="formData.sensorCount"
  62. placeholder="请输入传感器总路数"
  63. allow-clear
  64. :min="1"
  65. :max="sensorRouteMax"
  66. style="width: 100%"
  67. :precision="0"
  68. disabled
  69. />
  70. </a-form-item>
  71. </a-col>
  72. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  73. <a-form-item label="设备状态" name="status">
  74. <a-select ref="select" v-model:value="formData.status" placeholder="请选择设备状态">
  75. <a-select-option value="1">正常</a-select-option>
  76. <a-select-option value="2">闲置</a-select-option>
  77. </a-select>
  78. </a-form-item>
  79. </a-col>
  80. <div
  81. class="form_item"
  82. v-if="modeData.sensorType == 'W' || modeData.sensorType == 'WS' || modeData.sensorType == 'WSC'"
  83. >
  84. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  85. <a-form-item label="温度上限" name="temperatureUp">
  86. <a-input-number
  87. id="inputNumber"
  88. v-model:value="formData.temperatureUp"
  89. placeholder="请输入温度上限"
  90. allow-clear
  91. disabled
  92. style="width: 100%"
  93. />
  94. </a-form-item>
  95. </a-col>
  96. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  97. <a-form-item label="温度下限" name="temperatureDown">
  98. <a-input-number
  99. id="inputNumber"
  100. v-model:value="formData.temperatureDown"
  101. placeholder="请输入温度下限"
  102. allow-clear
  103. disabled
  104. style="width: 100%"
  105. />
  106. </a-form-item>
  107. </a-col>
  108. </div>
  109. <div class="form_item" v-if="modeData.sensorType == 'WS' || modeData.sensorType == 'WSC'">
  110. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  111. <a-form-item label="湿度上限" name="humidityUp">
  112. <a-input-number
  113. id="inputNumber"
  114. v-model:value="formData.humidityUp"
  115. placeholder="请输入湿度上限"
  116. allow-clear
  117. disabled
  118. style="width: 100%"
  119. />
  120. </a-form-item>
  121. </a-col>
  122. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  123. <a-form-item label="湿度下限" name="humidityDown">
  124. <a-input-number
  125. id="inputNumber"
  126. v-model:value="formData.humidityDown"
  127. placeholder="请输入湿度下限"
  128. allow-clear
  129. disabled
  130. style="width: 100%"
  131. />
  132. </a-form-item>
  133. </a-col>
  134. </div>
  135. <div class="form_item" v-if="modeData.sensorType == 'WSC'">
  136. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  137. <a-form-item label="CO2上限" name="co2Up">
  138. <a-input-number
  139. id="inputNumber"
  140. v-model:value="formData.co2Up"
  141. placeholder="请输入CO2上限"
  142. allow-clear
  143. disabled
  144. style="width: 100%"
  145. />
  146. </a-form-item>
  147. </a-col>
  148. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  149. <a-form-item label="CO2下限" name="co2Down">
  150. <a-input-number
  151. id="inputNumber"
  152. v-model:value="formData.co2Down"
  153. placeholder="请输入CO2下限"
  154. allow-clear
  155. disabled
  156. style="width: 100%"
  157. />
  158. </a-form-item>
  159. </a-col>
  160. </div>
  161. <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  162. <a-form-item label="排序:" name="sortCode">
  163. <a-input-number class="xn-wd" v-model:value="formData.sortCode" :max="100" />
  164. </a-form-item>
  165. </a-col>
  166. </a-row>
  167. </a-form>
  168. <template #footer>
  169. <a-button class="xn-mr8" @click="onClose">取消</a-button>
  170. <a-button type="primary" @click="onSubmit">保存</a-button>
  171. </template>
  172. </xn-form-container>
  173. </template>
  174. <script setup>
  175. import { message } from 'ant-design-vue'
  176. import { required, rules } from '@/utils/formRules'
  177. import devicetypeApi from '@/api/basicset/devicetypeApi'
  178. import memApi from '@/api/basicset/memApi'
  179. const emit = defineEmits({ successful: null })
  180. const visible = ref(false) // 默认是关闭状态
  181. const formRef = ref()
  182. const formData = ref({ sortCode: 99, status: '1' }) // 表单数据
  183. const modeOptions = ref([]) // 设备型号
  184. const sensorRouteMax = ref(1) //传感器最大值默认1
  185. // 默认要校验的
  186. const formRules = {
  187. deviceName: [required('请输入设备名称')],
  188. deviceCode: [required('请输入设备编号'), rules.number, { validator: maxCode, trigger: ['change', 'blur'] }],
  189. modelName: [required('请选择设备型号')],
  190. status: [required('请选择设备状态')],
  191. sensorCount: [required('请输入传感器总路数')]
  192. }
  193. // 设备编号最大值
  194. function maxCode(rule, value, callback) {
  195. const maxValue = 2147483647
  196. if (isNaN(value) || Number(value) > maxValue) {
  197. callback(new Error(`设备编码不能超过最大值 ${maxValue}`))
  198. } else {
  199. callback() // 校验通过
  200. }
  201. }
  202. // 获取设备型号
  203. const loadData = () => {
  204. devicetypeApi
  205. .devicetypeList()
  206. .then((res) => {
  207. modeOptions.value = (res || []).map((item) => {
  208. return {
  209. ...item,
  210. value: item['code'],
  211. label: item['name']
  212. }
  213. })
  214. })
  215. .finally(() => {
  216. if (formData.value.modelName) {
  217. modelNameChange(formData.value.modelName)
  218. }
  219. })
  220. }
  221. const modeData = ref({ sensorType: '' }) //选中的设备型号
  222. // 选中设备型号获取上下限值
  223. const modelNameChange = (value) => {
  224. if (value) {
  225. const data = modeOptions.value.find((item) => item.value === value)
  226. modeData.value = data
  227. console.log()
  228. formData.value.temperatureUp = data.temperatureUp
  229. formData.value.temperatureDown = data.temperatureDown
  230. formData.value.humidityUp = data.humidityUp
  231. formData.value.humidityDown = data.humidityDown
  232. formData.value.co2Up = data.co2Up
  233. formData.value.co2Down = data.co2Down
  234. formData.value.sensorCount = data.sensorCount
  235. sensorRouteMax.value = data.sensorCount
  236. }
  237. }
  238. // 打开抽屉
  239. const onOpen = (record) => {
  240. modeData.value = { sensorType: '' }
  241. loadData()
  242. visible.value = true
  243. if (record) {
  244. formData.value = Object.assign({}, record)
  245. } else {
  246. formData.value = { sortCode: 99, status: '1' }
  247. }
  248. }
  249. // 设备名称同步设备编号
  250. const deviceCodeChange = (e) => {
  251. if (!formData.value.id) {
  252. formData.value.deviceName = e
  253. }
  254. }
  255. // 设备名称改变
  256. const deviceNameInput = (e) => {
  257. const val = e.target.value
  258. if (!val.startsWith(formData.value.deviceCode)) {
  259. formData.value.deviceName = formData.value.deviceCode
  260. message.warning({
  261. content: `设备名称必须以设备编号:${formData.value.deviceCode} 开头`,
  262. key: 'deviceName'
  263. })
  264. } else {
  265. formData.value.deviceName = val
  266. }
  267. }
  268. // 关闭抽屉
  269. const onClose = () => {
  270. formRef.value.resetFields()
  271. visible.value = false
  272. }
  273. // 验证并提交数据
  274. const onSubmit = () => {
  275. formRef.value
  276. .validate()
  277. .then(() => {
  278. memApi.submitForm(formData.value, formData.value.id).then(() => {
  279. onClose()
  280. emit('successful')
  281. })
  282. })
  283. .catch((error) => {
  284. console.log(error)
  285. })
  286. }
  287. // 调用这个函数将子组件的一些数据和方法暴露出去
  288. defineExpose({
  289. onOpen
  290. })
  291. </script>
  292. <style lang="less" scoped>
  293. :deep(.ant-form-item) {
  294. width: 100%;
  295. margin-bottom: 10px;
  296. }
  297. .form_item {
  298. width: 100%;
  299. display: flex;
  300. align-items: center;
  301. justify-content: center;
  302. flex-wrap: wrap;
  303. }
  304. </style>