DeviceBaseInfoList.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <template>
  2. <!--引用表格-->
  3. <BasicTable @register="registerTable" :rowSelection="rowSelection" @selection-change="handleRowSelectionChange">
  4. <!--插槽:table标题-->
  5. <template #tableTitle>
  6. <a-button type="primary" v-auth="'deviceInfo:device_base_info:add'" v-if="!noOperate" @click="handleAdd" preIcon="ant-design:plus-outlined">
  7. 新增
  8. </a-button>
  9. <a-button
  10. type="primary"
  11. v-auth="'deviceInfo:device_base_info:exportXls'"
  12. v-if="!noOperate"
  13. preIcon="ant-design:export-outlined"
  14. @click="onExportXls"
  15. >
  16. 导出
  17. </a-button>
  18. <j-upload-button
  19. type="primary"
  20. v-auth="'deviceInfo:device_base_info:importExcel'"
  21. v-if="!noOperate"
  22. preIcon="ant-design:import-outlined"
  23. @click="onImportXls"
  24. >
  25. 导入
  26. </j-upload-button>
  27. <a-dropdown v-if="selectedRowKeys.length > 0 && !noOperate">
  28. <template #overlay>
  29. <a-menu>
  30. <a-menu-item key="1" @click="batchHandleDelete">
  31. <Icon icon="ant-design:delete-outlined" />
  32. 删除
  33. </a-menu-item>
  34. </a-menu>
  35. </template>
  36. <a-button v-auth="'deviceInfo:device_base_info:deleteBatch'">
  37. 批量操作
  38. <Icon icon="mdi:chevron-down" />
  39. </a-button>
  40. </a-dropdown>
  41. <!-- 高级查询 -->
  42. <super-query :config="superQueryConfig" @search="handleSuperQuery" />
  43. </template>
  44. <!--操作栏-->
  45. <template #action="{ record }">
  46. <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
  47. </template>
  48. <!--字段回显插槽-->
  49. <!-- <template v-slot:bodyCell="{ column, record, index, text }"> </template> -->
  50. <template #imageUrl="{ text }">
  51. <TableImg :size="60" :simpleShow="true" :imgList="text ? [getFileAccessHttpUrl(text.split(',')[0])] : []" />
  52. </template>
  53. <template #deviceNumber="{ record }">
  54. <a-badge-ribbon style="top: -20px" v-if="record.isSpecialEquip === true" color="red" text="特">
  55. <div>
  56. <a-button type="link" @click="handleRowClick(record)">{{ record.deviceNumber }}</a-button>
  57. </div>
  58. </a-badge-ribbon>
  59. <div v-else>
  60. <a-button type="link" @click="handleRowClick(record)">{{ record.deviceNumber }}</a-button>
  61. </div>
  62. </template>
  63. <template #isMeteringDevice="{ record }">
  64. <Icon icon="ant-design:check-outlined" class="zgztel-check-icon checked" v-if="record.isMeteringDevice === true" />
  65. <Icon icon="ant-design:close-outlined" class="zgztel-check-icon no-checked" v-else />
  66. </template>
  67. <template #isDepreciation="{ record }">
  68. <Icon icon="ant-design:check-outlined" class="zgztel-check-icon checked" v-if="record.isDepreciation === true" />
  69. <Icon icon="ant-design:close-outlined" class="zgztel-check-icon no-checked" v-else />
  70. </template>
  71. </BasicTable>
  72. <!-- 表单区域 -->
  73. <DeviceBaseInfoModal @register="registerModal" @success="handleSuccess" />
  74. <!-- 添加父、子级设备 -->
  75. <AddDeviceModal @register="registerParentDeviceModal" @success="handleSuccess" />
  76. <!-- 详情 -->
  77. <DeviceBaseInfoDetailDrawer @register="registerDetailDrawer" @success="handleSuccess" />
  78. </template>
  79. <script lang="ts" name="deviceInfo-deviceBaseInfo" setup>
  80. import { reactive } from 'vue';
  81. import { BasicTable, TableAction, TableImg } from '/@/components/Table';
  82. import { useModal } from '/@/components/Modal';
  83. import { useListPage } from '/@/hooks/system/useListPage';
  84. import DeviceBaseInfoModal from './components/DeviceBaseInfoModal.vue';
  85. import { columns, searchFormSchema, superQuerySchema } from './DeviceBaseInfo.data';
  86. import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './DeviceBaseInfo.api';
  87. import AddDeviceModal from './components/AddDeviceModal.vue';
  88. import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
  89. import DeviceBaseInfoDetailDrawer from './components/DeviceBaseInfoDetailDrawer.vue';
  90. import { useDrawer } from '/@/components/Drawer';
  91. const queryParam = reactive<any>({});
  92. const emits = defineEmits(['selection-change']);
  93. const props = defineProps<{
  94. noOperate?: boolean;
  95. superQueryParams?: any[];
  96. }>();
  97. //注册model
  98. const [registerModal, { openModal }] = useModal();
  99. // 添加父、子级设备
  100. const [registerParentDeviceModal, { openModal: openAddDeviceModal }] = useModal();
  101. // 注册详情抽屉
  102. const [registerDetailDrawer, detailDrawer] = useDrawer();
  103. //注册table数据
  104. const { tableContext, onExportXls, onImportXls } = useListPage({
  105. tableProps: {
  106. title: '设备基本信息',
  107. api: list,
  108. columns,
  109. canResize: false,
  110. formConfig: {
  111. // labelWidth: 100,
  112. schemas: searchFormSchema,
  113. autoSubmitOnEnter: true,
  114. showAdvancedButton: true,
  115. fieldMapToNumber: [],
  116. fieldMapToTime: [],
  117. },
  118. showActionColumn: !props.noOperate,
  119. actionColumn: {
  120. width: 120,
  121. fixed: 'right',
  122. },
  123. beforeFetch: (params) => {
  124. if (props.noOperate === true) {
  125. let superQueryParamsArr: any[] = [];
  126. if (queryParam['superQueryParams']) {
  127. superQueryParamsArr = JSON.parse(decodeURIComponent(queryParam['superQueryParams']));
  128. }
  129. if (!queryParam['superQueryMatchType']) {
  130. queryParam['superQueryMatchType'] = 'and';
  131. }
  132. (props.superQueryParams || []).forEach((ele) => {
  133. const parentDeviceIdsIndex = superQueryParamsArr.findIndex((item) => {
  134. return item.field === ele.field;
  135. });
  136. if (parentDeviceIdsIndex !== -1) {
  137. superQueryParamsArr.splice(parentDeviceIdsIndex, 1, ele);
  138. } else {
  139. superQueryParamsArr.push(ele);
  140. }
  141. });
  142. queryParam['superQueryParams'] = encodeURIComponent(JSON.stringify(superQueryParamsArr));
  143. }
  144. return Object.assign(params, queryParam);
  145. },
  146. },
  147. exportConfig: {
  148. name: '设备基本信息',
  149. url: getExportUrl,
  150. params: queryParam,
  151. },
  152. importConfig: {
  153. url: getImportUrl,
  154. success: handleSuccess,
  155. },
  156. });
  157. const [registerTable, { reload, setSelectedRowKeys }, { rowSelection, selectedRowKeys }] = tableContext;
  158. // 高级查询配置
  159. const superQueryConfig = reactive(superQuerySchema);
  160. /**
  161. * 高级查询事件
  162. */
  163. function handleSuperQuery(params) {
  164. Object.keys(params).map((k) => {
  165. queryParam[k] = params[k];
  166. });
  167. reload();
  168. }
  169. /**
  170. * 新增事件
  171. */
  172. function handleAdd() {
  173. openModal(true, {
  174. isUpdate: false,
  175. showFooter: true,
  176. });
  177. }
  178. /**
  179. * 编辑事件
  180. */
  181. function handleEdit(record: Recordable) {
  182. openModal(true, {
  183. record,
  184. isUpdate: true,
  185. showFooter: true,
  186. });
  187. }
  188. /**
  189. * 详情
  190. */
  191. function handleDetail(record: Recordable) {
  192. detailDrawer.openDrawer(true, record);
  193. }
  194. /**
  195. * 删除事件
  196. */
  197. async function handleDelete(record) {
  198. await deleteOne({ id: record.id }, handleSuccess);
  199. }
  200. /**
  201. * 批量删除事件
  202. */
  203. async function batchHandleDelete() {
  204. await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
  205. }
  206. /**
  207. * 成功回调
  208. */
  209. function handleSuccess() {
  210. (selectedRowKeys.value = []) && reload();
  211. }
  212. /**
  213. * 操作栏
  214. */
  215. function getTableAction(record) {
  216. return [
  217. {
  218. label: '编辑',
  219. onClick: handleEdit.bind(null, record),
  220. auth: 'deviceInfo:device_base_info:edit',
  221. },
  222. ];
  223. }
  224. /**
  225. * 下拉操作栏
  226. */
  227. function getDropDownAction(record) {
  228. return [
  229. {
  230. label: '添加父设备',
  231. onClick: () => {
  232. openAddDeviceModal(true, {
  233. device: record,
  234. isUpdate: false,
  235. showFooter: true,
  236. addType: 1, // 父设备
  237. });
  238. },
  239. auth: 'deviceInfo:parent_device_info:add',
  240. },
  241. {
  242. label: '添加子设备',
  243. onClick: () => {
  244. openAddDeviceModal(true, {
  245. device: record,
  246. isUpdate: false,
  247. showFooter: true,
  248. addType: 2, // 子设备
  249. });
  250. },
  251. auth: 'deviceInfo:sub_device_info:add',
  252. },
  253. {
  254. label: '详情',
  255. onClick: handleDetail.bind(null, record),
  256. },
  257. {
  258. label: '删除',
  259. popConfirm: {
  260. title: '是否确认删除',
  261. confirm: handleDelete.bind(null, record),
  262. placement: 'topLeft',
  263. },
  264. auth: 'deviceInfo:device_base_info:delete',
  265. },
  266. ];
  267. }
  268. // 点击行
  269. const handleRowClick = (record) => {
  270. if (!props.noOperate) {
  271. detailDrawer.openDrawer(true, record);
  272. }
  273. };
  274. // 选择行
  275. const handleRowSelectionChange = (selectedInfo) => {
  276. if (props.noOperate) {
  277. emits('selection-change', selectedInfo);
  278. }
  279. };
  280. // 暴露方法
  281. defineExpose({
  282. setSelectedRowKeys,
  283. });
  284. </script>
  285. <style lang="less" scoped>
  286. :deep(.ant-picker),
  287. :deep(.ant-input-number) {
  288. width: 100%;
  289. }
  290. </style>