add_store.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  1. <template>
  2. <div v-loading="dialogLoading" :element-loading-text="loadingText">
  3. <el-row :gutter="15" style="margin-bottom: 80px; width: 90%; margin-left: 5%">
  4. <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px" label-position="top">
  5. <el-col :span="12">
  6. <el-form-item label="门店名称" prop="name">
  7. <el-input v-model="formData.name" placeholder="请输入门店名称" clearable
  8. :style="{ width: '100%' }"></el-input>
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="12">
  12. <el-form-item label="门店免洗额度" prop="balance">
  13. <el-input v-model="formData.balance" placeholder="请输入门店免洗额度" :disabled="isEditMode" clearable
  14. :style="{ width: '100%' }"></el-input>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="8">
  18. <el-form-item label="门店编码" prop="code">
  19. <el-input v-model="formData.code" :maxlength="4" @input="handleInput" :disabled="isEditMode"
  20. placeholder="请输入门店编码" clearable :style="{ width: '100%' }"></el-input>
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="8">
  24. <el-form-item label="门店类型" prop="storeType">
  25. <el-select v-model="formData.storeType" placeholder="请选择门店类型" @change="changeStoreType"
  26. :disabled="isEditMode" :style="{ width: '100%' }">
  27. <el-option v-for="(item, index) in storeTypeOptions" :key="index" :label="item.label" :value="item.value"
  28. :disabled="item.disabled"></el-option>
  29. </el-select>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="8">
  33. <el-form-item label="所属工厂" prop="factoryId">
  34. <el-select v-model="formData.factoryId" placeholder="请选择所属工厂" :disabled="isEditMode"
  35. :style="{ width: '100%' }">
  36. <el-option v-for="item in factorys" :label="item.factoryName" :value="item.id"
  37. :key="item.factoryName"></el-option>
  38. </el-select>
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="8">
  42. <el-form-item label="门店状态" prop="status">
  43. <el-select v-model="formData.status" placeholder="请选择门店状态" :style="{ width: '100%' }">
  44. <el-option v-for="(item, index) in statusOptions" :key="index" :label="item.label" :value="item.value"
  45. :disabled="item.disabled"></el-option>
  46. </el-select>
  47. </el-form-item>
  48. </el-col>
  49. <!-- <el-col :span="8">
  50. <el-form-item label-width="127px" label="是否打印小票" prop="isPrint">
  51. <el-select v-model="formData.isPrint" placeholder="请选择是否打印小票" :style="{ width: '100%' }">
  52. <el-option v-for="(item, index) in isPrintOptions" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>
  53. </el-select>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="8">
  57. <el-form-item label-width="127px" label="是否参与结算" prop="isSettlement">
  58. <el-select v-model="formData.isSettlement" placeholder="请选择是否参与结算" :style="{ width: '100%' }">
  59. <el-option v-for="(item, index) in isSettlementOptions" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>
  60. </el-select>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="8">
  64. <el-form-item label-width="127px" label="条码打印姓名" prop="isCarCodePrintName">
  65. <el-select v-model="formData.isCarCodePrintName" placeholder="请选择条码是否打印姓名" :style="{ width: '100%' }">
  66. <el-option v-for="(item, index) in isCarCodePrintNameOptions" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>
  67. </el-select>
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="8">
  71. <el-form-item label-width="127px" label="小票打印姓名" prop="isPrintName">
  72. <el-select v-model="formData.isPrintName" placeholder="请选择小票是否打印客户姓名" :style="{ width: '100%' }">
  73. <el-option v-for="(item, index) in isPrintNameOptions" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>
  74. </el-select>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="8">
  78. <el-form-item label-width="127px" label="小票打印数量" prop="printNum">
  79. <el-input-number v-model="formData.printNum" placeholder="请输入小票打印数量" :min="0" :step-strictly="true" :style="{ width: '100%' }"> </el-input-number>
  80. </el-form-item>
  81. </el-col> -->
  82. <el-col :span="8">
  83. <el-form-item label-width="113px" label="负责人姓名" prop="contactName">
  84. <el-input v-model="formData.contactName" placeholder="请输入负责人姓名" clearable
  85. :style="{ width: '100%' }"></el-input>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="8">
  89. <el-form-item label-width="113px" label="负责人职务" prop="contactPost">
  90. <el-input v-model="formData.contactPost" placeholder="请输入负责人职务" clearable
  91. :style="{ width: '100%' }"></el-input>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="8">
  95. <el-form-item label-width="127px" label="负责人身份证" prop="contactIdcard">
  96. <el-input v-model="formData.contactIdcard" placeholder="请输入负责人身份证" clearable
  97. :style="{ width: '100%' }"></el-input>
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="8">
  101. <el-form-item label-width="113px" label="负责人电话" prop="contactWorkTel">
  102. <el-input v-model="formData.contactWorkTel" placeholder="请输入负责人电话" clearable
  103. :style="{ width: '100%' }"></el-input>
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="8">
  107. <el-form-item label-width="113px" label="负责人手机" prop="contactPhone">
  108. <el-input v-model="formData.contactPhone" placeholder="请输入负责人手机" clearable
  109. :style="{ width: '100%' }"></el-input>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="8">
  113. <el-form-item label-width="113px" label="负责人传真" prop="contactFax">
  114. <el-input v-model="formData.contactFax" placeholder="请输入负责人传真" clearable
  115. :style="{ width: '100%' }"></el-input>
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="8">
  119. <el-form-item label-width="113px" label="负责人邮箱" prop="contactEmail">
  120. <el-input v-model="formData.contactEmail" placeholder="请输入负责人邮箱" clearable
  121. :style="{ width: '100%' }"></el-input>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="8">
  125. <el-form-item label-width="113px" label="负责人邮编" prop="contactZipCode">
  126. <el-input v-model="formData.contactZipCode" placeholder="请输入负责人邮编" clearable
  127. :style="{ width: '100%' }"></el-input>
  128. </el-form-item>
  129. </el-col>
  130. <!-- <el-col :span="8">
  131. <el-form-item label-width="106px" label="负责人QQ" prop="contactQq">
  132. <el-input v-model="formData.contactQq" placeholder="请输入负责人QQ" clearable :style="{ width: '100%' }"> </el-input>
  133. </el-form-item>
  134. </el-col> -->
  135. <el-col :span="8">
  136. <el-form-item label="开店时间" prop="openDate">
  137. <el-date-picker v-model="formData.openDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
  138. :style="{ width: '100%' }" placeholder="请选择开店时间" clearable></el-date-picker>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="8">
  142. <el-form-item label-width="127px" label="开始营业时间" prop="businessStartTime">
  143. <el-time-picker v-model="formData.businessStartTime" format="HH:mm" value-format="HH:mm"
  144. :picker-options="{ selectableRange: '00:00:00-23:59:59' }" :style="{ width: '100%' }"
  145. placeholder="请选择开始营业时间" clearable></el-time-picker>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="8">
  149. <el-form-item label-width="127px" label="结束营业时间" prop="businessEndTime">
  150. <el-time-picker v-model="formData.businessEndTime" format="HH:mm" value-format="HH:mm"
  151. :picker-options="{ selectableRange: '00:00:00-23:59:59' }" :style="{ width: '100%' }"
  152. placeholder="请选择结束营业时间" clearable></el-time-picker>
  153. </el-form-item>
  154. </el-col>
  155. <el-col :span="8">
  156. <el-form-item label="所属省份" prop="provinceId">
  157. <el-select size="small" style="width: 200px" v-model="formData.provinceId" placeholder="请选择省份(直辖市)"
  158. v-on:change="changeProvince()">
  159. <el-option v-for="item in provinces" :label="item.areaName" :value="item.areaId"
  160. :key="item.areaName"></el-option>
  161. </el-select>
  162. </el-form-item>
  163. </el-col>
  164. <el-col :span="8">
  165. <el-form-item label="所属城市" prop="cityId">
  166. <el-select size="small" style="width: 200px; margin-left: 10px" v-model="formData.cityId"
  167. placeholder="请选择城市" v-on:change="changeCity">
  168. <el-option v-for="item in citys" :label="item.areaName" :value="item.areaId"
  169. :key="item.areaName"></el-option>
  170. </el-select>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="8">
  174. <el-form-item label="所属地区" prop="areaId">
  175. <el-select size="small" style="width: 200px; margin-left: 10px" v-model="formData.areaId"
  176. placeholder="请选择区(县)" v-on:change="changeArea">
  177. <el-option v-for="item in areas" :label="item.areaName" :value="item.areaId"
  178. :key="item.areaName"></el-option>
  179. </el-select>
  180. </el-form-item>
  181. </el-col>
  182. <el-col :span="24">
  183. <el-form-item label="搜索地址" prop="address">
  184. <el-autocomplete style="width: 100%" popper-class="autoAddressClass" v-model="formData.address"
  185. :fetch-suggestions="querySearchAsync" :trigger-on-focus="false" placeholder="详细地址"
  186. @select="handleSelect" clearable>
  187. <template slot-scope="{ item }">
  188. <em class="el-icon-search fl mgr10" />
  189. <div style="overflow: hidden">
  190. <div class="title" style="display: table-cell">{{ item.title }}</div>
  191. <span class="address ellipsis">{{ item.address }}</span>
  192. </div>
  193. </template>
  194. </el-autocomplete>
  195. <div id="baidu-map-container"
  196. style="width: 100%; margin-top: 20px; margin-bottom: 20px; height: 400px"></div>
  197. </el-form-item>
  198. </el-col>
  199. <el-col :span="24">
  200. <el-form-item label="门牌号" prop="addressDetail">
  201. <el-input v-model="formData.addressDetail" placeholder="请输入门牌号" clearable :style="{ width: '100%' }"
  202. size="medium"></el-input>
  203. </el-form-item>
  204. </el-col>
  205. <el-col :span="12">
  206. <el-form-item label="企业性质" prop="companyType">
  207. <el-input v-model="formData.companyType" placeholder="请输入企业性质" clearable
  208. :style="{ width: '100%' }"></el-input>
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="12">
  212. <el-form-item label="办公面积" prop="officeArea">
  213. <el-input v-model="formData.officeArea" oninput="value=value.replace(/[^0-9]/g,'')"
  214. placeholder="请输入办公面积" clearable :style="{ width: '100%' }">
  215. <template slot="append">(平米)</template>
  216. </el-input>
  217. </el-form-item>
  218. </el-col>
  219. <el-col :span="24">
  220. <el-form-item label="企业业务" prop="companyDetail">
  221. <el-input v-model="formData.companyDetail" type="textarea" placeholder="请输入企业业务" clearable
  222. :style="{ width: '100%' }"></el-input>
  223. </el-form-item>
  224. </el-col>
  225. <el-col :span="12">
  226. <el-form-item label="门店图片" prop="companyPic">
  227. <el-upload ref="companyPic" :file-list="companyPicfileList" :action="companyPicAction"
  228. :before-upload="companyPicBeforeUpload" :on-success="companyPicUploadSuccess"
  229. :on-remove="companyPicOnRemove" list-type="picture" accept="image/*">
  230. <el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
  231. <div slot="tip" class="el-upload__tip">只能上传不超过 2MB 的文件</div>
  232. </el-upload>
  233. </el-form-item>
  234. </el-col>
  235. <el-col :span="12">
  236. <el-form-item label="营业执照" prop="companyLicencePic">
  237. <el-upload ref="companyLicencePic" :file-list="companyLicencePicfileList" :action="companyLicencePicAction"
  238. :before-upload="companyLicencePicBeforeUpload" :on-success="companyLicencePicUploadSuccess"
  239. :on-remove="companyLicencePicOnRemove" list-type="picture" accept="image/*">
  240. <el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
  241. <div slot="tip" class="el-upload__tip">只能上传不超过 2MB 的文件</div>
  242. </el-upload>
  243. </el-form-item>
  244. </el-col>
  245. <el-col :span="24">
  246. <el-form-item label="同城配送门店id" prop="wxStoreId">
  247. <el-input v-model="formData.wxStoreId" placeholder="请输入微信同城配送门店id" clearable :style="{ width: '100%' }">
  248. </el-input>
  249. </el-form-item>
  250. </el-col>
  251. </el-form>
  252. </el-row>
  253. <div slot="footer" class="dialog-footer">
  254. <el-button type="primary" @click="submitForm" style="margin-left: 5%">提交</el-button>
  255. <el-button @click="closeDialog">取 消</el-button>
  256. </div>
  257. </div>
  258. </template>
  259. <script>
  260. import { getStore, addStore, updateStore } from '@/api/system/store'
  261. import { listArea } from '@/api/system/area'
  262. import { listFactory } from '@/api/system/factory'
  263. export default {
  264. components: {},
  265. props: [],
  266. data() {
  267. return {
  268. dialogLoading: true,
  269. loadingText: '查询中',
  270. formData: {
  271. code: undefined,
  272. name: undefined,
  273. factoryId: undefined,
  274. storeType: '0',
  275. status: '0',
  276. isPrint: '0',
  277. isSettlement: '0',
  278. isCarCodePrintName: '0',
  279. isPrintName: '0',
  280. printNum: 0,
  281. contactName: undefined,
  282. contactPost: undefined,
  283. contactIdcard: undefined,
  284. contactWorkTel: undefined,
  285. contactPhone: undefined,
  286. contactFax: undefined,
  287. contactEmail: undefined,
  288. contactZipCode: undefined,
  289. officeArea: 0,
  290. openDate: null,
  291. businessStartTime: '09:00:00',
  292. businessEndTime: '17:30:00',
  293. companyType: undefined,
  294. contactQq: undefined,
  295. companyDetail: undefined,
  296. companyPic: null,
  297. companyLicencePic: null,
  298. province: '', // 省
  299. city: '', // 市
  300. area: '', // 区
  301. address: '',
  302. addressDetail: '',
  303. wxStoreId: ''
  304. },
  305. rules: {
  306. code: [
  307. {
  308. required: true,
  309. message: '请输入门店编码',
  310. trigger: 'blur'
  311. }
  312. ],
  313. name: [
  314. {
  315. required: true,
  316. message: '请输入门店名称',
  317. trigger: 'blur'
  318. }
  319. ],
  320. factoryId: [
  321. {
  322. required: true,
  323. message: '请选择所属工厂',
  324. trigger: 'change'
  325. }
  326. ],
  327. contactName: [
  328. {
  329. required: true,
  330. message: '请输入负责人姓名',
  331. trigger: 'blur'
  332. }
  333. ],
  334. contactPost: [
  335. {
  336. required: true,
  337. message: '请输入负责人职务',
  338. trigger: 'blur'
  339. }
  340. ],
  341. contactIdcard: [
  342. {
  343. required: true,
  344. trigger: 'blur',
  345. validator: this.checkIdCardNumber
  346. }
  347. ],
  348. contactPhone: [
  349. {
  350. required: true,
  351. trigger: 'blur',
  352. validator: this.checkPhone
  353. }
  354. ],
  355. contactEmail: [
  356. {
  357. trigger: 'blur',
  358. validator: this.checkEmail
  359. }
  360. ],
  361. openDate: [
  362. {
  363. required: true,
  364. message: '请选择开店时间',
  365. trigger: 'change'
  366. }
  367. ],
  368. businessStartTime: [
  369. {
  370. required: true,
  371. message: '请选择开始营业时间',
  372. trigger: 'change'
  373. }
  374. ],
  375. businessEndTime: [
  376. {
  377. required: true,
  378. message: '请选择结束营业时间',
  379. trigger: 'change'
  380. }
  381. ],
  382. companyType: [
  383. {
  384. required: true,
  385. message: '请输入企业性质',
  386. trigger: 'blur'
  387. }
  388. ],
  389. companyDetail: [
  390. {
  391. required: true,
  392. message: '请输入企业业务',
  393. trigger: 'blur'
  394. }
  395. ],
  396. provinceId: [
  397. {
  398. required: true,
  399. message: '请选择所属省份',
  400. trigger: 'change'
  401. }
  402. ],
  403. cityId: [
  404. {
  405. required: true,
  406. message: '请选择所属城市',
  407. trigger: 'change'
  408. }
  409. ],
  410. areaId: [
  411. {
  412. required: true,
  413. message: '请选择所属地区',
  414. trigger: 'change'
  415. }
  416. ],
  417. address: [
  418. {
  419. required: true,
  420. message: '请输入具体地址',
  421. trigger: 'blur'
  422. }
  423. ]
  424. },
  425. storeTypeOptions: [
  426. {
  427. label: '直营店',
  428. value: '0'
  429. },
  430. {
  431. label: '加盟店',
  432. value: '1'
  433. }
  434. ],
  435. statusOptions: [
  436. {
  437. label: '正常',
  438. value: '0'
  439. },
  440. {
  441. label: '禁用',
  442. value: '1'
  443. }
  444. ],
  445. isPrintOptions: [
  446. {
  447. label: '是',
  448. value: '0'
  449. },
  450. {
  451. label: '否',
  452. value: '1'
  453. }
  454. ],
  455. isSettlementOptions: [
  456. {
  457. label: '是',
  458. value: '0'
  459. },
  460. {
  461. label: '否',
  462. value: '1'
  463. }
  464. ],
  465. isCarCodePrintNameOptions: [
  466. {
  467. label: '是',
  468. value: '0'
  469. },
  470. {
  471. label: '否',
  472. value: '1'
  473. }
  474. ],
  475. isPrintNameOptions: [
  476. {
  477. label: '是',
  478. value: '0'
  479. },
  480. {
  481. label: '否',
  482. value: '1'
  483. }
  484. ],
  485. companyPicfileList: [],
  486. companyLicencePicfileList: [],
  487. companyPicAction: `${process.env.VUE_APP_BASE_API}` + '/common/uploadOSS',
  488. companyLicencePicAction: `${process.env.VUE_APP_BASE_API}` + '/common/uploadOSS',
  489. provinces: [],
  490. citys: [],
  491. areas: [],
  492. factorys: [],
  493. isEditMode: false,
  494. isEditFactory: false
  495. }
  496. },
  497. computed: {},
  498. watch: {},
  499. created() {
  500. this.getProvince(1)
  501. this.getFactoryList()
  502. },
  503. async mounted() {
  504. await this.loadBMap('muIMwle2eOkTHf453rwRNgMa0W83j2PX') //加载引入BMap
  505. this.initBaiduMap()
  506. },
  507. methods: {
  508. /** 获取所属工厂 */
  509. getFactoryList() {
  510. listFactory().then((response) => {
  511. this.factorys = response.rows
  512. })
  513. },
  514. checkTel(rule, value, callback) {
  515. const regex = /^\d{3}-\d{3}-\d{4}$/ // 电话正则表达式
  516. if (!regex.test(value)) {
  517. callback(new Error('请输入正确的电话号'))
  518. } else {
  519. callback()
  520. }
  521. },
  522. checkEmail(rule, value, callback) {
  523. const regex = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/ // 邮箱正则表达式
  524. if (!regex.test(value) && value != '') {
  525. callback(new Error('请输入正确的邮箱'))
  526. } else {
  527. callback()
  528. }
  529. },
  530. checkPhone(rule, value, callback) {
  531. const regex = /^1[0-9]{10}$/ // 手机号正则表达式
  532. if (!regex.test(value)) {
  533. callback(new Error('请输入正确的手机号'))
  534. } else {
  535. callback()
  536. }
  537. },
  538. checkIdCardNumber(rule, value, callback) {
  539. const regex = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]$/ // 身份证正则表达式
  540. if (!regex.test(value)) {
  541. callback(new Error('请输入正确的身份证号码'))
  542. } else {
  543. callback()
  544. }
  545. },
  546. changeStoreType() {
  547. if (this.formData.storeType === '0') {
  548. this.formData.factoryId = 1
  549. this.isEditFactory = true
  550. } else {
  551. this.isEditFactory = false
  552. this.formData.factoryId = null
  553. }
  554. },
  555. handleInput() {
  556. if (this.inputValue.length > 4) {
  557. this.inputValue = this.inputValue.slice(0, 4)
  558. }
  559. this.inputValue = this.inputValue.replace(/\D/g, '')
  560. },
  561. setInitData(storeId) {
  562. this.id = storeId
  563. this.companyPicList = []
  564. this.companyLicencePicList = []
  565. if (storeId != undefined && storeId != '') {
  566. this.dialogLoading = true
  567. this.loadingText = '查询中'
  568. getStore(this.id)
  569. .then((res) => {
  570. this.formData = res.data
  571. this.isEditMode = true
  572. //获取所属城市和所属地区
  573. this.getProvince(2, this.formData.provinceId)
  574. this.getProvince(3, this.formData.cityId)
  575. this.dialogLoading = false
  576. //地图定位
  577. var point = new BMap.Point(this.formData.longitude, this.formData.latitude)
  578. this.map.centerAndZoom(point, 19)
  579. this.mk = new BMap.Marker(point, {
  580. enableDragging: true
  581. }) //创建一个图像标注实例,enableDragging:是否启用拖拽,默认为false
  582. this.map.addOverlay(this.mk) //将覆盖物添加到地图中
  583. if (this.formData.companyPic) {
  584. this.companyPicfileList = [
  585. {
  586. url: this.formData.companyPic
  587. }
  588. ]
  589. }
  590. if (this.formData.companyLicencePic) {
  591. this.companyLicencePicfileList = [
  592. {
  593. url: this.formData.companyLicencePic
  594. }
  595. ]
  596. }
  597. this.resetForm('elForm')
  598. })
  599. .catch((e) => {
  600. this.dialogLoading = false
  601. this.$message.error(e.data.msg)
  602. })
  603. } else {
  604. this.dialogLoading = false
  605. this.formData.factoryId = 1
  606. this.isEditFactory = true
  607. }
  608. },
  609. /** 获取省份 */
  610. getProvince(level, parentId) {
  611. let provinceParams = {
  612. level: level,
  613. parentId: parentId
  614. }
  615. listArea(provinceParams).then((response) => {
  616. if (level === 1) {
  617. this.provinces = response.data
  618. } else if (level === 2) {
  619. this.citys = response.data
  620. } else {
  621. this.areas = response.data
  622. }
  623. })
  624. },
  625. /** 获取城市 */
  626. changeProvince() {
  627. let cityParams = {
  628. parentId: this.formData.provinceId
  629. }
  630. const selectedOption = this.provinces.find((option) => option.areaId === this.formData.provinceId)
  631. this.formData.provinceName = selectedOption ? selectedOption.areaName : null
  632. listArea(cityParams).then((response) => {
  633. this.citys = response.data
  634. })
  635. if (this.formData.cityId != null) {
  636. this.formData.cityId = null
  637. this.formData.areaId = null
  638. this.areas = []
  639. }
  640. },
  641. /** 获取区县 */
  642. changeCity() {
  643. let cityParams = {
  644. parentId: this.formData.cityId
  645. }
  646. const selectedOption = this.citys.find((option) => option.areaId === this.formData.cityId)
  647. this.formData.cityName = selectedOption ? selectedOption.areaName : null
  648. listArea(cityParams).then((response) => {
  649. this.areas = response.data
  650. })
  651. if (this.formData.areaId != null) {
  652. this.formData.areaId = null
  653. }
  654. },
  655. /** 获取区县 */
  656. changeArea() {
  657. const selectedOption = this.areas.find((option) => option.areaId === this.formData.areaId)
  658. this.formData.areaName = selectedOption ? selectedOption.areaName : null
  659. },
  660. submitForm() {
  661. this.$refs['elForm'].validate((valid) => {
  662. if (!valid) return
  663. // TODO 提交表单
  664. // TODO 提交表单
  665. console.log(this.formData)
  666. if (this.companyPicfileList && this.companyPicfileList.length > 0) {
  667. this.formData.companyPic = this.companyPicfileList[0].url
  668. } else {
  669. this.formData.companyPic = ''
  670. }
  671. if (this.companyLicencePicfileList && this.companyLicencePicfileList.length > 0) {
  672. this.formData.companyLicencePic = this.companyLicencePicfileList[0].url
  673. } else {
  674. this.formData.companyLicencePic = ''
  675. }
  676. if (this.formData.hasOwnProperty('addrPoint')) {
  677. this.formData.longitude = this.formData.addrPoint.lng
  678. this.formData.latitude = this.formData.addrPoint.lat
  679. }
  680. this.dialogLoading = true
  681. this.loadingText = '保存中'
  682. if (this.id == undefined || this.id == '') {
  683. addStore(this.formData)
  684. .then((res) => {
  685. this.$message('添加成功')
  686. this.dialogLoading = false
  687. this.$emit('closeDialog')
  688. this.$root.$emit('refreshList')
  689. })
  690. .catch((e) => {
  691. this.dialogLoading = false
  692. this.$message.error(e.data.msg)
  693. })
  694. } else {
  695. updateStore(this.formData)
  696. .then((res) => {
  697. this.$message('保存成功')
  698. this.dialogLoading = false
  699. this.$emit('closeDialog')
  700. this.$root.$emit('refreshList')
  701. })
  702. .catch((e) => {
  703. this.dialogLoading = false
  704. this.$message.error(e.data.msg)
  705. })
  706. }
  707. })
  708. },
  709. closeDialog() {
  710. var ctx = this
  711. this.$confirm('是否关闭表单,关闭后数据将丢失?')
  712. .then(function() {
  713. ctx.$emit('closeDialog')
  714. })
  715. .then(() => {
  716. })
  717. .catch(() => {
  718. })
  719. },
  720. onOpen() {
  721. },
  722. onClose() {
  723. this.$refs['elForm'].resetFields()
  724. },
  725. close() {
  726. this.$emit('update:visible', false)
  727. },
  728. resetForm() {
  729. this.$refs['elForm'].resetFields()
  730. },
  731. companyPicBeforeUpload(file) {
  732. let isRightSize = file.size / 1024 / 1024 < 2
  733. if (!isRightSize) {
  734. this.$message.error('文件大小超过 2MB')
  735. }
  736. return isRightSize
  737. },
  738. companyPicUploadSuccess(response, file, fileList) {
  739. this.companyPicfileList = fileList
  740. if (this.companyPicfileList.length > 1) {
  741. this.companyPicfileList.splice(0, 1)
  742. }
  743. this.companyPicfileList[0].url = this.companyPicfileList[0].response.data.src
  744. },
  745. companyPicOnRemove(file, fileList) {
  746. this.companyPicfileList = fileList
  747. },
  748. companyLicencePicBeforeUpload(file) {
  749. let isRightSize = file.size / 1024 / 1024 < 2
  750. if (!isRightSize) {
  751. this.$message.error('文件大小超过 2MB')
  752. }
  753. return isRightSize
  754. },
  755. companyLicencePicUploadSuccess(response, file, fileList) {
  756. this.companyLicencePicfileList = fileList
  757. if (this.companyLicencePicfileList.length > 1) {
  758. this.companyLicencePicfileList.splice(0, 1)
  759. }
  760. this.companyLicencePicfileList[0].url = this.companyLicencePicfileList[0].response.data.src
  761. },
  762. companyLicencePicOnRemove(file, fileList) {
  763. this.companyLicencePicfileList = fileList
  764. },
  765. // 初始化百度地图
  766. initBaiduMap() {
  767. var that = this
  768. this.map = new BMap.Map('baidu-map-container', {
  769. enableMapClick: false
  770. }) //新建地图实例,enableMapClick:false :禁用地图默认点击弹框
  771. var point = new BMap.Point(113.30765, 23.12005)
  772. this.map.centerAndZoom(point, 19)
  773. this.mk = new BMap.Marker(point, {
  774. enableDragging: true
  775. }) //创建一个图像标注实例,enableDragging:是否启用拖拽,默认为false
  776. this.map.addOverlay(this.mk) //将覆盖物添加到地图中
  777. this.mk.addEventListener('dragend', function(e) {
  778. that.getAddrByPoint(e.point) //拖拽结束后调用逆地址解析函数,e.point为拖拽后的地理坐标
  779. })
  780. var navigationControl = new BMap.NavigationControl({
  781. //创建一个特定样式的地图平移缩放控件
  782. anchor: BMAP_ANCHOR_TOP_RIGHT, //靠右上角位置
  783. type: BMAP_NAVIGATION_CONTROL_SMALL //SMALL控件类型
  784. })
  785. this.map.addControl(navigationControl) //将控件添加到地图
  786. var geolocationControl = new BMap.GeolocationControl({
  787. anchor: BMAP_ANCHOR_BOTTOM_LEFT
  788. }) //创建一个地图定位控件
  789. geolocationControl.addEventListener('locationSuccess', function(e) {
  790. //绑定定位成功后事件
  791. that.getAddrByPoint(e.point) //定位成功后调用逆地址解析函数
  792. })
  793. geolocationControl.addEventListener('locationError', function(e) {
  794. //绑定定位失败后事件
  795. console.log(e.message)
  796. })
  797. this.map.addControl(geolocationControl) //将控件添加到地图
  798. this.map.addEventListener('click', function(e) {
  799. //给地图绑定点击事件
  800. that.getAddrByPoint(e.point) //点击后调用逆地址解析函数
  801. })
  802. this.geolocation()
  803. },
  804. /**
  805. * 浏览器定位函数
  806. */
  807. geolocation() {
  808. var that = this
  809. var geolocation = new BMap.Geolocation()
  810. geolocation.getCurrentPosition(
  811. function(res) {
  812. if (this.getStatus() == BMAP_STATUS_SUCCESS) {
  813. that.getAddrByPoint(res.point) //当成功时,调用逆地址解析函数
  814. } else {
  815. console.log('failed' + this.getStatus()) //失败时,弹出失败状态码
  816. }
  817. },
  818. {
  819. enableHighAccuracy: true
  820. }
  821. ) //enableHighAccuracy:是否要求浏览器获取最佳效果,默认为false
  822. },
  823. /** 逆向解析地址 point */
  824. getAddrByPoint(point) {
  825. var that = this
  826. var geco = new BMap.Geocoder()
  827. geco.getLocation(point, function(res) {
  828. console.log(res) //内容见下图
  829. that.mk.setPosition(point) //重新设置标注的地理坐标
  830. that.map.panTo(point) //将地图的中心点更改为给定的点
  831. that.addressInfo.address = res.address //记录该点的详细地址信息
  832. that.addressInfo.addrPoint = point //记录当前坐标点
  833. })
  834. },
  835. querySearchAsync(str, cb) {
  836. var options = {
  837. onSearchComplete: function(res) {
  838. //检索完成后的回调函数
  839. var s = []
  840. if (local.getStatus() == BMAP_STATUS_SUCCESS) {
  841. for (var i = 0; i < res.getCurrentNumPois(); i++) {
  842. s.push(res.getPoi(i))
  843. }
  844. cb(s) //获取到数据时,通过回调函数cb返回到<el-autocomplete>组件中进行显示
  845. } else {
  846. cb(s)
  847. }
  848. }
  849. }
  850. var local = new BMap.LocalSearch(this.map, options) //创建LocalSearch构造函数
  851. local.search(str) //调用search方法,根据检索词str发起检索
  852. },
  853. handleSelect(item) {
  854. this.formData.address = item.address + item.title //记录详细地址,含建筑物名
  855. this.formData.addrPoint = item.point //记录当前选中地址坐标
  856. this.map.clearOverlays() //清除地图上所有覆盖物
  857. this.mk = new BMap.Marker(item.point) //根据所选坐标重新创建Marker
  858. this.map.addOverlay(this.mk) //将覆盖物重新添加到地图中
  859. this.map.panTo(item.point) //将地图的中心点更改为选定坐标点
  860. },
  861. /**
  862. * 确认选择
  863. */
  864. confirmSelect() {
  865. this.$emit('confirmMapAddress', this.addressInfo)
  866. this.openMap = false
  867. },
  868. /**
  869. * 取消选择
  870. */
  871. cancel() {
  872. this.$emit('cancelMap')
  873. },
  874. /**
  875. * 动态加载百度地图api函数
  876. * @param {String} ak 百度地图AK,必传
  877. */
  878. loadBMap(ak) {
  879. return new Promise(function(resolve, reject) {
  880. if (typeof window.BMap !== 'undefined') {
  881. resolve(window.BMap)
  882. return true
  883. }
  884. window.onBMapCallback = function() {
  885. resolve(window.BMap)
  886. }
  887. let script = document.createElement('script')
  888. script.type = 'text/javascript'
  889. script.src = 'https://api.map.baidu.com/api?v=3.0&ak=' + ak + '&callback=onBMapCallback'
  890. script.onerror = reject
  891. document.head.appendChild(script)
  892. })
  893. }
  894. }
  895. }
  896. </script>
  897. <style>
  898. .el-upload__tip {
  899. line-height: 1.2;
  900. }
  901. </style>