index2.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <!-- eslint-disable vue/multi-word-component-names -->
  2. <template>
  3. <div class="gasReport">
  4. <customHeader>瓦斯巡检任务管理</customHeader>
  5. <div class="report-container">
  6. <BasicTable @register="registerTable1">
  7. <template #tableTitle>
  8. <a-space>
  9. <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleEdit">新增任务</a-button>
  10. </a-space>
  11. </template>
  12. <template #action="{ record }">
  13. <a class="table-action-link" @click="handleManage(record)">管理</a>
  14. <a class="table-action-link" @click="handleDetail(record)">详情</a>
  15. <a class="table-action-link" @click="handleEdit(record)">编辑</a>
  16. <a-popconfirm title="删除内容无法恢复,是否删除" ok-text="确定" cancel-text="取消" @confirm="handleDelete(record)">
  17. <a class="table-action-link">删除</a>
  18. </a-popconfirm>
  19. </template>
  20. </BasicTable>
  21. <BasicModal :destroy-on-close="true" title="任务表单" @register="registerModal1" @ok="handleSubmit">
  22. <BasicForm class="h-230px" @register="registerForm" />
  23. </BasicModal>
  24. <BasicModal :destroy-on-close="true" title="任务详情列表" :show-ok-btn="false" :width="1200" @register="registerModal2">
  25. <a-space class="search-area mb-10px">
  26. <div class="item-text">巡检地址:</div>
  27. <a-input style="width: 240px" v-model:value="searchParams2.deviceName" placeholder="请输入巡检地址" />
  28. <a-button type="primary" preIcon="ant-design:search-outlined" class="ml-10px" @click="tableContext2.reload()">查询</a-button>
  29. </a-space>
  30. <BasicTable @register="registerTable2">
  31. <!-- <template #action="{ record }"> </template> -->
  32. <template #bodyCell="{ column, text }">
  33. <template v-if="column.dataIndex == 'checkState'">
  34. <div v-if="text == true">
  35. <div class="table-text color-green">已检</div>
  36. </div>
  37. <div v-else>
  38. <div class="table-text color-red">未检</div>
  39. </div>
  40. </template>
  41. </template>
  42. </BasicTable>
  43. </BasicModal>
  44. <BasicModal :destroy-on-close="true" title="任务管理列表" :width="1200" :show-ok-btn="false" @register="registerModal3">
  45. <a-space class="search-area mb-10px">
  46. <div class="item-text">巡检地址:</div>
  47. <a-input style="width: 240px" v-model:value="searchParams3.deviceName" placeholder="请输入巡检地址" />
  48. <a-button type="primary" preIcon="ant-design:search-outlined" class="ml-10px" @click="tableContext3.reload()">查询</a-button>
  49. <a-popconfirm title="确认操作" ok-text="确定" cancel-text="取消" @confirm="handlePatch('add')">
  50. <a-button type="primary" preIcon="ant-design:plus-outlined">添加</a-button>
  51. </a-popconfirm>
  52. <a-popconfirm title="删除内容无法取消,是否删除" ok-text="确定" cancel-text="取消" @confirm="handlePatch('del')">
  53. <a-button type="primary" preIcon="ant-design:close-outlined">删除</a-button>
  54. </a-popconfirm>
  55. </a-space>
  56. <BasicTable :rowSelection="rowSelection" @register="registerTable3">
  57. <!-- <template #action="{ record }"> </template> -->
  58. <template #bodyCell="{ column, text }">
  59. <template v-if="column.dataIndex == 'isSelect'">
  60. <div v-if="text == true">
  61. <div class="table-text color-green">是</div>
  62. </div>
  63. <div v-else>
  64. <div class="table-text">否</div>
  65. </div>
  66. </template>
  67. <template v-if="column.dataIndex == 'isOtherSelect'">
  68. <div v-if="text == true">
  69. <div class="table-text color-green">是</div>
  70. </div>
  71. <div v-else>
  72. <div class="table-text">否</div>
  73. </div>
  74. </template>
  75. </template>
  76. </BasicTable>
  77. </BasicModal>
  78. </div>
  79. </div>
  80. </template>
  81. <script setup lang="ts">
  82. import { ref, onMounted, nextTick } from 'vue';
  83. import customHeader from '/@/components/vent/customHeader.vue';
  84. import { taskColumns, pagination, taskschemas, taskDetailsColumns, taskManageColumns } from './gasInspect.data';
  85. import { deleteTeam, getManageTasklist, operateGasCheckTaskDetail, taskDetailsList, teamAdd, teamEdit, teamList } from './gasInspect.api';
  86. import { BasicTable } from '/@/components/Table';
  87. import { useListPage } from '/@/hooks/system/useListPage';
  88. import { Modal, message } from 'ant-design-vue';
  89. import { BasicModal, useModal } from '/@/components/Modal';
  90. import { BasicForm, useForm } from '/@/components/Form';
  91. import { getAutoScrollContainer } from '/@/utils/common/compUtils';
  92. // 任务列表
  93. const searchParams1 = ref<any>({ deviceName: '' });
  94. const { tableContext: tx1 } = useListPage({
  95. tableProps: {
  96. api: teamList,
  97. beforeFetch: (params) => {
  98. Object.assign(params, searchParams1.value);
  99. },
  100. columns: taskColumns,
  101. pagination,
  102. formConfig: {
  103. labelAlign: 'left',
  104. labelWidth: 80,
  105. compact: true,
  106. schemas: [
  107. {
  108. label: '日期',
  109. field: 'createTime',
  110. component: 'DatePicker',
  111. componentProps: {
  112. showTime: false,
  113. valueFormat: 'YYYY-MM-DD',
  114. getPopupContainer: getAutoScrollContainer,
  115. },
  116. },
  117. {
  118. label: '所属区队',
  119. field: 'districtTeam',
  120. component: 'JDictSelectTag',
  121. componentProps: {
  122. dictCode: 'districtTeam',
  123. },
  124. },
  125. ],
  126. },
  127. actionColumn: {
  128. title: '操作',
  129. dataIndex: 'action',
  130. width: 250,
  131. align: 'center',
  132. slots: { customRender: 'action' },
  133. },
  134. showTableSetting: false,
  135. useSearchForm: true,
  136. },
  137. pagination: true,
  138. });
  139. // 任务详情列表
  140. const searchParams2 = ref<any>({ deviceName: '' });
  141. const { tableContext: tx2 } = useListPage({
  142. tableProps: {
  143. api: taskDetailsList,
  144. beforeFetch: (params) => {
  145. Object.assign(params, {
  146. ...searchParams2.value,
  147. taskId: selectedRow.value.id,
  148. });
  149. },
  150. columns: taskDetailsColumns,
  151. pagination,
  152. showActionColumn: false,
  153. showTableSetting: false,
  154. useSearchForm: false,
  155. },
  156. pagination: true,
  157. });
  158. // 任务管理列表
  159. const searchParams3 = ref<any>({ deviceName: '' });
  160. const { tableContext: tx3 } = useListPage({
  161. tableProps: {
  162. api: getManageTasklist,
  163. beforeFetch: (params) => {
  164. Object.assign(params, {
  165. ...searchParams3.value,
  166. taskId: selectedRow.value.id,
  167. });
  168. },
  169. afterFetch(resultItems) {
  170. resultItems.forEach((item, i) => {
  171. item.id = i;
  172. });
  173. return resultItems;
  174. },
  175. rowSelection: {
  176. type: 'checkbox',
  177. getCheckboxProps: (record) => {
  178. return {
  179. disabled: record.isOtherSelect,
  180. };
  181. },
  182. },
  183. canResize: false,
  184. columns: taskManageColumns,
  185. showActionColumn: false,
  186. showTableSetting: false,
  187. useSearchForm: false,
  188. },
  189. // pagination: false,
  190. });
  191. const [registerTable1, tableContext1] = tx1;
  192. const [registerTable2, tableContext2] = tx2;
  193. const [registerTable3, tableContext3, { rowSelection, selectedRows }] = tx3;
  194. const [registerModal1, modalContext1] = useModal();
  195. const [registerModal2, modalContext2] = useModal();
  196. const [registerModal3, modalContext3] = useModal();
  197. const [registerForm, formContext1] = useForm({
  198. showActionButtonGroup: false,
  199. schemas: taskschemas,
  200. labelWidth: 170,
  201. });
  202. const selectedRow = ref<any>({});
  203. // 任务编辑/新增
  204. function handleEdit(record) {
  205. modalContext1.openModal();
  206. nextTick(async () => {
  207. await formContext1.resetFields();
  208. await formContext1.setFieldsValue(record);
  209. });
  210. }
  211. // 任务删除
  212. function handleDelete({ id }) {
  213. deleteTeam({ id }).then(() => {
  214. message.success('删除成功');
  215. });
  216. }
  217. // 任务管理
  218. function handleManage(record) {
  219. selectedRow.value = record;
  220. modalContext3.openModal();
  221. nextTick(() => {
  222. tableContext3.clearSelectedRowKeys();
  223. });
  224. }
  225. // 详情管理
  226. function handleDetail(record) {
  227. selectedRow.value = record;
  228. modalContext2.openModal();
  229. }
  230. // 关联明细
  231. function handlePatch(mode) {
  232. // 过滤已选择条目,关联至其他任务的已经无法选中所以不做处理,关联至本任务的无法再添加,未关联的无法删除
  233. const addedRows = selectedRows.value.filter((e) => {
  234. return e.isSelect === true;
  235. });
  236. const otherRows = selectedRows.value.filter((e) => {
  237. return e.isSelect === false;
  238. });
  239. if (mode === 'add' && addedRows.length) {
  240. Modal.confirm({
  241. title: '确认',
  242. content: '您选择的条目含有已关联项,是否继续添加其他未关联项?',
  243. okText: '确认',
  244. cancelText: '取消',
  245. onOk() {
  246. patchConfirmHandler(otherRows, mode);
  247. },
  248. });
  249. } else if (mode === 'del' && otherRows.length) {
  250. Modal.confirm({
  251. title: '确认',
  252. content: '您选择的条目含有未关联项,是否继续删除其他已关联项?',
  253. okText: '确认',
  254. cancelText: '取消',
  255. onOk() {
  256. patchConfirmHandler(addedRows, mode);
  257. },
  258. });
  259. } else {
  260. patchConfirmHandler(selectedRows.value, mode);
  261. }
  262. }
  263. function patchConfirmHandler(rows, mode) {
  264. operateGasCheckTaskDetail({
  265. taskId: selectedRow.value.id,
  266. operateList: rows.map((e) => {
  267. return {
  268. deviceId: e.deviceId, //设备id(巡检地址id)
  269. checkNum: e.checkNum, //巡检次数
  270. operateType: mode, //操作类型,新增:add,删除:del
  271. };
  272. }),
  273. }).then(() => {
  274. message.success('操作成功');
  275. tableContext3.clearSelectedRowKeys();
  276. tableContext3.reload();
  277. tableContext1.reload();
  278. });
  279. }
  280. function handleSubmit() {
  281. formContext1.validate().then((formData) => {
  282. if (formData.id) {
  283. teamEdit(formData).then(() => {
  284. modalContext1.closeModal();
  285. tableContext1.reload();
  286. });
  287. } else {
  288. teamAdd(formData).then(() => {
  289. modalContext1.closeModal();
  290. tableContext1.reload();
  291. });
  292. }
  293. });
  294. }
  295. onMounted(() => {});
  296. </script>
  297. <style lang="less" scoped>
  298. @import '/@/design/theme.less';
  299. .gasReport {
  300. width: 100%;
  301. height: 100%;
  302. padding: 80px 10px 15px 10px;
  303. box-sizing: border-box;
  304. position: relative;
  305. color: var(--vent-font-color);
  306. .search-area {
  307. margin: 20px 0px;
  308. .area-item {
  309. display: flex;
  310. align-items: center;
  311. .item-text {
  312. color: var(--vent-font-color);
  313. }
  314. }
  315. }
  316. .table-text {
  317. margin-bottom: 5px;
  318. }
  319. .text-y {
  320. color: #0be716;
  321. }
  322. .text-n {
  323. color: #ff0000;
  324. }
  325. .zxm-picker,
  326. .zxm-input {
  327. border: 1px solid #3ad8ff77 !important;
  328. background-color: #ffffff00 !important;
  329. color: var(--vent-font-color) !important;
  330. }
  331. }
  332. </style>