recruitInformationInfo-list.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">基础信息管理</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. 招聘信息管理
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form ref="queryForm" :model="queryModel" inline class="demo-form-inline">
  17. <el-form-item label="企业名称" prop="name">
  18. <el-input type="text" size="mini" v-model="queryModel.name"></el-input>
  19. </el-form-item>
  20. <el-form-item label="行业" prop="intendedIndustries">
  21. <el-select v-model="queryModel.intendedIndustries" size="mini" filterable placeholder="请选择" clearable>
  22. <el-option
  23. v-for="result in intendedIndustriesList"
  24. :key="result.id"
  25. :label="result.name"
  26. :value="result.value"
  27. ></el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item label="职位名称" prop="positionName">
  31. <el-input type="text" size="mini" v-model="queryModel.positionName"></el-input>
  32. </el-form-item>
  33. <el-form-item label="结算方式" prop="method">
  34. <el-select v-model="queryModel.method" size="mini" filterable placeholder="请选择" clearable>
  35. <el-option
  36. v-for="result in methodList"
  37. :key="result.id"
  38. :label="result.name"
  39. :value="result.value"
  40. ></el-option>
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item label="工作地区" prop="workArea">
  44. <el-input type="text" size="mini" v-model="queryModel.workArea"></el-input>
  45. </el-form-item>
  46. <el-form-item label="审核状态" prop="status">
  47. <el-select v-model="queryModel.status" size="mini" filterable placeholder="请选择" clearable>
  48. <el-option
  49. v-for="result in statusList"
  50. :key="result.id"
  51. :label="result.name"
  52. :value="result.value"
  53. ></el-option>
  54. </el-select>
  55. </el-form-item>
  56. <el-form-item label="是否置顶" prop="isTopping">
  57. <el-select v-model="queryModel.isTopping" size="mini" filterable placeholder="请选择" clearable>
  58. <el-option
  59. v-for="result in isToppingList"
  60. :key="result.id"
  61. :label="result.name"
  62. :value="result.value"
  63. ></el-option>
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="是否上架" prop="isOnline">
  67. <el-select v-model="queryModel.isOnline" size="mini" filterable placeholder="请选择" clearable>
  68. <el-option
  69. v-for="result in isOnlineList"
  70. :key="result.id"
  71. :label="result.name"
  72. :value="result.value"
  73. ></el-option>
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item>
  77. <el-button
  78. type="primary"
  79. size="mini"
  80. icon="ios-search"
  81. @click="changePage(1)"
  82. :loading="loading"
  83. >查询</el-button>&nbsp;
  84. <el-button
  85. type="info"
  86. size="mini"
  87. style="margin-left: 8px"
  88. @click="handleReset('queryForm')"
  89. >重置</el-button>&nbsp;
  90. </el-form-item>
  91. </el-form>
  92. <el-divider></el-divider>
  93. <el-row class="button-group">
  94. <el-button type="primary" size="small" plain icon="el-icon-circle-plus" @click="handleAdd">新增</el-button>
  95. <el-button
  96. type="primary"
  97. size="small"
  98. plain
  99. icon="el-icon-remove"
  100. :disabled="multipleSelection.length==0"
  101. @click="handleBatchDelete"
  102. >删除选中项</el-button>
  103. <el-button
  104. type="primary"
  105. size="small"
  106. plain
  107. icon="el-icon-upload"
  108. @click="batchImportVisible = true"
  109. >导入</el-button>
  110. <el-button
  111. type="primary"
  112. size="small"
  113. plain
  114. icon="el-icon-upload2"
  115. @click="exportXls"
  116. >导出数据</el-button>
  117. </el-row>
  118. <el-table
  119. :data="tableData"
  120. v-loading="loading"
  121. stripe
  122. @sort-change="sortChange"
  123. @selection-change="handleSelectionChange"
  124. :key="timeStamp"
  125. >
  126. <el-table-column type="selection" width="55"></el-table-column>
  127. <el-table-column prop="enterpriseName" label="企业名称" width="200">
  128. <template slot-scope="{row}">
  129. <span>{{row.enterpriseName}}</span>
  130. </template>
  131. </el-table-column>
  132. <el-table-column prop="industryN" label="行业"></el-table-column>
  133. <el-table-column prop="positionName" label="职位名称" width="180"></el-table-column>
  134. <el-table-column prop="salary" label="薪资待遇"></el-table-column>
  135. <el-table-column prop="settlementMethodN" label="结算方式"></el-table-column>
  136. <el-table-column prop="ageRequirement" label="年龄要求"></el-table-column>
  137. <el-table-column prop="recruitingNumbers" label="招聘人数"></el-table-column>
  138. <el-table-column prop="contacts" label="联系人"></el-table-column>
  139. <el-table-column prop="contactsPhone" label="联系电话" width="120"></el-table-column>
  140. <el-table-column prop="workArea" label="工作地区"></el-table-column>
  141. <el-table-column prop="address" label="详细地址" width="200"></el-table-column>
  142. <el-table-column prop="browseNumber" label="浏览次数"></el-table-column>
  143. <el-table-column prop="status" label="审核状态">
  144. <template slot-scope="{row}">
  145. <span v-if="row.status=='0'" style="color: #F56C6C;">未审核</span>
  146. <span v-else-if="row.status=='1'" style="color: #67C23A;">已审核</span>
  147. </template>
  148. </el-table-column>
  149. <el-table-column prop="isTopping" label="是否置顶">
  150. <template slot-scope="{row}">
  151. <span v-if="row.isTopping">
  152. 已置顶
  153. </span>
  154. </template>
  155. </el-table-column>
  156. <el-table-column prop="isOnline" label="是否上架">
  157. <template slot-scope="{row}">
  158. <span v-if="row.isOnline">
  159. <el-link type="success" @click="handleChangeIsOnline(row)">上架</el-link>
  160. </span>
  161. <span v-else>
  162. <el-link type="info" @click="handleChangeIsOnline(row)">下架</el-link>
  163. </span>
  164. </template>
  165. </el-table-column>
  166. <el-table-column label="操作" fixed="right" width="450">
  167. <template slot-scope="{row}">
  168. <el-button class="btu1" size="mini" type="warning" @click="handleEdit(row)">编辑</el-button>
  169. <el-button class="btu1" v-if="row.status=='0'" size="mini" type="primary" @click="handleCheck(row)">审核</el-button>
  170. <el-button class="btu1" size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
  171. <el-button class="btu1" v-if="row.isTopping" size="mini" type="info" @click="handleTopping(row)">不置顶</el-button>
  172. <el-button class="btu1" v-else size="mini" type="info" @click="handleTopping(row)">置顶</el-button>
  173. <el-badge v-if="row.isReadNumber!=0" :value="row.isReadNumber" class="item">
  174. <el-button size="mini" type="success" @click="handleRelation(row)">收到报名</el-button>
  175. </el-badge>
  176. <el-button v-else size="mini" type="success" @click="handleRelation(row)">收到报名</el-button>
  177. <!-- <el-link type="warning" @click="handleEdit(row)">编辑-</el-link>
  178. <el-link type="primary" v-if="row.status=='0'" @click="handleCheck(row)">审核-</el-link>
  179. <el-link type="danger" @click="handleDelete(row)">删除-</el-link>
  180. <el-badg v-if="row.isReadNumber!=0" :value="row.isReadNumber">
  181. <el-link type="success" @click="handleRelation(row)">收到报名</el-link>
  182. </el-badg>
  183. <el-link v-else type="success" @click="handleRelation(row)">收到报名</el-link> -->
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <el-pagination
  188. :current-page.sync="pageIndex"
  189. :total="totalElements"
  190. :page-sizes="pageSizeList"
  191. @current-change="changePage"
  192. @size-change="pageSizeChange"
  193. layout="total, sizes, prev, pager, next, jumper"
  194. ></el-pagination>
  195. <enterpriseInfo-detail
  196. v-if="showModal"
  197. ref="userDetail"
  198. :businessKey="businessKey"
  199. :title="modalTitle"
  200. @close="onDetailModalClose"
  201. ></enterpriseInfo-detail>
  202. <recruitPersonRelation-list
  203. v-if="showModal2"
  204. :businessKey="businessKey"
  205. :title="modalTitle2"
  206. @close="onDetailModalClose2"
  207. ></recruitPersonRelation-list>
  208. <recruitInformationInfo-detail
  209. v-if="showModal3"
  210. :businessKey="businessKey"
  211. :title="modalTitle3"
  212. @close="onDetailModalClose3"
  213. ></recruitInformationInfo-detail>
  214. <el-dialog
  215. title="批量导入企业"
  216. :visible.sync="batchImportVisible"
  217. :modal-append-to-body="false"
  218. style="text-align: left"
  219. :close-on-click-modal="false"
  220. >
  221. <el-form label-width="150px">
  222. <el-form-item label="模板下载">
  223. <el-link
  224. href="https://oss.xiaoxinda.com/jk-temporary-workers/recruitInformationInfo.xls"
  225. type="primary"
  226. target="_blank"
  227. >点击下载模板</el-link
  228. >
  229. </el-form-item>
  230. <el-form-item label="上传文件">
  231. <el-upload
  232. class="upload-demo"
  233. accept=".xls"
  234. :action="uploadUrlXls"
  235. :data="uploadXlsData"
  236. :headers="headers"
  237. :on-preview="handleBatchImportPreview"
  238. name="uploadFile"
  239. :multiple="true"
  240. :limit="1"
  241. :on-remove="handleBatchImportRemove"
  242. :before-remove="beforeBatchImportRemove"
  243. :before-upload="beforeUpload"
  244. :on-exceed="handleBatchImportExceed"
  245. :on-success="handleBatchImportSuccess"
  246. :file-list="batchImportFileList"
  247. >
  248. <el-button size="small" type="primary" :loading="xlsLoading"
  249. >点击上传</el-button
  250. >
  251. <div slot="tip" class="el-upload__tip">
  252. 只能上传xls文件,且不超过500kb
  253. </div>
  254. </el-upload>
  255. </el-form-item>
  256. </el-form>
  257. <div slot="footer" class="dialog-footer">
  258. <el-button type="primary" @click="batchImportVisible = false"
  259. >关 闭</el-button
  260. >
  261. </div>
  262. </el-dialog>
  263. </div>
  264. </template>
  265. <script>
  266. import Constant from "@/constant";
  267. import recruitInformationInfoApi from "@/api/base/recruitInformationInfo";
  268. import enterpriseInfoDetail from "./enterpriseInfo-detail";
  269. import recruitPersonRelationList from "./recruitPersonRelation-list";
  270. import recruitInformationInfoDetail from "./recruitInformationInfo-detail";
  271. import dataDictionaryApi from "@/api/sys/dataDictionary";
  272. import { getToken } from "@/utils/auth"; // get token from cookie
  273. export default {
  274. name: 'baseRecruitInformationInfoList',
  275. data() {
  276. var self = this;
  277. return {
  278. queryModel: {
  279. name: "",
  280. positionName:"",
  281. intendedIndustries:"",
  282. method:"",
  283. status:"",
  284. workArea:"",
  285. isOnline:"",
  286. isTopping:"",
  287. },
  288. loading: false,
  289. tableData: [],
  290. pageIndex: 1,
  291. pageSize: 10,
  292. totalPages: 0,
  293. totalElements: 0,
  294. field: "",
  295. direction: "",
  296. pageSizeList: [10, 20, 30],
  297. multipleSelection: [],
  298. modalTitle: "",
  299. modalTitle2: "",
  300. modalTitle3: "",
  301. businessKey: "",
  302. showModal: false,
  303. showModal2:false,
  304. showModal3:false,
  305. dialogFormVisible:false,
  306. newPassword:"",
  307. intendedIndustriesList:[],
  308. methodList:[],
  309. statusList:[
  310. {
  311. "id":"0",
  312. "name":"未审核",
  313. "value":"0"
  314. },
  315. {
  316. "id":"1",
  317. "name":"已审核",
  318. "value":"1"
  319. }
  320. ],
  321. props: {
  322. // 配置项(必选)
  323. value: "id",
  324. label: "name",
  325. children: "children"
  326. },
  327. batchImportVisible: false,
  328. xlsLoading: false,
  329. batchImportFileList: [],
  330. uploadUrlXls: Constant.serverUrl + "/base/recruitInformationInfo/importXls",
  331. uploadXlsData: {
  332. subFolder: "recruitInformationInfo",
  333. },
  334. headers: {
  335. Authorization: getToken(),
  336. },
  337. timeStamp:"",
  338. isToppingList:[
  339. {
  340. "id":"0",
  341. "name":"未置顶",
  342. "value":"0"
  343. },
  344. {
  345. "id":"1",
  346. "name":"已置顶",
  347. "value":"1"
  348. }
  349. ],
  350. isOnlineList:[
  351. {
  352. "id":"0",
  353. "name":"下架",
  354. "value":"0"
  355. },
  356. {
  357. "id":"1",
  358. "name":"上架",
  359. "value":"1"
  360. }
  361. ]
  362. };
  363. },
  364. created() {
  365. dataDictionaryApi.findByCatalogName({catalogName: "意向行业",})
  366. .then((response) => {
  367. var jsonData = response.data;
  368. this.intendedIndustriesList = jsonData.data;
  369. });
  370. dataDictionaryApi.findByCatalogName({catalogName: "结算方式",})
  371. .then((response) => {
  372. var jsonData = response.data;
  373. this.methodList = jsonData.data;
  374. });
  375. },
  376. methods: {
  377. changePage(pageIndex,exportFlag) {
  378. var self = this;
  379. console.log(pageIndex);
  380. self.pageIndex = pageIndex;
  381. var formData = new FormData();
  382. formData.append("pageIndex", self.pageIndex);
  383. if(exportFlag!=null){
  384. formData.append("exportFlag", exportFlag);
  385. formData.append("pageSize", 10000);
  386. }
  387. else{
  388. formData.append("pageSize", self.pageSize);
  389. }
  390. formData.append("name", self.queryModel.name);
  391. formData.append("positionName", self.queryModel.positionName);
  392. formData.append("intendedIndustries", self.queryModel.intendedIndustries);
  393. formData.append("method", self.queryModel.method);
  394. formData.append("status", self.queryModel.status);
  395. formData.append("workArea", self.queryModel.workArea);
  396. formData.append("isOnline", self.queryModel.isOnline);
  397. formData.append("isTopping", self.queryModel.isTopping);
  398. self.loading = true;
  399. recruitInformationInfoApi.pageList(formData).then(function(response) {
  400. self.loading = false;
  401. var jsonData = response.data;
  402. if(jsonData.result) {
  403. if(exportFlag){
  404. //导出
  405. self.$message({
  406. showClose: true,
  407. type: "success",
  408. message: `报表已生成,<a href="${jsonData.data}">请点击链接下载</a>`,
  409. dangerouslyUseHTMLString: true,
  410. duration: 30000
  411. });
  412. }
  413. else{
  414. //分页查看
  415. var page = jsonData.data;
  416. self.tableData = page.data;
  417. self.totalPages = page.totalPages;
  418. self.totalElements = page.recordsTotal;
  419. }
  420. }
  421. else{
  422. self.$message.warning(jsonData.message);
  423. }
  424. }).catch((error)=>{
  425. self.loading = false;
  426. });
  427. },
  428. pageSizeChange(pageSize) {
  429. this.pageSize = pageSize;
  430. },
  431. sortChange(data) {
  432. this.field = data.column.field;
  433. this.direction = data.order == "ascending" ? "asc" : "desc";
  434. this.changePage(this.pageIndex);
  435. },
  436. handleSelectionChange(val) {
  437. this.multipleSelection = val;
  438. },
  439. handleReset(name) {
  440. this.$refs[name].resetFields();
  441. },
  442. handleAdd() {
  443. var self = this;
  444. self.modalTitle3 = "新增招聘信息";
  445. self.businessKey = "";
  446. self.showModal3 = true;
  447. },
  448. handleEdit(record) {
  449. var self = this;
  450. self.modalTitle3 = "编辑招聘信息";
  451. self.businessKey = record.id;
  452. self.showModal3 = true;
  453. },
  454. handleRelation(record) {
  455. var self = this;
  456. self.modalTitle2 = "收到报名列表";
  457. self.businessKey = record.id;
  458. self.showModal2 = true;
  459. },
  460. handleCheck(record){
  461. var self = this;
  462. this.$confirm("是否确认审核?", "提示", {
  463. confirmButtonText: "确定",
  464. cancelButtonText: "取消",
  465. type: "warning"
  466. }).then(() => {
  467. recruitInformationInfoApi.check(record.id).then(function(response) {
  468. var jsonData = response.data;
  469. if (jsonData.result) {
  470. // var index = self.tableData.indexOf(record);
  471. // self.tableData.splice(index, 1);
  472. self.changePage(self.pageIndex);
  473. self.$message({
  474. type: "success",
  475. message: "审核成功!"
  476. });
  477. }
  478. });
  479. });
  480. },
  481. handleChangeIsOnline(record){
  482. var self = this;
  483. recruitInformationInfoApi.changeIsOnline(record.id).then(function(response) {
  484. var jsonData = response.data;
  485. if (jsonData.result) {
  486. self.changePage(self.pageIndex);
  487. self.$message({
  488. type: "success",
  489. message: "修改成功!"
  490. });
  491. }
  492. });
  493. },
  494. handleTopping(record){
  495. var self = this;
  496. recruitInformationInfoApi.changeTopping(record.id).then(function(response) {
  497. var jsonData = response.data;
  498. if (jsonData.result) {
  499. self.changePage(self.pageIndex);
  500. self.$message({
  501. type: "success",
  502. message: "置顶成功!"
  503. });
  504. }
  505. });
  506. },
  507. handleDelete(record) {
  508. var self = this;
  509. this.$confirm("是否确认删除?", "提示", {
  510. confirmButtonText: "确定",
  511. cancelButtonText: "取消",
  512. type: "warning"
  513. }).then(() => {
  514. recruitInformationInfoApi.remove(record.id).then(function(response) {
  515. var jsonData = response.data;
  516. if (jsonData.result) {
  517. // var index = self.tableData.indexOf(record);
  518. // self.tableData.splice(index, 1);
  519. self.changePage(self.pageIndex);
  520. self.$message({
  521. type: "success",
  522. message: "删除成功!"
  523. });
  524. }
  525. });
  526. });
  527. },
  528. handleBatchDelete() {
  529. var self = this;
  530. var idList = this.multipleSelection.map(record => {
  531. return record.id;
  532. });
  533. this.$confirm("是否确认删除选中项?", "提示", {
  534. confirmButtonText: "确定",
  535. cancelButtonText: "取消",
  536. type: "warning"
  537. }).then(() => {
  538. recruitInformationInfoApi.batchRemove(idList).then(function(response) {
  539. var jsonData = response.data;
  540. if (jsonData.result) {
  541. self.changePage(self.pageIndex);
  542. self.$message({
  543. type: "success",
  544. message: "删除成功!"
  545. });
  546. }
  547. });
  548. });
  549. },
  550. exportXls() {
  551. this.changePage(1,true);
  552. },
  553. onDetailModalClose(refreshed) {
  554. this.showModal = false;
  555. if(refreshed) {
  556. this.changePage(this.pageIndex);
  557. }
  558. },
  559. onDetailModalClose2(refreshed,status) {
  560. this.showModal2 = false;
  561. if(refreshed||status) {
  562. this.changePage(this.pageIndex);
  563. }
  564. },
  565. onDetailModalClose3(refreshed) {
  566. this.showModal3 = false;
  567. if(refreshed) {
  568. this.changePage(this.pageIndex);
  569. }
  570. },
  571. beforeUpload(file, fileList) {
  572. //导入前判断
  573. var self = this;
  574. self.xlsLoading = true;
  575. return true;
  576. },
  577. //批量导入-上传成功
  578. handleBatchImportSuccess(response, file, fileList) {
  579. var self = this;
  580. self.xlsLoading = false;
  581. if (response.result) {
  582. self.$message.success(response.message);
  583. this.batchImportFileList = [];
  584. this.changePage(1);
  585. } else {
  586. //this.$message.error(response.message);
  587. this.batchImportFileList = [];
  588. this.changePage(1);
  589. if (response.data != null) {
  590. //下载有错误信息提示的报表
  591. //window.open(response.data);
  592. self.$message({
  593. showClose: true,
  594. dangerouslyUseHTMLString: true,
  595. message:
  596. response.message +
  597. `,<a href="${response.data}" target="_blank">点击下载未导入的数据报表</a>&nbsp;`,
  598. duration: 30000,
  599. });
  600. }
  601. }
  602. this.batchImportVisible = false;
  603. },
  604. //批量导入-预览
  605. handleBatchImportPreview(file) {
  606. console.log(file.url);
  607. },
  608. //批量导入-移除
  609. handleBatchImportRemove(file, fileList) {
  610. console.log(file, fileList);
  611. },
  612. //批量导入-移除前操作
  613. beforeBatchImportRemove(file, fileList) {
  614. console.log(file, fileList);
  615. },
  616. //批量导入-文件超出个数限制时的钩子
  617. handleBatchImportExceed(files, fileList) {
  618. this.$message.warning(
  619. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  620. files.length + fileList.length
  621. } 个文件`
  622. );
  623. },
  624. },
  625. mounted: function() {
  626. var self = this;
  627. this.changePage(1);
  628. },
  629. components: {
  630. "enterpriseInfo-detail":enterpriseInfoDetail,
  631. "recruitPersonRelation-list":recruitPersonRelationList,
  632. "recruitInformationInfo-detail":recruitInformationInfoDetail
  633. }
  634. };
  635. </script>
  636. <style lang="scss" scoped>
  637. .el-breadcrumb {
  638. margin: 10px;
  639. line-height: 20px;
  640. }
  641. .el-divider {
  642. margin: 5px 0;
  643. }
  644. .demo-form-inline {
  645. margin-left: 10px;
  646. text-align: left;
  647. }
  648. .button-group {
  649. padding: 10px;
  650. text-align: left;
  651. }
  652. .item{
  653. margin-left: 10px;
  654. }
  655. .btu1{
  656. margin-top: 10px;
  657. margin-right: 15px;
  658. }
  659. </style>