Просмотр исходного кода

Merge branch 'master' into dev

# Conflicts:
#	src/views/business/overdue/index.vue
zhangchong 10 месяцев назад
Родитель
Сommit
462a84d6a4
3 измененных файлов с 202 добавлено и 126 удалено
  1. 28 0
      src/api/query/overdue.ts
  2. 146 124
      src/views/business/overdue/index.vue
  3. 28 2
      src/views/business/overdue/soon.vue

+ 28 - 0
src/api/query/overdue.ts

@@ -14,6 +14,20 @@ export const overdueList = (params:object) => {
         params
     });
 };
+/**
+ * @description 工单超期列表导出
+ * @param {object} data
+ */
+export const exportOverdueList = (data:object) => {
+    return request({
+        url: `/api/v1/Order/order/expire/_export`,
+        method: 'post',
+        data,
+        responseType: 'blob'
+    }, {
+        reduce_data_format: false
+    });
+};
 /**
  * @description 工单即将超期列表
  * @param {object} params
@@ -24,4 +38,18 @@ export const overdueSoonList = (params:object) => {
         method: 'get',
         params
     });
+};
+/**
+ * @description 工单即将超期列表导出
+ * @param {object} data
+ */
+export const exportOverdueSoon = (data:object) => {
+    return request({
+        url: `/api/v1/Order/order/about_expire/_export`,
+        method: 'post',
+        data,
+        responseType: 'blob'
+    }, {
+        reduce_data_format: false
+    });
 };

+ 146 - 124
src/views/business/overdue/index.vue

@@ -1,62 +1,66 @@
 <template>
-	<div class="business-overdue-container layout-pd">
-		<!-- 搜索  -->
-		<el-card shadow="never">
-			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
-				<el-form-item label="工单标题" prop="Title">
-					<el-input v-model="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</el-form-item>
-				<el-form-item label="工单编码" prop="No">
-					<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</el-form-item>
-				<el-form-item label="是否省工单" prop="IsProvince">
-					<el-select v-model="state.queryParams.IsProvince" placeholder="请选择是否省工单" @change="handleQuery" class="w100">
-						<el-option label="是" value="true" />
-						<el-option label="否" value="false" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="是否延期" prop="Delay">
-					<el-select v-model="state.queryParams.Delay" placeholder="请选择是否延期" @change="handleQuery" class="w100">
-						<el-option label="是" value="true" />
-						<el-option label="否" value="false" />
-					</el-select>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-					<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
-						<SvgIcon name="ele-Refresh" class="mr5" />重置
-					</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-		<el-card shadow="never">
-			<ProTable
-				ref="proTableRef"
-				:columns="columns"
-				:data="state.tableData"
-				@updateTable="queryList"
-				:loading="state.loading"
-				:total="state.total"
-				v-model:page-index="state.queryParams.PageIndex"
-				v-model:page-size="state.queryParams.PageSize"
-			>
-				<template #title="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
-				</template>
-				<!-- 表格操作 -->
-				<template #operation="{ row }">
-					<order-detail :order="row" @updateList="queryList" />
-				</template>
-			</ProTable>
-		</el-card>
-	</div>
+  <div class="business-overdue-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+        <el-form-item label="工单标题" prop="Title">
+          <el-input v-model="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
+        </el-form-item>
+        <el-form-item label="工单编码" prop="No">
+          <el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+        </el-form-item>
+        <el-form-item label="是否省工单" prop="IsProvince">
+          <el-select v-model="state.queryParams.IsProvince" placeholder="请选择是否省工单" @change="handleQuery" class="w100">
+            <el-option label="是" value="true" />
+            <el-option label="否" value="false" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="是否延期" prop="Delay">
+          <el-select v-model="state.queryParams.Delay" placeholder="请选择是否延期" @change="handleQuery" class="w100">
+            <el-option label="是" value="true" />
+            <el-option label="否" value="false" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+          <el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
+            <SvgIcon name="ele-Refresh" class="mr5" />重置
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <ProTable
+        ref="proTableRef"
+        :columns="columns"
+        :data="state.tableData"
+        @updateTable="queryList"
+        :loading="state.loading"
+        :total="state.total"
+        v-model:page-index="state.queryParams.PageIndex"
+        v-model:page-size="state.queryParams.PageSize"
+        :toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
+        @export-current="exportTable($event)"
+        @export-all="exportTable($event, true)"
+      >
+        <template #title="{ row }">
+          <order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+        </template>
+        <!-- 表格操作 -->
+        <template #operation="{ row }">
+          <order-detail :order="row" @updateList="queryList" />
+        </template>
+      </ProTable>
+    </el-card>
+  </div>
 </template>
 <script setup lang="tsx" name="businessOverdue">
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { useRouter } from 'vue-router';
-import { overdueList } from '@/api/query/overdue';
+import { exportOverdueList, overdueList } from "@/api/query/overdue";
+import { downloadFileByStream } from "@/utils/tools";
 
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
@@ -64,95 +68,113 @@ const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/
 const proTableRef = ref<RefType>(); // 表格ref
 // 表格配置项
 const columns = ref<any[]>([
-	{ prop: 'no', label: '工单编码', width: 150 },
-	{ prop: 'isProvinceText', label: '省/市工单', width: 100 },
-	{ prop: 'actualHandleStepName', label: '办理节点', width: 150 },
+  { prop: 'no', label: '工单编码', width: 150 },
+  { prop: 'isProvinceText', label: '省/市工单', width: 100 },
+  { prop: 'actualHandleStepName', label: '办理节点', width: 150 },
   { prop: 'delayText', label: '是否延期' },
-	{ prop: 'statusText', label: '工单状态', width: 100 },
-	{ prop: 'title', label: '标题', width: 300 },
-	{
-		prop: 'startTime',
-		label: '受理时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'expiredTime',
-		label: '工单期满时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'filedTime',
-		label: '办结时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'orgLevelOneName', label: '一级部门', width: 170 },
-	{ prop: 'actualHandleOrgName', label: '接办部门', width: 170 },
-	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'counterSignTypeText', label: '是否会签' },
-	{ prop: 'sourceChannel', label: '来源方式' },
-	{ prop: 'hotspotName', label: '热点分类', width: 100 },
-	{ prop: 'acceptorName', label: '受理人', width: 170 },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 100, align: 'center' },
+  { prop: 'statusText', label: '工单状态', width: 100 },
+  { prop: 'title', label: '标题', width: 300 },
+  {
+    prop: 'startTime',
+    label: '受理时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'expiredTime',
+    label: '工单期满时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'filedTime',
+    label: '办结时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  { prop: 'orgLevelOneName', label: '一级部门', width: 170 },
+  { prop: 'actualHandleOrgName', label: '接办部门', width: 170 },
+  { prop: 'acceptType', label: '受理类型', width: 150 },
+  { prop: 'counterSignTypeText', label: '是否会签' },
+  { prop: 'sourceChannel', label: '来源方式' },
+  { prop: 'hotspotName', label: '热点分类', width: 100 },
+  { prop: 'acceptorName', label: '受理人', width: 170 },
+  { prop: 'operation', label: '操作', fixed: 'right', width: 100, align: 'center' },
 ]);
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const router = useRouter(); // 路由
 const state = reactive({
-	queryParams: {
-		// 查询条件
-		PageIndex: 1,
-		PageSize: 10,
-		Title: null, // 关键字
-		No: null, // 工单编码
-		IsProvince: null, // 是否省工单
-		Delay: null, // 是否延期
-	},
-	tableData: [{}], //表单
-	loading: false, // 加载
-	total: 0, // 总数
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 10,
+    Title: null, // 关键字
+    No: null, // 工单编码
+    IsProvince: null, // 是否省工单
+    Delay: null, // 是否延期
+  },
+  tableData: [{}], //表单
+  loading: false, // 加载
+  total: 0, // 总数
 });
 // 手动查询,将页码设置为1
 const handleQuery = () => {
-	state.queryParams.PageIndex = 1;
-	queryList();
+  state.queryParams.PageIndex = 1;
+  queryList();
 };
 /** 获取列表 */
 const queryList = () => {
-	state.loading = true;
-	overdueList(state.queryParams)
-		.then((res) => {
-			state.tableData = res.result?.items ?? [];
-			state.total = res.result?.total ?? 0;
-			state.loading = false;
-		})
-		.catch((err) => {
-			console.log(err);
-		})
-		.finally(() => {
-			state.loading = false;
-		});
+  state.loading = true;
+  overdueList(state.queryParams)
+    .then((res) => {
+      state.tableData = res.result?.items ?? [];
+      state.total = res.result?.total ?? 0;
+      state.loading = false;
+    })
+    .catch((err) => {
+      console.log(err);
+    })
+    .finally(() => {
+      state.loading = false;
+    });
 };
-
 /** 重置按钮操作 */
 const resetQuery = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	queryList();
+  if (!formEl) return;
+  formEl.resetFields();
+  queryList();
 };
-// 导出
-const onExport = () => {
-	console.log('导出');
+// 表格导出
+const exportTable = (val: any, isExportAll = false) => {
+  const columnInfos = val.map((item: any) => {
+    return {
+      prop: item.prop,
+      name: item.label,
+    };
+  });
+  const req = {
+    queryDto: state.queryParams,
+    columnInfos,
+    isExportAll,
+  };
+  state.loading = true;
+  exportOverdueList(req)
+    .then((res: any) => {
+      state.loading = false;
+      downloadFileByStream(res);
+    })
+    .catch(() => {
+      state.loading = false;
+    });
 };
 onMounted(async () => {
-	queryList();
+  queryList();
 });
 </script>

+ 28 - 2
src/views/business/overdue/soon.vue

@@ -39,6 +39,9 @@
 				:total="state.total"
 				v-model:page-index="state.queryParams.PageIndex"
 				v-model:page-size="state.queryParams.PageSize"
+        :toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
+        @export-current="exportTable($event)"
+        @export-all="exportTable($event, true)"
 			>
 				<template #title="{ row }">
 					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
@@ -56,7 +59,8 @@ import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { useRouter } from 'vue-router';
-import { overdueSoonList } from '@/api/query/overdue';
+import { exportOverdueSoon, overdueSoonList } from "@/api/query/overdue";
+import { downloadFileByStream } from "@/utils/tools";
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 
@@ -132,13 +136,35 @@ const queryList = () => {
 			state.loading = false;
 		});
 };
-
 /** 重置按钮操作 */
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
 	queryList();
 };
+// 表格导出
+const exportTable = (val: any, isExportAll = false) => {
+  const columnInfos = val.map((item: any) => {
+    return {
+      prop: item.prop,
+      name: item.label,
+    };
+  });
+  const req = {
+    queryDto: state.queryParams,
+    columnInfos,
+    isExportAll,
+  };
+  state.loading = true;
+  exportOverdueSoon(req)
+    .then((res: any) => {
+      state.loading = false;
+      downloadFileByStream(res);
+    })
+    .catch(() => {
+      state.loading = false;
+    });
+};
 onMounted(async () => {
 	queryList();
 });