recommend.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <template>
  2. <a-modal
  3. :width="1300"
  4. v-model:visible="visible"
  5. :title="title"
  6. :confirm-loading="confirmLoading"
  7. @ok="handleOk"
  8. ok-text="确认"
  9. cancel-text="取消"
  10. :keyboard="false"
  11. :mask-closable="false"
  12. >
  13. <div class="card-search">
  14. <a-form
  15. ref="formRef"
  16. name="advanced_search"
  17. class="ant-advanced-search-form"
  18. :model="searchParams"
  19. >
  20. <a-row :gutter="24">
  21. <a-col :span="6">
  22. <a-form-item label="招聘企业" :label-col="{ span: 8 }" name="companyName">
  23. <a-input v-model:value="searchParams.companyName" style="color: black;" disabled="true" placeholder=""/>
  24. </a-form-item>
  25. </a-col>
  26. <a-col :span="6">
  27. <a-form-item label="招聘岗位" :label-col="{ span: 8 }" name="professionName">
  28. <a-input v-model:value="searchParams.professionName" style="color: black;" disabled="true"
  29. placeholder=""/>
  30. </a-form-item>
  31. </a-col>
  32. <a-col :span="7"></a-col>
  33. <a-col :span="5" style="text-align: left">
  34. <a-button type="primary" html-type="submit" @click="onSearch">查询</a-button>
  35. <a-button
  36. style="margin: 0 8px"
  37. @click="
  38. () => {
  39. searchParams.pageIndex = 1;
  40. searchParams.pageSize = 10;
  41. searchParams.companyName = null;
  42. loadData();
  43. }
  44. ">重置
  45. </a-button>
  46. <a style="font-size: 12px" @click="expand = !expand">
  47. <template v-if="expand">
  48. <UpOutlined/>
  49. </template>
  50. <template v-else>
  51. <DownOutlined/>
  52. </template>
  53. {{ expand ? '收缩' : '展开' }}
  54. </a>
  55. </a-col>
  56. </a-row>
  57. <a-row :gutter="24" v-show="expand">
  58. <a-col :span="6">
  59. <a-form-item label="求职人员姓名" :label-col="{ span: 8 }" name="userName">
  60. <a-input v-model:value="searchParams.userName" placeholder=""/>
  61. </a-form-item>
  62. </a-col>
  63. <a-col :span="6">
  64. <a-form-item label="学历选择" :label-col="{span:6}" name="cultureLevel">
  65. <a-select
  66. ref="select"
  67. v-model:value="searchParams.cultureLevel"
  68. :options="cultureLevelList"
  69. :field-names="{ label: 'name', value: 'value' }"
  70. :allow-clear="true"
  71. @change="loadData"
  72. >
  73. </a-select>
  74. </a-form-item>
  75. </a-col>
  76. <a-col :span="6">
  77. <a-form-item label="重点人员类别" :label-col="{span:6}" name="cultureLevel">
  78. <a-select
  79. ref="select"
  80. v-model:value="searchParams.keyPersonType"
  81. :options="keyPersonTypeList"
  82. :field-names="{ label: 'name', value: 'value' }"
  83. :allow-clear="true"
  84. @change="loadData"
  85. >
  86. </a-select>
  87. </a-form-item>
  88. </a-col>
  89. </a-row>
  90. <a-row class="edit-operation">
  91. <a-col :span="24" style="text-align: right">
  92. <a-button type="primary" html-type="submit" v-if="searchParams.type===0" functioncode="T01030202" @click='onBatchRecommend()'>批量推荐
  93. </a-button>
  94. </a-col>
  95. </a-row>
  96. </a-form>
  97. <div class="search-result-list">
  98. <a-table :columns="columns" :data-source="dataList" :scroll="{ x: '100%', y: 500 }" :pagination="pagination"
  99. :loading="formState.loading"
  100. :row-selection="{ selectedRowKeys: formState.selectedRowKeys, onChange: onSelectChange }"
  101. :row-key="(record) => record.recommendMgtID" bordered @change="handleTableChange">
  102. <template #bodyCell="{ column, text, record }">
  103. <template v-if="searchParams.type===0 && column.key === 'operation'">
  104. <div class="table-operation">
  105. <a-button type="link" size="small" @click='onRecommend(record)'>推荐
  106. </a-button>
  107. </div>
  108. </template>
  109. </template>
  110. </a-table>
  111. </div>
  112. </div>
  113. </a-modal>
  114. </template>
  115. <script lang="ts">
  116. import {reactive, ref, computed, defineComponent} from 'vue';
  117. import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
  118. import {getRecommendJobList, addRecommend} from '@/api/jobUserManager/recommendMgt';
  119. import {getPaginationTotalTitle} from '@/utils/common';
  120. import type {SelectProps} from "ant-design-vue";
  121. import {getSysDictionaryList} from "@/api/system/dictionary";
  122. import {message} from "ant-design-vue";
  123. export default defineComponent({
  124. name: 'RecommendJobList',
  125. setup() {
  126. const visible = ref<boolean>(false);
  127. const confirmLoading = ref<boolean>(false);
  128. const formRef = ref<FormInstance>();
  129. const expand = ref(true);
  130. const title = ref<string>('');
  131. const searchParams = reactive({
  132. pageIndex: 1,
  133. pageSize: 10,
  134. postID: null,
  135. userName: '',
  136. companyName: '',
  137. professionID: '',
  138. professionName: null,
  139. cultureLeve: null,
  140. keyPersonType: null,
  141. type: null
  142. });
  143. const formState = reactive({
  144. total: 0,
  145. selectedRowKeys: [],
  146. loading: false,
  147. });
  148. const cultureLevelList = ref<SelectProps['options']>();
  149. const keyPersonTypeList = ref<SelectProps['options']>();
  150. const columns: TableColumnsType = [
  151. {
  152. title: '序号',
  153. align: 'center',
  154. width: 80,
  155. key: 'recommendMgtID',
  156. customRender: (item) =>
  157. `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
  158. },
  159. {title: '求职人员姓名', dataIndex: 'userName', key: 'userName', width: 100, align: "center",},
  160. {title: '联系电话', dataIndex: 'userMobile', key: 'userMobile', width: 150, align: "center",},
  161. {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', width: 150, align: "center",},
  162. {title: '文化程度', dataIndex: 'culturerankName', key: 'culturerankName', width: 150, align: "center",},
  163. {title: '重点人员类别', dataIndex: 'keypersontypeName', key: 'keypersontypeName', width: 150, align: "center",},
  164. {title: '操作', key: 'operation', width: 60, align: 'center'},
  165. ];
  166. const pagination = computed(() => ({
  167. total: formState.total,
  168. current: searchParams.pageIndex,
  169. pageSize: searchParams.pageSize,
  170. showSizeChanger: true,
  171. showTotal: (total) => getPaginationTotalTitle(total),
  172. }));
  173. const dataList = ref([]);
  174. const addRecommendList = ref([] as any);
  175. const onSelectChange = (selectedRowKeys: any) => {
  176. console.log(selectedRowKeys)
  177. formState.selectedRowKeys = selectedRowKeys;
  178. };
  179. const handleTableChange: TableProps['onChange'] = (pag: {
  180. pageSize: number;
  181. current: number;
  182. }) => {
  183. searchParams.pageIndex = pag.current;
  184. searchParams.pageSize = pag.pageSize;
  185. loadData();
  186. };
  187. const onSearch = () => {
  188. loadData();
  189. }
  190. const loadData = async function () {
  191. formState.loading = true;
  192. const result: any = await getRecommendJobList(searchParams);
  193. dataList.value = result.list;
  194. formState.total = result.total;
  195. formState.loading = false;
  196. };
  197. const show = (professionID: any, professionName: any, postID: any, companyName: any, type: any, titleName: string) => {
  198. visible.value = true;
  199. title.value = titleName;
  200. searchParams.postID = postID;
  201. searchParams.companyName = companyName;
  202. searchParams.professionID = professionID;
  203. searchParams.professionName = professionName;
  204. searchParams.type = type;
  205. loadData();
  206. }
  207. const onRecommend = (item: any) => {
  208. addRecommendList.value.push({
  209. recommendMgtID: item.recommendMgtID,
  210. jobHuntID: item.jobhuntID,
  211. postID: searchParams.postID,
  212. recommendType: 0
  213. });
  214. addRecommend(addRecommendList.value).then(() => {
  215. loadData();
  216. addRecommendList.value = [];
  217. });
  218. };
  219. const onBatchRecommend = () => {
  220. if (formState.selectedRowKeys.length == 0) {
  221. message.warn("请选择需要推荐的求职人员!")
  222. return;
  223. }
  224. formState.selectedRowKeys.forEach(id => {
  225. const item: any = dataList.value.find((x: any) => x.recommendMgtID == id)
  226. if (item) {
  227. addRecommendList.value.push({
  228. recommendMgtID: item.recommendMgtID,
  229. jobHuntID: item.jobhuntID,
  230. postID: searchParams.postID,
  231. recommendType: 0
  232. });
  233. }
  234. })
  235. addRecommend(addRecommendList.value).then(() => {
  236. loadData();
  237. addRecommendList.value = [];
  238. });
  239. };
  240. const handleOk = () => {
  241. visible.value = false;
  242. };
  243. const handleCancel = () => {
  244. visible.value = false;
  245. };
  246. const getCultureLevelList = () => {
  247. getSysDictionaryList('CultureLevel').then((data) => {
  248. cultureLevelList.value = data;
  249. });
  250. };
  251. const getKeyPersonTypeList = () => {
  252. getSysDictionaryList('KeyPersonType').then((data) => {
  253. keyPersonTypeList.value = data;
  254. });
  255. };
  256. return {
  257. title,
  258. visible,
  259. confirmLoading,
  260. formRef,
  261. expand,
  262. searchParams,
  263. formState,
  264. columns,
  265. pagination,
  266. dataList,
  267. cultureLevelList,
  268. addRecommendList,
  269. keyPersonTypeList,
  270. show,
  271. onSearch,
  272. onRecommend,
  273. onBatchRecommend,
  274. onSelectChange,
  275. handleTableChange,
  276. loadData,
  277. getCultureLevelList,
  278. getKeyPersonTypeList,
  279. handleOk,
  280. handleCancel
  281. };
  282. },
  283. created() {
  284. }
  285. });
  286. </script>
  287. <style lang="less" scoped></style>