Order-redo.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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">
  4. <el-form ref="ruleFormRef" :model="state.ruleForm">
  5. <el-row :gutter="35">
  6. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  7. <el-form-item label="退回节点" prop="nextStepCode" :rules="[{ required: true, message: '请选退回节点', trigger: 'change' }]">
  8. <el-select v-model="state.ruleForm.nextStepCode" placeholder="请选退回节点" class="w100" @change="selectNextCode">
  9. <el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
  10. </el-select>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.nextStepCode">
  14. <el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
  15. <el-select-v2
  16. v-model="state.ruleForm.nextHandlers"
  17. :options="handlerOptions"
  18. placeholder="请选择办理对象"
  19. class="w100"
  20. multiple
  21. clearable
  22. collapse-tags
  23. collapse-tags-tooltip
  24. filterable
  25. value-key="key"
  26. />
  27. </el-form-item>
  28. </el-col>
  29. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="isDepartment">
  30. <el-form-item
  31. label="延期"
  32. label-width="76px"
  33. prop="timeLimit"
  34. :rules="[{ required: false, message: '请填写延期申请数量', trigger: 'blur' }]"
  35. >
  36. <el-row :gutter="10">
  37. <el-col :xs="24" :sm="12" :md="12" :lg="16" :xl="16">
  38. <el-select
  39. v-model="state.ruleForm.timeLimit"
  40. placeholder="请选择延期数量"
  41. :rules="[{ required: true, message: '请选择延期数量', trigger: 'change' }]"
  42. clearable
  43. >
  44. <el-option v-for="item in delayOptions" :value="item.value" :key="item.value" :label="item.label" />
  45. </el-select>
  46. </el-col>
  47. <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
  48. <el-form-item label="" prop="timeLimitUnit" :rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]">
  49. <el-select v-model="state.ruleForm.timeLimitUnit" placeholder="延期申请单位" disabled>
  50. <el-option v-for="item in timeType" :value="item.key" :key="item.key" :label="item.value" />
  51. </el-select>
  52. </el-form-item>
  53. </el-col>
  54. </el-row>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  58. <el-alert type="warning" class="mb18" show-icon>注意: 勾选后还需要选择类型 </el-alert>
  59. <el-form-item label="错件类别" :rules="[{ required: true, message: '请选择错件类别', trigger: 'change' }]" prop="error">
  60. <el-checkbox v-model="state.ruleForm.error" @change="selectError" style="display: none"></el-checkbox>
  61. <el-row>
  62. <el-col :span="24" v-for="(item, index) in state.ruleForm.orgs" :key="item.id" class="mb18">
  63. <el-form-item :prop="`orgs.${index}.reason`" :rules="[{ required: item.choose, message: '请选择错件类别', trigger: 'change' }]">
  64. <template #label>
  65. <el-checkbox v-model="item.choose" @change="selectError"> {{ item.value }}</el-checkbox>
  66. </template>
  67. <el-select
  68. v-model="item.reason"
  69. placeholder="请选择错件类别"
  70. value-key="dicDataValue"
  71. clearable
  72. @change="selectError"
  73. >
  74. <el-option v-for="items in reTransactErrorType" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  75. </el-select>
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  82. <el-form-item label="退回意见" prop="reason" :rules="[{ required: true, message: '请填写退回意见', trigger: 'blur' }]">
  83. <common-advice
  84. @chooseAdvice="chooseAdvice"
  85. v-model="state.ruleForm.reason"
  86. placeholder="请填写退回意见"
  87. :commonEnum="commonEnum.Seat"
  88. />
  89. </el-form-item>
  90. </el-col>
  91. </el-row>
  92. </el-form>
  93. </div>
  94. <template #footer>
  95. <span class="dialog-footer">
  96. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  97. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">重办</el-button>
  98. </span>
  99. </template>
  100. </el-dialog>
  101. </template>
  102. <script setup lang="ts" name="SpecialDialog">
  103. import { reactive, ref, defineAsyncComponent } from 'vue';
  104. import { ElMessage, FormInstance } from 'element-plus';
  105. import { redoBaseData, redo } from '@/api/business/redo';
  106. import { commonEnum } from '@/utils/constants';
  107. // 引入组件
  108. const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
  109. // 定义子组件向父组件传值/事件
  110. const emit = defineEmits(['updateList']);
  111. // 定义变量内容
  112. const state = reactive<any>({
  113. dialogVisible: false, // 是否显示弹窗
  114. loading: false, // 是否显示加载
  115. ruleForm: {
  116. nextStepCode: null, // 退回节点
  117. reason: '', // 退回理由
  118. timeLimitUnit: 2,
  119. timeLimit: null,
  120. orgs: [],
  121. nextHandlers: [],
  122. stepType:null
  123. },
  124. orderDetail: {}, // 工单详情
  125. });
  126. const ruleFormRef = ref<RefType>();
  127. const steps = ref<EmptyArrayType>([]); // 退回节点
  128. const timeType = ref([]); // 时间单位
  129. const reTransactErrorType = ref<EmptyArrayType>([]); // 错件类别
  130. const handlerOptions = ref<EmptyArrayType>([]); // 办理对象
  131. const delayOptions = ref([
  132. { value: 1, label: '1' },
  133. { value: 3, label: '3' },
  134. { value: 5, label: '5' },
  135. ]); // 延期
  136. /**
  137. * @description 打开弹窗
  138. * @param {object} val 工单详情
  139. */
  140. const openDialog = async (val: any) => {
  141. state.orderDetail = val;
  142. state.workflowId = val.workflowId;
  143. state.loading = true;
  144. state.dialogVisible = true;
  145. try {
  146. const baseRes = await redoBaseData(val.id);
  147. timeType.value = baseRes.result?.specialTimeType ?? [];
  148. steps.value = baseRes.result?.step?.steps ?? [];
  149. reTransactErrorType.value = baseRes.result?.reTransactErrorType ?? [];
  150. state.ruleForm.orgs = baseRes.result?.orgs ?? [];
  151. } catch (e) {
  152. console.log(e);
  153. } finally {
  154. state.loading = false;
  155. }
  156. };
  157. // 关闭弹窗
  158. const closeDialog = () => {
  159. state.dialogVisible = false;
  160. };
  161. const close = () => {
  162. ruleFormRef.value?.clearValidate();
  163. ruleFormRef.value?.resetFields();
  164. steps.value = [];
  165. };
  166. // 选择退回节点
  167. const isDepartment = ref<Boolean>(false); // 选择的退回节点是否是部门
  168. const selectNextCode = (val: any) => {
  169. ruleFormRef.value?.resetFields('nextHandlers');
  170. ruleFormRef.value?.resetFields('nextMainHandler');
  171. const next = steps.value.find((item: any) => item.key === val);
  172. isDepartment.value = next.businessType === 2; // 如果是部门才可以选择延期
  173. const items = next.items; //获取下一节点
  174. state.ruleForm.nextStepName = next.value; // 下一节点name
  175. handlerOptions.value = items ?? [];
  176. state.ruleForm.businessType = next.businessType;
  177. state.ruleForm.flowDirection = next.flowDirection;
  178. state.ruleForm.handlerType = next.handlerType;
  179. state.ruleForm.stepType = next.stepType;
  180. handlerOptions.value = handlerOptions.value.map((item: any) => {
  181. return {
  182. value: {
  183. ...item,
  184. },
  185. label: item.value,
  186. };
  187. });
  188. if (items.length === 1) {
  189. // 如果办理对象只有一个默认选中
  190. state.ruleForm.nextHandlers = [items[0]];
  191. }
  192. };
  193. // 选择错件类别
  194. const selectError = () => {
  195. state.ruleForm.error = state.ruleForm.orgs.find((item: any) => item.choose) ? true : null;
  196. };
  197. // 提交
  198. const onSubmit = (formEl: FormInstance | undefined) => {
  199. if (!formEl) return;
  200. formEl.validate((valid: boolean) => {
  201. if (!valid) return;
  202. state.loading = true;
  203. const reTransactError = state.ruleForm.orgs
  204. .filter((item: any) => item.choose)
  205. .map((item: any) => {
  206. return {
  207. orgId: item.key,
  208. orgName: item.value,
  209. errorId: item.reason.id,
  210. errorName: item.reason.dicDataName,
  211. };
  212. });
  213. const request = {
  214. workflowId: state.orderDetail.workflowId,
  215. orderId: state.orderDetail.id,
  216. nextStepCode: state.ruleForm.nextStepCode,
  217. nextStepName: state.ruleForm.nextStepName,
  218. nextHandlers: state.ruleForm.nextHandlers,
  219. reason: state.ruleForm.reason,
  220. timeLimit: state.ruleForm.timeLimit,
  221. timeLimitUnit: state.ruleForm.timeLimitUnit,
  222. alterTime: !!state.ruleForm.timeLimit,
  223. businessType: state.ruleForm.businessType,
  224. flowDirection: state.ruleForm.flowDirection,
  225. handlerType: state.ruleForm.handlerType,
  226. reTransactError,
  227. };
  228. redo(request)
  229. .then(() => {
  230. state.loading = false;
  231. closeDialog();
  232. emit('updateList');
  233. ElMessage.success('重办成功');
  234. })
  235. .catch(() => {
  236. state.loading = false;
  237. });
  238. });
  239. };
  240. // 选中常用意见
  241. const chooseAdvice = (item: any) => {
  242. state.ruleForm.reason += item.content;
  243. };
  244. defineExpose({
  245. openDialog,
  246. closeDialog,
  247. });
  248. </script>