edit.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  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="back"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>
  9. 岗位信息收集
  10. </ion-title>
  11. </ion-toolbar>
  12. </ion-header>
  13. <ion-content>
  14. <form autocomplete="off">
  15. <div class="bw-vue-form">
  16. <div class="form-title">基础信息</div>
  17. <div class="form-select">
  18. <ion-label>企业</ion-label>
  19. <ion-item>
  20. {{dataModel.companyName}}
  21. </ion-item>
  22. <!-- <ion-label>企业<span class="danger">*</span></ion-label>-->
  23. <!-- <ion-item :class="[v$.dataModel.companyID.$error?'ion-invalid':'ion-valid']">-->
  24. <!-- <ion-select interface="action-sheet" placeholder="请选择企业" cancel-text="取消"-->
  25. <!-- disabled="true" id="companyID" v-model="dataModel.companyID" style="width: 100%;text-align: left;">-->
  26. <!-- <ion-select-option v-for="(record,key) in companyList" :key="key"-->
  27. <!-- v-model:value="record.companyID">-->
  28. <!-- {{ record.companyName }}-->
  29. <!-- </ion-select-option>-->
  30. <!-- </ion-select>-->
  31. <!-- <ion-note slot="error">请选择企业</ion-note>-->
  32. <!-- </ion-item>-->
  33. </div>
  34. <div class="form-input">
  35. <ion-label>岗位名称<span class="danger">*</span></ion-label>
  36. <ion-item :class="[v$.dataModel.professionName.$error?'ion-invalid':'ion-valid']">
  37. <ion-input readonly placeholder="请输入岗位" label-placement="stacked" :clear-input="true"
  38. @click="onOpenPost" v-model="dataModel.professionName" class="custom">
  39. </ion-input>
  40. <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
  41. <ion-note slot="error">请输入岗位</ion-note>
  42. </ion-item>
  43. </div>
  44. <div class="form-input">
  45. <ion-label>招聘人数<span class="danger">*</span></ion-label>
  46. <ion-item :class="[v$.dataModel.recruitCount.$error?'ion-invalid':'ion-valid']">
  47. <ion-input type="number" placeholder="请输入招聘数量" label-placement="stacked" :clear-input="true"
  48. v-model="dataModel.recruitCount" class="custom">
  49. </ion-input>
  50. <ion-note slot="error">请输入招聘人数</ion-note>
  51. </ion-item>
  52. </div>
  53. <div class="form-input">
  54. <ion-label>招聘日期<span class="danger">*</span></ion-label>
  55. <ion-item
  56. :class="[v$.dataModel.startTime.$error||v$.dataModel.endTime.$error?'ion-invalid':'ion-valid']">
  57. <ion-datetime-button datetime="startTime"></ion-datetime-button>
  58. <ion-modal :keep-contents-mounted="true">
  59. <ion-datetime placeholder="招聘日期" id="startTime"
  60. v-model="dataModel.startTime" :prefer-wheel="true"
  61. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  62. :show-default-buttons="true" style="text-align: left;width: 100%;">
  63. </ion-datetime>
  64. </ion-modal>
  65. <ion-datetime-button datetime="endTime"></ion-datetime-button>
  66. <ion-modal :keep-contents-mounted="true">
  67. <ion-datetime placeholder="招聘日期" id="endTime"
  68. v-model="dataModel.endTime" :prefer-wheel="true"
  69. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  70. :show-default-buttons="true" style="text-align: left;width: 100%;">
  71. </ion-datetime>
  72. </ion-modal>
  73. <ion-note slot="error">招聘开始日期与结束日期不能为空</ion-note>
  74. </ion-item>
  75. </div>
  76. <div class="form-detail">
  77. <ion-label>工作地点<span class="danger">*</span></ion-label>
  78. <ion-item :class="[v$.dataModel.jobPlace.$error?'ion-invalid':'ion-valid']">
  79. <ion-textarea placeholder="请输入工作地点" :rows="3" label-placement="stacked" :clear-input="true"
  80. v-model="dataModel.jobPlace" class="custom">
  81. </ion-textarea>
  82. <ion-note slot="error">请输入工作地点</ion-note>
  83. </ion-item>
  84. </div>
  85. </div>
  86. <div class="bw-vue-form">
  87. <div class="form-title" style="display: flex;justify-content: space-between;">
  88. <div style="width: 25%;">
  89. 其他信息
  90. </div>
  91. <div style="width: 75%;text-align: right;">
  92. <ion-label style="color: red;font-size: 14px;" @click="isShow=!isShow">{{isShow?"收起":"展开"}}</ion-label>
  93. </div>
  94. </div>
  95. <div v-show="isShow">
  96. <div class="form-input">
  97. <ion-label>岗位月薪(元)</ion-label>
  98. <ion-item>
  99. <ion-input placeholder="请输入金额" label-placement="stacked"
  100. v-model="dataModel.minSalary" class="custom">
  101. </ion-input>
  102. <ion-label style="text-align:left;width:70px;">至</ion-label>
  103. <ion-input placeholder="请输入金额" label-placement="stacked"
  104. v-model="dataModel.maxSalary" class="custom">
  105. </ion-input>
  106. </ion-item>
  107. </div>
  108. <div class="form-select">
  109. <ion-label>是否有试用期</ion-label>
  110. <ion-item>
  111. <ion-select interface="action-sheet" placeholder="请选择是否有试用期" cancel-text="取消"
  112. id="isTrail" v-model="dataModel.isTrail" style="width: 100%;text-align: left;">
  113. <ion-select-option v-for="(record,key) in isTrailList" :key="key"
  114. v-model:value="record.value">
  115. {{ record.name }}
  116. </ion-select-option>
  117. </ion-select>
  118. </ion-item>
  119. </div>
  120. <div class="form-input">
  121. <ion-label>试用期(月)</ion-label>
  122. <ion-item>
  123. <ion-input type="number" placeholder="请输入试用期月数" label-placement="stacked"
  124. v-model="dataModel.trailMonths" class="custom">
  125. </ion-input>
  126. </ion-item>
  127. </div>
  128. <div class="form-input">
  129. <ion-label>试用期月薪(元)</ion-label>
  130. <ion-item>
  131. <ion-input type="number" placeholder="请输入金额" label-placement="stacked"
  132. v-model="dataModel.trailMinSalary" class="custom">
  133. </ion-input>
  134. <ion-label style="text-align:left;width:70px;">至</ion-label>
  135. <ion-input type="number" placeholder="请输入金额" label-placement="stacked"
  136. v-model="dataModel.trailMaxSalary" class="custom">
  137. </ion-input>
  138. </ion-item>
  139. </div>
  140. <div class="form-select">
  141. <ion-label>工作年限要求</ion-label>
  142. <ion-item>
  143. <ion-select interface="action-sheet" placeholder="请选择工作年限" cancel-text="取消"
  144. id="workYear" v-model="dataModel.workYear" style="width: 100%;text-align: left;">
  145. <ion-select-option v-for="(record,key) in workYearList" :key="key"
  146. v-model:value="record.value">
  147. {{ record.name }}
  148. </ion-select-option>
  149. </ion-select>
  150. </ion-item>
  151. </div>
  152. <div class="form-select">
  153. <ion-label>学历要求</ion-label>
  154. <ion-item>
  155. <ion-select interface="action-sheet" placeholder="请选择学历" cancel-text="取消"
  156. id="cultureRank" v-model="dataModel.cultureRank" style="width: 100%;text-align: left;">
  157. <ion-select-option v-for="(record,key) in cultureRankList" :key="key"
  158. v-model:value="record.value">
  159. {{ record.name }}
  160. </ion-select-option>
  161. </ion-select>
  162. </ion-item>
  163. </div>
  164. <div class="form-input">
  165. <ion-label>福利待遇</ion-label>
  166. <ion-item>
  167. <ion-textarea placeholder="请输入福利待遇" :rows="3" label-placement="stacked"
  168. v-model="dataModel.welfare" class="custom">
  169. </ion-textarea>
  170. </ion-item>
  171. </div>
  172. <div class="form-input">
  173. <ion-label>其他要求</ion-label>
  174. <ion-item>
  175. <ion-textarea placeholder="请输入其他要求" :rows="3" label-placement="stacked"
  176. v-model="dataModel.postDesc" class="custom">
  177. </ion-textarea>
  178. </ion-item>
  179. </div>
  180. </div>
  181. </div>
  182. </form>
  183. </ion-content>
  184. <ion-footer>
  185. <ion-toolbar>
  186. <div slot="end">
  187. <ion-button shape="round" expand="block" @click="onSave">提交</ion-button>
  188. </div>
  189. </ion-toolbar>
  190. </ion-footer>
  191. </ion-page>
  192. </template>
  193. <script lang="ts">
  194. import {computed, defineComponent, reactive, ref, toRefs, watch} from "vue";
  195. import {chevronDownOutline, chevronUpOutline, arrowBackOutline} from 'ionicons/icons';
  196. import {useRoute, useRouter} from "vue-router";
  197. import {alertController, onIonViewDidEnter} from "@ionic/vue";
  198. import {useVuelidate} from "@vuelidate/core";
  199. import {getPostByID, savePost} from "@/api/post";
  200. import { required} from "@vuelidate/validators";
  201. import {getSysDictionaryList} from "@/api/system/dictionary";
  202. import {getCompanyBySiteID} from "@/api/company";
  203. import {useUserStore} from '@/store/modules/user';
  204. import dayjs from "dayjs";
  205. import PostSelectionLike from "@/components/postSelectionLike.vue";
  206. export default defineComponent({
  207. name: 'PostEdit',
  208. components:{PostSelectionLike},
  209. setup() {
  210. const router = useRouter();
  211. const route = useRoute();
  212. const userStore = useUserStore();
  213. const isShow = ref<any>(false);
  214. const isEdit = ref<any>(false);
  215. const formState = reactive({
  216. dataModel: {
  217. companyID: null,
  218. postID: null,
  219. professionName: null,
  220. professionID: null,
  221. recruitCount: null,
  222. startTime: dayjs().format("YYYY-MM-DD"),
  223. endTime: dayjs().format("YYYY-MM-DD"),
  224. jobPlace: null,
  225. minSalary: null,
  226. maxSalary: null,
  227. isTrail: null,
  228. trailMonths: null,
  229. trailMinSalary: null,
  230. trailMaxSalary: null,
  231. workYear: null,
  232. cultureRank: null,
  233. welfare: null,
  234. postDesc: null
  235. }
  236. });
  237. const rules = computed(() => {
  238. return {
  239. dataModel: {
  240. companyID: {required},
  241. professionName: {required},
  242. recruitCount: {required},
  243. startTime: {required},
  244. endTime: {required},
  245. jobPlace: {required}
  246. }
  247. }
  248. });
  249. const v$ = useVuelidate(rules, formState);
  250. const isTrailList = ref([
  251. {value: true, name: '是'},
  252. {value: false, name: '否'},
  253. ]);
  254. const workYearList = ref([]);
  255. const cultureRankList = ref([]);
  256. const companyList = ref([]);
  257. const refPostSelectionLike = ref();
  258. const presentAlert = async (message: string) => {
  259. const alert = await alertController.create({
  260. header: '错误!',
  261. message: message,
  262. buttons: [
  263. '确定'
  264. ],
  265. });
  266. await alert.present();
  267. }
  268. const onSave = async function () {
  269. const isFormCorrect = await v$.value.$validate();
  270. if (!isFormCorrect) {
  271. await presentAlert('请输入完整信息!');
  272. return null;
  273. }
  274. savePost(formState.dataModel).then(result => {
  275. if (result) {
  276. router.push({path: "./list", query: {reload: 1}});
  277. }
  278. })
  279. }
  280. const onResultInfo = (data: any)=>{
  281. formState.dataModel.professionID = data.value;
  282. formState.dataModel.professionName = data.text;
  283. }
  284. const onOpenPost = () => {
  285. refPostSelectionLike.value.onOpen();
  286. }
  287. const back = () => {
  288. router.push({path: "./list", query: {reload: 1}});
  289. }
  290. const getCompanyBySiteIDList = async function () {
  291. const siteID = userStore.getUserInfo.siteID;
  292. const data: any = await getCompanyBySiteID(siteID);
  293. companyList.value = data;
  294. }
  295. const getWorkYearList = async function () {
  296. const data: any = await getSysDictionaryList("WorkYearType");
  297. workYearList.value = data;
  298. }
  299. const getCultureRankList = async function () {
  300. const data: any = await getSysDictionaryList("CultureLevel");
  301. cultureRankList.value = data;
  302. }
  303. const loadData = async (postID: any) => {
  304. await getCompanyBySiteIDList();
  305. await getWorkYearList();
  306. await getCultureRankList();
  307. const reqData = await getPostByID(postID);
  308. formState.dataModel = reqData;
  309. };
  310. const reload = (postID: any) => {
  311. formState.dataModel.recruitCount = null;
  312. loadData(postID);
  313. }
  314. onIonViewDidEnter(() => {
  315. if (route.query.reload)
  316. reload(route.query.id);
  317. });
  318. return {
  319. ...toRefs(formState),
  320. chevronDownOutline,
  321. chevronUpOutline,
  322. arrowBackOutline,
  323. route,
  324. router,
  325. isShow,
  326. isEdit,
  327. companyList,
  328. isTrailList,
  329. workYearList,
  330. cultureRankList,
  331. v$,
  332. refPostSelectionLike,
  333. onOpenPost,
  334. onResultInfo,
  335. onSave,
  336. back,
  337. }
  338. }
  339. });
  340. </script>
  341. <style lang="less">
  342. </style>