edit.vue 32 KB

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