index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <script setup>
  2. import { CirclePlus} from '@element-plus/icons-vue'
  3. import { ElMessageBox } from 'element-plus'
  4. import { getDeviceList, postDevice, putDevice, delDevice, getAllWaterFactoryList } from '@/api/client/manage'
  5. import { ref } from 'vue';
  6. const { proxy } = getCurrentInstance();
  7. const queryParams = ref({
  8. pageNum: 1,
  9. pageSize: 10,
  10. deviceStatus: ''
  11. });
  12. const total = ref(0);
  13. const loading = ref(false);
  14. const tableData = ref([]);
  15. const formData = ref({});
  16. const formRef = ref(null);
  17. const dialogVisible = ref(false);
  18. const rules = {
  19. deviceWorks:{ required: true, message: '请选择水厂', trigger: 'change' },
  20. deviceSn:{ required: true, message: '请输入设备SN', trigger: 'blur' },
  21. deviceName: { required: true, message: '请输入设备名称', trigger: 'blur' },
  22. deviceModel: { required: true, message: '请输入设备型号', trigger: 'blur' },
  23. type: { required: true, message: '请选择设备型号', trigger: 'blur' },
  24. deviceStatus: { required: true, message: '请选择设备状态', trigger: 'blur' }
  25. }
  26. // 设备用途 select 数据
  27. const deviceTypeOptions = [
  28. { value: 1, label: '化验室' },
  29. { value: 2, label: '连续检测' },
  30. ]
  31. // 设备状态 select 数据
  32. const deviceStatusOptions = [
  33. { value: 0, label: '正常' },
  34. { value: 1, label: '停用' },
  35. ]
  36. const waterFactoryOptions = ref([]);
  37. const initPageData = async () => {
  38. loading.value = true;
  39. const { total: tableTotal, rows } = await getDeviceList(queryParams.value);
  40. const typeEmun = {
  41. 1: '化验室',
  42. 2: '连续检测'
  43. }
  44. tableData.value = rows.map(item => ({
  45. ...item,
  46. typeName: typeEmun[item.type]
  47. }));
  48. total.value = tableTotal;
  49. loading.value = false;
  50. }
  51. // 查询
  52. const handleQuery = async() => {
  53. initPageData();
  54. }
  55. // 编辑设置
  56. const handleEditDevice = (row) => {
  57. formData.value = { ...row };
  58. dialogVisible.value = true;
  59. }
  60. // 删除设备
  61. const handleDelete = async ({ deviceId }) => {
  62. await delDevice(deviceId);
  63. proxy.$modal.msgSuccess("删除成功");
  64. initPageData();
  65. }
  66. // 重置
  67. const handleReset = () => {
  68. queryParams.value = {
  69. pageNum: 1,
  70. pageSize: 10,
  71. deviceStatus: ''
  72. }
  73. initPageData();
  74. }
  75. // 切换table - 状态
  76. const onChangeTag= (row) => {
  77. ElMessageBox.confirm(
  78. `请确认,是否要${row.deviceStatus == 0 ? '停用' : '启用'}该设备?`,
  79. '状态变更提醒',
  80. {
  81. confirmButtonText: '确认',
  82. cancelButtonText: '取消',
  83. type: 'warning',
  84. }
  85. ).then(async() => {
  86. await putDevice({ deviceId: row.deviceId, deviceStatus: row.deviceStatus == 0 ? 1 : 0 });
  87. initPageData();
  88. proxy.$modal.msgSuccess("状态变更成功");
  89. }).catch(() => {})
  90. }
  91. // 重置dialog表单
  92. const handleDialogReset = () => {
  93. formData.value = {};
  94. formRef.value.resetFields();
  95. }
  96. const handleDialogConfirm = async () => {
  97. if (!formRef.value) return;
  98. await formRef.value.validate(async (valid, fields) => {
  99. if (valid) {
  100. !formData.value.deviceId ? await postDevice(formData.value) : await putDevice(formData.value);
  101. initPageData();
  102. formRef.value.resetFields();
  103. dialogVisible.value = false;
  104. proxy.$modal.msgSuccess("操作成功");
  105. } else {
  106. console.log('error submit!', fields)
  107. }
  108. })
  109. }
  110. onMounted(() => {
  111. getAllWaterFactoryList().then(({ data }) => waterFactoryOptions.value = data);
  112. initPageData();
  113. })
  114. </script>
  115. <template>
  116. <div>
  117. <el-card shadow="never" :body-style="{ border: '0px' }" style="margin-bottom: 10px;">
  118. <template #header>
  119. <p class="space-x-[10px]">
  120. <span class="font-bold">数据筛选</span>
  121. </p>
  122. </template>
  123. <el-row class="pt-[5px]" justify="space-between" :gutter="20">
  124. <el-col :span="6">
  125. <el-form-item label="设备名称">
  126. <el-input placeholder="请输入设备名称" v-model.trim="queryParams.deviceName"></el-input>
  127. </el-form-item>
  128. </el-col>
  129. <el-col :span="6">
  130. <el-form-item label="设备SN">
  131. <el-input placeholder="请输入设备SN" v-model.trim="queryParams.deviceSn"></el-input>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="6">
  135. <el-form-item label="设备用途">
  136. <el-select v-model="queryParams.type" placeholder="请选择设备用途" clearable>
  137. <el-option v-for="item in deviceTypeOptions" :key="item.label" :label="item.label" :value="item.value" />
  138. </el-select>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="6">
  142. <el-form-item label="所属水厂">
  143. <el-select v-model="queryParams.deviceWorks" placeholder="请选择所属水厂" filterable clearable>
  144. <el-option v-for="item in waterFactoryOptions" :key="item.id" :label="item.name" :value="item.id" />
  145. </el-select>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="6">
  149. <el-form-item label="设备状态">
  150. <el-select v-model="queryParams.deviceStatus" placeholder="请选择设备状态" :empty-values="[null, undefined]">
  151. <el-option label="全部" value="" />
  152. <el-option v-for="item in deviceStatusOptions" :key="item.label" :label="item.label" :value="item.value" />
  153. </el-select>
  154. </el-form-item>
  155. </el-col>
  156. <el-col :span="6" :offset="12">
  157. <div class="flex justify-end">
  158. <el-button type="primary" @click="handleQuery" :loading="loading">查询</el-button>
  159. <el-button @click="handleReset" :loading="loading">重置</el-button>
  160. </div>
  161. </el-col>
  162. </el-row>
  163. </el-card>
  164. <el-card shadow="never" :body-style="{ padding: '20px' }">
  165. <div class="flex justify-between items-center mb-[10px]">
  166. <el-button type="primary" @click="dialogVisible = true" :loading="loading" :icon="CirclePlus">新增设备</el-button>
  167. </div>
  168. <el-table :data="tableData" style="width: 100%" v-loading="loading" row-key="id" border>
  169. <el-table-column prop="deviceName" label="设备名称" width="200" fixed/>
  170. <el-table-column prop="deviceSn" label="设备SN" width="180" />
  171. <el-table-column prop="deviceModel" label="设备型号" width="180"/>
  172. <el-table-column prop="organization.name" label="所属水厂" width="200"/>
  173. <el-table-column prop="typeName" label="设备用途" width="180"/>
  174. <el-table-column prop="deviceStatus" label="使用状态" width="180">
  175. <template #default="{ row }">
  176. <el-check-tag :checked="row.deviceStatus == 0" type="success" @change="onChangeTag(row)">
  177. {{ row.deviceStatus == 0 ? '正常' : '停用' }}
  178. </el-check-tag>
  179. </template>
  180. </el-table-column>
  181. <el-table-column prop="createUser.nickName" label="创建人" width="180"/>
  182. <el-table-column prop="createTime" label="创建时间" width="180"/>
  183. <el-table-column prop="address" label="操作" fixed="right" width="120">
  184. <template #default="{ row }">
  185. <el-button link type="primary" size="small" @click="handleEditDevice(row)">编辑</el-button>
  186. <el-popconfirm title="请确认是否删除?" @confirm="handleDelete(row)" width="200">
  187. <template #reference>
  188. <el-button text type="primary" size="small">删除</el-button>
  189. </template>
  190. </el-popconfirm>
  191. </template>
  192. </el-table-column>
  193. </el-table>
  194. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  195. v-model:limit="queryParams.pageSize" @pagination="initPageData" />
  196. </el-card>
  197. <el-dialog v-model="dialogVisible" :title="formData.deviceId ? '编辑设备' : '新增设备'" width="900" @closed="handleDialogReset">
  198. <el-form :model="formData" :rules="rules" ref="formRef" label-width="120px" label-position="left" require-asterisk-position="right">
  199. <el-row justify="space-between">
  200. <el-col :span="11">
  201. <el-form-item label="选择水厂" prop="deviceWorks">
  202. <el-select v-model="formData.deviceWorks" placeholder="请选择水厂" filterable clearable>
  203. <el-option v-for="item in waterFactoryOptions" :key="item.id" :label="item.name" :value="item.id" />
  204. </el-select>
  205. </el-form-item>
  206. </el-col>
  207. <el-col :span="11">
  208. <el-form-item label="设备SN" prop="deviceSn">
  209. <el-input v-model.trim="formData.deviceSn" placeholder="请输入设备SN" clearable />
  210. </el-form-item>
  211. </el-col>
  212. <el-col :span="11">
  213. <el-form-item label="设备名称" prop="deviceName">
  214. <el-input v-model.trim="formData.deviceName" placeholder="请输入设备名称" clearable />
  215. </el-form-item>
  216. </el-col>
  217. <el-col :span="11">
  218. <el-form-item label="设备型号" prop="deviceModel">
  219. <el-input v-model.trim="formData.deviceModel" placeholder="请输入设备型号" clearable />
  220. </el-form-item>
  221. </el-col>
  222. <el-col :span="11">
  223. <el-form-item label="设备用途" prop="type">
  224. <el-select v-model="formData.type" placeholder="请选择设备用途" clearable>
  225. <el-option v-for="item in deviceTypeOptions" :key="item.label" :label="item.label" :value="item.value?.toString()" />
  226. </el-select>
  227. </el-form-item>
  228. </el-col>
  229. <el-col :span="11">
  230. <el-form-item label="设备状态" prop="deviceStatus">
  231. <el-select v-model="formData.deviceStatus" placeholder="请选择设备状态" clearable>
  232. <el-option v-for="item in deviceStatusOptions" :key="item.label" :label="item.label" :value="item.value?.toString()" />
  233. </el-select>
  234. </el-form-item>
  235. </el-col>
  236. <el-col :span="11">
  237. <el-form-item label="维护人员" prop="deviceMaintainer">
  238. <el-input v-model.trim="formData.deviceMaintainer" placeholder="请输入维护人员" clearable />
  239. </el-form-item>
  240. </el-col>
  241. <el-col :span="11">
  242. <el-form-item label="维护人员电话" prop="deviceTel">
  243. <el-input v-model.trim="formData.deviceTel" placeholder="请输入维护人员电话" clearable />
  244. </el-form-item>
  245. </el-col>
  246. </el-row>
  247. </el-form>
  248. <template #footer>
  249. <div class="dialog-footer">
  250. <el-button @click="dialogVisible = false" >取 消</el-button>
  251. <el-button @click="handleDialogConfirm" type="primary">确 定</el-button>
  252. </div>
  253. </template>
  254. </el-dialog>
  255. </div>
  256. </template>
  257. <style lang="scss" scoped>
  258. </style>