|
@@ -34,36 +34,57 @@
|
|
|
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
|
|
|
<el-form-item label="申请时间"> {{ dayjs(state.orderDetail.creationTime).format('YYYY-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="申请类型" prop="type" :rules="[{ required: true, message: '请选择申请类型', trigger: 'change' }]">
|
|
|
- <el-select v-model="state.discernForm.type" placeholder="请选择申请类型" class="w100" value-key="dicDataValue">
|
|
|
- <el-option v-for="item in screenTypeOptions" :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="content" :rules="[{ required: true, message: '请填写甄别申请理由', trigger: 'blur' }]">
|
|
|
- <common-advice
|
|
|
- @chooseAdvice="chooseAdviceDiscern"
|
|
|
- v-model="state.discernForm.content"
|
|
|
- placeholder="请填写甄别申请理由"
|
|
|
- :loading="state.loading"
|
|
|
- :commonEnum="commonEnum.Discriminate"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
|
|
- <el-form-item label="附件">
|
|
|
- <annex-list
|
|
|
- name="甄别附件"
|
|
|
- ref="discernAnnexListRef"
|
|
|
- v-model:format="handleFilesDiscern"
|
|
|
- :businessId="state.orderDetail.orderId"
|
|
|
- v-model="state.ruleForm.files"
|
|
|
- classify="甄别上传"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
|
|
|
+ <el-form-item label="当前期满时间"> {{ formatDate(state.orderDetail.beforeDelay, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12" v-loading="state.loading">
|
|
|
+ <el-form-item label="延期申请数量" prop="timeLimitCount" :rules="[{ required: true, message: '请输入延期申请数量', trigger: 'blur' }]">
|
|
|
+ <el-row :gutter="10">
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
|
|
|
+ <el-input-number
|
|
|
+ placeholder="延期申请数量"
|
|
|
+ v-model="state.delayForm.timeLimitCount"
|
|
|
+ controls-position="right"
|
|
|
+ class="w100"
|
|
|
+ @input="computeTime"
|
|
|
+ :min="1"
|
|
|
+ :max="99"
|
|
|
+ ></el-input-number>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-loading="state.loading">
|
|
|
+ <el-form-item
|
|
|
+ label=""
|
|
|
+ label-width="0"
|
|
|
+ prop="timeLimitUnit"
|
|
|
+ :rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]"
|
|
|
+ >
|
|
|
+ <el-select v-model="state.delayForm.timeLimitUnit" placeholder="延期申请单位" @change="computeTime">
|
|
|
+ <el-option v-for="item in timeType" :value="item.key" :key="item.key" :label="item.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
|
|
|
+ <el-form-item label="延期后期满时间"> {{ state.delayForm.applyDelayTime }} </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' }]">
|
|
|
+ <common-advice
|
|
|
+ @chooseAdvice="chooseAdviceDelay"
|
|
|
+ v-model="state.delayForm.content"
|
|
|
+ placeholder="请填写延期申请理由"
|
|
|
+ :loading="state.loading"
|
|
|
+ :commonEnum="commonEnum.Delay"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
|
|
+ <el-form-item label="附件">
|
|
|
+ <annex-list name="延期附件" v-model:format="handleFilesDelay" :businessId="state.orderDetail.id" classify="延期上传" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
</el-form>
|
|
|
</div>
|
|
@@ -142,12 +163,11 @@
|
|
|
import { computed, defineAsyncComponent, nextTick, reactive, ref, watch } from 'vue';
|
|
|
import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
|
|
|
import other from '@/utils/other';
|
|
|
-import { useUserInfo } from '@/stores/userInfo';
|
|
|
-import { storeToRefs } from 'pinia';
|
|
|
import { commonEnum } from '@/utils/constants';
|
|
|
-import { discernUpdate, screenBaseData, screenDetail, workflowDiscernParams } from '@/api/business/discern';
|
|
|
-import { transformFile } from '@/utils/tools';
|
|
|
+import { debounce, transformFile } from "@/utils/tools";
|
|
|
import dayjs from 'dayjs';
|
|
|
+import { formatDate } from "@/utils/formatTime";
|
|
|
+import { delayBaseData, delayCalcEndTime, delayDetail, delayModify, workflowDelayParams } from "@/api/business/delay";
|
|
|
|
|
|
// 引入组件
|
|
|
const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
|
|
@@ -175,14 +195,6 @@ const state = reactive<any>({
|
|
|
content: '', // 延期申请理由
|
|
|
timeLimitUnit: 2, // 延期申请单位 默认工作日
|
|
|
},
|
|
|
- discernForm: {
|
|
|
- // 甄别表单
|
|
|
- content: '', // 甄别理由
|
|
|
- },
|
|
|
- redoForm: {
|
|
|
- // 重办表单
|
|
|
- content: '', // 重办理由
|
|
|
- },
|
|
|
nextStepOptions: [], // 下一节点
|
|
|
handlerOptions: [], // 办理对象
|
|
|
transform: 'translate(0px, 0px)', // 滚动条位置
|
|
@@ -197,55 +209,40 @@ const state = reactive<any>({
|
|
|
orderDetail: {}, // 工单详情
|
|
|
});
|
|
|
const ruleFormRef = ref<RefType>(); //表单组件
|
|
|
-const storesUserInfo = useUserInfo();
|
|
|
-const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
|
|
|
-const showStepsArr = ['延期申请', '甄别申请', '工单重办']; // 显示步骤条的流程
|
|
|
-const handelArr = ['工单办理']; // 处于办理状态的流程 (如果是汇总节点 需要填写办理对象等 办理流程才有期满时间)
|
|
|
-const returnArr = ['工单退回', '甄别退回', '延期退回']; // 退回流程 (退回流程不需要展示其他 只需要填写意见和附件即可)
|
|
|
-const auditArr = ['甄别审批', '延期审批']; // 审批流程
|
|
|
-
|
|
|
const timeType = ref<EmptyArrayType>([]); // 延期申请单位
|
|
|
-const orderRedoReasonOptions = ref<EmptyArrayType>([]); // 重办理由
|
|
|
-const screenTypeOptions = ref<EmptyArrayType>([]); // 甄别类型
|
|
|
|
|
|
// 打开弹窗
|
|
|
const openDialog = async (val: any) => {
|
|
|
console.log(val);
|
|
|
state.loading = true;
|
|
|
- state.dialogVisible = true;
|
|
|
+
|
|
|
try {
|
|
|
- state.dialogTitle = '甄别申请'; // 流程标题
|
|
|
+ state.dialogTitle = '延期编辑'; // 流程标题
|
|
|
activeStep.value = 0;
|
|
|
+ const [workflowDelayResponse, responseDelay] = await Promise.all([workflowDelayParams(), delayBaseData()]); //获取开启流程参数
|
|
|
+ timeType.value = responseDelay.result?.timeType ?? []; // 延期时间单位
|
|
|
+ handleResult(workflowDelayResponse);
|
|
|
|
|
|
- const [workflowDiscernResponse, responseDiscern] = await Promise.all([workflowDiscernParams(), screenBaseData()]); //获取开启流程参数
|
|
|
- screenTypeOptions.value = responseDiscern.result?.screenType ?? []; // 甄别理由
|
|
|
- handleResult(workflowDiscernResponse);
|
|
|
-
|
|
|
- const { result } = await screenDetail(val.id);
|
|
|
- state.discernForm.content = result.content ?? {};
|
|
|
- state.discernForm.type = {
|
|
|
- dicDataValue: result.typeDicId,
|
|
|
- dicDataName: result.typeDicName,
|
|
|
- };
|
|
|
+ const { result } = await delayDetail(val.id);
|
|
|
+ console.log(result);
|
|
|
+ state.delayForm.content = result.delayReason ?? {};
|
|
|
+ state.delayForm.timeLimitCount = result.delayNum ?? null;
|
|
|
+ state.delayForm.timeLimitUnit = result.delayUnit ?? 2;
|
|
|
state.orderDetail = result;
|
|
|
state.ruleForm.files = transformFile(result.files);
|
|
|
- console.log(result);
|
|
|
|
|
|
await nextTick(() => {
|
|
|
restForm(ruleFormRef.value);
|
|
|
});
|
|
|
+ state.dialogVisible = true;
|
|
|
} finally {
|
|
|
state.loading = false;
|
|
|
}
|
|
|
};
|
|
|
-const canReject = ref<boolean>(false); // 是否可以驳回
|
|
|
-const timeTypeOptions = ref<EmptyArrayType>([]); // 办理时限单位
|
|
|
const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
|
|
|
const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
|
|
|
const handleResult = (res: any) => {
|
|
|
state.nextStepOptions = res.result.steps; //办理对象选择内容
|
|
|
- canReject.value = res.result.canReject ?? false; // 是否可以驳回
|
|
|
- timeTypeOptions.value = res.result.timeTypeOptions ?? []; // 办理时限申请单位
|
|
|
canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
|
|
|
isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
|
|
|
if (state.nextStepOptions.length === 1) {
|
|
@@ -381,10 +378,29 @@ const restForm = (formEl: FormInstance | undefined) => {
|
|
|
formEl.resetFields();
|
|
|
formEl.clearValidate();
|
|
|
};
|
|
|
-// 选择常用意见 填入填写框 甄别
|
|
|
-const chooseAdviceDiscern = (item: any) => {
|
|
|
- state.discernForm.content += item.content;
|
|
|
+// 选择常用意见 填入填写框 延期
|
|
|
+const chooseAdviceDelay = (item: any) => {
|
|
|
+ state.delayForm.content += item.content;
|
|
|
};
|
|
|
+// 计算期满时间
|
|
|
+const computeTime = debounce(() => {
|
|
|
+ if (!state.delayForm.timeLimitCount || !state.delayForm.timeLimitUnit) return;
|
|
|
+ let request = {
|
|
|
+ delayNum: state.delayForm.timeLimitCount,
|
|
|
+ delayUnit: state.delayForm.timeLimitUnit,
|
|
|
+ beginTime: state.orderDetail.expiredTime,
|
|
|
+ };
|
|
|
+ state.loading = true;
|
|
|
+ delayCalcEndTime(request)
|
|
|
+ .then((res: any) => {
|
|
|
+ state.delayForm.endTime = dayjs(res.result.endTime).format('YYYY-MM-DD HH:mm:ss');
|
|
|
+ state.loading = false;
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ state.delayForm.endTime = '';
|
|
|
+ state.loading = false;
|
|
|
+ });
|
|
|
+}, 300);
|
|
|
const afterSubmit = (emitType?: 'updateList' | 'orderProcessFailed', showMessage?: boolean) => {
|
|
|
state.loading = false;
|
|
|
closeDialog();
|
|
@@ -396,7 +412,7 @@ const close = () => {
|
|
|
restForm(discernFormRef.value);
|
|
|
};
|
|
|
// 提交
|
|
|
-const handleFilesDiscern = ref<EmptyArrayType>([]); // 甄别附件
|
|
|
+const handleFilesDelay = ref<EmptyArrayType>([]); // 延期附件
|
|
|
const onSubmit = (formEl: FormInstance | undefined) => {
|
|
|
if (!formEl) return;
|
|
|
formEl.validate((valid: boolean) => {
|
|
@@ -427,11 +443,11 @@ const onSubmit = (formEl: FormInstance | undefined) => {
|
|
|
typeDicId: state.discernForm.type.dicDataValue,
|
|
|
typeDicName: state.discernForm.type.dicDataName,
|
|
|
content: state.discernForm.content,
|
|
|
- files: handleFilesDiscern.value,
|
|
|
+ files: handleFilesDelay.value,
|
|
|
},
|
|
|
- nextWorkflow: { ...submitObj, files: handleFilesDiscern.value, opinion: state.discernForm.content },
|
|
|
+ nextWorkflow: { ...submitObj, files: handleFilesDelay.value, opinion: state.discernForm.content },
|
|
|
};
|
|
|
- discernUpdate(requestDiscern)
|
|
|
+ delayModify(requestDiscern)
|
|
|
.then(() => {
|
|
|
afterSubmit('updateList', true);
|
|
|
})
|