Преглед на файлове

reactor:523 新增【值班管理】功能;520 来电弹屏增加运营商字段;519 创建知识页面新增“重要政策文件”模板;517 流程管理加导出功能;518 【常用意见管理】增加导出等功能;513 新增【设为观察件】等功能;515 知识库管理增加查询条件;388 智能回访任务查询;

zhangchong преди 3 дни
родител
ревизия
f83dc8d2fd

+ 17 - 0
src/api/auxiliary/advice.ts

@@ -58,6 +58,23 @@ export const publicCommonList = (params: object) => {
 		params,
 	});
 };
+/**
+ * @description 常用意见列表 导出
+ * @param {object} data
+ */
+export const commonListExport = (data: object) => {
+	return request(
+		{
+			url: '/api/v1/Sys/open-common/export',
+			method: 'post',
+			responseType: 'blob',
+			data,
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+}
 /**
  * @description 修改公共常用意见
  * @param {object} data

+ 9 - 0
src/api/auxiliary/numberInfo.ts

@@ -0,0 +1,9 @@
+/*
+ * @Author: zc
+ * @description 辅助功能-号码信息配置
+ */
+import request from '@/utils/request';
+/**
+ * @description 获取号码信息列表
+ * @param {object} params
+ */

+ 82 - 0
src/api/business/observations.ts

@@ -0,0 +1,82 @@
+/*
+ * @Author: zc
+ * @description 业务管理-工单甄别
+ */
+import request from '@/utils/request';
+/**
+ * @description 观察件回复列表
+ * @param {object} params
+ */
+export const getObservationsReplyList = (params: object) => {
+	return request({
+		url: '/api/v1/ObservationPiece/get-observation-piece-reply-list',
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 观察件回复列表导出
+ * @param {object} data
+ */
+export const exportObservationsReplyList = (data: object) => {
+	return request(
+		{
+			url: '/api/v1/ObservationPiece/get-observation-piece-reply-list-export',
+			method: 'post',
+			responseType: 'blob',
+			data,
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+};
+/**
+ * @description 观察件回复
+ * @param {object} data
+ */
+export const getObservationsReply = (data: object) => {
+	return request({
+		url: '/api/v1/ObservationPiece/add-observation-piece-reply',
+		method: 'post',
+		data,
+	});
+}
+/**
+ * @description 获取观察件回复详情
+ * @param {string} id
+ */
+export const getObservationsReplyDetail = (id: string) => {
+	return request({
+		url: `/api/v1/ObservationPiece/get-observation-piece-detail/${id}`,
+		method: 'get',
+	});
+}
+/**
+ * @description 获取观察件列表
+ * @param {object} params
+ */
+export const getObservationsList = (params: object) => {
+	return request({
+		url: '/api/v1/ObservationPiece/get-observation-piece-list',
+		method: 'get',
+		params,
+	});
+}
+/**
+ * @description 观察件列表导出
+ * @param {object} data
+ */
+export const exportObservationsList = (data: object) => {
+	return request(
+		{
+			url: '/api/v1/ObservationPiece/get-observation-piece-list-export',
+			method: 'post',
+			responseType: 'blob',
+			data,
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+}

+ 10 - 0
src/api/business/order.ts

@@ -80,6 +80,16 @@ export const orderAdd = (data: object) => {
 		data,
 	});
 };
+/**
+ * @description 根据号码查询归属地等信息
+ * @param {string} phonenum
+ */
+export const orderPhoneNum = (phonenum: string) => {
+	return request({
+		url: `/api/v1/SystemMobilArea/get-phone-card-area/${phonenum}`,
+		method: 'get',
+	});
+};
 /**
  * @description 更新工单
  * @param {object} data

+ 59 - 24
src/api/system/workflow.ts

@@ -27,6 +27,24 @@ export const workflowList = (params?: object) => {
 		params: params,
 	});
 };
+/**
+ * 流程模板 导出
+ * @param {object} data
+ * @return {*}
+ */
+export const workflowListExport = (data?: object) => {
+	return request(
+		{
+			url: '/api/v1/Workflow/definition/export',
+			method: 'post',
+			responseType: 'blob',
+			data,
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+}
 /**
  * 新增流程模板草稿
  * @param {object} data
@@ -36,7 +54,7 @@ export const workflowAdd = (data: object) => {
 	return request({
 		url: '/api/v1/Workflow/definition',
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -59,7 +77,7 @@ export const workflowUpdate = (data: object) => {
 	return request({
 		url: '/api/v1/Workflow/definition',
 		method: 'put',
-		data
+		data,
 	});
 };
 /**
@@ -70,7 +88,7 @@ export const workflowUpdate = (data: object) => {
 export const workflowDelete = (id: string) => {
 	return request({
 		url: `/api/v1/Workflow/definition/${id}`,
-		method: 'delete'
+		method: 'delete',
 	});
 };
 /**
@@ -81,7 +99,7 @@ export const workflowDelete = (id: string) => {
 export const publishOnList = (id: string) => {
 	return request({
 		url: `/api/v1/Workflow/definition/${id}/publish`,
-		method: 'post'
+		method: 'post',
 	});
 };
 /**
@@ -93,7 +111,7 @@ export const publish = (data: object) => {
 	return request({
 		url: '/api/v1/Workflow/definition/publish',
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -115,7 +133,7 @@ export const workflowEnable = (id: string) => {
 export const workflowDisable = (id: string) => {
 	return request({
 		url: `/api/v1/Workflow/definition/${id}/disable`,
-		method: 'post'
+		method: 'post',
 	});
 };
 /**
@@ -195,7 +213,7 @@ export const workflowStepOptions = (params: object) => {
 	return request({
 		url: `/api/v1/Workflow/step-options`,
 		method: 'get',
-		params
+		params,
 	});
 };
 /**
@@ -207,7 +225,7 @@ export const workflowNext = (data: object) => {
 	return request({
 		url: '/api/v1/Workflow/next',
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -219,7 +237,7 @@ export const workflowJump = (data: object) => {
 	return request({
 		url: '/api/v1/Workflow/jump',
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -230,7 +248,7 @@ export const workflowJump = (data: object) => {
 export const workflowGetJump = (workflowId: string) => {
 	return request({
 		url: `/api/v1/Workflow/${workflowId}/jump`,
-		method: 'get'
+		method: 'get',
 	});
 };
 /**
@@ -242,7 +260,7 @@ export const workflowTerminate = (data: object) => {
 	return request({
 		url: `/api/v1/Workflow/terminate`,
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -265,7 +283,7 @@ export const workflowPrevious = (data: object) => {
 	return request({
 		url: `/api/v1/Workflow/previous`,
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -277,7 +295,7 @@ export const orderPrevious = (data: object) => {
 	return request({
 		url: `/api/v1/Order/order_previous`,
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -289,7 +307,7 @@ export const workflowRecall = (data: object) => {
 	return request({
 		url: `/api/v1/Workflow/recall`,
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -301,7 +319,7 @@ export const supplement = (data: object) => {
 	return request({
 		url: '/api/v1/Workflow/supplement',
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -331,11 +349,11 @@ export const workflowDetail = (workflowId: string) => {
  * @param {object} params
  * @return {*}
  */
-export const WorkflowLatest = (params:object) => {
+export const WorkflowLatest = (params: object) => {
 	return request({
 		url: `/api/v1/Workflow/latest`,
 		method: 'get',
-		params
+		params,
 	});
 };
 /**
@@ -348,26 +366,43 @@ export const wfmodules = () => {
 		method: 'get',
 	});
 };
+/**
+ * @description 所有工作流模块 导出
+ * @return {*}
+ */
+export const wfmodulesExport = (data?: object) => {
+	return request(
+		{
+			url: `/api/v1/Workflow/wfmodules/export`,
+			method: 'post',
+			responseType: 'blob',
+			data,
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+};
 /**
  * @description 为工作流业务匹配或取消流程模板
  * @param {object} data
  * @return {*}
  */
-export const wfmodulesMatch = (data:object) => {
+export const wfmodulesMatch = (data: object) => {
 	return request({
 		url: `/api/v1/Workflow/wfmodule/match`,
 		method: 'put',
-		data
+		data,
 	});
 };
 /**
  * @description 获取重办参数
  * @param {string} workflowId
  */
-export const workflowRedoParams= (workflowId: string) => {
+export const workflowRedoParams = (workflowId: string) => {
 	return request({
 		url: `/api/v1/Workflow/${workflowId}/redo`,
-		method: 'get'
+		method: 'get',
 	});
 };
 /**
@@ -378,7 +413,7 @@ export const workflowCancel = (data: object) => {
 	return request({
 		url: `/api/v1/Workflow/cancel`,
 		method: 'post',
-		data
+		data,
 	});
 };
 /**
@@ -389,6 +424,6 @@ export const workflowReject = (data: object) => {
 	return request({
 		url: `/api/v1/Workflow/reject`,
 		method: 'post',
-		data
+		data,
 	});
-};
+};

+ 37 - 7
src/api/system/workforce.ts

@@ -109,7 +109,7 @@ export const getWorkforceClassUserList = (params: object) => {
 		method: 'get',
 		params,
 	});
-}
+};
 /**
  * @description 批量排班
  * @return {*}
@@ -121,7 +121,7 @@ export const batchScheduling = (data: object) => {
 		method: 'post',
 		data,
 	});
-}
+};
 /**
  * @description 排班修改
  * @return {*}
@@ -133,7 +133,7 @@ export const updateScheduling = (data: object) => {
 		method: 'put',
 		data,
 	});
-}
+};
 /**
  * @description 排班详情
  * @return {*}
@@ -144,16 +144,46 @@ export const getSchedulingDetail = (id: string) => {
 		url: `/api/v1/Scheduling/${id}`,
 		method: 'get',
 	});
-}
+};
 /**
  * @description 批量删除排班
  * @param {object} data
  * @return {*}
  */
-export const deleteScheduling = (data:object) => {
+export const deleteScheduling = (data: object) => {
 	return request({
 		url: `/api/v1/Scheduling`,
 		method: 'delete',
-		data
+		data,
+	});
+};
+/**
+ * @description 获取排班统计
+ * @return {*}
+ * @param params
+ */
+export const getSchedulingStatistics = (params: object) => {
+	return request({
+		url: `/api/v1/Scheduling/get-scheduling-statistics-list`,
+		method: 'get',
+		params,
 	});
-}
+};
+/**
+ * @description 排班统计 导出
+ * @return {*}
+ * @param data
+ */
+export const getSchedulingStatisticsExport = (data: object) => {
+	return request(
+		{
+			url: `/api/v1/Scheduling/get-scheduling-statistics-list-export`,
+			method: 'post',
+			responseType: 'blob',
+			data,
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+};

+ 14 - 9
src/views/auxiliary/advice/components/Advice-add.vue

@@ -1,7 +1,19 @@
 <template>
-	<el-dialog v-model="state.dialogVisible" width="800px" draggable title="新增常用意见"  @close="close">
+	<el-dialog v-model="state.dialogVisible" width="800px" draggable title="新增常用意见" @close="close">
 		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
 			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
+							<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="意见分类" prop="isOpen" :rules="[{ required: true, message: '请选择意见分类', trigger: 'change' }]">
+						<el-switch v-model="state.ruleForm.isOpen" inline-prompt active-text="公开常用意见" inactive-text="个人常用意见" />
+					</el-form-item>
+				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 					<el-form-item label="意见内容" prop="content" :rules="[{ required: true, message: '请填写意见内容', trigger: 'blur' }]">
 						<el-input
@@ -14,13 +26,6 @@
 						></el-input>
 					</el-form-item>
 				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
-						<el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
-							<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
-						</el-select>
-					</el-form-item>
-				</el-col>
 			</el-row>
 		</el-form>
 		<template #footer>
@@ -51,7 +56,7 @@ const state = reactive<any>({
 	ruleForm: {
 		content: '', // 意见内容
 		commonType: '', // 意见类型
-		isOpen: true, // 是否公开意见
+		isOpen: false, // 是否公开意见
 	},
 });
 let loading = ref<boolean>(false); // 加载状态

+ 12 - 7
src/views/auxiliary/advice/components/Advice-edit.vue

@@ -2,6 +2,18 @@
 	<el-dialog v-model="state.dialogVisible" width="50%" draggable title="修改常用意见" @close="close">
 		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
 			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
+							<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="意见分类" prop="isOpen" :rules="[{ required: true, message: '请选择意见分类', trigger: 'change' }]">
+						<el-switch v-model="state.ruleForm.isOpen" inline-prompt active-text="公开常用意见" inactive-text="个人常用意见" />
+					</el-form-item>
+				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 					<el-form-item label="意见内容" prop="content" :rules="[{ required: true, message: '请填写意见内容', trigger: 'blur' }]">
 						<el-input
@@ -14,13 +26,6 @@
 						></el-input>
 					</el-form-item>
 				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
-						<el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
-							<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
-						</el-select>
-					</el-form-item>
-				</el-col>
 			</el-row>
 		</el-form>
 		<template #footer>

+ 7 - 3
src/views/auxiliary/advice/index.vue

@@ -26,6 +26,7 @@
 				:refresh="{
 					queryMethod: handleQuery,
 				}"
+				:tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
 			>
 				<template #buttons>
 					<el-button type="primary" @click="onAdviceAdd" :loading="state.loading"> <SvgIcon name="ele-Plus" class="mr5" />新增常用意见</el-button>
@@ -48,6 +49,7 @@
 					:custom-config="{ storage: true }"
 					@checkbox-all="selectAllChangeEvent"
 					@checkbox-change="selectChangeEvent"
+					:params="{ exportMethod: commonListExport, exportParams: requestParams }"
 				>
 					<vxe-column type="checkbox" width="60" align="center"></vxe-column>
 					<vxe-column field="content" title="意见内容" min-width="300"></vxe-column>
@@ -90,8 +92,8 @@
 import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
-import { commonBaseData, deleteCommon, publicCommonList } from '@/api/auxiliary/advice';
-
+import { commonBaseData, commonListExport, deleteCommon, publicCommonList } from '@/api/auxiliary/advice';
+import Other from '@/utils/other';
 // 引入组件
 const AdviceAdd = defineAsyncComponent(() => import('@/views/auxiliary/advice/components/Advice-add.vue')); // 常用意见新增
 const AdviceEdit = defineAsyncComponent(() => import('@/views/auxiliary/advice/components/Advice-edit.vue')); // 常用意见编辑
@@ -136,9 +138,11 @@ const handleQuery = () => {
 	queryList();
 };
 // 获取列表
+const requestParams = ref<EmptyObjectType>({});
 const queryList = () => {
 	state.loading = true;
-	publicCommonList(state.queryParams)
+	requestParams.value = Other.deepClone(state.queryParams);
+	publicCommonList(requestParams.value)
 		.then((res) => {
 			state.loading = false;
 			state.tableData = res.result.items ?? [];

+ 79 - 7
src/views/auxiliary/numberInfo/components/Number-info-add.vue

@@ -1,11 +1,83 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-  $END$
+	<el-dialog v-model="state.dialogVisible" draggable title="回复" append-to-body ref="dialogRef" destroy-on-close @close="close">
+		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
+			<el-form-item label="回复内容" class="textarea" prop="replyContent" :rules="[{ required: true, message: '请填写回复内容', trigger: 'blur' }]">
+				<el-input
+					v-model="state.ruleForm.replyContent"
+					type="textarea"
+					show-word-limit
+					:autosize="{ minRows: 6, maxRows: 20 }"
+					placeholder="请填写回复内容"
+					:maxlength="200"
+				/>
+			</el-form-item>
+			<el-form-item label="完成时间" prop="completionTime" :rules="[{ required: true, message: '请选择选择完成时间', trigger: 'change' }]">
+				<el-date-picker v-model="state.ruleForm.completionTime" type="date" placeholder="请选择选择完成时间" value-format="YYYY-MM-DD" />
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
 </template>
 
-<style scoped lang="scss">
+<script setup lang="ts">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { getObservationsReply } from '@/api/business/observations';
 
-</style>
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		replyContent: null, // 回复内容
+		completionTime: null, // 完成时间
+		id: null,
+	},
+	loading: false, // 提交按钮loading
+});
+const ruleFormRef = ref<RefType>();
+// 打开弹窗
+const openDialog = async (val: any) => {
+	state.ruleForm.id = val.id;
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 提交
+const onSubmit = throttle((formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		getObservationsReply(state.ruleForm)
+			.then(() => {
+				ElMessage.success('回复成功');
+				state.loading = false;
+				state.dialogVisible = false;
+				emit('updateList');
+			})
+			.catch(() => {
+				state.loading = false;
+				state.dialogVisible = false;
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 194 - 7
src/views/auxiliary/numberInfo/index.vue

@@ -1,11 +1,198 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-  $END$
+	<div class="auxiliary-number-info-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
+				<el-form-item label="关键词" prop="Keyword">
+					<el-input v-model="state.queryParams.Keyword" placeholder="班次名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
+				</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>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+				<template #buttons>
+					<el-button type="primary" @click="onAdd" v-auth="'auxiliary:numberInfo:add'" :loading="state.loading"
+						><SvgIcon name="ele-Plus" class="mr5" />新增
+					</el-button>
+				</template>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true }"
+					:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="auxiliaryNumberInfo"
+					:custom-config="{ storage: true }"
+					showHeaderOverflow
+					@checkbox-all="selectAllChangeEvent"
+					@checkbox-change="selectChangeEvent"
+				>
+					<vxe-column type="checkbox" width="50" align="center"></vxe-column>
+					<vxe-column field="name" title="班次名称" min-width="200"></vxe-column>
+
+					<vxe-column field="workingTime" title="上班时间" min-width="200"></vxe-column>
+					<vxe-column field="offDutyTime" title="下班时间" min-width="200"></vxe-column>
+					<vxe-column field="creationTime" title="创建时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column title="操作" fixed="right" width="120" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onEdit(row)" title="编辑" v-auth="'auxiliary:numberInfo:edit'"> 编辑 </el-button>
+							<el-button link type="danger" @click="onDelete(row)" title="删除" v-auth="'auxiliary:numberInfo:delete'"> 删除 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+		<!-- 新增修改班次 -->
+		<number-edit ref="numberEditRef" @updateList="queryList" />
+	</div>
 </template>
 
-<style scoped lang="scss">
+<script lang="tsx" setup name="auxiliaryNumberInfo">
+import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import type { FormInstance } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { getWorkforceClassList, deleteWorkforceClass } from '@/api/system/workforce';
 
-</style>
+// 引入组件
+const NumberEdit = defineAsyncComponent(() => import('@/views/system/workforce/components/Number-edit.vue')); // 新增修改班次
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
+// 定义变量内容
+const state = reactive({
+	queryParams: {
+		PageIndex: 1, // 当前页
+		PageSize: 20, // 每页条数
+		Keyword: null, // 关键字
+	},
+	tableData: [], // 列表数据
+	loading: false, // 加载
+	total: 0, // 总条数
+});
+const ruleFormRef = ref<FormInstance>(); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 班次列表 */
+const queryList = async () => {
+	state.loading = true;
+	try {
+		const response = await getWorkforceClassList(state.queryParams);
+		state.tableData = response.result?.items ?? [];
+		state.total = response.result?.total ?? 0;
+		state.loading = false;
+	} catch (e) {
+		state.loading = false;
+		console.log(e);
+	}
+};
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 新增班次
+const numberEditRef = ref<RefType>();
+const onAdd = () => {
+	numberEditRef.value.openDialog();
+};
+// 编辑班次
+const onEdit = (row: any) => {
+	numberEditRef.value.openDialog(row.id);
+};
+// 删除班次
+const onDelete = (row: any) => {
+	ElMessageBox.confirm(`确定删除【${row.name}】该班次?若当前班次已排班,删除后该班次将替换为休息日!是否确定删除?`, '提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+	})
+		.then(() => {
+			deleteWorkforceClass({ ids: [row.id] }).then(() => {
+				queryList();
+				ElMessage.success('删除成功');
+			});
+		})
+		.catch(() => {
+			console.log('取消删除');
+		});
+};
+// 批量删除班次
+const onDeleteMultiple = () => {
+	const ids = checkTable.value.map((item: any) => item.id);
+	ElMessageBox.confirm(`确定删除选中的班次?若当前班次已排班,删除后该班次将替换为休息日!是否确定删除?`, '提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+	})
+		.then(() => {
+			deleteWorkforceClass({ ids }).then(() => {
+				queryList();
+				ElMessage.success('删除成功');
+			});
+		})
+		.catch(() => {
+			console.log('取消删除');
+		});
+};
+const tableRef = ref<RefType>();
+const checkTable = ref<EmptyArrayType>([]);
+const selectAllChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !Boolean(checkTable.value.length);
+});
+const toolbarRef = ref<RefType>();
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+});
+</script>

+ 11 - 9
src/views/business/observations/components/Observe-detail.vue

@@ -1,8 +1,8 @@
 <template>
 	<el-dialog v-model="state.dialogVisible" draggable title="查看回复" append-to-body ref="dialogRef" destroy-on-close>
 		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
-			<el-form-item label="回复内容"> </el-form-item>
-			<el-form-item label="完成时间"> </el-form-item>
+			<el-form-item label="回复内容"> {{ state.ruleForm.replyContent }} </el-form-item>
+			<el-form-item label="完成时间"> {{ formatDate(state.ruleForm.replyTime, 'YYYY-mm-dd') }} </el-form-item>
 		</el-form>
 		<template #footer>
 			<span class="dialog-footer">
@@ -14,12 +14,9 @@
 
 <script setup lang="ts">
 import { reactive, ref } from 'vue';
-import { ElMessage, FormInstance } from 'element-plus';
-import { throttle } from '@/utils/tools';
-import { orderBatchReminder } from '@/api/business/order';
+import { getObservationsReplyDetail } from '@/api/business/observations';
+import { formatDate } from '@/utils/formatTime';
 
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList']);
 // 定义变量内容
 const state = reactive<any>({
 	dialogVisible: false,
@@ -32,11 +29,16 @@ const state = reactive<any>({
 });
 const ruleFormRef = ref<RefType>();
 // 打开弹窗
-const ids = ref<EmptyArrayType>([]);
 const openDialog = async (val: any) => {
-	ids.value = val;
+	getInfo(val.id);
 	state.dialogVisible = true;
 };
+// 获取回复信息
+const getInfo = (id: string) => {
+	getObservationsReplyDetail(id).then((response) => {
+		state.ruleForm = response?.result ?? {};
+	});
+};
 // 关闭弹窗
 const closeDialog = () => {
 	state.dialogVisible = false;

+ 10 - 14
src/views/business/observations/components/Observe-reply.vue

@@ -1,9 +1,9 @@
 <template>
 	<el-dialog v-model="state.dialogVisible" draggable title="回复" append-to-body ref="dialogRef" destroy-on-close @close="close">
 		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
-			<el-form-item label="回复内容" class="textarea" prop="urgeContent" :rules="[{ required: true, message: '请填写回复内容', trigger: 'blur' }]">
+			<el-form-item label="回复内容" class="textarea" prop="replyContent" :rules="[{ required: true, message: '请填写回复内容', trigger: 'blur' }]">
 				<el-input
-					v-model="state.ruleForm.urgeContent"
+					v-model="state.ruleForm.replyContent"
 					type="textarea"
 					show-word-limit
 					:autosize="{ minRows: 6, maxRows: 20 }"
@@ -11,8 +11,8 @@
 					:maxlength="200"
 				/>
 			</el-form-item>
-			<el-form-item label="完成时间" prop="acceptSms" :rules="[{ required: true, message: '请选择选择完成时间', trigger: 'change' }]">
-				<el-date-picker v-model="state.ruleForm.acceptSms" type="date" placeholder="请选择选择完成时间" value-format="YYYY-MM-DD" />
+			<el-form-item label="完成时间" prop="completionTime" :rules="[{ required: true, message: '请选择选择完成时间', trigger: 'change' }]">
+				<el-date-picker v-model="state.ruleForm.completionTime" type="date" placeholder="请选择选择完成时间" value-format="YYYY-MM-DD" />
 			</el-form-item>
 		</el-form>
 		<template #footer>
@@ -28,7 +28,7 @@
 import { reactive, ref } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { throttle } from '@/utils/tools';
-import { orderBatchReminder } from '@/api/business/order';
+import { getObservationsReply } from '@/api/business/observations';
 
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
@@ -36,16 +36,16 @@ const emit = defineEmits(['updateList']);
 const state = reactive<any>({
 	dialogVisible: false,
 	ruleForm: {
-		urgeContent: null, // 回复内容
-		acceptSms: null, // 完成时间
+		replyContent: null, // 回复内容
+		completionTime: null, // 完成时间
+		id: null,
 	},
 	loading: false, // 提交按钮loading
 });
 const ruleFormRef = ref<RefType>();
 // 打开弹窗
-const ids = ref<EmptyArrayType>([]);
 const openDialog = async (val: any) => {
-	ids.value = val;
+	state.ruleForm.id = val.id;
 	state.dialogVisible = true;
 };
 // 关闭弹窗
@@ -62,11 +62,7 @@ const onSubmit = throttle((formEl: FormInstance | undefined) => {
 	formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		state.loading = true;
-		let request = {
-			...state.ruleForm,
-			orderIds: ids.value,
-		};
-		orderBatchReminder(request)
+		getObservationsReply(state.ruleForm)
 			.then(() => {
 				ElMessage.success('回复成功');
 				state.loading = false;

+ 47 - 55
src/views/business/observations/index.vue

@@ -2,23 +2,6 @@
 	<div class="business-observations-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
-				<el-form-item label="数据范围" prop="fastSearch">
-					<el-segmented
-						:options="[
-							{
-								value: '0',
-								label: '全部',
-							},
-							{
-								value: '1',
-								label: '本级',
-							},
-						]"
-						v-model="state.queryParams.fastSearch"
-						@change="handleQuery"
-						:disabled="state.loading"
-					/>
-				</el-form-item>
 				<el-form-item label="工单编码" prop="No">
 					<el-input v-model.trim="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
 				</el-form-item>
@@ -55,43 +38,43 @@
 					id="businessObservations"
 					:custom-config="{ storage: true }"
 					showHeaderOverflow
-					:params="{ exportMethod: observeListExport, exportParams: requestParams }"
+					:params="{ exportMethod: exportObservationsList, exportParams: requestParams }"
 					@sort-change="sortChange"
 				>
-					<vxe-column field="order.no" title="是否回复" width="140"></vxe-column>
-					<vxe-column field="order.no" title="工单编码" width="140"></vxe-column>
-					<vxe-column field="order.title" title="工单标题" min-width="200">
+					<vxe-column field="isReplyText" title="是否回复" width="140"></vxe-column>
+					<vxe-column field="no" title="工单编码" width="140"></vxe-column>
+					<vxe-column field="title" title="工单标题" min-width="200">
 						<template #default="{ row }">
-							<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
+							<order-detail :order="{ id: row.orderId }" @updateList="queryList">{{ row.title }}</order-detail>
 						</template>
 					</vxe-column>
-					<vxe-column field="order.acceptType" title="受理类型" width="110"></vxe-column>
-					<vxe-column field="order.hotspotName" title="热点分类" width="150"></vxe-column>
-					<vxe-column field="order.creationTime" title="受理时间" width="160" sortable>
+					<vxe-column field="acceptType" title="受理类型" width="110"></vxe-column>
+					<vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
+					<vxe-column field="acceptanceTime" title="受理时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.acceptanceTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<vxe-column field="order.expiredTime" title="期满时间" width="160" sortable>
+					<vxe-column field="expiredTime" title="期满时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<vxe-column field="order.actualHandleOrgName" title="接办部门" width="140"></vxe-column>
-					<vxe-column field="order.actualHandleTime" title="接办时间" width="160" sortable>
+					<vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
+					<vxe-column field="filedTime" title="办结时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<vxe-column field="order.hotspotName" title="设置人" width="150"></vxe-column>
-					<vxe-column field="order.filedTime" title="设置时间" width="160" sortable>
+					<vxe-column field="creatorName" title="设置人" width="150"></vxe-column>
+					<vxe-column field="creationTime" title="设置时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
 					<vxe-column title="操作" fixed="right" width="90" align="center" :show-overflow="false">
 						<template #default="{ row }">
-							<el-button link type="primary" @click="onDetail(row)" title="回复"> 查看回复 </el-button>
+							<el-button link type="primary" @click="onDetail(row)" title="回复" v-if="row.isReply"> 查看回复 </el-button>
 						</template>
 					</vxe-column>
 				</vxe-table>
@@ -160,8 +143,8 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<el-form-item label="设置人" prop="ActualHandleOrgName">
-					<el-input v-model="state.queryParams.ActualHandleOrgName" placeholder="请填写设置人" clearable @keyup.enter="handleQuery" />
+				<el-form-item label="设置人" prop="CreatorName">
+					<el-input v-model="state.queryParams.CreatorName" placeholder="请填写设置人" clearable @keyup.enter="handleQuery" />
 				</el-form-item>
 				<el-form-item label="设置时间" prop="szTime">
 					<el-date-picker
@@ -177,8 +160,8 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<el-form-item label="是否回复" prop="IsUrgent">
-					<el-select v-model="state.queryParams.IsUrgent" placeholder="请选择是否回复" clearable @change="handleQuery">
+				<el-form-item label="是否回复" prop="IsReply">
+					<el-select v-model="state.queryParams.IsReply" placeholder="请选择是否回复" clearable @change="handleQuery">
 						<el-option :value="true" label="是" />
 						<el-option :value="false" label="否" />
 					</el-select>
@@ -194,13 +177,13 @@
 	</div>
 </template>
 <script setup lang="tsx" name="businessObservations">
-import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
-import { deleteObserve, observeBaseData, observeList, observeListExport } from '@/api/query/observe';
+import { observeBaseData } from '@/api/query/observe';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
-import { exportAssignment } from '@/utils/tools';
 import Other from '@/utils/other';
+import { exportObservationsList, getObservationsList } from '@/api/business/observations';
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
@@ -216,18 +199,22 @@ const state = reactive<any>({
 		No: null,
 		Title: null,
 		slTime: [], // 受理时间
-		StartTime: null,
-		EndTime: null,
+		AcceptanceStartTime: null,
+		AcceptanceEndTime: null,
 		exTime: [], // 期满时间
-		ExpiredTimeStart: null,
-		ExpiredTimeEnd: null,
+		ExpiredStartTime: null,
+		ExpiredEndTime: null,
 		ActualHandleOrgName: null, // 接办部门
 		AcceptType: null, //受理类型
 		Hotspot: null, // 热点分类
-		fastSearch: '0', //
 		bjTime: [], // 办结时间
+		FiledStartTime: null, //
+		FiledEndTime: null, //
+		CreatorName: null, // 设置人
 		szTime: [], // 设置时间
-		IsUrgent: null, // 是否回复
+		CreationStartTime: null,
+		CreationEndTime: null,
+		IsReply: null, // 是否回复
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -243,13 +230,19 @@ const requestParams = ref<EmptyObjectType>({});
 const queryList = () => {
 	state.loading = true;
 	requestParams.value = Other.deepClone(state.queryParams);
-	requestParams.value.StartTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[0]; // 受理时间
-	requestParams.value.EndTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
+	requestParams.value.AcceptanceStartTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[0]; // 受理时间
+	requestParams.value.AcceptanceEndTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
 	Reflect.deleteProperty(requestParams.value, 'slTime'); // 删除无用的参数
-	requestParams.value.ExpiredTimeStart = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
-	requestParams.value.ExpiredTimeEnd = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
+	requestParams.value.ExpiredStartTime = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
+	requestParams.value.ExpiredEndTime = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
 	Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
-	observeList(requestParams.value)
+	requestParams.value.FiledStartTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[0]; // 办结时间
+	requestParams.value.FiledEndTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[1];
+	Reflect.deleteProperty(requestParams.value, 'bjTime'); // 删除无用的参数
+	requestParams.value.CreationStartTime = state.queryParams.szTime === null ? null : state.queryParams.szTime[0]; // 设置时间
+	requestParams.value.CreationEndTime = state.queryParams.szTime === null ? null : state.queryParams.szTime[1];
+	Reflect.deleteProperty(requestParams.value, 'szTime'); // 删除无用的参数
+	getObservationsList(requestParams.value)
 		.then((res) => {
 			state.tableData = res?.result.items ?? [];
 			state.total = res?.result.total;
@@ -278,7 +271,6 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 // 回复详情
 const observeDetailRef = ref<RefType>();
 const onDetail = (row: any) => {
-	console.log(row);
 	observeDetailRef.value.openDialog(row);
 };
 // 获取基础信息

+ 50 - 42
src/views/business/observations/reply.vue

@@ -1,12 +1,12 @@
 <template>
 	<div class="business-observations-Reply-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
-			<el-tabs v-model="state.queryParams.TypeCode" @tab-change="handleQuery">
+			<el-tabs v-model="state.queryParams.Type" @tab-change="handleQuery">
 				<el-tab-pane name="0" label="待回复" :disabled="state.loading"></el-tab-pane>
 				<el-tab-pane name="1" label="已回复" :disabled="state.loading"></el-tab-pane>
 			</el-tabs>
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
-				<el-form-item label="数据范围" prop="fastSearch">
+				<el-form-item label="数据范围" prop="DataSoure">
 					<el-segmented
 						:options="[
 							{
@@ -18,7 +18,7 @@
 								label: '本级',
 							},
 						]"
-						v-model="state.queryParams.fastSearch"
+						v-model="state.queryParams.DataSoure"
 						@change="handleQuery"
 						:disabled="state.loading"
 					/>
@@ -59,39 +59,38 @@
 					id="businessObservationsReply"
 					:custom-config="{ storage: true }"
 					showHeaderOverflow
-					:params="{ exportMethod: observeListExport, exportParams: requestParams }"
+					:params="{ exportMethod: exportObservationsReplyList, exportParams: requestParams }"
 					@sort-change="sortChange"
 				>
-					<vxe-column type="checkbox" width="60" align="center"></vxe-column>
-					<vxe-column field="order.no" title="工单编码" width="140"></vxe-column>
-					<vxe-column field="order.title" title="工单标题" min-width="200">
+					<vxe-column field="no" title="工单编码" width="140"></vxe-column>
+					<vxe-column field="title" title="工单标题" min-width="200">
 						<template #default="{ row }">
-							<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
+							<order-detail :order="{ id: row.orderId }" @updateList="queryList">{{ row.title }}</order-detail>
 						</template>
 					</vxe-column>
-					<vxe-column field="order.acceptType" title="受理类型" width="110"></vxe-column>
-					<vxe-column field="order.hotspotName" title="热点分类" width="150"></vxe-column>
-					<vxe-column field="order.creationTime" title="受理时间" width="160" sortable>
+					<vxe-column field="acceptType" title="受理类型" width="110"></vxe-column>
+					<vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
+					<vxe-column field="acceptanceTime" title="受理时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.acceptanceTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<vxe-column field="order.expiredTime" title="期满时间" width="160" sortable>
+					<vxe-column field="expiredTime" title="期满时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<vxe-column field="order.actualHandleOrgName" title="接办部门" width="140"></vxe-column>
-					<vxe-column field="order.filedTime" title="办结时间" width="160" sortable>
+					<vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
+					<vxe-column field="filedTime" title="办结时间" width="160" sortable>
 						<template #default="{ row }">
-							{{ formatDate(row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
+							{{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<template v-if="state.queryParams.TypeCode === '1'">
-						<vxe-column field="order.hotspotName" title="回复人" width="140"></vxe-column>
-						<vxe-column field="order.replyTime" title="回复时间" width="160" sortable>
+					<template v-if="state.queryParams.Type === '1'">
+						<vxe-column field="replyUserName" title="回复人" width="140"></vxe-column>
+						<vxe-column field="replyTime" title="回复时间" width="160" sortable>
 							<template #default="{ row }">
-								{{ formatDate(row.order?.replyTime, 'YYYY-mm-dd HH:MM:SS') }}
+								{{ formatDate(row.replyTime, 'YYYY-mm-dd HH:MM:SS') }}
 							</template>
 						</vxe-column>
 					</template>
@@ -103,7 +102,7 @@
 								@click="onReply(row)"
 								title="回复"
 								v-auth="'business:observations:reply'"
-								v-if="state.queryParams.TypeCode === '0'"
+								v-if="state.queryParams.Type === '0'"
 							>
 								回复
 							</el-button>
@@ -176,9 +175,9 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<template v-if="state.queryParams.TypeCode === '1'">
-					<el-form-item label="回复人" prop="Hotspot">
-						<el-input v-model="state.queryParams.Hotspot" placeholder="回复人" clearable @keyup.enter="handleQuery" />
+				<template v-if="state.queryParams.Type === '1'">
+					<el-form-item label="回复人" prop="ReplyUserName">
+						<el-input v-model="state.queryParams.ReplyUserName" placeholder="回复人" clearable @keyup.enter="handleQuery" />
 					</el-form-item>
 					<el-form-item label="回复时间" prop="hfTime">
 						<el-date-picker
@@ -208,13 +207,13 @@
 	</div>
 </template>
 <script setup lang="tsx" name="businessObservationsReply">
-import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
-import { deleteObserve, observeBaseData, observeList, observeListExport } from '@/api/query/observe';
+import { observeBaseData } from '@/api/query/observe';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
-import { exportAssignment } from '@/utils/tools';
 import Other from '@/utils/other';
+import { exportObservationsReplyList, getObservationsReplyList } from '@/api/business/observations';
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
@@ -231,18 +230,23 @@ const state = reactive<any>({
 		No: null,
 		Title: null,
 		slTime: [], // 受理时间
-		StartTime: null,
-		EndTime: null,
+		AcceptanceStartTime: null,
+		AcceptanceEndTime: null,
 		exTime: [], // 期满时间
-		ExpiredTimeStart: null,
-		ExpiredTimeEnd: null,
+		ExpiredStartTime: null,
+		ExpiredEndTime: null,
 		ActualHandleOrgName: null, // 接办部门
 		AcceptType: null, //受理类型
 		Hotspot: null, // 热点分类
-		fastSearch: '0',
-		TypeCode: '0', // 0:待回复 1:已回复
+		DataSoure: '0', // 数据范围 	 0:全部 ,1:本级
+		Type: '0', // 0:待回复 1:已回复
 		bjTime: [], // 办结时间
+		FiledStartTime: null,
+		FiledEndTime: null,
+		ReplyUserName: null, // 回复人
 		hfTime: [], // 回复时间
+		ReplyStartTime: null,
+		ReplyEndTime: null,
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -258,13 +262,19 @@ const requestParams = ref<EmptyObjectType>({});
 const queryList = () => {
 	state.loading = true;
 	requestParams.value = Other.deepClone(state.queryParams);
-	requestParams.value.StartTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[0]; // 受理时间
-	requestParams.value.EndTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
+	requestParams.value.AcceptanceStartTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[0]; // 受理时间
+	requestParams.value.AcceptanceEndTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
 	Reflect.deleteProperty(requestParams.value, 'slTime'); // 删除无用的参数
-	requestParams.value.ExpiredTimeStart = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
-	requestParams.value.ExpiredTimeEnd = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
+	requestParams.value.ExpiredStartTime = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
+	requestParams.value.ExpiredEndTime = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
 	Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
-	observeList(requestParams.value)
+	requestParams.value.FiledStartTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[0]; // 办结时间
+	requestParams.value.FiledEndTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[1];
+	Reflect.deleteProperty(requestParams.value, 'bjTime'); // 删除无用的参数
+	requestParams.value.ReplyStartTime = state.queryParams.hfTime === null ? null : state.queryParams.hfTime[0]; // 回复时间
+	requestParams.value.ReplyEndTime = state.queryParams.hfTime === null ? null : state.queryParams.hfTime[1];
+	Reflect.deleteProperty(requestParams.value, 'hfTime'); // 删除无用的参数
+	getObservationsReplyList(requestParams.value)
 		.then((res) => {
 			state.tableData = res?.result.items ?? [];
 			state.total = res?.result.total;
@@ -293,13 +303,11 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 // 回复
 const observeReplyRef = ref<RefType>();
 const onReply = (row: any) => {
-	console.log(row);
 	observeReplyRef.value.openDialog(row);
 };
 // 回复详情
 const observeDetailRef = ref<RefType>();
 const onDetail = (row: any) => {
-	console.log(row);
 	observeDetailRef.value.openDialog(row);
 };
 // 获取基础信息

+ 3 - 2
src/views/business/visit/components/Visit-detail.vue

@@ -623,8 +623,8 @@
 								<!-- 自贡的观察件 -->
 								<template v-if="['ZiGong'].includes(themeConfig.appScope)">
 									<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-auth="'business:visit:observe'">
-										<el-form-item label="观察件" prop="guancha" :rules="[{ required: false, message: '请选择观察件', trigger: 'change' }]">
-											<el-checkbox v-model="state.ruleForm.guancha">设为观察件</el-checkbox>
+										<el-form-item label="观察件" prop="isObservationPiece" :rules="[{ required: false, message: '请选择观察件', trigger: 'change' }]">
+											<el-checkbox v-model="state.ruleForm.isObservationPiece">设为观察件</el-checkbox>
 										</el-form-item>
 									</el-col>
 								</template>
@@ -707,6 +707,7 @@ const state = reactive<any>({
 		timeLimitUnit: 2,
 		timeLimit: 1,
 		stepType: null,
+		isObservationPiece:null, // 是否设置为观察件
 	},
 	orderDetail: {}, // 工单详情
 	orderVisitModel: {}, // 回访详情

+ 12 - 10
src/views/system/config/workflow/index.vue

@@ -5,15 +5,9 @@
 				<el-tab-pane label="流程业务" name="0" :disabled="state.loading"></el-tab-pane>
 				<el-tab-pane label="流程模板" name="1" :disabled="state.loading"></el-tab-pane>
 			</el-tabs>
-			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent  v-if="state.activeName === '1'">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent v-if="state.activeName === '1'">
 				<el-form-item label="关键字查询" prop="Keyword">
-					<el-input
-						v-model="state.queryParams.Keyword"
-						placeholder="模板名称/模板编码"
-						clearable
-						@keyup.enter="handleQuery"
-						class="keyword-input"
-					/>
+					<el-input v-model="state.queryParams.Keyword" placeholder="模板名称/模板编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
 				</el-form-item>
 				<el-form-item label="模板状态" prop="Status">
 					<el-select v-model="state.queryParams.Status" placeholder="请选择模板状态" @change="handleQuery" clearable>
@@ -36,6 +30,7 @@
 					:refresh="{
 						queryMethod: handleQuery,
 					}"
+					:tools="[{ toolRender: { name: 'exportAll' } }]"
 				>
 				</vxe-toolbar>
 				<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
@@ -53,6 +48,7 @@
 						id="systemWorkflow1"
 						:custom-config="{ storage: true }"
 						showHeaderOverflow
+						:params="{ exportMethod: wfmodulesExport, exportParams: {} }"
 					>
 						<vxe-column field="name" title="业务模块" min-width="120"></vxe-column>
 						<vxe-column field="code" title="编码" min-width="120"></vxe-column>
@@ -82,7 +78,6 @@
 			</template>
 			<!--    流程模板      -->
 			<template v-else>
-
 				<vxe-toolbar
 					ref="toolbarRef2"
 					:loading="state.loading"
@@ -90,6 +85,7 @@
 					:refresh="{
 						queryMethod: handleQuery,
 					}"
+					:tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
 				>
 					<template #buttons>
 						<el-button type="primary" @click="onAddTemp" v-auth="'system:workflow:template:add'">
@@ -112,6 +108,7 @@
 						id="systemWorkflow2"
 						:custom-config="{ storage: true }"
 						showHeaderOverflow
+						:params="{ exportMethod: workflowListExport, exportParams: requestParams }"
 					>
 						<vxe-column field="name" title="模板名称" min-width="120"></vxe-column>
 						<vxe-column field="code" title="模板编码" min-width="120"></vxe-column>
@@ -178,11 +175,14 @@ import {
 	baseData,
 	publishOnList,
 	wfmodules,
+	wfmodulesExport,
 	wfmodulesMatch,
 	workflowDelete,
 	workflowList,
+	workflowListExport,
 	// workflowTerminate,
 } from '@/api/system/workflow';
+import Other from '@/utils/other';
 
 // 引入组件
 const WorkflowJump = defineAsyncComponent(() => import('@/views/system/config/workflow/components/Workflow-jump.vue')); // 流程跳转
@@ -222,6 +222,7 @@ const handleQuery = () => {
 	queryList();
 };
 /** 获取列表 */
+const requestParams = ref<EmptyObjectType>({});
 const queryList = () => {
 	state.loading = true;
 	let req: any = {
@@ -247,7 +248,8 @@ const queryList = () => {
 				...req,
 				Status: state.queryParams.Status,
 			};
-			workflowList(req)
+			requestParams.value = Other.deepClone(req);
+			workflowList(requestParams.value)
 				.then((response: any) => {
 					state.tableData = response.result.items ?? [];
 					state.total = response.result.total;

+ 133 - 7
src/views/system/workforce/statistics.vue

@@ -1,11 +1,137 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-  $END$
+	<div class="sys-workforce-statistics-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
+				<el-form-item label="值班人员" prop="Keyword">
+					<el-input v-model="state.queryParams.Keyword" placeholder="值班人员" clearable @keyup.enter="handleQuery" class="keyword-input" />
+				</el-form-item>
+				<el-form-item label="值班时间" prop="crTime">
+					<el-date-picker
+						v-model="state.queryParams.crTime"
+						type="daterange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</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>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+				:tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
+			>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true }"
+					:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="systemWorkforceStatistics"
+					:custom-config="{ storage: true }"
+					showHeaderOverflow
+					:params="{ exportMethod: getSchedulingStatisticsExport, exportParams: requestParams }"
+				>
+					<vxe-column field="date" title="值班月份"></vxe-column>
+					<vxe-column field="userName" title="值班人员"></vxe-column>
+					<vxe-column field="count" title="值班次数"></vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+	</div>
 </template>
 
-<style scoped lang="scss">
+<script lang="tsx" setup name="systemWorkforceStatistics">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import type { FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { getSchedulingStatistics, getSchedulingStatisticsExport, getWorkforceList } from '@/api/system/workforce';
+import { workflowListExport } from '@/api/system/workflow';
+import Other from '@/utils/other';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 
-</style>
+// 引入组件
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
+// 定义变量内容
+const state = reactive({
+	queryParams: {
+		PageIndex: 1, // 当前页
+		PageSize: 20, // 每页条数
+		Keyword: null, // 关键字
+		crTime: [],
+		StartTime: null,
+		EndTime: null,
+	},
+	tableData: [], // 列表数据
+	loading: false, // 加载
+	total: 0, // 总条数
+});
+const ruleFormRef = ref<FormInstance>(); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 人员列表 */
+const requestParams = ref<EmptyObjectType>({});
+const queryList = async () => {
+	state.loading = true;
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 查询使劲啊
+	requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime');
+	try {
+		const response = await getSchedulingStatistics(requestParams.value);
+		state.tableData = response.result?.items ?? [];
+		state.total = response.result?.total ?? 0;
+		state.loading = false;
+	} catch (e) {
+		state.loading = false;
+		console.log(e);
+	}
+};
+
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+});
+</script>

+ 6 - 6
src/views/todo/seats/accept/lzAccept.vue

@@ -482,14 +482,14 @@ const state = reactive<any>({
 		no: null, // 工单编码
 		title: null, // 工单标题
 		hotspotId: null, // 热点分类
-		hotspotSpliceName:null, // 热点分类拼接名称
-		hotspotName:null, // 热点分类名称
-		hotspotCode:null, // 热点分类code
-		hotspotExternal:[], // 热点分类外部数据
+		hotspotSpliceName: null, // 热点分类拼接名称
+		hotspotName: null, // 热点分类名称
+		hotspotCode: null, // 热点分类code
+		hotspotExternal: [], // 热点分类外部数据
 		eventCategoryId: null, // 事件分类
 		incidentTime: null, // 事发时间
 		incidentPurpose: null, // 事件目的
-/*		areaCode: themeConfig.value.cityCode, // 区域编码
+		/*		areaCode: themeConfig.value.cityCode, // 区域编码
 		city: themeConfig.value.cityName, // 市*/
 		areaCode: null, // 区域编码
 		city: null, // 市
@@ -1274,7 +1274,7 @@ const loadForm = async () => {
 		}
 		setTimeout(() => {
 			historyOrderRef.value.searchHistory();
-		}, 300);
+		}, 500);
 	} catch (e: any) {
 		console.log(e);
 		buttonLoading.value = false;

+ 1 - 1
src/views/todo/seats/accept/ybAccept.vue

@@ -1459,7 +1459,7 @@ const loadForm = async () => {
 		}
 		setTimeout(() => {
 			historyOrderRef.value.searchHistory();
-		}, 300);
+		}, 500);
 	} catch (e: any) {
 		console.log(e);
 		buttonLoading.value = false;

+ 27 - 6
src/views/todo/seats/accept/zgAccept.vue

@@ -71,13 +71,13 @@
 									<!-- 手动创建 -->
 									<template v-if="state.createBy === 'manual'">
 										<el-form-item label="来电号码" prop="fromPhone" :rules="[{ required: true, message: '请填写来电号码', trigger: 'blur' }]">
-											<el-input v-model.trim="state.ruleForm.fromPhone" placeholder="请填写来电号码" clearable> </el-input>
+											<el-input v-model.trim="state.ruleForm.fromPhone" placeholder="请填写来电号码" clearable @input="getInfoByPhone"> </el-input>
 										</el-form-item>
 									</template>
 									<!-- 来电弹单 -->
 									<template v-if="['tel', 'transfer'].includes(state.createBy)">
 										<el-form-item label="来电号码" prop="fromPhone">
-											<el-input v-model.trim="state.ruleForm.fromPhone" placeholder="请填写来电号码" disabled> </el-input>
+											<el-input v-model.trim="state.ruleForm.fromPhone" placeholder="请填写来电号码" disabled @input="getInfoByPhone"> </el-input>
 										</el-form-item>
 									</template>
 									<!-- 互联网来信 -->
@@ -112,6 +112,11 @@
 										</el-radio-group>
 									</el-form-item>
 								</el-col>
+								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="oFlag">
+									<el-form-item label="运营商">
+										{{ oFlag }}
+									</el-form-item>
+								</el-col>
 								<el-col>
 									<el-row class="w100" :gutter="10">
 										<el-col :span="12">
@@ -448,9 +453,9 @@ import { ElMessage, ElMessageBox } from 'element-plus';
 import { storeToRefs } from 'pinia';
 import { useRoute } from 'vue-router';
 import { useAppConfig } from '@/stores/appConfig';
-import { throttle, transformFile } from '@/utils/tools';
+import { debounce, throttle, transformFile } from '@/utils/tools';
 import { commonEnum } from '@/utils/constants';
-import { orderAdd, orderBaseDataAdd, orderBaseExt, orderDetail, orderEdit } from '@/api/business/order';
+import { orderAdd, orderBaseDataAdd, orderBaseExt, orderDetail, orderEdit, orderPhoneNum } from '@/api/business/order';
 import { useUserInfo } from '@/stores/userInfo';
 import { treeArea } from '@/api/auxiliary/area';
 import mittBus from '@/utils/mitt';
@@ -868,7 +873,7 @@ const changeFocusEvent = (val: string[]) => {
 		.filter((item: any) => val.includes(item.dicDataValue))
 		.map((item: any) => item.dicDataName)
 		.join(',');
-/*	if (state.ruleForm.sourceChannelCode === 'ZGSSP') {
+	/*	if (state.ruleForm.sourceChannelCode === 'ZGSSP') {
 		//如果 选择了自贡随手拍
 		if (state.ruleForm.isSecret) {
 			// 如果选择了保密 需要吧三方通话也选上
@@ -1215,10 +1220,26 @@ const loadCreatedBy = () => {
 			} else {
 				state.ruleForm.identityType = 1;
 			}
+			setTimeout(() => {
+				getInfoByPhone();
+			}, 300);
 		}
 	}
 };
 loadCreatedBy();
+// 根据电话查询归属地等信息
+const oFlag = ref<string>(''); // 运营商
+const getInfoByPhone = debounce(() => {
+	const fromPhone = state.ruleForm.fromPhone && state.ruleForm.sourceChannelCode === 'RGDH';
+	if (!fromPhone) return;
+	orderPhoneNum(state.ruleForm.fromPhone)
+		.then((res) => {
+			oFlag.value = res.result.oFlag;
+		})
+		.catch((err) => {
+			console.log(err);
+		});
+}, 300);
 // 如果是修改加载表单内容
 const loadForm = async () => {
 	buttonLoading.value = true;
@@ -1341,7 +1362,7 @@ const loadForm = async () => {
 		}
 		setTimeout(() => {
 			historyOrderRef.value.searchHistory();
-		}, 300);
+		}, 500);
 	} catch (e: any) {
 		console.log(e);
 		buttonLoading.value = false;

+ 1 - 0
src/views/todo/seats/index.vue

@@ -270,6 +270,7 @@ const queryList = async () => {
 		requestParams.value = Other.deepClone(state.queryParams);
 		requestParams.value.StartTime = state.queryParams.scTime === null ? null : state.queryParams.scTime[0];
 		requestParams.value.EndTime = state.queryParams.scTime === null ? null : state.queryParams.scTime[1];
+		Reflect.deleteProperty(requestParams.value, 'scTime');
 		seatsListTodo(requestParams.value)
 			.then((response: any) => {
 				gridOptions.data = response?.result ?? [];