ChooseExpert.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width">
  3. <template #default>
  4. <div class="d-flex flex-cln" style="height: 60vh;">
  5. <div class="pd-16">
  6. <el-form ref="queryFormRef" :model="queryParams" inline>
  7. <el-form-item label="姓名" prop="name">
  8. <el-input v-model="queryParams.name" placeholder="搜姓名" clearable style="width: 160px" @keyup.enter="handleQuery" />
  9. </el-form-item>
  10. <el-form-item label="单位" prop="workUnit">
  11. <el-input v-model="queryParams.variety" placeholder="搜单位关键字" clearable style="width: 160px" @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item label="专业品种" prop="variety">
  14. <el-input v-model="queryParams.variety" placeholder="搜专业品种" clearable style="width: 160px" @keyup.enter="handleQuery" />
  15. </el-form-item>
  16. <el-form-item>
  17. <el-button type="primary" @click="handleQuery">查询</el-button>
  18. <el-button @click="resetQuery">重置</el-button>
  19. </el-form-item>
  20. </el-form>
  21. </div>
  22. <div class="flex1 ov-hd d-flex">
  23. <div v-if="currentNodeKey" class="tree-wrap over-auto">
  24. <template v-for="(item, index) in itemsData" :key="index">
  25. <div class="pd2-10-30 border-bottom c-s-p" @click="itemsClick(item)" :class="{ 'check-node-key': currentNodeKey === item.type }">{{ selectDictLabel(dm_person_type, item.type) }}({{ item.num }})</div>
  26. </template>
  27. </div>
  28. <div class="flex1 ov-hd">
  29. <vxe-table ref="tableRef" :loading="loading" border :data="list" height="auto" :checkbox-config="{ checkRowKeys: checkRowKeys, highlight: true, range: true, trigger: 'row', reserve: true }" :row-config="{ keyField: 'id', isCurrent: true, isHover: true }">
  30. <vxe-column type="checkbox" width="60"></vxe-column>
  31. <vxe-column type="seq" width="60" title="序号" align="center" />
  32. <!-- 企业名称 -->
  33. <vxe-column title="姓名" align="center" field="name" :formatter="colNoData" />
  34. <vxe-column title="性别" width="70" align="center">
  35. <template #default="{ row }">
  36. {{ selectDictLabel(sys_sex_type, row?.sex) }}
  37. </template>
  38. </vxe-column>
  39. <vxe-column title="单位" field="workUnit" :formatter="colNoData" />
  40. <vxe-column title="职称/职务" field="post" :formatter="colNoData" />
  41. <vxe-column title="专业品种" field="variety" :formatter="colNoData" />
  42. <vxe-column title="所在地区" field="adcodeName" :formatter="colNoData" />
  43. <vxe-column title="岗位状态" width="90">
  44. <template #default="{ row }">
  45. <DictTag :options="dm_position_status" :value="row?.status"></DictTag>
  46. </template>
  47. </vxe-column>
  48. </vxe-table>
  49. </div>
  50. </div>
  51. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
  52. </div>
  53. </template>
  54. <template #footer>
  55. <el-button @click="close">取消</el-button>
  56. <el-button type="primary" @click="submitForm">确认提交</el-button>
  57. </template>
  58. </vxe-modal>
  59. </template>
  60. <script setup name="ChooseExpert" lang="ts">
  61. import { expertGroupCount, expertList } from '@/api/authority';
  62. import { addOriginCpy, listByPage } from '@/api/price/station';
  63. import { colNoData } from '@/utils/noData';
  64. import { propTypes } from '@/utils/propTypes';
  65. const emit = defineEmits(['update:show', 'close', 'success', 'update:info']);
  66. const props = defineProps({
  67. title: propTypes.string.def('选择专家'),
  68. width: propTypes.number.def(1200),
  69. show: propTypes.bool.def(false),
  70. info: propTypes.any.def(null),
  71. dict: propTypes.any.def(null)
  72. });
  73. const { dm_person_type, dm_position_status, sys_sex_type } = toRefs<any>(props.dict);
  74. const dialogVisible = ref(false);
  75. const { query }: any = useRoute();
  76. const router = useRouter();
  77. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  78. const list = ref<any[]>([]);
  79. const loading = ref(true);
  80. const total = ref(0);
  81. const queryFormRef = ref<ElFormInstance>();
  82. const data = reactive<any>({
  83. queryParams: {
  84. pageNum: 1,
  85. pageSize: 10,
  86. status: 1,
  87. queryPersonType: props.info?.personType || null,
  88. }
  89. });
  90. const formRef = ref<ElFormInstance>();
  91. const itemsData = ref<any[]>([]); // 树数据
  92. const treeItemsRef = ref<any>();
  93. const { queryParams, form, rules } = toRefs(data);
  94. /** 查询会员信息列表 */
  95. const getList = async () => {
  96. loading.value = true;
  97. const res = await expertList({ ...queryParams.value });
  98. list.value = res.rows;
  99. total.value = res.total;
  100. loading.value = false;
  101. };
  102. /** 搜索按钮操作 */
  103. const handleQuery = (level?: any) => {
  104. queryParams.value.pageNum = 1;
  105. getList();
  106. };
  107. const itemsClick = (node: any) => {
  108. queryParams.value.queryPersonType = node.type;
  109. currentNodeKey.value = node.type;
  110. handleQuery();
  111. };
  112. /** 重置按钮操作 */
  113. const resetQuery = () => {
  114. queryFormRef.value?.resetFields();
  115. queryParams.value.startDate = '';
  116. queryParams.value.endDate = '';
  117. handleQuery();
  118. };
  119. const currentNodeKey = ref<any>(null); // 当前选中节点
  120. const close = () => {
  121. // formRef.value?.resetFields();
  122. emit('update:show', false);
  123. emit('close', false);
  124. };
  125. const tableRef = ref<any>();
  126. const submitForm = async () => {
  127. const records = tableRef.value?.getCheckboxReserveRecords(true).concat(tableRef.value?.getCheckboxRecords());
  128. if (!records.length) {
  129. proxy?.$modal.msgWarning('请选择专家');
  130. return;
  131. }
  132. if (records.length > props.info?.personCount) {
  133. proxy?.$modal.msgWarning(`最多只能选择${props.info?.personCount}个专家`);
  134. return;
  135. }
  136. emit('update:info', {
  137. ...props.info,
  138. personInfos: [...records]
  139. })
  140. emit('success', records);
  141. close();
  142. };
  143. // 获取专家统计数据
  144. const getExpertGroupCount = async () => {
  145. const res = await expertGroupCount();
  146. if (res?.code === 200) {
  147. itemsData.value = res.data;
  148. }
  149. };
  150. const checkRowKeys = ref<any>([]);
  151. watch(
  152. () => props.show,
  153. (val) => {
  154. dialogVisible.value = val;
  155. if (val) {
  156. checkRowKeys.value = props.info?.personInfos.map((item: any) => item.id) || [];
  157. currentNodeKey.value = props.info?.personType || null;
  158. getExpertGroupCount();
  159. getList();
  160. }
  161. },
  162. { immediate: true }
  163. );
  164. </script>
  165. <style lang="scss" scoped>
  166. .tree-wrap {
  167. width: 310px;
  168. box-sizing: border-box;
  169. border: 1px solid #ebeef5;
  170. padding: 16px;
  171. }
  172. .check-node-key {
  173. color: var(--el-color-primary);
  174. background-color: var(--el-color-primary-light-9);
  175. }
  176. </style>