Selaa lähdekoodia

reactor:388 智能回访任务查询

zhangchong 4 päivää sitten
vanhempi
commit
c2c117a31e

+ 1 - 1
.env.development

@@ -3,7 +3,7 @@ VITE_MODE_NAME=development
 # 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
 VITE_STORAGE_NAME=dev
 # 业务系统基础请求地址
-VITE_API_URL=http://110.188.24.28:50100
+VITE_API_URL=http://110.188.24.28:50300
 # 业务系统socket请求地址
 VITE_API_SOCKET_URL=http://110.188.24.28:50100/hubs/hotline
 # 业务系统文件上传上传请求地址

+ 2 - 10
src/components/LogicFlow/index.vue

@@ -261,26 +261,18 @@ const initOp = () => {
 	});
 	lf.extension.snapshot.useGlobalRules = false;
 	lf.extension.snapshot.customCssRules = `
-    .lf-node-text-auto-wrap-content{
-      line-height: 1.2;
-      background: transparent;
-      text-align: center;
-      word-break: break-all;
-      width: 100%;
-    }
     .lf-canvas-overlay {
       background: white;
     }
   `;
 	// 控制面板-导出
-	const exportName = lf.graphModel.name ? lf.graphModel.name : '流程图';
 	lf.extension.control.addItem({
 		iconClass: 'lf-control-release',
 		title: '导出为图片',
 		text: '导出',
 		onClick: () => {
-			console.log(lf, 'lf');
-			lf.getSnapshot(exportName + `${new Date().getTime()}.png`);
+			const exportName = lf.graphModel.name ? lf.graphModel.name : '流程图';
+			lf.getSnapshot(exportName + `${new Date().getTime()}`);
 		},
 	});
 	// 控制面板-发布

+ 49 - 0
src/views/business/observations/components/Observe-detail.vue

@@ -0,0 +1,49 @@
+<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>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">关 闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<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';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		urgeContent: null, // 催办内容
+		acceptSms: false, // 发送短信
+	},
+	fileList: [], // 附件列表
+	loading: false, // 提交按钮loading
+});
+const ruleFormRef = ref<RefType>();
+// 打开弹窗
+const ids = ref<EmptyArrayType>([]);
+const openDialog = async (val: any) => {
+	ids.value = val;
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 87 - 0
src/views/business/observations/components/Observe-reply.vue

@@ -0,0 +1,87 @@
+<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-input
+					v-model="state.ruleForm.urgeContent"
+					type="textarea"
+					show-word-limit
+					:autosize="{ minRows: 6, maxRows: 20 }"
+					placeholder="请填写回复内容"
+					: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>
+		</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>
+
+<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';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		urgeContent: null, // 回复内容
+		acceptSms: null, // 完成时间
+	},
+	loading: false, // 提交按钮loading
+});
+const ruleFormRef = ref<RefType>();
+// 打开弹窗
+const ids = ref<EmptyArrayType>([]);
+const openDialog = async (val: any) => {
+	ids.value = val;
+	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;
+		let request = {
+			...state.ruleForm,
+			orderIds: ids.value,
+		};
+		orderBatchReminder(request)
+			.then(() => {
+				ElMessage.success('催办成功');
+				state.loading = false;
+				state.dialogVisible = false;
+				emit('updateList');
+			})
+			.catch(() => {
+				state.loading = false;
+				state.dialogVisible = false;
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 304 - 0
src/views/business/observations/index.vue

@@ -0,0 +1,304 @@
+<template>
+	<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>
+				<el-form-item label="工单标题" prop="Title">
+					<el-input v-model.trim="state.queryParams.Title" 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="drawer = true" class="default-button"> <SvgIcon name="ele-Search" 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="businessObservations"
+					:custom-config="{ storage: true }"
+					showHeaderOverflow
+					:params="{ exportMethod: observeListExport, 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">
+						<template #default="{ row }">
+							<order-detail :order="row.order" @updateList="queryList">{{ row.order?.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>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="order.expiredTime" title="期满时间" width="160" sortable>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.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>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.actualHandleTime, '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>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.filedTime, '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>
+						</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>
+		<!--	更多查询	-->
+		<el-drawer v-model="drawer" title="更多查询" size="500px">
+			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px" :disabled="state.loading">
+				<el-form-item label="受理类型" prop="AcceptType">
+					<el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" clearable @change="handleQuery">
+						<el-option v-for="item in acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="受理时间" prop="slTime">
+					<el-date-picker
+						v-model="state.queryParams.slTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="热点分类" prop="Hotspot">
+					<el-input v-model="state.queryParams.Hotspot" placeholder="热点分类名称" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="期满时间" prop="exTime">
+					<el-date-picker
+						v-model="state.queryParams.exTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						: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>
+				<el-form-item label="办结时间" prop="bjTime">
+					<el-date-picker
+						v-model="state.queryParams.bjTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						: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>
+				<el-form-item label="设置时间" prop="szTime">
+					<el-date-picker
+						v-model="state.queryParams.szTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="是否回复" prop="IsUrgent">
+					<el-select v-model="state.queryParams.IsUrgent" placeholder="请选择是否回复" clearable @change="handleQuery">
+						<el-option :value="true" label="是" />
+						<el-option :value="false" label="否" />
+					</el-select>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+			</template>
+		</el-drawer>
+		<!--	回复详情	-->
+		<observe-detail ref="observeDetailRef" @updateList="queryList" />
+	</div>
+</template>
+<script setup lang="tsx" name="businessObservations">
+import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteObserve, observeBaseData, observeList, observeListExport } from '@/api/query/observe';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+import { exportAssignment } from '@/utils/tools';
+import Other from '@/utils/other';
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+const ObserveDetail = defineAsyncComponent(() => import('@/views/business/observations/components/Observe-detail.vue')); // 回复详情
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive<any>({
+	queryParams: {
+		// 查询条件
+		PageIndex: 1,
+		PageSize: 20,
+		Keyword: null, // 关键字
+		No: null,
+		Title: null,
+		slTime: [], // 受理时间
+		StartTime: null,
+		EndTime: null,
+		exTime: [], // 期满时间
+		ExpiredTimeStart: null,
+		ExpiredTimeEnd: null,
+		ActualHandleOrgName: null, // 接办部门
+		AcceptType: null, //受理类型
+		Hotspot: null, // 热点分类
+		fastSearch: '0', //
+		bjTime: [], // 办结时间
+		szTime: [], // 设置时间
+		IsUrgent: null, // 是否回复
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+});
+// 手动查询,将页码设置为1
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+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];
+	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];
+	Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
+	observeList(requestParams.value)
+		.then((res) => {
+			state.tableData = res?.result.items ?? [];
+			state.total = res?.result.total;
+			state.loading = false;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+/** 重置按钮操作 */
+const drawerRuleFormRef = ref();
+const drawer = ref(false);
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	ruleFormRef.value?.resetFields();
+	queryList();
+};
+// 回复详情
+const observeDetailRef = ref<RefType>();
+const onDetail = (row: any) => {
+	console.log(row);
+	observeDetailRef.value.openDialog(row);
+};
+// 获取基础信息
+const acceptTypeOptions = ref<EmptyArrayType>([]); // 受理类型
+const getBaseInfo = async () => {
+	// 获取基础信息
+	try {
+		const { result } = await observeBaseData();
+		acceptTypeOptions.value = result.acceptTypeOptions;
+	} catch (e) {
+		console.log(e);
+	}
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+	getBaseInfo();
+});
+</script>

+ 325 - 0
src/views/business/observations/reply.vue

@@ -0,0 +1,325 @@
+<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-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-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>
+				<el-form-item label="工单标题" prop="Title">
+					<el-input v-model.trim="state.queryParams.Title" 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="drawer = true" class="default-button"> <SvgIcon name="ele-Search" 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="businessObservationsReply"
+					:custom-config="{ storage: true }"
+					showHeaderOverflow
+					:params="{ exportMethod: observeListExport, 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">
+						<template #default="{ row }">
+							<order-detail :order="row.order" @updateList="queryList">{{ row.order?.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>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="order.expiredTime" title="期满时间" width="160" sortable>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.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>
+						<template #default="{ row }">
+							{{ formatDate(row.order?.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 #default="{ row }">
+								{{ formatDate(row.order?.replyTime, 'YYYY-mm-dd HH:MM:SS') }}
+							</template>
+						</vxe-column>
+					</template>
+					<vxe-column title="操作" fixed="right" width="90" align="center" :show-overflow="false">
+						<template #default="{ row }">
+							<el-button
+								link
+								type="primary"
+								@click="onReply(row)"
+								title="回复"
+								v-auth="'business:observations:reply'"
+								v-if="state.queryParams.TypeCode === '0'"
+							>
+								回复
+							</el-button>
+							<el-button link type="primary" @click="onDetail(row)" title="查看回复" v-else> 查看回复 </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>
+		<!--	更多查询	-->
+		<el-drawer v-model="drawer" title="更多查询" size="500px">
+			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px" :disabled="state.loading">
+				<el-form-item label="受理类型" prop="AcceptType">
+					<el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" clearable @change="handleQuery">
+						<el-option v-for="item in acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="受理时间" prop="slTime">
+					<el-date-picker
+						v-model="state.queryParams.slTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="期满时间" prop="exTime">
+					<el-date-picker
+						v-model="state.queryParams.exTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						: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>
+				<el-form-item label="热点分类" prop="Hotspot">
+					<el-input v-model="state.queryParams.Hotspot" placeholder="热点分类名称" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="办结时间" prop="bjTime">
+					<el-date-picker
+						v-model="state.queryParams.bjTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						: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" />
+					</el-form-item>
+					<el-form-item label="回复时间" prop="hfTime">
+						<el-date-picker
+							v-model="state.queryParams.hfTime"
+							type="datetimerange"
+							unlink-panels
+							range-separator="至"
+							start-placeholder="开始时间"
+							end-placeholder="结束时间"
+							:shortcuts="shortcuts"
+							@change="handleQuery"
+							value-format="YYYY-MM-DD[T]HH:mm:ss"
+							:default-time="defaultTimeStartEnd"
+						/>
+					</el-form-item>
+				</template>
+			</el-form>
+			<template #footer>
+				<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+			</template>
+		</el-drawer>
+		<!--	回复	-->
+		<observe-reply ref="observeReplyRef" @updateList="queryList" />
+		<!--	回复详情	-->
+		<observe-detail ref="observeDetailRef" @updateList="queryList" />
+	</div>
+</template>
+<script setup lang="tsx" name="businessObservationsReply">
+import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteObserve, observeBaseData, observeList, observeListExport } from '@/api/query/observe';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+import { exportAssignment } from '@/utils/tools';
+import Other from '@/utils/other';
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+const ObserveReply = defineAsyncComponent(() => import('@/views/business/observations/components/Observe-reply.vue')); // 回复
+const ObserveDetail = defineAsyncComponent(() => import('@/views/business/observations/components/Observe-detail.vue')); // 回复详情
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive<any>({
+	queryParams: {
+		// 查询条件
+		PageIndex: 1,
+		PageSize: 20,
+		Keyword: null, // 关键字
+		No: null,
+		Title: null,
+		slTime: [], // 受理时间
+		StartTime: null,
+		EndTime: null,
+		exTime: [], // 期满时间
+		ExpiredTimeStart: null,
+		ExpiredTimeEnd: null,
+		ActualHandleOrgName: null, // 接办部门
+		AcceptType: null, //受理类型
+		Hotspot: null, // 热点分类
+		fastSearch: '0',
+		TypeCode: '0', // 0:待回复 1:已回复
+		bjTime: [], // 办结时间
+		hfTime: [], // 回复时间
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+});
+// 手动查询,将页码设置为1
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+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];
+	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];
+	Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
+	observeList(requestParams.value)
+		.then((res) => {
+			state.tableData = res?.result.items ?? [];
+			state.total = res?.result.total;
+			state.loading = false;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+/** 重置按钮操作 */
+const drawerRuleFormRef = ref();
+const drawer = ref(false);
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	ruleFormRef.value?.resetFields();
+	queryList();
+};
+// 回复
+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);
+};
+// 获取基础信息
+const acceptTypeOptions = ref<EmptyArrayType>([]); // 受理类型
+const getBaseInfo = async () => {
+	// 获取基础信息
+	try {
+		const { result } = await observeBaseData();
+		acceptTypeOptions.value = result.acceptTypeOptions;
+	} catch (e) {
+		console.log(e);
+	}
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+	getBaseInfo();
+});
+</script>

+ 8 - 0
src/views/business/visit/components/Visit-detail.vue

@@ -620,6 +620,14 @@
 										</el-col>
 									</template>
 								</template>
+								<!-- 自贡的观察件 -->
+								<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>
+									</el-col>
+								</template>
 							</el-row>
 						</template>
 					</el-form>

+ 16 - 12
src/views/business/visit/smart.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="business-visit-smart-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
-			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.loading" >
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.loading">
 				<el-form-item label="任务名称" prop="Keyword">
 					<el-input v-model.trim="state.queryParams.Keyword" placeholder="回访任务名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
 				</el-form-item>
@@ -10,6 +10,9 @@
 						<el-option v-for="item in aiOrderVisitTaskState" :value="item.key" :key="item.key" :label="item.value" />
 					</el-select>
 				</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>
 				<el-form-item>
 					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
 					<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
@@ -116,7 +119,7 @@
 			/>
 		</div>
 		<el-drawer v-model="drawer" title="更多查询" size="500px">
-			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="90px" :disabled="state.loading" >
+			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="90px" :disabled="state.loading">
 				<el-form-item label="创建时间" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
@@ -198,12 +201,13 @@ const state = reactive<any>({
 		crTime: [],
 		StartTime: null,
 		EndTime: null,
-    startTime:[],
-    AiVisitTimeBeginStart:null,
-    AiVisitTimeBeginEnd:null,
-    endTime:[],
-    AiVisitTimeEndStart:null,
-    AiVisitTimeEndEnd:null
+		startTime: [],
+		AiVisitTimeBeginStart: null,
+		AiVisitTimeBeginEnd: null,
+		endTime: [],
+		AiVisitTimeEndStart: null,
+		AiVisitTimeEndEnd: null,
+		No: null, // 工单编码
 	},
 	total: 0, // 总条数
 	tableData: [], // 表格数据
@@ -215,7 +219,7 @@ const handleQuery = () => {
 };
 // 刷新列表
 const refreshList = () => {
-  queryList();
+	queryList();
 };
 const requestParams = ref<EmptyObjectType>({});
 // 获取参数列表
@@ -243,7 +247,7 @@ const queryList = () => {
 				state.loading = false;
 				reject();
 			});
-	})
+	});
 };
 // 页面基础数据
 const aiOrderVisitTaskState = ref<EmptyArrayType>([]);
@@ -365,9 +369,9 @@ const toolbarRef = ref<RefType>();
 const tableRef = ref<RefType>();
 // 页面加载时
 onMounted(() => {
-	queryList().then(()=>{
+	queryList().then(() => {
 		getBaseData();
-	})
+	});
 	if (tableRef.value && toolbarRef.value) {
 		tableRef.value.connect(toolbarRef.value);
 	}