recommendPost.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <template>
  2. <ion-page class="list-page">
  3. <ion-header class="header-theme2">
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>岗位推荐</ion-title>
  9. </ion-toolbar>
  10. </ion-header>
  11. <ion-content>
  12. <ion-item class="search-item">
  13. <ion-label>
  14. <h2>{{ searchParams.jobUserName }}</h2>
  15. <br/>
  16. <h2>{{ searchParams.professionName }}</h2>
  17. </ion-label>
  18. <ion-button id="popover-checkbox" @click="popoverCheckboxIsOpen = true" slot="end"
  19. style="height: 33px;width: 90px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;">招聘岗位筛选
  20. </ion-button>
  21. <ion-popover size="auto" trigger="popover-checkbox" :is-open="popoverCheckboxIsOpen" :backdrop-dismiss="false"
  22. :dismiss-on-select="false">
  23. <ion-content>
  24. <ion-list>
  25. <ion-item v-for="(record,key) in recommendWhereList" :key="key">
  26. <ion-checkbox :detail="false" v-model="record.check" label-placement="end">{{ record.name }}
  27. </ion-checkbox>
  28. </ion-item>
  29. <ion-item>
  30. <ion-button @click="onRestRecommendWhere" slot="end" fill="clear" size="small">重置</ion-button>
  31. <ion-button @click="onPopoverConfirm" slot="end" size="small">确定</ion-button>
  32. </ion-item>
  33. </ion-list>
  34. </ion-content>
  35. </ion-popover>
  36. </ion-item>
  37. <div class="bw-vue-list">
  38. <div class="list-content">
  39. <ion-list>
  40. <ion-item v-for="(record,key) in dataList" :key="key" :role="key">
  41. <ion-label>
  42. <h2>{{ record.professionName }}</h2>
  43. <p>单位:{{ record.companyName }}</p>
  44. <div class="multi-title">
  45. <p>
  46. 学历:{{ record.cultureRankName }}
  47. </p>
  48. <p>
  49. 工作年限:{{ record.workYearName }}
  50. </p>
  51. </div>
  52. <p>薪资待遇:{{ record.minSalary }}至{{ record.maxSalary }}元</p>
  53. </ion-label>
  54. <ion-avatar aria-hidden="true" class="container" slot="end">
  55. <ion-button size="small" @click="onRecommend(record)" fill="outline">推荐</ion-button>
  56. </ion-avatar>
  57. </ion-item>
  58. </ion-list>
  59. </div>
  60. </div>
  61. <b-empty v-if="dataList.length<=0" :loading="loading"/>
  62. <ion-infinite-scroll threshold="50px" @ionInfinite="onScroll($event)">
  63. <ion-infinite-scroll-content
  64. :loadingText="pagination.total>pagination.pageIndex*pagination.pageSize?'正在加载...':'暂无更多'"
  65. loadingSpinner="bubbles">
  66. </ion-infinite-scroll-content>
  67. </ion-infinite-scroll>
  68. </ion-content>
  69. <ion-footer>
  70. <ion-button shape="round" expand="block" @click="onBatchRecommend">全部推荐</ion-button>
  71. </ion-footer>
  72. </ion-page>
  73. </template>
  74. <script lang="ts">
  75. import {useRoute, useRouter} from "vue-router";
  76. import {computed, defineComponent, reactive, ref} from 'vue';
  77. import {arrowBackOutline, addCircleOutline} from 'ionicons/icons';
  78. import {alertController, IonIcon, onIonViewDidEnter} from '@ionic/vue';
  79. import {getRecommendCompanyPostList, addRecommend} from "@/api/recommendmgt";
  80. import {getSysDictionaryList} from "@/api/system/dictionary";
  81. import BEmpty from "@/components/empty.vue";
  82. export default defineComponent({
  83. name: 'RecommendJobList',
  84. components: {IonIcon, BEmpty},
  85. setup() {
  86. const loading = ref(true);
  87. const router = useRouter();
  88. const route = useRoute();
  89. const total = ref(10);
  90. const pagination = computed(() => ({
  91. total: total,
  92. pageIndex: searchParams.pageIndex,
  93. pageSize: searchParams.pageSize
  94. }));
  95. const searchParams = reactive({
  96. pageIndex: 1,
  97. pageSize: 5,
  98. jobHuntID: '',
  99. professionID: '',
  100. jobUserName: '',
  101. professionName: '',
  102. type: 0,
  103. parentProfessionID: '',
  104. cultureRank: null,
  105. workYear: null,
  106. minSalary: null,
  107. maxSalary: null
  108. })
  109. const searchParamsCache = reactive({
  110. professionID: '',
  111. parentProfessionID: '',
  112. cultureRank: null,
  113. workYear: null,
  114. minSalary: null,
  115. maxSalary: null
  116. });
  117. const dataList = ref<any>([]);
  118. const addRecommendList = ref<any>([]);
  119. const recommendWhereList = ref<any>([]);
  120. const popoverCheckboxIsOpen = ref<boolean>(false);
  121. const getRecommendTypeList = () => {
  122. getSysDictionaryList('RecommendPostWhere').then((data) => {
  123. recommendWhereList.value = data;
  124. recommendWhereList.value[0].check = true;
  125. });
  126. };
  127. const loadData = async function () {
  128. loading.value = true;
  129. searchParams.jobHuntID = route.query.jobHuntID as any;
  130. searchParams.jobUserName = route.query.jobUserName as any;
  131. searchParams.professionID = route.query.professionID as any;
  132. searchParams.professionName = route.query.professionName as any;
  133. searchParams.type = route.query.type as any;
  134. getRecommendCompanyPostList(searchParams).then((data: any) => {
  135. dataList.value = dataList.value.concat(data.list);
  136. total.value = data.total;
  137. });
  138. loading.value = false;
  139. }
  140. const onPopoverConfirm = () => {
  141. const list = recommendWhereList.value.filter((x: any) => x.check == true).map((x: any) => x.value);
  142. searchParams.professionID = list.findIndex((x: any) => x == 1) >= 0 ? searchParamsCache.professionID : "";
  143. searchParams.cultureRank = list.findIndex((x: any) => x == 2) >= 0 ? searchParamsCache.cultureRank : null;
  144. searchParams.workYear = list.findIndex((x: any) => x == 3) >= 0 ? searchParamsCache.workYear : null;
  145. if (list.findIndex((x: any) => x == 4) >= 0) {
  146. searchParams.minSalary = searchParamsCache.minSalary;
  147. searchParams.maxSalary = searchParamsCache.maxSalary;
  148. } else {
  149. searchParams.minSalary = null;
  150. searchParams.maxSalary = null;
  151. }
  152. searchParams.parentProfessionID = list.findIndex((x: any) => x == 5) >= 0 ? searchParamsCache.parentProfessionID : "";
  153. popoverCheckboxIsOpen.value = false;
  154. reload();
  155. }
  156. const onRestRecommendWhere = () => {
  157. recommendWhereList.value.map((x: any) => x.check = false);
  158. recommendWhereList.value[0].check = true;
  159. }
  160. const onRecommend = (item: any) => {
  161. addRecommendList.value.push({
  162. recommendMgtID: item.recommendMgtID,
  163. postID: item.postID,
  164. jobHuntID: searchParams.jobHuntID,
  165. recommendType: 0
  166. });
  167. addRecommend(addRecommendList.value).then(() => {
  168. const index = dataList.value.findIndex((x: any) => x.recommendMgtID == item.recommendMgtID);
  169. dataList.value.splice(index, 1)
  170. addRecommendList.value = [];
  171. });
  172. };
  173. const onBatchRecommend = () => {
  174. if (dataList.value.length == 0) {
  175. presentAlert("没有需要推荐的求职人员!")
  176. return;
  177. }
  178. dataList.value.forEach((item: any) => {
  179. addRecommendList.value.push({
  180. recommendMgtID: item.recommendMgtID,
  181. postID: item.postID,
  182. jobHuntID: searchParams.jobHuntID,
  183. recommendType: 0
  184. });
  185. })
  186. addRecommend(addRecommendList.value).then(() => {
  187. loadData();
  188. dataList.value = [];
  189. addRecommendList.value = [];
  190. });
  191. };
  192. const presentAlert = async (message: string) => {
  193. const alert = await alertController.create({
  194. header: '错误!',
  195. message: message,
  196. buttons: [
  197. '确定'
  198. ],
  199. });
  200. await alert.present();
  201. }
  202. const onBack = () => {
  203. router.push({path: './list', query: {}});
  204. }
  205. const reload = () => {
  206. dataList.value = [];
  207. searchParams.pageIndex = 1;
  208. loadData();
  209. }
  210. const onScroll = (e: any) => {
  211. setTimeout(() => {
  212. if (pagination.value.total.value > pagination.value.pageIndex * pagination.value.pageSize) {
  213. searchParams.pageIndex += 1;
  214. loadData();
  215. }
  216. e.target.complete();
  217. }, 500);
  218. }
  219. const reloadSearchParams = () => {
  220. searchParams.jobHuntID = route.query.jobHuntID as any;
  221. searchParams.jobUserName = route.query.jobUserName as any;
  222. searchParams.professionID = route.query.professionID as any;
  223. searchParams.professionName = route.query.professionName as any;
  224. searchParams.type = route.query.type as any;
  225. searchParams.parentProfessionID = "";
  226. searchParams.cultureRank = null;
  227. searchParams.workYear = null;
  228. searchParams.minSalary = null;
  229. searchParams.maxSalary = null;
  230. searchParamsCache.professionID = route.query.professionID as any;
  231. searchParamsCache.parentProfessionID = route.query.parentProfessionID as any;
  232. searchParamsCache.cultureRank = route.query.cultureRank as any;
  233. searchParamsCache.workYear = route.query.workYear as any;
  234. searchParamsCache.minSalary = route.query.minSalary as any;
  235. searchParamsCache.maxSalary = route.query.maxSalary as any;
  236. }
  237. onIonViewDidEnter(() => {
  238. getRecommendTypeList();
  239. reloadSearchParams();
  240. reload();
  241. });
  242. return {
  243. arrowBackOutline,
  244. addCircleOutline,
  245. router,
  246. route,
  247. loading,
  248. pagination,
  249. searchParams,
  250. dataList,
  251. recommendWhereList,
  252. popoverCheckboxIsOpen,
  253. onScroll,
  254. loadData,
  255. reload,
  256. onBack,
  257. onRecommend,
  258. onBatchRecommend,
  259. getRecommendTypeList,
  260. onPopoverConfirm,
  261. onRestRecommendWhere,
  262. }
  263. }
  264. });
  265. </script>
  266. <style lang="less">
  267. .footer-ios ion-toolbar:first-of-type {
  268. --border-width: 0 !important;
  269. --background: #ffffff !important;
  270. }
  271. </style>