zhangchong пре 4 месеци
родитељ
комит
53c80564be

+ 143 - 7
src/components/ProcessAudit/ZGSSPProcess.vue

@@ -21,12 +21,13 @@
 		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-loading="state.loading">
 			<slot name="header"></slot>
 			<el-row :gutter="10">
-					<el-col>
+				<el-col>
 					<el-form-item label="当前选择的流程">
 						{{ seatTopaidan ? '话务部到派单组' : '' }}
 						{{ seatToOrgOne ? '话务部到一级部门' : '' }}
 						{{ seatToGrid ? '话务部到网格员' : '' }}
 						{{ seatToMark ? '话务部到工单标记' : '' }}
+						{{ markToPaidan ? '标注到派单' : '' }}
 						{{ paidanToOrgOne ? '派单组到一级部门' : '' }}
 						{{ paidanToEnd ? '派单组到归档' : '' }}
 						{{ orgOneToEnd ? '一级部门到归档' : '' }}
@@ -47,13 +48,126 @@
 				</template>
 				<!-- 办理流程 -->
 				<template v-else>
-					<!-- 随手拍电气焊申报工单 -->
-					<template v-if="state.orderDetail.industryName === '电气焊作业申报'">
-
+					<!-- 随手拍电气焊申报工单 并且是部门办理时 -->
+					<template v-if="orgDQH">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="核实方式" prop="Status" :rules="[{ required: false, message: '请选择核实方式', trigger: 'change' }]">
+								<el-radio-group v-model="state.ruleForm.Status">
+									<el-radio :value="1">现场</el-radio>
+									<el-radio :value="2">电话</el-radio>
+									<el-radio :value="0">视频</el-radio>
+								</el-radio-group>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="是否合规" prop="approveOrgId" :rules="[{ required: false, message: '请选择是否合规', trigger: 'change' }]">
+								<el-select v-model="state.ruleForm.approveOrgId" placeholder="请选择是否合规" class="w100" clearable>
+									<el-option label="是" :value="true" />
+									<el-option label="否" :value="false" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item
+								label="是否按照清单检查"
+								prop="Status"
+								:rules="[{ required: false, message: '请选择是否按照清单检查', trigger: 'change' }]"
+								label-width="130px"
+							>
+								<el-radio-group v-model="state.ruleForm.Status">
+									<el-radio :value="1">是</el-radio>
+									<el-radio :value="2">否</el-radio>
+								</el-radio-group>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="附件">
+								<el-link type="primary">检查清单</el-link>
+								<el-link type="primary" class="ml10">电气焊等动火作业检查清单</el-link>
+							</el-form-item>
+						</el-col>
 					</template>
-					<!-- 安全隐患工单 -->
-					<template v-if="state.orderDetail.industryName === '电气焊作业申报'">
-
+					<!-- 安全隐患工单 并且是部门办理时-->
+					<template v-if="orgAQYH">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item
+								label="是否存在安全隐患"
+								prop="approveOrgId"
+								:rules="[{ required: false, message: '请选择是否存在安全隐患', trigger: 'change' }]"
+								label-width="130px"
+							>
+								<el-select v-model="state.ruleForm.approveOrgId" placeholder="请选择是否存在安全隐患" class="w100" clearable>
+									<el-option label="是" :value="true" />
+									<el-option label="否" :value="false" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="是否整改完成" prop="approveOrgId" :rules="[{ required: false, message: '请选择是否整改完成', trigger: 'change' }]">
+								<el-select v-model="state.ruleForm.approveOrgId" placeholder="请选择是否整改完成" class="w100" clearable>
+									<el-option label="是" :value="true" />
+									<el-option label="否" :value="false" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="线索分类" prop="approveOrgId" :rules="[{ required: false, message: '请选择线索分类', trigger: 'change' }]">
+								<el-select v-model="state.ruleForm.approveOrgId" placeholder="请选择线索分类" class="w100" clearable>
+									<el-option label="是" :value="true" />
+									<el-option label="否" :value="false" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item
+								label="是否申请追加奖励"
+								prop="approveOrgId"
+								:rules="[{ required: false, message: '请选择是否申请追加奖励', trigger: 'change' }]"
+								label-width="130px"
+							>
+								<el-radio-group v-model="state.ruleForm.approveOrgId">
+									<el-radio :value="1">是</el-radio>
+									<el-radio :value="2">否</el-radio>
+								</el-radio-group>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="补充奖励类型" prop="approveOrgId" :rules="[{ required: false, message: '请选择补充奖励类型', trigger: 'change' }]">
+								<el-select v-model="state.ruleForm.approveOrgId" placeholder="请选择补充奖励类型" class="w100" clearable>
+									<el-option label="是" :value="true" />
+									<el-option label="否" :value="false" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col>
+							<el-row class="w100" :gutter="10">
+								<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+									<el-form-item prop="name" :rules="[{ required: false, message: '奖励人姓名', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.name" placeholder="奖励人姓名" clearable />
+									</el-form-item>
+								</el-col>
+								<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+									<el-form-item prop="name" label-width="0" :rules="[{ required: false, message: '奖励人卡号', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.name" placeholder="奖励人卡号" clearable />
+									</el-form-item>
+								</el-col>
+								<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+									<el-form-item prop="name" label-width="0" :rules="[{ required: false, message: '奖励人开户行', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.name" placeholder="奖励人开户行" clearable />
+									</el-form-item>
+								</el-col>
+								<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+									<el-form-item prop="name" label-width="0" :rules="[{ required: false, message: '奖励金额', trigger: 'blur' }]">
+										<el-input-number v-model="state.ruleForm.name" :min="0" :precision="2" placeholder="奖励金额" class="w100" />
+									</el-form-item>
+								</el-col>
+							</el-row>
+						</el-col>
+						<el-col>
+							<el-form-item label="附件">
+								<el-link type="primary">相关政策</el-link>
+							</el-form-item>
+						</el-col>
 					</template>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
@@ -783,6 +897,10 @@ const seatToGrid = computed(() => {
 const seatToMark = computed(() => {
 	return currentParams.value.currentStepBusinessType === 0 && selectNext.value.tag === 'ordermark';
 });
+// 标注到派单组
+const markToPaidan = computed(() => {
+	return currentParams.value.currentTag === 'ordermark' && selectNext.value.businessType === 1;
+});
 // 派单组到一级部门
 const paidanToOrgOne = computed(() => {
 	return currentParams.value.currentStepBusinessType === 1 && selectNext.value.businessType === 2 && selectNext.value.orgLevel === 1;
@@ -839,6 +957,24 @@ const orgSummaryToEnd = computed(() => {
 		selectNext.value.key === 'end'
 	);
 });
+// 判断当前工单是 随手拍电气焊作业申报 并且是部门办理时 并且当前不能是汇总节点 并且选择的下一节点是汇总或者归档
+const orgDQH = computed(() => {
+	return (
+		currentParams.value.currentStepBusinessType === 2 &&
+		currentParams.value.stepType !== 3 &&
+		(selectNext.value.stepType === 3 || selectNext.value.key === 'end') &&
+		state.orderDetail.industryName === '电气焊作业申报'
+	);
+});
+// 判断当前工单是 安全隐患 并且是部门办理时
+const orgAQYH = computed(() => {
+	return (
+		currentParams.value.currentStepBusinessType === 2 &&
+		currentParams.value.stepType !== 3 &&
+		(selectNext.value.stepType === 3 || selectNext.value.key === 'end') &&
+		state.orderDetail.industryName === '安全隐患'
+	);
+});
 // 判断当前节点是否在会签中 0中心会签 1部门会签
 const isCountersign = computed(() => {
 	return currentParams.value.counterSignType !== null;

+ 2 - 2
src/components/ProcessDetail/index.vue

@@ -1,7 +1,7 @@
 <!--流程的流转记录-->
 <template>
 	<div class="tels-restApply-precess-record">
-		<el-dialog :title="state.dialogTitle" v-model="state.dialogVisible" width="90%" draggable destroy-on-close append-to-body>
+		<el-dialog :title="state.dialogTitle" v-model="state.dialogVisible" width="95%" draggable destroy-on-close append-to-body>
 			<slot name="header"></slot>
 			<slot>
 				<vxe-table
@@ -30,7 +30,7 @@
 						<template #content="{ row }">
 							<!--流程节点-->
 							<template v-if="row.traceStyle === 0">
-								<div class="mb10 formatted-text"  v-if="row.opinion">
+								<div class="mb10 formatted-text" v-if="row.opinion">
 									<el-text tag="p" class="font-bold">{{ row.handleModeTypeText }}:</el-text>{{ row.opinion }}
 								</div>
 								<div class="mb10 formatted-text" v-if="row.remark"><el-text tag="p" class="font-bold">备注信息:</el-text>{{ row.remark }}</div>

+ 2 - 2
src/views/snapshot/handle/orderMark.vue

@@ -29,7 +29,7 @@
 					</el-button>
 				</template>
 				<template #order_detail="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+					<order-detail :order="{id: row.orderId}" @updateList="queryList">{{ row.title }}</order-detail>
 				</template>
 				<template #pager>
 					<pagination
@@ -230,7 +230,7 @@ const isChecked = computed(() => {
 // 添加标注
 const orderMarkAddRef = ref<RefType>();
 const onAdd = () => {
-	const ids = checkTable.value.map((item: any) => item.id);
+	const ids = checkTable.value.map((item: any) => item.orderId);
 	orderMarkAddRef.value.openDialog(ids);
 };
 // 页面加载时

+ 189 - 0
src/views/snapshot/publish/audit.vue

@@ -0,0 +1,189 @@
+<template>
+	<div class="snapshot-publish-audit-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<vxe-grid v-bind="gridOptions" ref="gridRef">
+				<template #form>
+					<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="gridOptions.loading">
+						<el-form-item label="审批状态" prop="Status">
+							<el-radio-group v-model="state.queryParams.Status" @change="handleQuery">
+								<el-radio :value="1">审批中</el-radio>
+								<el-radio :value="2">同意</el-radio>
+								<el-radio :value="3">不同意</el-radio>
+								<el-radio :value="0">全部</el-radio>
+							</el-radio-group>
+						</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"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						</el-form-item>
+					</el-form>
+				</template>
+				<template #action="{ row }">
+					<el-button type="primary" @click="onView(row)" v-auth="'snapshot:publish:audit:audit'" link> 查看 </el-button>
+				</template>
+				<template #order_detail="{ row }">
+					<order-detail :order="{ id: row.orderId }" @updateList="queryList">{{ row.title }}</order-detail>
+				</template>
+				<template #pager>
+					<pagination
+						@pagination="queryList"
+						:total="state.total"
+						v-model:current-page="state.queryParams.PageIndex"
+						v-model:page-size="state.queryParams.PageSize"
+						:disabled="state.loading"
+					/>
+				</template>
+			</vxe-grid>
+		</div>
+		<!-- 审批 -->
+		<publish-audit ref="publishAuditRef" @updateList="queryList" />
+	</div>
+</template>
+
+<script lang="tsx" setup name="snapshotPublishAudit">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
+import { getOrderMarkList } from '@/api/snapshot/handle';
+import Other from '@/utils/other';
+
+// 引入组件
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const PublishAudit = defineAsyncComponent(() => import('@/views/snapshot/publish/components/Publish-audit.vue')); // 审批
+
+// 定义变量内容
+const state = reactive<any>({
+	loading: false,
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		Status: 1, // 默认待标注
+		No: null, // 工单编码
+		Title: null, // 工单标题
+	},
+	total: 0, // 总条数
+});
+
+const gridOptions = reactive<any>({
+	loading: false,
+	border: true,
+	showOverflow: true,
+	columnConfig: {
+		resizable: true,
+	},
+	scrollY: {
+		enabled: true,
+		gt: 100,
+	},
+	toolbarConfig: {
+		zoom: true,
+		custom: true,
+		refresh: {
+			queryMethod: () => {
+				handleQuery();
+			},
+		},
+	},
+	customConfig: {
+		storage: true,
+	},
+	id: 'snapshotReSendList',
+	rowConfig: { isHover: true, height: 30, isCurrent: true, useKey: true },
+	height: 'auto',
+	columns: [
+		{
+			field: 'no',
+			title: '审批状态',
+			width: 120,
+		},
+		{
+			field: 'no',
+			title: '工单编码',
+			width: 140,
+		},
+		{
+			field: 'title',
+			title: '原标题',
+			slots: { default: 'order_detail' },
+			minWidth: 300,
+		},
+		{
+			field: 'no',
+			title: '申请人',
+			width: 120,
+		},
+		{
+			field: 'creationTime',
+			title: '申请时间',
+			formatter: 'formatDate',
+			width: 160,
+		},
+		{
+			field: 'content',
+			title: '公开标题',
+			minWidth: 200,
+		},
+		{
+			field: 'content',
+			title: '公开地址',
+			width: 150,
+		},
+		{
+			field: 'content',
+			title: '公开内容',
+			minWidth: 300,
+		},
+		{
+			field: 'content',
+			title: '公开办理信息',
+			minWidth: 300,
+		},
+		{ title: '操作', width: 90, fixed: 'right', showOverflow: false, align: 'center', slots: { default: 'action' } },
+	],
+	data: [],
+});
+/** 搜索按钮操作 节流操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const requestParams = ref<EmptyObjectType>({});
+const queryList = () => {
+	state.loading = true;
+	gridOptions.loading = true;
+	requestParams.value = Other.deepClone(state.queryParams);
+	getOrderMarkList(requestParams.value)
+		.then((res) => {
+			state.loading = false;
+			gridOptions.data = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+			gridOptions.loading = false;
+		})
+		.finally(() => {
+			state.loading = false;
+			gridOptions.loading = false;
+		});
+};
+// 重置表单
+const ruleFormRef = ref<any>(null); // 表单ref
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	ruleFormRef.value?.resetFields();
+	queryList();
+};
+
+// 添加标注
+const publishAuditRef = ref<RefType>();
+const onView = (row: any) => {
+	publishAuditRef.value.openDialog(row);
+};
+// 页面加载时
+onMounted(() => {
+	queryList();
+});
+</script>
+
+layout/routerView/parer

+ 181 - 0
src/views/snapshot/publish/components/Order-publish.vue

@@ -0,0 +1,181 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" draggable title="公开" ref="dialogRef" append-to-body destroy-on-close @close="close">
+		<div class="collapse-container">
+			<el-form label-width="100px" ref="ruleFormRef" :model="state.ruleForm" v-loading="state.loading">
+				<el-row :gutter="10" class="w100">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="工单标题"> {{ state.publishDetail.orderTitle }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="整改后标题" prop="arrangeTitle" :rules="[{ required: false, message: '请填写整改后标题', trigger: 'blur' }]">
+							<el-input placeholder="请填写整改后标题" v-model="state.ruleForm.arrangeTitle" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="受理时间">
+							{{ state.ruleForm.arrangeTitle }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="事发地址">
+							{{ state.ruleForm.arrangeTitle }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="地点整改" prop="arrangeTitle" :rules="[{ required: false, message: '请填写地点整改', trigger: 'blur' }]">
+							<el-input placeholder="请填写地点整改" v-model="state.ruleForm.arrangeTitle" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="工单内容" class="formatted-text"> {{ state.publishDetail.content }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="整改后内容" prop="arrangeContent" :rules="[{ required: false, message: '请填写整改后内容', trigger: 'blur' }]">
+							<el-input
+								placeholder="请填写整改后内容"
+								type="textarea"
+								:autosize="{ minRows: 6, maxRows: 10 }"
+								v-model="state.ruleForm.arrangeContent"
+								show-word-limit
+								:maxlength="5000"
+							></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="办理结果" class="formatted-text"> {{ state.publishDetail.actualOpinion }}</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="整改后结果" prop="arrangeOpinion" :rules="[{ required: false, message: '请填写整改后内容', trigger: 'blur' }]">
+							<el-input
+								type="textarea"
+								placeholder="请填写整改后办件结果"
+								:autosize="{ minRows: 6, maxRows: 10 }"
+								v-model="state.ruleForm.arrangeOpinion"
+								show-word-limit
+								:maxlength="AppConfigInfo.nationalPlatformWordLimit"
+							></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+		</div>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button" :loading="state.loading">取 消</el-button>
+				<el-button type="primary" @click="onPublish(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 { baseData } from '@/api/business/publish';
+import { publishOrder } from '@/api/todo/publish';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
+import { useAppConfig } from '@/stores/appConfig';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+		proPublishState: false, // 是否公开
+		isContact: true, // 是否联系
+		isVisited: true, // 是否评价
+		feedBackPhone: '', // 反馈人电话
+		noPubReason: '', // 不公开原因
+		answerContent: '', // 答复口径
+		arrangeContent: '', // 整改后内容
+		arrangeOpinion: '', // 整改后结果
+		idNames: [], // 需回访部门
+		publishState: false, // 门户是否公开
+		resolve: null, // 处理结果
+	},
+	orderDetail: {}, // 工单详情
+	publishDetail: {}, // 发布详情
+});
+const ruleFormRef = ref<RefType>(); // 表单ref
+const idNamesArray = ref<EmptyArrayType>([]); // 部门列表
+const netizenEvaluateType = ref<EmptyArrayType>([]);
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+
+const appConfigStore = useAppConfig();
+const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
+/*
+ * @param row 工单详情
+ *
+ * @description 打开弹窗
+ * */
+const openDialog = async (row: any) => {
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		state.orderDetail = row ?? {};
+		const res = await baseData(state.orderDetail.id);
+		state.publishDetail = res.result ?? {};
+		state.ruleForm.arrangeTitle = state.publishDetail.orderTitle;
+		state.ruleForm.arrangeContent = state.publishDetail.content;
+		state.ruleForm.arrangeOpinion = state.publishDetail.actualOpinion;
+		idNamesArray.value = res.result?.idNames ?? [];
+		netizenEvaluateType.value = res.result?.netizenEvaluateType ?? [];
+		state.loading = false;
+		state.dialogVisible = true;
+	} catch (e) {
+		console.log(e);
+		state.loading = false;
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value.clearValidate();
+	ruleFormRef.value.resetFields();
+};
+// 发布
+const onPublish = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		let idNames: EmptyArrayType;
+		state.ruleForm.netizenEvaluate = netizenEvaluateType.value.find((item) => item.key === state.ruleForm.netizen);
+		if (state.ruleForm.idNames.length > 0) {
+			// 如果选择了部门
+			idNames = [...state.ruleForm.idNames];
+		} else {
+			idNames = [{ key: state.publishDetail.actualHandleOrgName?.key, value: state.publishDetail.actualHandleOrgName?.value }];
+		}
+		const request = {
+			...state.ruleForm,
+			idNames,
+			id: state.orderDetail.id,
+		};
+		publishOrder(request)
+			.then(() => {
+				ElMessage.success('发布成功');
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+// 重办和退回成功
+const updateList = () => {
+	closeDialog();
+	emit('updateList');
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 133 - 0
src/views/snapshot/publish/components/Publish-audit.vue

@@ -0,0 +1,133 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" draggable title="公开" ref="dialogRef" append-to-body destroy-on-close>
+		<div class="collapse-container">
+			<el-form label-width="100px" :model="state.ruleForm" v-loading="state.loading" class="show-info-form">
+				<el-row :gutter="10" class="w100">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="工单标题"> {{ state.publishDetail.orderTitle }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="标题整改"> {{ state.publishDetail.orderTitle }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="受理时间">
+							{{ state.ruleForm.arrangeTitle }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="事发地址">
+							{{ state.ruleForm.arrangeTitle }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="地点整改">
+							{{ state.ruleForm.arrangeTitle }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="工单内容" class="formatted-text"> {{ state.publishDetail.content }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="整改后内容" class="formatted-text"> {{ state.publishDetail.content }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="办理结果" class="formatted-text"> {{ state.publishDetail.actualOpinion }}</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="整改后结果" class="formatted-text"> {{ state.publishDetail.arrangeOpinion }}</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+		</div>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button" :loading="state.loading">取 消</el-button>
+				<el-button type="primary" @click="agree" :loading="state.loading">同意</el-button>
+				<el-button type="primary" @click="disagree" :loading="state.loading">不同意</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+<script setup lang="ts">
+import { reactive, ref } from 'vue';
+import { baseData } from '@/api/business/publish';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
+import { useAppConfig } from '@/stores/appConfig';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+		proPublishState: false, // 是否公开
+		isContact: true, // 是否联系
+		isVisited: true, // 是否评价
+		feedBackPhone: '', // 反馈人电话
+		noPubReason: '', // 不公开原因
+		answerContent: '', // 答复口径
+		arrangeContent: '', // 整改后内容
+		arrangeOpinion: '', // 整改后结果
+		idNames: [], // 需回访部门
+		publishState: false, // 门户是否公开
+		resolve: null, // 处理结果
+	},
+	orderDetail: {}, // 工单详情
+	publishDetail: {}, // 发布详情
+});
+const ruleFormRef = ref<RefType>(); // 表单ref
+const idNamesArray = ref<EmptyArrayType>([]); // 部门列表
+const netizenEvaluateType = ref<EmptyArrayType>([]);
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+
+const appConfigStore = useAppConfig();
+const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
+/*
+ * @param row 工单详情
+ *
+ * @description 打开弹窗
+ * */
+const openDialog = async (row: any) => {
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		state.orderDetail = row ?? {};
+		const res = await baseData(state.orderDetail.id);
+		state.publishDetail = res.result ?? {};
+		state.ruleForm.arrangeTitle = state.publishDetail.orderTitle;
+		state.ruleForm.arrangeContent = state.publishDetail.content;
+		state.ruleForm.arrangeOpinion = state.publishDetail.actualOpinion;
+		idNamesArray.value = res.result?.idNames ?? [];
+		netizenEvaluateType.value = res.result?.netizenEvaluateType ?? [];
+		state.loading = false;
+		state.dialogVisible = true;
+	} catch (e) {
+		console.log(e);
+		state.loading = false;
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 同意
+const agree = ()=>{
+
+}
+// 不同意
+const disagree = ()=>{
+
+}
+// 重办和退回成功
+const updateList = () => {
+	closeDialog();
+	emit('updateList');
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 305 - 0
src/views/snapshot/publish/index.vue

@@ -0,0 +1,305 @@
+<template>
+	<div class="snapshot-publish-index-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<vxe-grid v-bind="gridOptions" ref="gridRef" @checkbox-all="selectAllChangeEvent" @checkbox-change="selectChangeEvent">
+				<template #form>
+					<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="gridOptions.loading">
+						<el-form-item label="行业" prop="Status">
+							<el-select v-model="state.queryParams.Status" class="w100" placeholder="请选择行业" @change="handleQuery">
+								<el-option v-for="item in state.statusOptions" :key="item.key" :label="item.value" :value="item.key" />
+							</el-select>
+						</el-form-item>
+						<el-form-item label="工单编码" prop="No">
+							<el-input v-model="state.queryParams.No" placeholder="请填写工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+						</el-form-item>
+						<el-form-item label="工单标题" prop="Title">
+							<el-input v-model="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>
+				</template>
+				<template #toolbar_buttons>
+					<el-button type="primary" @click="onUnPublic" v-auth="'snapshot:publish:index:notPublic'" :disabled="isChecked" :loading="state.loading"
+					><SvgIcon name="ele-Edit" class="mr5" />不公开<span v-if="checkTable.length">({{ checkTable.length }})</span>
+					</el-button>
+				</template>
+				<template #action="{ row }">
+					<el-button type="primary" @click="onApply(row)" v-auth="'snapshot:publish:index:apply'" link> 申请 </el-button>
+				</template>
+				<template #statusText="{ row }">
+					<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+					<span v-else>{{ row.statusText }}</span>
+				</template>
+<!--				snapshot:publish:index:apply-->
+				<template #order_detail="{ row }">
+					<order-detail :order="{id: row.orderId}" @updateList="queryList">{{ row.title }}</order-detail>
+				</template>
+				<template #pager>
+					<pagination
+						@pagination="queryList"
+						:total="state.total"
+						v-model:current-page="state.queryParams.PageIndex"
+						v-model:page-size="state.queryParams.PageSize"
+						:disabled="state.loading"
+					/>
+				</template>
+			</vxe-grid>
+		</div>
+		<!--	更多查询	-->
+		<el-drawer v-model="drawer" title="更多查询" size="500px">
+			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
+				<el-form-item label="是否公开" prop="SnapshotBulletinTypeName">
+					<el-select v-model="state.queryParams.SnapshotBulletinTypeName" placeholder="请选择是否公开" clearable>
+						<el-option label="是" :value="true" />
+						<el-option label="否" :value="false" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="受理类型" prop="No">
+					<el-input v-model="state.queryParams.No" placeholder="请填写受理类型" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="来电号码" prop="DepartmentName">
+					<el-input v-model="state.queryParams.DepartmentName" placeholder="请填写来电号码" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<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="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="Status">
+					<el-select v-model="state.queryParams.Status" class="w100" placeholder="请选择工单状态" @change="handleQuery">
+						<el-option v-for="item in state.statusOptions" :key="item.key" :label="item.value" :value="item.key" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="区域信息" prop="Status">
+					<el-select v-model="state.queryParams.Status" class="w100" placeholder="请选择区域信息" @change="handleQuery">
+						<el-option v-for="item in state.statusOptions" :key="item.key" :label="item.value" :value="item.key" />
+					</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>
+		<!-- 公开 -->
+		<order-publish ref="orderPublishRef" @updateList="queryList" />
+	</div>
+</template>
+
+<script lang="tsx" setup name="snapshotPublishIndex">
+import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessageBox, FormInstance } from 'element-plus';
+import { getOrderMarkList } from '@/api/snapshot/handle';
+import Other from '@/utils/other';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+
+// 引入组件
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const OrderPublish = defineAsyncComponent(() => import('@/views/snapshot/publish/components/Order-publish.vue'));  // 公开
+
+// 定义变量内容
+const state = reactive<any>({
+	loading: false,
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		Status: 1, // 默认待标注
+		No: null, // 工单编码
+		Title: null, // 工单标题
+		slTime:[],
+	},
+	total: 0, // 总条数
+});
+
+const gridOptions = reactive<any>({
+	loading: false,
+	border: true,
+	showOverflow: true,
+	columnConfig: {
+		resizable: true,
+	},
+	scrollY: {
+		enabled: true,
+		gt: 100,
+	},
+	toolbarConfig: {
+		zoom: true,
+		custom: true,
+		refresh: {
+			queryMethod: () => {
+				handleQuery();
+			},
+		},
+		slots: {
+			buttons: 'toolbar_buttons',
+		},
+	},
+	customConfig: {
+		storage: true,
+	},
+	id: 'snapshotReSendList',
+	rowConfig: { isHover: true, height: 30, isCurrent: true, useKey: true },
+	height: 'auto',
+	columns: [
+		{ type: 'checkbox', width: 50, align: 'center' },
+		{
+			field: 'no',
+			title: '状态',
+			width: 100,
+		},
+		{
+			field: 'statusText',
+			title: '工单状态',
+			width: 110,
+			slots: {
+				default: 'statusText',
+			},
+		},
+		{
+			field: 'no',
+			title: '工单编码',
+			width: 140,
+		},
+		{
+			field: 'creationTime',
+			title: '受理时间',
+			formatter: 'formatDate',
+			width: 160,
+		},
+		{
+			field: 'title',
+			title: '工单标题',
+			slots: { default: 'order_detail' },
+			minWidth: 300,
+		},
+		{
+			field: 'county',
+			title: '区域',
+			width: 150,
+		},
+		{
+			field: 'county',
+			title: '电话',
+			width: 140,
+		},
+		{
+			field: 'content',
+			title: '受理内容',
+			width: 400,
+		},
+		{
+			field: 'county',
+			title: '网格员是否属实',
+			width: 140,
+		},
+		{ title: '操作', width: 90, fixed: 'right', showOverflow: false, align: 'center', slots: { default: 'action' } },
+	],
+	data: [],
+});
+/** 搜索按钮操作 节流操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const requestParams = ref<EmptyObjectType>({});
+const queryList = () => {
+	state.loading = true;
+	gridOptions.loading = true;
+	requestParams.value = Other.deepClone(state.queryParams);
+	getOrderMarkList(requestParams.value)
+		.then((res) => {
+			state.loading = false;
+			gridOptions.data = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+			gridRef.value.clearCheckboxRow();
+			checkTable.value = [];
+			gridOptions.loading = false;
+		})
+		.finally(() => {
+			gridRef.value.clearCheckboxRow();
+			checkTable.value = [];
+			state.loading = false;
+			gridOptions.loading = false;
+		});
+};
+// 重置表单
+const ruleFormRef = ref<any>(null); // 表单ref
+const drawerRuleFormRef = ref<RefType>();
+const drawer = ref(false);
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	ruleFormRef.value?.resetFields();
+	queryList();
+};
+
+const checkTable = ref<EmptyArrayType>([]);
+const gridRef = ref<RefType>();
+const selectAllChangeEvent = ({ checked }) => {
+	if (gridRef.value) {
+		const records = gridRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (gridRef.value) {
+		const records = gridRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !Boolean(checkTable.value.length);
+});
+
+// 申请
+const orderPublishRef = ref<RefType>();
+const onApply = (row:any)=>{
+	orderPublishRef.value.openDialog(row);
+}
+// 不公开
+const onUnPublic = ()=>{
+	const ids = checkTable.value.map((item: any) => item.id);
+	ElMessageBox.confirm(`您确认要不公开选中的记录?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+		/*	deleteCommon({ ids }).then(() => {
+				ElMessage.success('操作成功');
+				queryList();
+			});*/
+		})
+		.catch(() => {});
+}
+// 页面加载时
+onMounted(() => {
+	queryList();
+});
+</script>
+
+layout/routerView/parer