123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- <template>
- <el-dialog v-model="state.dialogVisible" draggable title="特提审批" width="50%" append-to-body destroy-on-close @close="close">
- <div class="collapse-container">
- <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="工单编码" class="mb5"> {{ state.detail?.order?.no }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
- <el-form-item label="工单标题" class="mb5"> {{ state.detail?.order?.title }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
- <el-form-item label="申请人" class="mb5"> {{ state.detail?.creatorName }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
- <el-form-item label="申请部门" class="mb5"> {{ state.detail?.creatorOrgName }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
- <el-form-item label="申请时间" class="mb5"> {{ formatDate(state.detail?.creationTime, '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="特提原因" class="mb5">
- {{ state.detail?.cause }}
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="特提理由" class="mb5">
- {{ state.detail?.reason }}
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="附件" class="mb5">
- <annex-list name="特提附件" readonly classify="特提申请" v-model="state.detail.files" />
- </el-form-item>
- </el-col>
- <el-divider />
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12">
- <el-form-item label="审批结果" prop="isPass" :rules="[{ required: true, message: '请选择审批结果', trigger: 'change' }]">
- <el-radio-group v-model="state.ruleForm.isPass">
- <el-radio :label="true">同意</el-radio>
- <el-radio :label="false">不同意</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <template v-if="state.ruleForm.isPass">
- <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>
- <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">
- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
- <el-input-number
- placeholder="办理时限"
- v-model="state.ruleForm.timeLimit"
- controls-position="right"
- class="w100"
- :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.ruleForm.timeLimitUnit" placeholder="办理时限单位">
- <el-option v-for="item in specialTimeType" :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="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
- <el-select-v2
- v-model="state.ruleForm.nextHandlers"
- :options="stepsItems"
- placeholder="请选择办理对象"
- class="w100"
- multiple
- clearable
- collapse-tags
- collapse-tags-tooltip
- filterable
- value-key="key"
- />
- </el-form-item>
- </el-col>
- </template>
- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
- <el-form-item label="" prop="alterTime">
- <el-checkbox v-model="state.ruleForm.alterTime" label="无需计算期满时间" />
- </el-form-item>
- </el-col>
- </template>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="审批意见" prop="opinion" :rules="[{ required: true, message: '请填写特提审批意见', trigger: 'blur' }]">
- <el-input v-model="state.ruleForm.opinion" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写特提审批意见" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="closeDialog" class="default-button">取 消</el-button>
- <el-button type="primary" @click="onAudit(ruleFormRef)" :loading="state.loading">审 批</el-button>
- </span>
- </template>
- </el-dialog>
- </template>
- <script setup lang="ts" name="SpecialDialogAudit">
- 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, specialApprove, specialDetail } from '@/api/business/special';
- import { transformFile } from '@/utils/tools';
- import { orderTimeConfig } from '@/api/business/order';
- // 引入组件
- const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue'));
- // 定义子组件向父组件传值/事件
- const emit = defineEmits(['updateList']);
- // 定义变量内容
- const state = reactive<any>({
- dialogVisible: false, // 是否显示弹窗
- loading: false, // 是否显示加载
- ruleForm: {
- nextStepCode: null, // 特提节点
- nextHandlers: [], // 处理对象
- timeLimitUnit: 2, // 期满时间单位
- orgId: null, // 部门id
- orgName: null, // 部门名称
- alterTime: false, // 是否修改期满时间
- opinion: '', // 审批意见
- isPass: true, // 是否通过
- },
- detail: {}, // 详情信息
- workflowId: null, // 工作流id
- });
- const ruleFormRef = ref<RefType>();
- const storesUserInfo = useUserInfo();
- const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
- const steps = ref<EmptyArrayType>([]); // 特提节点
- const stepsItems = ref<EmptyArrayType>([]); // 处理对象
- const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
- // 打开弹窗
- const openDialog = async (val: any) => {
- state.loading = true;
- state.dialogVisible = true;
- state.workflowId = val.workflowId;
- try {
- const [baseRes, detailRes] = await Promise.all([specialApplyBase(val.workflowId), specialDetail(val.id)]);
- steps.value = baseRes.result?.step?.steps ?? [];
- specialTimeType.value = baseRes.result.specialTimeType ?? [];
- state.detail = detailRes.result;
- state.detail.files = transformFile(detailRes.result.files);
- state.ruleForm.nextStepCode = detailRes.result.nextStepCode;
- state.ruleForm.nextStepName = detailRes.result.nextStepName;
- selectTrace(detailRes.result.nextStepCode);
- state.ruleForm.nextHandlers = detailRes.result.nextHandlers;
- state.ruleForm.alterTime = detailRes.result.alterTime;
- } catch (e) {
- console.log(e);
- } finally {
- state.loading = false;
- }
- };
- // 关闭弹窗
- const closeDialog = () => {
- state.dialogVisible = false;
- };
- const close = () => {
- ruleFormRef.value?.clearValidate();
- ruleFormRef.value?.resetFields();
- steps.value = [];
- stepsItems.value = [];
- };
- // 选择节点确定处理对象
- const selectTrace = (val: any) => {
- const step = steps.value.find((item) => item.key === val);
- state.ruleForm.nextStepName = step?.value;
- ruleFormRef.value?.resetFields('nextHandlers');
- stepsItems.value = step?.items ?? [];
- stepsItems.value = stepsItems.value.map((item: any) => {
- return {
- value: {
- ...item,
- },
- label: item.value,
- };
- });
- state.ruleForm.flowDirection = step?.flowDirection;
- queryHandleTime();
- };
- // 查询办理时限
- const queryHandleTime = () => {
- if (state.ruleForm.alterTime) return;
- state.loading = true;
- orderTimeConfig({ acceptTypeCode: state.detail.order?.acceptTypeCode, FlowDirection: state.ruleForm.flowDirection })
- .then((res) => {
- state.ruleForm.timeLimit = res.result.count ?? 0; // 办理时限
- state.ruleForm.timeLimitUnit = res.result.timeType ?? ''; // 办理时限单位
- })
- .finally(() => {
- state.loading = false;
- });
- };
- // 审批
- const onAudit = (formEl: FormInstance | undefined) => {
- if (!formEl) return;
- formEl.validate((valid: boolean) => {
- if (!valid) return;
- state.loading = true;
- let request: {};
- if (state.ruleForm.isPass) {
- request = {
- id: state.detail.id,
- orderId: state.detail.orderId,
- timeLimit: state.ruleForm.timeLimit,
- timeLimitUnit: state.ruleForm.timeLimitUnit,
- cause: state.detail.cause,
- opinion: state.ruleForm.opinion,
- workflowId: state.workflowId,
- state: 1, // 审核结果 0 待审核 1 审核通过 2 审核不通过
- nextStepCode: state.ruleForm.nextStepCode,
- nextStepName: state.ruleForm.nextStepName,
- nextHandlers: state.ruleForm.nextHandlers,
- };
- } else {
- request = {
- id: state.detail.id,
- orderId: state.detail.orderId,
- cause: state.detail.cause,
- opinion: state.ruleForm.opinion,
- workflowId: state.workflowId,
- state: 2, // 审核结果 0 待审核 1 审核通过 2 审核不通过
- };
- }
- specialApprove(request)
- .then(() => {
- state.loading = false;
- closeDialog();
- emit('updateList');
- ElMessage.success('操作成功');
- })
- .catch(() => {
- state.loading = false;
- });
- });
- };
- defineExpose({
- openDialog,
- closeDialog,
- });
- </script>
|