Special-audit.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" draggable title="特提审核" width="50%" append-to-body destroy-on-close @close="close">
  3. <div class="collapse-container pb1">
  4. <el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
  5. <el-row :gutter="35">
  6. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  7. <el-form-item label="工单编码" class="mb5"> {{ state.detail?.order?.no }} </el-form-item>
  8. </el-col>
  9. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  10. <el-form-item label="工单标题" class="mb5"> {{ state.detail?.order?.title }} </el-form-item>
  11. </el-col>
  12. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  13. <el-form-item label="申请人" class="mb5"> {{ state.detail?.creatorName }} </el-form-item>
  14. </el-col>
  15. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  16. <el-form-item label="申请部门" class="mb5"> {{ state.detail?.creatorOrgName }} </el-form-item>
  17. </el-col>
  18. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  19. <el-form-item label="申请时间" class="mb5"> {{ formatDate(state.detail?.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  20. </el-col>
  21. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  22. <el-form-item label="特提节点" class="mb5">
  23. {{ state.detail?.trace?.name }}
  24. </el-form-item>
  25. </el-col>
  26. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  27. <el-form-item label="特提原因" class="mb5">
  28. {{ state.detail?.cause }}
  29. </el-form-item>
  30. </el-col>
  31. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  32. <el-form-item label="特提理由" class="mb5">
  33. {{ state.detail?.reason }}
  34. </el-form-item>
  35. </el-col>
  36. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  37. <el-form-item label="附件" class="mb5">
  38. <annex-list name="特提附件" ref="annexListRef" businessId="" classify="特提申请" />
  39. </el-form-item>
  40. </el-col>
  41. <el-divider></el-divider>
  42. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  43. <el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
  44. <el-select v-model="state.ruleForm.traceId" placeholder="请选择特提节点" class="w100" @change="selectTrace">
  45. <el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name">
  46. <span style="float: left">{{ item.name }}</span>
  47. <span style="float: right; color: var(--el-text-color-secondary); font-size: var(--el-font-size-extra-small)">{{ item.acceptorOrgName }}</span>
  48. </el-option>
  49. </el-select>
  50. </el-form-item>
  51. </el-col>
  52. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12" v-if="state.ruleForm.traceId">
  53. <el-form-item label="办理时限" prop="timeLimit" :rules="[{ required: true, message: '请输入办理时限', trigger: 'blur' }]">
  54. <el-row :gutter="10" class="w100">
  55. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  56. <el-input-number
  57. placeholder="办理时限"
  58. v-model="state.ruleForm.timeLimit"
  59. controls-position="right"
  60. class="w100"
  61. :min="1"
  62. :max="99"
  63. ></el-input-number>
  64. </el-col>
  65. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-loading="state.loading">
  66. <el-form-item
  67. label=""
  68. label-width="0"
  69. prop="timeLimitUnit"
  70. :rules="[{ required: true, message: '请选择办理时限单位', trigger: 'change' }]"
  71. >
  72. <el-select v-model="state.ruleForm.timeLimitUnit" placeholder="办理时限单位">
  73. <el-option v-for="item in specialTimeType" :value="item.key" :key="item.key" :label="item.value" />
  74. </el-select>
  75. </el-form-item>
  76. </el-col>
  77. </el-row>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  81. <el-form-item label="" prop="alterTime">
  82. <el-checkbox v-model="state.ruleForm.alterTime" label="无需计算期满时间" />
  83. </el-form-item>
  84. </el-col>
  85. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  86. <el-form-item label="审批意见" prop="reason" :rules="[{ required: true, message: '请填写特提审批意见', trigger: 'blur' }]">
  87. <el-input v-model="state.ruleForm.reason" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写特提审批意见" />
  88. </el-form-item>
  89. </el-col>
  90. </el-row>
  91. </el-form>
  92. </div>
  93. <template #footer>
  94. <span class="dialog-footer">
  95. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  96. <el-button type="primary" @click="onReject(ruleFormRef)" :loading="state.loading">驳回</el-button>
  97. <el-button type="primary" @click="onPass(ruleFormRef)" :loading="state.loading">通过</el-button>
  98. </span>
  99. </template>
  100. </el-dialog>
  101. </template>
  102. <script setup lang="ts" name="SpecialDialogAudit">
  103. import { defineAsyncComponent, reactive, ref } from 'vue';
  104. import { ElMessage, FormInstance } from 'element-plus';
  105. import { storeToRefs } from 'pinia';
  106. import { useUserInfo } from '/@/stores/userInfo';
  107. import { formatDate } from '/@/utils/formatTime';
  108. import { specialApplyBase, specialApprove, specialDetail, specialTime } from '/@/api/business/special';
  109. import { debounce } from '/@/utils/tools';
  110. import dayjs from 'dayjs';
  111. // 引入组件
  112. const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue'));
  113. // 定义子组件向父组件传值/事件
  114. const emit = defineEmits(['updateList']);
  115. // 定义变量内容
  116. const state = reactive<any>({
  117. dialogVisible: false, // 是否显示弹窗
  118. loading: false, // 是否显示加载
  119. ruleForm: {
  120. traceId: null, // 特提节点
  121. timeLimitUnit: 2, // 期满时间单位
  122. orgId: null, // 部门id
  123. orgName: null, // 部门名称
  124. alterTime: false, // 是否修改期满时间
  125. },
  126. detail: {}, // 详情信息
  127. });
  128. const ruleFormRef = ref<RefType>();
  129. const storesUserInfo = useUserInfo();
  130. const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
  131. const traces = ref<EmptyArrayType>([]); // 特提节点
  132. const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
  133. // 打开弹窗
  134. const openDialog = async (val: any) => {
  135. console.log(val, 'val');
  136. state.loading = true;
  137. state.dialogVisible = true;
  138. try {
  139. const [baseRes, detailRes] = await Promise.all([
  140. specialApplyBase(val.order?.workflowId),
  141. specialDetail(val.id)
  142. ]);
  143. traces.value = baseRes.result.traces ?? [];
  144. specialTimeType.value = baseRes.result.specialTimeType ?? [];
  145. state.detail = detailRes.result;
  146. } catch (e) {
  147. console.log(e);
  148. } finally {
  149. state.loading = false;
  150. }
  151. };
  152. // 关闭弹窗
  153. const closeDialog = () => {
  154. state.dialogVisible = false;
  155. };
  156. const close = () => {
  157. ruleFormRef.value?.clearValidate();
  158. ruleFormRef.value?.resetFields();
  159. };
  160. // 选择节点确定部门
  161. const selectTrace = (val: any) => {
  162. const trace = traces.value.find((item) => item.id === val);
  163. state.ruleForm.orgId = trace?.acceptorOrgId;
  164. state.ruleForm.orgName = trace?.acceptorOrgName;
  165. queryHandleTime();
  166. };
  167. // 查询办理时限
  168. const queryHandleTime = () => {
  169. if (state.ruleForm.alterTime) return;
  170. state.loading = true;
  171. specialTime({ OrderId: state.detail.orderId, TraceId: state.ruleForm.traceId })
  172. .then((res) => {
  173. state.ruleForm.timeLimit = res.result ?? 0;
  174. })
  175. .finally(() => {
  176. state.loading = false;
  177. });
  178. };
  179. // 通过
  180. const annexListRef = ref<RefType>(); // 附件列表
  181. const onPass = (formEl: FormInstance | undefined) => {
  182. if (!formEl) return;
  183. formEl.validate((valid: boolean) => {
  184. if (!valid) return;
  185. state.loading = true;
  186. let request = {
  187. id:state.detail.id,
  188. orderId: state.detail.orderId,
  189. orgId: state.ruleForm.orgId,
  190. orgName: state.ruleForm.orgName,
  191. timeLimit: state.ruleForm.timeLimit,
  192. timeLimitUnit: state.ruleForm.timeLimitUnit,
  193. cause: state.detail.cause,
  194. opinion: state.detail.reason,
  195. files: annexListRef.value?.fileList,
  196. state:1, // 审核结果 0 待审核 1 审核通过 2 审核不通过
  197. };
  198. specialApprove(request)
  199. .then((res: any) => {
  200. state.loading = false;
  201. closeDialog();
  202. emit('updateList');
  203. ElMessage.success('操作成功');
  204. })
  205. .catch(() => {
  206. state.loading = false;
  207. });
  208. });
  209. };
  210. // 驳回
  211. const onReject = (formEl: FormInstance | undefined) => {
  212. if (!formEl) return;
  213. formEl.validate((valid: boolean) => {
  214. if (!valid) return;
  215. state.loading = true;
  216. let request = {
  217. id:state.detail.id,
  218. orderId: state.detail.orderId,
  219. orgId: state.ruleForm.orgId,
  220. orgName: state.ruleForm.orgName,
  221. timeLimit: state.ruleForm.timeLimit,
  222. timeLimitUnit: state.ruleForm.timeLimitUnit,
  223. cause: state.detail.cause,
  224. opinion: state.detail.reason,
  225. files: annexListRef.value?.fileList,
  226. state:2,
  227. };
  228. specialApprove(request)
  229. .then((res: any) => {
  230. state.loading = false;
  231. closeDialog();
  232. emit('updateList');
  233. ElMessage.success('操作成功');
  234. })
  235. .catch(() => {
  236. state.loading = false;
  237. });
  238. });
  239. };
  240. defineExpose({
  241. openDialog,
  242. closeDialog,
  243. });
  244. </script>