index.vue 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564
  1. <template>
  2. <div class="bgcolor">
  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. @clear="clearFn">
  17. <template #action>
  18. <div @click="onSearchm">搜索</div>
  19. </template>
  20. </van-search>
  21. </div>
  22. <van-tabs class="myTab" type="card" v-model="tabVal" color="#0057ba" @change="tabChange">
  23. <van-tab title="销售部" name="0" :disabled="disabled"></van-tab>
  24. <van-tab title="我的" name="1" :disabled="disabled"></van-tab>
  25. </van-tabs>
  26. </div>
  27. <!-- 主体内容-->
  28. <div class="container" style="margin-top: 144px">
  29. <van-list
  30. class="myList"
  31. v-model="loading"
  32. :finished="finished"
  33. finished-text="--已经到底了--"
  34. @load="onLoad">
  35. <div class="cellcontent" v-for="(item, index) in list" :key="index">
  36. <van-cell>
  37. <div class="card">
  38. <div class="title titlero btn" :data-clipboard-text="item.storeCode">
  39. {{ item.storeName }}(<span style="color: #0057ba">{{ item.storeCode }}</span
  40. >)<van-icon
  41. :name="paste"
  42. color="#ee0a24"
  43. size="20"
  44. style="top: 6px; margin-left: 4px" />
  45. </div>
  46. <div class="info" style="position: relative">
  47. 联系人:{{ item.contactName }}
  48. <div style="position: absolute; bottom: 0px; right: 0px">
  49. <el-popover
  50. popper-class="zpover zpover6"
  51. placement="bottom-start"
  52. trigger="click">
  53. <div>
  54. <p>
  55. 本店{{ timeData }}下单SKU数:<a
  56. @click="linkList(item)"
  57. style="text-decoration: underline"
  58. >点击查看详情</a
  59. >
  60. </p>
  61. </div>
  62. <div
  63. class="visitStoreIco"
  64. v-if="item.storeLabels.zysslNums"
  65. style="background-color: #fff; position: relative"
  66. slot="reference">
  67. <p
  68. style="
  69. width: 100%;
  70. position: absolute;
  71. z-index: 1;
  72. top: 0.2px;
  73. width: 22px;
  74. margin: 0;
  75. margin-left: 3.6px;
  76. text-align: center;
  77. font-size: 12px;
  78. ">
  79. {{ item.storeLabels.zysslNums }}
  80. </p>
  81. <van-icon :name="ord" size="26" />
  82. </div>
  83. </el-popover>
  84. <el-popover
  85. popper-class="zpover zpover5"
  86. placement="bottom"
  87. width="200"
  88. trigger="click">
  89. <div v-if="item.storeLabels">
  90. <p>已参加:</p>
  91. <p v-for="tt in (item.storeLabels.targetOne + '').split(';')">
  92. {{ tt }}
  93. </p>
  94. </div>
  95. <div
  96. class="visitStoreIco"
  97. v-if="item.storeLabels.targetOne"
  98. style="background-color: #fff"
  99. slot="reference">
  100. <van-icon :name="targetOne" size="26" />
  101. </div>
  102. </el-popover>
  103. <el-popover
  104. popper-class="zpover"
  105. placement="bottom"
  106. width="200"
  107. trigger="click"
  108. content="金牌店调色机5天未联网">
  109. <div
  110. v-if="item.storeLabels.ccmOffline"
  111. class="visitStoreIco"
  112. style="background-color: #fff"
  113. slot="reference">
  114. <van-icon :name="Network" size="26" />
  115. </div>
  116. </el-popover>
  117. <el-popover
  118. popper-class="zpover"
  119. placement="bottom"
  120. width="200"
  121. trigger="click"
  122. content="同城店近60天未下单">
  123. <div
  124. v-if="item.storeLabels.fxNoOrder"
  125. class="visitStoreIco"
  126. style="background-color: #fff"
  127. slot="reference">
  128. <van-icon :name="order60" size="26" />
  129. </div>
  130. </el-popover>
  131. <el-popover
  132. popper-class="zpover"
  133. placement="bottom"
  134. width="200"
  135. trigger="click"
  136. content="金牌店近30天未下单">
  137. <div
  138. v-if="item.storeLabels.noOrder"
  139. class="visitStoreIco"
  140. style="background-color: #fff"
  141. slot="reference">
  142. <van-icon :name="order" size="26" />
  143. </div>
  144. </el-popover>
  145. <el-popover
  146. popper-class="zpover"
  147. placement="bottom"
  148. width="200"
  149. trigger="click"
  150. content="本店本月进过专业时时丽">
  151. <div
  152. class="visitStoreIco"
  153. v-if="item.storeLabels.zyssl"
  154. style="background-color: #ed5c68"
  155. slot="reference">
  156. </div>
  157. </el-popover>
  158. <el-popover
  159. popper-class="zpover zpover1"
  160. placement="bottom"
  161. width="200"
  162. trigger="click"
  163. content="本店本月进过超好贴">
  164. <div
  165. v-if="item.storeLabels.chtczj"
  166. class="visitStoreIco"
  167. style="background-color: #0057ba"
  168. slot="reference">
  169. </div>
  170. </el-popover>
  171. <el-popover
  172. placement="bottom"
  173. popper-class="zpover zpover1 zpover1sb"
  174. :disabled="!item.userVisitTimesMap"
  175. trigger="click">
  176. <div
  177. v-if="item.storeLabels.visitTimes && item.storeLabels.visitTimes > 0"
  178. class="visitStoreIco"
  179. slot="reference"
  180. style="background-color: #fff; position: relative">
  181. <p
  182. style="
  183. width: 100%;
  184. position: absolute;
  185. z-index: 10;
  186. top: -2px;
  187. margin: 0;
  188. text-align: center;
  189. font-size: 12px;
  190. ">
  191. {{ item.storeLabels.visitTimes }}
  192. </p>
  193. <van-icon :name="ordernum" size="26" />
  194. </div>
  195. <el-table :data="item.userVisitTimesMap" border max-height="180px">
  196. <el-table-column label="业务员" prop="userName" />
  197. <el-table-column label="拜访次数" prop="visitTimes" width="110px" />
  198. </el-table>
  199. </el-popover>
  200. </div>
  201. </div>
  202. <div class="info">
  203. 类型:{{ item.storeCategory }}&nbsp;
  204. <el-popover popper-class="zpover zpover6" placement="bottom-start" trigger="click">
  205. <div>
  206. <p>
  207. 本店经营品项指导:
  208. <a @click="linkimg(item)" style="text-decoration: underline">点击查看</a>
  209. </p>
  210. </div>
  211. <van-icon name="question-o" size="18" slot="reference" />
  212. </el-popover>
  213. </div>
  214. <div class="info" v-if="item.telephone" @click="buryingPointFn(item)">
  215. 联系电话:<a
  216. style="color: #0057ba; font-weight: bold; text-decoration: underline"
  217. :href="'tel:' + item.telephone"
  218. >{{ item.telephone }}<van-icon name="phone"
  219. /></a>
  220. </div>
  221. <div class="info">
  222. 地址:{{ item.addressLine }}
  223. <img v-if="item.lon" style="width: 36px" :src="sbpmdh" @click="linkapp(item)" />
  224. </div>
  225. <div class="info" v-if="typeShow">经销商:{{ item.chainName }}</div>
  226. <div class="info">距离:{{ Micrometer(item.distance) }}m</div>
  227. </div>
  228. <div
  229. class="statstext"
  230. v-if="item.stateString == '未拜访'"
  231. style="background-color: #ed5c68">
  232. 未拜访
  233. </div>
  234. <div
  235. class="statstext"
  236. v-if="item.stateString == '拜访中'"
  237. style="background-color: white">
  238. <van-icon :name="times" color="#ee0a24" size="32" />
  239. </div>
  240. <div class="statstext" v-if="item.stateString == '已拜访'">已拜访</div>
  241. <div class="btnbox">
  242. <van-row>
  243. <van-col
  244. span="5"
  245. v-if="item.stateString != '已拜访' && customerVisits"
  246. @click="storeVisit(item)">
  247. <img :src="call" style="margin: 0 auto; height: 18px; display: block" />
  248. <p style="text-align: center; margin: 0; font-size: 12px">进入拜访</p>
  249. </van-col>
  250. <van-col
  251. span="5"
  252. v-if="item.storeCategory == '公装经销商'"
  253. @click="projectOutVisit(item)">
  254. <img :src="xmgj" style="margin: 0 auto; height: 18px; display: block" />
  255. <p style="text-align: center; margin: 0; font-size: 12px">项目跟进</p>
  256. </van-col>
  257. <van-col
  258. span="5"
  259. v-if="
  260. item.stateString != '已拜访' &&
  261. item.storeCategory != '公装经销商' &&
  262. customerVisits
  263. "
  264. @click="abnormalVisit(item)">
  265. <img :src="yichang" style="margin: 0 auto; height: 18px; display: block" />
  266. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 12px">
  267. 异常拜访
  268. </p>
  269. </van-col>
  270. <van-col span="4" v-if="item.showOrderButton" @click="orderFn(item)">
  271. <img :src="xiadan" style="margin: 0 auto; height: 18px; display: block" />
  272. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 12px">
  273. 去下单
  274. </p>
  275. </van-col>
  276. <van-col span="5" v-if="item.stateString == '已拜访'" @click="Visit(item)">
  277. <img :src="bfxx" style="margin: 0 auto; height: 18px; display: block" />
  278. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 12px">
  279. 拜访信息
  280. </p>
  281. </van-col>
  282. <van-col span="5" @click="visitFn(item)">
  283. <img :src="kehuxinxi" style="margin: 0 auto; width: 18px; display: block" />
  284. <p style="text-align: center; margin: 0; margin-top: 1px; font-size: 12px">
  285. 客户信息
  286. </p>
  287. </van-col>
  288. <van-col span="5" v-if="tabVal == 1" @click="storeJoinVisit(item)">
  289. <img :src="jiarujihua" style="margin: 0 auto; height: 18px; display: block" />
  290. <p style="text-align: center; margin: 0; font-size: 12px">加入计划内</p>
  291. </van-col>
  292. </van-row>
  293. </div>
  294. </van-cell>
  295. <div class="lineGrey"></div>
  296. </div>
  297. <van-empty v-if="list.length == 0" />
  298. </van-list>
  299. <br />
  300. <br />
  301. <br />
  302. <br />
  303. <br />
  304. </div>
  305. <van-popup v-model="showPicker" position="bottom" class="textsize">
  306. <van-row
  307. style="
  308. position: fixed;
  309. top: 0;
  310. width: 100%;
  311. z-index: 998;
  312. background-color: #fff;
  313. border-bottom: 1px solid #ccc;
  314. ">
  315. <van-col span="3" style="text-align: center; margin: 14px 0" @click="showPicker = false">
  316. <van-icon name="cross" size="20" color="#909399" />
  317. </van-col>
  318. <van-col span="13"> </van-col>
  319. <van-col span="4" style="text-align: center; line-height: 36px" @click="onConfirm">
  320. <div style="color: #0057ba">
  321. <van-button type="info" size="small" color="#0057ba">筛选</van-button>
  322. </div></van-col
  323. >
  324. <van-col span="4" style="text-align: center; line-height: 36px" @click="onsets">
  325. <van-button type="default" size="small" style="height: 28px">重置</van-button>
  326. </van-col>
  327. </van-row>
  328. <div style="height: 48px; width: 100%"></div>
  329. <div class="searchcheck">
  330. <p class="searchchecktitle">&nbsp;经销商</p>
  331. <van-row>
  332. <van-col span="24">
  333. <div @click="moreTypeShowFn">
  334. <van-field
  335. style="
  336. margin-top: -6px;
  337. border-radius: 6px;
  338. border: 1px solid #ccc;
  339. overflow: hidden;
  340. "
  341. readonly
  342. v-model="chainName"
  343. label=""
  344. placeholder="请选择经销商" />
  345. </div>
  346. </van-col>
  347. </van-row>
  348. <p class="searchchecktitle" @click="otherbqShow = !otherbqShow">
  349. &nbsp;门店标签<van-icon name="arrow-down" style="float: right" />
  350. </p>
  351. <van-checkbox-group v-model="storeLabelTypes" direction="horizontal">
  352. <div v-if="otherbqShow" style="width: 100%">
  353. <div class="checkbox" v-for="(item, index) in StoreLabels" :key="index">
  354. <van-checkbox :name="item.dictValue">{{ item.dictLabel }}</van-checkbox>
  355. </div>
  356. <div style="height: 2px; background-color: #f5f5f5; width: 100%; clear: both"></div>
  357. </div>
  358. </van-checkbox-group>
  359. <van-checkbox-group v-model="result" direction="horizontal">
  360. <p class="searchchecktitle" @click="otherkkdShow = !otherkkdShow">
  361. &nbsp;可控店<van-icon name="arrow-down" style="float: right" />
  362. </p>
  363. <div v-if="otherkkdShow">
  364. <div v-for="(item, index) in storeTypeLists" :key="index" class="checkbox1">
  365. <div v-if="item.groupType == 'kkd'" class="child">
  366. <van-checkbox :name="item.dictValue">{{ item.dictLabel }}</van-checkbox>
  367. </div>
  368. </div>
  369. </div>
  370. <div style="height: 2px; background-color: #f5f5f5; width: 100%; clear: both"></div>
  371. <p class="searchchecktitle" @click="otherfxdShow = !otherfxdShow">
  372. &nbsp;分销店<van-icon name="arrow-down" style="float: right" />
  373. </p>
  374. <div v-if="otherfxdShow" style="margin: 0 14px; width: 100%">
  375. <div style="height: 2px; background-color: #f5f5f5; width: 100%; clear: both"></div>
  376. <p class="searchchecktitle1" @click="otherfxdShow1 = !otherfxdShow1">
  377. 金牌店<van-icon name="arrow-down" style="float: right" />
  378. </p>
  379. <div v-if="otherfxdShow1">
  380. <div v-for="(item1, index1) in storeTypeLists" :key="200 + index1" class="checkbox1">
  381. <div v-if="item1.groupType == 'fxd' && item1.remark == 'jp'" class="child">
  382. <van-checkbox :name="item1.dictValue">{{ item1.dictLabel }}</van-checkbox>
  383. </div>
  384. </div>
  385. <div style="height: 2px; background-color: #f5f5f5; width: 100%; clear: both"></div>
  386. </div>
  387. <p class="searchchecktitle1" @click="otherfxdShow2 = !otherfxdShow2">
  388. 同城分销店<van-icon name="arrow-down" style="float: right" />
  389. </p>
  390. <div v-if="otherfxdShow2">
  391. <div
  392. v-for="(itemlj, indexlj) in storeTypeLists"
  393. :key="400 + indexlj"
  394. class="checkbox1">
  395. <div v-if="itemlj.groupType == 'fxd' && itemlj.remark == 'tcfx'" class="child">
  396. <van-checkbox :name="itemlj.dictValue">{{ itemlj.dictLabel }}</van-checkbox>
  397. </div>
  398. </div>
  399. <div style="clear: both"></div>
  400. </div>
  401. </div>
  402. <div style="height: 2px; background-color: #f5f5f5; width: 100%; clear: both"></div>
  403. <p class="searchchecktitle" @click="otherShow = !otherShow">
  404. &nbsp;其他 <van-icon name="arrow-down" style="float: right" />
  405. </p>
  406. <div v-if="otherShow">
  407. <div v-for="(item2, index2) in storeTypeLists" :key="100 + index2" class="checkbox1">
  408. <div v-if="item2.groupType == 'other'" class="child">
  409. <van-checkbox :name="item2.dictValue">{{ item2.dictLabel }}</van-checkbox>
  410. </div>
  411. </div>
  412. </div>
  413. </van-checkbox-group>
  414. </div>
  415. </van-popup>
  416. <van-popup v-model="moreTypeShow" position="bottom" style="height: 80%">
  417. <van-row style="background-color: #f5f5f5">
  418. <van-col span="20">
  419. <van-field
  420. left-icon="search"
  421. style="margin-top: 2px; border-radius: 6px; overflow: hidden"
  422. v-model="CustomerName"
  423. label=""
  424. placeholder="请输入关键词"
  425. clearable />
  426. </van-col>
  427. <van-col span="4" style="text-align: center; line-height: 48px" @click="getCustomer">
  428. <div style="background-color: #0057ba; color: #fff">搜索</div></van-col
  429. >
  430. </van-row>
  431. <van-picker
  432. show-toolbar
  433. :columns="chainsData"
  434. value-key="chainName"
  435. @confirm="onConfirmChainsList"
  436. @cancel="moreTypeShow = false"
  437. visible-item-count="10" />
  438. </van-popup>
  439. <tab-bar tabBarActive="outsidelist"></tab-bar>
  440. <div class="positionContent" @click="rangeStoreFn()" v-if="mapShows">
  441. <van-icon class="img" :name="mpimg" size="50" />
  442. </div>
  443. </div>
  444. </template>
  445. <script>
  446. import tabBar from '@/components/tabBar';
  447. import {
  448. getUserOutPlaList,
  449. getUserOrgStoreList,
  450. stopVisit,
  451. checkVisit,
  452. addVisitsPosition,
  453. mobileReposition,
  454. getStoreyslTypeList,
  455. getStoreTypeListlp,
  456. joinInPlan,
  457. getStoreLabels,
  458. getCustomerList,
  459. buryingPoint,
  460. ProductItemImge,
  461. } from '@/api/index';
  462. import times from '@/assets/Icon/times.png';
  463. import order60 from '@/assets/order60.png';
  464. import targetOne from '@/assets/targetOne.png';
  465. import Network from '@/assets/Network.png';
  466. import ord from '@/assets/ord.png';
  467. import timeico from '@/assets/Icon/datatims.png';
  468. import location from '@/assets/location.png';
  469. import paste from '@/assets/paste.png';
  470. import visitTimes from '@/assets/visitTimes.png';
  471. import mpimg from '@/assets/mpimg.png';
  472. import axios from 'axios';
  473. import mapmarker from '@/components/mapMarkerDouble';
  474. import order from '@/assets/order.png';
  475. import ordernum from '@/assets/ordernum.png';
  476. import sbpmdh from '@/assets/sbpmdh.png';
  477. import request from '@/utils/request';
  478. import call from '@/assets/call.png';
  479. import jiarujihua from '@/assets/jiarujihua.png';
  480. import kehuxinxi from '@/assets/kehuxinxi-2.png';
  481. import xiadan from '@/assets/xiadan.png';
  482. import yichang from '@/assets/yichang.png';
  483. import bfxx from '@/assets/bfxx.png';
  484. import xmgj from '@/assets/xmgj.png';
  485. import { getOrderUrlByStoreId } from '@/api/inventory';
  486. import { checkStoreAddressByStoreCode } from '@/api/visitstore';
  487. export default {
  488. name: 'outsidelist',
  489. components: { tabBar, mapmarker },
  490. data() {
  491. return {
  492. yichang: yichang,
  493. xmgj: xmgj,
  494. bfxx: bfxx,
  495. xiadan: xiadan,
  496. kehuxinxi: kehuxinxi,
  497. jiarujihua: jiarujihua,
  498. call: call,
  499. times: times,
  500. searchShows: false,
  501. paste: paste,
  502. visitTimess: visitTimes,
  503. sbpmdh: sbpmdh,
  504. ordernum: ordernum,
  505. typeShow: false,
  506. mpimg: mpimg,
  507. order: order,
  508. ord: ord,
  509. mapShow: false,
  510. otherShow: false,
  511. Network: Network,
  512. order60: order60,
  513. targetOne: targetOne,
  514. chainName: '',
  515. chainCode: '',
  516. mapShows: false,
  517. activeNames: '1',
  518. showPopover: false,
  519. moreTypeShow: false,
  520. showPopoverVNUM: [],
  521. showPopoverC: [],
  522. showPopoverZ: [],
  523. zyssl: [],
  524. chtczj: [],
  525. noVisit: [],
  526. noOrder: [],
  527. fxNoOrder: [],
  528. storeLabelTypes: [],
  529. // showPopover:false,
  530. location: location,
  531. timeico: timeico,
  532. disabled: false,
  533. timer: null,
  534. flag: true,
  535. show: false,
  536. tabVal: '1',
  537. list: [],
  538. cont: 0,
  539. loading: false,
  540. showPicker: false,
  541. finished: false,
  542. otherbqShow: true,
  543. otherkkdShow: true,
  544. otherfxdShow: true,
  545. otherfxdShow2: true,
  546. otherfxdShow1: true,
  547. typeName: '搜索',
  548. visitEndId: '',
  549. pageSize: 12,
  550. pageNum: 1,
  551. listActive: null,
  552. query: '',
  553. storeName: '',
  554. genDate: '',
  555. storeType: '',
  556. endShow: false,
  557. storeCategory: '',
  558. fromValue: {},
  559. storeTypeList: [],
  560. storeTypeLists: [],
  561. chainsData: [],
  562. serachstype: '',
  563. addShow1: false,
  564. storeCategoryList: '',
  565. result: [],
  566. StoreLabels: [],
  567. CustomerName: '',
  568. lat: '',
  569. lon: '',
  570. timeData: '',
  571. customerVisits: true,
  572. };
  573. },
  574. watch: {
  575. $route(to, from) {
  576. this.storeName = localStorage.getItem('outvstoreName');
  577. this.chainName = localStorage.getItem('outvchainName');
  578. if (localStorage.getItem('lat') != null) {
  579. this.lat = localStorage.getItem('lat');
  580. this.lon = localStorage.getItem('lon');
  581. } else {
  582. this.lat = '';
  583. this.lon = '';
  584. }
  585. if (localStorage.getItem('outvstoreLabelTypes') != null) {
  586. this.storeLabelTypes = localStorage.getItem('outvstoreLabelTypes').split(',');
  587. } else {
  588. this.storeLabelTypes = [];
  589. }
  590. if (localStorage.getItem('outvstoreCategoryList') != null) {
  591. this.result = localStorage.getItem('outvstoreCategoryList').split(',');
  592. this.storeLabelTypes = [];
  593. this.storeCategoryList = this.result.join(',');
  594. } else {
  595. this.result = [];
  596. this.storeCategoryList = this.result.join(',');
  597. }
  598. this.chainCode = localStorage.getItem('outvchainCode');
  599. this.storeName = localStorage.getItem('outvstoreName');
  600. if (
  601. (from.path == '/My/index' && to.path == '/outsidelist/index') ||
  602. (from.path == '/home' && to.path == '/outsidelist/index') ||
  603. (from.path == '/deviceWithin/index' && to.path == '/outsidelist/index') ||
  604. (from.path == '/storemanagement/index' && to.path == '/outsidelist/index')
  605. ) {
  606. this.tabVal = '1';
  607. } else {
  608. if (localStorage.getItem('tabVal') != null) {
  609. this.tabVal = localStorage.getItem('tabVal');
  610. }
  611. }
  612. if (
  613. (from.path == '/storeDetail' && to.path == '/outsidelist/index') ||
  614. (from.path == '/storeGroup' && to.path == '/outsidelist/index') ||
  615. (from.path == '/suishenbangOutstoreVisit' && to.path == '/outsidelist/index') ||
  616. (from.path == '/outabnormalVisit' && to.path == '/outsidelist/index') ||
  617. (from.path == '/home' && to.path == '/outsidelist/index') ||
  618. (from.path == '/deviceWithin/index' && to.path == '/outsidelist/index') ||
  619. (from.path == '/storemanagement/index' && to.path == '/outsidelist/index') ||
  620. (from.path == '/My/index' && to.path == '/outsidelist/index')
  621. ) {
  622. this.onSearch();
  623. }
  624. var postType = localStorage.getItem('postType');
  625. if (postType == 'GZ') {
  626. this.addShow1 = false;
  627. this.otherShow = true;
  628. } else {
  629. this.addShow1 = true;
  630. this.otherShow = false;
  631. }
  632. if (localStorage.getItem('postType') == 'JZ' || localStorage.getItem('postType') == 'GZ') {
  633. this.mapShows = false;
  634. } else {
  635. this.mapShows = true;
  636. }
  637. this.getMonth();
  638. },
  639. },
  640. created() {
  641. this.storeName = localStorage.getItem('outvstoreName');
  642. this.chainName = localStorage.getItem('outvchainName');
  643. if (localStorage.getItem('outvstoreLabelTypes') != null) {
  644. this.storeLabelTypes = localStorage.getItem('outvstoreLabelTypes').split(',');
  645. } else {
  646. this.storeLabelTypes = [];
  647. }
  648. if (localStorage.getItem('outvstoreCategoryList') != null) {
  649. this.result = localStorage.getItem('outvstoreCategoryList').split(',');
  650. this.storeCategoryList = this.result.join(',');
  651. } else {
  652. this.result = [];
  653. this.storeCategoryList = this.result.join(',');
  654. }
  655. this.chainCode = localStorage.getItem('outvchainCode');
  656. this.storeName = localStorage.getItem('outvstoreName');
  657. if (localStorage.getItem('tabVal') == null || this.$route.query.info != 'y') {
  658. if (this.$route.query.info != undefined) {
  659. if (this.$route.query.info.indexOf('y') != -1) {
  660. this.tabVal = localStorage.getItem('tabVal');
  661. } else {
  662. this.tabVal = '1';
  663. }
  664. } else {
  665. this.tabVal = '1';
  666. }
  667. } else {
  668. this.tabVal = localStorage.getItem('tabVal');
  669. }
  670. if (localStorage.getItem('postType') == 'JZ' || localStorage.getItem('postType') == 'GZ') {
  671. this.mapShows = false;
  672. } else {
  673. this.mapShows = true;
  674. }
  675. this.query = this.$route.query;
  676. localStorage.removeItem('visitId');
  677. this.getStoreTypeList();
  678. this.getStoreLabels();
  679. var postType = localStorage.getItem('postType');
  680. if (postType == 'GZ') {
  681. this.addShow1 = false;
  682. this.otherShow = true;
  683. } else {
  684. this.addShow1 = true;
  685. this.otherShow = false;
  686. }
  687. this.getMonth();
  688. },
  689. methods: {
  690. clearFn() {
  691. this.storeName = '';
  692. localStorage.setItem('outvstoreName', '');
  693. },
  694. linkapp(val) {
  695. var poind = this.gcj02BD(val.lat, val.lon);
  696. let url = window.location.href;
  697. let that = this;
  698. let wx = this.wx;
  699. let qiyeData;
  700. const instance = axios.create();
  701. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  702. instance
  703. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  704. params: {
  705. url: url,
  706. agent: 1,
  707. },
  708. })
  709. .then((response) => {
  710. if (response.status == 200) {
  711. qiyeData = response.data.data;
  712. // wx.config({
  713. // beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  714. // debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  715. // appId: qiyeData.appId, // 必填,企业微信的corpID
  716. // timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  717. // nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  718. // signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  719. // jsApiList: ["ready", "invoke"]
  720. // });
  721. // wx.ready(function() {
  722. // wx.checkJsApi({
  723. // jsApiList: ["agentConfig", "launchMiniprogram"], // 需要检测的JS接口列表
  724. // success: function(res) {}})})
  725. wx.agentConfig({
  726. corpid: qiyeData.appId, // 必填,企业微信的corpid,必须与当前登录的企业一致
  727. agentid: qiyeData.agentId, // 必填,企业微信的应用id (e.g. 1000247)
  728. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  729. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  730. signature: qiyeData.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
  731. jsApiList: ['launchMiniprogram'], //必填,传入需要使用的接口名称
  732. success: function (res) {
  733. wx.invoke(
  734. 'launchMiniprogram',
  735. {
  736. appid: 'wx238bbb5f6d958414',
  737. path:
  738. 'pages/relayStation/relayStation?latitude=' +
  739. poind.lat +
  740. '&longitude=' +
  741. poind.lon +
  742. '&name=' +
  743. val.addressLine,
  744. },
  745. function (res) {
  746. if (res.err_msg == 'launchMiniprogram:ok') {
  747. } else {
  748. }
  749. }
  750. );
  751. },
  752. fail: function (res) {
  753. if (res.errMsg.indexOf('function not exist') > -1) {
  754. alert('版本过低请升级');
  755. }
  756. },
  757. });
  758. }
  759. });
  760. },
  761. orderFn(val) {
  762. getOrderUrlByStoreId({
  763. storeId: val.storeId,
  764. from: 'outPlan',
  765. }).then((res) => {
  766. if (res.code == 200 && res.data) {
  767. window.location.href = res.data;
  768. } else {
  769. this.Toast({
  770. message: res.msg,
  771. duration: 5000,
  772. });
  773. }
  774. });
  775. },
  776. linkList(val) {
  777. this.$router.push({
  778. path: '/pItem',
  779. query: { id: val.storeCode, detilId: 'a' },
  780. });
  781. },
  782. linkimg(val) {
  783. ProductItemImge({ storeId: val.storeId }).then((response) => {
  784. if (response.code == 200) {
  785. if (response.data != undefined) {
  786. window.open(response.data);
  787. } else {
  788. this.$toast(response.msg);
  789. }
  790. } else {
  791. this.$toast(res.msg);
  792. }
  793. });
  794. },
  795. getMonth() {
  796. // 获取当前日期
  797. var currentDate = new Date();
  798. // 获取当前月份
  799. var currentMonth = currentDate.getMonth();
  800. // 获取当前年份
  801. // var currentYear = currentDate.getFullYear();
  802. var previousMonthDate1 = new Date();
  803. if (currentDate.getDate() == 1) {
  804. previousMonthDate1.setMonth(currentMonth - 1);
  805. } else {
  806. }
  807. var previousMonth1 = previousMonthDate1.getMonth();
  808. var previousYear1 = previousMonthDate1.getFullYear();
  809. // 计算前三个月的年份和月份
  810. var previousMonthDate = new Date();
  811. if (currentDate.getDate() == 1) {
  812. previousMonthDate.setMonth(currentMonth - 3);
  813. } else {
  814. previousMonthDate.setMonth(currentMonth - 2);
  815. }
  816. 1;
  817. var previousMonth = previousMonthDate.getMonth();
  818. var previousYear = previousMonthDate.getFullYear();
  819. //前三个月
  820. if (previousYear1 == previousYear) {
  821. var formattedPreviousMonth1 = previousYear1 + '-' + (previousMonth1 + 1);
  822. // 格式化年份和月份
  823. var formattedPreviousMonth = previousYear + '-' + (previousMonth + 1);
  824. this.timeData =
  825. formattedPreviousMonth.split('-')[1] + '-' + formattedPreviousMonth1.split('-')[1] + '月';
  826. } else {
  827. var formattedPreviousMonth1 = previousYear1 + '年' + (previousMonth1 + 1) + '月';
  828. // .toString().padStart(2, '0');
  829. // 格式化年份和月份
  830. var formattedPreviousMonth = previousYear + '年' + (previousMonth + 1) + '月';
  831. this.timeData = formattedPreviousMonth + '-' + formattedPreviousMonth1;
  832. }
  833. },
  834. moreTypeShowFn() {
  835. this.moreTypeShow = true;
  836. // this.CustomerName=""
  837. // this.chainsData=[]
  838. this.getCustomer();
  839. },
  840. buryingPoint(val) {
  841. buryingPoint(val);
  842. },
  843. getCustomer() {
  844. var name = '';
  845. if (this.tabVal != 1) {
  846. name = 'org';
  847. } else {
  848. name = 'my';
  849. }
  850. getCustomerList({ name: this.CustomerName, from: name }).then((request) => {
  851. this.chainsData = request.data;
  852. this.chainsData.push({});
  853. this.chainsData.pop();
  854. });
  855. },
  856. onConfirmChainsList(value) {
  857. if (value.chainName != undefined) {
  858. this.chainName = value.chainName;
  859. this.chainCode = value.chainCode;
  860. }
  861. this.showPickerChainsList = false;
  862. this.moreTypeShow = false;
  863. },
  864. getStoreLabels() {
  865. getStoreLabels().then((res) => {
  866. this.StoreLabels = res.data;
  867. });
  868. },
  869. searchType(val) {
  870. this.storeTypeLists = [];
  871. if (val != '') {
  872. let filterArr = this.storeTypeList.filter((item) => {
  873. return item.dictLabel.toLowerCase().includes(val.toLowerCase());
  874. });
  875. this.storeTypeLists = filterArr;
  876. } else {
  877. this.storeTypeLists = this.storeTypeList;
  878. }
  879. },
  880. onConfirm(value) {
  881. this.storeCategoryList = this.result.join(',');
  882. // this.typeName=value.dictLabel
  883. this.showPicker = false;
  884. this.onSearchm();
  885. },
  886. moreTypeShowclearableFn() {
  887. this.chainName = '';
  888. this.chainCode = '';
  889. this.chainsData = [];
  890. },
  891. onsets() {
  892. this.result = [];
  893. this.zyssl = [];
  894. this.chtczj = [];
  895. this.noVisit = [];
  896. this.noOrder = [];
  897. this.fxNoOrder = [];
  898. this.storeLabelTypes = [];
  899. this.storeCategoryList = this.result.join(',');
  900. this.chainName = '';
  901. this.chainCode = '';
  902. // this.typeName=value.dictLabel
  903. this.onSearch();
  904. },
  905. getStoreTypeList() {
  906. getStoreTypeListlp({}).then((res) => {
  907. this.storeTypeLists = res.data;
  908. this.storeTypeList = res.data;
  909. });
  910. },
  911. buryingPointFn(val) {
  912. this.buryingPoint({
  913. systemModel: '计划外',
  914. buryingPointType: 1,
  915. buryingPointValue: val.telephone,
  916. buryingPointName: '点击电话',
  917. buryingPointPosition: val.storeName + '(' + val.storeCode + ')',
  918. });
  919. },
  920. // 范围
  921. rangeStoreFn() {
  922. localStorage.setItem('tabVal', this.tabVal);
  923. let loading1 = this.$toast.loading({
  924. duration: 0,
  925. message: '加载中...',
  926. forbidClick: true,
  927. });
  928. let url = window.location.href;
  929. let wx = this.wx;
  930. var that = this;
  931. // that.$router.push({path: "/rangeStore", query: {
  932. // lon:"112.45359397440227",
  933. // lat:"34.62171814576471",
  934. // tabVal:that.tabVal
  935. // }
  936. // })
  937. let qiyeData;
  938. const instance = axios.create();
  939. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  940. instance
  941. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  942. params: {
  943. url: url,
  944. },
  945. })
  946. .then((response) => {
  947. if (response.status == 200) {
  948. this.cont = 5;
  949. var flat = true;
  950. var times = setInterval(() => {
  951. this.cont--;
  952. if (this.cont == '0') {
  953. if (flat) {
  954. loading1.clear();
  955. clearInterval(times);
  956. that.$dialog.alert({
  957. message: '定位失败,请开启企微定位权限',
  958. });
  959. } else {
  960. clearInterval(times);
  961. }
  962. }
  963. }, 1000);
  964. qiyeData = response.data.data;
  965. wx.config({
  966. beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  967. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  968. appId: qiyeData.appId, // 必填,企业微信的corpID
  969. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  970. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  971. signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  972. jsApiList: ['ready', 'getLocation'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
  973. });
  974. wx.ready(function () {
  975. wx.getLocation({
  976. type: 'gcj02',
  977. success: function (res) {
  978. flat = false;
  979. loading1.clear();
  980. var name = '我的';
  981. if (that.tabVal != 1) {
  982. name = '销售部';
  983. }
  984. that.buryingPoint({
  985. systemModel: '计划外',
  986. buryingPointType: 3,
  987. buryingPointValue: name,
  988. buryingPointName: '计划外',
  989. buryingPointPosition: '进入地图',
  990. });
  991. that.$router.push({
  992. path: '/rangeStore',
  993. query: {
  994. lat: '',
  995. lon: '',
  996. tabVal: that.tabVal,
  997. },
  998. });
  999. },
  1000. fail: function () {
  1001. loading1.clear();
  1002. that.$dialog.alert({
  1003. message: 'GPS未开启',
  1004. });
  1005. },
  1006. });
  1007. });
  1008. wx.error(function (res) {
  1009. loading1.clear();
  1010. that.$dialog.alert({
  1011. message: '定位失败,请开启企微定位权限',
  1012. });
  1013. });
  1014. }
  1015. });
  1016. },
  1017. //取消搜索
  1018. cancelSearch() {
  1019. this.$refs.item.toggle();
  1020. },
  1021. storeJoinVisit(val) {
  1022. joinInPlan({ storeId: val.storeId }).then((res) => {
  1023. if (res.code == 200) {
  1024. this.onSearch();
  1025. } else {
  1026. this.$dialog.alert({
  1027. title: '系统提示',
  1028. message: res.msg,
  1029. });
  1030. }
  1031. });
  1032. },
  1033. searchFn() {
  1034. this.showPicker = true;
  1035. this.CustomerName = '';
  1036. },
  1037. moreSearch() {
  1038. this.onSearch();
  1039. this.$refs.item.toggle();
  1040. },
  1041. getUserOrgStoreList() {
  1042. this.storeType = localStorage.getItem('storeType');
  1043. this.endShow = false;
  1044. if (this.refreshing) {
  1045. this.list = [];
  1046. this.refreshing = false;
  1047. }
  1048. var that = this;
  1049. this.disabled = true;
  1050. let loading2 = this.$toast.loading({
  1051. duration: 0,
  1052. message: '加载中...',
  1053. forbidClick: true,
  1054. });
  1055. getUserOrgStoreList({
  1056. lat: that.lat,
  1057. lon: that.lon,
  1058. chainCode: this.chainCode,
  1059. storeLabelTypes: this.storeLabelTypes.join(','),
  1060. pageNum: this.pageNum,
  1061. storeCategoryList: this.storeCategoryList,
  1062. pageSize: this.pageSize,
  1063. storeName: this.storeName.trim(),
  1064. genDate: this.genDate,
  1065. }).then((res) => {
  1066. this.disabled = false;
  1067. if (res.code == 200) {
  1068. loading2.clear();
  1069. this.loading = false;
  1070. if (this.pageNum == '1') {
  1071. this.list = [];
  1072. }
  1073. this.list = this.list.concat(res.rows);
  1074. if (this.list.length >= res.total) {
  1075. this.finished = true;
  1076. } else {
  1077. this.finished = false;
  1078. }
  1079. this.pageNum = this.pageNum + 1;
  1080. this.list.forEach((item) => {
  1081. if (item.stateString.indexOf('拜访中') != -1) {
  1082. this.endShow = true;
  1083. this.visitEndId = item.visitId;
  1084. return;
  1085. }
  1086. });
  1087. res.rows.forEach((item) => {
  1088. this.showPopoverVNUM.push({ showPopover: false });
  1089. this.showPopoverC.push({ showPopover: false });
  1090. this.showPopoverZ.push({ showPopover: false });
  1091. });
  1092. } else {
  1093. this.$toast(res.msg);
  1094. }
  1095. });
  1096. },
  1097. positionFn(val) {
  1098. // 本地开发 test 环境时 时跳过获取定位功能
  1099. if (process.env.NODE_ENV === 'test') {
  1100. this.lat = 34.62188103091605;
  1101. this.lon = 112.45364302095416;
  1102. localStorage.setItem('lat', this.lat);
  1103. localStorage.setItem('lon', this.lon);
  1104. if (this.tabVal == 1) {
  1105. this.getUserOutPlaListFun();
  1106. } else {
  1107. this.getUserOrgStoreList();
  1108. }
  1109. return;
  1110. }
  1111. var that = this;
  1112. let url = window.location.href;
  1113. let wx = this.wx;
  1114. let loadingmap = this.$toast.loading({
  1115. duration: 0,
  1116. message: '定位中...',
  1117. forbidClick: true,
  1118. });
  1119. let qiyeData;
  1120. const instance = axios.create();
  1121. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  1122. instance
  1123. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  1124. params: {
  1125. url: url,
  1126. },
  1127. })
  1128. .then((response) => {
  1129. console.log('url=' + url);
  1130. loadingmap.clear();
  1131. if (response.status == 200) {
  1132. this.cont = 5;
  1133. var flat = true;
  1134. var times = setInterval(() => {
  1135. this.cont--;
  1136. if (this.cont == '0') {
  1137. if (flat) {
  1138. clearInterval(times);
  1139. if (val == 1) {
  1140. that.$dialog.alert({
  1141. message: '定位失败,请开启企微定位权限',
  1142. });
  1143. }
  1144. loadingmap.clear();
  1145. } else {
  1146. clearInterval(times);
  1147. }
  1148. }
  1149. }, 1000);
  1150. qiyeData = response.data.data;
  1151. wx.config({
  1152. beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  1153. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  1154. appId: qiyeData.appId, // 必填,企业微信的corpID
  1155. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  1156. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  1157. signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  1158. jsApiList: ['ready', 'getLocation'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
  1159. });
  1160. wx.ready(function () {
  1161. wx.getLocation({
  1162. type: 'gcj02',
  1163. success: function (res) {
  1164. flat = false;
  1165. loadingmap.clear();
  1166. console.log('处理前');
  1167. console.log(res.latitude, res.longitude);
  1168. var location = that.CJ02BD(res.latitude, res.longitude);
  1169. console.log('处理后');
  1170. console.log(location);
  1171. that.lat = location.lat;
  1172. that.lon = location.lon;
  1173. localStorage.setItem('lat', location.lat);
  1174. localStorage.setItem('lon', location.lon);
  1175. if (val == 1) {
  1176. if (that.tabVal == 1) {
  1177. that.getUserOutPlaListFun();
  1178. } else {
  1179. that.getUserOrgStoreList();
  1180. }
  1181. } else {
  1182. that.getUserOutPlaListFun();
  1183. }
  1184. },
  1185. fail: function () {
  1186. loadingmap.clear();
  1187. if (val == 1) {
  1188. that.$dialog.alert({
  1189. message: 'GPS未开启',
  1190. });
  1191. }
  1192. },
  1193. });
  1194. });
  1195. wx.error(function (res) {
  1196. loadingmap.clear();
  1197. if (val == 1) {
  1198. that.$dialog.alert({
  1199. message: '定位失败,请开启企微定位权限',
  1200. });
  1201. }
  1202. });
  1203. }
  1204. });
  1205. },
  1206. getUserOutPlaListFun() {
  1207. this.storeType = localStorage.getItem('storeType');
  1208. var that = this;
  1209. this.disabled = true;
  1210. let loading3 = this.$toast.loading({
  1211. duration: 0,
  1212. message: '加载中...',
  1213. forbidClick: true,
  1214. });
  1215. this.endShow = false;
  1216. if (this.refreshing) {
  1217. this.list = [];
  1218. this.refreshing = false;
  1219. }
  1220. getUserOutPlaList({
  1221. lat: that.lat,
  1222. lon: that.lon,
  1223. chainCode: this.chainCode,
  1224. storeLabelTypes: this.storeLabelTypes.join(','),
  1225. pageNum: this.pageNum,
  1226. storeCategoryList: this.storeCategoryList,
  1227. pageSize: this.pageSize,
  1228. storeName: this.storeName.trim(),
  1229. genDate: this.genDate,
  1230. }).then((res) => {
  1231. this.disabled = false;
  1232. if (res.code == 200) {
  1233. loading3.clear();
  1234. this.loading = false;
  1235. this.list = this.list.concat(res.rows);
  1236. if (this.list.length >= res.total) {
  1237. this.finished = true;
  1238. } else {
  1239. this.finished = false;
  1240. }
  1241. this.pageNum = this.pageNum + 1;
  1242. this.list.forEach((item) => {
  1243. if (item.stateString.indexOf('拜访中') != -1) {
  1244. this.endShow = true;
  1245. this.visitEndId = item.visitId;
  1246. return;
  1247. }
  1248. });
  1249. res.rows.forEach(() => {
  1250. this.showPopoverVNUM.push({ showPopover: false });
  1251. this.showPopoverC.push({ showPopover: false });
  1252. this.showPopoverZ.push({ showPopover: false });
  1253. });
  1254. } else {
  1255. this.$toast(res.msg);
  1256. }
  1257. });
  1258. },
  1259. // 获取当前定位数据
  1260. getLocationFun() {
  1261. return new Promise((resolve, reject) => {
  1262. let url = window.location.href;
  1263. // let url = "https://ssbsfatest.nipponpaint.com.cn/mobile"
  1264. let wx = this.wx;
  1265. let qiyeData;
  1266. const instance = axios.create();
  1267. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  1268. instance
  1269. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  1270. params: {
  1271. url: url,
  1272. },
  1273. })
  1274. .then((response) => {
  1275. if (response.status == 200) {
  1276. this.cont = 5;
  1277. var flat = true;
  1278. var times = setInterval(() => {
  1279. this.cont--;
  1280. if (this.cont == '0') {
  1281. if (flat) {
  1282. clearInterval(times);
  1283. this.$dialog
  1284. .alert({
  1285. message: '定位失败,请开启企微定位权限',
  1286. })
  1287. .then(() => {});
  1288. } else {
  1289. clearInterval(times);
  1290. }
  1291. }
  1292. }, 1000);
  1293. qiyeData = response.data.data;
  1294. wx.config({
  1295. beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  1296. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  1297. appId: qiyeData.appId, // 必填,企业微信的corpID
  1298. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  1299. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  1300. signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  1301. jsApiList: ['ready', 'getLocation'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
  1302. });
  1303. wx.ready(() => {
  1304. wx.getLocation({
  1305. type: 'gcj02',
  1306. success: (res) => {
  1307. flat = false;
  1308. var location = this.CJ02BD(res.latitude, res.longitude);
  1309. resolve({ location, res });
  1310. },
  1311. fail: () => {
  1312. this.$dialog.alert({
  1313. message: 'GPS未开启',
  1314. });
  1315. reject('GPS未开启');
  1316. },
  1317. });
  1318. });
  1319. wx.error(() => {
  1320. this.$dialog
  1321. .alert({
  1322. message: '定位失败,请开启企微定位权限',
  1323. })
  1324. .then(() => {});
  1325. reject('定位失败,请开启企微定位权限');
  1326. });
  1327. }
  1328. });
  1329. });
  1330. },
  1331. storeVisit(val) {
  1332. localStorage.setItem('tabVal', this.tabVal);
  1333. localStorage.removeItem('visitId');
  1334. checkVisit({ storeId: val.storeId }).then((res) => {
  1335. if (this.tabVal == 1) {
  1336. this.buryingPoint({
  1337. systemModel: '计划外',
  1338. buryingPointType: 1,
  1339. buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  1340. buryingPointName: '进店拜访',
  1341. buryingPointPosition: '我的',
  1342. });
  1343. } else {
  1344. this.buryingPoint({
  1345. systemModel: '计划外',
  1346. buryingPointType: 1,
  1347. buryingPointValue: val.storeName + '(' + val.storeCode + ')',
  1348. buryingPointName: '进店拜访',
  1349. buryingPointPosition: '销售部',
  1350. });
  1351. }
  1352. if (res.code == 200 || val.stateString.indexOf('拜访中') != -1) {
  1353. if (localStorage.getItem('loginType') == 'cs') {
  1354. var lat = '';
  1355. var lon = '';
  1356. if (val.lat == '' || val.lat == null) {
  1357. lat = '31.2517820000';
  1358. lon = '120.5593090000';
  1359. } else {
  1360. lat = val.lat;
  1361. lon = val.lon;
  1362. }
  1363. this.$router.push({
  1364. path: '/suishenbangOutstoreVisit',
  1365. query: {
  1366. storeId: val.storeId,
  1367. rdId: val.rdId,
  1368. lat: lat,
  1369. lon: lon,
  1370. visitId: val.visitId,
  1371. pageType: 'out',
  1372. addressLine: val.addressLine,
  1373. storeCategory: val.storeCategory,
  1374. storeName: val.storeName,
  1375. hisTime: val.hisTime,
  1376. contactName: val.contactName,
  1377. storeCode: val.storeCode,
  1378. tabVal: this.tabVal,
  1379. visitModel: '1',
  1380. latNew: '31.2517820000',
  1381. lonNew: '120.5593090000',
  1382. PointSum: 0,
  1383. marklat: lat,
  1384. marklon: lon,
  1385. },
  1386. });
  1387. localStorage.setItem('startTime', new Date());
  1388. localStorage.setItem('ORGName', val.deptName);
  1389. localStorage.setItem('chainNameR', val.storeName);
  1390. } else {
  1391. if (this.flag) {
  1392. this.flag = false;
  1393. this.timer = null;
  1394. let that = this;
  1395. this.timer = setTimeout(() => {
  1396. this.flag = true;
  1397. }, 2000);
  1398. if (val.stateString.indexOf('拜访中') != -1 && val.visitSource == 1) {
  1399. localStorage.setItem('startTime', new Date());
  1400. localStorage.setItem('ORGName', val.deptName);
  1401. localStorage.setItem('chainNameR', val.storeName);
  1402. that.$router.push({
  1403. path: '/suishenbangOutstoreVisit',
  1404. query: {
  1405. storeId: val.storeId,
  1406. rdId: val.rdId,
  1407. lat: val.lat,
  1408. lon: val.lon,
  1409. visitId: val.visitId,
  1410. pageType: 'out',
  1411. addressLine: val.addressLine,
  1412. storeCategory: val.storeCategory,
  1413. storeName: val.storeName,
  1414. hisTime: val.hisTime,
  1415. contactName: val.contactName,
  1416. storeCode: val.storeCode,
  1417. tabVal: that.tabVal,
  1418. visitModel: '1',
  1419. latNew: val.lat,
  1420. lonNew: val.lon,
  1421. PointSum: '0',
  1422. marklat: val.lat,
  1423. marklon: val.lon,
  1424. },
  1425. });
  1426. } else {
  1427. // 本地开发 test 环境时 跳过获取定位功能
  1428. if (process.env.NODE_ENV === 'test') {
  1429. let res = {
  1430. latitude: 34.615684509277344,
  1431. longitude: 112.4474105834961,
  1432. };
  1433. this.lat = res.latitude;
  1434. this.lon = res.longitude;
  1435. localStorage.setItem('lat', this.lat);
  1436. localStorage.setItem('lon', this.lon);
  1437. var location = this.CJ02BD(res.latitude, res.longitude);
  1438. this.checkStoreAddressByStoreCodeFun(val, location, res);
  1439. } else {
  1440. let loading1 = this.$toast.loading({
  1441. duration: 0,
  1442. message: '加载中...',
  1443. forbidClick: true,
  1444. });
  1445. this.getLocationFun()
  1446. .then((resData) => {
  1447. loading1.clear();
  1448. let { location, res } = resData;
  1449. this.checkStoreAddressByStoreCodeFun(val, location, res);
  1450. })
  1451. .catch((err) => {
  1452. console.log(err);
  1453. loading1.clear();
  1454. });
  1455. }
  1456. }
  1457. }
  1458. }
  1459. } else {
  1460. this.$dialog.alert({
  1461. message: res.msg,
  1462. });
  1463. }
  1464. });
  1465. },
  1466. checkStoreAddressByStoreCodeFun(val, location, res) {
  1467. checkStoreAddressByStoreCode({
  1468. storeCode: val.storeCode,
  1469. lon: location.lon,
  1470. lat: location.lat,
  1471. }).then((response) => {
  1472. // loading1.clear();
  1473. if (val.lat == '' || val.lat == null) {
  1474. this.lat = location.lat;
  1475. this.lon = location.lon;
  1476. } else {
  1477. this.lat = val.lat;
  1478. this.lon = val.lon;
  1479. }
  1480. // let PointSum = this.twoPointSum(this.lat, this.lon, location.lat, location.lon).toFixed(2);
  1481. let PointSumval = this.twoPointSum(
  1482. location.lat,
  1483. location.lon,
  1484. location.lat,
  1485. location.lon
  1486. ).toFixed(2);
  1487. // GZ:工装店铺 直接进入拜访
  1488. if (localStorage.getItem('postType') == 'GZ') {
  1489. localStorage.setItem('startTime', new Date());
  1490. localStorage.setItem('ORGName', val.deptName);
  1491. localStorage.setItem('chainNameR', val.storeName);
  1492. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1493. return;
  1494. }
  1495. // 门店校验 地址不通过
  1496. if (response.code != 200) {
  1497. // updateAddress : ,1:同城AB+金牌,去修改地址;2:非金牌店铺,非同城店铺偏差过大不允许拜访,可以重置定位;0非金牌店铺,非同城店铺 位置信息不存在 可以继续拜访
  1498. if (response.data.updateAddress == 0) {
  1499. // 非金牌店铺,非同城店铺 位置信息不存在 可以继续拜访
  1500. this.$dialog
  1501. .confirm({
  1502. confirmButtonText: '确定拜访',
  1503. cancelButtonText: '取消拜访',
  1504. title: '系统提示',
  1505. message:
  1506. '该客户没有经纬度,此次拜访会保存定位点作为客户经纬度,下次拜访时判断是否偏差过大。',
  1507. closeOnClickOverlay: true,
  1508. })
  1509. .then(() => {
  1510. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1511. });
  1512. } else if (response.data.updateAddress == 1) {
  1513. // 同城AB+金牌,去修改地址
  1514. // addressUpdateTimesOver: true=已经达到最大次数,不让修改; false=没有达到可以修改
  1515. if (!response.data.addressUpdateTimesOver) {
  1516. this.$dialog
  1517. .confirm({
  1518. title: '系统提示',
  1519. message: response.msg + '请立即修改后再拜访',
  1520. messageAlign: 'left',
  1521. confirmButtonText: '立即修改',
  1522. cancelButtonText: '取消',
  1523. })
  1524. .then(() => {
  1525. this.$router.push({
  1526. path: '/storeDetail',
  1527. query: {
  1528. id: val.storeId,
  1529. type: 'address',
  1530. storeAddressId: val.storeAddressId,
  1531. },
  1532. });
  1533. });
  1534. } else {
  1535. this.$dialog.confirm({
  1536. title: '系统提示',
  1537. message: '已经达到最大修改次数',
  1538. messageAlign: 'left',
  1539. confirmButtonText: '确定',
  1540. });
  1541. }
  1542. } else if (response.data.updateAddress == 2) {
  1543. // 1.非金牌店铺,非同城店铺 位置偏差过大 重置经纬度
  1544. this.resetCoord(res, val, location, PointSumval);
  1545. return;
  1546. }
  1547. } else {
  1548. // 门店编码校验门店地址通过 进入拜访
  1549. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1550. }
  1551. });
  1552. },
  1553. // 重置经纬度
  1554. resetCoord(res, val, location, PointSumval) {
  1555. this.$dialog
  1556. .confirm({
  1557. confirmButtonText: '初始化定位',
  1558. cancelButtonText: '取消拜访',
  1559. title: '系统提示',
  1560. message: '偏差过大,不允许拜访。可修改本店定位.',
  1561. closeOnClickOverlay: true,
  1562. })
  1563. .then(() => {
  1564. mobileReposition({
  1565. storeId: val.storeId,
  1566. lat: location.lat,
  1567. lon: location.lon,
  1568. }).then((res) => {
  1569. if (res.code == 200) {
  1570. this.$dialog
  1571. .alert({
  1572. title: '系统提示',
  1573. message: '本信息定位已更新成功!',
  1574. })
  1575. .then(() => {
  1576. this.toSuishenbangOutstoreVisit(res, val, location, PointSumval);
  1577. });
  1578. localStorage.setItem('startTime', new Date());
  1579. localStorage.setItem('ORGName', val.deptName);
  1580. localStorage.setItem('chainNameR', val.storeName);
  1581. } else {
  1582. this.$toast(res.msg);
  1583. }
  1584. });
  1585. });
  1586. },
  1587. // 进入拜访 router.push
  1588. toSuishenbangOutstoreVisit(res, val, location, PointSumval) {
  1589. addVisitsPosition({
  1590. storeId: val.storeId,
  1591. visitsId: '',
  1592. lon: res.longitude,
  1593. lat: res.latitude,
  1594. sourceLon: location.lon,
  1595. sourceLat: location.lat,
  1596. positionDesc: '',
  1597. accuracy: res.accuracy,
  1598. });
  1599. this.$router.push({
  1600. path: '/suishenbangOutstoreVisit',
  1601. query: {
  1602. storeId: val.storeId,
  1603. rdId: val.rdId,
  1604. lat: location.lat,
  1605. lon: location.lon,
  1606. visitId: val.visitId,
  1607. pageType: 'out',
  1608. addressLine: val.addressLine,
  1609. storeCategory: val.storeCategory,
  1610. storeName: val.storeName,
  1611. hisTime: val.hisTime,
  1612. contactName: val.contactName,
  1613. storeCode: val.storeCode,
  1614. tabVal: this.tabVal,
  1615. visitModel: '1',
  1616. latNew: location.lat,
  1617. lonNew: location.lon,
  1618. PointSum: PointSumval,
  1619. marklat: res.latitude,
  1620. marklon: res.longitude,
  1621. },
  1622. });
  1623. },
  1624. projectOutVisit(val) {
  1625. localStorage.setItem('tabVal', this.tabVal);
  1626. localStorage.removeItem('visitId');
  1627. // checkVisit({storeId:val.storeId}).then(res=>{
  1628. // if(res.code==200||val.stateString.indexOf("拜访中")!=-1){
  1629. if (localStorage.getItem('loginType') == 'cs') {
  1630. var lat = '';
  1631. var lon = '';
  1632. if (val.lat == '' || val.lat == null) {
  1633. lat = '31.2517820000';
  1634. lon = '120.5593090000';
  1635. } else {
  1636. lat = val.lat;
  1637. lon = val.lon;
  1638. }
  1639. this.$router.push({
  1640. path: '/storeGroup',
  1641. query: {
  1642. storeId: val.storeId,
  1643. rdId: val.rdId,
  1644. lat: lat,
  1645. lon: lon,
  1646. visitId: val.visitId,
  1647. pageType: 'out',
  1648. addressLine: val.addressLine,
  1649. storeCategory: val.storeCategory,
  1650. storeName: val.storeName,
  1651. hisTime: val.hisTime,
  1652. contactName: val.contactName,
  1653. storeCode: val.storeCode,
  1654. tabVal: this.tabVal,
  1655. visitModel: '1',
  1656. latNew: '31.2517820000',
  1657. lonNew: '120.5593090000',
  1658. PointSum: 0,
  1659. marklat: lat,
  1660. marklon: lon,
  1661. },
  1662. });
  1663. localStorage.setItem('startTime', new Date());
  1664. localStorage.setItem('ORGName', val.deptName);
  1665. localStorage.setItem('chainNameR', val.storeName);
  1666. } else {
  1667. if (this.flag) {
  1668. this.flag = false;
  1669. this.timer = null;
  1670. let that = this;
  1671. this.timer = setTimeout(() => {
  1672. this.flag = true;
  1673. }, 2000);
  1674. if (val.stateString.indexOf('拜访中') != -1 && val.visitSource == 1) {
  1675. localStorage.setItem('startTime', new Date());
  1676. localStorage.setItem('ORGName', val.deptName);
  1677. localStorage.setItem('chainNameR', val.storeName);
  1678. that.$router.push({
  1679. path: '/storeGroup',
  1680. query: {
  1681. storeId: val.storeId,
  1682. rdId: val.rdId,
  1683. lat: val.lat,
  1684. lon: val.lon,
  1685. visitId: val.visitId,
  1686. pageType: 'out',
  1687. addressLine: val.addressLine,
  1688. storeCategory: val.storeCategory,
  1689. storeName: val.storeName,
  1690. hisTime: val.hisTime,
  1691. contactName: val.contactName,
  1692. storeCode: val.storeCode,
  1693. tabVal: that.tabVal,
  1694. visitModel: '1',
  1695. latNew: val.lat,
  1696. lonNew: val.lon,
  1697. PointSum: '0',
  1698. marklat: val.lat,
  1699. marklon: val.lon,
  1700. },
  1701. });
  1702. } else {
  1703. let loading1 = this.$toast.loading({
  1704. duration: 0,
  1705. message: '加载中...',
  1706. forbidClick: true,
  1707. });
  1708. let url = window.location.href;
  1709. let wx = this.wx;
  1710. let qiyeData;
  1711. const instance = axios.create();
  1712. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  1713. instance
  1714. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  1715. params: {
  1716. url: url,
  1717. },
  1718. })
  1719. .then((response) => {
  1720. if (response.status == 200) {
  1721. this.cont = 3;
  1722. var flat = true;
  1723. var times = setInterval(() => {
  1724. this.cont--;
  1725. if (this.cont == '0') {
  1726. if (flat) {
  1727. loading1.clear();
  1728. clearInterval(times);
  1729. that.$dialog
  1730. .alert({
  1731. message: '定位失败,请开启企微定位权限',
  1732. })
  1733. .then(() => {});
  1734. } else {
  1735. clearInterval(times);
  1736. }
  1737. }
  1738. }, 1000);
  1739. qiyeData = response.data.data;
  1740. wx.config({
  1741. beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  1742. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  1743. appId: qiyeData.appId, // 必填,企业微信的corpID
  1744. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  1745. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  1746. signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  1747. jsApiList: ['ready', 'getLocation'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
  1748. });
  1749. wx.ready(function () {
  1750. wx.getLocation({
  1751. type: 'gcj02',
  1752. success: function (res) {
  1753. flat = false;
  1754. loading1.clear();
  1755. var location = that.CJ02BD(res.latitude, res.longitude);
  1756. if (val.lat == '' || val.lat == null) {
  1757. that.lat = location.lat;
  1758. that.lon = location.lon;
  1759. } else {
  1760. that.lat = val.lat;
  1761. that.lon = val.lon;
  1762. }
  1763. let PointSum = that
  1764. .twoPointSum(that.lat, that.lon, location.lat, location.lon)
  1765. .toFixed(2);
  1766. if (val.lat == '' || val.lat == null) {
  1767. if (localStorage.getItem('postType') != 'GZ') {
  1768. that.$dialog
  1769. .confirm({
  1770. confirmButtonText: '确定拜访',
  1771. cancelButtonText: '取消拜访',
  1772. title: '系统提示',
  1773. message:
  1774. '该信息没有经纬度,此次拜访会保存定位点作为信息经纬度,下次拜访时判断是否偏差过大。',
  1775. closeOnClickOverlay: true,
  1776. })
  1777. .then(() => {
  1778. that.$router.push({
  1779. path: '/storeGroup',
  1780. query: {
  1781. storeId: val.storeId,
  1782. rdId: val.rdId,
  1783. lat: that.lat,
  1784. lon: that.lon,
  1785. visitId: val.visitId,
  1786. pageType: 'out',
  1787. addressLine: val.addressLine,
  1788. storeCategory: val.storeCategory,
  1789. storeName: val.storeName,
  1790. contactName: val.contactName,
  1791. hisTime: val.hisTime,
  1792. storeCode: val.storeCode,
  1793. tabVal: that.tabVal,
  1794. visitModel: '1',
  1795. latNew: location.lat,
  1796. lonNew: location.lon,
  1797. PointSum: PointSum,
  1798. marklat: res.latitude,
  1799. marklon: res.longitude,
  1800. },
  1801. });
  1802. });
  1803. } else {
  1804. that.$router.push({
  1805. path: '/storeGroup',
  1806. query: {
  1807. storeId: val.storeId,
  1808. rdId: val.rdId,
  1809. lat: that.lat,
  1810. lon: that.lon,
  1811. visitId: val.visitId,
  1812. pageType: 'out',
  1813. addressLine: val.addressLine,
  1814. storeCategory: val.storeCategory,
  1815. storeName: val.storeName,
  1816. contactName: val.contactName,
  1817. hisTime: val.hisTime,
  1818. storeCode: val.storeCode,
  1819. tabVal: that.tabVal,
  1820. visitModel: '1',
  1821. latNew: location.lat,
  1822. lonNew: location.lon,
  1823. PointSum: PointSum,
  1824. marklat: res.latitude,
  1825. marklon: res.longitude,
  1826. },
  1827. });
  1828. }
  1829. } else {
  1830. that.$router.push({
  1831. path: '/storeGroup',
  1832. query: {
  1833. storeId: val.storeId,
  1834. rdId: val.rdId,
  1835. lat: that.lat,
  1836. lon: that.lon,
  1837. visitId: val.visitId,
  1838. pageType: 'out',
  1839. addressLine: val.addressLine,
  1840. storeCategory: val.storeCategory,
  1841. storeName: val.storeName,
  1842. contactName: val.contactName,
  1843. hisTime: val.hisTime,
  1844. storeCode: val.storeCode,
  1845. tabVal: that.tabVal,
  1846. visitModel: '1',
  1847. latNew: location.lat,
  1848. lonNew: location.lon,
  1849. PointSum: PointSum,
  1850. marklat: res.latitude,
  1851. marklon: res.longitude,
  1852. },
  1853. });
  1854. }
  1855. localStorage.setItem('startTime', new Date());
  1856. localStorage.setItem('ORGName', val.deptName);
  1857. localStorage.setItem('chainNameR', val.storeName);
  1858. addVisitsPosition({
  1859. storeId: val.storeId,
  1860. visitsId: '',
  1861. lon: res.longitude,
  1862. lat: res.latitude,
  1863. sourceLon: location.lon,
  1864. sourceLat: location.lat,
  1865. positionDesc: '',
  1866. accuracy: res.accuracy,
  1867. });
  1868. },
  1869. fail: function () {
  1870. loading1.clear();
  1871. that.$dialog.alert({
  1872. message: 'GPS未开启',
  1873. });
  1874. },
  1875. });
  1876. });
  1877. wx.error(function (res) {
  1878. loading1.clear();
  1879. that.$dialog
  1880. .alert({
  1881. message: '定位失败,请开启企微定位权限',
  1882. })
  1883. .then(() => {});
  1884. });
  1885. }
  1886. });
  1887. }
  1888. }
  1889. }
  1890. // }
  1891. // })
  1892. },
  1893. abnormalVisit(val) {
  1894. localStorage.removeItem('visitId');
  1895. localStorage.setItem('tabVal', this.tabVal);
  1896. checkVisit({ storeId: val.storeId }).then((res) => {
  1897. if (res.code == 200 || val.stateString.indexOf('拜访中') != -1) {
  1898. if (localStorage.getItem('loginType') == 'cs') {
  1899. var lat = '';
  1900. var lon = '';
  1901. if (val.lat == '' || val.lat == null) {
  1902. lat = '31.2517820000';
  1903. lon = '120.5593090000';
  1904. } else {
  1905. lat = val.lat;
  1906. lon = val.lon;
  1907. }
  1908. this.$router.push({
  1909. path: '/outabnormalVisit',
  1910. query: {
  1911. storeId: val.storeId,
  1912. rdId: val.rdId,
  1913. lat: lat,
  1914. lon: lon,
  1915. visitId: val.visitId,
  1916. pageType: 'out',
  1917. addressLine: val.addressLine,
  1918. storeCategory: val.storeCategory,
  1919. storeName: val.storeName,
  1920. hisTime: val.hisTime,
  1921. contactName: val.contactName,
  1922. storeCode: val.storeCode,
  1923. tabVal: this.tabVal,
  1924. visitModel: '3',
  1925. latNew: '31.2517820000',
  1926. lonNew: '120.5593090000',
  1927. PointSum: 0,
  1928. marklat: lat,
  1929. marklon: lon,
  1930. },
  1931. });
  1932. localStorage.setItem('startTime', new Date());
  1933. localStorage.setItem('ORGName', val.deptName);
  1934. localStorage.setItem('chainNameR', val.storeName);
  1935. } else {
  1936. if (this.flag) {
  1937. this.flag = false;
  1938. this.timer = null;
  1939. this.timer = setTimeout(() => {
  1940. this.flag = true;
  1941. }, 2000);
  1942. let loading1 = this.$toast.loading({
  1943. duration: 0,
  1944. message: '加载中...',
  1945. forbidClick: true,
  1946. });
  1947. let url = window.location.href;
  1948. let that = this;
  1949. let wx = this.wx;
  1950. let qiyeData;
  1951. const instance = axios.create();
  1952. instance.defaults.headers.common['userId'] = localStorage.getItem('loginName');
  1953. instance
  1954. .get(process.env.VUE_APP_BASE_API + 'mobile/wx/ticket', {
  1955. params: {
  1956. url: url,
  1957. },
  1958. })
  1959. .then((response) => {
  1960. if (response.status == 200) {
  1961. this.cont = 3;
  1962. var flat = true;
  1963. var times = setInterval(() => {
  1964. this.cont--;
  1965. if (this.cont == '0') {
  1966. if (flat) {
  1967. loading1.clear();
  1968. clearInterval(times);
  1969. that.$dialog
  1970. .alert({
  1971. message: '定位失败,请开启企微定位权限',
  1972. })
  1973. .then(() => {
  1974. this.$router.go(-1);
  1975. });
  1976. } else {
  1977. clearInterval(times);
  1978. }
  1979. }
  1980. }, 1000);
  1981. qiyeData = response.data.data;
  1982. wx.config({
  1983. beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
  1984. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  1985. appId: qiyeData.appId, // 必填,企业微信的corpID
  1986. timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳
  1987. nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串
  1988. signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法
  1989. jsApiList: ['ready', 'getLocation'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
  1990. });
  1991. wx.ready(function () {
  1992. wx.getLocation({
  1993. type: 'gcj02',
  1994. success: function (res) {
  1995. flat = false;
  1996. loading1.clear();
  1997. var location = that.CJ02BD(res.latitude, res.longitude);
  1998. if (val.lat == '' || val.lat == null) {
  1999. that.lat = location.lat;
  2000. that.lon = location.lon;
  2001. } else {
  2002. that.lat = val.lat;
  2003. that.lon = val.lon;
  2004. }
  2005. let PointSum = that
  2006. .twoPointSum(that.lat, that.lon, location.lat, location.lon)
  2007. .toFixed(2);
  2008. if (PointSum > 500 && localStorage.getItem('postType') != 'GZ') {
  2009. that.$dialog
  2010. .confirm({
  2011. confirmButtonText: '确定',
  2012. cancelButtonText: '取消',
  2013. title: '系统提示',
  2014. message: '定位距离偏差大',
  2015. closeOnClickOverlay: true,
  2016. })
  2017. .then(() => {
  2018. that.$router.push({
  2019. path: '/outabnormalVisit',
  2020. query: {
  2021. storeId: val.storeId,
  2022. rdId: val.rdId,
  2023. lat: that.lat,
  2024. lon: that.lon,
  2025. visitId: val.visitId,
  2026. pageType: 'out',
  2027. visitModel: '5',
  2028. storeCode: val.storeCode,
  2029. tabVal: that.tabVal,
  2030. latNew: location.lat,
  2031. lonNew: location.lon,
  2032. PointSum: PointSum,
  2033. marklat: res.latitude,
  2034. marklon: res.longitude,
  2035. },
  2036. });
  2037. localStorage.setItem('startTime', new Date());
  2038. localStorage.setItem('ORGName', val.deptName);
  2039. localStorage.setItem('chainNameR', val.storeName);
  2040. })
  2041. .catch(() => {
  2042. // that.abnormalVisit(val)
  2043. });
  2044. } else {
  2045. that.$router.push({
  2046. path: '/outabnormalVisit',
  2047. query: {
  2048. storeId: val.storeId,
  2049. rdId: val.rdId,
  2050. lat: that.lat,
  2051. lon: that.lon,
  2052. visitId: val.visitId,
  2053. pageType: 'out',
  2054. visitModel: '3',
  2055. storeCode: val.storeCode,
  2056. tabVal: that.tabVal,
  2057. latNew: location.lat,
  2058. lonNew: location.lon,
  2059. PointSum: PointSum,
  2060. marklat: res.latitude,
  2061. marklon: res.longitude,
  2062. },
  2063. });
  2064. localStorage.setItem('startTime', new Date());
  2065. localStorage.setItem('ORGName', val.deptName);
  2066. localStorage.setItem('chainNameR', val.storeName);
  2067. }
  2068. addVisitsPosition({
  2069. storeId: val.storeId,
  2070. visitsId: '',
  2071. lon: res.longitude,
  2072. lat: res.latitude,
  2073. sourceLon: location.lon,
  2074. sourceLat: location.lat,
  2075. positionDesc: '',
  2076. accuracy: res.accuracy,
  2077. });
  2078. },
  2079. fail: function () {
  2080. loading1.clear();
  2081. that.$dialog
  2082. .alert({
  2083. message: 'GPS未开启',
  2084. })
  2085. .then(() => {
  2086. // that.abnormalVisit(val)
  2087. });
  2088. },
  2089. });
  2090. });
  2091. wx.error(function (res) {
  2092. loading1.clear();
  2093. that.$dialog
  2094. .alert({
  2095. message: '定位失败,请开启企微定位权限',
  2096. })
  2097. .then(() => {});
  2098. });
  2099. } else {
  2100. loading1.clear();
  2101. this.$toast.fail(dataList.msg);
  2102. }
  2103. });
  2104. // this.$router.push({path: "/outabnormalVisit", query: {
  2105. // storeId:"179792",
  2106. // rdId:"null",
  2107. // lat:"31.1882020000",
  2108. // lon:"120.6801770000",
  2109. // visitId:"null",
  2110. // visitModel:"5",
  2111. // storeCode:"0190141901",
  2112. // tabVal:"0",
  2113. // latNew:34.621855582632264,
  2114. // lonNew:112.45382530736684,
  2115. // PointSum:857246.44
  2116. // }})
  2117. localStorage.setItem('startTime', new Date());
  2118. localStorage.setItem('ORGName', val.deptName);
  2119. localStorage.setItem('chainNameR', val.storeName);
  2120. }
  2121. }
  2122. } else {
  2123. this.$dialog.alert({
  2124. title: '系统提示',
  2125. message: res.msg,
  2126. });
  2127. }
  2128. });
  2129. },
  2130. visitFn(val) {
  2131. this.$router.push({
  2132. path: '/storeDetail',
  2133. query: { id: val.storeId, detilId: 'a' },
  2134. });
  2135. },
  2136. // 大客户签约
  2137. signAdd(val) {
  2138. this.$router.push({
  2139. path: '/sign',
  2140. query: { id: val.storeId, detilId: 'a' },
  2141. });
  2142. },
  2143. Visit(val) {
  2144. this.$router.push({
  2145. path: '/historicalDetails',
  2146. query: {
  2147. visitId: val.visitId,
  2148. storeId: val.storeId,
  2149. storeCode: val.storeCode,
  2150. },
  2151. });
  2152. },
  2153. onClickLeft() {
  2154. this.$router.go(-1);
  2155. },
  2156. onSearch() {
  2157. window.scrollTo(0, 0);
  2158. this.pageNum = 1;
  2159. this.list = [];
  2160. this.finished = true;
  2161. var postType = localStorage.getItem('postType');
  2162. this.customerVisits = localStorage.getItem('customerVisits');
  2163. if (postType == 'GZ') {
  2164. this.typeShow = false;
  2165. } else {
  2166. this.typeShow = true;
  2167. }
  2168. this.onLoad();
  2169. },
  2170. onSearchm() {
  2171. var postType = localStorage.getItem('postType');
  2172. if (postType == 'GZ') {
  2173. this.typeShow = false;
  2174. } else {
  2175. this.typeShow = true;
  2176. }
  2177. var StoreLabelsArr = [];
  2178. for (var k = 0; k < this.storeLabelTypes.length; k++) {
  2179. for (var k1 = 0; k1 < this.StoreLabels.length; k1++) {
  2180. if (this.StoreLabels[k1].dictValue == this.storeLabelTypes[k]) {
  2181. StoreLabelsArr.push(this.StoreLabels[k1].dictLabel);
  2182. }
  2183. }
  2184. }
  2185. var storeCategoryList = [];
  2186. for (var q = 0; q < this.result.length; q++) {
  2187. for (var q1 = 0; q1 < this.storeTypeLists.length; q1++) {
  2188. if (this.storeTypeLists[q1].dictValue == this.result[q]) {
  2189. storeCategoryList.push(this.storeTypeLists[q1].dictLabel);
  2190. }
  2191. }
  2192. }
  2193. if (this.tabVal == 1) {
  2194. if (this.storeLabelTypes.length > 0) {
  2195. this.buryingPoint({
  2196. systemModel: '计划外',
  2197. buryingPointType: 1,
  2198. buryingPointValue: StoreLabelsArr.join(','),
  2199. buryingPointName: '标签',
  2200. buryingPointPosition: '我的筛选',
  2201. });
  2202. }
  2203. if (this.storeCategoryList.length > 0) {
  2204. this.buryingPoint({
  2205. systemModel: '计划外',
  2206. buryingPointType: 1,
  2207. buryingPointValue: storeCategoryList.join(','),
  2208. buryingPointName: '类型',
  2209. buryingPointPosition: '我的筛选',
  2210. });
  2211. }
  2212. if (this.chainName != '') {
  2213. this.buryingPoint({
  2214. systemModel: '计划外',
  2215. buryingPointType: 1,
  2216. buryingPointValue: this.chainName,
  2217. buryingPointName: '经销商筛选',
  2218. buryingPointPosition: '我的筛选',
  2219. });
  2220. }
  2221. if (this.storeName != '') {
  2222. this.buryingPoint({
  2223. systemModel: '计划外',
  2224. buryingPointType: 1,
  2225. buryingPointValue: this.storeName,
  2226. buryingPointName: '搜索名称/编号/地址',
  2227. buryingPointPosition: '我的筛选',
  2228. });
  2229. }
  2230. } else {
  2231. if (this.storeLabelTypes.length > 0) {
  2232. this.buryingPoint({
  2233. systemModel: '计划外',
  2234. buryingPointType: 1,
  2235. buryingPointValue: StoreLabelsArr.join(','),
  2236. buryingPointName: '标签',
  2237. buryingPointPosition: '销售部的门店筛选',
  2238. });
  2239. }
  2240. if (this.storeCategoryList != '') {
  2241. this.buryingPoint({
  2242. systemModel: '计划外',
  2243. buryingPointType: 1,
  2244. buryingPointValue: storeCategoryList.join(','),
  2245. buryingPointName: '类型',
  2246. buryingPointPosition: '销售部的门店筛选',
  2247. });
  2248. }
  2249. if (this.chainName != '') {
  2250. this.buryingPoint({
  2251. systemModel: '计划外',
  2252. buryingPointType: 1,
  2253. buryingPointValue: this.chainName,
  2254. buryingPointName: '经销商筛选',
  2255. buryingPointPosition: '销售部的门店筛选',
  2256. });
  2257. }
  2258. if (this.storeName != '') {
  2259. this.buryingPoint({
  2260. systemModel: '计划外',
  2261. buryingPointType: 1,
  2262. buryingPointValue: this.storeName,
  2263. buryingPointName: '搜索名称/编号/地址',
  2264. buryingPointPosition: '销售部的门店筛选',
  2265. });
  2266. }
  2267. }
  2268. localStorage.setItem('outvstoreName', this.storeName);
  2269. localStorage.setItem('outvchainName', this.chainName);
  2270. localStorage.setItem('outvstoreLabelTypes', this.storeLabelTypes);
  2271. localStorage.setItem('outvstoreCategoryList', this.result);
  2272. localStorage.setItem('outvchainCode', this.chainCode);
  2273. this.onSearch();
  2274. },
  2275. tabChange(name) {
  2276. window.scrollTo(0, 0);
  2277. this.finished = true;
  2278. this.pageNum = 1;
  2279. this.list = [];
  2280. this.tabVal = name;
  2281. localStorage.setItem('tabVal', name);
  2282. this.onLoad();
  2283. },
  2284. // 滚动条与底部距离小于 offset 时触发 初始化会触发
  2285. onLoad() {
  2286. var postType = localStorage.getItem('postType');
  2287. if (postType == 'GZ') {
  2288. this.typeShow = false;
  2289. } else {
  2290. this.typeShow = true;
  2291. }
  2292. if (this.lon == '' && this.tabVal != 1) {
  2293. this.positionFn(1);
  2294. } else {
  2295. if (this.tabVal == 1) {
  2296. this.positionFn();
  2297. // this.getUserOutPlaListFun();
  2298. } else {
  2299. this.getUserOrgStoreList();
  2300. }
  2301. }
  2302. },
  2303. },
  2304. };
  2305. </script>
  2306. <style lang="scss">
  2307. .van-dialog__confirm,
  2308. .van-dialog__confirm:active {
  2309. color: #0057ba;
  2310. }
  2311. .searchDiv {
  2312. .van-search {
  2313. background: #fff;
  2314. }
  2315. .van-search__action {
  2316. font-size: 14px;
  2317. color: #0057ba;
  2318. font-weight: bold;
  2319. background: #f1f1f1;
  2320. border-bottom-right-radius: 60px;
  2321. border-top-right-radius: 60px;
  2322. border: 1px solid #ccc;
  2323. padding: 0 20px;
  2324. }
  2325. .van-search--show-action {
  2326. padding-right: 12px;
  2327. }
  2328. .van-search__content {
  2329. border: 1px solid #ccc;
  2330. border-bottom-left-radius: 60px;
  2331. border-top-left-radius: 60px;
  2332. background: #f1f1f1;
  2333. border-right: 0;
  2334. }
  2335. }
  2336. .myTab {
  2337. .van-tabs__nav--card {
  2338. margin: 0 !important;
  2339. border-left: 0;
  2340. border-right: 0;
  2341. }
  2342. .van-tabs__wrap,
  2343. .van-tabs__nav--card {
  2344. height: 39px;
  2345. }
  2346. .van-tab {
  2347. line-height: 40px;
  2348. }
  2349. }
  2350. .myList {
  2351. .van-cell {
  2352. padding: 0;
  2353. &:after {
  2354. border-bottom: none;
  2355. }
  2356. }
  2357. }
  2358. </style>
  2359. <style lang="scss" scoped>
  2360. .bgcolor {
  2361. background-color: #f5f5f5;
  2362. }
  2363. .container {
  2364. padding-bottom: 50px;
  2365. }
  2366. .card {
  2367. padding: 10px 16px;
  2368. box-sizing: border-box;
  2369. }
  2370. .card .title {
  2371. font-size: 15px;
  2372. font-weight: bold;
  2373. color: #333;
  2374. line-height: 22px;
  2375. padding-right: 52px;
  2376. }
  2377. .card .info {
  2378. font-size: 14px;
  2379. color: #909090;
  2380. line-height: 26px;
  2381. }
  2382. .btnbox {
  2383. padding-top: 14px;
  2384. border-top: 1px solid #eee;
  2385. margin: 0 10px;
  2386. }
  2387. .navBarTOP {
  2388. position: fixed;
  2389. width: 100%;
  2390. z-index: 2;
  2391. top: 0;
  2392. }
  2393. .cellcontent .centerBtn {
  2394. margin: 0 auto 10px;
  2395. display: block;
  2396. width: 92%;
  2397. color: #0057ba;
  2398. border-radius: 5px;
  2399. padding: 0 2px;
  2400. }
  2401. .cellcontent .centerBtn1 {
  2402. background-color: #0057ba;
  2403. color: #fff;
  2404. border-color: #0057ba;
  2405. }
  2406. .cellcontent .centerBtn2 {
  2407. margin: 0 auto 10px;
  2408. display: block;
  2409. width: 92%;
  2410. color: #0057ba;
  2411. border-radius: 5px;
  2412. padding: 0;
  2413. }
  2414. .statstext {
  2415. background-color: #0057ba;
  2416. position: absolute;
  2417. right: 0;
  2418. top: 6px;
  2419. padding: 2px 6px 2px 12px;
  2420. border-bottom-left-radius: 60px;
  2421. border-top-left-radius: 60px;
  2422. color: #fff;
  2423. }
  2424. .cellcontent .van-cell {
  2425. padding: 10px 0;
  2426. }
  2427. .statstext .van-icon__image {
  2428. height: 0.7em;
  2429. }
  2430. .tipsTitle {
  2431. padding: 5px 0;
  2432. text-align: center;
  2433. font-size: 16px;
  2434. font-weight: 600;
  2435. }
  2436. </style>
  2437. <style>
  2438. .van-tabs__nav--card .van-tab.van-tab--active {
  2439. background-color: #0057ba !important;
  2440. }
  2441. .visitSearch {
  2442. width: 68px;
  2443. color: #0057ba;
  2444. font-size: 14px;
  2445. }
  2446. .visitSearch .van-dropdown-menu__bar {
  2447. box-shadow: 0 0 0 #fff;
  2448. height: 52px;
  2449. }
  2450. .visitSearch .van-dropdown-menu__item {
  2451. justify-content: normal;
  2452. }
  2453. .visitSearch .van-dropdown-menu__title {
  2454. border-left: 1px solid #ccc;
  2455. }
  2456. .visitSearch .van-cell {
  2457. border: 1px solid #ccc;
  2458. border-radius: 5px;
  2459. padding: 6px;
  2460. }
  2461. .positionContent {
  2462. position: fixed;
  2463. color: #666;
  2464. display: inline-block;
  2465. box-shadow: 0px 2px 7px -5px #000;
  2466. border-radius: 100px;
  2467. overflow: hidden;
  2468. right: 14px;
  2469. cursor: pointer;
  2470. bottom: 96px;
  2471. background-color: white;
  2472. }
  2473. .positionContent .img {
  2474. border-radius: 100px;
  2475. float: left;
  2476. }
  2477. .positionContent .img .van-icon__image {
  2478. border-radius: 100px;
  2479. }
  2480. .zDialog .van-dialog__header {
  2481. padding: 10px;
  2482. border-bottom: 1px solid #f5f5f5;
  2483. }
  2484. .zDialog .infoText {
  2485. margin: 10px;
  2486. font-size: 14px;
  2487. color: #909090;
  2488. width: 98%;
  2489. }
  2490. .visitStoreIco {
  2491. float: left;
  2492. float: left;
  2493. width: 26px;
  2494. text-align: center;
  2495. background-color: #ffba13;
  2496. color: #fff;
  2497. border-radius: 100%;
  2498. margin-left: 14px;
  2499. line-height: 26px;
  2500. height: 26px;
  2501. }
  2502. .searchcheck {
  2503. padding: 0 10px 10px;
  2504. }
  2505. .searchcheck .van-checkbox {
  2506. /*width: 44%;*/
  2507. padding-bottom: 10px;
  2508. }
  2509. .searchcheck .checkbox {
  2510. font-size: 14px;
  2511. display: inline-block;
  2512. width: 50%;
  2513. line-height: 28px;
  2514. }
  2515. .searchcheck .checkbox .van-checkbox {
  2516. margin-bottom: 2px;
  2517. }
  2518. .searchcheck .checkbox1 {
  2519. font-size: 14px;
  2520. float: left;
  2521. line-height: 28px;
  2522. width: 50%;
  2523. }
  2524. .searchcheck .checkbox1 .child {
  2525. width: 100%;
  2526. }
  2527. .searchcheck {
  2528. height: 93vh;
  2529. overflow-y: auto;
  2530. }
  2531. .searchchecktitle {
  2532. width: 100%;
  2533. margin: 20px 0;
  2534. font-size: 16px;
  2535. border-left: 3px solid #0057ba;
  2536. line-height: 18px;
  2537. }
  2538. .searchchecktitle1 {
  2539. width: 100%;
  2540. margin: 20px 0;
  2541. font-size: 16px;
  2542. line-height: 18px;
  2543. }
  2544. .textsize {
  2545. font-size: 14px;
  2546. }
  2547. </style>