edit.vue 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  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" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>求职人员信息登记</ion-title>
  9. </ion-toolbar>
  10. </ion-header>
  11. <ion-content>
  12. <div class="stepFlex">
  13. <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
  14. <div
  15. :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
  16. <div v-if="key !== stepList.length - 1"
  17. :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
  18. <div class="stepFlex-item-label">
  19. <p class="stepFlex-item-label-title" @click="onPathRedirect(record.val)">{{ record.title }}</p>
  20. <!--<p class="stepFlex-item-label-desc" @click="onPathRedirect(record.val)">{{ record.desc }}</p>-->
  21. </div>
  22. </div>
  23. </div>
  24. <form autocomplete="off">
  25. <div class="bw-vue-form">
  26. <ion-list v-if="curStepData.statusVal==1">
  27. <div class="form-title">基本信息</div>
  28. <div class="form-input">
  29. <ion-label>姓名<span class="danger">*</span></ion-label>
  30. <ion-input name="name" id="name" class="custom" :clear-input="true"
  31. placeholder="请输入姓名" v-model="baseData.name" >
  32. </ion-input>
  33. <!-- <ion-note slot="error">姓名不能为空</ion-note>-->
  34. </div>
  35. <div class="form-input">
  36. <ion-label>公民身份号码</ion-label>
  37. <ion-input name="identityNumber" id="identityNumber" class="custom" :clear-input="true"
  38. placeholder="请输入身份证号码" v-model="baseData.identityNumber" ></ion-input>
  39. </div>
  40. <div class="form-input">
  41. <ion-label>出生日期<span class="danger">*</span></ion-label>
  42. <div class="dateTimeBox">
  43. <ion-datetime-button datetime="birthDay"></ion-datetime-button>
  44. <ion-modal :keep-contents-mounted="true">
  45. <ion-datetime name="birthDay" id="birthDay" placeholder="日期"
  46. v-model="baseData.birthDay" :prefer-wheel="true"
  47. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  48. :show-default-buttons="true">
  49. </ion-datetime>
  50. </ion-modal>
  51. </div>
  52. </div>
  53. <div class="form-select">
  54. <ion-label>性别<span class="danger">*</span></ion-label>
  55. <ion-select name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
  56. interface="action-sheet" placeholder="请选择性别" style="width:100%;text-align:left;" >
  57. <ion-select-option v-for="(it,key) in genderList" :key="key" :value="it.value">
  58. {{ it.name }}
  59. </ion-select-option>
  60. </ion-select>
  61. </div>
  62. <div class="form-input">
  63. <ion-label>联系电话<span class="danger">*</span></ion-label>
  64. <ion-input name="userMobile" id="userMobile" style="text-align: left;" class="custom" :clear-input="true"
  65. placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
  66. <!-- <ion-note slot="error">联系电话不能为空</ion-note>-->
  67. </div>
  68. <!-- <div class="form-select">-->
  69. <!-- <ion-label>所属驿站<span class="danger">*</span></ion-label>-->
  70. <!-- <ion-select disabled name="siteID" id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"-->
  71. <!-- interface="action-sheet" placeholder="请选择所属驿站" style="width:100%;text-align:left;">-->
  72. <!-- <ion-select-option v-for=" (it,key) in siteInfoList" :key="key" :value="it.value">-->
  73. <!-- {{ it.text }}-->
  74. <!-- </ion-select-option>-->
  75. <!-- </ion-select>-->
  76. <!-- &lt;!&ndash; <ion-note slot="error">所属驿站不能为空</ion-note>&ndash;&gt;-->
  77. <!-- </div>-->
  78. <ion-label style="padding-left: 10px;">所在街道/社区/镇村<span class="danger">*</span></ion-label>
  79. <div class="form-select">
  80. <ion-select disabled name="regionCode" id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"
  81. interface="action-sheet" placeholder="请选择常住市/县" style="width:50%;float:left;"
  82. @ionChange="regionChange()">
  83. <ion-select-option v-for="(it,key) in regionList" :key="key" :value="it.code">
  84. {{ it.name }}
  85. </ion-select-option>
  86. </ion-select>
  87. <ion-select interface="action-sheet" placeholder="请选择街道/社区/镇村" cancel-text="取消"
  88. id="streetCode" v-model="baseData.streetCode" style="width: 50%;float: left;">
  89. <ion-select-option v-for="(record,key) in streetList" :key="key"
  90. v-model:value="record.code">
  91. {{ record.name }}
  92. </ion-select-option>
  93. </ion-select>
  94. </div>
  95. <!-- <div class="form-select">-->
  96. <!-- <ion-label>常住市/县<span class="danger">*</span></ion-label>-->
  97. <!-- <ion-select disabled name="regionCode" id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"-->
  98. <!-- interface="action-sheet" placeholder="请选择常住市/县" style="width:100%;text-align:left;" @ionChange="regionChange()" >-->
  99. <!-- <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">-->
  100. <!-- {{ it.name }}-->
  101. <!-- </ion-select-option>-->
  102. <!-- </ion-select>-->
  103. <!-- </div>-->
  104. <!-- <div class="form-select">-->
  105. <!-- <ion-label>所在街道<span class="danger">*</span></ion-label>-->
  106. <!-- <ion-select name="streetCode" id="streetCode" okText="确定" cancelText="取消" v-model="baseData.streetCode"-->
  107. <!-- interface="action-sheet" placeholder="请选择镇/街" style="width:100%;text-align:left;">-->
  108. <!-- <ion-select-option v-for=" (it,key) in streetList" :key="key" :value="it.code">-->
  109. <!-- {{ it.name }}-->
  110. <!-- </ion-select-option>-->
  111. <!-- </ion-select>-->
  112. <!-- </div>-->
  113. <div class="form-input">
  114. <ion-label>常住地址<span class="danger">*</span></ion-label>
  115. <ion-input name="address" id="address" style="text-align: left;" class="custom" :clear-input="true"
  116. placeholder="请输入常住地址" v-model="baseData.address"></ion-input>
  117. <!-- <ion-note slot="error">地址不能为空</ion-note>-->
  118. </div>
  119. <div class="form-select">
  120. <ion-label>就业状态<span class="danger">*</span></ion-label>
  121. <ion-select name="jobStatusID" id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
  122. interface="action-sheet" placeholder="请选择就业状态" style="width:100%;text-align:left;" >
  123. <ion-select-option v-for=" (it,key) in jobUserStatusList" :key="key" :value="it.value">{{ it.name }}</ion-select-option>
  124. </ion-select>
  125. <!-- <ion-note slot="error">就业状态不能为空</ion-note>-->
  126. </div>
  127. <div class="form-select">
  128. <ion-label>重点人员类别<span class="danger">*</span></ion-label>
  129. <ion-select name="keyPersonTypeID" id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
  130. interface="action-sheet" placeholder="请选择重点人员类别" style="width:100%;text-align:left;">
  131. <ion-select-option v-for=" (it,key) in keyPersonTypeList" :key="key" :value="it.value">
  132. {{ it.name }}
  133. </ion-select-option>
  134. </ion-select>
  135. <!-- <ion-note slot="error">重点人员类别不能为空</ion-note>-->
  136. </div>
  137. <div class="form-select">
  138. <ion-label>人员类别<span class="danger">*</span></ion-label>
  139. <ion-select name="ordinaryPersonTypeID" id="ordinaryPersonTypeID" okText="确定" cancelText="取消"
  140. v-model="baseData.ordinaryPersonTypeID"
  141. interface="action-sheet" placeholder="请选择人员类别" @ionChange="ordinaryPersonTypeChange"
  142. style="width:100%;text-align:left;">
  143. <ion-select-option v-for="(it,key) in ordinaryPersonTypeList" :key="key" :value="it.value">
  144. {{ it.name }}
  145. </ion-select-option>
  146. </ion-select>
  147. </div>
  148. <div style="width:100%;overflow: hidden;height: 30px;"></div>
  149. <div class="form-title">
  150. 大学基本信息
  151. <div style="float: right;">
  152. <ion-label style="color: red;font-size: 14px;" @click="dxExpand=!dxExpand">{{
  153. dxExpand ? "收起" : "展开"
  154. }}
  155. </ion-label>
  156. </div>
  157. </div>
  158. <div v-if="dxExpand">
  159. <div class="form-input">
  160. <ion-label>毕业院校<span v-show="isGraduating" class="danger">*</span></ion-label>
  161. <ion-input name="finishSchool" id="finishSchool" style="text-align: left;" class="custom"
  162. :clear-input="true"
  163. placeholder="请输入毕业院校" v-model="baseData.finishSchool"></ion-input>
  164. </div>
  165. <div class="form-select">
  166. <ion-label>是否非全日制</ion-label>
  167. <ion-select name="isFullTime" id="isFullTime" okText="确定" cancelText="取消"
  168. v-model="baseData.isFullTime"
  169. interface="action-sheet" placeholder="请选择是否非全日制"
  170. style="width:100%;text-align:left;">
  171. <ion-select-option v-for="(it,key) in isFullTimeList" :key="key" :value="it.value">
  172. {{ it.name }}
  173. </ion-select-option>
  174. </ion-select>
  175. </div>
  176. <div class="form-input">
  177. <ion-label>专业</ion-label>
  178. <ion-input name="professionID" id="profession" style="text-align: left;" class="custom"
  179. :clear-input="true"
  180. placeholder="请输入专业" v-model="baseData.profession"></ion-input>
  181. </div>
  182. <div class="form-input">
  183. <ion-label>学制(年)<span v-show="isGraduating" class="danger">*</span></ion-label>
  184. <ion-input type="number" :min="0" name="educationalSystem" id="educationalSystem"
  185. style="text-align: left;" class="custom" @ion-blur="educationalSystemBlur"
  186. placeholder="请输入学制" v-model="baseData.educationalSystem"></ion-input>
  187. </div>
  188. <div class="form-input">
  189. <ion-label>毕业日期<span v-show="isGraduating" class="danger">*</span></ion-label>
  190. <div class="dateTimeBox">
  191. <ion-datetime-button datetime="showFinishDate"
  192. style="position:absolute;left:10px;"></ion-datetime-button>
  193. <ion-modal :keep-contents-mounted="true">
  194. <ion-datetime name="showFinishDate" id="showFinishDate" v-model="baseData.showFinishDate"
  195. dataformatas="YYYY-MM-DD" presentation="month-year" cancel-text="取消"
  196. done-text="确定"
  197. :show-default-buttons="true" @ionChange="finishDateChange()">
  198. </ion-datetime>
  199. </ion-modal>
  200. </div>
  201. </div>
  202. <div style="width:100%;overflow: hidden;height: 30px;"></div>
  203. <div class="form-select">
  204. <ion-label>困难状况</ion-label>
  205. <ion-select name="difficultSituationID" id="difficultSituationID" okText="确定" cancelText="取消"
  206. v-model="baseData.difficultSituationID"
  207. interface="action-sheet" placeholder="请选择困难状况"
  208. style="width:100%;text-align:left;">
  209. <ion-select-option v-for="(it,key) in difficultSituationList" :key="key" :value="it.value">
  210. {{ it.name }}
  211. </ion-select-option>
  212. </ion-select>
  213. </div>
  214. <div class="form-input">
  215. <ion-label>入学前户口所在地</ion-label>
  216. <ion-input name="esHouseholdRegistration" id="esHouseholdRegistration" style="text-align: left;"
  217. class="custom"
  218. :clear-input="true"
  219. placeholder="请输入入学前户口所在地" v-model="baseData.esHouseholdRegistration"></ion-input>
  220. </div>
  221. </div>
  222. <div style="width:100%;overflow: hidden;height: 30px;"></div>
  223. <div class="form-title">
  224. 其他信息
  225. <div style="float: right;">
  226. <ion-label style="color: red;font-size: 14px;" @click="expand=!expand">{{expand?"收起":"展开"}}</ion-label>
  227. </div>
  228. </div>
  229. <div v-if="expand">
  230. <div class="form-input">
  231. <ion-label>社会保障卡号</ion-label>
  232. <ion-input name="socialSecurityCard" id="socialSecurityCard" style="text-align: left;" class="custom" :clear-input="true"
  233. placeholder="请输入社会保障卡号" v-model="baseData.socialSecurityCard" ></ion-input>
  234. </div>
  235. <div class="form-select">
  236. <ion-label>政治面貌</ion-label>
  237. <ion-select name="politicsStatusID" id="politicsStatusID" okText="确定" cancelText="取消" v-model="baseData.politicsStatusID"
  238. interface="action-sheet" placeholder="请选择政治面貌" style="width:100%;text-align:left;" >
  239. <ion-select-option v-for=" (it,key) in politicsStatusList" :key="key" :value="it.value">
  240. {{ it.name }}
  241. </ion-select-option>
  242. </ion-select>
  243. </div>
  244. <div class="form-select">
  245. <ion-label>民族</ion-label>
  246. <ion-select name="nationID" id="nationID" okText="确定" cancelText="取消" v-model="baseData.nation"
  247. interface="action-sheet" placeholder="请选择民族" style="width:100%;text-align:left;" >
  248. <ion-select-option v-for=" (it,key) in nationTypeList" :key="key" :value="it.value">
  249. {{ it.name }}
  250. </ion-select-option>
  251. </ion-select>
  252. </div>
  253. <div class="form-input">
  254. <ion-label>职业资格类别</ion-label>
  255. <div>
  256. <ion-input placeholder="请选择职业资格类别" label-placement="stacked" style="float: left;width:78%;"
  257. v-model="baseData.occupationalCategoryName" class="custom" readonly >
  258. </ion-input>
  259. <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
  260. <category-selection :OccupationalID="baseData.occupationalCategory" @SetOccupationalID="onSetOccupationalID"></category-selection>
  261. </ion-item>
  262. </div>
  263. </div>
  264. <div class="form-select">
  265. <ion-label>职业资格等级</ion-label>
  266. <ion-select name="occupationalLevel" id="occupationalLevel" okText="确定" cancelText="取消" v-model="baseData.occupationalLevel"
  267. interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >
  268. <ion-select-option v-for=" (it,key) in occupationalLevelList" :key="key" :value="it.value">
  269. {{ it.name }}
  270. </ion-select-option>
  271. </ion-select>
  272. </div>
  273. <div class="form-input">
  274. <ion-label>籍贯</ion-label>
  275. <ion-input name="nativePlace" id="nativePlace" style="text-align: left;" class="custom" :clear-input="true"
  276. v-model="baseData.nativePlace" placeholder="请输入籍贯" ></ion-input>
  277. </div>
  278. <div class="form-input">
  279. <ion-label>出生地</ion-label>
  280. <ion-input name="birthPlace" id="birthPlace" style="text-align: left;" class="custom" :clear-input="true"
  281. v-model="baseData.birthPlace" placeholder="请输入出生地"></ion-input>
  282. </div>
  283. <div style="width:100%;overflow: hidden;height: 30px;"></div>
  284. <div class="form-select">
  285. <ion-label>户口性质</ion-label>
  286. <ion-select name="familyNatureID" id="familyNatureID" okText="确定" cancelText="取消" v-model="baseData.familyNatureID"
  287. interface="action-sheet" placeholder="请选择户口性质" style="width:100%;text-align:left;">
  288. <ion-select-option v-for=" (it,key) in familyNatureList" :key="key" :value="it.value">
  289. {{ it.name }}
  290. </ion-select-option>
  291. </ion-select>
  292. </div>
  293. <div class="form-select">
  294. <ion-label>最高学历</ion-label>
  295. <ion-select name="cultureRank" id="cultureRank" okText="确定" cancelText="取消" v-model="baseData.cultureRank"
  296. interface="action-sheet" placeholder="请选择最高学历" style="width:100%;text-align:left;">
  297. <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
  298. {{ it.name }}
  299. </ion-select-option>
  300. </ion-select>
  301. </div>
  302. <div class="form-select">
  303. <ion-label>健康状况</ion-label>
  304. <ion-select name="healthID" id="healthID" okText="确定" cancelText="取消" v-model="baseData.healthID"
  305. interface="action-sheet" placeholder="请选择健康状况" style="width:100%;text-align:left;">
  306. <ion-select-option v-for=" (it,key) in userHealthList" :key="key" :value="it.value">
  307. {{ it.name }}
  308. </ion-select-option>
  309. </ion-select>
  310. </div>
  311. <!-- <div class="form-select">-->
  312. <!-- <ion-label>血型</ion-label>-->
  313. <!-- <ion-select name="bloodTypeID" id="bloodTypeID" okText="确定" cancelText="取消" v-model="baseData.bloodTypeID"-->
  314. <!-- interface="action-sheet" placeholder="请选择血型" style="width:100%;text-align:left;">-->
  315. <!-- <ion-select-option v-for=" (it,key) in bloodTypeList" :key="key" :value="it.value">-->
  316. <!-- {{ it.name }}-->
  317. <!-- </ion-select-option>-->
  318. <!-- </ion-select>-->
  319. <!-- </div>-->
  320. <div class="form-input">
  321. <ion-label>身高(cm)</ion-label>
  322. <ion-input name="height" id="height" style="text-align: left;" class="custom" :clear-input="true"
  323. placeholder="请输入身高" v-model="baseData.height" ></ion-input>
  324. </div>
  325. <div class="form-input">
  326. <ion-label>视力</ion-label>
  327. <ion-input name="vision" id="vision" style="text-align: left;" class="custom" :clear-input="true"
  328. placeholder="如5.0" v-model="baseData.vision" ></ion-input>
  329. </div>
  330. <div class="form-input">
  331. <ion-label>体重(kg)</ion-label>
  332. <ion-input name="weight" id="weight" style="text-align: left;" class="custom" :clear-input="true"
  333. placeholder="请输入体重" v-model="baseData.weight" ></ion-input>
  334. </div>
  335. <div class="form-select">
  336. <ion-label>婚姻状况</ion-label>
  337. <ion-select name="maritalStatusID" id="maritalStatusID" okText="确定" cancelText="取消" v-model="baseData.maritalStatusID"
  338. interface="action-sheet" placeholder="请选择婚姻状况" style="width:100%;text-align:left;">
  339. <ion-select-option v-for=" (it,key) in maritalStatusList" :key="key" :value="it.value">
  340. {{ it.name }}
  341. </ion-select-option>
  342. </ion-select>
  343. </div>
  344. <!-- <div class="form-select">
  345. <ion-label>省份</ion-label>
  346. <ion-select name="provinceCode" id="provinceCode" okText="确定" cancelText="取消" v-model="baseData.provinceCode"
  347. interface="action-sheet" placeholder="请选择省份" style="width:100%;text-align:left;" @change="provinceChange()" >
  348. <ion-select-option v-for=" (it,key) in provinceList" :key="key" :value="it.value">
  349. {{ it.name }}
  350. </ion-select-option>
  351. </ion-select>
  352. </div>-->
  353. <div class="form-input">
  354. <ion-label>联系人员</ion-label>
  355. <ion-input name="userName" id="userName" style="text-align: left;" class="custom" :clear-input="true"
  356. placeholder="请输入联系人员" v-model="baseData.userName" ></ion-input>
  357. </div>
  358. <!-- <div class="form-input">-->
  359. <!-- <ion-label>邮政编码</ion-label>-->
  360. <!-- <ion-input name="birthPlace" id="postalCode" style="text-align: left;" class="custom" :clear-input="true"-->
  361. <!-- placeholder="请输入邮政编码" v-model="baseData.postalCode"></ion-input>-->
  362. <!-- </div>-->
  363. <div class="form-input">
  364. <ion-label>电子邮箱</ion-label>
  365. <ion-input name="email" id="email" style="text-align: left;" class="custom" :clear-input="true"
  366. placeholder="请输入电子邮箱" v-model="baseData.email" ></ion-input>
  367. </div>
  368. <div class="form-input">
  369. <ion-label>户籍详细地址</ion-label>
  370. <ion-textarea name="familyAddress" id="familyAddress" class="custom" rows="4"
  371. placeholder="请输入户籍详细地址" v-model="baseData.familyAddress"
  372. style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
  373. </div>
  374. <div class="form-input">
  375. <ion-label>个人评价</ion-label>
  376. <ion-textarea name="hobby" id="hobby" class="custom" rows="4"
  377. placeholder="请输入个人评价" v-model="baseData.hobby"
  378. style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
  379. </div>
  380. <div class="form-input">
  381. <ion-label>个人技能</ion-label>
  382. <ion-textarea name="personalSkills" id="personalSkills" class="custom" rows="4"
  383. placeholder="请输入个人技能" v-model="baseData.personalSkills"
  384. style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
  385. </div>
  386. <div class="form-input">
  387. <ion-label>标签</ion-label>
  388. <ion-row>
  389. <ion-col size="auto" v-for="(itemLabel,keyLabel) in baseData.listLabel" :key="keyLabel">
  390. <ion-button color="primary" size="small">{{ itemLabel.labelName }}</ion-button>
  391. </ion-col>
  392. <ion-col>
  393. <ion-item style="float: right;padding:0px;margin: 0px;">
  394. <label-selection :big-type="2" :list-label="baseData.listLabel" :title="'人员标签'"
  395. @resultBack="onResultBackLabels"></label-selection>
  396. </ion-item>
  397. </ion-col>
  398. </ion-row>
  399. </div>
  400. <div class="form-input">
  401. <ion-label>
  402. 图片上传
  403. </ion-label>
  404. <b-image v-if="baseData.jobUserID" :file-ref-id="baseData.jobUserID" :readonly="false"
  405. :is-single="false"></b-image>
  406. </div>
  407. </div>
  408. </ion-list>
  409. <ion-list v-if="curStepData.statusVal==2" >
  410. <div class="form-title">
  411. 教育经历
  412. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  413. @click="onPathForward('./educationEdit',null,null,null, null,2)"></ion-icon>
  414. </div>
  415. <div class="bw-vue-list">
  416. <div class="list-content" v-if="!loading">
  417. <ion-list>
  418. <div v-for="(record,key) in educationList" :key="key" >
  419. <ion-item-sliding>
  420. <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null, null,2)">
  421. <ion-label>
  422. <h2>{{record.schoolName}}</h2>
  423. <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
  424. </ion-label>
  425. </ion-item>
  426. <ion-item-options>
  427. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.educationID)">
  428. <ion-icon :icon="trashOutline"></ion-icon>
  429. </ion-item-option>
  430. </ion-item-options>
  431. </ion-item-sliding>
  432. </div>
  433. </ion-list>
  434. </div>
  435. </div>
  436. <b-empty v-if="educationList.length==0" :loading="loading" />
  437. </ion-list>
  438. <ion-list v-if="curStepData.statusVal==3" >
  439. <div class="form-title">
  440. 工作经验
  441. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  442. @click="onPathForward('./experienceEdit',null,null,null, null,3)"></ion-icon>
  443. </div>
  444. <div class="bw-vue-list">
  445. <div class="list-content" v-if="!loading">
  446. <ion-list>
  447. <div v-for="(record,key) in experienceList" :key="key">
  448. <ion-item-sliding>
  449. <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,null,3)">
  450. <ion-label>
  451. <h2>{{record.workAddress}}</h2>
  452. <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
  453. </ion-label>
  454. </ion-item>
  455. <ion-item-options>
  456. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.experienceID)">
  457. <ion-icon :icon="trashOutline"></ion-icon>
  458. </ion-item-option>
  459. </ion-item-options>
  460. </ion-item-sliding>
  461. </div>
  462. </ion-list>
  463. </div>
  464. </div>
  465. <b-empty v-if="experienceList.length==0" :loading="loading" />
  466. </ion-list>
  467. <ion-list v-if="curStepData.statusVal==4">
  468. <div class="form-title">
  469. 求职意向
  470. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  471. @click="onPathForward('./jobHuntEdit',null,null,null,null,4)"></ion-icon>
  472. </div>
  473. <div class="bw-vue-list">
  474. <div class="list-content" v-if="!loading">
  475. <ion-list>
  476. <div v-for="(record,key) in jobHuntList" :key="key">
  477. <ion-item-sliding>
  478. <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID,null,4)">
  479. <ion-label>
  480. <h2>{{record.professionName}}</h2>
  481. <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
  482. </ion-label>
  483. </ion-item>
  484. <ion-item-options>
  485. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.jobHuntID)">
  486. <ion-icon :icon="trashOutline"></ion-icon>
  487. </ion-item-option>
  488. </ion-item-options>
  489. </ion-item-sliding>
  490. </div>
  491. </ion-list>
  492. </div>
  493. </div>
  494. <b-empty v-if="jobHuntList.length==0" :loading="loading" />
  495. </ion-list>
  496. <ion-list v-if="curStepData.statusVal==5">
  497. <div class="form-title">
  498. 个人荣誉
  499. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  500. @click="onPathForward('./honorEdit',null,null,null,null,5)"></ion-icon>
  501. </div>
  502. <div class="bw-vue-list">
  503. <div class="list-content" v-if="!loading">
  504. <ion-list>
  505. <div v-for="(record,key) in honorList" :key="key">
  506. <ion-item-sliding>
  507. <ion-item detail @click="onPathForward('./honorEdit',null,null,null, record.honorID,5)">
  508. <ion-label>
  509. <h2>{{ record.honorName }}</h2>
  510. <p>获得时间:{{ dayjs(record.getTime).format("YYYY-MM-DD") }}</p>
  511. </ion-label>
  512. </ion-item>
  513. <ion-item-options>
  514. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.honorID)">
  515. <ion-icon :icon="trashOutline"></ion-icon>
  516. </ion-item-option>
  517. </ion-item-options>
  518. </ion-item-sliding>
  519. </div>
  520. </ion-list>
  521. </div>
  522. </div>
  523. <b-empty v-if="jobHuntList.length==0" :loading="loading"/>
  524. </ion-list>
  525. <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh"></ion-refresher>-->
  526. <ion-infinite-scroll v-if="curStepData.statusVal!=1" threshold="100px" @ionInfinite="onScroll($event)">
  527. <ion-infinite-scroll-content
  528. :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
  529. loadingSpinner="bubbles">
  530. </ion-infinite-scroll-content>
  531. </ion-infinite-scroll>
  532. </div>
  533. </form>
  534. </ion-content>
  535. <ion-footer>
  536. <ion-toolbar>
  537. <ion-button style="width: 100%;" @click="onSave" v-if="curStepData.statusVal==1">保存并下一步</ion-button>
  538. <div v-if="curStepData.statusVal!=1" >
  539. <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
  540. <ion-button style="width: 48%;margin-right: 1%;" @click="onSave" v-if="curStepData.statusVal!=5">下一步
  541. </ion-button>
  542. <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==5">完 成
  543. </ion-button>
  544. </div>
  545. </ion-toolbar>
  546. </ion-footer>
  547. <ion-alert
  548. :is-open="delAlertOpen"
  549. header="删除确认"
  550. message="确定要删除该信息吗?"
  551. :buttons="delAlertButtons"
  552. @didDismiss="setDelAlertOpen(false, null)"
  553. ></ion-alert>
  554. <ion-alert
  555. :is-open="infoAlertOpen"
  556. :header="infoAlterData.title"
  557. :message="infoAlterData.message"
  558. :buttons="infoAlertButtons"
  559. @didDismiss="setInfoAlertOpen(false)"
  560. ></ion-alert>
  561. <ion-loading
  562. :is-open="delLoading"
  563. message="删除中..."
  564. @didDismiss="setDelLoadingOpen(false)" >
  565. </ion-loading>
  566. </ion-page>
  567. </template>
  568. <script lang="ts">
  569. import {arrowBackOutline,addCircleOutline,trashOutline} from 'ionicons/icons';
  570. import {reactive,defineComponent, computed,watch,ref,toRefs} from "vue";
  571. import {post, postByDataAndParams} from "@/api/common";
  572. import {useRoute, useRouter} from "vue-router";
  573. import {required} from "@vuelidate/validators";
  574. import {useVuelidate} from "@vuelidate/core";
  575. import {getRegionCodeList,getStreetCodeList} from "@/api/system/area";
  576. import {getJobUserById,baseInfoSave} from "@/api/jobUserInfo";
  577. import {getEducationListByJobUserID} from "@/api/education";
  578. import {getExperienceListByJobUserID} from "@/api/experience";
  579. import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
  580. import {getSiteDataList} from "@/api/siteInfo";
  581. import {getSysDictionaryList} from '@/api/system/dictionary';
  582. import {alertController, onIonViewDidEnter} from "@ionic/vue";
  583. import dayjs from "dayjs";
  584. import {useUserStore} from "@/store/modules/user";
  585. import CategorySelection from "@/components/ocCategorySelection.vue";
  586. import {getPosition} from "@/utils/position";
  587. import LabelSelection from "@/components/labelSelection.vue";
  588. import crtyptoHelp from "@/utils/crypto";
  589. import BImage from "@/components/bImage.vue";
  590. import {getHonorListByJobUserID} from "@/api/honor/honor";
  591. interface SelectProps {
  592. name: string,
  593. value: string
  594. }
  595. interface StepParams{
  596. name: string,
  597. statusVal: number
  598. }
  599. interface BaseData {
  600. baseData: {
  601. jobUserID: any,
  602. loginUserID: any,
  603. siteID: any,
  604. name: any,
  605. identityNumber: any,
  606. sex: any,
  607. userMobile: any,
  608. address: any,
  609. jobStatusID: any,
  610. keyPersonTypeID: any,
  611. politicsStatusID: any,
  612. birthPlace: any,
  613. birthDay: any,
  614. familyNatureID: any,
  615. cultureRank: any,
  616. healthID: any,
  617. height: any,
  618. vision: any,
  619. weight: any,
  620. maritalStatusID: any,
  621. provinceCode: any,
  622. regionCode: any,
  623. streetCode: any,
  624. userName: any,
  625. familyAddress: any,
  626. postalCode: any,
  627. email: any,
  628. hobby: any,
  629. personalSkills: any,
  630. socialSecurityCard: any,
  631. finishSchool: any,
  632. finishDate: any,
  633. showFinishDate: any,
  634. profession: any,
  635. nativePlace: any,
  636. isFullTime: any,
  637. occupationalCategory: any,
  638. occupationalCategoryName: any,
  639. occupationalLevel: any,
  640. longitude: any,
  641. latitude: any,
  642. listLabel: any,
  643. ordinaryPersonTypeID: any,
  644. educationalSystem: any,
  645. difficultSituationID: any,
  646. esHouseholdRegistration: any,
  647. }
  648. }
  649. export default defineComponent({
  650. name: 'jobUserEdit',
  651. components: {BImage, CategorySelection, LabelSelection},
  652. setup() {
  653. const userStore = useUserStore();
  654. const userInfo = ref(userStore.getUserInfo);
  655. const router = useRouter();
  656. const route = useRoute();
  657. const isAllowCommit = ref(true);
  658. const expand = ref<boolean>(false);
  659. const dxExpand = ref<boolean>(false);
  660. const loading = ref(true);
  661. const siteInfoList = ref<SelectProps[]>([]);
  662. const curStepData = ref<StepParams>({
  663. name:"",
  664. statusVal: 1
  665. });
  666. const stepList = ref([
  667. {title: '基础信息', desc: '个人基础信息', val: 1},
  668. {title: '教育经历', desc: '完善教育经历', val: 2},
  669. {title: '工作经验', desc: '完善工作经验', val: 3},
  670. {title: '求职意向', desc: '个人求职意向', val: 4},
  671. {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
  672. ]);
  673. const genderList = ref<SelectProps[]>([]);
  674. const jobUserStatusList = ref<SelectProps[]>([]);
  675. const keyPersonTypeList = ref<SelectProps[]>([]);
  676. const ordinaryPersonTypeList = ref<SelectProps[]>();
  677. const cultureRankList = ref<SelectProps[]>([]);
  678. const userHealthList = ref<SelectProps[]>([]);
  679. const bloodTypeList = ref<SelectProps[]>([]);
  680. const maritalStatusList = ref<SelectProps[]>([]);
  681. const provinceList = ref<SelectProps[]>([{name:'广东省',value:'440000000000000'}]);
  682. const nationTypeList = ref<SelectProps[]>([]);
  683. const isFullTimeList = ref<SelectProps[]>([]);
  684. //const occupationalCategoryList = ref<SelectProps[]>([]);
  685. const occupationalLevelList = ref<SelectProps[]>([]);
  686. const difficultSituationList = ref<SelectProps[]>();
  687. const familyNatureList = ref([]);
  688. const politicsStatusList = ref([]);
  689. const regionList = ref<SelectProps[]>([]);
  690. const streetList = ref<SelectProps[]>([]);
  691. const educationList = ref([]);
  692. const experienceList = ref([]);
  693. const jobHuntList = ref([]);
  694. const honorList = ref([]);
  695. const isEdit =ref(false);
  696. const baseInfoData = reactive<BaseData>({
  697. baseData:{
  698. jobUserID:null,
  699. loginUserID:'',
  700. siteID:null,
  701. name:null,
  702. identityNumber: null,
  703. sex: 1,
  704. userMobile: null,
  705. address: null,
  706. jobStatusID: null,
  707. keyPersonTypeID: null,
  708. politicsStatusID:null,
  709. birthPlace:null,
  710. birthDay:dayjs().format("YYYY-MM-DD"),
  711. familyNatureID:null,
  712. cultureRank:null,
  713. healthID:null,
  714. //bloodTypeID:null,
  715. height:null,
  716. vision:null,
  717. weight:null,
  718. maritalStatusID:null,
  719. provinceCode:null,
  720. regionCode:null,
  721. streetCode:null,
  722. userName:null,
  723. familyAddress:null,
  724. postalCode:null,
  725. email:'',
  726. hobby:null,
  727. personalSkills:null,
  728. socialSecurityCard:"",
  729. finishSchool:null,
  730. finishDate:"",
  731. showFinishDate:dayjs().format('YYYY-MM-DD'),
  732. profession:null,
  733. nativePlace:null,
  734. isFullTime:null,
  735. occupationalCategory:null,
  736. occupationalCategoryName:null,
  737. occupationalLevel: null,
  738. longitude: null,
  739. latitude: null,
  740. listLabel: null,
  741. ordinaryPersonTypeID: null,
  742. educationalSystem: null,
  743. difficultSituationID: null,
  744. esHouseholdRegistration: null,
  745. }});
  746. const pageParams = reactive({
  747. pageIndex: 1,
  748. pageSize: 5,
  749. total:0,
  750. jobUserID:''
  751. });
  752. const baseDataRule = computed(()=>{
  753. return {baseData:{
  754. regionCode:{required},
  755. streetCode:{required},
  756. name:{required},
  757. birthDay: {required},
  758. sex:{required},
  759. userMobile:{required},
  760. address:{required},
  761. jobStatusID:{required},
  762. keyPersonTypeID:{required},
  763. }}
  764. });
  765. const baseDataValid = useVuelidate(baseDataRule,baseInfoData);
  766. // 删除警告弹窗开关
  767. const delAlertOpen = ref(false);
  768. // 删除数据
  769. const delID = ref("");
  770. const postUrl = ref("jobUserService/education/deleteEducation");
  771. const actionName = ref("删除教育经历信息");
  772. // 删除加载
  773. const delLoading = ref(false);
  774. // 信息弹窗开关
  775. const infoAlertOpen = ref(false);
  776. // 删除警告弹窗按钮定义
  777. const infoAlertButtons = [
  778. {
  779. text: '确定',
  780. role: 'confirm',
  781. handler: () => {
  782. reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal);
  783. },
  784. },
  785. ];
  786. // 设置要删除的教育经历
  787. function setDelAlertOpen(value: boolean, id: any) {
  788. delAlertOpen.value = value;
  789. if(id != null) {
  790. delID.value = id;
  791. }
  792. }
  793. // 设置信息提示弹窗开关
  794. function setInfoAlertOpen(value: boolean) {
  795. infoAlertOpen.value = value;
  796. }
  797. // 设置删除弹窗开启关闭
  798. function setDelLoadingOpen(value: boolean) {
  799. delLoading.value = value;
  800. }
  801. // 信息弹窗内容
  802. const infoAlterData = reactive({
  803. title:"",
  804. message:""
  805. });
  806. // 删除警告弹窗按钮定义
  807. const delAlertButtons = [
  808. {
  809. text: '取消',
  810. role: 'cancel',
  811. handler: () => {
  812. console.log("取消了删除");
  813. },
  814. },
  815. {
  816. text: '确定',
  817. role: 'confirm',
  818. handler: () => {
  819. delLoading.value = true;
  820. postUrl.value = "jobUserService/education/deleteEducation";
  821. actionName.value = "删除教育经历";
  822. if(curStepData.value.statusVal!=2){
  823. postUrl.value = curStepData.value.statusVal==3 ?"jobUserService/experience/deleteExperience":"jobUserService/jobHunt/delete";
  824. actionName.value = curStepData.value.statusVal==3 ?"删除工作经验":"删除求职意向";
  825. }
  826. const param = {
  827. loginUserID: userInfo.value.userID
  828. }
  829. postByDataAndParams(postUrl.value, [delID.value], curStepData.value.statusVal == 4 ? param : {}, actionName.value).then((res) => {
  830. /*infoAlterData.title = "提示";
  831. infoAlterData.message = "删除成功";
  832. setInfoAlertOpen(true);*/
  833. }).finally(()=>{
  834. delLoading.value = false;
  835. reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal);
  836. });
  837. },
  838. },
  839. ];
  840. const presentAlert = async (message: string) => {
  841. const alert = await alertController.create({
  842. header: '错误!',
  843. message: message,
  844. buttons: [
  845. '确定'
  846. ],
  847. });
  848. await alert.present();
  849. }
  850. const onResultBackLabels = (data: any) => {
  851. baseInfoData.baseData.listLabel = data;
  852. }
  853. const onBack = () => {
  854. curStepData.value.statusVal-=1;
  855. if(curStepData.value.statusVal > 0){
  856. router.push({path:"./edit", query: {reload:0,educationID:null,jobHuntID:null,jobUserID: baseInfoData.baseData.jobUserID,status:curStepData.value.statusVal}});
  857. }else{
  858. router.push("./list");
  859. }
  860. }
  861. const inputDataValidate = () =>{
  862. isAllowCommit.value = true;
  863. const identReg = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{3}([0-9Xx])$/;
  864. if (baseInfoData.baseData.identityNumber) {
  865. if(!identReg.test(baseInfoData.baseData.identityNumber)){
  866. presentAlert("输入的身份证号码有误!");
  867. isAllowCommit.value = false;
  868. }else{
  869. // 计算身份证校验码
  870. const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  871. const checkCode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  872. let sum = 0;
  873. for(let i = 0; i<weights.length;i++){
  874. sum += weights[i] * parseInt(String(baseInfoData.baseData.identityNumber).substring(i,i+1));
  875. }
  876. if(String(baseInfoData.baseData.identityNumber).substring(17,18)!=checkCode[sum%11]){
  877. presentAlert("输入的身份证号码有误!");
  878. console.log("lastOne",checkCode[sum%11]);
  879. isAllowCommit.value = false;
  880. }
  881. }
  882. }
  883. const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  884. if(baseInfoData.baseData.userMobile != null){
  885. if(!mobileReg.test(baseInfoData.baseData.userMobile)){
  886. presentAlert("输入的联系电话有误!");
  887. isAllowCommit.value = false;
  888. }
  889. }
  890. const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
  891. if(baseInfoData.baseData.email!=""&&baseInfoData.baseData.email!=null){
  892. if(!emailReg.test(baseInfoData.baseData.email)){
  893. presentAlert("输入的电子邮箱有误!");
  894. isAllowCommit.value = false;
  895. }
  896. }
  897. };
  898. const onSetOccupationalID = (data: any)=>{
  899. baseInfoData.baseData.occupationalCategory = data.value;
  900. baseInfoData.baseData.occupationalCategoryName = data.text;
  901. }
  902. const onSave = async function (){
  903. console.log(baseInfoData.baseData)
  904. if (curStepData.value.statusVal==1){
  905. const isFormCorrect = await baseDataValid.value.$validate();
  906. if(isGraduating.value&&baseInfoData.baseData.finishDate==null){
  907. await presentAlert("请选择毕业日期!");
  908. return null;
  909. }
  910. if (isGraduating.value && baseInfoData.baseData.educationalSystem == null) {
  911. await presentAlert("请输入学制!");
  912. return null;
  913. }
  914. if (isGraduating.value && baseInfoData.baseData.finishSchool == null) {
  915. await presentAlert("请输入毕业院校!");
  916. return null;
  917. }
  918. if(!isFormCorrect){
  919. await presentAlert("请填写完整的信息!");
  920. return null;
  921. }
  922. inputDataValidate();
  923. if(isAllowCommit.value){
  924. console.log("当前数据",baseInfoData.baseData);
  925. const userMobile = baseInfoData.baseData.userMobile;
  926. const identityNumber = baseInfoData.baseData.identityNumber;
  927. baseInfoData.baseData.userMobile = crtyptoHelp.encryptDesText(userMobile);
  928. baseInfoData.baseData.identityNumber = crtyptoHelp.encryptDesText(identityNumber);
  929. baseInfoSave(baseInfoData.baseData).then(result => {
  930. if (result) {
  931. router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:2}});
  932. }
  933. }, () => {
  934. baseInfoData.baseData.userMobile = userMobile;
  935. baseInfoData.baseData.identityNumber = identityNumber;
  936. });
  937. }
  938. }
  939. else if (curStepData.value.statusVal==2){
  940. await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:3}});
  941. }else if (curStepData.value.statusVal==3){
  942. await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:4}});
  943. } else if (curStepData.value.statusVal == 4) {
  944. await router.push({path: './edit', query: {reload: 0, jobUserID: baseInfoData.baseData.jobUserID, status: 5}});
  945. }
  946. }
  947. const onPathForward = (pathValue: string, educationIDValue: any, experienceIDValue: any, jobHuntIDValue: any, honorIDValue: any, statusValue: any) => {
  948. router.push({
  949. path: pathValue,
  950. query: {
  951. reload: 1,
  952. educationID: educationIDValue,
  953. experienceID: experienceIDValue,
  954. jobHuntID: jobHuntIDValue,
  955. honorID: honorIDValue,
  956. jobUserID: baseInfoData.baseData.jobUserID,
  957. status: statusValue,
  958. isEdit: isEdit.value == true ? 1 : 0
  959. }
  960. });
  961. }
  962. const onPathRedirect = (statusValue:any)=>{
  963. if(isEdit.value) router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue}});
  964. }
  965. const onScroll = (e: any) => {
  966. setTimeout(() => {
  967. e.target.complete();
  968. if (pageParams.total > pageParams.pageIndex * pageParams.pageSize) {
  969. pageParams.pageSize += 5;
  970. loadData(pageParams.jobUserID,curStepData.value.statusVal);
  971. }
  972. }, 500);
  973. }
  974. const onFinish = () => {
  975. router.push("./list");
  976. }
  977. /*下拉字典查询*/
  978. const getSelectorDataList = async function(){
  979. const genderResult :any = await getSysDictionaryList("Gender");
  980. genderList.value = genderResult;
  981. const jobUserStatusResult :any = await getSysDictionaryList("JobStatus");
  982. jobUserStatusList.value = jobUserStatusResult;
  983. const keyPersonTypeResult :any = await getSysDictionaryList("KeyPersonType");
  984. keyPersonTypeList.value = keyPersonTypeResult;
  985. const ordinaryPersonTypeResult: any = await getSysDictionaryList("OrdinaryPersonType");
  986. ordinaryPersonTypeList.value = ordinaryPersonTypeResult;
  987. const cultureRankResult :any = await getSysDictionaryList("HighestDegree");
  988. cultureRankList.value = cultureRankResult;
  989. const userHealthResult :any = await getSysDictionaryList("Health");
  990. userHealthList.value = userHealthResult;
  991. const bloodTypeResult :any = await getSysDictionaryList("BloodType");
  992. bloodTypeList.value = bloodTypeResult;
  993. const maritalStatusResult :any = await getSysDictionaryList("MaritalStatus");
  994. maritalStatusList.value = maritalStatusResult;
  995. const politicsStatusResult :any = await getSysDictionaryList("PoliticsStatus");
  996. politicsStatusList.value = politicsStatusResult;
  997. const familyNatureResult :any = await getSysDictionaryList("FamilyNature");
  998. familyNatureList.value = familyNatureResult;
  999. const nationTypeListResult :any = await getSysDictionaryList("NationType");
  1000. nationTypeList.value = nationTypeListResult;
  1001. const isFullTimeListResult :any = await getSysDictionaryList("IsFullTime");
  1002. isFullTimeList.value = isFullTimeListResult;
  1003. const difficultSituationResult: any = await getSysDictionaryList("DifficultSituation");
  1004. difficultSituationList.value = difficultSituationResult;
  1005. //const occupationalCategoryListResult :any = await getSysDictionaryList("OccupationalCategory");
  1006. //occupationalCategoryList.value = occupationalCategoryListResult;
  1007. const occupationalLevelListResult :any = await getSysDictionaryList("OccupationalLevel");
  1008. occupationalLevelList.value = occupationalLevelListResult;
  1009. }
  1010. const getSiteInfoList = async function(){
  1011. const siteInfoResult :any = await getSiteDataList();
  1012. siteInfoList.value = siteInfoResult;
  1013. }
  1014. const getRegionList = async function(){
  1015. const regionResult: any = await getRegionCodeList();
  1016. regionList.value = regionResult;
  1017. }
  1018. const getStreetList = async function(){
  1019. if (baseInfoData.baseData.regionCode != null){
  1020. const streetResult: any = await getStreetCodeList(baseInfoData.baseData.regionCode);
  1021. streetList.value = streetResult;
  1022. }
  1023. }
  1024. const finishDateChange = function(){
  1025. baseInfoData.baseData.finishDate = baseInfoData.baseData.showFinishDate.substring(0,7);
  1026. console.log(baseInfoData.baseData.finishDate);
  1027. }
  1028. const isGraduating = ref(false); // 大学基础信息是否为必填
  1029. const ordinaryPersonTypeChange = function () {
  1030. // 如果是应届高校毕业生,则大学基础信息部分字段为必填
  1031. isGraduating.value = baseInfoData.baseData.ordinaryPersonTypeID == 2;
  1032. dxExpand.value = isGraduating.value;
  1033. }
  1034. const regionChange = async function(){
  1035. baseInfoData.baseData.streetCode = null;
  1036. await getStreetList();
  1037. }
  1038. const provinceChange = async function(){
  1039. baseInfoData.baseData.regionCode = null;
  1040. await getRegionList();
  1041. await regionChange();
  1042. }
  1043. const educationalSystemBlur = function () {
  1044. if (baseInfoData.baseData.educationalSystem != null) {
  1045. baseInfoData.baseData.educationalSystem = Math.floor(baseInfoData.baseData.educationalSystem);
  1046. }
  1047. }
  1048. const loadData = async (jobUserID: any,status:any) => {
  1049. loading.value = true;
  1050. pageParams.jobUserID = jobUserID;
  1051. baseInfoData.baseData.jobUserID = jobUserID;
  1052. curStepData.value.statusVal = status;
  1053. const loginUserInfo = useUserStore().getUserInfo;
  1054. const curUserID = loginUserInfo.userID == undefined?"":loginUserInfo.userID;
  1055. //console.log("当前jobUserID",jobUserID);
  1056. if(curStepData.value.statusVal==1){
  1057. const reqData = await getJobUserById(jobUserID,curUserID,true);
  1058. isEdit.value = jobUserID != null;
  1059. baseInfoData.baseData = reqData;
  1060. if (!reqData.birthDay) {
  1061. baseInfoData.baseData.birthDay = dayjs().format('YYYY-MM-DD');
  1062. }
  1063. baseInfoData.baseData.userMobile = crtyptoHelp.decryptDesText(baseInfoData.baseData.userMobile);
  1064. baseInfoData.baseData.identityNumber = crtyptoHelp.decryptDesText(baseInfoData.baseData.identityNumber);
  1065. baseInfoData.baseData.loginUserID = curUserID;
  1066. if(baseInfoData.baseData.keyPersonTypeID==2){
  1067. isGraduating.value = true;
  1068. }
  1069. console.log('初始化baseData',baseInfoData.baseData);
  1070. await getStreetList();
  1071. }
  1072. else if(curStepData.value.statusVal==2){
  1073. const reqData :any = await getEducationListByJobUserID(pageParams);
  1074. educationList.value = reqData.list;
  1075. pageParams.total = reqData.total;
  1076. //console.log("educationList",educationList.value);
  1077. }
  1078. else if(curStepData.value.statusVal==3){
  1079. const reqData = await getExperienceListByJobUserID(pageParams);
  1080. experienceList.value= reqData.list;
  1081. pageParams.total = reqData.total;
  1082. //console.log("experienceList",experienceList.value);
  1083. }
  1084. else if(curStepData.value.statusVal==4){
  1085. const reqData = await getJobHuntListByJobUserID(pageParams);
  1086. jobHuntList.value= reqData.list;
  1087. pageParams.total = reqData.total;
  1088. //console.log("jobHuntList",jobHuntList.value);
  1089. } else if (curStepData.value.statusVal == 5) {
  1090. await getHonorListByJobUserID(jobUserID).then((result: any) => {
  1091. honorList.value = result;
  1092. pageParams.total = result.length;
  1093. })
  1094. }
  1095. if (jobUserID == null) {
  1096. setLongitudeLatitude();
  1097. }
  1098. loading.value = false;
  1099. };
  1100. watch(() => route.query, () => {
  1101. if (route.query.reload) {
  1102. loadData(route.query.jobUserID,route.query.status);
  1103. }
  1104. });
  1105. watch(() => baseInfoData.baseData.identityNumber, () => {
  1106. if(baseInfoData.baseData.identityNumber != null && String(baseInfoData.baseData.identityNumber).length == 18){
  1107. const identReg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/;
  1108. if(identReg.test(baseInfoData.baseData.identityNumber)){
  1109. const birthDayStr = String(baseInfoData.baseData.identityNumber).substring(6,14);
  1110. const sexStr = String(baseInfoData.baseData.identityNumber).substring(16,17);
  1111. baseInfoData.baseData.sex = parseInt(sexStr)%2 == 0 ? 2 : 1; //双女单男
  1112. baseInfoData.baseData.birthDay = dayjs(birthDayStr).format("YYYY-MM-DD");
  1113. }
  1114. }
  1115. });
  1116. const reload = (jobUserID:any,status:any) => {
  1117. pageParams.pageIndex = 1;
  1118. dxExpand.value = false;
  1119. expand.value = false;
  1120. loadData(jobUserID,status);
  1121. }
  1122. // 设置经纬度
  1123. function setLongitudeLatitude() {
  1124. getPosition().then((data: any) => {
  1125. console.log(data);
  1126. if (data.longitude != null && data.latitude != null) {
  1127. baseInfoData.baseData.longitude = data.longitude;
  1128. baseInfoData.baseData.latitude = data.latitude;
  1129. }
  1130. })
  1131. }
  1132. onIonViewDidEnter(() => {
  1133. if (route.query.reload)
  1134. reload(route.query.jobUserID,route.query.status);
  1135. });
  1136. return {
  1137. ...toRefs(baseInfoData),
  1138. arrowBackOutline,
  1139. addCircleOutline,
  1140. trashOutline,
  1141. route,
  1142. router,
  1143. isEdit,
  1144. expand,
  1145. dxExpand,
  1146. loading,
  1147. stepList,
  1148. curStepData,
  1149. baseDataValid,
  1150. siteInfoList,
  1151. genderList,
  1152. nationTypeList,
  1153. isFullTimeList,
  1154. //occupationalCategoryList,
  1155. occupationalLevelList,
  1156. familyNatureList,
  1157. politicsStatusList,
  1158. pageParams,
  1159. jobUserStatusList,
  1160. keyPersonTypeList,
  1161. ordinaryPersonTypeList,
  1162. difficultSituationList,
  1163. cultureRankList,
  1164. userHealthList,
  1165. bloodTypeList,
  1166. maritalStatusList,
  1167. provinceList,
  1168. regionList,
  1169. streetList,
  1170. educationList,
  1171. experienceList,
  1172. jobHuntList,
  1173. delID,
  1174. delAlertButtons,
  1175. infoAlertButtons,
  1176. delAlertOpen,
  1177. infoAlertOpen,
  1178. delLoading,
  1179. infoAlterData,
  1180. isGraduating,
  1181. honorList,
  1182. finishDateChange,
  1183. ordinaryPersonTypeChange,
  1184. provinceChange,
  1185. regionChange,
  1186. onSetOccupationalID,
  1187. onResultBackLabels,
  1188. onSave,
  1189. onBack,
  1190. onFinish,
  1191. onScroll,
  1192. onPathForward,
  1193. onPathRedirect,
  1194. loadData,
  1195. reload,
  1196. setDelAlertOpen,
  1197. setInfoAlertOpen,
  1198. setDelLoadingOpen,
  1199. getSiteInfoList,
  1200. getSelectorDataList,
  1201. getRegionList,
  1202. getStreetList,
  1203. dayjs,
  1204. educationalSystemBlur
  1205. }
  1206. },
  1207. mounted(){
  1208. this.getSiteInfoList();
  1209. this.getSelectorDataList();
  1210. this.getRegionList();
  1211. this.getStreetList();
  1212. }
  1213. });
  1214. </script>
  1215. <style lang="less">
  1216. ion-select#sex.md.select-disabled.legacy-select::after{display: none;}
  1217. ion-select#siteID.md.select-disabled.legacy-select::after{display: none;}
  1218. ion-select#regionCode.md.select-disabled.legacy-select::after{display: none;}
  1219. .custom{
  1220. --placeholder-color: gray;
  1221. --placeholder-opacity: 0.5;
  1222. }
  1223. .title-item{
  1224. margin-left: 15px;
  1225. color:#1c3d70 !important;
  1226. font-size: 14px !important;
  1227. font-weight: bold;
  1228. }
  1229. .next-btn {
  1230. width: 80px;
  1231. border-radius: 5px;
  1232. background-color:#3a7be0;
  1233. color: #363432;
  1234. font-size: 14px;
  1235. }
  1236. .iconBtn{
  1237. width:24px;
  1238. height:24px;
  1239. }
  1240. .stepFlex {
  1241. margin: 0;
  1242. display: flex;
  1243. width: 100%;
  1244. .stepFlex-item {
  1245. position: relative;
  1246. flex: 1;
  1247. text-align: center;
  1248. margin-top: -10px;
  1249. .stepFlex-item-label {
  1250. padding-top: 30px;
  1251. font-size: 14px;
  1252. .stepFlex-item-label-title{
  1253. margin-top:30px;
  1254. }
  1255. .stepFlex-item-label-desc{
  1256. margin-top:5px;color: #b9b9bd;
  1257. }
  1258. }
  1259. }
  1260. .greenCircle {
  1261. top: calc(50% - 15px);
  1262. left: calc(50% - 4px);
  1263. position: absolute;
  1264. z-index: 2;
  1265. width: 10px;
  1266. height: 10px;
  1267. border-radius: 50%;
  1268. background-color: #31A2FE;
  1269. }
  1270. .now {
  1271. top: calc(50% - 18px);
  1272. left: calc(50% - 8px);
  1273. position: absolute;
  1274. z-index: 3;
  1275. width: 16px;
  1276. height: 16px;
  1277. border-radius: 50%;
  1278. background-color: #31A2FE;
  1279. border: 4px solid #c5e8f9;
  1280. }
  1281. .grayCircle {
  1282. top: calc(50% - 15px);
  1283. left: calc(50% - 4px);
  1284. position: absolute;
  1285. z-index: 2;
  1286. width: 10px;
  1287. height: 10px;
  1288. border-radius: 50%;
  1289. background-color: #ccc;
  1290. }
  1291. .greenLine {
  1292. width: 100%;
  1293. top: calc(50% - 11px);
  1294. left: calc(50% - 2px);
  1295. height: 2px;
  1296. background-color: #31A2FE;
  1297. position: absolute;
  1298. }
  1299. .grayLine {
  1300. height: 0;
  1301. border: 1px dashed #ccc;
  1302. width: 100%;
  1303. top: calc(50% - 11px);
  1304. left: calc(50% - 2px);
  1305. position: absolute;
  1306. }
  1307. }
  1308. .dateTimeBox {
  1309. width: 100%;
  1310. display: flex;
  1311. margin-top: 5px;
  1312. justify-content: space-between;
  1313. align-content: center;
  1314. }
  1315. </style>