edit.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  1. <template>
  2. <div class="card-edit">
  3. <a-form ref="formRef" :model="dataModel" autocomplete="off" @finish="onFinish">
  4. <a-divider orientation="left">企业基础信息</a-divider>
  5. <a-row :gutter="24">
  6. <a-col :span="8">
  7. <a-form-item
  8. label="企业名称"
  9. :label-col="{ span: 8 }"
  10. name="companyName"
  11. :rules="[{ required: true, message: '请输入企业名称!' }]"
  12. >
  13. <a-auto-complete
  14. v-if="operationType == 'add'"
  15. v-model:value="dataModel.companyName"
  16. :options="firmList"
  17. :class="{'companyNameIpt': operationType == 'add'}"
  18. placeholder="请输入企业名称"
  19. :field-names="{
  20. label:'firmName',
  21. value:'firmName',
  22. }"
  23. @select="normalFirm"
  24. @search="likeFindFirm"
  25. >
  26. <template #option="item">
  27. <span v-html="formatStr(item.firmName)"></span>
  28. </template>
  29. </a-auto-complete>
  30. <a-button v-if="operationType == 'add'" :loading="normalBtnLoading" style="margin-left: 10px"
  31. :disabled="!dataModel.companyName"
  32. @click="normalFirm">同步信息
  33. </a-button>
  34. <a-input v-if="operationType == 'edit'" v-model:value="dataModel.companyName" placeholder=""/>
  35. </a-form-item>
  36. </a-col>
  37. <a-col :span="8">
  38. <a-form-item
  39. label="统一信用代码"
  40. :label-col="{ span: 8 }"
  41. name="companyCode"
  42. :rules="[{ required: true, message: '请输入统一信用代码或工商注册号!' }]"
  43. >
  44. <a-input v-model:value="dataModel.companyCode" placeholder=""/>
  45. </a-form-item>
  46. </a-col>
  47. <a-col :span="8">
  48. <a-form-item
  49. label="所属驿站"
  50. :label-col="{ span: 8 }"
  51. name="siteID"
  52. :rules="[{ required: true, message: '请选择所属驿站!' }]"
  53. >
  54. <a-select
  55. ref="select"
  56. v-model:value="dataModel.siteID"
  57. v-on:change="siteChange"
  58. :options="siteList"
  59. :field-names="{ label: 'siteName', value: 'siteID' }"
  60. >
  61. </a-select>
  62. </a-form-item>
  63. </a-col>
  64. </a-row>
  65. <a-row :gutter="24">
  66. <a-col :span="8">
  67. <a-form-item
  68. label="企业办公地址"
  69. :label-col="{ span: 8 }"
  70. name="companyAddress"
  71. :rules="[{ required: true, message: '请输入企业办公地址!' }]"
  72. >
  73. <a-textarea v-model:value="dataModel.companyAddress" placeholder="" :rows="4" @blur="companyAddressChange"/>
  74. </a-form-item>
  75. </a-col>
  76. <a-col :span="8">
  77. <a-form-item
  78. label="企业联系人"
  79. :label-col="{ span: 8 }"
  80. name="userName"
  81. :rules="[{ required: true, message: '请输入企业联系人!' }]"
  82. >
  83. <a-input v-model:value="dataModel.userName" placeholder=""/>
  84. </a-form-item>
  85. <a-form-item
  86. label="企业状态"
  87. :label-col="{ span: 8 }"
  88. name="recordStatus"
  89. :rules="[{ required: true, message: '请选择企业状态!' }]"
  90. >
  91. <a-select
  92. ref="select"
  93. v-model:value="dataModel.recordStatus"
  94. :options="companyStatusList"
  95. :field-names="{ label: 'name', value: 'value' }"
  96. >
  97. </a-select>
  98. </a-form-item>
  99. </a-col>
  100. <a-col :span="8">
  101. <a-form-item
  102. label="企业联系电话"
  103. :label-col="{ span: 8 }"
  104. name="userMobile"
  105. :rules="[{ required: true, message: '请输入企业联系电话!' }]"
  106. >
  107. <a-input v-model:value="dataModel.userMobile" placeholder=""/>
  108. </a-form-item>
  109. <a-form-item
  110. label="是否缺工"
  111. :label-col="{ span: 8 }"
  112. name="isShortage"
  113. :rules="[{ required: true, message: '请选择是否缺工!' }]"
  114. >
  115. <a-select
  116. ref="select"
  117. v-model:value="dataModel.isShortage"
  118. :options="shortageStatusList"
  119. :field-names="{ label: 'name', value: 'value' }"
  120. >
  121. </a-select>
  122. </a-form-item>
  123. </a-col>
  124. </a-row>
  125. <a-row :gutter="24">
  126. <a-col :span="8">
  127. <a-form-item
  128. label="企业所在经度"
  129. :label-col="{ span: 8 }"
  130. name="longitude"
  131. >
  132. <a-input-number style="width: 100%" :controls="false" v-model:value="dataModel.longitude" placeholder="" disabled />
  133. </a-form-item>
  134. </a-col>
  135. <a-col :span="8">
  136. <a-form-item
  137. label="企业所在纬度"
  138. :label-col="{ span: 8 }"
  139. name="latitude"
  140. >
  141. <a-input-number style="width: 100%" :controls="false" v-model:value="dataModel.latitude" placeholder="" disabled />
  142. </a-form-item>
  143. </a-col>
  144. <a-col :span="8">
  145. <a-form-item
  146. label="企业成立日期"
  147. :label-col="{ span: 8 }"
  148. name="establishmentTime"
  149. >
  150. <a-date-picker v-model:value="dataModel.establishmentTime" value-format="YYYY-MM-DD"/>
  151. </a-form-item>
  152. </a-col>
  153. </a-row>
  154. <a-row :gutter="24">
  155. <a-col :span="8">
  156. <a-form-item
  157. label="注册资本"
  158. :label-col="{ span: 8 }"
  159. name="registeredCapital"
  160. >
  161. <a-input-number :min="0" style="width: 60%;" v-model:value="dataModel.registeredCapital"
  162. :controls="false"></a-input-number>
  163. <a-select style="width:40%;" name="registeredCapitalType"
  164. ref="select"
  165. v-model:value="dataModel.registeredCapitalType"
  166. :options="registeredCapitalTypeList"
  167. :field-names="{ label: 'name', value: 'value' }"
  168. >
  169. </a-select>
  170. </a-form-item>
  171. </a-col>
  172. <a-col :span="8">
  173. <a-form-item
  174. label="注册地址行政区划"
  175. :label-col="{ span: 8 }"
  176. name="signInPoliticalArea"
  177. >
  178. <a-select
  179. ref="select"
  180. v-model:value="dataModel.signInPoliticalArea"
  181. :options="regionList"
  182. :field-names="{ label: 'name', value: 'code' }"
  183. >
  184. </a-select>
  185. </a-form-item>
  186. </a-col>
  187. <a-col :span="8">
  188. <a-form-item
  189. label="所属行业"
  190. :label-col="{ span: 8 }"
  191. name="showIndustryName"
  192. >
  193. <a-cascader :load-data="loadLevelIndustryList" v-model:value="dataModel.showIndustryName"
  194. :options="industryList" change-on-select @change="industryChange">
  195. </a-cascader>
  196. </a-form-item>
  197. </a-col>
  198. </a-row>
  199. <a-row :gutter="24">
  200. <a-col :span="8">
  201. <a-form-item
  202. label="所属产业分类"
  203. :label-col="{ span: 8 }"
  204. name="estateCategoryID"
  205. >
  206. <a-select
  207. ref="select"
  208. v-model:value="dataModel.estateCategoryID"
  209. :options="estateCategoryList"
  210. :field-names="{ label: 'name', value: 'value' }"
  211. >
  212. </a-select>
  213. </a-form-item>
  214. </a-col>
  215. <a-col :span="8">
  216. <a-form-item
  217. label="官网网址"
  218. :label-col="{ span: 8 }"
  219. name="website"
  220. >
  221. <a-input v-model:value="dataModel.website"></a-input>
  222. </a-form-item>
  223. <!-- <a-form-item-->
  224. <!-- label="企业标签"-->
  225. <!-- :label-col="{ span: 8 }"-->
  226. <!-- name="tagID"-->
  227. <!-- >-->
  228. <!-- <a-select-->
  229. <!-- ref="select"-->
  230. <!-- v-model:value="dataModel.tagID"-->
  231. <!-- :options="tagList"-->
  232. <!-- :field-names="{ label: 'name', value: 'value' }"-->
  233. <!-- >-->
  234. <!-- </a-select>-->
  235. <!-- </a-form-item>-->
  236. </a-col>
  237. <a-col :span="8">
  238. </a-col>
  239. </a-row>
  240. <a-row :gutter="24">
  241. <a-col :span="24">
  242. <a-form-item
  243. label="企业福利"
  244. :label-col="{ span: 24 }"
  245. name="bonus"
  246. >
  247. <a-textarea v-model:value="dataModel.bonus" placeholder="企业福利" :rows="4"/>
  248. </a-form-item>
  249. </a-col>
  250. </a-row>
  251. <a-divider orientation="left">其他信息</a-divider>
  252. <a-row :gutter="24">
  253. <a-col :span="8">
  254. <a-form-item
  255. label="法定代表人(负责人)"
  256. :label-col="{ span: 8 }"
  257. name="frName"
  258. >
  259. <a-input v-model:value="dataModel.frName" placeholder=""/>
  260. </a-form-item>
  261. </a-col>
  262. <a-col :span="8">
  263. <a-form-item
  264. label="营业执照有效期"
  265. :label-col="{ span: 8 }"
  266. name="validTime"
  267. >
  268. <a-radio-group v-model:value="showPicker" name="showPicker">
  269. <a-radio value="1">至长期</a-radio>
  270. <a-radio value="2">
  271. <a-date-picker
  272. v-model:value="showDateTime"
  273. picker="date"
  274. value-format="YYYY-MM-DD"
  275. />
  276. </a-radio>
  277. </a-radio-group>
  278. </a-form-item>
  279. </a-col>
  280. <a-col :span="8">
  281. <a-form-item
  282. label="企业邮箱"
  283. :label-col="{ span: 8 }"
  284. name="companyEmail"
  285. >
  286. <a-input v-model:value="dataModel.companyEmail" placeholder=""/>
  287. </a-form-item>
  288. </a-col>
  289. </a-row>
  290. <a-row :gutter="24">
  291. <a-col :span="8">
  292. <a-form-item
  293. label="经济类型"
  294. :label-col="{ span: 8 }"
  295. name="companyType"
  296. :rules="[{ required: false, message: '请选择经济类型!' }]"
  297. >
  298. <a-select
  299. ref="select"
  300. v-model:value="dataModel.companyType"
  301. :options="companyTypeList"
  302. :field-names="{ label: 'name', value: 'value' }"
  303. >
  304. </a-select>
  305. </a-form-item>
  306. </a-col>
  307. <a-col :span="8">
  308. <a-form-item
  309. label="所属县区"
  310. :label-col="{ span: 8 }"
  311. name="regionCode"
  312. :rules="[{ required: false, message: '请选择所属县区!' }]"
  313. >
  314. <a-select
  315. ref="select"
  316. v-model:value="dataModel.regionCode"
  317. :options="regionList"
  318. :field-names="{ label: 'name', value: 'code' }"
  319. @change="regionChange"
  320. >
  321. </a-select>
  322. </a-form-item>
  323. </a-col>
  324. <a-col :span="8">
  325. <a-form-item
  326. label="所属街道"
  327. :label-col="{ span: 8 }"
  328. name="streetCode"
  329. :rules="[{ required: false, message: '请选择所属街道!' }]"
  330. >
  331. <a-select
  332. ref="select"
  333. v-model:value="dataModel.streetCode"
  334. :options="streetList"
  335. :field-names="{ label: 'name', value: 'code' }"
  336. >
  337. </a-select>
  338. </a-form-item>
  339. </a-col>
  340. </a-row>
  341. <a-row :gutter="24">
  342. <a-col :span="8">
  343. <a-form-item
  344. label="企业规模"
  345. :label-col="{ span: 8 }"
  346. name="companyModel"
  347. :rules="[{ required: false, message: '请选择企业规模!' }]"
  348. >
  349. <a-select
  350. ref="select"
  351. v-model:value="dataModel.companyModel"
  352. :options="companyModelList"
  353. :field-names="{ label: 'name', value: 'value' }"
  354. >
  355. </a-select>
  356. </a-form-item>
  357. </a-col>
  358. <a-col :span="8">
  359. <a-form-item
  360. label="用工情况(人)"
  361. :label-col="{ span: 8 }"
  362. name="workSituation"
  363. :rules="[{ required: false, message: '请输入用工人数!' }]"
  364. >
  365. <a-input-number :min="1" style="width: 100%" :controls="false" v-model:value="dataModel.workSituation"
  366. placeholder=""
  367. @blur="workSituationChange"/>
  368. </a-form-item>
  369. </a-col>
  370. <a-col :span="8">
  371. <a-form-item
  372. label="参保人数(人)"
  373. :label-col="{ span: 8 }"
  374. name="insuredCount"
  375. :rules="[{ required: false, message: '请输入参保人数!' }]"
  376. >
  377. <a-input-number :min="0" style="width: 100%" :controls="false" v-model:value="dataModel.insuredCount"
  378. placeholder="" @blur="insuredCountChange"/>
  379. </a-form-item>
  380. </a-col>
  381. </a-row>
  382. <a-row>
  383. <a-col class="table-bottom-a1" span="24">
  384. <a-form-item :label-col="{span:24}" name="businScope" label="经营范围">
  385. <a-textarea v-model:value="dataModel.businScope" placeholder="经营范围" :rows="4"/>
  386. </a-form-item>
  387. </a-col>
  388. </a-row>
  389. <a-row>
  390. <a-col class="table-bottom-a1" span="24">
  391. <a-form-item :label-col="{span:24}" label="企业简介" name="companyDesc">
  392. <a-textarea v-model:value="dataModel.companyDesc" placeholder="企业简介" :rows="4"/>
  393. </a-form-item>
  394. </a-col>
  395. </a-row>
  396. <a-divider orientation="left">企业标签</a-divider>
  397. <a-row :gutter="24">
  398. <a-col :span="24">
  399. <a-button style="margin: 0px 5px 5px 0px;color: black;border: 1px solid rgb(217, 217, 217);" v-for="item in dataModel.listLabel">
  400. {{ item.labelName }}
  401. </a-button>
  402. <a-button @click="onSelectModel">
  403. <plus-circle-outlined/>选择标签
  404. </a-button>
  405. </a-col>
  406. </a-row>
  407. <a-divider orientation="left">附件图片上传</a-divider>
  408. <b-upload-file :fileRefId="dataModel.companyID" :readonly="false" :multiple="true" style="width: 100%;"
  409. :setFileList="setFileList" :accept="'.pdf,.png,.jpg'" ></b-upload-file>
  410. <a-form-item class="buttom-btns">
  411. <a-button @click="onClose">取消</a-button>
  412. <a-button type="primary" html-type="submit">提交</a-button>
  413. </a-form-item>
  414. </a-form>
  415. <select-label ref="refSelectModel" :list-label="dataModel.listLabel" :big-type="1" @selectLabelChecks="selectLabelChecks"></select-label>
  416. </div>
  417. </template>
  418. <style>
  419. .ant-table-thead th:first-child{width:200px;}
  420. </style>
  421. <script lang="ts">
  422. import {defineComponent, reactive, ref, toRefs, watch} from 'vue';
  423. import {useRouter} from 'vue-router';
  424. import {useTabsViewStore} from '@/store/modules/tabsView';
  425. import type {FormInstance, SelectProps} from 'ant-design-vue';
  426. import BUploadFile from '@/components/file/uploadFile.vue';
  427. import {getRegionCodeList, getStreetCodeList} from "@/api/system/area/index";
  428. import {
  429. getCompanyById,
  430. likeFirmByCompanyName,
  431. normalFirmByCompanyName,
  432. saveCompany
  433. } from '@/api/companyService/company';
  434. import {getSiteByID, getSiteList} from '@/api/baseSettings/siteInfo';
  435. import {getSysDictionaryList} from '@/api/system/dictionary';
  436. import {getInfo} from '@/api/account';
  437. import dayjs from "dayjs";
  438. import {message} from "ant-design-vue";
  439. import {useUserStore} from "@/store/modules/user";
  440. import {get} from "@/api/common";
  441. import SelectLabel from "@/views/baseSettings/label/selectLabel.vue";
  442. import {debounce} from "lodash-es";
  443. import {getAddressLonLat} from "@/utils/position";
  444. interface FormState {
  445. dataModel: any;
  446. }
  447. export default defineComponent(
  448. {
  449. name: "CompanyEdit",
  450. components: {BUploadFile,SelectLabel},
  451. setup() {
  452. const userStore = useUserStore();
  453. const userInfo = ref(userStore.getUserInfo)
  454. const router = useRouter();
  455. const isAllowCommit = ref(true);
  456. const formState = reactive<FormState>({dataModel: {}});
  457. const siteList = ref<any>([]);
  458. const tabsViewStore = useTabsViewStore();
  459. const showPicker = ref('1');
  460. const showDateTime = ref<any>();
  461. const fileList = ref();
  462. const operationType = ref("");
  463. const normalBtnLoading = ref(false);
  464. const refSelectModel = ref();
  465. const setFileList = (files) => {
  466. fileList.value = files;
  467. };
  468. // const showDataPicker = () => {
  469. // let toDay = new Date();
  470. // showDateTime.value = dayjs(new Date().toLocaleDateString().replaceAll("/", "-"));
  471. // }
  472. const companyStatusList = ref<SelectProps['options']>();
  473. const registeredCapitalTypeList = ref<SelectProps['options']>();
  474. const estateCategoryList = ref<SelectProps['options']>();
  475. const shortageStatusList = ref<SelectProps['options']>([
  476. {value: 1, name: '是'},
  477. {value: 0, name: '否'},
  478. ]);
  479. const formRef = ref<FormInstance>();
  480. const firmList = ref<Array<any>>([])
  481. let lastFetchId = 0;
  482. const firmNameFetching = ref(false)
  483. watch(formState.dataModel.companyName, () => {
  484. firmList.value = [];
  485. firmNameFetching.value = false;
  486. });
  487. watch(() => formState.dataModel.showIndustryName, (selectedValues) => {
  488. if (selectedValues && selectedValues.length == 2) {
  489. formState.dataModel.industryID = selectedValues[1];
  490. formState.dataModel.hasIndustry = true;
  491. }
  492. });
  493. const regionList = ref<SelectProps['options']>();
  494. const streetList = ref<SelectProps['options']>();
  495. const companyTypeList = ref<SelectProps['options']>();
  496. const companyModelList = ref<SelectProps['options']>();
  497. const industryList = ref<SelectProps["options"]>();
  498. const onClose = () => {
  499. tabsViewStore.closeCurrentTabByPath('/companyService/enterprise/add');
  500. tabsViewStore.closeCurrentTabByPath('/companyService/enterprise/edit');
  501. router.push({name: '/companyService/enterprise/index'});
  502. };
  503. const getRegionList = async function(){
  504. const regionResult: any = await getRegionCodeList();
  505. regionList.value = regionResult;
  506. }
  507. const getStreetList = async function(){
  508. if(formState.dataModel.regionCode){
  509. const streetResult: any = await getStreetCodeList(formState.dataModel.regionCode);
  510. streetList.value = streetResult;
  511. }
  512. }
  513. const getAllSites = () => {
  514. getSiteList({pageIndex:1,pageSize:9999}).then((result :any) => {
  515. siteList.value = result.list;
  516. })
  517. }
  518. const getCompanyModelList = async function () {
  519. const data: any = await getSysDictionaryList("CompanyModel");
  520. companyModelList.value = data;
  521. // console.log("companyModelList", companyModelList.value);
  522. }
  523. const getCompanyTypeList = async function () {
  524. const data: any = await getSysDictionaryList("CompanyType");
  525. companyTypeList.value = data;
  526. // console.log("companyCategoryList", companyCategoryList.value);
  527. }
  528. const getCompanyStatusList = async function () {
  529. const data: any = await getSysDictionaryList("CompanyStatus");
  530. companyStatusList.value = data;
  531. }
  532. const getRegisteredCapitalTypeList = async function () {
  533. const data: any = await getSysDictionaryList("RegisteredCapitalType");
  534. registeredCapitalTypeList.value = data;
  535. }
  536. const getEstateCategoryList = async function () {
  537. const data: any = await getSysDictionaryList("CompanyEstateCategory");
  538. estateCategoryList.value = data;
  539. }
  540. const siteChange = async function () {
  541. const curSiteData: any = await getSiteByID(formState.dataModel.siteID);
  542. formState.dataModel.regionCode = curSiteData.regionCode;
  543. formState.dataModel.streetCode = curSiteData.streetCode;
  544. await getStreetList();
  545. }
  546. const regionChange = async function () {
  547. formState.dataModel.streetCode = null;
  548. await getStreetList();
  549. }
  550. const companyCodeValidate = ()=>{
  551. const codeReg = /^[0-9A-Z]+$/;
  552. const gsCodeReg = /^\d{15}$/;
  553. if (formState.dataModel.companyCode.length != 18 && formState.dataModel.companyCode.length != 15) {
  554. message.error("输入的信用代码有误!");
  555. isAllowCommit.value = false;
  556. return;
  557. }
  558. if (formState.dataModel.companyCode.length == 15) {
  559. if (!gsCodeReg.test(formState.dataModel.companyCode)) {
  560. message.error("输入的工商注册号有误!");
  561. isAllowCommit.value = false;
  562. }
  563. }
  564. if (formState.dataModel.companyCode.length == 18) {
  565. if (!codeReg.test(formState.dataModel.companyCode)) {
  566. message.error("输入的信用代码有误!");
  567. isAllowCommit.value = false;
  568. } else {
  569. let aCode;
  570. let aCodeValue;
  571. let total = 0;
  572. const weightedFactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
  573. const str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
  574. for (let i = 0; i < formState.dataModel.companyCode.length - 1; i++) {
  575. aCode = formState.dataModel.companyCode.substring(i, i + 1);
  576. aCodeValue = str.indexOf(aCode);
  577. total += aCodeValue * weightedFactors[i];
  578. }
  579. let logicCheckCode = 31 - total % 31;
  580. if (logicCheckCode == 31) {
  581. logicCheckCode = 0;
  582. }
  583. 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";
  584. const Array_Str = Str.split(',');
  585. const correctCodeStr = Array_Str[logicCheckCode];
  586. console.log("正确的校验码是", correctCodeStr);
  587. const currentCodeStr = formState.dataModel.companyCode.substring(17, 18);
  588. if (correctCodeStr != currentCodeStr) {
  589. message.error('输入的统一信用代码无效!');
  590. isAllowCommit.value = false;
  591. }
  592. }
  593. }
  594. };
  595. const inputDataValidate = () =>{
  596. const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  597. // const landlineReg = /[0-9-()()]{7,18}/;
  598. const landlineReg = /^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/;
  599. if (!mobileReg.test(formState.dataModel.userMobile) && !landlineReg.test(formState.dataModel.userMobile)) {
  600. message.error("输入的联系电话有误!");
  601. isAllowCommit.value = false;
  602. }
  603. const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
  604. // 这里由于邮箱非必填所以先判断是否填写了邮箱
  605. if(formState.dataModel.companyEmail!=null&&formState.dataModel.companyEmail.trim()!=''){
  606. if(!emailReg.test(formState.dataModel.companyEmail)){
  607. message.error("输入的企业邮箱有误!");
  608. isAllowCommit.value = false;
  609. }
  610. }
  611. };
  612. const onFinish = () => {
  613. isAllowCommit.value = true;
  614. console.log(showPicker.value);
  615. if (showPicker.value === '1') {
  616. formState.dataModel.validDate = '2099-12-31T00:00:00.000+08:00';
  617. }
  618. else {
  619. formState.dataModel.validDate = showDateTime.value;
  620. };
  621. companyCodeValidate();
  622. inputDataValidate();
  623. if(!formState.dataModel.hasIndustry){
  624. message.error("请选择完整的所属行业!");
  625. return;
  626. }
  627. console.log("当前企业信息",formState.dataModel);
  628. if(isAllowCommit.value){
  629. formState.dataModel.showIndustryName = null;
  630. saveCompany(formState.dataModel).then(result => {
  631. if (result) {
  632. tabsViewStore.closeCurrentTabByPath('/companyService/enterprise/add');
  633. tabsViewStore.closeCurrentTabByPath('/companyService/enterprise/edit');
  634. tabsViewStore.openTab('/companyService/enterprise/index', {reload: 1});
  635. }
  636. })
  637. }
  638. }
  639. const getFirstIndustryList = () => {
  640. get("industry/getFirstIndustryList", null).then(data => {
  641. industryList.value = (data as any[]).map((x) => {
  642. return {
  643. label: x.name,
  644. value: x.code,
  645. isLeaf: false,
  646. tag: 'firstLevel'
  647. }
  648. });
  649. });
  650. }
  651. const loadLevelIndustryList = (selectedOptions) => {
  652. let targetOption = selectedOptions[selectedOptions.length - 1];
  653. if (targetOption) {
  654. if (targetOption.tag == 'firstLevel') {
  655. get("industry/getListByParentIndustryID", {parentIndustryID: targetOption.value}).then(data => {
  656. targetOption.loading = false;
  657. targetOption.children = (data as any[]).map((x) => {
  658. return {
  659. label: x.name,
  660. value: x.code,
  661. isLeaf: true,
  662. tag: 'secondLevel'
  663. };
  664. });
  665. });
  666. formState.dataModel.hasIndustry = false;
  667. }
  668. }
  669. };
  670. function industryChange(value: any, selectedOptions: any) {
  671. if (value.length >= 2) {
  672. formState.dataModel.industryName = selectedOptions[1].label;
  673. }
  674. }
  675. // 同步获取企业信息
  676. function normalFirm() {
  677. if (!formState.dataModel.companyName) {
  678. return;
  679. }
  680. normalBtnLoading.value = true
  681. normalFirmByCompanyName(formState.dataModel.companyName).then((result) => {
  682. if (result == null) {
  683. message.info('未查找到企业信息,请检查名称是否正确');
  684. } else {
  685. message.info('匹配完毕');
  686. Object.keys(result).forEach(key => {
  687. if (result[key] != null) {
  688. formState.dataModel[key] = result[key];
  689. }
  690. })
  691. // 调用地址变更事件
  692. companyAddressChange();
  693. formRef.value?.validate();
  694. }
  695. }).finally(() => {
  696. normalBtnLoading.value = false
  697. })
  698. }
  699. const onSelectModel = ()=>{
  700. refSelectModel.value.show();
  701. }
  702. const selectLabelChecks = (list: any)=>{
  703. formState.dataModel.listLabel = list;
  704. }
  705. const loadData = (id: any) => {
  706. getAllSites();
  707. getRegionList();
  708. getCompanyModelList();
  709. getCompanyTypeList();
  710. getCompanyStatusList();
  711. getRegisteredCapitalTypeList();
  712. getEstateCategoryList();
  713. getFirstIndustryList();
  714. getInfo().then((loginUserInfo:any)=>{
  715. console.log("userInfo",loginUserInfo.userID);
  716. getCompanyById(id,loginUserInfo.userID,true).then(result => {
  717. formState.dataModel = result;
  718. formState.dataModel.hasIndustry = true;
  719. console.log("curDataModel",formState.dataModel);
  720. showPicker.value = formState.dataModel.validDate == '2099-12-31T00:00:00.000+08:00' ? '1' : '2';
  721. if (showPicker.value === '1') {
  722. showDateTime.value = dayjs(new Date().toLocaleDateString().replaceAll("/", "-"));
  723. } else {
  724. showDateTime.value = formState.dataModel.validDate;
  725. }
  726. // 初始化街道数据
  727. getStreetList()
  728. })
  729. });
  730. };
  731. // 模糊查询企业
  732. const likeFindFirm = debounce(companyName => {
  733. if (companyName) {
  734. lastFetchId += 1;
  735. const fetchId = lastFetchId;
  736. firmList.value = [];
  737. firmNameFetching.value = true;
  738. likeFirmByCompanyName(companyName).then((result: any) => {
  739. if (fetchId == lastFetchId) {
  740. firmList.value = result;
  741. firmNameFetching.value = false;
  742. }
  743. })
  744. }
  745. }, 500)
  746. function workSituationChange() {
  747. if (formState.dataModel.workSituation) {
  748. formState.dataModel.workSituation = Math.floor(formState.dataModel.workSituation)
  749. }
  750. }
  751. function insuredCountChange() {
  752. if (formState.dataModel.insuredCount) {
  753. formState.dataModel.insuredCount = Math.floor(formState.dataModel.insuredCount)
  754. }
  755. }
  756. // 名称搜索关键字高亮
  757. const formatStr = (str: any) => {
  758. if (!str) {
  759. return "";
  760. }
  761. return str.replace(formState.dataModel.companyName, '<span style="color: coral">' + formState.dataModel.companyName + '</span>');
  762. }
  763. // 根据地址获取经纬度
  764. function companyAddressChange() {
  765. if (formState.dataModel.companyAddress) {
  766. getAddressLonLat(formState.dataModel.companyAddress).then((result: any) => {
  767. if (result.lon && result.lat) {
  768. formState.dataModel.longitude = result.lon;
  769. formState.dataModel.latitude = result.lat;
  770. }
  771. });
  772. }
  773. }
  774. return {
  775. ...toRefs(formState),
  776. loadData,
  777. onClose,
  778. onFinish,
  779. siteChange,
  780. showPicker,
  781. siteList,
  782. regionList,
  783. streetList,
  784. companyTypeList,
  785. companyModelList,
  786. companyStatusList,
  787. registeredCapitalTypeList,
  788. showDateTime,
  789. regionChange,
  790. setFileList,
  791. onSelectModel,
  792. selectLabelChecks,
  793. refSelectModel,
  794. shortageStatusList,
  795. userInfo,
  796. estateCategoryList,
  797. getFirstIndustryList,
  798. industryChange,
  799. loadLevelIndustryList,
  800. industryList,
  801. operationType,
  802. normalFirm,
  803. normalBtnLoading,
  804. likeFindFirm,
  805. firmNameFetching,
  806. firmList,
  807. workSituationChange,
  808. insuredCountChange,
  809. formatStr,
  810. formRef,
  811. companyAddressChange
  812. }
  813. },
  814. mounted() {
  815. const id = history.state.params?.id;
  816. const op = history.state.params?.op;
  817. if (op == 1 || id == null) {
  818. this.operationType = "add"
  819. }
  820. if (op == 2 || id != null) {
  821. this.operationType = "edit"
  822. }
  823. this.loadData(id);
  824. }
  825. })
  826. </script>
  827. <style lang="less" scoped>
  828. .companyNameIpt {
  829. width: 60%;
  830. }
  831. </style>