zhangchong 4 сар өмнө
parent
commit
aae0cf0284

+ 49 - 6
src/api/snapshot/reAudit.ts

@@ -7,21 +7,64 @@ import request from '@/utils/request';
  * @description 获取市民红包审批列表基础信息
  * @param {object} params
  */
-export const getCitizenRedEnvelopeApprovalBaseData = (params?: object) =>{
+export const getCitizenRedEnvelopeApprovalBaseData = (params?: object) => {
 	return request({
 		url: `/api/v1/RedPack/audit/basedata`,
 		method: 'get',
-		params
+		params,
 	});
-}
+};
 /**
  * @description 获取市民红包审批列表
  * @param {object} params
  */
-export const getCitizenRedEnvelopeApprovalList = (params?: object) =>{
+export const getCitizenRedEnvelopeApprovalList = (params?: object) => {
 	return request({
 		url: `/api/v1/RedPack/audit`,
 		method: 'get',
-		params
+		params,
 	});
-}
+};
+/**
+ * @description 获取市民红包审批详情
+ * @param {object} id
+ */
+export const getCitizenRedEnvelopeApprovalDetail = (id?: string) => {
+	return request({
+		url: `/api/v1/RedPack/audit/${id}`,
+		method: 'get',
+	});
+};
+/**
+ * @description 获取市民红包审批短信模板
+ * @param {object} params
+ */
+export const getCitizenRedEnvelopeApprovalSmsTemplate = (params?: object) => {
+	return request({
+		url: `/api/v1/RedPack/audit/sms_template`,
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 获取市民红包审批基础信息
+ * @param {object} params
+ */
+export const getCitizenRedEnvelopeApprovalBaseInfo = (params?: object) => {
+	return request({
+		url: `/api/v1/RedPack/audit/baseinfo`,
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 红包审批或者拒绝
+ * @param {object} data
+ */
+export const citizenRedEnvelopeApproval = (data: object) => {
+	return request({
+		url: `/api/v1/RedPack/audit`,
+		method: 'put',
+		data,
+	});
+};

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

@@ -507,7 +507,7 @@
 			<copy-order ref="copyOrderRef" :orderId="state.orderId" />
 		</div>
 		<!--  地图信息  -->
-		<div v-show="state.activeName === '5'">
+		<div v-if="state.activeName === '5'">
 			<map-view ref="mapViewRef"/>
 		</div>
 		<template #footer>

+ 84 - 37
src/views/snapshot/reAudit/citizenTen/index.vue

@@ -22,24 +22,14 @@
 					</el-form>
 				</template>
 				<template #toolbar_buttons>
-					<el-button
-						type="primary"
-						@click="onRemark"
-						:disabled="isChecked"
-						v-auth="'snapshot:reAudit:citizenTen:remark'"
-						v-if="state.queryParams.Status === 1"
-					>
-						<SvgIcon name="ele-Plus" class="mr5" />添加备注<span v-if="checkTable.length">({{ checkTable.length }})</span>
-					</el-button>
-					<el-button
-						type="primary"
-						@click="onSupply"
-						v-auth="'snapshot:reAudit:citizenTen:supply'"
-						:disabled="isChecked"
-						:loading="state.loading"
-						v-if="state.queryParams.Status === 1"
-						><SvgIcon name="ele-Plus" class="mr5" />补充发放<span v-if="checkTable.length">({{ checkTable.length }})</span>
+					<!--
+						v-if="state.queryParams.Status === 1"-->
+					<!--					<el-button type="primary" @click="onRemark" :disabled="isChecked" v-auth="'snapshot:reAudit:citizenTen:remark'">
+						<SvgIcon name="ele-Plus" class="mr5" />添加备注
 					</el-button>
+					<el-button type="primary" @click="onSupply" v-auth="'snapshot:reAudit:citizenTen:supply'" :disabled="isChecked" :loading="state.loading"
+						><SvgIcon name="ele-Plus" class="mr5" />补充发放
+					</el-button>-->
 				</template>
 				<template #statusTxt="{ row }">
 					<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusTxt }}</el-text>
@@ -49,8 +39,14 @@
 					<order-detail :order="{ id: row.orderId }" @updateList="queryList">{{ row.title }}</order-detail>
 				</template>
 				<template #action="{ row }">
-					<el-button link type="primary" @click="onAudit(row)" v-auth="'snapshot:reAudit:citizenTen:audit'"> 审批 </el-button>
-					<el-button link type="danger" @click="onReturn(row)" v-auth="'snapshot:reAudit:citizenTen:return'"> 退回 </el-button>
+					<template v-if="state.queryParams.Status === 0">
+						<el-button link type="primary" @click="onAudit(row)" v-auth="'snapshot:reAudit:citizenTen:audit'"> 审批 </el-button>
+						<el-button link type="danger" @click="onReturn(row)" v-auth="'snapshot:reAudit:citizenTen:return'"> 退回 </el-button>
+					</template>
+					<template v-if="state.queryParams.Status === 1">
+						<el-button link type="primary" @click="onRemark(row)" v-auth="'snapshot:reAudit:citizenTen:remark'"> 添加备注 </el-button>
+						<el-button link type="primary" @click="onSupply(row)" v-auth="'snapshot:reAudit:citizenTen:supply'"> 补充发放 </el-button>
+					</template>
 				</template>
 				<template #pager>
 					<pagination
@@ -117,8 +113,8 @@
 						<el-option label="否" :value="false" />
 					</el-select>
 				</el-form-item>
-				<el-form-item label="部门是否属实" prop="IsTruth">
-					<el-select v-model="state.queryParams.IsTruth" class="w100" placeholder="请选择部门是否属实" @change="handleQuery" clearable>
+				<el-form-item label="部门是否属实" prop="IsTruthDepartment">
+					<el-select v-model="state.queryParams.IsTruthDepartment" class="w100" placeholder="请选择部门是否属实" @change="handleQuery" clearable>
 						<el-option label="是" :value="true" />
 						<el-option label="否" :value="false" />
 					</el-select>
@@ -163,13 +159,20 @@
 				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 			</template>
 		</el-drawer>
+		<!--	红包审批	-->
+		<re-audit ref="reAuditRef" @updateList="queryList" />
+		<!--	红包退回	-->
+		<re-return ref="reReturnRef" @updateList="queryList" />
+		<!--	红包补充	-->
+		<re-supply ref="reSupplyRef" @updateList="queryList" />
+		<!--	红包备注	-->
+		<re-remark ref="reRemarkRef" @updateList="queryList" />
 	</div>
 </template>
 
 <script lang="tsx" setup name="snapshotReAuditCitizenTen">
 import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import { FormInstance } from 'element-plus';
-import { getClueList } from '@/api/snapshot/config';
+import { ElMessage, FormInstance } from 'element-plus';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import { getCitizenRedEnvelopeApprovalBaseData, getCitizenRedEnvelopeApprovalList } from '@/api/snapshot/reAudit';
 import Other from '@/utils/other';
@@ -177,6 +180,10 @@ import Other from '@/utils/other';
 // 引入组件
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const ReAudit = defineAsyncComponent(() => import('@/views/snapshot/reAudit/components/Re-audit.vue')); // 红包审批
+const ReReturn = defineAsyncComponent(() => import('@/views/snapshot/reAudit/components/Re-return.vue')); // 红包退回
+const ReRemark = defineAsyncComponent(() => import('@/views/snapshot/reAudit/components/Re-remark.vue')); // 红包备注
+const ReSupply = defineAsyncComponent(() => import('@/views/snapshot/reAudit/components/Re-supply.vue')); // 红包补充
 
 // 定义变量内容
 const state = reactive<any>({
@@ -195,9 +202,12 @@ const state = reactive<any>({
 		BeginAuditTime: null,
 		EndAuditTime: null,
 		bjTime: [], // 办结时间
+		BeginFiledTime: null,
+		EndFiledTime: null,
 		FromPhone: null, // 来电人电话
 		IsDeal: null, // 网格员是否办理
 		IsTruth: null, // 网格员是否属实
+		IsTruthDepartment: null, // 部门是否属实
 		IsIssued: null, // 是否发放红包
 		IndustryId: null, // 行业
 		CaseName: null, // 线索名称
@@ -205,7 +215,6 @@ const state = reactive<any>({
 		AcutalAmount: null, // 实发金额
 		ApprovedAmount: null, // 审批金额
 		IsDanger: null, // 是否安全生成
-		zjTime: [],
 		ConfigAmount: 10, // 配置金额 默认写死
 	},
 	total: 0, // 总条数
@@ -353,9 +362,14 @@ const gridOptions = reactive<any>({
 			},
 		},
 		{
-			field: 'guiderReadPackAmountTxt',
+			field: 'isTruthDepartment',
 			title: '部门是否属实',
 			width: 120,
+			slots: {
+				default: ({ row }) => {
+					return row.isTruthDepartment === null ? '' : row.isRepetition ? '是' : '否';
+				},
+			},
 		},
 		{
 			field: 'isRepetition',
@@ -368,7 +382,7 @@ const gridOptions = reactive<any>({
 			},
 		},
 		{
-			field: 'guiderReadPackAmountTxt',
+			field: 'isDeal',
 			title: '网格员是否办理',
 			width: 120,
 			slots: {
@@ -378,7 +392,7 @@ const gridOptions = reactive<any>({
 			},
 		},
 		{
-			field: 'guiderReadPackAmountTxt',
+			field: 'networkENumber',
 			title: '网格E通编号',
 			width: 120,
 		},
@@ -394,7 +408,7 @@ const gridOptions = reactive<any>({
 			width: 140,
 		},
 		{
-			field: 'guiderReadPackAmountTxt',
+			field: 'auditStatusTxt',
 			title: '审批状态',
 			width: 100,
 		},
@@ -414,7 +428,7 @@ const gridOptions = reactive<any>({
 			width: 150,
 		},
 		{
-			field: 'guiderReadPackAmountTxt',
+			field: 'bankCardNo',
 			title: '卡号',
 			width: 150,
 		},
@@ -423,7 +437,14 @@ const gridOptions = reactive<any>({
 			title: '开户行',
 			width: 150,
 		},
-		{ title: '操作', width: 140, fixed: 'right', showOverflow: false, align: 'center', slots: { default: 'action' } },
+		{
+			title: '操作',
+			width: 160,
+			fixed: 'right',
+			showOverflow: false,
+			align: 'center',
+			slots: { default: 'action' },
+		},
 	],
 	data: [],
 });
@@ -438,9 +459,15 @@ const queryList = () => {
 	state.loading = true;
 	gridOptions.loading = true;
 	requestParams.value = Other.deepClone(state.queryParams);
-	/*	requestParams.value.BeginCreationTime = state.queryParams.fbTime === null ? null : state.queryParams.fbTime[0]; // 受理时间
-	requestParams.value.EndCreationTime = state.queryParams.fbTime === null ? null : state.queryParams.fbTime[1];
-	Reflect.deleteProperty(requestParams.value, 'fbTime'); // 删除无用的参数*/
+	requestParams.value.BeginCreationTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[0]; // 受理时间
+	requestParams.value.EndCreationTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
+	Reflect.deleteProperty(requestParams.value, 'slTime'); // 删除无用的参数
+	requestParams.value.BeginAuditTime = state.queryParams.spTime === null ? null : state.queryParams.spTime[0]; // 审批时间
+	requestParams.value.EndAuditTime = state.queryParams.spTime === null ? null : state.queryParams.spTime[1];
+	Reflect.deleteProperty(requestParams.value, 'spTime'); // 删除无用的参数
+	requestParams.value.BeginFiledTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[0]; // 办结时间
+	requestParams.value.EndFiledTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[1];
+	Reflect.deleteProperty(requestParams.value, 'bjTime'); // 删除无用的参数
 	getCitizenRedEnvelopeApprovalList(requestParams.value)
 		.then((res) => {
 			state.loading = false;
@@ -486,13 +513,33 @@ const isChecked = computed(() => {
 });
 
 // 审批
-const onAudit = (row: any) => {};
+const reAuditRef = ref<RefType>();
+const onAudit = (row: any) => {
+	reAuditRef.value.openDialog(row);
+};
 // 退回
-const onReturn = (row: any) => {};
+const reReturnRef = ref<RefType>();
+const onReturn = (row: any) => {
+	reReturnRef.value.openDialog(row);
+};
 // 添加备注
-const onRemark = () => {};
+const reRemarkRef = ref<RefType>();
+const onRemark = (row: any) => {
+	if (checkTable.value.length > 1) {
+		ElMessage.warning('只能选择1个添加备注。');
+		return;
+	}
+	reRemarkRef.value.openDialog(row);
+};
 // 补充
-const onSupply = () => {};
+const reSupplyRef = ref<RefType>();
+const onSupply = (row: any) => {
+	if (checkTable.value.length > 1) {
+		ElMessage.warning('只能添加1个补充发放。');
+		return;
+	}
+	reSupplyRef.value.openDialog(row);
+};
 // 获取基础信息
 const statusOptions = ref<EmptyArrayType>([]); // 状态
 const industryOptions = ref<EmptyArrayType>([]); // 行业

+ 97 - 107
src/views/snapshot/reAudit/components/Re-audit.vue

@@ -1,99 +1,86 @@
 <template>
-	<el-dialog v-model="state.dialogVisible" width="70%" draggable title="红包审批" @close="close">
-		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" :disabled="loading" scroll-to-error>
+	<el-dialog v-model="state.dialogVisible" draggable title="红包审批" @close="close">
+		<el-form :model="state.infoForm" label-width="110px" :disabled="loading" class="show-info-form">
 			<el-row :gutter="10">
-				<p class="border-title">来电信息</p>
+				<el-col>
+					<p class="border-title">来电信息</p>
+				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="受理人"></el-form-item>
+					<el-form-item label="受理人">{{ state.infoForm.order?.acceptorName }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="受理时间"></el-form-item>
+					<el-form-item label="受理时间">{{ formatDate(state.infoForm.order?.creationTime, 'YYY-mm-dd HH:MM:SS') }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="工单编码"></el-form-item>
+					<el-form-item label="工单编码">{{ state.infoForm.order?.no }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="所在区域"></el-form-item>
+					<el-form-item label="所在区域">{{ state.infoForm.order?.county }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="来源方式"></el-form-item>
+					<el-form-item label="来源方式">{{ state.infoForm.order?.sourceChannel }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="受理类型"></el-form-item>
+					<el-form-item label="受理类型">{{ state.infoForm.order?.acceptType }}</el-form-item>
+				</el-col>
+				<el-col>
+					<el-form-item label="热点分类">{{ state.infoForm.order?.hotspotSpliceName }}</el-form-item>
 				</el-col>
 				<el-col>
-					<el-form-item label="热点分类"></el-form-item>
+					<p class="border-title mt10">联系人</p>
 				</el-col>
-				<p class="border-title">联系人</p>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="来电人"></el-form-item>
+					<el-form-item label="来电人"
+						>{{ state.infoForm.order?.fromName }} <el-text tag="b" v-if="state.infoForm.order?.isSecret" class="ml5">保密</el-text></el-form-item
+					>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="性别"></el-form-item>
+					<el-form-item label="性别">{{ state.infoForm.order?.fromGenderTxt }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="联系电话"></el-form-item>
+					<el-form-item label="联系电话">{{ state.infoForm.order?.fromPhone }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="地址"></el-form-item>
+					<el-form-item label="地址">{{ state.infoForm.order?.fullAddress }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="身份证"></el-form-item>
+					<el-form-item label="身份证">{{ state.infoForm.order?.licenceNo }}</el-form-item>
 				</el-col>
 				<el-col :lg="12" :md="12" :sm="12" :xl="12" :xs="24">
-					<el-form-item label="工作单位"></el-form-item>
-				</el-col>
-				<p class="border-title">审批信息</p>
-				<el-col>
-					<el-form-item label="审批状态"  prop="IsIssued" :rules="[{ required: true, message: '请选择审批状态', trigger: 'change' }]">
-						<el-select v-model="state.queryParams.IsIssued" clearable>
-							<el-option label="同意" :value="true" />
-							<el-option label="不同意" :value="false" />
-						</el-select>
-						<el-checkbox v-model="state.ruleForm.isPopup" disabled>审批结果通知短信</el-checkbox>
-					</el-form-item>
-				</el-col>
-				<el-col>
-					<el-form-item label="短信模板"  prop="bulletinObj" :rules="[{ required: true, message: '请选择短信模板', trigger: 'change' }]">
-						<el-select
-							v-model="state.ruleForm.bulletinObj"
-							placeholder="请选择类型"
-							value-key="dicDataValue"
-							class="w100"
-							@change="
-								(e) => {
-									state.ruleForm.bulletinTypeId = e.dicDataValue;
-									state.ruleForm.bulletinTypeName = e.dicDataName;
-								}
-							"
-						>
-							<el-option v-for="item in bulletinTypeOptions" :value="item" :key="item.dicDataValue" :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="txtRemarks" :rules="[{ required: false, message: '请填写审批意见', trigger: 'blur' }]">
-						<el-input
-							type="textarea"
-							:autosize="{ minRows: 6, maxRows: 10 }"
-							v-model="state.ruleForm.txtRemarks"
-							placeholder="请填写审批意见"
-							clearable
-						></el-input>
-					</el-form-item>
-				</el-col>
-				<el-col>
-					<el-form-item label="红包发放">
-
-					</el-form-item>
-				</el-col>
-				<el-col>
-					<el-form-item label="红包说明">
-
-					</el-form-item>
+					<el-form-item label="工作单位">{{ state.infoForm.order?.workUnit }}</el-form-item>
 				</el-col>
 			</el-row>
 		</el-form>
+		<p class="border-title mt10 mb10">审批信息</p>
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" :disabled="loading">
+			<el-form-item label="审批状态" prop="status" :rules="[{ required: true, message: '请选择审批状态', trigger: 'change' }]">
+				<el-select v-model="state.ruleForm.status" clearable style="max-width: 240px" placeholder="请选择审批状态" @change="selectStatus">
+					<el-option v-for="item in auditComBox" :label="item.value" :key="item.key" :value="item.key" />
+				</el-select>
+				<el-checkbox v-model="state.ruleForm.isSendSms" disabled class="ml5">审批结果通知短信</el-checkbox>
+			</el-form-item>
+			<el-form-item label="短信模板" prop="smsTemplateId" :rules="[{ required: true, message: '请选择短信模板', trigger: 'change' }]">
+				<el-select v-model="state.ruleForm.smsTemplateId" placeholder="请选择短信模板" clearable>
+					<el-option v-for="item in smsTemplateList" :value="item.id" :key="item.id" :label="item.content" />
+				</el-select>
+			</el-form-item>
+			<el-form-item label="审批意见" prop="opinion" :rules="[{ required: false, message: '请填写审批意见', trigger: 'blur' }]">
+				<el-input
+					type="textarea"
+					:autosize="{ minRows: 6, maxRows: 10 }"
+					v-model="state.ruleForm.opinion"
+					placeholder="请填写审批意见"
+					clearable
+				></el-input>
+			</el-form-item>
+			<el-form-item label="红包发放"
+				>1.市民红包金额:<el-text tag="b" type="danger">{{ state.infoForm.redPackTxt }}</el-text></el-form-item
+			>
+			<el-form-item label="红包说明"
+				>1.市民红包金额:<el-text tag="b" type="danger">{{ state.infoForm.amount }}</el-text
+				>元;</el-form-item
+			>
+		</el-form>
 		<template #footer>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
@@ -104,68 +91,70 @@
 </template>
 
 <script setup lang="tsx" name="noticeDetail">
-import { reactive, ref, defineAsyncComponent, computed, unref, FunctionalComponent } from 'vue';
+import { reactive, ref } from 'vue';
 import { throttle } from '@/utils/tools';
 import { ElMessage, FormInstance } from 'element-plus';
-import { disabledDate } from '@/utils/constants';
 import { ElCheckbox } from 'element-plus';
-import { addSnapshotBulletin, editSnapshotBulletinBase } from '@/api/snapshot/info';
-// 引入组件
-const Editor = defineAsyncComponent(() => import('@/components/Editor/index.vue')); // 富文本编辑器
+import { citizenRedEnvelopeApproval, getCitizenRedEnvelopeApprovalDetail, getCitizenRedEnvelopeApprovalSmsTemplate } from '@/api/snapshot/reAudit';
+import { formatDate } from '@/utils/formatTime';
+
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 // 定义变量内容
 const state = reactive<any>({
 	dialogVisible: false,
+	infoForm: {},
 	ruleForm: {
-		bulletinTypeId: null, // 公告类型
-		bulletinTypeName: null, // 公告类型名称
-		title: null, // 标题
-		no: null, // 文档编码
-		bulletinTime: null, // 时间
-		departmentId: null, // 所属部门ID
-		sourceOrgName: null, // 所属部门名称
-		departmentName: null, // 来源单位名称
-		isOpen: false, // 公开
-		isBold: false, // 加粗
-		isOpenWebsite: false, // 网站公开
-		isWeibo: false, // 微博公开
-		isWeChat: false, // 微信公开
-		isTop: false, // 置顶
-		isPopup: false, // 弹窗
-		content: null, // 内容
-		videoPath: null, // 视频地址
-		sourceMode: '1', // 来源方式 默认自建
+		redPackAuditId: null, // 审批ID
+		status: null, // 审批状态
+		opinion: null, // 审批意见
+		smsTemplateId: null, // 短信模板
+		isSendSms: true, // 是否发送短信
 	},
+	orderId: null,
 });
 let loading = ref<boolean>(false); // 加载状态
 // 打开弹窗
-const ruleFormRef = ref<RefType>();
-
-const bulletinTypeOptions = ref<EmptyArrayType>([]); // 公告类型
-const orgsOptions = ref<EmptyArrayType>([]); // 来源单位
-const bulletinSource = ref<EmptyArrayType>([]); // 来源
-const openDialog = async (type: string) => {
+const auditComBox = ref<EmptyArrayType>([]); // 审批状态
+const openDialog = async (row: any) => {
 	loading.value = true;
 	state.dialogVisible = true;
+	state.orderId = row.orderId;
 	try {
-		const responseAnnounce = await editSnapshotBulletinBase();
-		bulletinTypeOptions.value = responseAnnounce.result?.bulletinType ?? [];
-		orgsOptions.value = responseAnnounce.result?.orgsOptions ?? [];
-		bulletinSource.value = responseAnnounce.result?.bulletinSource ?? [];
+		const { result } = await getCitizenRedEnvelopeApprovalDetail(row.orderId);
+		auditComBox.value = result.auditComBox ?? [];
+		state.infoForm = result;
+		state.ruleForm.redPackAuditId = row.id;
 		loading.value = false;
 	} catch (error) {
 		console.log(error);
-		loading.value = true;
+		loading.value = false;
 	}
 };
-const orgRef = ref<RefType>(); // 所属部门
-const changeOrg = () => {
-	const currentNode = orgRef.value.getCheckedNodes();
-	if (currentNode) state.ruleForm.departmentName = currentNode[0].label;
-	else state.ruleForm.departmentName = null;
+const ruleFormRef = ref<RefType>();
+const smsTemplateList = ref<EmptyArrayType>([]); // 短信模板
+// 选择审批状态
+const selectStatus = (val: any) => {
+	ruleFormRef.value?.resetFields('smsTemplateId');
+	if (val || val === 0) {
+		loading.value = true;
+		getCitizenRedEnvelopeApprovalSmsTemplate({ OrderId: state.orderId, Status: val })
+			.then((res) => {
+				smsTemplateList.value = res.result ?? [];
+				if (smsTemplateList.value.length) {// 默认选中第一条
+					state.ruleForm.smsTemplateId = smsTemplateList.value[0].id;
+				}
+				loading.value = false;
+			})
+			.catch((e) => {
+				console.log(e);
+				smsTemplateList.value = [];
+				loading.value = false;
+			});
+	} else {
+		smsTemplateList.value = [];
+	}
 };
-
 // 保存
 const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
@@ -175,7 +164,7 @@ const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
 		const request = {
 			...state.ruleForm,
 		};
-		addSnapshotBulletin(request)
+		citizenRedEnvelopeApproval(request)
 			.then(() => {
 				loading.value = false;
 				closeDialog();
@@ -194,6 +183,7 @@ const closeDialog = () => {
 const close = () => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
+	state.orderId = null;
 };
 // 暴露变量
 defineExpose({

+ 101 - 0
src/views/snapshot/reAudit/components/Re-remark.vue

@@ -0,0 +1,101 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="30%" draggable title="添加备注" @close="close">
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" :disabled="loading">
+			<el-form-item label="实发金额" prop="citizenReadPackAmount" :rules="[{ required: true, message: '请填写实发金额', trigger: 'blur' }]">
+				<el-input-number v-model="state.ruleForm.citizenReadPackAmount" :min="0" :precision="2" class="w100" placeholder="请填写实发金额" />
+			</el-form-item>
+			<el-form-item label="发放结果" prop="isPass">
+				<el-radio-group v-model="state.ruleForm.isPass">
+					<el-radio value="0">红包发放失败</el-radio>
+					<el-radio value="1">红包发放成功</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="发放失败原因" prop="isPass">
+				<el-radio-group v-model="state.ruleForm.isPass">
+					<el-radio value="0">无法联系</el-radio>
+					<el-radio value="1">婉拒红包</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="备注" prop="remark" :rules="[{ required: true, message: '请填写备注', trigger: 'blur' }]">
+				<el-input
+					type="textarea"
+					:autosize="{ minRows: 6, maxRows: 10 }"
+					v-model="state.ruleForm.remark"
+					placeholder="请填写备注"
+					maxlength="200"
+					show-word-limit
+				></el-input>
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="tsx" name="noticeDetail">
+import { reactive, ref, defineAsyncComponent, computed, unref, FunctionalComponent } from 'vue';
+import { throttle } from '@/utils/tools';
+import { ElMessage, FormInstance } from 'element-plus';
+import { disabledDate } from '@/utils/constants';
+import { ElCheckbox } from 'element-plus';
+import { addSnapshotBulletin, editSnapshotBulletinBase } from '@/api/snapshot/info';
+// 引入组件
+const Editor = defineAsyncComponent(() => import('@/components/Editor/index.vue')); // 富文本编辑器
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		citizenReadPackAmount: 0, // 实发金额
+		isPass: '0',
+		remark: null,
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async (row:any) => {
+	console.log(row,'测试1231')
+	state.dialogVisible = true;
+};
+
+// 保存
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		const request = {
+			...state.ruleForm,
+		};
+		addSnapshotBulletin(request)
+			.then(() => {
+				loading.value = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('操作成功');
+			})
+			.catch(() => {
+				loading.value = false;
+			});
+	});
+}, 300);
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 227 - 0
src/views/snapshot/reAudit/components/Re-return.vue

@@ -0,0 +1,227 @@
+<template>
+	<!-- 工单详情发起特提 -->
+	<el-dialog
+		v-model="state.dialogVisible"
+		draggable
+		title="特提申请"
+		width="50%"
+		append-to-body
+		destroy-on-close
+		@close="close"
+		@mouseup="mouseup"
+		:style="'transform: ' + state.transform + ';'"
+		ref="dialogRef"
+	>
+		<div class="collapse-container">
+			<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="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="cause">
+							{{ state.orderDetail.specialNum }}次
+						</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' }]">
+							<common-advice
+								@chooseAdvice="chooseAdvice"
+								v-model="state.ruleForm.reason"
+								placeholder="请填写特提理由"
+								:loading="state.loading"
+								:commonEnum="commonEnum.Teti"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" prop="files" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
+							<annex-list name="特提附件" v-model:format="filesFormat" :businessId="state.orderDetail.id" 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>
+<script setup lang="ts">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { specialApplyBase, specialApply } from '@/api/business/special';
+import { orderTimeConfig } from '@/api/business/order';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '@/stores/userInfo';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { commonEnum } from '@/utils/constants';
+
+// 引入组件
+const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue'));
+const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+		nextStepCode: null, // 特提节点
+		timeLimitUnit: 2, // 期满时间单位
+		alterTime: true, // 是否修改期满时间
+		nextHandlers: [], // 办理对象
+		stepType: null,
+		reason: '',
+	},
+	orderDetail: {}, // 工单详情
+	workflowId: null, // 工作流id
+	transform: 'translate(0px, 0px)', // 滚动条位置
+});
+const ruleFormRef = ref<RefType>();
+const specialReason = ref<EmptyArrayType>([]); // 特提理由
+const steps = ref<EmptyArrayType>([]); // 特提节点
+const stepsItems = ref<EmptyArrayType>([]); // 特提部门
+const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
+const baseTypeId = ref<string>(''); // 默认选中的特提节点ID
+/**
+ * @description 打开弹窗
+ * @param {object} val 工单详情
+ */
+const isTerminate = ref(false); //  终止需要提示
+const openDialog = async (val: any) => {
+	state.orderDetail = val;
+	state.workflowId = val.workflowId;
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		const { result } = await specialApplyBase(val.workflowId);
+		baseTypeId.value = result?.baseTypeId ?? '';
+		steps.value = result?.step?.steps ?? [];
+		specialReason.value = result.specialReason ?? [];
+		specialTimeType.value = result.specialTimeType ?? [];
+		if (result?.baseTypeId) selectTrace(result?.baseTypeId, true);
+		isTerminate.value = result?.isTerminate; // 终止需要提示
+	} catch (e) {
+		console.log(e);
+	} finally {
+		state.loading = false;
+	}
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+	steps.value = [];
+	stepsItems.value = [];
+};
+// 选中常用意见
+const chooseAdvice = (item: any) => {
+	state.ruleForm.reason += item.content;
+};
+// 设置抽屉
+const dialogRef = ref<RefType>();
+const mouseup = () => {
+	state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
+};
+// 选择节点确定处理对象
+const stores = useUserInfo();
+const { userInfos } = storeToRefs(stores);
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const selectTrace = (val: any, choose?: boolean) => {
+	const next = steps.value.find((item) => item.key === val);
+	if (choose) state.ruleForm.nextStepCode = val;
+	state.ruleForm.nextStepName = next?.value;
+	state.ruleForm.businessType = next.businessType;
+	state.ruleForm.flowDirection = next.flowDirection;
+	state.ruleForm.handlerType = next.handlerType;
+	ruleFormRef.value?.resetFields('nextHandlers');
+	stepsItems.value = next?.items ?? [];
+	state.ruleForm.stepType = next.stepType;
+	stepsItems.value = stepsItems.value.map((item: any) => {
+		return {
+			value: {
+				...item,
+			},
+			label: item.value,
+		};
+	});
+	if (baseTypeId.value === val) {
+		//如果默认选中节点  判断选择的对象是否有当前用户 如果有 默认选中当前用户
+		const user = stepsItems.value.find((item: any) => item.value.key === userInfos.value?.id);
+		if (user) {
+			state.ruleForm.nextHandlers = [user.value];
+		}
+	}
+	state.ruleForm.flowDirection = next?.flowDirection;
+	const isBanzhang = userInfos.value?.monitor; // 判断当前用户是否是班长
+	const withHandler = stepsItems.value.find((item) => item.value.key === next.handler?.key); // 判断当前节点是否有之前选择的用户
+	if (isBanzhang && withHandler) {
+		state.ruleForm.nextHandlers = [next.handler];
+	}
+	queryHandleTime();
+	// 若终止申请已同意的工单再次被特提后是无法重新派单给承办部门,若选择了派给承办部门则提示:“该工单已终止办理。”若派给非承办部门则是允许的
+	if(isTerminate.value && [2,3].includes(next.businessType)){
+		ElMessage.warning('该工单已终止办理!');
+		ruleFormRef.value?.resetFields('nextStepCode');
+	}
+};
+// 查询办理时限
+const queryHandleTime = () => {
+	if (state.ruleForm.alterTime) return;
+	state.loading = true;
+	orderTimeConfig({ acceptTypeCode: state.orderDetail.acceptTypeCode, FlowDirection: state.ruleForm.flowDirection })
+		.then((res) => {
+			state.ruleForm.timeLimit = res.result.count ?? 0; // 办理时限
+			state.ruleForm.timeLimitUnit = res.result.timeType ?? ''; // 办理时限单位
+			state.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+		});
+};
+// 提交
+const filesFormat = ref<EmptyArrayType>([]); // 附件列表
+const onSubmit = (formEl: FormInstance | undefined) => {
+	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: filesFormat.value,
+			stepCode: state.orderDetail.actualHandleStepCode,
+			stepName: state.orderDetail.actualHandleStepName,
+		};
+		specialApply(request)
+			.then(() => {
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('特提申请成功');
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 172 - 0
src/views/snapshot/reAudit/components/Re-supply.vue

@@ -0,0 +1,172 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" draggable title="添加补充发放" @close="close">
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" :disabled="loading" scroll-to-error>
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="姓名" prop="name" :rules="[{ required: false, message: '请填写姓名', trigger: 'blur' }]">
+						<el-input v-model="state.ruleForm.name" placeholder="请填写姓名" clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="卡号" prop="name" :rules="[{ required: false, message: '请填写卡号', trigger: 'blur' }]">
+						<el-input v-model="state.ruleForm.name" placeholder="请填写卡号" clearable type="number"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="开户行" prop="name" :rules="[{ required: false, message: '请填写开户行', trigger: 'blur' }]">
+						<el-input v-model="state.ruleForm.name" placeholder="请填写开户行" clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="补充金额" prop="citizenReadPackAmount" :rules="[{ required: false, message: '请填写补充金额', trigger: 'blur' }]">
+						<el-input-number v-model="state.ruleForm.citizenReadPackAmount" :min="0" :precision="2" class="w100" placeholder="请填写补充金额" />
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item
+						label="补充发放时间"
+						prop="productExpiredTime"
+						:rules="[{ required: false, message: '请选择补充发放时间', trigger: 'change' }]"
+					>
+						<el-date-picker
+							v-model="state.ruleForm.productExpiredTime"
+							type="date"
+							placeholder="请选择补充发放时间"
+							class="w100"
+							value-format="YYYY-MM-DD[T]HH:mm:ss"
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item
+						label="补充奖励类型"
+						prop="productExpiredTime"
+						:rules="[{ required: false, message: '请选择补充奖励类型', trigger: 'change' }]"
+					>
+						<el-select v-model="state.ruleForm.status" class="w100" placeholder="请选择补充奖励类型">
+							<el-option v-for="item in state.auditComBox" :label="item.value" :key="item.key" :value="item.key" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="">
+						<el-checkbox v-model="state.ruleForm.isSendSms">发送短信</el-checkbox>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="备注" prop="txtRemarks" :rules="[{ required: true, message: '请填写备注', trigger: 'blur' }]">
+						<el-input
+							type="textarea"
+							:autosize="{ minRows: 6, maxRows: 10 }"
+							v-model="state.ruleForm.txtRemarks"
+							placeholder="请填写备注"
+							maxlength="200"
+							show-word-limit
+						></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="tsx" name="noticeDetail">
+import { reactive, ref, defineAsyncComponent, computed, unref, FunctionalComponent } from 'vue';
+import { throttle } from '@/utils/tools';
+import { ElMessage, FormInstance } from 'element-plus';
+import { disabledDate } from '@/utils/constants';
+import { ElCheckbox } from 'element-plus';
+import { addSnapshotBulletin, editSnapshotBulletinBase } from '@/api/snapshot/info';
+// 引入组件
+const Editor = defineAsyncComponent(() => import('@/components/Editor/index.vue')); // 富文本编辑器
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		bulletinTypeId: null, // 公告类型
+		bulletinTypeName: null, // 公告类型名称
+		title: null, // 标题
+		no: null, // 文档编码
+		bulletinTime: null, // 时间
+		departmentId: null, // 所属部门ID
+		sourceOrgName: null, // 所属部门名称
+		departmentName: null, // 来源单位名称
+		isOpen: false, // 公开
+		isBold: false, // 加粗
+		isOpenWebsite: false, // 网站公开
+		isWeibo: false, // 微博公开
+		isWeChat: false, // 微信公开
+		isTop: false, // 置顶
+		isPopup: false, // 弹窗
+		content: null, // 内容
+		videoPath: null, // 视频地址
+		sourceMode: '1', // 来源方式 默认自建
+		isSendSms: true,
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+
+const bulletinTypeOptions = ref<EmptyArrayType>([]); // 公告类型
+const orgsOptions = ref<EmptyArrayType>([]); // 来源单位
+const bulletinSource = ref<EmptyArrayType>([]); // 来源
+const openDialog = async (row: any) => {
+	console.log(row, '测试1231');
+	loading.value = true;
+	state.dialogVisible = true;
+	try {
+		const responseAnnounce = await editSnapshotBulletinBase();
+		bulletinTypeOptions.value = responseAnnounce.result?.bulletinType ?? [];
+		orgsOptions.value = responseAnnounce.result?.orgsOptions ?? [];
+		bulletinSource.value = responseAnnounce.result?.bulletinSource ?? [];
+		loading.value = false;
+	} catch (error) {
+		console.log(error);
+		loading.value = true;
+	}
+};
+
+// 保存
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		const request = {
+			...state.ruleForm,
+		};
+		addSnapshotBulletin(request)
+			.then(() => {
+				loading.value = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('操作成功');
+			})
+			.catch(() => {
+				loading.value = false;
+			});
+	});
+}, 300);
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>