companyEdit.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. <template>
  2. <ion-page class="list-page">
  3. <ion-header class="header-theme2">
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>企业信息登记</ion-title>
  9. </ion-toolbar>
  10. </ion-header>
  11. <ion-content>
  12. <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">{{ record.title }}</p>
  20. <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
  21. </div>
  22. </div>
  23. </div>
  24. <form autocomplete="off">
  25. <div class="bw-vue-form">
  26. <div class="form-title">基本信息</div>
  27. <div class="form-input">
  28. <ion-label>企业名称<span class="danger">*</span></ion-label>
  29. <ion-input placeholder="请输入企业名称" label-placement="stacked" :clear-input="true"
  30. v-model="dataModel.companyName" class="custom" :style="isAdd?'width: 78%;':''">
  31. </ion-input>
  32. <ion-label v-if="isAdd" style="float:right;width:80px;color:#02A5F0FF;position: relative;bottom:34px;left:14px;"
  33. @click="onGetFirmByCompanyName">同步</ion-label>
  34. <!-- <ion-note slot="error">企业名称不能为空</ion-note>-->
  35. </div>
  36. <div class="form-input">
  37. <ion-label>统一信用代码<span class="danger">*</span></ion-label>
  38. <ion-input placeholder="请输入统一信用代码" label-placement="stacked" :clear-input="true"
  39. v-model="dataModel.companyCode" class="custom">
  40. </ion-input>
  41. <!-- <ion-note slot="error">统一信用代码不能为空</ion-note>-->
  42. </div>
  43. <div class="form-select">
  44. <ion-label>所属驿站<span class="danger">*</span></ion-label>
  45. <ion-select id="siteID" name="siteID" cancel-text="取消" v-model="dataModel.siteID"
  46. interface="action-sheet" placeholder="请选择服务驿站" style="width: 100%;text-align: left;">
  47. <ion-select-option v-for="(record,key) in siteList" :key="key" v-model:value="record.siteID">
  48. {{ record.siteName }}
  49. </ion-select-option>
  50. </ion-select>
  51. <!-- <ion-note slot="error">服务驿站不能为空</ion-note>-->
  52. </div>
  53. <ion-label style="padding-left: 10px;">所属街道<span class="danger">*</span></ion-label>
  54. <div class="form-select">
  55. <ion-select disabled name="regionCode" id="regionCode" okText="确定" cancelText="取消" v-model="dataModel.regionCode"
  56. interface="action-sheet" placeholder="请选择市/县" style="width:50%;float:left;" @ionChange="changeCity()" >
  57. <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">
  58. {{ it.name }}
  59. </ion-select-option>
  60. </ion-select>
  61. <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消"
  62. id="streetCode" v-model="dataModel.streetCode" style="width: 50%;float: left;">
  63. <ion-select-option v-for="(record,key) in streetList" :key="key"
  64. v-model:value="record.code">
  65. {{ record.name }}
  66. </ion-select-option>
  67. </ion-select>
  68. </div>
  69. <div class="form-input">
  70. <ion-label>办公地址<span class="danger">*</span></ion-label>
  71. <ion-textarea placeholder="请输入办公地址" label-placement="stacked" :rows="3" :clear-input="true"
  72. v-model="dataModel.companyAddress" class="custom" style="border-bottom: 1px solid #fff2e8;">
  73. </ion-textarea>
  74. <!-- <ion-note slot="error">办公地址不能为空</ion-note>-->
  75. </div>
  76. <div class="form-input">
  77. <ion-label>企业联系人<span class="danger">*</span></ion-label>
  78. <ion-input placeholder="请输入企业联系人" label-placement="stacked" :clear-input="true"
  79. v-model="dataModel.userName" class="custom">
  80. </ion-input>
  81. <!-- <ion-note slot="error">企业联系人不能为空</ion-note>-->
  82. </div>
  83. <div class="form-input">
  84. <ion-label>联系电话<span class="danger">*</span></ion-label>
  85. <ion-input placeholder="请输入联系电话" label-placement="stacked" :clear-input="true"
  86. v-model="dataModel.userMobile" class="custom">
  87. </ion-input>
  88. <!-- <ion-note slot="error">企业联系电话不能为空</ion-note>-->
  89. </div>
  90. <div class="form-select">
  91. <ion-label>企业状态<span class="danger">*</span></ion-label>
  92. <ion-select id="recordStatus" name="recordStatus" cancel-text="取消" v-model="dataModel.recordStatus"
  93. interface="action-sheet" placeholder="请选择企业状态" style="width: 100%;text-align: left;">
  94. <ion-select-option v-for="(record,key) in companyStatusList" :key="key"
  95. v-model:value="record.value">
  96. {{ record.name }}
  97. </ion-select-option>
  98. </ion-select>
  99. <!-- <ion-note slot="error">企业状态不能为空</ion-note>-->
  100. </div>
  101. <div class="form-select">
  102. <ion-label>是否缺工<span class="danger">*</span></ion-label>
  103. <ion-select id="isShortAge" name="isShortAge" cancel-text="取消" v-model="dataModel.isShortage"
  104. interface="action-sheet" placeholder="请选择是否缺工" style="width: 100%;text-align: left;">
  105. <ion-select-option v-for="(record,key) in shortAgeTypeList" :key="key"
  106. v-model:value="record.value">
  107. {{ record.name }}
  108. </ion-select-option>
  109. </ion-select>
  110. <!-- <ion-note slot="error">是否缺工不能为空</ion-note>-->
  111. </div>
  112. <div class="form-title">
  113. 其他信息
  114. <div style="float:right;">
  115. <ion-label style="color: red;font-size: 14px;" @click="isShow=!isShow">{{isShow?"收起":"展开"}}</ion-label>
  116. </div>
  117. </div>
  118. <div v-show="isShow" >
  119. <div class="form-input">
  120. <ion-label>法定代表人(负责人)</ion-label>
  121. <ion-input placeholder="请输入法定代表人" label-placement="stacked" :clear-input="true"
  122. v-model="dataModel.frName" class="custom">
  123. </ion-input>
  124. </div>
  125. <div class="form-input">
  126. <ion-label>营业执照有效期</ion-label>
  127. <div>
  128. <ion-radio v-model:checked="isLongDate" justify="start" labelPlacement="end"
  129. @click="changeLongDate" style="height:30px;">至长期</ion-radio>
  130. <ion-datetime-button datetime="validDate" style="position:relative;right:105px;"></ion-datetime-button>
  131. <ion-modal :keep-contents-mounted="true" >
  132. <ion-datetime id="validDate" name="validDate" placeholder="营业执照有效期"
  133. v-model="dataModel.validDate" :prefer-wheel="true" @ionChange="changeValidDate"
  134. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  135. :show-default-buttons="true" >
  136. </ion-datetime>
  137. </ion-modal>
  138. </div>
  139. </div>
  140. <div class="form-input">
  141. <ion-label>成立日期</ion-label>
  142. <div>
  143. <ion-datetime-button datetime="establishmentTime" style="position:relative;right:110px;"></ion-datetime-button>
  144. <ion-modal :keep-contents-mounted="true" >
  145. <ion-datetime id="establishmentTime" name="establishmentTime"
  146. v-model="dataModel.establishmentTime" :prefer-wheel="true"
  147. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  148. :show-default-buttons="true" >
  149. </ion-datetime>
  150. </ion-modal>
  151. </div>
  152. </div>
  153. <div class="form-input" >
  154. <ion-label>注册资本(万元)</ion-label>
  155. <ion-input placeholder="请输入注册资本" label-placement="stacked" :clear-input="true"
  156. v-model="dataModel.registeredCapital" class="custom">
  157. </ion-input>
  158. </div>
  159. <div class="form-select">
  160. <ion-label>企业注册地址行政区划</ion-label>
  161. <ion-select interface="action-sheet" placeholder="请选择" cancel-text="取消"
  162. id="signInPoliticalArea" v-model="dataModel.signInPoliticalArea"
  163. style="width: 100%;text-align: left;">
  164. <ion-select-option v-for="(record,key) in regionList" :key="key"
  165. v-model:value="record.code">
  166. {{ record.name }}
  167. </ion-select-option>
  168. </ion-select>
  169. </div>
  170. <div class="form-input" >
  171. <ion-label>企业邮箱</ion-label>
  172. <ion-input placeholder="请输入企业邮箱" label-placement="stacked" :clear-input="true"
  173. v-model="dataModel.companyEmail" class="custom">
  174. </ion-input>
  175. </div>
  176. <div class="form-select">
  177. <ion-label>经济类型</ion-label>
  178. <ion-select interface="action-sheet" placeholder="请选择经济类型" cancel-text="取消"
  179. id="companyType" v-model="dataModel.companyType" style="width: 100%;text-align: left;">
  180. <ion-select-option v-for="(record,key) in companyTypeList" :key="key"
  181. v-model:value="record.value">
  182. {{ record.name }}
  183. </ion-select-option>
  184. </ion-select>
  185. </div>
  186. <div class="form-input">
  187. <ion-label>所属行业</ion-label>
  188. <div>
  189. <ion-input placeholder="请选择所属行业" label-placement="stacked" style="float: left;width:78%;"
  190. v-model="dataModel.industryName" class="custom" readonly >
  191. </ion-input>
  192. <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
  193. <industry-selection :IndustryId="dataModel.industryID" @SetIndustryID="onSetIndustryID"></industry-selection>
  194. </ion-item>
  195. </div>
  196. <!-- <ion-select interface="action-sheet" placeholder="请选择所属行业" cancel-text="取消"-->
  197. <!-- id="professionID" v-model="dataModel.professionID" style="width: 100%;text-align: left;">-->
  198. <!-- <ion-select-option v-for="(record,key) in professionList" :key="key"-->
  199. <!-- v-model:value="record.value">-->
  200. <!-- {{ record.name }}-->
  201. <!-- </ion-select-option>-->
  202. <!-- </ion-select>-->
  203. </div>
  204. <div class="form-select">
  205. <ion-label>所属产业分类</ion-label>
  206. <ion-select interface="action-sheet" placeholder="请选择所属产业分类" cancel-text="取消"
  207. id="estateCategoryID" v-model="dataModel.estateCategoryID" style="width: 100%;text-align: left;">
  208. <ion-select-option v-for="(record,key) in estateCategoryList" :key="key"
  209. v-model:value="record.value">
  210. {{ record.name }}
  211. </ion-select-option>
  212. </ion-select>
  213. </div>
  214. <!-- <div class="form-select">-->
  215. <!-- <ion-label>企业标签</ion-label>-->
  216. <!-- <ion-select interface="action-sheet" placeholder="请选择企业标签" cancel-text="取消"-->
  217. <!-- id="tagID" v-model="dataModel.tagID" style="width: 100%;text-align: left;">-->
  218. <!-- <ion-select-option v-for="(record,key) in companyTagList" :key="key"-->
  219. <!-- v-model:value="record.value" style="width:100%;text-align: left;">-->
  220. <!-- {{ record.name }}-->
  221. <!-- </ion-select-option>-->
  222. <!-- </ion-select>-->
  223. <!-- </div>-->
  224. <div class="form-input">
  225. <ion-label>企业网站</ion-label>
  226. <ion-input type="number" placeholder="请输入企业网站" label-placement="stacked" :clear-input="true"
  227. v-model="dataModel.website" class="custom">
  228. </ion-input>
  229. </div>
  230. <div class="form-input">
  231. <ion-label>企业福利</ion-label>
  232. <ion-textarea placeholder="请输入企业福利" :rows="3" label-placement="stacked" :clear-input="true"
  233. v-model="dataModel.bonus" class="custom" style="border-bottom: 1px solid #fff2e8;">
  234. </ion-textarea>
  235. </div>
  236. <div class="form-select">
  237. <ion-label>企业规模</ion-label>
  238. <ion-select interface="action-sheet" placeholder="请选择企业规模" cancel-text="取消"
  239. id="companyModel" v-model="dataModel.companyModel" style="width: 100%;text-align: left;">
  240. <ion-select-option v-for="(record,key) in companyModelList" :key="key"
  241. v-model:value="record.value" style="width:100%;text-align: left;">
  242. {{ record.name }}
  243. </ion-select-option>
  244. </ion-select>
  245. </div>
  246. <div class="form-input">
  247. <ion-label>用工情况(人)</ion-label>
  248. <ion-input type="number" placeholder="请输入用工人数" label-placement="stacked" :clear-input="true"
  249. v-model="dataModel.workSituation" class="custom">
  250. </ion-input>
  251. </div>
  252. <div class="form-input">
  253. <ion-label>参保人数(人)</ion-label>
  254. <ion-input type="number" placeholder="请输入参保人数" label-placement="stacked" :clear-input="true"
  255. v-model="dataModel.insuredCount" class="custom">
  256. </ion-input>
  257. </div>
  258. <div class="form-input">
  259. <ion-label>经营范围</ion-label>
  260. <ion-textarea placeholder="请输入经营范围" :rows="3" label-placement="stacked" :clear-input="true"
  261. v-model="dataModel.businScope" class="custom" style="border-bottom: 1px solid #fff2e8;">
  262. </ion-textarea>
  263. </div>
  264. <div class="form-input">
  265. <ion-label>企业简介</ion-label>
  266. <ion-textarea placeholder="请输入企业简介" :rows="3" label-placement="stacked" :clear-input="true"
  267. v-model="dataModel.companyDesc" class="custom" style="border-bottom: 1px solid #fff2e8;">
  268. </ion-textarea>
  269. </div>
  270. </div>
  271. </div>
  272. </form>
  273. </ion-content>
  274. <ion-footer>
  275. <ion-toolbar>
  276. <ion-button style="width:100%;" @click="onNext">保存并下一步</ion-button>
  277. </ion-toolbar>
  278. </ion-footer>
  279. <ion-alert
  280. :is-open="alertingInfo"
  281. :header="infoAlterData.title"
  282. :message="infoAlterData.message"
  283. :buttons="infoAlertButtons"
  284. @didDismiss="setInfoAlertOpen(false)"
  285. ></ion-alert>
  286. <ion-loading
  287. :is-open="loadingFirm"
  288. message="正在同步企业信息..."
  289. @didDismiss="setInfoLoadingOpen(false)" >
  290. </ion-loading>
  291. </ion-page>
  292. </template>
  293. <script lang="ts">
  294. import {arrowBackOutline} from 'ionicons/icons';
  295. import {defineComponent, reactive, ref,computed, toRefs} from "vue";
  296. import {useRoute,useRouter} from "vue-router";
  297. import {alertController, onIonViewDidEnter} from "@ionic/vue";
  298. import {useVuelidate} from "@vuelidate/core";
  299. import {getCompanyById, getRegionList, getSiteList, getStreeList,normalFirm, saveCompanyInfo} from "@/api/company";
  300. import {required} from "@vuelidate/validators";
  301. import {getSysDictionaryList} from "@/api/system/dictionary";
  302. import dayjs from "dayjs";
  303. import IndustrySelection from "@/components/industrySelection.vue";
  304. import {getPosition} from "@/utils/position";
  305. interface StepParams{
  306. loginUserID: string,
  307. openID:string,
  308. statusVal: number
  309. }
  310. export default defineComponent({
  311. name: "companyInfoEdit",
  312. components:{IndustrySelection},
  313. setup() {
  314. const route = useRoute();
  315. const router = useRouter();
  316. const isAllowCommit = ref(true);
  317. const curStepData = ref<StepParams>({
  318. loginUserID:"",
  319. openID:"",
  320. statusVal: 1
  321. });
  322. const isAdd = ref(false);
  323. const isShow = ref<any>(false);
  324. const loadingFirm = ref(false);
  325. // 信息弹窗内容
  326. const infoAlterData = reactive({
  327. title:"",
  328. message:""
  329. });
  330. const alertingInfo = ref(false);
  331. function setInfoAlertOpen(value: boolean) {
  332. alertingInfo.value = value;
  333. }
  334. function setInfoLoadingOpen(value: boolean) {
  335. loadingFirm.value = value;
  336. }
  337. const infoAlertButtons = [
  338. {
  339. text: '确定',
  340. role: 'confirm',
  341. handler: () => {
  342. setInfoAlertOpen(false);
  343. },
  344. },
  345. ];
  346. const isLongDate = ref<any>(false);
  347. const formState = reactive({
  348. dataModel: {
  349. companyID:null,
  350. companyCode: '',
  351. companyName: null,
  352. siteID: null,
  353. companyAddress: null,
  354. userName: null,
  355. userMobile: '',
  356. recordStatus: null,
  357. isShortage: null,
  358. frName: null,
  359. validDate: dayjs().format("YYYY-MM-DD"),
  360. establishmentTime: dayjs().format("YYYY-MM-DD"),
  361. registeredCapital:null,
  362. signInPoliticalArea:null,
  363. companyEmail: '',
  364. companyType: null,
  365. industryID:null,
  366. industryName:null,
  367. estateCategoryID:null,
  368. tagID:null,
  369. website:null,
  370. companyModel: null,
  371. regionCode: null,
  372. streetCode: null,
  373. workSituation: null,
  374. insuredCount: null,
  375. businScope: null,
  376. companyDesc: null,
  377. openId:null,
  378. loginUserID: '',
  379. longitude: null,
  380. latitude: null
  381. }});
  382. const stepList = ref([
  383. {title: '基础信息', desc: '企业基础信息', val: 1},
  384. {title: '岗位信息', desc: '企业岗位信息', val: 2}
  385. ]);
  386. const companyStatusList = ref([]);
  387. const companyModelList = ref<any>([]);
  388. const companyTypeList = ref<any>([]);
  389. const companyTagList = ref<any>([]);
  390. const estateCategoryList = ref<any>([]);
  391. const regionList = ref<any>([]);
  392. const streetList = ref<any>([]);
  393. const siteList = ref<any>([]);
  394. const shortAgeTypeList = ref<any>([]);
  395. const getCompanyModelList = async function(){
  396. const companyModelResult :any = await getSysDictionaryList("CompanyModel");
  397. companyModelList.value = companyModelResult;
  398. }
  399. const getCompanyTagList = async function(){
  400. const companyTagResult :any = await getSysDictionaryList("CompanyTag");
  401. companyTagList.value = companyTagResult;
  402. }
  403. const getCompanyTypeList = async function(){
  404. const companyTypeResult :any = await getSysDictionaryList("CompanyType");
  405. companyTypeList.value = companyTypeResult;
  406. }
  407. const getCompanyStatusList = async function(){
  408. const companyStatusResult :any = await getSysDictionaryList("CompanyStatus");
  409. companyStatusList.value = companyStatusResult;
  410. }
  411. const getEstateCategoryList = async function(){
  412. const estateCategoryResult :any = await getSysDictionaryList("CompanyEstateCategory");
  413. estateCategoryList.value = estateCategoryResult;
  414. }
  415. const getShortAgeTypeList = async function(){
  416. const shortAgeTypeResult :any = await getSysDictionaryList("IsShortAge");
  417. shortAgeTypeList.value = shortAgeTypeResult;
  418. }
  419. const rules = computed(() => {
  420. return {
  421. dataModel: {
  422. companyCode: {required},
  423. companyName: {required},
  424. siteID: {required},
  425. companyAddress: {required},
  426. userName: {required},
  427. userMobile: {required},
  428. recordStatus: {required},
  429. isShortage: {required},
  430. }
  431. }
  432. });
  433. const v$ = useVuelidate(rules, formState);
  434. const changeLongDate = ()=>{
  435. isLongDate.value = true;
  436. formState.dataModel.validDate = "2099-12-31T00:00:00.000+08:00";
  437. };
  438. const changeValidDate = () => {
  439. isLongDate.value = false;
  440. };
  441. const companyCodeValidate = ()=>{
  442. isAllowCommit.value = true;
  443. const codeReg = /^[0-9A-Z]+$/;
  444. if(formState.dataModel.companyCode.length != 18 || !codeReg.test(formState.dataModel.companyCode)){
  445. presentAlert("输入的信用代码有误!");
  446. isAllowCommit.value = false;
  447. }else{
  448. let aCode;
  449. let aCodeValue;
  450. let total = 0;
  451. const weightedFactors = [1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28];
  452. const str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
  453. for(let i =0;i < formState.dataModel.companyCode.length-1;i++){
  454. aCode = formState.dataModel.companyCode.substring(i,i+1);
  455. aCodeValue = str.indexOf(aCode);
  456. total += aCodeValue * weightedFactors[i];
  457. }
  458. let logicCheckCode = 31 - total % 31;
  459. if(logicCheckCode == 31){
  460. logicCheckCode = 0;
  461. }
  462. const Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
  463. const Array_Str = Str.split(',');
  464. const correctCodeStr = Array_Str[logicCheckCode];
  465. console.log("正确的校验码是",correctCodeStr);
  466. const currentCodeStr = formState.dataModel.companyCode.substring(17, 18);
  467. if (correctCodeStr != currentCodeStr) {
  468. presentAlert('输入的统一信用代码无效!');
  469. isAllowCommit.value = false;
  470. }
  471. }
  472. }
  473. const inputDataValidate = () =>{
  474. const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  475. const landlineReg = /[0-9-()()]{7,18}/;
  476. if(!mobileReg.test(formState.dataModel.userMobile)&&!landlineReg.test(formState.dataModel.userMobile)){
  477. presentAlert("输入的联系电话有误!");
  478. isAllowCommit.value = false;
  479. }
  480. const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
  481. // 这里由于企业邮箱非必填所以先判断是否填写了企业邮箱
  482. if(formState.dataModel.companyEmail!=null&&formState.dataModel.companyEmail!=""){
  483. if(!emailReg.test(formState.dataModel.companyEmail)){
  484. presentAlert("输入的企业邮箱有误!");
  485. isAllowCommit.value = false;
  486. }
  487. }
  488. };
  489. const onGetFirmByCompanyName = async function() {
  490. if(formState.dataModel.companyName){
  491. await setInfoLoadingOpen(true);
  492. const matchedFirmInfo :any = await normalFirm(formState.dataModel.companyName);
  493. if(matchedFirmInfo){
  494. formState.dataModel.frName = matchedFirmInfo.frName;
  495. formState.dataModel.registeredCapital = matchedFirmInfo.registeredCapital;
  496. formState.dataModel.companyCode = matchedFirmInfo.companyCode;
  497. formState.dataModel.insuredCount = matchedFirmInfo.insuredCount;
  498. formState.dataModel.userMobile = matchedFirmInfo.userMobile;
  499. formState.dataModel.companyEmail = matchedFirmInfo.companyEmail;
  500. formState.dataModel.companyAddress = matchedFirmInfo.companyAddress;
  501. formState.dataModel.businScope = matchedFirmInfo.businScope;
  502. formState.dataModel.industryID = matchedFirmInfo.industryID;
  503. formState.dataModel.industryName = matchedFirmInfo.industryName;
  504. formState.dataModel.signInPoliticalArea = matchedFirmInfo.signInPoliticalArea;
  505. await setInfoLoadingOpen(false);
  506. infoAlterData.title = "提示";
  507. infoAlterData.message = "同步成功!";
  508. await setInfoAlertOpen(true);
  509. }else{
  510. await setInfoLoadingOpen(false);
  511. infoAlterData.title = "错误";
  512. infoAlterData.message = "查找不到该企业,请核实企业名称是否正确!";
  513. await setInfoAlertOpen(true);
  514. }
  515. }else{
  516. infoAlterData.title = "提示";
  517. infoAlterData.message = "请输入企业名称!";
  518. await setInfoAlertOpen(true);
  519. }
  520. }
  521. const onSetIndustryID = (data: any)=>{
  522. formState.dataModel.industryID = data.value;
  523. formState.dataModel.industryName = data.text;
  524. }
  525. const onNext = async () => {
  526. const isFormCorrect = await v$.value.$validate();
  527. if (!isFormCorrect) {
  528. await presentAlert('请输入完整信息!');
  529. return null;
  530. }
  531. companyCodeValidate();
  532. inputDataValidate();
  533. if(isAllowCommit.value){
  534. formState.dataModel.loginUserID = curStepData.value.loginUserID;
  535. saveCompanyInfo(formState.dataModel).then(result => {
  536. if (result) {
  537. router.push({path: './postList', query: {reload:1,id:formState.dataModel.companyID,status:2,userID:curStepData.value.loginUserID,openId:curStepData.value.openID}});
  538. }
  539. });
  540. }
  541. };
  542. const onBack = () => {
  543. router.push({path:'/jobUserInfo/index', query: {userId: curStepData.value.loginUserID,openId: curStepData.value.openID}});
  544. }
  545. const getRegionListData = () => {
  546. getRegionList({}).then(data => {
  547. regionList.value = data;
  548. });
  549. }
  550. const getStreetListData = (code: any) => {
  551. getStreeList({code: code}).then(data => {
  552. streetList.value = data;
  553. });
  554. }
  555. const getSiteListData = () => {
  556. getSiteList({}).then(data => {
  557. siteList.value = data;
  558. });
  559. }
  560. const changeCity = () => {
  561. if (formState.dataModel.regionCode)
  562. getStreetListData(formState.dataModel.regionCode);
  563. }
  564. const loadData = async (companyID: any,status:any,userID:any,openId:any) => {
  565. curStepData.value.statusVal = status;
  566. curStepData.value.loginUserID = userID;
  567. curStepData.value.openID = openId;
  568. const reqData = await getCompanyById(companyID,userID);
  569. formState.dataModel = reqData;
  570. isLongDate.value = formState.dataModel.validDate == "2099-12-31T00:00:00.000+08:00";
  571. formState.dataModel.openId = openId;
  572. console.log('dataModel',formState.dataModel);
  573. if(formState.dataModel.regionCode!=null) getStreetListData(formState.dataModel.regionCode);
  574. if (companyID == null) {
  575. setLongitudeLatitude();
  576. }
  577. };
  578. const reload = (companyID:any,status:any,userID:any,openId:any) => {
  579. isShow.value = false;
  580. loadData(companyID,status,userID,openId);
  581. }
  582. onIonViewDidEnter(() => {
  583. if (route.query.reload) {
  584. reload(route.query.id,1,route.query.loginUserId,route.query.openId);
  585. }
  586. });
  587. const presentAlert = async (message: string) => {
  588. const alert = await alertController.create({
  589. header: '错误!',
  590. message: message,
  591. buttons: [
  592. '确定'
  593. ],
  594. });
  595. await alert.present();
  596. }
  597. // 设置经纬度
  598. function setLongitudeLatitude() {
  599. getPosition().then((data: any) => {
  600. if (data.longitude != null && data.latitude != null) {
  601. formState.dataModel.longitude = data.longitude;
  602. formState.dataModel.latitude = data.latitude;
  603. }
  604. })
  605. }
  606. return {
  607. ...toRefs(formState),
  608. arrowBackOutline,
  609. route,
  610. router,
  611. isAdd,
  612. isShow,
  613. v$,
  614. isLongDate,
  615. curStepData,
  616. stepList,
  617. companyTypeList,
  618. siteList,
  619. regionList,
  620. streetList,
  621. shortAgeTypeList,
  622. companyStatusList,
  623. companyModelList,
  624. companyTagList,
  625. estateCategoryList,
  626. infoAlertButtons,
  627. infoAlterData,
  628. alertingInfo,
  629. loadingFirm,
  630. setInfoAlertOpen,
  631. setInfoLoadingOpen,
  632. onGetFirmByCompanyName,
  633. onSetIndustryID,
  634. onNext,
  635. onBack,
  636. getCompanyStatusList,
  637. getCompanyModelList,
  638. getCompanyTypeList,
  639. getCompanyTagList,
  640. getEstateCategoryList,
  641. getShortAgeTypeList,
  642. getRegionListData,
  643. getSiteListData,
  644. changeCity,
  645. changeLongDate,
  646. changeValidDate,
  647. loadData,
  648. }
  649. },mounted(){
  650. this.getCompanyModelList();
  651. this.getCompanyTypeList();
  652. this.getCompanyTagList();
  653. this.getCompanyStatusList();
  654. this.getEstateCategoryList();
  655. this.getShortAgeTypeList();
  656. this.getRegionListData();
  657. this.getSiteListData();
  658. }
  659. });
  660. </script>
  661. <style lang="less">
  662. ion-select#siteID.md.select-disabled.legacy-select::after{display: none;}
  663. ion-select#regionCode.md.select-disabled.legacy-select::after{display: none;}
  664. .custom{
  665. --placeholder-color: gray;
  666. --placeholder-opacity: 0.5;
  667. }
  668. .title-item{
  669. margin-left: 15px;
  670. color:#1c3d70 !important;
  671. font-size: 14px !important;
  672. font-weight: bold;
  673. }
  674. ion-item {
  675. --border-width: 0;
  676. --border-style: none;
  677. ion-label, ion-input, ion-select, ion-datetime-button {
  678. font-size: 14px !important;
  679. }
  680. }
  681. .stepFlex {
  682. margin: 0;
  683. display: flex;
  684. width: 100%;
  685. .stepFlex-item {
  686. position: relative;
  687. flex: 1;
  688. text-align: center;
  689. margin-top: -10px;
  690. .stepFlex-item-label {
  691. padding-top: 60px;
  692. font-size: 14px;
  693. .stepFlex-item-label-title {
  694. margin-top: 30px;
  695. }
  696. .stepFlex-item-label-desc {
  697. margin-top: 5px;
  698. color: #b9b9bd;
  699. }
  700. }
  701. }
  702. .greenCircle {
  703. top: calc(50% - 15px);
  704. left: calc(50% - 4px);
  705. position: absolute;
  706. z-index: 2;
  707. width: 10px;
  708. height: 10px;
  709. border-radius: 50%;
  710. background-color: #31A2FE;
  711. }
  712. .now {
  713. top: calc(50% - 18px);
  714. left: calc(50% - 8px);
  715. position: absolute;
  716. z-index: 3;
  717. width: 16px;
  718. height: 16px;
  719. border-radius: 50%;
  720. background-color: #31A2FE;
  721. border: 4px solid #c5e8f9;
  722. }
  723. .grayCircle {
  724. top: calc(50% - 15px);
  725. left: calc(50% - 4px);
  726. position: absolute;
  727. z-index: 2;
  728. width: 10px;
  729. height: 10px;
  730. border-radius: 50%;
  731. background-color: #ccc;
  732. }
  733. .greenLine {
  734. width: 100%;
  735. top: calc(50% - 11px);
  736. left: calc(50% - 2px);
  737. height: 2px;
  738. background-color: #31A2FE;
  739. position: absolute;
  740. }
  741. .grayLine {
  742. height: 0;
  743. border: 1px dashed #ccc;
  744. width: 100%;
  745. top: calc(50% - 11px);
  746. left: calc(50% - 2px);
  747. position: absolute;
  748. }
  749. }
  750. </style>