瀏覽代碼

fix:新增短信中心和短信模板页面;

zhangchong 1 年之前
父節點
當前提交
b1065a05df

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

@@ -1,10 +1,6 @@
 /*
  * @Author: zc
  * @description 常用意见管理
- * @version:
- * @Date: 2022-08-09 16:19:55
- * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-16 14:49:01
  */
 import request from '/@/utils/request';
 /**

+ 0 - 4
src/api/auxiliary/area.ts

@@ -1,10 +1,6 @@
 /*
  * @Author: zc
  * @description 区域管理
- * @version:
- * @Date: 2022-08-09 16:19:55
- * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-09-21 15:36:01
  */
 import request from '/@/utils/request';
 /**

+ 0 - 4
src/api/auxiliary/businessTag.ts

@@ -1,10 +1,6 @@
 /*
  * @Author: zc
  * @description 业务标签
- * @version:
- * @Date: 2022-08-26 14:43:22
- * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-10 13:24:01
  */
 import request from '/@/utils/request';
 /**

+ 16 - 0
src/api/auxiliary/message.ts

@@ -0,0 +1,16 @@
+/*
+ * @Author: zc
+ * @description 辅助功能-短信
+ */
+import request from '/@/utils/request';
+/**
+ * @description 短信列表
+ * @param {object} params
+ */
+export const messageList = (params: object) => {
+    return request({
+        url: `/api/v1/PushMessage/getlist`,
+        method: 'get',
+        params,
+    });
+};

+ 13 - 13
src/components/ProcessAudit/index.vue

@@ -183,18 +183,18 @@
 							<el-option v-for="item in state.nextStepOptions" :key="item.key" :label="item.value" :value="item.key" />
 						</el-select>
 						<p class="flex-center-align color-danger" v-if="showFastSendOrder">
-							当前推荐派单处理人:{{ fastStepName }} <el-button type="primary" link class="ml4" @click="fastSendOrder">快捷派单</el-button>
+							当前推荐派单办理对象:{{ fastStepName }} <el-button type="primary" link class="ml4" @click="fastSendOrder">快捷派单</el-button>
 						</p>
 					</el-form-item>
 				</el-col>
-				<!-- 非退回流程都需要选择并且如果选择了结束节点就不需要选择处理人 -->
+				<!-- 非退回流程都需要选择并且如果选择了结束节点就不需要选择办理对象 -->
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="!returnArr.includes(state.processType) && showHandlers">
-					<el-form-item label="处理人" prop="nextHandlers" :rules="[{ required: true, message: '请选择处理人', trigger: 'change' }]">
+					<el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
 						<el-select
 							v-model="state.ruleForm.nextHandlers"
 							multiple
 							filterable
-							placeholder="请选择处理人"
+							placeholder="请选择办理对象"
 							class="w100"
 							@change="selectHandlers"
 							value-key="key"
@@ -393,7 +393,7 @@ const state = reactive<any>({
 		nextStepCode: '', // 下一节点
 		nextStepName: '', // 下一节点名称
 		backToCountersignEnd: false, // 是否回到会签结束节点
-		nextHandlers: [], // 下一节点处理人
+		nextHandlers: [], // 下一节点办理对象
 		nextMainHandler: '', // 主办人
 		isSms: false, // 是否短信通知
 		isStartCountersign: false, // 是否发起会签
@@ -413,13 +413,13 @@ const state = reactive<any>({
 		content: '', // 重办理由
 	},
 	nextStepOptions: [], // 下一节点
-	handlerOptions: [], // 处理人
+	handlerOptions: [], // 办理对象
 	transform: 'translate(0px, 0px)', // 滚动条位置
 	fileList: [], // 附件列表
 	loading: false, // 提交按钮loading
 	processType: 'next', // 流程状态
 	workflowId: '', // 流程id
-	handlerClassifies: [], //撤回处理人
+	handlerClassifies: [], //撤回办理对象
 	handlerMainOptions: [], // 主办人
 	handleId: '', // 流程处理ID
 	dialogTitle: '', // 弹窗标题
@@ -431,7 +431,7 @@ const ruleFormRef = ref<RefType>(); //表单组件
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 const showStepsArr = ['延期申请', '甄别申请', '工单重办']; // 显示步骤条的流程
-const handelArr = ['工单办理']; // 处于办理状态的流程 (如果是汇总节点 需要填写处理人等  办理流程才有期满时间)
+const handelArr = ['工单办理']; // 处于办理状态的流程 (如果是汇总节点 需要填写办理对象等  办理流程才有期满时间)
 const returnArr = ['工单退回']; // 退回流程 (退回流程不需要展示其他 只需要填写意见和附件即可)
 
 const timeType = ref<EmptyArrayType>([]); // 延期申请单位
@@ -516,7 +516,7 @@ const openDialog = async (val: any) => {
 	}
 };
 const handleResult = (res: any) => {
-	state.nextStepOptions = res.result.steps; //处理人选择内容
+	state.nextStepOptions = res.result.steps; //办理对象选择内容
 	canReject.value = res.result.canReject ?? false; // 是否可以驳回
 	timeTypeOptions.value = res.result.timeTypeOptions ?? []; // 办理时限申请单位
 	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
@@ -593,11 +593,11 @@ const selectNextStep = (val: any) => {
 		fastStepName.value = items[0].value;
 	}
 };
-//  会签是否可用 (多个处理人,并且配置可以会签)
+//  会签是否可用 (多个办理对象,并且配置可以会签)
 const countersignDisabled = computed(() => {
 	return state.ruleForm.nextHandlers.length > 1 && canStartCountersign.value;
 });
-// 是否展示处理人 (只有结束节点不展示 next.stepType===2 表示为结束节点)
+// 是否展示办理对象 (只有结束节点不展示 next.stepType===2 表示为结束节点)
 const showHandlers = computed(() => {
 	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
 	if (!next) return true;
@@ -659,7 +659,7 @@ const computeTimeNext = debounce(() => {
 		});
 }, 300);
 
-// 选择处理人
+// 选择办理对象
 const selectHandlers = () => {
 	ruleFormRef.value?.resetFields('nextMainHandler');
 	if (state.ruleForm.nextHandlers.length > 1) {
@@ -670,7 +670,7 @@ const selectHandlers = () => {
 const showMainHandler = computed(() => {
 	return state.ruleForm.nextHandlers.length > 1;
 });
-// 主办从处理人中选择
+// 主办从办理对象中选择
 state.handlerMainOptions = computed(() => {
 	return state.ruleForm.nextHandlers;
 });

+ 99 - 0
src/views/auxiliary/message/component/Message-add.vue

@@ -0,0 +1,99 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="800px" draggable title="新增待发短信">
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef">
+			<el-row :gutter="10">
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="消息推送业务" prop="commonType" :rules="[{ required: true, message: '请选择消息推送业务', trigger: 'change' }]">
+            <el-select v-model="state.ruleForm.commonType" placeholder="请选择消息推送业务" clearable class="w100">
+              <el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="短信内容" prop="content" :rules="[{ required: true, message: '请输入短信内容', trigger: 'blur' }]">
+						<el-input
+							v-model="state.ruleForm.content"
+							placeholder="请输入短信内容"
+							:autosize="{ minRows: 6, maxRows: 10 }"
+							type="textarea"
+							show-word-limit
+							maxlength="2000"
+						></el-input>
+					</el-form-item>
+				</el-col>
+
+			</el-row>
+		</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="loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="auxiliaryMessageAdd">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '/@/utils/tools';
+import { addCommon } from '/@/api/auxiliary/advice';
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+const props = defineProps({
+	commonType: {
+		type: Array,
+		default: () => [],
+	},
+});
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		content: '', // 意见内容
+		commonType: '', // 意见类型
+		isOpen: true, // 是否公开意见
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async () => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 新增
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		addCommon(state.ruleForm)
+			.then(() => {
+				ElMessage({
+					message: '操作成功',
+					type: 'success',
+				});
+				emit('updateList');
+			})
+			.catch((error) => {})
+			.finally(() => {
+				loading.value = false;
+				closeDialog();
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 200 - 0
src/views/auxiliary/message/index.vue

@@ -0,0 +1,200 @@
+<template>
+	<div class="auxiliary-message-container layout-pd">
+		<el-card shadow="never">
+			<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
+				<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="timeStartChangeCr"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+					/>
+				</el-form-item>
+				<el-form-item label="意见类型" prop="CommonType">
+					<el-select v-model="state.queryParams.CommonType" placeholder="请选择意见类型">
+						<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="常用语分类" prop="isOpen">
+					<el-select v-model="state.queryParams.isOpen" placeholder="请选择意见类型">
+						<el-option v-for="item in openState" :value="item.key" :key="item.key" :label="item.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+		<el-card shadow="never">
+			<div class="mb20">
+				<el-button type="primary" @click="onMessageAdd" v-waves v-auth="'auxiliary:message:add'">
+					<SvgIcon name="ele-Plus" class="mr5" />新增
+				</el-button>
+				<el-button type="primary" @click="onDelete" v-waves v-auth="'auxiliary:message:delete'" :disabled="!multipleSelection.length">
+					<SvgIcon name="ele-Delete" class="mr5" />删除
+				</el-button>
+			</div>
+			<!-- 表格 -->
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+				<el-table-column type="selection" width="55" />
+
+				<el-table-column prop="commonTypeText" label="短信类型" show-overflow-tooltip width="130"></el-table-column>
+				<el-table-column prop="creatorName" label="发送状态" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="name" label="接收人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="telNumber" label="接受号码" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="content" label="短信内容" show-overflow-tooltip width="400"></el-table-column>
+				<el-table-column label="添加时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="sendOrganize" label="发送部门" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="sendUser" label="发送人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="orderNo" label="关联工单编号" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="remark" label="备注说明" show-overflow-tooltip width="200"></el-table-column>
+				<template #empty>
+					<Empty />
+				</template>
+			</el-table>
+			<!-- 分页 -->
+			<pagination
+				:total="state.total"
+				v-model:page="state.queryParams.PageIndex"
+				v-model:limit="state.queryParams.PageSize"
+				@pagination="queryList"
+			/>
+		</el-card>
+		<!--  新增短信推送  -->
+		<message-add ref="messageAddRef" @updateList="queryList" />
+	</div>
+</template>
+
+<script lang="ts" setup name="auxiliaryMessage">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '/@/utils/formatTime';
+import { auth } from '/@/utils/authFunction';
+import { commonBaseData, deleteCommon } from '/@/api/auxiliary/advice';
+import { messageList } from '/@/api/auxiliary/message';
+import { shortcuts } from '/@/utils/constants';
+import other from "/@/utils/other";
+
+// 引入组件
+const MessageAdd = defineAsyncComponent(() => import('/@/views/auxiliary/message/component/Message-add.vue')); // 短信新增
+
+// 定义变量内容
+const state = reactive<any>({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 10,
+		CommonType: null, // 常用意见类型
+		isOpen: null, // 是否公开
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+	if (val) {
+		state.queryParams[startKey] = val[0];
+		state.queryParams[endKey] = val[1];
+	} else {
+		state.queryParams[startKey] = '';
+		state.queryParams[endKey] = '';
+	}
+};
+// 受理时间
+const timeStartChangeCr = (val: string[]) => {
+	handleTimeChange(val, 'StartTime', 'EndTime');
+  queryList();
+};
+const ruleFormRef = ref<RefType>(null); // 表单ref
+const commonType = ref<EmptyArrayType>([]); // 常用意见类型
+const openState = ref<EmptyArrayType>([
+	{
+		key: true,
+		value: '公开常用意见',
+	},
+	{
+		key: false,
+		value: '个人常用意见',
+	},
+]); // 是否公开
+const getBaseData = async () => {
+	try {
+		const res = await commonBaseData();
+		commonType.value = res.result?.commonType ?? [];
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 获取参数列表
+const queryList = () => {
+	state.loading = true;
+	if (!auth('auxiliary:message:query')) ElMessage.error('抱歉,您没有权限获取短信列表!');
+	else {
+    const request = other.deepClone(state.queryParams);
+    Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
+		messageList(state.queryParams)
+			.then((res) => {
+				state.loading = false;
+				state.tableData = res.result.items ?? [];
+				state.total = res.result.total ?? 0;
+			})
+			.finally(() => {
+				state.loading = false;
+			});
+	}
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+  state.queryParams.StartTime = null;
+  state.queryParams.EndTime = null;
+	queryList();
+};
+// 新增发送短信
+const messageAddRef = ref<RefType>();
+const onMessageAdd = () => {
+	messageAddRef.value.openDialog();
+};
+// 表格多选
+const multipleTableRef = ref<RefType>();
+const multipleSelection = ref<any>([]);
+const handleSelectionChange = (val: any[]) => {
+	multipleSelection.value = val;
+};
+// 删除短信
+const onDelete = () => {
+	const contents = multipleSelection.value.map((item: any) => item.content).join('、');
+	const ids = multipleSelection.value.map((item: any) => item.id);
+	ElMessageBox.confirm(`您确定要删除:【${contents}】的常用意见,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			deleteCommon({ ids }).then(() => {
+				ElMessage.success('操作成功');
+				queryList();
+			});
+		})
+		.catch(() => {});
+};
+// 页面加载时
+onMounted(() => {
+	getBaseData();
+	queryList();
+});
+</script>

+ 98 - 0
src/views/auxiliary/messageTemplate/component/Template-add.vue

@@ -0,0 +1,98 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="800px" draggable title="新增短信模板">
+		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="意见内容" prop="content" :rules="[{ required: true, message: '请输入意见内容', trigger: 'blur' }]">
+						<el-input
+							v-model="state.ruleForm.content"
+							placeholder="请输入意见内容"
+							:autosize="{ minRows: 6, maxRows: 10 }"
+							type="textarea"
+							show-word-limit
+							maxlength="2000"
+						></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
+							<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="auxiliaryMessageTemplateAdd">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '/@/utils/tools';
+import { addCommon } from '/@/api/auxiliary/advice';
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+const props = defineProps({
+	commonType: {
+		type: Array,
+		default: () => [],
+	},
+});
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		content: '', // 意见内容
+		commonType: '', // 意见类型
+		isOpen: true, // 是否公开意见
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async () => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 新增
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		addCommon(state.ruleForm)
+			.then(() => {
+				ElMessage({
+					message: '操作成功',
+					type: 'success',
+				});
+				emit('updateList');
+			})
+			.catch((error) => {})
+			.finally(() => {
+				loading.value = false;
+				closeDialog();
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 102 - 0
src/views/auxiliary/messageTemplate/component/Template-edit.vue

@@ -0,0 +1,102 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="50%" draggable title="修改短信模板">
+		<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="意见内容" prop="content" :rules="[{ required: true, message: '请输入意见内容', trigger: 'blur' }]">
+						<el-input
+							v-model="state.ruleForm.content"
+							placeholder="请输入意见内容"
+							:autosize="{ minRows: 6, maxRows: 10 }"
+							type="textarea"
+							show-word-limit
+							maxlength="2000"
+						></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
+						<el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
+							<el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="auxiliaryMessageTemplateEdit">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '/@/utils/tools';
+import { commonUpdate } from '/@/api/auxiliary/advice';
+import other from '/@/utils/other';
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+const props = defineProps({
+	commonType: {
+		type: Array,
+		default: () => [],
+	},
+});
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		content: '', // 意见内容
+		CommonType: '', // 意见类型
+		isOpen: true, // 是否公开意见
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async (row: any) => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.ruleForm = other.deepClone(row);
+		state.dialogVisible = true;
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 新增
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		commonUpdate(state.ruleForm)
+			.then(() => {
+				ElMessage({
+					message: '操作成功',
+					type: 'success',
+				});
+				loading.value = false;
+				closeDialog();
+				emit('updateList');
+			})
+			.catch(() => {})
+			.finally(() => {
+				loading.value = false;
+				closeDialog();
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 179 - 0
src/views/auxiliary/messageTemplate/index.vue

@@ -0,0 +1,179 @@
+<template>
+	<div class="auxiliary-message-template-container layout-pd">
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
+        <el-form-item label="意见类型" prop="CommonType">
+          <el-select v-model="state.queryParams.CommonType" placeholder="请选择意见类型">
+            <el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="常用语分类" prop="isOpen">
+          <el-select v-model="state.queryParams.isOpen" placeholder="请选择意见类型">
+            <el-option v-for="item in openState" :value="item.key" :key="item.key" :label="item.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+          <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+		<el-card shadow="never">
+			<div class="mb20">
+				<el-button type="primary" @click="onAdd" v-waves v-auth="'auxiliary:messageTemplate:add'">
+					<SvgIcon name="ele-Plus" class="mr5" />新增
+				</el-button>
+        <el-button type="primary" @click="onAdviceDelete" v-waves v-auth="'auxiliary:messageTemplate:delete'" :disabled="!multipleSelection.length">
+          <SvgIcon name="ele-Delete" class="mr5" />删除
+        </el-button>
+			</div>
+			<!-- 表格 -->
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" />
+				<el-table-column prop="content" label="意见内容" show-overflow-tooltip width="400"></el-table-column>
+				<el-table-column prop="commonTypeText" label="意见类型" show-overflow-tooltip width="130"></el-table-column>
+        <el-table-column prop="isOpen" label="常用意见分类" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            {{row.isOpen ? '公开常用意见' : '个人常用意见'}}
+          </template>
+        </el-table-column>
+				<el-table-column prop="creatorName" label="创建人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="creatorOrgName" label="创建部门" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="afterBegin" label="创建时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="操作" width="120" fixed="right" align="center">
+					<template #default="{ row }">
+						<el-button link type="primary" @click="onUpdate(row)" v-auth="'auxiliary:advice:edit'" title="修改参数"> 修改 </el-button>
+						<!--              <el-button link type="danger" @click="parameterDelete(row)" v-auth="'system:timeLimit:detail'" title="删除参数"> 删除 </el-button>-->
+					</template>
+				</el-table-column>
+				<template #empty>
+					<Empty />
+				</template>
+			</el-table>
+			<!-- 分页 -->
+			<pagination
+				:total="state.total"
+				v-model:page="state.queryParams.PageIndex"
+				v-model:limit="state.queryParams.PageSize"
+				@pagination="queryList"
+			/>
+		</el-card>
+		<!--  短信模板新增  -->
+		<template-add ref="templateAddRef" @updateList="queryList"/>
+		<!--  短信模板编辑  -->
+		<template-edit ref="templateEditRef" @updateList="queryList"/>
+	</div>
+</template>
+
+<script lang="ts" setup name="auxiliaryMessageTemplate">
+import {defineAsyncComponent, onMounted, reactive, ref} from 'vue';
+import {ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import {formatDate} from '/@/utils/formatTime';
+import {auth} from "/@/utils/authFunction";
+import {commonBaseData, deleteCommon, publicCommonList} from '/@/api/auxiliary/advice';
+
+// 引入组件
+const TemplateAdd = defineAsyncComponent(() => import('/@/views/auxiliary/messageTemplate/component/Template-add.vue')); // 短信模板新增
+const TemplateEdit = defineAsyncComponent(() => import('/@/views/auxiliary/messageTemplate/component/Template-edit.vue')); // 短信模板编辑
+
+// 定义变量内容
+const state = reactive<any>({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 10,
+    CommonType: null, // 常用意见类型
+    isOpen: null, // 是否公开
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const ruleFormRef = ref<RefType>(null); // 表单ref
+const commonType = ref<EmptyArrayType>([]); // 常用意见类型
+const openState = ref<EmptyArrayType>([
+  {
+    key: true,
+    value: '公开常用意见',
+  },
+  {
+    key: false,
+    value: '个人常用意见',
+  },
+]); // 是否公开
+const getBaseData = async ()=>{
+  try {
+    const res = await commonBaseData();
+    commonType.value = res.result?.commonType ?? [];
+  } catch (error) {
+    console.log(error);
+  }
+}
+// 获取参数列表
+const queryList = () => {
+	state.loading = true;
+  if (!auth('auxiliary:messageTemplate:query')) ElMessage.error('抱歉,您没有权限获取短信模板!');
+  else {
+    publicCommonList(state.queryParams)
+        .then((res) => {
+          state.loading = false;
+          state.tableData = res.result.items ?? [];
+          state.total = res.result.total ?? 0;
+        })
+        .finally(() => {
+          state.loading = false;
+        });
+  }
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 新增模板
+const templateAddRef = ref<RefType>();
+const onAdd = () => {
+  templateAddRef.value.openDialog();
+};
+// 修改模板
+const templateEditRef = ref<RefType>();
+const onUpdate = (row: any) => {
+  templateEditRef.value.openDialog(row);
+};
+// 表格多选
+const multipleTableRef = ref<RefType>();
+const multipleSelection = ref<any>([]);
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val;
+};
+// 删除参数
+const onAdviceDelete = () => {
+  const contents = multipleSelection.value.map((item: any) => item.content).join('、');
+  const ids = multipleSelection.value.map((item: any) => item.id);
+	ElMessageBox.confirm(`您确定要删除:【${contents}】的常用意见,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			deleteCommon({ids}).then(() => {
+        ElMessage.success('操作成功');
+        queryList();
+			});
+		})
+		.catch(() => {});
+};
+// 页面加载时
+onMounted(() => {
+  getBaseData();
+	queryList();
+});
+</script>

+ 18 - 8
src/views/auxiliary/notice/index.vue

@@ -68,9 +68,9 @@
 				<el-table-column type="selection" width="55" />
 				<!--  通知  -->
 				<template v-if="listType === '0'">
-					<el-table-column prop="circularTypeName" label="通知类型" show-overflow-tooltip></el-table-column>
-					<el-table-column prop="circularStateText" label="通知状态" show-overflow-tooltip></el-table-column>
-					<el-table-column prop="title" label="通知标题" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="circularTypeName" label="通知类型" show-overflow-tooltip  width="120"></el-table-column>
+					<el-table-column prop="circularStateText" label="通知状态" show-overflow-tooltip  width="120"></el-table-column>
+					<el-table-column prop="title" label="通知标题" show-overflow-tooltip width="150"></el-table-column>
 					<el-table-column prop="commonTypeText" label="必须阅读" show-overflow-tooltip>
 						<template #default="{ row }">
 							{{ row.isMustRead ? '是' : '否' }}
@@ -114,13 +114,14 @@
 							<span>{{ formatDate(row.lostEfficacyTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 						</template>
 					</el-table-column>
-					<el-table-column prop="sourceOrgName" label="来源单位" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="sourceOrgName" label="来源单位" show-overflow-tooltip width="120"></el-table-column>
+          <el-table-column prop="circularStateText" label="审核状态" show-overflow-tooltip width="120"></el-table-column>
 				</template>
 				<!--  公告  -->
 				<template v-if="listType === '1'">
-					<el-table-column prop="bulletinTypeName" label="公告类型" show-overflow-tooltip></el-table-column>
-					<el-table-column prop="bulletinStateText" label="公告状态" show-overflow-tooltip></el-table-column>
-					<el-table-column prop="title" label="公告标题" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="bulletinTypeName" label="公告类型" show-overflow-tooltip  width="120"></el-table-column>
+					<el-table-column prop="bulletinStateText" label="公告状态" show-overflow-toolti  width="120"></el-table-column>
+					<el-table-column prop="title" label="公告标题" show-overflow-tooltip   width="150"></el-table-column>
 					<el-table-column prop="readedNum" label="已阅次数" show-overflow-tooltip></el-table-column>
 					<el-table-column prop="pushRangesText" label="公告范围" show-overflow-tooltip width="300"></el-table-column>
 					<el-table-column prop="commonTypeText" label="通知时间" show-overflow-tooltip width="170">
@@ -133,8 +134,17 @@
 							<span>{{ formatDate(row.loseEfficacyTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 						</template>
 					</el-table-column>
-					<el-table-column prop="creatorOrgName" label="来源单位" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="creatorOrgName" label="来源单位" show-overflow-tooltip  width="120"></el-table-column>
+          <el-table-column prop="bulletinStateText" label="审核状态" show-overflow-tooltip width="120"></el-table-column>
 				</template>
+
+        <el-table-column prop="examinOpinion" label="审核理由" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column prop="examinMan" label="审核人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="examinOpinion" label="审核时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.examinTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
 				<el-table-column label="操作" width="200" fixed="right" align="center">
 					<template #default="{ row }">
 						<template v-if="listType === '0'">

+ 36 - 22
src/views/business/special/components/Special-apply-order.vue

@@ -4,21 +4,17 @@
 			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-						<el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.traceId" placeholder="请选择特提节点" class="w100" @change="selectTrace">
-								<el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name">
-									<span style="float: left">{{ item.name }}</span>
-									<span style="float: right; color: var(--el-text-color-secondary); font-size: var(--el-font-size-extra-small)">{{
-										item.acceptorOrgName
-									}}</span>
+						<el-form-item label="特提节点" prop="nextStepCode" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择特提节点" class="w100" @change="selectTrace">
+								<el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value">
 								</el-option>
 							</el-select>
 						</el-form-item>
 					</el-col>
-          <template v-if="state.ruleForm.traceId">
+          <template v-if="state.ruleForm.nextStepCode">
             <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12" >
               <el-form-item label="办理时限" prop="timeLimit" :rules="[{ required: true, message: '请输入办理时限', trigger: 'blur' }]">
-                <el-row :gutter="10" class="w100"  v-loading="state.loading">
+                <el-row :gutter="10" class="w100">
                   <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
                     <el-input-number
                         placeholder="办理时限"
@@ -45,8 +41,20 @@
               </el-form-item>
             </el-col>
             <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-              <el-form-item label="特提部门" prop="orgName">
-                {{ state.ruleForm.orgName }}
+              <el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
+                <el-select
+                    v-model="state.ruleForm.nextHandlers"
+                    placeholder="请选择办理对象"
+                    value-key="key"
+                    clearable
+                    collapse-tags
+                    collapse-tags-tooltip
+                    multiple
+                    filterable
+                    class="w100"
+                >
+                  <el-option v-for="item in stepsItems" :value="item" :key="item.key" :label="item.value"> </el-option>
+                </el-select>
               </el-form-item>
             </el-col>
           </template>
@@ -68,7 +76,7 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="附件" prop="handleResult" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
+						<el-form-item label="附件" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
 							<annex-list name="特提附件" ref="annexListRef" businessId="" classify="特提申请" />
 						</el-form-item>
 					</el-col>
@@ -98,17 +106,18 @@ const state = reactive<any>({
 	dialogVisible: false, // 是否显示弹窗
 	loading: false, // 是否显示加载
 	ruleForm: {
-		traceId: null, // 特提节点
+    nextStepCode: null, // 特提节点
 		timeLimitUnit: 2, // 期满时间单位
-		orgId: null, // 部门id
-		orgName: null, // 部门名称
 		alterTime: false, // 是否修改期满时间
+    nextHandlers: [], // 办理对象
 	},
 	orderDetail: {}, // 工单详情
+  workflowId: null, // 工作流id
 });
 const ruleFormRef = ref<RefType>();
 const specialReason = ref<EmptyArrayType>([]); // 特提理由
-const traces = ref<EmptyArrayType>([]); // 特提节点
+const steps = ref<EmptyArrayType>([]); // 特提节点
+const stepsItems = ref<EmptyArrayType>([]); // 特提部门
 const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
 /**
  * @description 打开弹窗
@@ -116,13 +125,15 @@ const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
  */
 const openDialog = async (val: any) => {
 	state.orderDetail = val;
+  state.workflowId = val.workflowId;
 	state.loading = true;
 	state.dialogVisible = true;
 	try {
 		const [baseRes] = await Promise.all([specialApplyBase(val.workflowId)]);
-		traces.value = baseRes.result.traces ?? [];
+    steps.value = baseRes.result?.step?.steps ?? [];
 		specialReason.value = baseRes.result.specialReason ?? [];
 		specialTimeType.value = baseRes.result.specialTimeType ?? [];
+    console.log(baseRes)
 	} catch (e) {
 		console.log(e);
 	} finally {
@@ -138,18 +149,20 @@ const close = () => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
 };
-// 选择节点确定部门
+// 选择节点确定处理对象
 const selectTrace = (val: any) => {
-	const trace = traces.value.find((item) => item.id === val);
-	state.ruleForm.orgId = trace?.acceptorOrgId;
-	state.ruleForm.orgName = trace?.acceptorOrgName;
+	const step = steps.value.find((item) => item.key === val);
+  state.ruleForm.nextStepName = step?.value;
+  ruleFormRef.value?.resetFields('nextHandlers');
+  stepsItems.value = step?.items ?? [];
+  state.ruleForm.flowDirection = step?.flowDirection;
 	queryHandleTime();
 };
 // 查询办理时限
 const queryHandleTime = () => {
 	if (state.ruleForm.alterTime) return;
 	state.loading = true;
-	specialTime({ OrderId: state.orderDetail.id, TraceId: state.ruleForm.traceId })
+	specialTime({ OrderId: state.orderDetail.id, FlowDirection: state.ruleForm.flowDirection })
 		.then((res) => {
 			state.ruleForm.timeLimit = res.result ?? 0;
 		})
@@ -166,6 +179,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 		state.loading = true;
 		let request = {
 			...state.ruleForm,
+      workflowId: state.workflowId,
 			orderId: state.orderDetail.id,
 			files: annexListRef.value?.fileList,
 			audit: false,

+ 134 - 136
src/views/business/special/components/Special-apply.vue

@@ -1,97 +1,82 @@
 <template>
-  <el-dialog
-      v-model="state.dialogVisible"
-      draggable
-      title="特提申请"
-      width="50%"
-      append-to-body
-      destroy-on-close
-      @close="close"
-  >
-    <div class="collapse-container pb1">
-      <el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
-        <el-row :gutter="35">
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="工单编码"> {{ state.orderDetail.no }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="工单标题"> {{ state.orderDetail.title }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="申请人"> {{ userInfos.name }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="申请部门"> {{ userInfos.orgName }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="申请时间"> {{ formatDate(Date(), 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-            <el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
-              <el-select
-                  v-model="state.ruleForm.traceId"
-                  placeholder="请选择特提节点"
-                  class="w100"
-                  @change="selectTrace"
-              >
-                <el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name">
-                  <span style="float: left">{{ item.name }}</span>
-                  <span style="float: right; color: var(--el-text-color-secondary); font-size: var(--el-font-size-extra-small)">{{
-                      item.acceptorOrgName
-                    }}</span>
-                </el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.traceId">
-            <el-form-item label="特提部门" prop="orgName">
-              {{ state.ruleForm.orgName }}
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-            <el-form-item label="特提原因" prop="cause" :rules="[{ required: true, message: '请选择特提原因', trigger: 'change' }]">
-              <el-select
-                  v-model="state.ruleForm.cause"
-                  placeholder="请选择特提原因"
-                  class="w100"
-              >
-                <el-option v-for="item in specialReason" :value="item.dicDataName" :key="item.dicDataName" :label="item.dicDataName" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-form-item label="特提理由" prop="reason" :rules="[{ required: true, message: '请填写特提理由', trigger: 'blur' }]">
-              <el-input
-                  v-model="state.ruleForm.reason"
-                  type="textarea"
-                  :autosize="{ minRows: 6, maxRows: 10 }"
-                  placeholder="请填写特提理由"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-form-item label="附件" prop="handleResult" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
-              <annex-list name="特提附件" ref="annexListRef" businessId="" classify="特提申请" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-    <template #footer>
+	<el-dialog v-model="state.dialogVisible" draggable title="特提申请" width="50%" append-to-body destroy-on-close @close="close">
+		<div class="collapse-container pb1">
+			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="工单编码"> {{ state.orderDetail.no }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="工单标题"> {{ state.orderDetail.title }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请人"> {{ userInfos.name }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请部门"> {{ userInfos.orgName }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请时间"> {{ formatDate(Date(), 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提节点" prop="nextStepCode" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择特提节点" class="w100" @change="selectTrace">
+								<el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.nextStepCode">
+						<el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
+							<el-select
+								v-model="state.ruleForm.nextHandlers"
+								placeholder="请选择办理对象"
+								value-key="key"
+								clearable
+								collapse-tags
+								collapse-tags-tooltip
+								multiple
+								filterable
+								class="w100"
+							>
+								<el-option v-for="item in stepsItems" :value="item" :key="item.key" :label="item.value"> </el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提原因" prop="cause" :rules="[{ required: true, message: '请选择特提原因', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.cause" placeholder="请选择特提原因" class="w100">
+								<el-option v-for="item in specialReason" :value="item.dicDataName" :key="item.dicDataName" :label="item.dicDataName" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="特提理由" prop="reason" :rules="[{ required: true, message: '请填写特提理由', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.reason" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写特提理由" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" prop="handleResult" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
+							<annex-list name="特提附件" ref="annexListRef" businessId="" classify="特提申请" />
+						</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="onSubmit(ruleFormRef)" :loading="state.loading">提交</el-button>
 			</span>
-    </template>
-  </el-dialog>
+		</template>
+	</el-dialog>
 </template>
 <script setup lang="ts" name="SpecialDialog">
-import {defineAsyncComponent, reactive, ref} from 'vue';
-import {ElMessage, FormInstance} from 'element-plus';
-import {storeToRefs} from 'pinia';
-import {useUserInfo} from '/@/stores/userInfo';
-import {formatDate} from '/@/utils/formatTime';
-import {specialApplyBase,specialApply} from '/@/api/business/special';
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
+import { formatDate } from '/@/utils/formatTime';
+import { specialApplyBase, specialApply } from '/@/api/business/special';
 
 // 引入组件
 const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue'));
@@ -100,76 +85,89 @@ const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/ind
 const emit = defineEmits(['updateList']);
 // 定义变量内容
 const state = reactive<any>({
-  dialogVisible: false, // 是否显示弹窗
-  loading: false, // 是否显示加载
-  ruleForm: {
-    traceId: null, // 特提节点
-    cause:null, // 特提原因
-    reason: null, // 特提理由
-  },
-  orderDetail: {}, // 工单详情
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+    nextStepCode: null, // 特提节点
+		cause: null, // 特提原因
+		reason: null, // 特提理由
+    nextHandlers: [], // 处理对象
+	},
+	orderDetail: {}, // 工单详情
+	workflowId: null, // 工作流id
 });
 const ruleFormRef = ref<RefType>();
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 const specialReason = ref<EmptyArrayType>([]); // 特提理由
-const traces =  ref<EmptyArrayType>([]); // 特提节点
+const steps = ref<EmptyArrayType>([]); // 特提节点
+const stepsItems = ref<EmptyArrayType>([]); // 处理对象
 /**
  * @description 打开弹窗
  * @param {object} val 工单详情
  * @param {boolean} audit 是否是审核
  */
 const isAudit = ref<boolean>(false);
-const openDialog = (val: any,audit=false) => {
-  state.orderDetail = val;
-  isAudit.value = audit;
-  specialApplyBase(val.workflowId).then((res: any) => {
-    specialReason.value = res.result.specialReason ?? [];
-    traces.value = res.result.traces ?? [];
-  });
-  state.dialogVisible = true;
+const openDialog = async (val: any, audit = false) => {
+	state.orderDetail = val;
+	state.workflowId = val.workflowId;
+	isAudit.value = audit;
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		const [baseRes] = await Promise.all([specialApplyBase(val.workflowId)]);
+		steps.value = baseRes.result?.step?.steps ?? [];
+		specialReason.value = baseRes.result.specialReason ?? [];
+		console.log(baseRes);
+	} catch (e) {
+		console.log(e);
+	} finally {
+		state.loading = false;
+	}
 };
 // 关闭弹窗
 const closeDialog = () => {
-  state.dialogVisible = false;
+	state.dialogVisible = false;
 };
-const close = ()=>{
-  ruleFormRef.value?.clearValidate();
-  ruleFormRef.value?.resetFields();
-}
-// 选择节点确定部门
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 选择节点确定办理对象
 const selectTrace = (val: any) => {
-  const trace = traces.value.find((item) => item.id === val);
-  state.ruleForm.orgId = trace?.acceptorOrgId;
-  state.ruleForm.orgName = trace?.acceptorOrgName;
+	const step = steps.value.find((item) => item.key === val);
+	state.ruleForm.nextStepName = step?.value;
+	ruleFormRef.value?.resetFields('nextHandlers');
+	stepsItems.value = step?.items ?? [];
 };
 // 提交
 const annexListRef = ref<RefType>(); // 附件列表
 const onSubmit = (formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  formEl.validate((valid: boolean) => {
-    if (!valid) return;
-    state.loading = true;
-    let request = {
-      ...state.ruleForm,
-      orderId: state.orderDetail.id,
-      files: annexListRef.value?.fileList,
-      audit:isAudit.value
-    };
-    specialApply(request)
-        .then((res: any) => {
-          state.loading = false;
-          closeDialog();
-          emit('updateList');
-          ElMessage.success('操作成功');
-        })
-        .catch(() => {
-          state.loading = false;
-        });
-  });
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		let request = {
+			...state.ruleForm,
+			workflowId: state.workflowId,
+			orderId: state.orderDetail.id,
+			files: annexListRef.value?.fileList,
+			audit: isAudit.value,
+		};
+		specialApply(request)
+			.then((res: any) => {
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('操作成功');
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
 };
 defineExpose({
-  openDialog,
-  closeDialog,
+	openDialog,
+	closeDialog,
 });
 </script>

+ 4 - 4
src/views/business/special/components/Special-audit-detail.vue

@@ -20,7 +20,7 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
 						<el-form-item label="特提节点">
-							{{ state.detail?.trace?.name }}
+							{{ state.detail?.nextStepName }}
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
@@ -46,12 +46,12 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
 						<el-form-item label="特提节点">
-							{{ state.detail?.trace?.name }}
+							{{ state.detail?.nextStepName }}
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-						<el-form-item label="特提部门">
-							{{ state.detail?.orgName }}
+						<el-form-item label="办理对象">
+							{{ state.detail?.nextHandlers?.map(item => item.value).join(',') }}
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">

+ 34 - 17
src/views/business/special/components/Special-audit.vue

@@ -40,12 +40,9 @@
 					</el-col>
 					<el-divider></el-divider>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-						<el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.traceId" placeholder="请选择特提节点" class="w100" @change="selectTrace">
-								<el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name">
-									<span style="float: left">{{ item.name }}</span>
-									<span style="float: right; color: var(--el-text-color-secondary); font-size: var(--el-font-size-extra-small)">{{ item.acceptorOrgName }}</span>
-								</el-option>
+						<el-form-item label="特提节点" prop="nextStepCode" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择特提节点" class="w100" @change="selectTrace">
+                <el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -80,8 +77,20 @@
               </el-form-item>
             </el-col>
             <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-              <el-form-item label="特提部门" prop="orgName">
-                {{ state.ruleForm.orgName }}
+              <el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
+                <el-select
+                    v-model="state.ruleForm.nextHandlers"
+                    placeholder="请选择办理对象"
+                    value-key="key"
+                    clearable
+                    collapse-tags
+                    collapse-tags-tooltip
+                    multiple
+                    filterable
+                    class="w100"
+                >
+                  <el-option v-for="item in stepsItems" :value="item" :key="item.key" :label="item.value"> </el-option>
+                </el-select>
               </el-form-item>
             </el-col>
           </template>
@@ -125,7 +134,8 @@ const state = reactive<any>({
 	dialogVisible: false, // 是否显示弹窗
 	loading: false, // 是否显示加载
 	ruleForm: {
-		traceId: null, // 特提节点
+    nextStepCode: null, // 特提节点
+    nextHandlers: [], // 处理对象
     timeLimitUnit: 2, // 期满时间单位
     orgId: null, // 部门id
     orgName: null, // 部门名称
@@ -133,22 +143,26 @@ const state = reactive<any>({
     opinion: '', // 审批意见
 	},
 	detail: {}, // 详情信息
+  workflowId: null, // 工作流id
 });
 const ruleFormRef = ref<RefType>();
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
-const traces = ref<EmptyArrayType>([]); // 特提节点
+const steps = ref<EmptyArrayType>([]); // 特提节点
+const stepsItems = ref<EmptyArrayType>([]); // 处理对象
 const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
 // 打开弹窗
 const openDialog = async (val: any) => {
+  console.log(val,'21')
 	state.loading = true;
   state.dialogVisible = true;
+  state.workflowId = val.workflowId;
 	try {
 		const [baseRes, detailRes] = await Promise.all([
-			specialApplyBase(val.order?.workflowId),
+			specialApplyBase(val.workflowId),
 			specialDetail(val.id)
 		]);
-		traces.value = baseRes.result.traces ?? [];
+    steps.value = baseRes.result?.step?.steps ?? [];
 		specialTimeType.value = baseRes.result.specialTimeType ?? [];
 		state.detail = detailRes.result;
 	} catch (e) {
@@ -166,18 +180,19 @@ const close = () => {
 	ruleFormRef.value?.resetFields();
 };
 
-// 选择节点确定部门
+// 选择节点确定处理对象
 const selectTrace = (val: any) => {
-  const trace = traces.value.find((item) => item.id === val);
-  state.ruleForm.orgId = trace?.acceptorOrgId;
-  state.ruleForm.orgName = trace?.acceptorOrgName;
+  const step = steps.value.find((item) => item.key === val);
+  ruleFormRef.value?.resetFields('nextHandlers');
+  stepsItems.value = step?.items ?? [];
+  state.ruleForm.flowDirection = step?.flowDirection;
   queryHandleTime();
 };
 // 查询办理时限
 const queryHandleTime = () => {
   if (state.ruleForm.alterTime) return;
   state.loading = true;
-  specialTime({ OrderId: state.detail.orderId, TraceId: state.ruleForm.traceId })
+  specialTime({ OrderId: state.orderDetail.id, FlowDirection: state.ruleForm.flowDirection })
       .then((res) => {
         state.ruleForm.timeLimit = res.result ?? 0;
       })
@@ -202,6 +217,7 @@ const onPass = (formEl: FormInstance | undefined) => {
       cause: state.detail.cause,
       opinion: state.detail.opinion,
       files: annexListRef.value?.fileList,
+      workflowId: state.workflowId,
       state:1, // 审核结果 0 待审核 1 审核通过 2 审核不通过
 		};
 		specialApprove(request)
@@ -232,6 +248,7 @@ const onReject = (formEl: FormInstance | undefined) => {
       cause: state.detail.cause,
       opinion: state.detail.opinion,
       files: annexListRef.value?.fileList,
+      workflowId: state.workflowId,
       state:2,
     };
     specialApprove(request)

+ 1 - 1
src/views/business/supervise/components/Order-supervise.vue

@@ -125,7 +125,7 @@ const getOrgList = async (workflowId: string) => {
 // 打开弹窗
 const openDialog = (val: any) => {
 	if (!val.workflow) {
-		ElMessage.warning('该工单未配置流程');
+		ElMessage.warning('该工单未开启流程');
 		return;
 	}
 	state.orderDetail = val;

+ 15 - 8
src/views/query/urge/components/Order-urge.vue

@@ -107,14 +107,21 @@ const ruleFormRef = ref<RefType>();
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 // 打开弹窗
-const getOrgList = async (workflowId: string) => {
-	const res = await urgeOrgList(workflowId);
-	state.orgData = res.result ?? [];
-};
-const openDialog = (val: any) => {
-	getOrgList(val.workflow.id);
-	state.orderDetail = val;
-	state.dialogVisible = true;
+const openDialog = async (val: any) => {
+  if (!val.workflow) {
+    ElMessage.warning('该工单未开启流程');
+    return;
+  }
+  state.loading = true;
+  try {
+    const res = await urgeOrgList(val.workflow.id);
+    state.orgData = res.result ?? [];
+    state.loading = false;
+    state.dialogVisible = true;
+	} catch (error) {
+    state.loading = false;
+  }
+
 };
 // 关闭弹窗
 const closeDialog = () => {

+ 34 - 14
src/views/todo/order/accept/index.vue

@@ -440,8 +440,9 @@
 								</el-col>
 								<el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
 									<el-form-item>
-										<el-button class="default-button" @click="save(ruleFormRef)" v-auth="'business:order:add'"> 保存 </el-button>
-										<el-button type="primary" v-waves @click="submit(ruleFormRef)" v-auth="'business:order:startWorkflow'"> 提交 </el-button>
+                    <el-button class="default-button" @click="onCancel"> 取消 </el-button>
+										<el-button class="default-button" @click="save(ruleFormRef)"> 保存 </el-button>
+										<el-button type="primary" @click="submit(ruleFormRef)"> 提交 </el-button>
 									</el-form-item>
 								</el-col>
 							</el-row>
@@ -854,17 +855,33 @@ const selectIdentity = (val: number) => {
 // 流程审批
 const processAuditRef = ref<RefType>();
 const processOrder = (orderDetail: any) => {
-	const params = {
-		id: state.orderId,
-		processType: '工单发起',
-		extra: {
-			dialogTitle: '提交流程',
-			inputPlaceholder: '办理意见',
-			annexName: '办理附件',
-		},
-		orderDetail,
-	};
-	processAuditRef.value.openDialog(params);
+  if(orderDetail.workflowId){// 如果已经有流程id 说明已经发起过流程  直接调用工单办理
+    const params = {
+      id: orderDetail.workflowId,
+      processType: '工单办理',
+      orderDetail,
+      extra: {
+        dialogTitle: '工单办理',
+        inputPlaceholder: '办理意见',
+        annexName:'办理附件',
+      },
+    };
+    processAuditRef.value.openDialog(params);
+  }else{
+    // 如果没有流程id 说明没有发起过流程  调用工单发起
+    const params = {
+      id: state.orderId,
+      processType: '工单发起',
+      extra: {
+        dialogTitle: '提交流程',
+        inputPlaceholder: '办理意见',
+        annexName: '办理附件',
+      },
+      orderDetail,
+    };
+    processAuditRef.value.openDialog(params);
+  }
+  console.log(orderDetail)
 };
 const handleForm = (orderDetail: any) => {
 	if (orderDetail.orderExtension?.orderTypeCode) {
@@ -902,7 +919,10 @@ const orderProcessSuccess = () => {
 	mittBus.emit('clearCache', 'order');
   router.go(-1);
 };
-
+// 取消
+const onCancel = () => {
+  orderProcessSuccess();
+};
 // 加载基础数据
 const loadBaseData = async () => {
 	state.formLoading = true;