Visit-redo.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" draggable :title="dialogTitle" width="50%" append-to-body destroy-on-close @close="close">
  3. <div class="collapse-container" v-loading="state.loading">
  4. <el-form ref="ruleFormRef" :model="state.ruleForm">
  5. <el-row :gutter="35">
  6. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  7. <el-row :gutter="10" class="w100">
  8. <el-col :xs="24" :sm="12" :md="12" :lg="10" :xl="10">
  9. <el-form-item label="流转目标" prop="nextStepCode" :rules="[{ required: true, message: '请选择流转目标', trigger: 'change' }]">
  10. <el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择流转目标" @change="selectNextCode">
  11. <el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
  12. </el-select>
  13. </el-form-item>
  14. </el-col>
  15. <el-col :xs="24" :sm="12" :md="12" :lg="10" :xl="10">
  16. <el-form-item prop="timeLimit" :rules="[{ required: true, message: '请填写延期数量', trigger: 'blur' }]">
  17. <!-- <el-select
  18. v-model="state.ruleForm.timeLimit"
  19. placeholder="请选择延期数量"
  20. :rules="[{ required: true, message: '请选择延期数量', trigger: 'change' }]"
  21. clearable
  22. >
  23. <el-option v-for="item in delayOptions" :value="item.value" :key="item.value" :label="item.label" />
  24. </el-select>-->
  25. <el-input-number v-model="state.ruleForm.timeLimit" :min="1" :precision="0" class="w100" :max="10" placeholder="请填写延期数量" />
  26. </el-form-item>
  27. </el-col>
  28. <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
  29. <el-form-item prop="timeLimitUnit" :rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]">
  30. <el-select v-model="state.ruleForm.timeLimitUnit" placeholder="延期申请单位" disabled>
  31. <el-option v-for="item in timeType" :value="item.key" :key="item.key" :label="item.value" />
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. </el-row>
  36. </el-col>
  37. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  38. <el-form-item label="重办原因" :rules="[{ required: true, message: '请选择重办原因', trigger: 'change' }]" prop="error">
  39. <el-select v-model="state.ruleForm.error" placeholder="请选择重办原因" value-key="dicDataValue" clearable style="min-width: 240px">
  40. <el-option v-for="items in specialReason" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  41. </el-select>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  45. <el-form-item label="重办意见" prop="reason" :rules="[{ required: true, message: '请填写重办意见', trigger: 'blur' }]">
  46. <common-advice
  47. @chooseAdvice="chooseAdvice"
  48. v-model="state.ruleForm.reason"
  49. placeholder="请填写重办意见"
  50. :commonEnum="commonEnum.Return"
  51. />
  52. </el-form-item>
  53. </el-col>
  54. </el-row>
  55. </el-form>
  56. </div>
  57. <template #footer>
  58. <span class="dialog-footer">
  59. <el-button @click="closeDialog" class="default-button">取消</el-button>
  60. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确定</el-button>
  61. </span>
  62. </template>
  63. </el-dialog>
  64. </template>
  65. <script setup lang="ts" name="SpecialDialog">
  66. import { reactive, ref, defineAsyncComponent, nextTick } from 'vue';
  67. import { ElMessage, FormInstance } from 'element-plus';
  68. import { publishReturnBaseData, publishReturn } from '@/api/business/publish';
  69. import { commonEnum } from '@/utils/constants';
  70. import { useThemeConfig } from '@/stores/themeConfig';
  71. import { storeToRefs } from 'pinia';
  72. // 引入组件
  73. const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
  74. // 定义子组件向父组件传值/事件
  75. const emit = defineEmits(['updateList']);
  76. // 定义变量内容
  77. const state = reactive<any>({
  78. dialogVisible: false, // 是否显示弹窗
  79. loading: false, // 是否显示加载
  80. ruleForm: {
  81. nextStepCode: null, // 退回节点
  82. reason: '', // 重办意见
  83. timeLimitUnit: 2,
  84. timeLimit: 1,
  85. stepType: null,
  86. },
  87. orderDetail: {}, // 工单详情
  88. });
  89. const ruleFormRef = ref<RefType>();
  90. const steps = ref<EmptyArrayType>([]); // 退回节点
  91. const timeType = ref<EmptyArrayType>([]); // 时间单位
  92. const specialReason = ref<EmptyArrayType>([]); // 重办原因
  93. const delayOptions = ref([
  94. { value: 1, label: '1' },
  95. { value: 3, label: '3' },
  96. { value: 5, label: '5' },
  97. ]); // 延期
  98. /**
  99. * @description 打开弹窗
  100. * @param {object} val 工单详情
  101. */
  102. const dialogTitle = ref('业务信件重办');
  103. const openDialog = async (val: any, title?: string) => {
  104. state.orderDetail = val;
  105. state.workflowId = val.workflowId;
  106. state.loading = true;
  107. state.dialogVisible = true;
  108. try {
  109. const baseRes = await publishReturnBaseData(val.id);
  110. timeType.value = baseRes.result?.specialTimeType ?? [];
  111. steps.value = baseRes.result?.step?.steps ?? [];
  112. specialReason.value = baseRes.result?.specialReason ?? [];
  113. if (baseRes.result.defaultStepKey) {
  114. await nextTick(() => {
  115. // 如果有默认值需要默认选中
  116. state.ruleForm.nextStepCode = baseRes.result.defaultStepKey;
  117. state.ruleForm.nextStepName = steps.value.find(item => item.key === baseRes.result?.defaultStepKey).value;
  118. selectNextCode(baseRes.result.defaultStepKey);
  119. });
  120. }
  121. if (title) dialogTitle.value = title;
  122. } catch (e) {
  123. console.log(e);
  124. } finally {
  125. state.loading = false;
  126. }
  127. };
  128. // 关闭弹窗
  129. const closeDialog = () => {
  130. state.dialogVisible = false;
  131. };
  132. const close = () => {
  133. ruleFormRef.value?.clearValidate();
  134. ruleFormRef.value?.resetFields();
  135. steps.value = [];
  136. };
  137. // 选择流转节点
  138. const orgId = ref('');
  139. const orgName = ref('');
  140. const storesThemeConfig = useThemeConfig();
  141. const { themeConfig } = storeToRefs(storesThemeConfig);
  142. const selectNextCode = (val: any) => {
  143. const next = steps.value.find((item: any) => item.key === val);
  144. state.ruleForm.nextStepName = next.value; // 下一节点name
  145. state.ruleForm.businessType = next.businessType;
  146. state.ruleForm.flowDirection = next.flowDirection;
  147. state.ruleForm.handlerType = next.handlerType;
  148. state.ruleForm.stepType = next.stepType;
  149. if (['ZiGong','LuZhou'].includes(themeConfig.value.appScope)) {
  150. orgId.value = next.handler.orgId;
  151. orgName.value = next.handler.orgName;
  152. }
  153. };
  154. // 提交
  155. const onSubmit = (formEl: FormInstance | undefined) => {
  156. if (!formEl) return;
  157. formEl.validate((valid: boolean) => {
  158. if (!valid) return;
  159. state.loading = true;
  160. let reTransactError: any;
  161. if (['ZiGong','LuZhou'].includes(themeConfig.value.appScope)) {
  162. reTransactError = [
  163. {
  164. orgId: orgId.value,
  165. orgName: orgName.value,
  166. errorId: state.ruleForm.error.dicDataValue,
  167. errorName: state.ruleForm.error.dicDataName,
  168. },
  169. ];
  170. }
  171. const request = {
  172. workflowId: state.orderDetail.workflowId,
  173. orderId: state.orderDetail.id,
  174. nextStepCode: state.ruleForm.nextStepCode,
  175. nextStepName: state.ruleForm.nextStepName,
  176. reason: state.ruleForm.reason,
  177. timeLimit: state.ruleForm.timeLimit,
  178. timeLimitUnit: state.ruleForm.timeLimitUnit,
  179. alterTime: !!state.ruleForm.timeLimit,
  180. businessType: state.ruleForm.businessType,
  181. flowDirection: state.ruleForm.flowDirection,
  182. handlerType: state.ruleForm.handlerType,
  183. stepType: state.ruleForm.stepType,
  184. reTransactError,
  185. specialType: 2, // 1特提 2重办 3退回
  186. };
  187. publishReturn(request)
  188. .then(() => {
  189. state.loading = false;
  190. closeDialog();
  191. emit('updateList');
  192. ElMessage.success('操作成功');
  193. })
  194. .catch(() => {
  195. state.loading = false;
  196. });
  197. });
  198. };
  199. // 选中常用意见
  200. const chooseAdvice = (item: any) => {
  201. state.ruleForm.reason += item.content;
  202. };
  203. defineExpose({
  204. openDialog,
  205. closeDialog,
  206. });
  207. </script>