edit.vue 14 KB

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