Forráskód Böngészése

reactor:新增特提列表;中心统计报表调整;

zhangchong 1 éve
szülő
commit
50ec17a29f

+ 3 - 3
src/components/OrderDetail/index.vue

@@ -476,7 +476,7 @@
 	<!-- 扩展信息 -->
 	<order-expand-detail ref="orderExpandDetailRef" />
 	<!-- 流转记录 -->
-	<audit-record ref="AuditRecordRef">
+	<audit-record ref="auditRecordRef">
 		<template #header>
 			<el-form label-width="90px" ref="ruleFormRef">
 				<el-row :gutter="35">
@@ -688,13 +688,13 @@ const showExpandInfo = () => {
 	orderExpandDetailRef.value.openDialog(state.ruleForm.orderExtension);
 };
 // 流转记录
-const AuditRecordRef = ref<RefType>(); // 流转记录
+const auditRecordRef = ref<RefType>(); // 流转记录
 const onRecord = () => {
 	const params = {
 		dialogTitle: '流转记录',
 		...state.ruleForm,
 	};
-	AuditRecordRef.value.openDialog(params);
+  auditRecordRef.value.openDialog(params);
 };
 // 提交流程
 const processAuditRef = ref<RefType>(); // 处理流程

+ 156 - 0
src/views/business/special/apply.vue

@@ -0,0 +1,156 @@
+<template>
+	<div class="business-special-container layout-pd">
+		<!-- 搜索  -->
+		<el-card shadow="never">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<el-form-item label="关键词" prop="Keyword">
+					<el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" class="keyword-input" />
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" v-waves 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 #isProvince="{ row }">
+					<span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+				</template>
+				<template #title="{ row }">
+					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+				</template>
+				<template #employeeName="{ row }">
+					<span
+						>{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+					</span>
+				</template>
+				<!-- 表格操作 -->
+				<template #operation="{ row }">
+					<el-button link type="primary" @click="onSpecialApply(row)" title="特提申请" v-if="row.workflowId" v-auth="'business:special:apply'">
+						特提申请
+					</el-button>
+					<order-detail :order="row" @updateList="queryList" />
+				</template>
+			</ProTable>
+		</el-card>
+		<!-- 特提申请 -->
+		<special-apply ref="specialApplyRef" @updateList="queryList" />
+	</div>
+</template>
+<script setup lang="tsx" name="orderSpecial">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElButton, ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { formatDate } from '@/utils/formatTime';
+import { useRouter } from 'vue-router';
+import { orderListSpecial } from '@/api/business/special';
+// 引入组件
+const SpecialApply = defineAsyncComponent(() => import('@/views/business/special/components/Special-apply.vue')); // 忒提申请
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const router = useRouter(); // 路由
+const proTableRef = ref<RefType>(); // 表格ref
+// 表格配置项
+const columns = ref<any[]>([
+	{ type: 'selection', fixed: 'left', width: 55 },
+	{ prop: 'no', label: '工单编码', width: 150 },
+	{ prop: 'isProvince', label: '省/市工单', width: 100 },
+	{ prop: 'actualHandleStepName', label: '办理节点', width: 150 },
+	{ 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: '是否会签', width: 100 },
+	{ prop: 'hotspotName', label: '热点分类', width: 200 },
+	{ prop: 'tagNames', label: '工单标签', width: 200 },
+	{ prop: 'employeeName', label: '受理人', width: 120 },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 170, align: 'center' },
+]);
+const state = reactive({
+	queryParams: {
+		// 查询条件
+		PageIndex: 1,
+		PageSize: 10,
+		Keyword: null, // 关键字
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+});
+/** 获取列表 */
+const queryList = throttle(() => {
+	state.loading = true;
+	orderListSpecial(state.queryParams)
+		.then((res) => {
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result?.total ?? 0;
+			state.loading = false;
+		})
+		.catch((err) => {
+			console.log(err);
+			state.loading = false;
+		});
+}, 300);
+
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+}, 300);
+// 导出
+const onExport = () => {
+	console.log('导出');
+};
+// 特提申请
+const specialApplyRef = ref<RefType>();
+const onSpecialApply = (row: any) => {
+	if (row.counterSignType || row.counterSignType === 0) {
+		// 会签工单无法进行特提
+		ElMessage.warning('工单会签中,请先结束会签!');
+		return;
+	}
+	specialApplyRef.value.openDialog(row); // 需要审核
+};
+onMounted(() => {
+	queryList();
+});
+</script>

+ 22 - 41
src/views/business/special/index.vue

@@ -25,6 +25,9 @@
         v-model:page-index="state.queryParams.PageIndex"
         v-model:page-size="state.queryParams.PageSize"
       >
+        <template #expiredStatus="{ row }">
+          <span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
+        </template>
         <template #isProvince="{ row }">
           <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
         </template>
@@ -38,15 +41,15 @@
         </template>
         <!-- 表格操作 -->
         <template #operation="{ row }">
-          <el-button link type="primary" @click="onSpecialApply(row)" title="特提申请" v-if="row.workflowId" v-auth="'business:special:apply'">
-            特提申请
+          <el-button link type="primary" @click="onprogressDetail(row)" title="审批明细">
+            审批明细
           </el-button>
           <order-detail :order="row" @updateList="queryList" />
         </template>
       </ProTable>
     </el-card>
-    <!-- 特提申请 -->
-    <special-apply ref="specialApplyRef" @updateList="queryList" />
+    <!-- 审批明细 -->
+    <audit-record ref="auditRecordRef" />
   </div>
 </template>
 <script setup lang="tsx" name="orderSpecial">
@@ -57,8 +60,8 @@ import { formatDate } from '@/utils/formatTime';
 import { useRouter } from 'vue-router';
 import { orderListSpecial } from '@/api/business/special';
 // 引入组件
-const SpecialApply = defineAsyncComponent(() => import('@/views/business/special/components/Special-apply.vue')); // 忒提申请
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const AuditRecord = defineAsyncComponent(() => import('@/components/AuditRecord/index.vue')); // 审核记录
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const router = useRouter(); // 路由
@@ -66,42 +69,25 @@ const proTableRef = ref<RefType>(); // 表格ref
 // 表格配置项
 const columns = ref<any[]>([
   { type: 'selection', fixed: 'left', width: 55 },
+  { prop: 'expiredStatus', label: '超期状态', align: 'center' },
   { prop: 'no', label: '工单编码', width: 150 },
   { prop: 'isProvince', label: '省/市工单', width: 100 },
-  { prop: 'actualHandleStepName', label: '办理节点', width: 150 },
   { prop: 'statusText', label: '工单状态', width: 100 },
+  { prop: 'actualHandleStepName', label: '申请节点', width: 150 },
+  { prop: 'actualHandleStepName', label: '特提节点', width: 150 },
   { prop: 'title', label: '标题', width: 300 },
+  { prop: 'orgLevelOneName', label: '申请部门', width: 170 },
+  { prop: 'orgLevelOneName', label: '申请人', width: 170 },
   {
     prop: 'startTime',
-    label: '受理时间',
+    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: '是否会签', width: 100 },
   { prop: 'hotspotName', label: '热点分类', width: 200 },
-  { prop: 'tagNames', label: '工单标签', width: 200 },
-  { prop: 'employeeName', label: '受理人', width: 120 },
   { prop: 'operation', label: '操作', fixed: 'right', width: 170, align: 'center' },
 ]);
 const state = reactive({
@@ -136,19 +122,14 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
   formEl.resetFields();
   queryList();
 }, 300);
-// 导出
-const onExport = () => {
-  console.log('导出');
-};
-// 特提申请
-const specialApplyRef = ref<RefType>();
-const onSpecialApply = (row: any) => {
-  if (row.counterSignType || row.counterSignType === 0) {
-    // 会签工单无法进行特提
-    ElMessage.warning('工单会签中,请先结束会签!');
-    return;
-  }
-  specialApplyRef.value.openDialog(row); // 需要审核
+// 审批明细
+const auditRecordRef = ref<RefType>(); // 流转记录
+const onprogressDetail = (row: any) => {
+  const params = {
+    dialogTitle: '审批明细',
+    ...row
+  };
+  auditRecordRef.value.openDialog(params);
 };
 onMounted(() => {
   queryList();

+ 12 - 12
src/views/statistics/center/report.vue

@@ -145,7 +145,7 @@
               </tr>
               <tr style="height: 43px" v-for="(item, index) in centerReportOrderSourceChannelsData" :key="index">
                 <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.name }}:</td>
-                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.allCountNum }}</td>
+                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.countNum }}</td>
                 <td colspan="2" style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.remark }}</td>
               </tr>
               <tr style="height: 43px">
@@ -153,7 +153,7 @@
               </tr>
               <tr style="height: 43px" v-for="(item, index) in centerReportOrderAcceptTypesData" :key="index">
                 <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.name }}</td>
-                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.allCountNum }}</td>
+                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.countNum }}</td>
                 <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">所占百分比</td>
                 <td style="font-size: 22px; border-bottom: 1px solid #000000">{{ item.proportionRate }}%</td>
               </tr>
@@ -179,8 +179,8 @@
                 <td style="font-size: 22px; width: 40%; border-bottom: 1px solid #000000; border-right: 1px solid #000000">数 量</td>
               </tr>
               <tr style="height: 43px" v-for="(item, index) in orgStatisticsCityAllData.orgStatistics" :key="index">
-                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.name}}</td>
-                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.allCountNum}}</td>
+                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.orgName}}</td>
+                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.countNum}}</td>
               </tr>
               <tr style="height: 43px">
                 <td colspan="2" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">县(区)总计:{{orgStatisticsAreaAllData.orgStatisticsCountAll}}件</td>
@@ -190,8 +190,8 @@
                 <td style="font-size: 22px; width: 40%; border-bottom: 1px solid #000000; border-right: 1px solid #000000">数 量</td>
               </tr>
               <tr style="height: 43px" v-for="(item, index) in orgStatisticsAreaAllData.orgStatistics" :key="index">
-                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.name}}</td>
-                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.allCountNum}}</td>
+                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.orgName}}</td>
+                <td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.countNum}}</td>
               </tr>
               </tbody>
             </table>
@@ -279,15 +279,15 @@ const orgStatisticsCityAllData = ref<EmptyObjectType>({}); // 城市统计
 /** 获取列表 */
 const queryList = throttle(() => {
   state.loading = true;
-  let StartTime = null;
-  let EndTime = null;
+  let StartDate = null;
+  let EndDate = null;
   if (state.queryParams?.crTime) {
-    StartTime = state.queryParams?.crTime[0];
-    EndTime = state.queryParams?.crTime[1];
+    StartDate = state.queryParams?.crTime[0];
+    EndDate = state.queryParams?.crTime[1];
   }
   const request = {
-    StartTime,
-    EndTime,
+    StartDate,
+    EndDate,
   };
   centerReport(request)
     .then((res: any) => {