index.vue 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975
  1. <template>
  2. <div class="bgcolor deviceWithin">
  3. <div class="navBarTOP">
  4. <!-- 顶部条-->
  5. <van-nav-bar class="navBar" title="计划内">
  6. <template #right>
  7. <span @click="searchFn">筛选<van-icon name="arrow-down" /></span>
  8. </template>
  9. </van-nav-bar>
  10. <div class="searchDiv">
  11. <van-search
  12. v-model="storeName"
  13. left-icon="search"
  14. show-action
  15. placeholder="搜索名称/编号/地址">
  16. <template #action>
  17. <div @click="onSearch">搜索</div>
  18. </template>
  19. </van-search>
  20. </div>
  21. <!-- 隐藏高销额门店入口 -->
  22. <!-- <div style="background-color: #dfebf4; padding: 10px" v-if="mapShows">
  23. <div
  24. style="
  25. font-size: 16px;
  26. text-align: center;
  27. margin: 0 auto;
  28. width: 150px;
  29. text-decoration: underline;
  30. font-weight: bold;
  31. color: #222;
  32. "
  33. @click="goFn(1)">
  34. <img
  35. src="./../../assets/Icon/clcik.png"
  36. style="width: 22px; float: left; display: inline-block" />高销额门店推荐
  37. </div>
  38. <van-button
  39. round
  40. type="info"
  41. size="small"
  42. style="position: absolute; top: 108px; right: 10px; height: 28px"
  43. @click="goFn(1)"
  44. >去查看<van-icon name="arrow"
  45. /></van-button>
  46. </div> -->
  47. <div class="monthNow" v-show="calendarIsshow == false">
  48. <span class="month" @click="show = true">{{ timeData }}</span>
  49. <van-icon class="CalendarIcon" :name="timeico" @click="show = true" />
  50. </div>
  51. </div>
  52. <!-- 主体内容-->
  53. <div class="container content" style="margin-top: 145px" @touchmove="handleTouch">
  54. <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
  55. <div class="cellcontent" v-for="(item, index) in list" :key="index">
  56. <van-cell>
  57. <div class="card">
  58. <div class="title">
  59. <template v-if="item.storeLabels">
  60. <!-- 金牌店ABC -->
  61. <img
  62. class="JPABC"
  63. :src="require('@/assets/Icon/storeA.png')"
  64. v-if="item.storeLabels.storeA" />
  65. <img
  66. class="JPABC"
  67. :src="require('@/assets/Icon/storeB.png')"
  68. v-if="item.storeLabels.storeB" />
  69. <img
  70. class="JPABC"
  71. :src="require('@/assets/Icon/storeC.png')"
  72. v-if="item.storeLabels.storeC" />
  73. <img
  74. class="JPABC"
  75. :src="require('@/assets/Icon/storeD.png')"
  76. v-if="item.storeLabels.storeD" />
  77. <img
  78. class="JPABC"
  79. :src="require('@/assets/Icon/storeE.png')"
  80. v-if="item.storeLabels.storeE" />
  81. <img
  82. class="JPABC"
  83. :src="require('@/assets/Icon/storeS.png')"
  84. v-if="item.storeLabels.storeS" />
  85. </template>
  86. <span @click="goOtherSystem(item)" :style="setStroeNameStyle(item)">
  87. <span>{{ item.storeName }}</span>
  88. (<span>{{ item.storeCode }}</span
  89. >)
  90. </span>
  91. <span class="btn" :data-clipboard-text="item.storeCode">
  92. <van-icon
  93. :name="paste"
  94. color="#ee0a24"
  95. size="20"
  96. style="top: 6px; margin-left: 4px" />
  97. </span>
  98. <!-- "approvalStatus": 1:已结案;0:未结案, -->
  99. <!-- "processApprovalStatus": 审批状态(0=未提交,1=已提交待审核,2=审批通过,3=审批拒绝) -->
  100. <template v-if="item.approvalStatus == 0">
  101. <span class="statusIcon submit" v-if="item.processApprovalStatus == 1"
  102. >已提交</span
  103. >
  104. <span class="statusIcon noSubmit" v-if="item.processApprovalStatus == 0"
  105. >未提交</span
  106. >
  107. </template>
  108. </div>
  109. <div class="info" style="position: relative">联系人:{{ item.contactName }}</div>
  110. <div class="info">类型:{{ item.storeCategory }} &nbsp;</div>
  111. <div class="info" style="position: relative" @click="buryingPointFn(item)">
  112. 联系电话:
  113. <a
  114. v-if="item.telephone"
  115. style="color: #0057ba; font-weight: bold; text-decoration: underline"
  116. :href="'tel:' + item.telephone"
  117. >{{ item.telephone }}<van-icon name="phone"
  118. /></a>
  119. <div style="position: absolute; bottom: 0; right: 14px">
  120. <!-- 是否终端客户 -->
  121. <el-popover
  122. popper-class="zpover poperWidthAuto"
  123. placement="bottom"
  124. trigger="click"
  125. content="该客户为终端客户">
  126. <div
  127. v-if="item.storeLabels.terminalCustomer"
  128. class="visitStoreIco"
  129. style="background-color: #fff"
  130. slot="reference">
  131. <van-icon :name="require('@/assets/Icon/zhongduankehu.png')" size="26" />
  132. </div>
  133. </el-popover>
  134. <!-- 是否双包客户 -->
  135. <el-popover
  136. popper-class="zpover poperWidthAuto"
  137. placement="bottom"
  138. trigger="click"
  139. :content="'该客户拥有的双包能力为:' + item.storeLabels.doubleCustomer">
  140. <div
  141. v-if="item.storeLabels.doubleCustomer"
  142. class="visitStoreIco"
  143. style="background-color: #fff"
  144. slot="reference">
  145. <van-icon :name="require('@/assets/Icon/shuangbaokehu.png')" size="26" />
  146. </div>
  147. </el-popover>
  148. <!-- 工企标签 -->
  149. <el-popover
  150. popper-class="zpover poperWidthAuto"
  151. placement="bottom"
  152. trigger="click"
  153. :content="item.storeLabels.industrialEnterprises">
  154. <div
  155. v-if="item.storeLabels.industrialEnterprises"
  156. class="visitStoreIco"
  157. style="background-color: #fff"
  158. slot="reference">
  159. <van-icon :name="require('@/assets/Icon/qiye.png')" size="26" />
  160. </div>
  161. </el-popover>
  162. <!-- 商住标签 -->
  163. <el-popover
  164. popper-class="zpover poperWidthAuto"
  165. placement="bottom"
  166. trigger="click"
  167. :content="item.storeLabels.commercialResidential">
  168. <div
  169. v-if="item.storeLabels.commercialResidential"
  170. class="visitStoreIco"
  171. style="background-color: #fff"
  172. slot="reference">
  173. <van-icon :name="require('@/assets/Icon/shangye.png')" size="26" />
  174. </div>
  175. </el-popover>
  176. <!-- 市政工程标签 -->
  177. <el-popover
  178. popper-class="zpover poperWidthAuto"
  179. placement="bottom"
  180. trigger="click"
  181. :content="item.storeLabels.municipalEngineering">
  182. <div
  183. v-if="item.storeLabels.municipalEngineering"
  184. class="visitStoreIco"
  185. style="background-color: #fff"
  186. slot="reference">
  187. <van-icon :name="require('@/assets/Icon/shizheng.png')" size="26" />
  188. </div>
  189. </el-popover>
  190. <el-popover
  191. popper-class="zpover"
  192. placement="bottom"
  193. width="120"
  194. trigger="click"
  195. content="该客户为凤凰客户">
  196. <div
  197. v-if="item.storeLabels.fhCustomer"
  198. class="visitStoreIco"
  199. style="background-color: #fff"
  200. slot="reference">
  201. <van-icon :name="require('@/assets/Icon/fenghuangjihua.png')" size="26" />
  202. </div>
  203. </el-popover>
  204. <el-popover
  205. popper-class="zpover zpover6"
  206. placement="bottom-start"
  207. trigger="click">
  208. <div>
  209. <p>
  210. 本店{{ timeData1 }}下单SKU数:<a
  211. @click="linkList(item)"
  212. style="text-decoration: underline"
  213. >点击查看详情</a
  214. >
  215. </p>
  216. </div>
  217. <div
  218. class="visitStoreIco"
  219. v-if="item.storeLabels.zysslNums !== false"
  220. style="background-color: #fff; position: relative"
  221. slot="reference">
  222. <p
  223. style="
  224. width: 100%;
  225. position: absolute;
  226. z-index: 1;
  227. top: 0.2px;
  228. width: 22px;
  229. margin: 0;
  230. margin-left: 3.6px;
  231. text-align: center;
  232. font-size: 12px;
  233. ">
  234. {{ item.storeLabels.zysslNums }}
  235. </p>
  236. <van-icon :name="ord" size="26" />
  237. </div>
  238. </el-popover>
  239. <el-popover
  240. popper-class="zpover zpover5"
  241. placement="bottom"
  242. width="200"
  243. trigger="click">
  244. <div v-if="item.storeLabels">
  245. <p>{{ timeData1 }}未通过的陈列任务:</p>
  246. <p v-for="(tt, ind) in (item.storeLabels.targetOne + '').split(';')">
  247. <template v-if="tt"> {{ ind + 1 }}、{{ tt }};</template>
  248. </p>
  249. </div>
  250. <div
  251. class="visitStoreIco"
  252. v-if="item.storeLabels.targetOne"
  253. style="background-color: #fff"
  254. slot="reference">
  255. <van-icon :name="targetOne" size="26" />
  256. </div>
  257. </el-popover>
  258. <el-popover
  259. popper-class="zpover"
  260. placement="bottom"
  261. width="120"
  262. trigger="click"
  263. content="调色机7天未调色">
  264. <div
  265. v-if="item.storeLabels.stopColorMixerSeven"
  266. class="visitStoreIco"
  267. style="background-color: #fff"
  268. slot="reference">
  269. <van-icon :name="Network" size="26" />
  270. </div>
  271. </el-popover>
  272. <el-popover
  273. popper-class="zpover"
  274. placement="bottom"
  275. width="120"
  276. trigger="click"
  277. content="调色机当月未调色">
  278. <div
  279. v-if="item.storeLabels.stopColorMixerMonth"
  280. class="visitStoreIco"
  281. style="background-color: #fff"
  282. slot="reference">
  283. <van-icon :name="WiFi" size="26" />
  284. </div>
  285. </el-popover>
  286. <el-popover
  287. popper-class="zpover"
  288. placement="bottom"
  289. width="200"
  290. trigger="click"
  291. content="同城店近60天未下单">
  292. <div
  293. v-if="item.storeLabels.fxNoOrder"
  294. class="visitStoreIco"
  295. style="background-color: #fff"
  296. slot="reference">
  297. <van-icon :name="order60" size="26" />
  298. </div>
  299. </el-popover>
  300. <el-popover
  301. popper-class="zpover"
  302. placement="bottom"
  303. width="200"
  304. trigger="click"
  305. content="金牌店近30天未下单">
  306. <div
  307. v-if="item.storeLabels.noOrder"
  308. class="visitStoreIco"
  309. style="background-color: #fff"
  310. slot="reference">
  311. <van-icon :name="order" size="26" />
  312. </div>
  313. </el-popover>
  314. <el-popover
  315. popper-class="zpover"
  316. placement="bottom"
  317. width="200"
  318. trigger="click"
  319. content="本店本月进过专业时时丽">
  320. <div
  321. v-if="item.storeLabels.zyssl"
  322. class="visitStoreIco"
  323. style="background-color: #ed5c68"
  324. slot="reference">
  325. </div>
  326. </el-popover>
  327. <el-popover
  328. popper-class="zpover zpover1"
  329. placement="bottom"
  330. width="200"
  331. trigger="click"
  332. content="本店本月进过超好贴">
  333. <div
  334. v-if="item.storeLabels.chtczj"
  335. class="visitStoreIco"
  336. style="background-color: #0057ba"
  337. slot="reference">
  338. </div>
  339. </el-popover>
  340. <el-popover
  341. placement="bottom"
  342. popper-class="zpover zpover1 zpover1sb"
  343. trigger="click"
  344. :disabled="!item.userVisitTimesMap"
  345. :content="'本店本月已拜访过' + item.storeLabels.visitTimes + '次'">
  346. <div
  347. v-if="item.storeLabels.visitTimes && item.storeLabels.visitTimes > 0"
  348. class="visitStoreIco"
  349. slot="reference"
  350. style="background-color: #fff; position: relative">
  351. <p
  352. style="
  353. width: 100%;
  354. position: absolute;
  355. z-index: 10;
  356. top: -2px;
  357. margin: 0;
  358. text-align: center;
  359. font-size: 12px;
  360. ">
  361. {{ item.storeLabels.visitTimes }}
  362. </p>
  363. <!-- A级金牌店拜访次数少于2 -->
  364. <van-icon
  365. :name="require('@/assets/ordernumRed.png')"
  366. size="26"
  367. v-if="
  368. (item.storeLabels.storeA || item.storeLabels.storeS) &&
  369. item.needVisitNum &&
  370. item.storeLabels.visitTimes < item.needVisitNum
  371. " />
  372. <van-icon :name="require('@/assets/ordernum.png')" size="26" v-else />
  373. </div>
  374. <p style="text-align: center; background: #fff; color: #000; padding: 5px 0">
  375. 本店本月已拜访过{{ item.storeLabels.visitTimes }}次
  376. </p>
  377. <p
  378. v-if="
  379. (item.storeLabels.storeA || item.storeLabels.storeS) && item.needVisitNum
  380. "
  381. style="text-align: center; background: #fff; color: red; padding: 5px 0">
  382. <span v-if="item.storeLabels.storeA">A</span>
  383. <span v-if="item.storeLabels.storeS">S</span>
  384. 级金牌店拜访标准:1月{{ item.needVisitNum }}次
  385. </p>
  386. <el-table :data="item.userVisitTimesMap" border max-height="180px">
  387. <el-table-column label="业务员" prop="userName" />
  388. <el-table-column label="拜访次数" prop="visitTimes" width="110px" />
  389. </el-table>
  390. </el-popover>
  391. </div>
  392. </div>
  393. <div class="info" v-if="item.addressLine">
  394. 地址:{{ item.addressLine
  395. }}<img
  396. v-if="item.storeLonExist"
  397. style="width: 36px"
  398. :src="sbpmdh"
  399. @click="linkapp(item)" />
  400. </div>
  401. <!-- 潜在店不显示经销商 -->
  402. <template v-if="item.sfaStoreType.type != 'qzd'">
  403. <!-- 分销店 -->
  404. <template
  405. v-if="
  406. item.sfaStoreType &&
  407. item.sfaStoreType.type == 'fxd' &&
  408. item.sfaStoreChainsContactList
  409. ">
  410. <div class="info" v-if="typeShow">
  411. 经销商:
  412. <div
  413. class="TCFXListItem"
  414. v-for="(item, index) in item.sfaStoreChainsContactList">
  415. <el-popover
  416. popper-class="zpover zpoverStoreztype"
  417. placement="bottom-start"
  418. trigger="click">
  419. <div>
  420. <div>{{ item.chainCode }}</div>
  421. <div>{{ item.chainName }}</div>
  422. </div>
  423. <div slot="reference" :key="index">
  424. {{ item.categoryDescribe }}
  425. </div>
  426. </el-popover>
  427. </div>
  428. </div>
  429. </template>
  430. <template v-else>
  431. <div class="info" v-if="typeShow">经销商:{{ item.chainName }}</div>
  432. </template>
  433. </template>
  434. <!-- storeLonExist 门店是否存在经纬度 字段false=不显示导航和距离,true=显示 -->
  435. <div class="info" v-if="item.storeLonExist">
  436. 距离:{{ Micrometer(item.distance) }}m
  437. </div>
  438. <div class="info" v-if="item.cntOrderAmtYear">
  439. 门店销额(全年累计):{{ Micrometer(item.cntOrderAmtYear) }}元
  440. </div>
  441. </div>
  442. <div
  443. class="statstext"
  444. v-if="item.stateString == '未拜访'"
  445. style="background-color: #ed5c68">
  446. 未拜访
  447. </div>
  448. <div
  449. class="statstext"
  450. v-if="item.stateString == '拜访中'"
  451. style="background-color: white">
  452. <van-icon :name="times" color="#ee0a24" size="32" />
  453. </div>
  454. <template v-if="item.stateString == '已拜访'">
  455. <!-- 正常拜访 -->
  456. <template v-if="item.visitSource == 1">
  457. <!-- 金牌店+同城分销店+可控店 -->
  458. <template v-if="item.jinpaiStore || item.fenxiaoStore || item.kekongStore">
  459. <div class="statstext" style="background-color: #e3f0fe">
  460. <span style="color: #387bca">已拜访</span>
  461. <div
  462. class="statstextIcon"
  463. style="background-color: #0057ba"
  464. @click="openPerfectStore(item)">
  465. <div style="margin: 4px; font-size: 14px; font-weight: 600">
  466. <img
  467. style="width: 18px; height: 20px; margin: 0 5px; vertical-align: -5px"
  468. :src="require('@/assets/shouzhi.png')" />完美门店报告
  469. </div>
  470. </div>
  471. </div>
  472. </template>
  473. <template v-else>
  474. <div class="statstext">
  475. <span>已拜访</span>
  476. </div>
  477. </template>
  478. </template>
  479. <template v-else>
  480. <!-- 异常拜访 -->
  481. <div class="statstext">
  482. <span>已拜访</span>
  483. </div>
  484. </template>
  485. </template>
  486. <div class="btnbox">
  487. <van-row>
  488. <van-col
  489. span="4"
  490. v-if="item.stateString != '已拜访' && item.visitAble && customerVisits"
  491. @click="storeVisit(item)">
  492. <img :src="call" style="margin: 0 auto; height: 15px; display: block" />
  493. <p style="text-align: center; margin: 0; font-size: 11px">进入拜访</p>
  494. </van-col>
  495. <van-col
  496. span="4"
  497. v-if="item.storeCategory == '公装经销商'"
  498. @click="projectOutVisit(item)">
  499. <img :src="xmgj" style="margin: 0 auto; height: 15px; display: block" />
  500. <p style="text-align: center; margin: 0; font-size: 11px">项目跟进</p>
  501. </van-col>
  502. <van-col
  503. span="4"
  504. v-if="
  505. item.stateString != '已拜访' &&
  506. item.visitAble &&
  507. item.storeCategory != '公装经销商' &&
  508. customerVisits
  509. "
  510. @click="abnormalVisit(item)">
  511. <img :src="yichang" style="margin: 0 auto; height: 15px; display: block" />
  512. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 11px">
  513. 异常拜访
  514. </p>
  515. </van-col>
  516. <van-col
  517. span="4"
  518. v-if="item.storeLabels.zysslNums !== false"
  519. @click="linkList(item)">
  520. <img
  521. :src="require('@/assets/recommendicon.png')"
  522. style="margin: 0 auto; height: 15px; display: block" />
  523. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 11px">
  524. 推荐下单
  525. </p>
  526. </van-col>
  527. <van-col span="4" v-else-if="item.showOrderButton" @click="orderFn(item)">
  528. <img :src="xiadan" style="margin: 0 auto; height: 15px; display: block" />
  529. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 11px">
  530. 去下单
  531. </p>
  532. </van-col>
  533. <van-col span="4" v-if="item.stateString == '已拜访'" @click="Visit(item)">
  534. <img :src="bfxx" style="margin: 0 auto; height: 15px; display: block" />
  535. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 11px">
  536. 拜访信息
  537. </p>
  538. </van-col>
  539. <van-col span="4" @click="visitFn(item)">
  540. <img :src="kehuxinxi" style="margin: 0 auto; height: 15px; display: block" />
  541. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 11px">
  542. 客户信息
  543. </p>
  544. </van-col>
  545. </van-row>
  546. </div>
  547. </van-cell>
  548. <div class="lineGrey"></div>
  549. </div>
  550. </van-pull-refresh>
  551. <p style="text-align: center; color: #888a8e" v-if="list.length > 0">--已经到底了--</p>
  552. <br />
  553. <van-empty description="暂无数据" v-if="list.length == 0" />
  554. </div>
  555. <van-popup v-model="show" position="bottom" :style="{ height: '50%' }">
  556. <van-datetime-picker
  557. v-model="currentDate"
  558. type="date"
  559. title="计划日期"
  560. :min-date="minDate"
  561. :max-date="maxDate"
  562. @confirm="dateeconfirm"
  563. @cancel="show = false" />
  564. </van-popup>
  565. <!-- 筛选模块 -->
  566. <filtrate
  567. v-show="showFilter"
  568. :showFilter="showFilter"
  569. @closePopup="closePopup"
  570. ref="filtrate"
  571. :entry="0"></filtrate>
  572. <tab-bar tabBarActive="deviceWithin"></tab-bar>
  573. </div>
  574. </template>
  575. <script>
  576. import Network from '@/assets/Network.png';
  577. import WiFi from '@/assets/WiFi.png';
  578. import tabBar from '@/components/tabBar';
  579. import times from '@/assets/Icon/times.png';
  580. import order60 from '@/assets/order60.png';
  581. import targetOne from '@/assets/targetOne.png';
  582. import visitTimes from '@/assets/visitTimes.png';
  583. import ord from '@/assets/ord.png';
  584. import timeico from '@/assets/Icon/datatims.png';
  585. import sbpmdh from '@/assets/sbpmdh.png';
  586. import {
  587. getUserInPlanList,
  588. checkVisit,
  589. addVisitsPosition,
  590. mobileReposition,
  591. buryingPoint,
  592. ProductItemImge,
  593. } from '@/api/index';
  594. import axios from 'axios';
  595. import paste from '@/assets/paste.png';
  596. import order from '@/assets/order.png';
  597. import call from '@/assets/call.png';
  598. import jiarujihua from '@/assets/jiarujihua.png';
  599. import kehuxinxi from '@/assets/kehuxinxi-2.png';
  600. import xiadan from '@/assets/xiadan.png';
  601. import yichang from '@/assets/yichang.png';
  602. import bfxx from '@/assets/bfxx.png';
  603. import xmgj from '@/assets/xmgj.png';
  604. import { getOrderUrlByStoreId } from '@/api/inventory';
  605. import { checkStoreAddressByStoreCode } from '@/api/visitstore';
  606. import { getPosition, getTicketFun } from '@/utils/TXApiFun';
  607. import filtrate from '@/components/filtrate';
  608. export default {
  609. name: 'deviceWithin',
  610. components: { tabBar, filtrate },
  611. data() {
  612. return {
  613. Network: Network,
  614. WiFi: WiFi,
  615. xmgj: xmgj,
  616. bfxx: bfxx,
  617. yichang: yichang,
  618. xiadan: xiadan,
  619. kehuxinxi: kehuxinxi,
  620. jiarujihua: jiarujihua,
  621. call: call,
  622. times: times,
  623. timeico: timeico,
  624. order60: order60,
  625. sbpmdh: sbpmdh,
  626. ord: ord,
  627. timeData1: '',
  628. targetOne: targetOne,
  629. paste: paste,
  630. visitTimess: visitTimes,
  631. show: false,
  632. cont: 0,
  633. timer: null,
  634. flag: true,
  635. order: order,
  636. defaultDate: new Date(),
  637. minDate: new Date(2020, 0, 1),
  638. // maxDate: new Date(2025, 10, 1),
  639. showPopoverVNUM: [],
  640. showPopoverC: [],
  641. showPopoverZ: [],
  642. currentDate: new Date(),
  643. searchValue: '',
  644. calendarIsshow: false,
  645. tabVal: 'insidePlan',
  646. list: [],
  647. loading: false,
  648. mapShows: false,
  649. typeShow: false,
  650. storeName: '',
  651. timeData: '',
  652. genDate: '',
  653. listActive: null,
  654. query: '',
  655. lat: '',
  656. lon: '',
  657. storeType: '',
  658. endShow: false,
  659. visitEndId: '',
  660. customerVisits: true,
  661. // 筛选模块
  662. showFilter: false,
  663. filterParams: {},
  664. refreshing: false,
  665. };
  666. },
  667. computed: {
  668. /**
  669. * 计算最大可选日期:当前日期往后推30天
  670. */
  671. maxDate() {
  672. const today = new Date();
  673. const maxYear = today.getFullYear();
  674. const maxMonth = today.getMonth();
  675. const maxDay = today.getDate() + 30;
  676. return new Date(maxYear, maxMonth, maxDay);
  677. },
  678. },
  679. watch: {
  680. $route(to, from) {
  681. if (from.path == '/deviceWithin/index' && to.path == '/storeVisitpage') {
  682. localStorage.setItem('startTime', new Date());
  683. }
  684. if (from.path == '/outsidelist/index') {
  685. localStorage.setItem('outvstoreName', '');
  686. localStorage.setItem('outvchainName', '');
  687. localStorage.removeItem('outvstoreLabelTypes');
  688. localStorage.removeItem('outvjpdStoreLevelTypes');
  689. localStorage.removeItem('outvstoreCategoryList');
  690. localStorage.setItem('outvchainCode', '');
  691. localStorage.setItem('outvsortType', '');
  692. localStorage.setItem('outsortParam', '');
  693. localStorage.setItem('lat', '');
  694. localStorage.setItem('lon', '');
  695. this.filterParams = {};
  696. if (this.$refs.filtrate) {
  697. this.$refs.filtrate.onsets();
  698. }
  699. }
  700. },
  701. },
  702. activated() {
  703. this.query = this.$route.query;
  704. this.timeData = this.parseTime(new Date(), '{yy}-{mm}-{dd}');
  705. this.storeName = localStorage.getItem('deviveStoreName');
  706. this.getMonth();
  707. // 授权
  708. getTicketFun().then(() => {
  709. this.getUserInPlanList();
  710. });
  711. },
  712. mounted() {
  713. // 解决iOS 上拉边界下拉出现白色空白
  714. let node = document.getElementsByClassName('deviceWithin')[0];
  715. node.addEventListener(
  716. 'touchmove',
  717. (e) => {
  718. if (e._isScroller) return;
  719. e.preventDefault();
  720. },
  721. {
  722. passive: false,
  723. },
  724. );
  725. },
  726. methods: {
  727. onRefresh() {
  728. this.list = [];
  729. this.getUserInPlanList();
  730. },
  731. closePopup(flag, filterParams) {
  732. this.showFilter = false;
  733. if (flag) {
  734. this.filterParams = filterParams;
  735. this.onSearch();
  736. }
  737. },
  738. searchFn() {
  739. this.showFilter = true;
  740. },
  741. handleTouch(e) {
  742. e._isScroller = true;
  743. },
  744. linkapp(val) {
  745. var poind = this.gcj02BD(val.lat, val.lon);
  746. let url = window.location.href;
  747. let that = this;
  748. let wx = this.wx;
  749. let qiyeData;
  750. const instance = axios.create();
  751. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  752. instance
  753. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  754. params: {
  755. url: url,
  756. agent: 1,
  757. },
  758. })
  759. .then((response) => {
  760. if (response.status == 200) {
  761. qiyeData = response.data.data;
  762. wx.agentConfig({
  763. corpid: qiyeData.appId, // 必填,企业微信的corpid,必须与当前登录的企业一致
  764. agentid: qiyeData.agentId, // 必填,企业微信的应用id (e.g. 1000247)
  765. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  766. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  767. signature: qiyeData.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
  768. jsApiList: ['launchMiniprogram'], //必填,传入需要使用的接口名称
  769. success: function (res) {
  770. wx.invoke(
  771. 'launchMiniprogram',
  772. {
  773. appid: 'wx238bbb5f6d958414',
  774. path:
  775. 'pages/relayStation/relayStation?latitude=' +
  776. poind.lat +
  777. '&longitude=' +
  778. poind.lon +
  779. '&name=' +
  780. val.addressLine,
  781. },
  782. function (res) {
  783. if (res.err_msg == 'launchMiniprogram:ok') {
  784. } else {
  785. }
  786. },
  787. );
  788. },
  789. fail: function (res) {
  790. if (res.errMsg.indexOf('function not exist') > -1) {
  791. alert('版本过低请升级');
  792. }
  793. },
  794. });
  795. }
  796. });
  797. },
  798. orderFn(val) {
  799. buryingPoint({
  800. systemModel: '计划内',
  801. buryingPointType: 1,
  802. buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  803. buryingPointName: '去下单',
  804. buryingPointPosition: '计划内',
  805. });
  806. getOrderUrlByStoreId({
  807. storeId: val.storeId,
  808. from: 'inPlan',
  809. }).then((res) => {
  810. if (res.code == 200 && res.data) {
  811. window.location.href = res.data;
  812. } else {
  813. this.Toast({
  814. message: res.msg,
  815. duration: 5000,
  816. });
  817. }
  818. });
  819. },
  820. linkList(val) {
  821. buryingPoint({
  822. systemModel: '计划内',
  823. buryingPointType: 1,
  824. buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  825. buryingPointName: '推荐下单',
  826. buryingPointPosition: '计划内',
  827. });
  828. this.$router.push({
  829. path: '/pItem',
  830. query: {
  831. id: val.storeId,
  832. detilId: 'a',
  833. from: 'inPlan',
  834. storeCode: val.storeCode,
  835. storeName: val.storeName,
  836. showOrderButton: val.showOrderButton,
  837. },
  838. });
  839. },
  840. linkimg(val) {
  841. ProductItemImge({ storeId: val.storeId }).then((response) => {
  842. if (response.code == 200) {
  843. if (response.data != undefined) {
  844. window.open(response.data);
  845. } else {
  846. this.$toast(response.msg);
  847. }
  848. } else {
  849. this.$dialog.alert({
  850. title: '系统提示',
  851. message: res.msg,
  852. });
  853. }
  854. });
  855. },
  856. getMonth() {
  857. // 获取当前日期
  858. var currentDate = new Date();
  859. // 获取当前月份
  860. var currentMonth = currentDate.getMonth();
  861. // 获取当前年份
  862. // var currentYear = currentDate.getFullYear();
  863. var previousMonthDate1 = new Date();
  864. if (currentDate.getDate() == 1) {
  865. previousMonthDate1.setMonth(currentMonth - 1);
  866. } else {
  867. }
  868. var previousMonth1 = previousMonthDate1.getMonth();
  869. var previousYear1 = previousMonthDate1.getFullYear();
  870. // 计算前三个月的年份和月份
  871. var previousMonthDate = new Date();
  872. if (currentDate.getDate() == 1) {
  873. previousMonthDate.setMonth(currentMonth - 3);
  874. } else {
  875. previousMonthDate.setMonth(currentMonth - 2);
  876. }
  877. 1;
  878. var previousMonth = previousMonthDate.getMonth();
  879. var previousYear = previousMonthDate.getFullYear();
  880. //前三个月
  881. if (previousYear1 == previousYear) {
  882. var formattedPreviousMonth1 = previousYear1 + '-' + (previousMonth1 + 1);
  883. // 格式化年份和月份
  884. var formattedPreviousMonth = previousYear + '-' + (previousMonth + 1);
  885. this.timeData1 =
  886. formattedPreviousMonth.split('-')[1] + '-' + formattedPreviousMonth1.split('-')[1] + '月';
  887. } else {
  888. var formattedPreviousMonth1 = previousYear1 + '年' + (previousMonth1 + 1) + '月';
  889. // .toString().padStart(2, '0');
  890. // 格式化年份和月份
  891. var formattedPreviousMonth = previousYear + '年' + (previousMonth + 1) + '月';
  892. this.timeData1 = formattedPreviousMonth + '-' + formattedPreviousMonth1;
  893. }
  894. },
  895. Visit(val) {
  896. if ((val.jinpaiStore || val.fenxiaoStore || val.kekongStore) && val.visitSource == 1) {
  897. // 金牌店+同城分销店+可控店 -完美门店
  898. this.$router.push({
  899. path: '/perfectStore',
  900. query: {
  901. visitId: val.visitId,
  902. storeId: val.storeId,
  903. storeCode: val.storeCode,
  904. },
  905. });
  906. } else {
  907. this.$router.push({
  908. path: '/historicalDetails',
  909. query: {
  910. visitId: val.visitId,
  911. storeId: val.storeId,
  912. storeCode: val.storeCode,
  913. },
  914. });
  915. }
  916. },
  917. dateeconfirm() {
  918. this.show = false;
  919. this.genDate = this.parseTime(this.currentDate, '{yy}-{mm}-{dd}');
  920. this.timeData = this.parseTime(this.currentDate, '{yy}-{mm}-{dd}');
  921. this.getUserInPlanList();
  922. },
  923. dataFn() {
  924. this.genDate = this.parseTime(new Date(), '{yy}-{mm}-{dd}');
  925. this.timeData = this.parseTime(new Date(), '{yy}-{mm}-{dd}');
  926. this.getUserInPlanList();
  927. },
  928. buryingPointFn(val) {
  929. buryingPoint({
  930. systemModel: '计划内',
  931. buryingPointType: 1,
  932. buryingPointValue: val.telephone,
  933. buryingPointName: '点击电话',
  934. buryingPointPosition: val.storeName + '(' + val.storeCode + ')',
  935. });
  936. },
  937. getUserInPlanList() {
  938. localStorage.setItem('outvstoreName', '');
  939. localStorage.setItem('outvchainName', '');
  940. localStorage.removeItem('outvstoreLabelTypes');
  941. localStorage.removeItem('outvstoreCategoryList');
  942. localStorage.setItem('outvchainCode', '');
  943. localStorage.setItem('outvstoreName', '');
  944. localStorage.setItem('outvsortType', '');
  945. localStorage.setItem('outsortParam', '');
  946. localStorage.setItem('lat', '');
  947. localStorage.setItem('lon', '');
  948. var postType = localStorage.getItem('postType');
  949. this.customerVisits = localStorage.getItem('customerVisits');
  950. if (localStorage.getItem('postType') == 'JZ' || localStorage.getItem('postType') == 'GZ') {
  951. this.mapShows = false;
  952. } else {
  953. this.mapShows = true;
  954. }
  955. if (postType == 'GZ') {
  956. this.typeShow = false;
  957. } else {
  958. this.typeShow = true;
  959. }
  960. this.storeType = localStorage.getItem('storeType');
  961. this.endShow = false;
  962. localStorage.removeItem('visitId');
  963. getPosition(true, true)
  964. .then((res) => {
  965. let { TXisBD } = res;
  966. this.getUserInPlanListFun(TXisBD);
  967. })
  968. .catch((error) => {
  969. this.getUserInPlanListFun();
  970. // this.$dialog.alert({
  971. // message: error,
  972. // });
  973. });
  974. },
  975. getUserInPlanListFun(TXisBD) {
  976. this.toastLoading(0, '加载中...', true);
  977. getUserInPlanList({
  978. storeName: this.storeName.trim(),
  979. genDate: this.genDate,
  980. lat: TXisBD ? TXisBD.lat : '',
  981. lon: TXisBD ? TXisBD.lon : '',
  982. ...this.filterParams,
  983. }).then((res) => {
  984. this.toastLoading().clear();
  985. if (this.refreshing) {
  986. this.refreshing = false;
  987. }
  988. if (res.code == 200) {
  989. this.list = res.data;
  990. this.list.forEach((item) => {
  991. if (item.stateString.indexOf('拜访中') != -1) {
  992. this.endShow = true;
  993. this.visitEndId = item.visitId;
  994. return;
  995. }
  996. });
  997. } else {
  998. this.list = [];
  999. this.$toast.fail(res.msg);
  1000. }
  1001. });
  1002. },
  1003. storeVisit(val) {
  1004. if (val.visitSource && val.visitSource == 2) {
  1005. this.$toast('请先取消异常拜访后再进入正常拜访!');
  1006. return;
  1007. }
  1008. var that = this;
  1009. localStorage.removeItem('visitId');
  1010. checkVisit({ storeId: val.storeId }).then((res) => {
  1011. // buryingPoint({
  1012. // systemModel: '计划内',
  1013. // buryingPointType: 1,
  1014. // buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  1015. // buryingPointName: '进店拜访',
  1016. // buryingPointPosition: '计划内',
  1017. // });
  1018. localStorage.setItem('getRequestFlage', 'true');
  1019. if (res.code == 200 || val.stateString.indexOf('拜访中') != -1) {
  1020. if (localStorage.getItem('loginType') == 'cs') {
  1021. var lat = '';
  1022. var lon = '';
  1023. if (val.lat == '' || val.lat == null) {
  1024. lat = '31.2517820000';
  1025. lon = '120.5593090000';
  1026. } else {
  1027. lat = val.lat;
  1028. lon = val.lon;
  1029. }
  1030. this.$router.push({
  1031. path: '/storeVisitpage',
  1032. query: {
  1033. storeId: val.storeId,
  1034. rdId: val.rdId,
  1035. lat: lat,
  1036. lon: lon,
  1037. visitId: val.visitId,
  1038. pageType: 'out',
  1039. addressLine: val.addressLine,
  1040. storeCategory: val.storeCategory,
  1041. storeName: val.storeName,
  1042. hisTime: val.hisTime,
  1043. contactName: val.contactName,
  1044. storeCode: val.storeCode,
  1045. tabVal: this.tabVal,
  1046. visitModel: '1',
  1047. latNew: '31.2517820000',
  1048. lonNew: '120.5593090000',
  1049. PointSum: 0,
  1050. marklat: lat,
  1051. marklon: lon,
  1052. from: 'inPlan',
  1053. },
  1054. });
  1055. localStorage.setItem('startTime', new Date());
  1056. localStorage.setItem('ORGName', val.deptName);
  1057. localStorage.setItem('chainNameR', val.storeName);
  1058. } else {
  1059. if (that.flag) {
  1060. that.flag = false;
  1061. that.timer = null;
  1062. that.timer = setTimeout(() => {
  1063. that.flag = true;
  1064. }, 2000);
  1065. if (val.stateString.indexOf('拜访中') != -1) {
  1066. that.$router.push({
  1067. path: '/storeVisitpage',
  1068. query: {
  1069. storeId: val.storeId,
  1070. rdId: val.rdId,
  1071. lat: val.lat,
  1072. lon: val.lon,
  1073. visitId: val.visitId,
  1074. addressLine: val.addressLine,
  1075. storeCategory: val.storeCategory,
  1076. storeName: val.storeName,
  1077. contactName: val.contactName,
  1078. genDate: val.hisTime,
  1079. storeCode: val.storeCode,
  1080. visitModel: '1',
  1081. latNew: val.lat,
  1082. lonNew: val.lon,
  1083. PointSum: '0',
  1084. marklat: val.lat,
  1085. marklon: val.lon,
  1086. from: 'inPlan',
  1087. },
  1088. });
  1089. localStorage.setItem('startTime', new Date());
  1090. localStorage.setItem('ORGName', val.deptName);
  1091. localStorage.setItem('chainNameR', val.storeName);
  1092. } else {
  1093. getPosition()
  1094. .then((res) => {
  1095. let { TXisBD, resData } = res;
  1096. this.lat = TXisBD.lat;
  1097. this.lon = TXisBD.lon;
  1098. localStorage.setItem('lat', this.lat);
  1099. localStorage.setItem('lon', this.lon);
  1100. this.checkStoreAddressByStoreCodeFun(val, TXisBD, resData);
  1101. })
  1102. .catch((error) => {
  1103. this.$dialog.alert({
  1104. message: error,
  1105. });
  1106. });
  1107. }
  1108. }
  1109. }
  1110. } else {
  1111. this.$dialog.alert({
  1112. title: '系统提示',
  1113. message: res.msg,
  1114. });
  1115. }
  1116. });
  1117. },
  1118. checkStoreAddressByStoreCodeFun(val, location, res) {
  1119. checkStoreAddressByStoreCode({
  1120. storeCode: val.storeCode,
  1121. lon: location.lon,
  1122. lat: location.lat,
  1123. }).then((response) => {
  1124. // loading1.clear();
  1125. if (val.lat == '' || val.lat == null) {
  1126. this.lat = location.lat;
  1127. this.lon = location.lon;
  1128. }
  1129. // let PointSum = this.twoPointSum(this.lat, this.lon, location.lat, location.lon).toFixed(2);
  1130. let PointSumval = this.twoPointSum(
  1131. location.lat,
  1132. location.lon,
  1133. location.lat,
  1134. location.lon,
  1135. ).toFixed(2);
  1136. // GZ:工装店铺 直接进入拜访
  1137. if (localStorage.getItem('postType') == 'GZ' || /^FSQ/.test(val.storeCode)) {
  1138. localStorage.setItem('startTime', new Date());
  1139. localStorage.setItem('ORGName', val.deptName);
  1140. localStorage.setItem('chainNameR', val.storeName);
  1141. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1142. return;
  1143. }
  1144. // 门店校验 地址不通过
  1145. if (response.code != 200) {
  1146. // updateAddress : ,1:同城AB+金牌,去修改地址;2:非金牌店铺,非同城店铺偏差过大不允许拜访,可以重置定位;0非金牌店铺,非同城店铺 位置信息不存在 可以继续拜访
  1147. if (response.data.updateAddress == 0) {
  1148. // 非金牌店铺,非同城店铺 位置信息不存在 可以继续拜访
  1149. this.$dialog
  1150. .confirm({
  1151. confirmButtonText: '确定拜访',
  1152. cancelButtonText: '取消拜访',
  1153. title: '系统提示',
  1154. message:
  1155. '该客户没有经纬度,此次拜访会保存定位点作为客户经纬度,下次拜访时判断是否偏差过大。',
  1156. closeOnClickOverlay: true,
  1157. })
  1158. .then(() => {
  1159. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1160. });
  1161. } else if (response.data.updateAddress == 1) {
  1162. // 同城AB+金牌,去修改地址
  1163. // addressUpdateTimesOver: true=已经达到最大次数,不让修改; false=没有达到可以修改
  1164. if (!response.data.addressUpdateTimesOver) {
  1165. this.$dialog
  1166. .confirm({
  1167. title: '系统提示',
  1168. message: response.msg + '请立即修改后再拜访',
  1169. messageAlign: 'left',
  1170. confirmButtonText: '立即修改',
  1171. cancelButtonText: '取消',
  1172. })
  1173. .then(() => {
  1174. this.$router.push({
  1175. path: '/storeDetail',
  1176. query: {
  1177. id: val.storeId,
  1178. type: 'address',
  1179. storeAddressId: val.storeAddressId,
  1180. },
  1181. });
  1182. });
  1183. } else {
  1184. this.$dialog.confirm({
  1185. title: '系统提示',
  1186. message: '已经达到最大修改次数',
  1187. messageAlign: 'left',
  1188. confirmButtonText: '确定',
  1189. });
  1190. }
  1191. } else if (response.data.updateAddress == 2) {
  1192. // 1.非金牌店铺,非同城店铺 位置偏差过大 重置经纬度
  1193. this.resetCoord(res, val, location, PointSumval);
  1194. return;
  1195. }
  1196. } else {
  1197. // 门店编码校验门店地址通过 进入拜访
  1198. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1199. }
  1200. });
  1201. },
  1202. // 重置经纬度
  1203. resetCoord(res, val, location, PointSumval) {
  1204. this.$dialog
  1205. .confirm({
  1206. confirmButtonText: '初始化定位',
  1207. cancelButtonText: '取消拜访',
  1208. title: '系统提示',
  1209. message: '偏差过大,不允许拜访。可修改本店定位.',
  1210. closeOnClickOverlay: true,
  1211. })
  1212. .then(() => {
  1213. mobileReposition({
  1214. storeId: val.storeId,
  1215. lat: location.lat,
  1216. lon: location.lon,
  1217. }).then((response) => {
  1218. if (response.code == 200) {
  1219. this.$dialog
  1220. .alert({
  1221. title: '系统提示',
  1222. message: '本信息定位已更新成功!',
  1223. })
  1224. .then(() => {
  1225. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1226. });
  1227. localStorage.setItem('startTime', new Date());
  1228. localStorage.setItem('ORGName', val.deptName);
  1229. localStorage.setItem('chainNameR', val.storeName);
  1230. } else {
  1231. this.$toast(response.msg);
  1232. }
  1233. });
  1234. })
  1235. .catch(() => {});
  1236. },
  1237. // 进入拜访 router.push
  1238. toSuishenbangOutstoreVisit(res, val, location, PointSumval) {
  1239. addVisitsPosition({
  1240. storeId: val.storeId,
  1241. visitsId: '',
  1242. lon: res.longitude,
  1243. lat: res.latitude,
  1244. sourceLon: location.lon,
  1245. sourceLat: location.lat,
  1246. positionDesc: '',
  1247. accuracy: res.accuracy,
  1248. }).then(() => {
  1249. this.$router.push({
  1250. path: '/storeVisitpage',
  1251. query: {
  1252. storeId: val.storeId,
  1253. rdId: val.rdId,
  1254. lat: location.lat,
  1255. lon: location.lon,
  1256. visitId: val.visitId,
  1257. addressLine: val.addressLine,
  1258. storeCategory: val.storeCategory,
  1259. storeName: val.storeName,
  1260. contactName: val.contactName,
  1261. genDate: val.hisTime,
  1262. storeCode: val.storeCode,
  1263. visitModel: '1',
  1264. latNew: location.lat,
  1265. lonNew: location.lon,
  1266. PointSum: PointSumval,
  1267. marklat: res.latitude,
  1268. marklon: res.longitude,
  1269. from: 'inPlan',
  1270. },
  1271. });
  1272. });
  1273. },
  1274. projectOutVisit(val) {
  1275. localStorage.setItem('tabVal', this.tabVal);
  1276. localStorage.removeItem('visitId');
  1277. // checkVisit({storeId:val.storeId}).then(res=>{
  1278. // if(res.code==200||val.stateString.indexOf("拜访中")!=-1){
  1279. if (localStorage.getItem('loginType') == 'cs') {
  1280. var lat = '';
  1281. var lon = '';
  1282. if (val.lat == '' || val.lat == null) {
  1283. lat = '31.2517820000';
  1284. lon = '120.5593090000';
  1285. } else {
  1286. lat = val.lat;
  1287. lon = val.lon;
  1288. }
  1289. this.$router.push({
  1290. path: '/storeGroup',
  1291. query: {
  1292. storeId: val.storeId,
  1293. rdId: val.rdId,
  1294. lat: lat,
  1295. lon: lon,
  1296. visitId: val.visitId,
  1297. pageType: 'out',
  1298. addressLine: val.addressLine,
  1299. storeCategory: val.storeCategory,
  1300. storeName: val.storeName,
  1301. hisTime: val.hisTime,
  1302. contactName: val.contactName,
  1303. storeCode: val.storeCode,
  1304. tabVal: this.tabVal,
  1305. visitModel: '1',
  1306. latNew: '31.2517820000',
  1307. lonNew: '120.5593090000',
  1308. PointSum: 0,
  1309. marklat: lat,
  1310. marklon: lon,
  1311. },
  1312. });
  1313. localStorage.setItem('startTime', new Date());
  1314. localStorage.setItem('ORGName', val.deptName);
  1315. localStorage.setItem('chainNameR', val.storeName);
  1316. } else {
  1317. if (this.flag) {
  1318. this.flag = false;
  1319. this.timer = null;
  1320. let that = this;
  1321. this.timer = setTimeout(() => {
  1322. this.flag = true;
  1323. }, 2000);
  1324. if (val.stateString.indexOf('拜访中') != -1) {
  1325. localStorage.setItem('startTime', new Date());
  1326. localStorage.setItem('ORGName', val.deptName);
  1327. localStorage.setItem('chainNameR', val.storeName);
  1328. that.$router.push({
  1329. path: '/storeGroup',
  1330. query: {
  1331. storeId: val.storeId,
  1332. rdId: val.rdId,
  1333. lat: val.lat,
  1334. lon: val.lon,
  1335. visitId: val.visitId,
  1336. pageType: 'out',
  1337. addressLine: val.addressLine,
  1338. storeCategory: val.storeCategory,
  1339. storeName: val.storeName,
  1340. hisTime: val.hisTime,
  1341. contactName: val.contactName,
  1342. storeCode: val.storeCode,
  1343. tabVal: that.tabVal,
  1344. visitModel: '1',
  1345. latNew: val.lat,
  1346. lonNew: val.lon,
  1347. PointSum: '0',
  1348. marklat: val.lat,
  1349. marklon: val.lon,
  1350. },
  1351. });
  1352. } else {
  1353. let loading1 = this.$toast.loading({
  1354. duration: 0,
  1355. message: '加载中...',
  1356. forbidClick: true,
  1357. });
  1358. let url = window.location.href;
  1359. let wx = this.wx;
  1360. let qiyeData;
  1361. const instance = axios.create();
  1362. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  1363. instance
  1364. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  1365. params: {
  1366. url: url,
  1367. },
  1368. })
  1369. .then((response) => {
  1370. if (response.status == 200) {
  1371. this.cont = 3;
  1372. var flat = true;
  1373. var times = setInterval(() => {
  1374. this.cont--;
  1375. if (this.cont == '0') {
  1376. if (flat) {
  1377. loading1.clear();
  1378. clearInterval(times);
  1379. that.$dialog
  1380. .alert({
  1381. message: '定位失败,请开启企微定位权限',
  1382. })
  1383. .then(() => {});
  1384. } else {
  1385. clearInterval(times);
  1386. }
  1387. }
  1388. }, 1000);
  1389. qiyeData = response.data.data;
  1390. wx.config({
  1391. beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  1392. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  1393. appId: qiyeData.appId, // 必填,企业微信的corpID
  1394. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  1395. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  1396. signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  1397. jsApiList: ['ready', 'getLocation'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
  1398. });
  1399. wx.ready(function () {
  1400. wx.getLocation({
  1401. type: 'gcj02',
  1402. success: function (res) {
  1403. flat = false;
  1404. loading1.clear();
  1405. var location = that.CJ02BD(res.latitude, res.longitude);
  1406. if (val.lat == '' || val.lat == null) {
  1407. that.lat = location.lat;
  1408. that.lon = location.lon;
  1409. }
  1410. let PointSum = that
  1411. .twoPointSum(that.lat, that.lon, location.lat, location.lon)
  1412. .toFixed(2);
  1413. if (val.lat == '' || val.lat == null) {
  1414. if (
  1415. localStorage.getItem('postType') == 'GZ' ||
  1416. /^FSQ/.test(val.storeCode)
  1417. ) {
  1418. that.$router.push({
  1419. path: '/storeGroup',
  1420. query: {
  1421. storeId: val.storeId,
  1422. rdId: val.rdId,
  1423. lat: that.lat,
  1424. lon: that.lon,
  1425. visitId: val.visitId,
  1426. pageType: 'out',
  1427. addressLine: val.addressLine,
  1428. storeCategory: val.storeCategory,
  1429. storeName: val.storeName,
  1430. contactName: val.contactName,
  1431. hisTime: val.hisTime,
  1432. storeCode: val.storeCode,
  1433. tabVal: that.tabVal,
  1434. visitModel: '1',
  1435. latNew: location.lat,
  1436. lonNew: location.lon,
  1437. PointSum: PointSum,
  1438. marklat: res.latitude,
  1439. marklon: res.longitude,
  1440. },
  1441. });
  1442. } else {
  1443. that.$dialog
  1444. .confirm({
  1445. confirmButtonText: '确定拜访',
  1446. cancelButtonText: '取消拜访',
  1447. title: '系统提示',
  1448. message:
  1449. '该信息没有经纬度,此次拜访会保存定位点作为信息经纬度,下次拜访时判断是否偏差过大。',
  1450. closeOnClickOverlay: true,
  1451. })
  1452. .then(() => {
  1453. that.$router.push({
  1454. path: '/storeGroup',
  1455. query: {
  1456. storeId: val.storeId,
  1457. rdId: val.rdId,
  1458. lat: that.lat,
  1459. lon: that.lon,
  1460. visitId: val.visitId,
  1461. pageType: 'out',
  1462. addressLine: val.addressLine,
  1463. storeCategory: val.storeCategory,
  1464. storeName: val.storeName,
  1465. contactName: val.contactName,
  1466. hisTime: val.hisTime,
  1467. storeCode: val.storeCode,
  1468. tabVal: that.tabVal,
  1469. visitModel: '1',
  1470. latNew: location.lat,
  1471. lonNew: location.lon,
  1472. PointSum: PointSum,
  1473. marklat: res.latitude,
  1474. marklon: res.longitude,
  1475. },
  1476. });
  1477. });
  1478. }
  1479. } else {
  1480. that.$router.push({
  1481. path: '/storeGroup',
  1482. query: {
  1483. storeId: val.storeId,
  1484. rdId: val.rdId,
  1485. lat: that.lat,
  1486. lon: that.lon,
  1487. visitId: val.visitId,
  1488. pageType: 'out',
  1489. addressLine: val.addressLine,
  1490. storeCategory: val.storeCategory,
  1491. storeName: val.storeName,
  1492. contactName: val.contactName,
  1493. hisTime: val.hisTime,
  1494. storeCode: val.storeCode,
  1495. tabVal: that.tabVal,
  1496. visitModel: '1',
  1497. latNew: location.lat,
  1498. lonNew: location.lon,
  1499. PointSum: PointSum,
  1500. marklat: res.latitude,
  1501. marklon: res.longitude,
  1502. },
  1503. });
  1504. }
  1505. localStorage.setItem('startTime', new Date());
  1506. localStorage.setItem('ORGName', val.deptName);
  1507. localStorage.setItem('chainNameR', val.storeName);
  1508. addVisitsPosition({
  1509. storeId: val.storeId,
  1510. visitsId: '',
  1511. lon: res.longitude,
  1512. lat: res.latitude,
  1513. sourceLon: location.lon,
  1514. sourceLat: location.lat,
  1515. positionDesc: '',
  1516. accuracy: res.accuracy,
  1517. });
  1518. },
  1519. fail: function () {
  1520. loading1.clear();
  1521. that.$dialog.alert({
  1522. message: 'GPS未开启',
  1523. });
  1524. },
  1525. });
  1526. });
  1527. wx.error(function (res) {
  1528. loading1.clear();
  1529. that.$dialog
  1530. .alert({
  1531. message: '定位失败,请开启企微定位权限',
  1532. })
  1533. .then(() => {});
  1534. });
  1535. }
  1536. });
  1537. }
  1538. }
  1539. }
  1540. // }
  1541. // })
  1542. },
  1543. abnormalVisit(val) {
  1544. localStorage.removeItem('visitId');
  1545. checkVisit({ storeId: val.storeId }).then((res) => {
  1546. buryingPoint({
  1547. systemModel: '计划内',
  1548. buryingPointType: 1,
  1549. buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  1550. buryingPointName: '异常拜访',
  1551. buryingPointPosition: '计划内',
  1552. });
  1553. if (res.code == 200 || val.stateString.indexOf('拜访中') != -1) {
  1554. if (localStorage.getItem('loginType') == 'cs') {
  1555. var lat = '';
  1556. var lon = '';
  1557. if (val.lat == '' || val.lat == null) {
  1558. lat = '31.2517820000';
  1559. lon = '120.5593090000';
  1560. } else {
  1561. lat = val.lat;
  1562. lon = val.lon;
  1563. }
  1564. this.$router.push({
  1565. path: '/abnormalVisit',
  1566. query: {
  1567. storeId: val.storeId,
  1568. rdId: val.rdId,
  1569. lat: lat,
  1570. lon: lon,
  1571. visitId: val.visitId,
  1572. pageType: 'out',
  1573. addressLine: val.addressLine,
  1574. storeCategory: val.storeCategory,
  1575. storeName: val.storeName,
  1576. hisTime: val.hisTime,
  1577. contactName: val.contactName,
  1578. storeCode: val.storeCode,
  1579. tabVal: this.tabVal,
  1580. visitModel: '3',
  1581. latNew: '31.2517820000',
  1582. lonNew: '120.5593090000',
  1583. PointSum: 0,
  1584. marklat: lat,
  1585. marklon: lon,
  1586. },
  1587. });
  1588. localStorage.setItem('startTime', new Date());
  1589. localStorage.setItem('ORGName', val.deptName);
  1590. localStorage.setItem('chainNameR', val.storeName);
  1591. } else {
  1592. getPosition()
  1593. .then((res) => {
  1594. let { TXisBD, resData } = res;
  1595. this.lat = TXisBD.lat;
  1596. this.lon = TXisBD.lon;
  1597. localStorage.setItem('lat', this.lat);
  1598. localStorage.setItem('lon', this.lon);
  1599. console.log('异常拜访=' + this.lat);
  1600. console.log('异常拜访=' + this.lon);
  1601. let PointSum = this.twoPointSum(
  1602. TXisBD.lat,
  1603. TXisBD.lon,
  1604. TXisBD.lat,
  1605. TXisBD.lon,
  1606. ).toFixed(2);
  1607. this.$router.push({
  1608. path: '/abnormalVisit',
  1609. query: {
  1610. storeId: val.storeId,
  1611. rdId: val.rdId,
  1612. lat: this.lat,
  1613. lon: this.lon,
  1614. visitModel: localStorage.getItem('postType') != 'GZ' ? '5' : '3',
  1615. visitId: val.visitId,
  1616. genDate: val.genDate,
  1617. storeCode: val.storeCode,
  1618. latNew: location.lat,
  1619. lonNew: location.lon,
  1620. PointSum: PointSum,
  1621. marklat: resData.latitude,
  1622. marklon: resData.longitude,
  1623. },
  1624. });
  1625. localStorage.setItem('startTime', new Date());
  1626. localStorage.setItem('ORGName', val.deptName);
  1627. localStorage.setItem('chainNameR', val.storeName);
  1628. addVisitsPosition({
  1629. storeId: val.storeId,
  1630. visitsId: '',
  1631. lon: resData.longitude,
  1632. lat: resData.latitude,
  1633. sourceLon: location.lon,
  1634. sourceLat: location.lat,
  1635. positionDesc: '',
  1636. accuracy: resData.accuracy,
  1637. });
  1638. })
  1639. .catch((error) => {
  1640. this.$dialog.alert({
  1641. message: error,
  1642. });
  1643. });
  1644. }
  1645. } else {
  1646. this.$dialog.alert({
  1647. title: '系统提示',
  1648. message: res.msg,
  1649. });
  1650. }
  1651. });
  1652. },
  1653. compareDate(dateTime1) {
  1654. var formatDate1 = Date.parse(dateTime1);
  1655. var formatDate2 = Date.parse(this.parseTime(new Date(), '{yy}-{mm}-{dd}'));
  1656. if (formatDate1 == formatDate2) {
  1657. return true;
  1658. } else {
  1659. return false;
  1660. }
  1661. },
  1662. visitFn(val) {
  1663. buryingPoint({
  1664. systemModel: '计划内',
  1665. buryingPointType: 1,
  1666. buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  1667. buryingPointName: '客户信息',
  1668. buryingPointPosition: '计划内',
  1669. });
  1670. if (val.sfaStoreType.type == 'qzd') {
  1671. // 竞品店/潜在店
  1672. this.$router.push({
  1673. path: '/competingStoresDetail',
  1674. query: { id: val.storeId },
  1675. });
  1676. } else if (/^FSQ/.test(val.storeCode)) {
  1677. // FSQ 仿石漆服务商
  1678. this.$router.push({
  1679. path: '/FSQStoreDetail',
  1680. query: { id: val.storeId },
  1681. });
  1682. return;
  1683. } else if (val.designerStore) {
  1684. // designerStore 是否为设计师招募门店,true-是,false-否
  1685. this.$router.push({
  1686. path: '/addDesignerDetail',
  1687. query: { id: val.storeId },
  1688. });
  1689. return;
  1690. } else {
  1691. this.$router.push({
  1692. path: '/storeDetail',
  1693. query: { id: val.storeId, detilId: 'a' },
  1694. });
  1695. }
  1696. },
  1697. goFn() {
  1698. this.$router.push({
  1699. path: '/topStore',
  1700. });
  1701. },
  1702. formLink() {
  1703. this.$router.push('/storeVisit/questions');
  1704. },
  1705. onClickLeft() {
  1706. this.$router.go(-1);
  1707. },
  1708. onSearch() {
  1709. localStorage.setItem('deviveStoreName', this.storeName);
  1710. this.getUserInPlanList();
  1711. },
  1712. handelChange(date) {
  1713. var dateF = this.parseTime(date.$d, '{yy}-{mm}-{dd}');
  1714. this.timeData = dateF;
  1715. this.genDate = dateF;
  1716. this.getUserInPlanList();
  1717. },
  1718. onLoad() {
  1719. this.getUserInPlanList();
  1720. },
  1721. listClick(val) {
  1722. this.listActive = val;
  1723. },
  1724. setStroeNameStyle(item) {
  1725. // 家装或工装 approvalStatus:是否结案 0:未结案,1:已结案
  1726. if (
  1727. (item.sfaStoreType && (item.sfaStoreType.jz || item.sfaStoreType.gz)) ||
  1728. item.approvalStatus == null ||
  1729. item.approvalStatus == 0
  1730. ) {
  1731. return {};
  1732. } else {
  1733. return { color: '#0057ba', 'text-decoration': 'underline' };
  1734. }
  1735. },
  1736. // 跳转好帮手门店详情
  1737. goOtherSystem(item) {
  1738. // 家装或工装 approvalStatus:是否结案 0:未结案,1:已结案
  1739. if (
  1740. (item.sfaStoreType && (item.sfaStoreType.jz || item.sfaStoreType.gz)) ||
  1741. item.approvalStatus == null ||
  1742. item.approvalStatus == 0
  1743. ) {
  1744. return false;
  1745. }
  1746. if (item.storeCode) {
  1747. window.location.href =
  1748. process.env.VUE_APP_SSB_LINK + '/order/storeDetail/index?shopCode=' + item.storeCode;
  1749. } else {
  1750. this.$dialog.alert({
  1751. message: '缺少门店code',
  1752. });
  1753. }
  1754. },
  1755. // 完美门店
  1756. openPerfectStore(val) {
  1757. this.$router.push({
  1758. path: '/perfectStore',
  1759. query: {
  1760. visitId: val.visitId,
  1761. storeId: val.storeId,
  1762. storeCode: val.storeCode,
  1763. },
  1764. });
  1765. },
  1766. },
  1767. };
  1768. </script>
  1769. <style lang="scss">
  1770. .van-dialog__confirm,
  1771. .van-dialog__confirm:active {
  1772. color: #0057ba;
  1773. }
  1774. .searchDiv {
  1775. .van-search {
  1776. background: #fff;
  1777. }
  1778. .van-search__action {
  1779. font-size: 14px;
  1780. color: #0057ba;
  1781. font-weight: bold;
  1782. background: #f1f1f1;
  1783. border-bottom-right-radius: 60px;
  1784. border-top-right-radius: 60px;
  1785. border: 1px solid #c1c1c1;
  1786. padding: 0 20px;
  1787. }
  1788. .van-search--show-action {
  1789. padding-right: 12px;
  1790. }
  1791. .van-search__content {
  1792. border: 1px solid #c1c1c1;
  1793. border-bottom-left-radius: 60px;
  1794. border-top-left-radius: 60px;
  1795. background: #f1f1f1;
  1796. border-right: 0;
  1797. }
  1798. }
  1799. </style>
  1800. <style lang="scss" scoped>
  1801. .bgcolor {
  1802. background-color: #f5f5f5;
  1803. }
  1804. .container {
  1805. padding-bottom: 50px;
  1806. }
  1807. .monthNow {
  1808. height: 48px;
  1809. line-height: 48px;
  1810. text-align: center;
  1811. font-weight: bold;
  1812. padding: 0 15px;
  1813. box-sizing: border-box;
  1814. background-color: #f5f5f5;
  1815. font-size: 16px;
  1816. .CalendarIcon {
  1817. font-size: 24px;
  1818. color: #0057ba;
  1819. position: relative;
  1820. top: 6px;
  1821. margin-left: 10px;
  1822. }
  1823. }
  1824. .card {
  1825. padding: 10px 16px;
  1826. box-sizing: border-box;
  1827. .title {
  1828. font-size: 15px;
  1829. font-weight: bold;
  1830. color: #333;
  1831. line-height: 22px;
  1832. padding-right: 72px;
  1833. /*word-break: break-all;*/
  1834. .JPABC {
  1835. width: 20px;
  1836. position: relative;
  1837. top: 4px;
  1838. margin-right: 3px;
  1839. }
  1840. .statusIcon {
  1841. padding: 3px;
  1842. font-size: 12px;
  1843. margin: 0 3px;
  1844. color: #fff;
  1845. display: inline-block;
  1846. height: 20px;
  1847. line-height: 16px;
  1848. vertical-align: -1px;
  1849. }
  1850. .submit {
  1851. background: #ffba13;
  1852. }
  1853. .noSubmit {
  1854. background: #f11818;
  1855. }
  1856. }
  1857. .info {
  1858. font-size: 14px;
  1859. color: #909090;
  1860. line-height: 26px;
  1861. }
  1862. }
  1863. .navBarTOP {
  1864. position: fixed;
  1865. width: 100%;
  1866. z-index: 2;
  1867. top: 0;
  1868. }
  1869. .cellcontent .centerBtn {
  1870. margin: 0 auto 10px;
  1871. display: block;
  1872. width: 92%;
  1873. border-radius: 5px;
  1874. color: #0057ba;
  1875. border: 1px solid #0057ba;
  1876. }
  1877. .cellcontent .centerBtn1 {
  1878. background-color: #0057ba;
  1879. color: #fff;
  1880. }
  1881. .btnbox {
  1882. padding-top: 14px;
  1883. border-top: 1px solid #eee;
  1884. margin: 0 10px;
  1885. }
  1886. .cellcontent .centerBtn2 {
  1887. margin: 0 auto 10px;
  1888. display: block;
  1889. width: 92%;
  1890. color: #0057ba;
  1891. border-radius: 5px;
  1892. padding: 0;
  1893. }
  1894. .statstext {
  1895. background-color: #0057ba;
  1896. position: absolute;
  1897. right: 0;
  1898. top: 6px;
  1899. padding: 2px 6px 2px 12px;
  1900. border-bottom-left-radius: 60px;
  1901. border-top-left-radius: 60px;
  1902. color: #fff;
  1903. }
  1904. .lineGrey {
  1905. height: 10px;
  1906. width: 100%;
  1907. background: #f1f1f1;
  1908. }
  1909. .cellcontent .van-cell {
  1910. padding: 10px 0;
  1911. }
  1912. .statstext .van-icon__image {
  1913. height: 0.7em;
  1914. }
  1915. .statstextIcon {
  1916. width: 121px;
  1917. position: absolute;
  1918. left: -62px;
  1919. top: 31px;
  1920. border-radius: 15px 0 0 15px;
  1921. }
  1922. .visitStoreIco {
  1923. float: left;
  1924. float: left;
  1925. width: 26px;
  1926. text-align: center;
  1927. background-color: #ffba13;
  1928. color: #fff;
  1929. border-radius: 100%;
  1930. margin-left: 14px;
  1931. line-height: 26px;
  1932. height: 26px;
  1933. }
  1934. .tipsTitle {
  1935. padding: 5px 0;
  1936. text-align: center;
  1937. font-size: 16px;
  1938. font-weight: 600;
  1939. }
  1940. .deviceWithin {
  1941. height: 100%;
  1942. width: 100%;
  1943. display: flex;
  1944. flex-direction: column;
  1945. overflow: hidden;
  1946. .content {
  1947. flex: 1;
  1948. overflow-y: auto;
  1949. }
  1950. .tabBar {
  1951. height: 50px;
  1952. }
  1953. .JPVisitNum {
  1954. position: relative;
  1955. top: -26px;
  1956. font-size: 10px;
  1957. }
  1958. .TCFXListItem {
  1959. display: inline-block;
  1960. border: 1px solid #ccc;
  1961. padding: 3px 5px;
  1962. margin: 0 5px;
  1963. border-radius: 6px;
  1964. }
  1965. }
  1966. </style>