Browse Source

feat: 完成在订单确认页面时添加地址的逻辑

YuJing 1 month ago
parent
commit
f80ae390c8

+ 5 - 1
commons/basic/src/main/ets/utils/arkts/utils/YTRouter.ets

@@ -157,7 +157,11 @@ class YTRouter extends NavPathStack {
     this.pushPathByName('AddressManagementPage', null)
   }
 
-  // 添加地址页面
+  /**
+   * 添加地址页面
+   * @param addressIndex 需要修改的地址索引
+   * @param callBack
+   */
   router2IncreaseAddressPage(addressIndex?: number, callBack?: Callback<PopInfo>){
     this.pushPathByName('IncreaseAddressPage', addressIndex, callBack)
   }

+ 34 - 13
features/feature/src/main/ets/components/AddressComp.ets

@@ -1,21 +1,38 @@
 import { DiaLogSheetControl, YTAvoid, yTRouter } from 'basic';
 import { AddressAddPageState } from '../model/EnumState';
+import { UserAddressStorage } from '../model/Storage';
 import { CustomTextStyle } from '../style/CustomTextStyle';
 import { AddressItemComp } from './AddressItemComp';
 import { buttonComp } from './BuilderIndex';
+import { AppStorageV2 } from '@kit.ArkUI';
+import { Address } from '../model/Address';
 
 
 @ComponentV2
 export struct AddressComp{
-  // @Param @Require param: BasicType
   @Param @Require control: DiaLogSheetControl
+  @Param @Require addressId: string
 
-  @Local safeBottom: number = AppStorage.get(YTAvoid.SAFE_BOTTOM_KEY) as number
   @Local selectIndex: number = 0
+  @Local safeBottom: number = AppStorage.get(YTAvoid.SAFE_BOTTOM_KEY) as number
+
+  addressConnect: UserAddressStorage = AppStorageV2.connect(UserAddressStorage, () => new UserAddressStorage())!
+
+  aboutToAppear(): void {
+    this.selectIndex = this.addressConnect.getIndexById(this.addressId)
+  }
 
   // 前往添加地址页面
   IncreaseAddressPage(){
-    yTRouter.router2IncreaseAddressPage(AddressAddPageState.ADD)
+    yTRouter.router2IncreaseAddressPage(undefined, (info) => {
+      let ans = info.result as Address
+      this.selectAddress(ans)
+    })
+  }
+
+  // 选择地址
+  selectAddress(item: Address){
+    this.control._onBackPress({ item })
   }
 
   build() {
@@ -35,13 +52,17 @@ export struct AddressComp{
       .borderRadius({topLeft: 12, topRight: 12})
       .padding({left: 18, right: 18, top: 14, bottom: 14})
 
-      Column({space: 18}){
-        ForEach(new Array(3).fill(''), (item: string, index) => {
-          this.addressItem(index)
-        })
-      }.width('100%')
-      .backgroundColor('#F7F9FA')
-      .padding({top: 18, bottom: 18, left: 15, right: 15})
+      Column(){
+        List({space: 18}){
+          ForEach(this.addressConnect.addressList, (item: Address, index) => {
+            ListItem(){
+              this.addressItem(item, index)
+            }
+          })
+        }.width('100%').height('100%')
+        .backgroundColor('#F7F9FA')
+        .padding({top: 18, bottom: 18, left: 15, right: 15})
+      }.height(Math.min(this.addressConnect.addressList.length*110, 400))
 
       Row(){
         buttonComp(
@@ -60,14 +81,15 @@ export struct AddressComp{
   }
 
   @Builder
-  addressItem(index: number){
+  addressItem(item: Address, index: number){
     RelativeContainer(){
-      AddressItemComp({ selectIndex: this.selectIndex, index: index, type: 2, needBorder: false })
+      AddressItemComp({ selectIndex: this.selectIndex, index: index, type: 2, needBorder: false, address: item, click: () => { this.selectAddress(item) } })
       .alignRules({
         left: {anchor: '__container__', align: HorizontalAlign.Start},
         top: {anchor: '__container__', align: VerticalAlign.Top}
       })
 
+      // todo 是否保留默认地址
       if(0 == index){
         Text('默认')
         .fontSize(12)
@@ -85,7 +107,6 @@ export struct AddressComp{
     .height(100)
     .borderRadius(16)
     .backgroundColor(Color.White)
-    .onClick(() => { this.selectIndex = index })
     .border({width: 1, color: 0 == index ? '#FFFECF2F' : '#FF000000'})
   }
 }

+ 8 - 1
features/feature/src/main/ets/model/Storage.ets

@@ -117,7 +117,7 @@ export class UserAddressStorage{
   async addUserAddress(address: Address){
     let ans = await AddressApi.addAddress(address)
     console.log(`ans = ${JSON.stringify(ans)}`)
-    this.getUserAddressList()
+    await this.getUserAddressList()
   }
 
   // 修改地址
@@ -126,4 +126,11 @@ export class UserAddressStorage{
     console.log(`ans = ${JSON.stringify(ans)}`)
     this.getUserAddressList()
   }
+
+  // 根据 id 获取地址索引
+  getIndexById(id: string): number{
+    let index = this.addressList.findIndex(item => item.id == id)
+    if(index == -1) return 0
+    else return index
+  }
 }

+ 5 - 0
features/feature/src/main/ets/pages/Address/AddressManagementPage.ets

@@ -16,6 +16,11 @@ struct AddressManagementPage {
 
   addressConnect: UserAddressStorage = AppStorageV2.connect(UserAddressStorage, () => new UserAddressStorage())!
 
+  aboutToAppear(): void {
+    this.addressConnect.getUserAddressList()
+  }
+
+  // 编辑地址、添加地址
   editAddress(index?: number){
     if(index != undefined){
       yTRouter.router2IncreaseAddressPage(index)

+ 3 - 2
features/feature/src/main/ets/pages/Address/IncreaseAddressPage.ets

@@ -55,11 +55,12 @@ struct IncreaseAddressPage {
     const addressItem: Address = this.getAddressObject()
     if(this.pageState == AddressAddPageState.ADD) {
       await this.addressConnect.addUserAddress(addressItem)
+      yTRouter.pop(this.addressConnect.addressList[0])
     } else {
       await this.addressConnect.updateUserAddress(addressItem)
+      yTRouter.pop(this.addressConnect.addressList[this.addressIndex!])
     }
     IBestToast.show('保存成功')
-    yTRouter.pop()
   }
 
   // 设置为默认地址
@@ -95,7 +96,7 @@ struct IncreaseAddressPage {
 
   // 生成地址对象
   getAddressObject(): Address {
-    let addressItem: Address = this.addressIndex ? this.addressConnect.addressList[this.addressIndex] : {}
+    let addressItem: Address = this.addressIndex != undefined ? this.addressConnect.addressList[this.addressIndex] : {}
 
     addressItem.address = this.address
     addressItem.userName = this.userName

+ 22 - 16
features/feature/src/main/ets/pages/Order/OrderDetailPage.ets

@@ -2,6 +2,7 @@ import { BasicType, BookItem, DiaLogSheetControl, YTHeader, yTRouter } from 'bas
 import { AddressComp } from '../../components/AddressComp'
 import { AddressItemComp } from '../../components/AddressItemComp'
 import { buttonComp } from '../../components/BuilderIndex'
+import { Address } from '../../model/Address'
 import { AddressAddPageState, OrderStatus } from '../../model/EnumState'
 import { OrderDetailModel } from '../../model/RouterModel'
 import { CustomTextStyle } from '../../style/CustomTextStyle'
@@ -16,20 +17,25 @@ struct OrderDetailPage {
 
   // 打开选择地址弹窗
   openAddressDialog() {
-    if(true){
-      yTRouter.router2IncreaseAddressPage(AddressAddPageState.ADD_AND_USE, (info) => {
-        let ans = info.result
-        console.log(`ans = ${JSON.stringify(ans)}`)
-      })
-      return
-    }
-
-
-    // todo 有 地址数据 打开弹窗, 没有进入地址管理页面添加页面添加地址
-    let control: DiaLogSheetControl = new DiaLogSheetControl(this.getUIContext())
+    let control: DiaLogSheetControl = new DiaLogSheetControl(this.getUIContext(), false, false)
     yTRouter.router2BottomDialog({
       control: control,
-      builder: () => { this.AddressSelection(control) },
+      builder: () => { this.AddressSelection(control, this.vm.address.id!) },
+    }, (info) => {
+      let ans: Address = info.result as Address
+
+      this.vm.address = ans
+
+      console.log(`ans = ${JSON.stringify(ans)}`)
+    })
+  }
+
+  // 前往地址添加页
+  gotoAddAddressPage() {
+    yTRouter.router2IncreaseAddressPage(AddressAddPageState.ADD_AND_USE, (info) => {
+      let ans = info.result as Address
+      this.vm.address = ans
+      console.log(`ans = ${JSON.stringify(ans)}`)
     })
   }
 
@@ -113,7 +119,7 @@ struct OrderDetailPage {
     ListItem(){
       // todo 订单地址校验
       if(this.vm.address?.phone) {
-        AddressItemComp({type: 0})
+        AddressItemComp({type: 0, address: this.vm.address, click: () => { this.openAddressDialog() }})
       } else {
         Row(){
           Text('+ 添加收件人信息')
@@ -123,10 +129,10 @@ struct OrderDetailPage {
         .border({width: 2})
         .padding({top: 30, bottom: 30})
         .justifyContent(FlexAlign.Center)
+        .onClick(() => { this.gotoAddAddressPage() })
       }
     }
     .backgroundColor(Color.White)
-    .onClick(() => { this.openAddressDialog() })
   }
 
   /** 订单状态信息 */
@@ -329,8 +335,8 @@ struct OrderDetailPage {
 
   /** 地址选择弹窗 */
   @Builder
-  AddressSelection(control: DiaLogSheetControl) {
-    AddressComp({control: control})
+  AddressSelection(control: DiaLogSheetControl, addressId: string) {
+    AddressComp({control: control, addressId: addressId})
   }
 }
 

+ 5 - 0
features/feature/src/main/ets/pages/viewModel/OrderDetailViewModel.ets

@@ -4,6 +4,8 @@ import { Address } from '../../model/Address'
 import { OrderStatus } from '../../model/EnumState'
 import { GetUnifiedPayInfoRequestData, OrderValidationData } from '../../model/OrderModelIndex'
 import { OrderDetailModel } from '../../model/RouterModel'
+import { UserAddressStorage } from '../../model/Storage'
+import { AppStorageV2 } from '@kit.ArkUI'
 
 @ObservedV2
 export class OrderDetailViewModel{
@@ -23,6 +25,7 @@ export class OrderDetailViewModel{
   // 用户选择的支付方式
   @Trace payWay: number = 0
 
+  addressConnect: UserAddressStorage = AppStorageV2.connect(UserAddressStorage, () => new UserAddressStorage())!
 
   // 提交订单校验
   orderValidation: OrderValidationData = {
@@ -50,6 +53,8 @@ export class OrderDetailViewModel{
       this.bookList = param.bookList
       this.generateOrderDetail()
     }
+
+    this.address = this.addressConnect.addressList[0]
   }
 
   // 切换支付方式