DrillApprovalDialog.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <BasicDialog ref="basicDialogRef" title="提交审批" @refresh="refreshFromData">
  3. <template #form>
  4. <el-form ref="formRef" :model="formData" label-width="auto">
  5. <el-form-item prop="approvalDescription" label="审批描述">
  6. <el-input v-model="formData.approvalDescription" placeholder="请输入审批描述" />
  7. </el-form-item>
  8. <el-form-item
  9. v-for="(item, index) in formData.approverListInfo"
  10. :key="item.approvalOrder"
  11. :label="`第${item.approvalOrder + 1}步,${item.deptName}(${item.approvalType ? '或签' : '会签'})`"
  12. :prop="'approverListInfo.' + index + '.approverList'"
  13. :rules="{ required: true, message: '请选择审批人', trigger: 'change' }"
  14. >
  15. <el-select
  16. v-model="item.approverList"
  17. placeholder="请输入审批人"
  18. value-key="id"
  19. filterable
  20. multiple
  21. remote
  22. :disabled="!item.approverType"
  23. :remote-method="remoteMethod"
  24. :loading="loading"
  25. >
  26. <el-option v-for="item in userOptions" :key="item.id" :label="item.realname" :value="item" />
  27. </el-select>
  28. </el-form-item>
  29. </el-form>
  30. </template>
  31. <template #footer>
  32. <el-button type="primary" @click="handleSumbit">提交</el-button>
  33. <el-button @click="closeDialog">取消</el-button>
  34. </template>
  35. </BasicDialog>
  36. </template>
  37. <script setup lang="ts">
  38. import { ref, reactive, onMounted } from 'vue';
  39. import BasicDialog from '@/components/BasicDialog.vue';
  40. import { DrillApprovalItem, DrillApprovalRuleForm } from '../types';
  41. import type { QueryUserInfoByUserNameRes } from '@/types/person-group/type';
  42. import { queryUserInfoByUserName } from '@/api/system/person-group';
  43. import { FormInstance } from 'element-plus';
  44. const props = defineProps<{
  45. approvalData: DrillApprovalItem[];
  46. }>();
  47. const emits = defineEmits<{
  48. (e: 'filled', data: DrillApprovalRuleForm): void;
  49. }>();
  50. const basicDialogRef = ref<InstanceType<typeof BasicDialog>>();
  51. const formRef = ref<FormInstance>();
  52. const openDialog = () => {
  53. initForm(props.approvalData);
  54. basicDialogRef.value?.openDialog();
  55. };
  56. const closeDialog = () => {
  57. if (!basicDialogRef.value) return;
  58. clearForm();
  59. basicDialogRef.value.closeDialog();
  60. };
  61. const formData = reactive<DrillApprovalRuleForm>({
  62. approvalDescription: '',
  63. approverListInfo: [],
  64. });
  65. function initForm(originalData: DrillApprovalItem[]) {
  66. // 初始化转换结果
  67. const result: {
  68. approvalOrder: number;
  69. approvalType: number;
  70. approverType: number;
  71. deptName: string;
  72. approverList: any[];
  73. approverIds?: number[];
  74. // approverName: string[];
  75. }[] = [];
  76. // 遍历原始数据数组
  77. originalData.forEach((item) => {
  78. if (item.approverType === 0) {
  79. // 固定
  80. // 收集当前审批环节的所有审批人ID和名称
  81. const approverIds: number[] = [];
  82. const approverNames: string[] = [];
  83. // 默认为第一个流程项的部门名称
  84. let deptName = '';
  85. // 处理流程列表
  86. item.processInfoList.forEach((process, index) => {
  87. // 收集审批人信息
  88. approverIds.push(process.approverId);
  89. approverNames.push(process.approverName);
  90. // 设置部门名称(取第一个流程项的部门名称)
  91. if (index === 0) {
  92. deptName = process.approvalDeptName;
  93. }
  94. });
  95. // 添加到转换结果中
  96. result.push({
  97. approvalOrder: item.approvalOrder,
  98. approverType: item.approverType,
  99. approvalType: item.processInfoList[0].approvalType,
  100. deptName,
  101. approverList: approverNames,
  102. approverIds: approverIds,
  103. // approverName: approverNames,
  104. });
  105. } else {
  106. // 自选
  107. result.push({
  108. approvalOrder: item.approvalOrder,
  109. approverType: item.approverType,
  110. approvalType: item.processInfoList[0].approvalType,
  111. deptName: '',
  112. approverList: [],
  113. // approverId: [],
  114. // approverName: [],
  115. });
  116. }
  117. });
  118. formData.approverListInfo = result;
  119. }
  120. function clearForm() {
  121. formData.approvalDescription = '';
  122. formData.approverListInfo = [];
  123. }
  124. const handleSumbit = async () => {
  125. const validate = await new Promise((resolve) => {
  126. formRef.value?.validate((valid: boolean) => {
  127. resolve(valid);
  128. });
  129. });
  130. if (!validate) return;
  131. emits('filled', formData);
  132. };
  133. // const handleCancel = () => {
  134. // if (!basicDialogRef.value) return;
  135. // clearForm();
  136. // basicDialogRef.value.closeDialog();
  137. // };
  138. // 人员选择
  139. const userOptions = ref<QueryUserInfoByUserNameRes[]>([]);
  140. const loading = ref<boolean>(false);
  141. const remoteMethod = async (query: string) => {
  142. if (!query) {
  143. userOptions.value = [];
  144. return;
  145. }
  146. loading.value = true;
  147. userOptions.value = await queryUserInfoByUserName(query);
  148. loading.value = false;
  149. };
  150. const refreshFromData = () => {
  151. formRef.value?.clearValidate();
  152. };
  153. defineExpose({
  154. openDialog,
  155. closeDialog,
  156. });
  157. </script>
  158. <style scoped></style>