فهرست منبع

Merge branch 'release' into dev

zhangchong 7 ماه پیش
والد
کامیت
ebe950fb74

+ 1 - 1
src/App.vue

@@ -163,7 +163,7 @@ onMounted(() => {
 });
 // 清除缓存 name
 const clearCacheTagsView = async (routeName: string) => {
-	let item: EmptyObjectType;
+	let item: EmptyObjectType | null | undefined;
 	tagsViewRoutes.value.forEach((v: any) => {
 		if (v.name === routeName) {
 			item = v;

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

@@ -424,6 +424,9 @@
 		</div>
 		<template #footer>
 			<span class="dialog-footer">
+				<el-text v-if="['ZiGong'].includes(themeConfig.appScope) && state.ruleForm?.returnDeadline" type="danger" tag="b" class="mr20">
+					退回截至时间:{{ formatDate(state.ruleForm?.returnDeadline, 'YYYY-mm-dd HH:MM:SS') }}
+				</el-text>
 				<!-- 单会签中+未到汇总节点 canEndCountersign 为true表示当前工单正在会签中,可以结束会签-->
 				<el-button
 					type="primary"

+ 1 - 1
src/components/ProTable/index.vue

@@ -103,7 +103,7 @@
 			</template>
 			<!-- 无数据 -->
 			<template #empty>
-				<el-empty :image-size="120" />
+				<slot name="empty"><el-empty :image-size="120" /></slot>
 			</template>
 		</el-table>
 		<!-- 分页组件 -->

+ 91 - 3
src/views/business/return/audit.vue

@@ -14,8 +14,9 @@
 				:total="state.total"
 				v-model:page-index="state.queryParams.PageIndex"
 				v-model:page-size="state.queryParams.PageSize"
+				v-if="['YiBin'].includes(themeConfig.appScope)"
 			>
-        <template>
+        <template #table-search>
           <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
             <el-form-item label="关键词" prop="Keyword">
               <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
@@ -67,7 +68,71 @@
 						审批
 					</el-button>
 					<el-button link type="primary" @click="onAuditDetail(row)" title="查看审批详情" v-if="[1, 2].includes(row.state)"> 审批详情 </el-button>
-					<order-detail :order="row.order" @updateList="queryList" />
+				</template>
+			</ProTable>
+			<ProTable
+				ref="proTableRef"
+				:columns="columns1"
+				:data="state.tableData"
+				@updateTable="queryList"
+				:loading="state.loading"
+				:total="state.total"
+				v-model:page-index="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				v-if="['ZiGong'].includes(themeConfig.appScope)"
+			>
+				<template #table-search>
+					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+						<el-form-item label="关键词" prop="Keyword">
+							<el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
+						</el-form-item>
+						<el-form-item label="时间段" prop="crTime">
+							<el-date-picker
+								v-model="state.queryParams.crTime"
+								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="State" v-if="state.queryParams.AuditState === '2'">
+							<el-select v-model="state.queryParams.State" placeholder="请选择审批状态" @change="handleQuery">
+								<el-option value="1" label="审批通过" />
+								<el-option value="2" label="审批拒绝" />
+							</el-select>
+						</el-form-item>
+						<el-form-item>
+							<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
+								<SvgIcon name="ele-Refresh" class="mr5" />重置
+							</el-button>
+						</el-form-item>
+					</el-form>
+				</template>
+				<template #tableHeader="scope">
+					<el-button
+						type="primary"
+						@click="onAuditMultiple"
+						:disabled="!scope.isSelected"
+						:loading="state.loading"
+						v-auth="'business:return:audit:multiple'"
+					>批量审批
+					</el-button>
+				</template>
+				<template #title="{ row }">
+					<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
+				</template>
+				<!-- 表格操作 -->
+				<template #operation="{ row }">
+					<el-button link type="primary" @click="onAudit(row)" title="退回特提" v-auth="'business:return:audit'" v-if="[0].includes(row.state)">
+						审批
+					</el-button>
+					<el-button link type="primary" @click="onAuditDetail(row)" title="查看审批详情" v-if="[1, 2].includes(row.state)"> 审批详情 </el-button>
 				</template>
 			</ProTable>
 		</div>
@@ -85,6 +150,8 @@ import { FormInstance } from 'element-plus';
 import { returnAuditList } from '@/api/business/return';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import Other from '@/utils/other';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
 // 引入组件
 const ReturnAudit = defineAsyncComponent(() => import('@/views/business/return/components/Return-audit.vue')); // 审批
 const ReturnAuditMultiple = defineAsyncComponent(() => import('@/views/business/return/components/Return-audit-multiple.vue'));
@@ -108,7 +175,26 @@ const columns = ref<any[]>([
 	{ prop: 'creatorName', label: '申请人', minWidth: 120 },
 	{ prop: 'creatorOrgName', label: '申请部门', minWidth: 140 },
 	{ prop: 'content', label: '申请理由', minWidth: 150 },
-	{ prop: 'operation', label: '操作', fixed: 'right', minWidth: 160, align: 'center' },
+	{ prop: 'operation', label: '操作', fixed: 'right', minWidth: 90, align: 'center' },
+]);
+const columns1 = ref<any[]>([
+	{ type: 'selection', fixed: 'left', minWidth: 30, align: 'center' },
+	{ prop: 'order.no', label: '工单编码', minWidth: 140 },
+	{ prop: 'order.isProvinceText', label: '省/市工单', minWidth: 90 },
+	{ prop: 'order.title', label: '工单标题', minWidth: 200 },
+	{ prop: 'order.sourceChannel', label: '来源渠道', minWidth: 100 },
+	{ prop: 'order.acceptType', label: '受理类型', minWidth: 100 },
+	{ prop: 'order.hotspotName', label: '热点分类', minWidth: 150 },
+	{ prop: 'order.hotspotName', label: '最近派单员', minWidth: 150 },
+	{ prop: 'order.hotspotName', label: '退回节点', minWidth: 150 },
+	{ prop: 'order.hotspotName', label: '退回时差(小时)', minWidth: 150 },
+	{ prop: 'order.acceptorName', label: '受理人', minWidth: 120 },
+	{ prop: 'order.orgLevelOneName', label: '一级部门', minWidth: 140 },
+	{ prop: 'stateText', label: '退回审批状态', minWidth: 120 },
+	{ prop: 'creatorName', label: '申请人', minWidth: 120 },
+	{ prop: 'creatorOrgName', label: '申请部门', minWidth: 140 },
+	{ prop: 'content', label: '申请理由', minWidth: 150 },
+	{ prop: 'operation', label: '操作', fixed: 'right', minWidth: 90, align: 'center' },
 ]);
 const state = reactive<any>({
 	queryParams: {
@@ -126,6 +212,8 @@ const state = reactive<any>({
 	loading: false, // 加载
 	total: 0, // 总数
 });
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 // 手动查询,将页码设置为1
 const handleQuery = () => {
 	state.queryParams.PageIndex = 1;

+ 13 - 1
src/views/business/return/components/Return-audit.vue

@@ -27,7 +27,7 @@
 					<el-divider content-position="left">
 						<el-text tag="b" size="large"> 审批详情 </el-text>
 					</el-divider>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 						<el-form-item label="审批结果" prop="state" :rules="[{ required: true, message: '请选择审批结果', trigger: 'change' }]">
 							<el-radio-group v-model="state.ruleForm.state">
 								<el-radio :value="1">审批通过</el-radio>
@@ -35,6 +35,14 @@
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="['ZiGong'].includes(themeConfig.appScope)">
+						<el-form-item label="是否允许再退回" prop="state" :rules="[{ required: true, message: '请选择是否允许再退回', trigger: 'change' }]" label-width="120px">
+							<el-radio-group v-model="state.ruleForm.state">
+								<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="24" :md="24" :lg="24" :xl="24">
 						<el-form-item
 							label="审批意见"
@@ -60,6 +68,8 @@ import { reactive, ref } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { returnAuditAdd } from '@/api/business/return';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
 
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
@@ -75,6 +85,8 @@ const state = reactive<any>({
 	workflowId: null, // 工作流id
 });
 const ruleFormRef = ref<RefType>();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /**
  * @description 打开弹窗
  * @param {object} val 工单详情

+ 3 - 6
src/views/business/visit/component/Reverse-audit.vue

@@ -12,8 +12,8 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="评判意见" prop="judgeContent" :rules="[{ required: false, message: '请填评判意见', trigger: 'blur' }]">
-							<el-input v-model="state.ruleForm.judgeContent" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填评判意见" />
+						<el-form-item label="评判意见" prop="judgeContent" :rules="[{ required: false, message: '请填评判意见', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.judgeContent" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填评判意见" />
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -28,13 +28,10 @@
 	</el-dialog>
 </template>
 <script setup lang="ts">
-import { defineAsyncComponent, reactive, ref } from 'vue';
+import { reactive, ref } from 'vue';
 import {  ElNotification, FormInstance } from 'element-plus';
 import { visitTurnSatisfaction } from '@/api/business/visit';
 
-// 引入组件
-const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue'));
-
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 // 定义变量内容

+ 106 - 18
src/views/business/visit/component/Visit-detail.vue

@@ -139,6 +139,11 @@
 										<span v-if="state.ruleForm.isPutThrough !== null">{{ state.ruleForm.isPutThrough ? '已接通' : '未接通' }}</span>
 									</el-form-item>
 								</el-col>-->
+								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"  v-if="['ZiGong'].includes(themeConfig.appScope)">
+									<el-form-item label="语音评价">
+
+									</el-form-item>
+								</el-col>
 								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 									<el-row v-for="item in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
 										<!-- 务员评价 -->
@@ -159,21 +164,23 @@
 											<el-divider content-position="left">
 												<el-text tag="b" size="large" type="primary"> {{ item.visitOrgName }} </el-text>
 											</el-divider>
-											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-												<el-form-item label="部门是否联系">
-													{{ item.isContact === null ? '' : item.isContact === true ? '是' : '否' }}
-												</el-form-item>
-											</el-col>
-											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-												<el-form-item label="处理结果">
-													{{ item.volved === null ? '' : item.volved === true ? '已得到解决' : '未得到解决' }}
-												</el-form-item>
-											</el-col>
-											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="item.volveConent">
-												<el-form-item label="备注" class="formatted-text mb5">
-													{{ item.volveConent }}
-												</el-form-item>
-											</el-col>
+											<template v-if="['YiBin'].includes(themeConfig.appScope)">
+												<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+													<el-form-item label="部门是否联系">
+														{{ item.isContact === null ? '' : item.isContact === true ? '是' : '否' }}
+													</el-form-item>
+												</el-col>
+												<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+													<el-form-item label="处理结果">
+														{{ item.volved === null ? '' : item.volved === true ? '已得到解决' : '未得到解决' }}
+													</el-form-item>
+												</el-col>
+												<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="item.volveConent">
+													<el-form-item label="备注" class="formatted-text mb5">
+														{{ item.volveConent }}
+													</el-form-item>
+												</el-col>
+											</template>
 											<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 												<el-form-item label="部门办件结果">
 													{{ item.orgProcessingResults?.dicDataName }}
@@ -214,6 +221,24 @@
 										<span>{{ state.orderVisitModel.judgeContent }}</span>
 									</el-form-item>
 								</el-col>
+								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
+									<el-form-item label="历史回访记录">
+										<ProTable
+											ref="proTableRef"
+											:columns="columns"
+											:data="state.tableData"
+											@updateTable="queryList"
+											:loading="state.loading"
+											:pagination="false"
+											border
+											:toolButton="false"
+										>
+											<template #empty>
+												暂无数据
+											</template>
+										</ProTable>
+									</el-form-item>
+								</el-col>
 							</el-row>
 						</template>
 						<!-- 编辑 -->
@@ -249,6 +274,17 @@
 									<el-row v-for="(item, index) in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
 										<!-- 务员评价 -->
 										<template v-if="item.visitTarget === 10 && isTelSource">
+											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
+												<el-form-item
+													label="语音评价"
+													:prop="`visitDetails.${index}.viceEvaluate`"
+													:rules="[{ required: true, message: '请选择语音评价', trigger: 'change' }]"
+												>
+													<el-radio-group v-model="item.viceEvaluate">
+														<el-radio v-for="items in seatEvaluate" :key="items.key" :label="items.value" :value="items.key">{{items.value}}</el-radio>
+													</el-radio-group>
+												</el-form-item>
+											</el-col>
 											<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 												<el-form-item
 													label="话务员评价"
@@ -284,6 +320,7 @@
 											<el-divider content-position="left">
 												<el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
 											</el-divider>
+											<template v-if="['YiBin'].includes(themeConfig.appScope)">
 											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 												<el-form-item
 													label="部门是否联系"
@@ -326,6 +363,7 @@
 													/>
 												</el-form-item>
 											</el-col>
+											</template>
 											<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 												<el-form-item
 													label="部门办件结果"
@@ -419,6 +457,24 @@
 										<el-checkbox v-model="state.ruleForm.seatJudge">扭转坐席满意度</el-checkbox>
 									</el-form-item>
 								</el-col>
+								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
+									<el-form-item label="历史回访记录">
+										<ProTable
+											ref="proTableRef"
+											:columns="columns"
+											:data="state.tableData"
+											@updateTable="queryList"
+											:loading="state.loading"
+											:pagination="false"
+											border
+											:toolButton="false"
+										>
+											<template #empty>
+												暂无数据
+											</template>
+										</ProTable>
+									</el-form-item>
+								</el-col>
 							</el-row>
 						</template>
 					</el-form>
@@ -433,14 +489,17 @@
 		<template #footer v-else>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onRedo" :loading="state.loading" v-if="['ZiGong'].includes(themeConfig.appScope)">重办</el-button>
 				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">保存</el-button>
 			</span>
 		</template>
 	</el-dialog>
 	<!-- 播放录音 -->
 	<play-record ref="playRecordRef" />
+	<!-- 回访重办 -->
+	<visit-redo ref="visitRedoRef" />
 </template>
-<script setup lang="ts" name="orderFollowUpDetail">
+<script setup lang="tsx" name="orderFollowUpDetail">
 import { computed, defineAsyncComponent, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { commonEnum } from '@/utils/constants';
@@ -450,10 +509,12 @@ import dayjs from 'dayjs';
 import { visitDetailBaseData, visitOrder } from '@/api/business/visit';
 import mittBus from '@/utils/mitt';
 import { callCenterOutbound } from '@/utils/callCenter';
+import { useThemeConfig } from '@/stores/themeConfig';
 
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const PlayRecord = defineAsyncComponent(() => import('@/components/PlayRecord/index.vue')); // 播放录音
+const VisitRedo = defineAsyncComponent(() => import('@/views/business/visit/component/Visit-redo.vue')); // 回访重办
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 // 定义变量内容
@@ -472,9 +533,9 @@ const state = reactive<any>({
 	orderDetail: {}, // 工单详情
 	orderVisitModel: {}, // 回访详情
 	recordingAbsolutePath: '', // 录音文件
+	tableData:[], //回访记录列表
 });
 const ruleFormRef = ref<RefType>();
-
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 const visitCount = ref<number>(0); // 回访次数
@@ -486,6 +547,8 @@ const visitSatisfaction = ref<EmptyArrayType>(); // 部门办件结果
 const visitId = ref<string>(''); // 回访id
 const dialogTitle = ref<string>('回访'); // 弹窗标题
 const aiVisitVoiceBaseUrl = ref(''); // 智能回访录音前缀
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 const getBaseData = async (id: string) => {
 	state.loading = true;
 	try {
@@ -637,7 +700,32 @@ const chooseAdvice = (item: any, index: number | string) => {
 		state.ruleForm.visitDetails[index].visitContent = '';
 	}
 	state.ruleForm.visitDetails[index].visitContent += item.content;
-};
+}
+// 重办
+const visitRedoRef = ref<RefType>();
+const onRedo = ()=>{
+	visitRedoRef.value.openDialog(state.orderDetail)
+}
+const queryList = ()=>{
+
+}
+// 表格配置项
+const columns = ref<any[]>([
+	{ prop: 'order.no', label: '语音评价' },
+	{ prop: 'order.isProvinceText', label: '话务员评价'},
+	{ prop: 'order.title', label: '部门名称'},
+	{ prop: 'order.sourceChannel', label: '部门办件结果' },
+	{ prop: 'visitStateText', label: '部门办件态度' },
+	{ prop: 'visitTypeText', label: '部门评价内容'},
+	{
+		prop: 'visitTime',
+		label: '回访时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.visitTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+]);
 const callId = ref<string>('');
 onMounted(() => {
 	mittBus.on('outboundConnect', (data) => {

+ 123 - 0
src/views/business/visit/component/Visit-redo.vue

@@ -0,0 +1,123 @@
+<template>
+	<el-dialog
+		v-model="state.dialogVisible"
+		draggable
+		title="业务信件重办"
+		append-to-body
+		destroy-on-close
+		@close="close"
+		@mouseup="mouseup"
+		ref="dialogRef"
+		:style="'transform: ' + state.transform + ';'"
+	>
+		<div class="collapse-container" v-loading="state.loading">
+			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12">
+						<el-form-item label="评判结果" prop="isAgree" :rules="[{ required: true, message: '请选择评判结果', trigger: 'change' }]">
+							<el-radio-group v-model="state.ruleForm.isAgree">
+								<el-radio :value="true">同意</el-radio>
+								<el-radio :value="false">不同意</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="重办意见" prop="judgeContent" :rules="[{ required: false, message: '请填写重办意见', trigger: 'blur' }]">
+							<common-advice
+								@chooseAdvice="chooseAdviceRedo"
+								v-model="state.ruleForm.judgeContent"
+								placeholder="请填写重办意见"
+								:loading="state.loading"
+								:commonEnum="commonEnum.OrderCirculation"
+								:minRows="5"
+								:maxRows="10"
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+		</div>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onAudit(ruleFormRef)" :loading="state.loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+<script setup lang="ts">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElNotification, FormInstance } from 'element-plus';
+import { visitTurnSatisfaction } from '@/api/business/visit';
+import { commonEnum } from '@/utils/constants';
+
+const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	transform: 'translate(0px, 0px)', // 滚动条位置
+	ruleForm: {
+		judgeContent: '', // 评判内容
+		isAgree: true, // 是否通过
+	},
+});
+const ruleFormRef = ref<RefType>();
+const ids = ref<any>([]);
+// 打开弹窗
+const openDialog = async (val: any) => {
+	ids.value = val;
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+	state.loading = false;
+};
+// 设置抽屉
+const dialogRef = ref<RefType>();
+const mouseup = () => {
+	state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
+};
+// 选择常用意见 填入填写框 延期
+const chooseAdviceRedo = (item: any) => {
+	state.ruleForm.judgeContent += item.content;
+};
+// 审批
+const onAudit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		const request = {
+			ids: ids.value,
+			judgeContent: state.ruleForm.judgeContent,
+			isAgree: state.ruleForm.isAgree,
+		};
+		visitTurnSatisfaction(request)
+			.then((res: any) => {
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+				ElNotification({
+					type: 'info',
+					title: '评判完成',
+					message: `成功评判${res.result?.successCount}条,失败${res.result?.errorCount}条`,
+				});
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 63 - 31
src/views/business/visit/todo.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="business-visit-todo-container layout-padding">
-    <div class="layout-padding-auto layout-padding-view pd20">
+		<div class="layout-padding-auto layout-padding-view pd20">
 			<ProTable
 				ref="proTableRef"
 				:columns="columns"
@@ -11,21 +11,21 @@
 				v-model:page-index="state.queryParams.PageIndex"
 				v-model:page-size="state.queryParams.PageSize"
 			>
-        <template #table-search>
-          <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline label-width="100px">
-                <el-form-item label="数据范围" prop="QuerySelf" v-auth="'business:visit:todo:querySelf'">
-                  <el-segmented
-                      :options="[
+				<template #table-search>
+					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline label-width="100px">
+						<el-form-item label="数据范围" prop="QuerySelf" v-auth="'business:visit:todo:querySelf'">
+							<el-segmented
+								:options="[
 									{ label: '我的', value: 'true' },
 									{ label: '全部', value: 'false' },
 								]"
-                      v-model="state.queryParams.QuerySelf"
-                      @change="handleQuery"
-                  />
-                </el-form-item>
-                <el-form-item label="工单类型" prop="IsProvince" v-auth="'business:visit:todo:orderType'">
-                  <el-segmented
-                      :options="[
+								v-model="state.queryParams.QuerySelf"
+								@change="handleQuery"
+							/>
+						</el-form-item>
+						<el-form-item label="工单类型" prop="IsProvince" v-auth="'business:visit:todo:orderType'">
+							<el-segmented
+								:options="[
 									{
 										value: 'all',
 										label: '全部',
@@ -39,23 +39,37 @@
 										label: '省工单',
 									},
 								]"
-                      v-model="fastSearch"
-                      @change="fastSearchChange"
-                  />
-                </el-form-item>
-                <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="No">
-                  <el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery"  class="keyword-input"/>
-                </el-form-item>
-                <el-form-item label="">
-                    <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>
+								v-model="fastSearch"
+								@change="fastSearchChange"
+							/>
+						</el-form-item>
+						<el-form-item label="回访状态" prop="QuerySelf" v-if="['ZiGong'].includes(themeConfig.appScope)">
+							<el-segmented
+								:options="[
+									{ label: '待回访', value: '1' },
+									{ label: '短信回访中', value: '2' },
+									{ label: '短信不满意待回访', value: '3' },
+								]"
+								v-model="state.queryParams.QuerySelf"
+								@change="handleQuery"
+							/>
+						</el-form-item>
+						<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="No">
+							<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+						</el-form-item>
+						<el-form-item label="">
+							<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 #tableHeader="scope">
+					<el-button type="primary" @click="messageVisit" :disabled="!scope.isSelected" v-auth="'business:visit:todo:message'" v-if="['ZiGong'].includes(themeConfig.appScope)">
+						<SvgIcon name="ele-Message" class="mr5" />短信回访</el-button
+					>
 					<el-button type="primary" @click="multiplePeople" :disabled="!scope.isSelected" v-auth="'business:visit:todo:multiplePeople'">
 						<SvgIcon name="ele-User" class="mr5" />分配回访人</el-button
 					>
@@ -117,9 +131,10 @@
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { ElMessageBox, FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
-import { useRouter } from 'vue-router';
 import { visitList } from '@/api/todo/visit';
 import { visitSearchBaseData } from '@/api/business/visit';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
 // 引入组件
 const VisitDetail = defineAsyncComponent(() => import('/src/views/business/visit/component/Visit-detail.vue')); // 回访
 const AssignReturnVisitors = defineAsyncComponent(() => import('@/views/business/visit/component/Assign-return-visitors.vue')); // 分配回访人
@@ -219,6 +234,8 @@ const state = reactive<any>({
 	total: 0, // 总数
 	visitTypeOptions: [],
 });
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 // 获取基础数据
 const getBaseData = () => {
 	visitSearchBaseData().then((res: any) => {
@@ -274,8 +291,23 @@ const onMigration = () => {
 	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
 	orderMigrationRef.value.openDialog('visitTodo', ids);
 };
+// 短信回访
+const messageVisit = () => {
+	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
+	ElMessageBox.confirm(`您确定要选择的【${proTableRef.value.selectedList.length}】个工单进行短信回访?`, '提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		autofocus: false,
+	})
+		.then(() => {
+			console.log(ids);
+		})
+		.catch(() => {});
+};
 onMounted(() => {
 	getBaseData();
 	queryList();
 });
-</script>
+</script>