You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

389 lines
11 KiB

2 months ago
  1. <template>
  2. <view class="service-new container">
  3. <view class="service-new-address">
  4. <uni-card padding=0 :is-shadow="false">
  5. <view class="service-new-title" slot="title">
  6. <view class="service-new-title-left">
  7. <view class="service-new-flag"></view>
  8. <view>服务地址</view>
  9. </view>
  10. </view>
  11. <view class="split-line"></view>
  12. <view class="service-new-address-content">
  13. <view v-if="isAddressSelected" class="service-new-address-selected" >
  14. <view class="personal-address-info">
  15. <view class="personal-address-text">
  16. {{currentAddress.province}} {{currentAddress.city}} {{currentAddress.detailAddress}}
  17. </view>
  18. <view class="personal-address-people">
  19. <view>
  20. {{currentAddress.name}}
  21. </view>
  22. <view style="border: solid #7D8196 1px; margin: 0 10px; height: 12px;"> </view>
  23. <view>
  24. {{currentAddress.phone}}
  25. </view>
  26. </view>
  27. </view>
  28. <view>
  29. <uni-icons type="right" size="28rpx" color="#AAA" @click="selectAddress"></uni-icons>
  30. </view>
  31. </view>
  32. <view v-else class="service-new-unselect">
  33. <view style="width: 50%;">
  34. <u-button color="#FFBF60" icon="plus-circle-fill" text="添加地址" shape="circle" plain @click="selectAddress">
  35. </u-button>
  36. </view>
  37. </view>
  38. </view>
  39. </uni-card>
  40. </view>
  41. <view class="service-new-pet">
  42. <uni-card padding=0 :is-shadow="false">
  43. <view class="service-new-title" slot="title">
  44. <view class="service-new-title-left">
  45. <view class="service-new-flag">
  46. </view>
  47. <view class="service-new-title-text">
  48. 服务宠物
  49. </view>
  50. </view>
  51. <view v-if="isPetSelected" class="add-pet" @click="selectPet">
  52. <u-icon name="plus-circle-fill" color="#FFBF60" size="28rpx" style="margin-right: 10rpx;"></u-icon>
  53. 添加宠物
  54. </view>
  55. </view>
  56. <view class="split-line"></view>
  57. <view class="service-new-pet-content">
  58. <view v-if="isPetSelected" class="personal-pet-list">
  59. <view v-for="(item,index) in currentPets" :key="index">
  60. <view class="personal-pet-list-item">
  61. <view class="personal-pet-info">
  62. <!-- 左侧头像 -->
  63. <view class="pet-avatar">
  64. <u-avatar :src="item.photo?item.photo:defaultPhoto" size="60" shape="circle"></u-avatar>
  65. </view>
  66. <!-- 中间内容 -->
  67. <view class="pet-info" style="flex: 1; margin: 0 20rpx; max-width: 50%;">
  68. <view class="pet-name-gender" style="display: flex; align-items: center;">
  69. <view>{{item.name}}</view>
  70. <view class="pet-gender" style="margin-left: 10rpx; display: flex;align-items: center;">
  71. <img :src="item.gender=='男生'?'../../static/images/details/boy.svg':'../../static/images/details/girl.svg'" alt="sex"
  72. style="width: 16px;height: 16px;"/>
  73. </view>
  74. </view>
  75. <view class="pet-dates ellipsis" >
  76. {{ getSelectedDateString(item.selectedDate) }}
  77. </view>
  78. </view>
  79. <!-- 右侧天数统计 -->
  80. <view class="date-total" style="margin-left: auto;width: 140rpx;text-align: end;">
  81. {{item.selectedDate.length}}
  82. <uni-icons type="right" size="28rpx" color="#AAA" @click="selectPet"></uni-icons>
  83. </view>
  84. </view>
  85. </view>
  86. </view>
  87. </view>
  88. <view v-else class="service-new-unselect">
  89. <view style="width: 50%;">
  90. <u-button color="#FFBF60" icon="plus-circle-fill" text="添加宠物" shape="circle" plain @click="selectPet">
  91. </u-button>
  92. </view>
  93. </view>
  94. </view>
  95. </uni-card>
  96. </view>
  97. <view class="service-new-pet">
  98. <uni-card padding=0 :is-shadow="false">
  99. <view class="service-new-title" slot="title">
  100. <view class="service-new-title-left">
  101. <view class="service-new-flag">
  102. </view>
  103. <view class="service-new-title-text">
  104. 服务细则
  105. </view>
  106. </view>
  107. </view>
  108. <view class="split-line"></view>
  109. <view class="service-new-details-content">
  110. <view style="margin: 30rpx 0;">
  111. <u-checkbox-group
  112. v-model="needPreFamiliarize"
  113. iconPlacement="right"
  114. placement="column">
  115. <u-checkbox activeColor="#FFBF60" label="是否提前熟悉" name="是否提前熟悉" shape="circle"></u-checkbox>
  116. </u-checkbox-group>
  117. </view>
  118. <view class="split-line"></view>
  119. <view class="service-new-details-desc">
  120. <view style="display: flex;">
  121. <text style="width: 20rpx;">*</text>
  122. <text style="flex: 1;">价格40元/</text>
  123. </view>
  124. <view style="display: flex; margin: 20rpx 0;">
  125. <text style="width: 20rpx;">*</text>
  126. <text style="flex: 1;">服务内容: 购买此服务后伴宠师将在您离家前按照约定日期提前上门沟通熟悉喂养要求及宠物</text>
  127. </view>
  128. <view style="display: flex;">
  129. <text style="width: 20rpx;">*</text>
  130. <text style="flex: 1;">服务保障: 购买此服务后平台支持在提前熟悉后上门服务第一天前无理由免费更换伴宠师1次</text>
  131. </view>
  132. </view>
  133. </view>
  134. </uni-card>
  135. </view>
  136. <view class="details-subscribe">
  137. <button class="details-btn" @click="goNext">下一步</button>
  138. </view>
  139. </view>
  140. </template>
  141. <script>
  142. import {
  143. getProductList,
  144. getOpenId
  145. } from "@/api/system/user"
  146. import { setToken,getToken,getOpenIdKey,setOpenIdKey } from '@/utils/auth'
  147. export default {
  148. data()
  149. {
  150. return {
  151. isAddressSelected:false,
  152. currentAddress:{},
  153. isPetSelected:false,
  154. currentPets:[],
  155. needPreFamiliarize:[],
  156. defaultPhoto:'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/personal/pet/catdog.png',
  157. }
  158. },
  159. onShow() {
  160. if (!getToken() || !getOpenIdKey()) {
  161. this.login()
  162. }
  163. if(this.$globalData.mainSku.length < 1 || !this.$globalData.mainSku[0].price){
  164. // 获取主产品
  165. this.getProductList()
  166. }
  167. this.currentAddress = this.$globalData.newOrderData.currentAddress
  168. if(this.currentAddress&&this.currentAddress.name){
  169. this.isAddressSelected=true
  170. }
  171. this.currentPets = this.$globalData.newOrderData.currentPets
  172. if(this.currentPets&&this.currentPets.length>0){
  173. this.isPetSelected=true
  174. }
  175. this.needPreFamiliarize = this.$globalData.newOrderData.needPreFamiliarize
  176. },
  177. methods:{
  178. selectAddress(){
  179. uni.navigateTo({
  180. url: "/pages/newOrder/addressList"
  181. });
  182. },
  183. selectPet(){
  184. uni.navigateTo({
  185. url: "/pages/newOrder/petList"
  186. });
  187. },
  188. getProductList() {
  189. getProductList({
  190. "publishStatus": 1,
  191. "categoryId": 76,
  192. "needSku": true
  193. }).then(response => {
  194. if (response && response.content && response.content.length > 0) {
  195. const skus = response && response.content[0].skus
  196. if(skus && skus.length>0){
  197. let productSku = {
  198. "skuId": skus[0].id,
  199. "price":skus[0].price,
  200. "name":response.content[0].name,
  201. "quantity": 1,
  202. "isMainProduct":true
  203. }
  204. this.$globalData.mainSku = [productSku]
  205. }
  206. }else {
  207. uni.showToast('获取主产品失败,请联系管理员')
  208. }
  209. console.log(response);
  210. })
  211. },
  212. login() {
  213. uni.login({
  214. provider: 'weixin',
  215. success: (loginRes) => {
  216. this.getOpenId(loginRes.code)
  217. },
  218. fail: function(error) {
  219. // 授权失败处理
  220. uni.showToast('授权失败,请授权后再试')
  221. }
  222. });
  223. },
  224. getOpenId(code) {
  225. getOpenId(code).then(res => {
  226. if (res.code == 200 && res.data) {
  227. let resData = JSON.parse(res.data)
  228. let token = resData.token;
  229. let openId = resData.openId;
  230. setOpenIdKey(openId)
  231. if(token){
  232. setToken(token)
  233. }
  234. }
  235. })
  236. },
  237. goNext(){
  238. console.log(this.needPreFamiliarize)
  239. if(!this.isAddressSelected) {
  240. this.$modal.showToast('请选择服务地址');
  241. return;
  242. }
  243. if(!this.isPetSelected) {
  244. this.$modal.showToast('请选择宠物');
  245. return;
  246. }
  247. this.$globalData.newOrderData.needPreFamiliarize = this.needPreFamiliarize
  248. uni.navigateTo({
  249. url: "/pages/newOrder/serviceNew2"
  250. });
  251. console.log(this.$globalData.newOrderData)
  252. },
  253. getSelectedDateString(selectDate){
  254. //显示日期为01/01;01/02;
  255. if(!selectDate || selectDate.length === 0) return '';
  256. return selectDate.map(date => {
  257. // 从日期字符串中提取月和日
  258. const [,month, day] = date.date.split('-');
  259. return `${month}/${day}`;
  260. }).join(';');
  261. }
  262. }
  263. }
  264. </script>
  265. <style scoped lang="less">
  266. .container {
  267. position: relative;
  268. height: 100%;
  269. padding-bottom: 78px;
  270. .details-subscribe {
  271. background-color: #FFFFFF;
  272. padding: 10px;
  273. width: 100%;
  274. height: 78px;
  275. position: fixed;
  276. bottom: 0;
  277. z-index: 100;
  278. .details-btn {
  279. width: 100%;
  280. border-radius: 6px;
  281. background: #FFB13F;
  282. font-size: 16px;
  283. color: #FFFFFF;
  284. }
  285. }
  286. }
  287. .service-new{
  288. .service-new-flag {
  289. width: 8rpx;
  290. height: 32rpx;
  291. background: #FFBF60;
  292. border-radius: 30rpx 30rpx 30rpx 30rpx;
  293. margin-right: 10rpx;
  294. }
  295. .split-line{
  296. width: 100%;
  297. height: 1rpx;
  298. background: #EFEFEF;
  299. }
  300. .service-new-title{
  301. display: flex;
  302. font-weight: 500;
  303. font-size: 28rpx;
  304. color: #333333;
  305. line-height: 33rpx;
  306. margin: 42rpx 0 30rpx;
  307. justify-content: space-between;
  308. .service-new-title-left{
  309. display: flex;
  310. align-items: center;
  311. }
  312. }
  313. .service-new-unselect{
  314. height: 156rpx;
  315. display: flex;
  316. justify-content: center;
  317. align-items: center;
  318. }
  319. .add-pet{
  320. font-weight: 400;
  321. font-size: 28rpx;
  322. color: #FFAA48;
  323. line-height: 40rpx;
  324. display: flex;
  325. align-items: center;
  326. }
  327. .service-new-details-desc{
  328. font-weight: 400;
  329. font-size: 24rpx;
  330. color: #A94F20;
  331. line-height: 28rpx;
  332. text-align: left;
  333. padding: 26rpx 0;
  334. }
  335. .personal-address-info{
  336. display: flex;
  337. align-items: center;
  338. justify-content: flex-start;
  339. flex-wrap: wrap;
  340. margin: 32rpx 0;
  341. width: 80%;
  342. .personal-address-text{
  343. color: #333;
  344. font-size: 28rpx;
  345. font-weight: bold;
  346. width: 100%;
  347. }
  348. .personal-address-people{
  349. color: #7D8196;
  350. font-size: 28rpx;
  351. font-weight: 400;
  352. display: flex;
  353. justify-content: flex-start;
  354. align-items: center;
  355. }
  356. }
  357. .service-new-address-selected{
  358. display: flex;
  359. justify-content: space-between;
  360. align-items: center;
  361. }
  362. }
  363. .personal-pet-list {
  364. margin-top: 20rpx;
  365. .personal-pet-list-item {
  366. margin-bottom: 20rpx;
  367. background-color: #F9F9F9;
  368. height: 172rpx;
  369. border-radius: 8rpx;
  370. .personal-pet-info {
  371. height: 100%;
  372. display: flex;
  373. align-items: center;
  374. padding: 0 20rpx;
  375. }
  376. }
  377. }
  378. </style>