瀏覽代碼

Merge branch 'master' of http://gogs.hnwmzp.cn/nzk1/Asteria-APP

Abel 1 年之前
父節點
當前提交
1f1d51d103
共有 55 個文件被更改,包括 2672 次插入61 次删除
  1. 72 12
      Asteria.xcodeproj/project.pbxproj
  2. 22 0
      Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_failed_icon.imageset/Contents.json
  3. 二進制
      Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_failed_icon.imageset/pay_failed_icon@2x.png
  4. 二進制
      Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_failed_icon.imageset/pay_failed_icon@3x.png
  5. 22 0
      Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_success_icon.imageset/Contents.json
  6. 二進制
      Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_success_icon.imageset/pay_success_icon@2x.png
  7. 二進制
      Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_success_icon.imageset/pay_success_icon@3x.png
  8. 51 9
      Asteria/Fuction/Cart/Cart_CheckoutC.m
  9. 42 4
      Asteria/Fuction/Cart/Cart_MyCartC.m
  10. 2 0
      Asteria/Fuction/Cart/Cell/MyCartGrandTotalCell.h
  11. 17 5
      Asteria/Fuction/Cart/Cell/MyCartGrandTotalCell.m
  12. 4 8
      Asteria/Fuction/Cart/Checkout/ASCheckoutAddressCell.m
  13. 4 2
      Asteria/Fuction/Cart/Checkout/ASCheckoutShipMethodCell.m
  14. 1 1
      Asteria/Fuction/Cart/Checkout/ASCheckoutTopView.m
  15. 3 0
      Asteria/Fuction/Cart/PayManager/ASPaypalManager.h
  16. 41 0
      Asteria/Fuction/Cart/PayManager/ASPaypalManager.m
  17. 4 0
      Asteria/Fuction/Cart/VM/CartVM.h
  18. 22 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_coupon_bg.imageset/Contents.json
  19. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_coupon_bg.imageset/goods_coupon_bg@2x.png
  20. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_coupon_bg.imageset/goods_coupon_bg@3x.png
  21. 8 0
      Asteria/Fuction/Goods/M/GoodsInformationM.h
  22. 2 2
      Asteria/Fuction/Goods/Revies/GoodsReviewsWriteC.m
  23. 1 1
      Asteria/Fuction/Goods/Target/Target_Goods.h
  24. 3 3
      Asteria/Fuction/Goods/Target/Target_Goods.m
  25. 19 0
      Asteria/Fuction/Goods/V/ASGoodsBannerCell.h
  26. 48 0
      Asteria/Fuction/Goods/V/ASGoodsBannerCell.m
  27. 28 0
      Asteria/Fuction/Goods/V/ASGoodsCouponCell.h
  28. 165 0
      Asteria/Fuction/Goods/V/ASGoodsCouponCell.m
  29. 21 0
      Asteria/Fuction/Goods/V/ASGoodsDetailsSizeCell.h
  30. 114 0
      Asteria/Fuction/Goods/V/ASGoodsDetailsSizeCell.m
  31. 47 0
      Asteria/Fuction/Goods/V/ASGoodsDetailsSizeSelView.h
  32. 548 0
      Asteria/Fuction/Goods/V/ASGoodsDetailsSizeSelView.m
  33. 18 0
      Asteria/Fuction/Goods/V/ASGoodsDetailsTableView.h
  34. 141 0
      Asteria/Fuction/Goods/V/ASGoodsDetailsTableView.m
  35. 19 0
      Asteria/Fuction/Goods/V/ASGoodsGuaranteeInfoCell.h
  36. 142 0
      Asteria/Fuction/Goods/V/ASGoodsGuaranteeInfoCell.m
  37. 23 0
      Asteria/Fuction/Goods/V/ASGoodsIntrouduceWebView.h
  38. 146 0
      Asteria/Fuction/Goods/V/ASGoodsIntrouduceWebView.m
  39. 17 0
      Asteria/Fuction/Goods/V/ASGoodsReviewHeadCell.h
  40. 57 0
      Asteria/Fuction/Goods/V/ASGoodsReviewHeadCell.m
  41. 19 0
      Asteria/Fuction/Goods/V/ASGoodsTitlePriceCell.h
  42. 166 0
      Asteria/Fuction/Goods/V/ASGoodsTitlePriceCell.m
  43. 4 4
      Asteria/Fuction/Goods/V/GoodsDetailsBottomV.m
  44. 18 0
      Asteria/Fuction/Goods/VC/ASGoodsDetailsViewController.h
  45. 234 0
      Asteria/Fuction/Goods/VC/ASGoodsDetailsViewController.m
  46. 1 0
      Asteria/Fuction/UserCenter/Orders/Controller/ASOrderDetailsViewController.h
  47. 19 0
      Asteria/Fuction/UserCenter/Orders/Controller/ASOrderDetailsViewController.m
  48. 18 0
      Asteria/Fuction/UserCenter/Orders/Controller/ASPayFailedViewController.h
  49. 47 0
      Asteria/Fuction/UserCenter/Orders/Controller/ASPayFailedViewController.m
  50. 5 2
      Asteria/Fuction/UserCenter/Orders/Model/ASOrderDetailsModel.h
  51. 6 1
      Asteria/Fuction/UserCenter/Orders/Model/ASOrderDetailsModel.m
  52. 24 6
      Asteria/Fuction/UserCenter/Orders/View/ASOrderDetailsPriceCell.m
  53. 25 0
      Asteria/Fuction/UserCenter/Orders/View/ASPayFinishHeadView.h
  54. 211 0
      Asteria/Fuction/UserCenter/Orders/View/ASPayFinishHeadView.m
  55. 1 1
      Asteria/Product/CTMediatoaTargets/CTMediator+ASTargerts.m

+ 72 - 12
Asteria.xcodeproj/project.pbxproj

@@ -124,10 +124,6 @@
 		8186564A2A5BE9790049D861 /* ASSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 818656492A5BE9790049D861 /* ASSearchViewController.m */; };
 		8186564D2A5BF6010049D861 /* ASCategoryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8186564C2A5BF6010049D861 /* ASCategoryViewController.m */; };
 		81932E2B29F7539B007C37AF /* UIColor+AS.m in Sources */ = {isa = PBXBuildFile; fileRef = 81932E2A29F7539B007C37AF /* UIColor+AS.m */; };
-		819349192BF1EB59009FDDB2 /* ASOrderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 819349182BF1EB59009FDDB2 /* ASOrderListViewController.m */; };
-		8193491C2BF1EB6F009FDDB2 /* ASOrderListSubController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8193491B2BF1EB6F009FDDB2 /* ASOrderListSubController.m */; };
-		819349212BF218B6009FDDB2 /* ASOrderListViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 819349202BF218B6009FDDB2 /* ASOrderListViewModel.m */; };
-		819349262BF34722009FDDB2 /* ASOrderListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 819349252BF34722009FDDB2 /* ASOrderListCell.m */; };
 		819349302BF59000009FDDB2 /* ASHomeViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8193492F2BF59000009FDDB2 /* ASHomeViewModel.m */; };
 		819349352BF5A679009FDDB2 /* ASJumpModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 819349342BF5A679009FDDB2 /* ASJumpModel.m */; };
 		8193D5C82BEA299F00B9AB11 /* ASAddressListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8193D5C72BEA299F00B9AB11 /* ASAddressListViewController.m */; };
@@ -214,6 +210,18 @@
 		8810F5652BF5EBF400346FD4 /* ASOrderDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5582BF5EBF400346FD4 /* ASOrderDetailsViewController.m */; };
 		8810F5662BF5EBF400346FD4 /* ASOrderListSubController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F55A2BF5EBF400346FD4 /* ASOrderListSubController.m */; };
 		8810F5672BF5EBF400346FD4 /* ASOrderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F55C2BF5EBF400346FD4 /* ASOrderListViewController.m */; };
+		8810F56A2BF5F86D00346FD4 /* ASPayFailedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5692BF5F86D00346FD4 /* ASPayFailedViewController.m */; };
+		8810F56D2BF5F8D800346FD4 /* ASPayFinishHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F56C2BF5F8D800346FD4 /* ASPayFinishHeadView.m */; };
+		8810F57E2BF74A2B00346FD4 /* ASGoodsDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F57D2BF74A2B00346FD4 /* ASGoodsDetailsViewController.m */; };
+		8810F5812BF74A5800346FD4 /* ASGoodsDetailsTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5802BF74A5800346FD4 /* ASGoodsDetailsTableView.m */; };
+		8810F5842BF74E6400346FD4 /* ASGoodsBannerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5832BF74E6400346FD4 /* ASGoodsBannerCell.m */; };
+		8810F58A2BF839C600346FD4 /* ASGoodsDetailsSizeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5892BF839C600346FD4 /* ASGoodsDetailsSizeCell.m */; };
+		8810F5902BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F58E2BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.m */; };
+		8810F5932BFB250D00346FD4 /* ASGoodsTitlePriceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5922BFB250D00346FD4 /* ASGoodsTitlePriceCell.m */; };
+		8810F5962BFB291300346FD4 /* ASGoodsCouponCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5952BFB291300346FD4 /* ASGoodsCouponCell.m */; };
+		8810F5992BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F5982BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.m */; };
+		8810F59C2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F59B2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.m */; };
+		8810F59F2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8810F59E2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.m */; };
 		8C24ECE114420CDEE7B9B22B /* Pods_Asteria.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DCE8001991D89B696E7D44 /* Pods_Asteria.framework */; };
 		9A1247942A1B082300126226 /* Fuction_Tool.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A1247932A1B082300126226 /* Fuction_Tool.m */; };
 		9A1247972A1B0A2800126226 /* AS_ForgotC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A1247962A1B0A2800126226 /* AS_ForgotC.m */; };
@@ -583,14 +591,6 @@
 		8186564C2A5BF6010049D861 /* ASCategoryViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASCategoryViewController.m; sourceTree = "<group>"; };
 		81932E2929F7539B007C37AF /* UIColor+AS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIColor+AS.h"; sourceTree = "<group>"; };
 		81932E2A29F7539B007C37AF /* UIColor+AS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIColor+AS.m"; sourceTree = "<group>"; };
-		819349172BF1EB59009FDDB2 /* ASOrderListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASOrderListViewController.h; sourceTree = "<group>"; };
-		819349182BF1EB59009FDDB2 /* ASOrderListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASOrderListViewController.m; sourceTree = "<group>"; };
-		8193491A2BF1EB6F009FDDB2 /* ASOrderListSubController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASOrderListSubController.h; sourceTree = "<group>"; };
-		8193491B2BF1EB6F009FDDB2 /* ASOrderListSubController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASOrderListSubController.m; sourceTree = "<group>"; };
-		8193491F2BF218B6009FDDB2 /* ASOrderListViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASOrderListViewModel.h; sourceTree = "<group>"; };
-		819349202BF218B6009FDDB2 /* ASOrderListViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASOrderListViewModel.m; sourceTree = "<group>"; };
-		819349242BF34722009FDDB2 /* ASOrderListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASOrderListCell.h; sourceTree = "<group>"; };
-		819349252BF34722009FDDB2 /* ASOrderListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASOrderListCell.m; sourceTree = "<group>"; };
 		8193492E2BF58FFF009FDDB2 /* ASHomeViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASHomeViewModel.h; sourceTree = "<group>"; };
 		8193492F2BF59000009FDDB2 /* ASHomeViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASHomeViewModel.m; sourceTree = "<group>"; };
 		819349332BF5A679009FDDB2 /* ASJumpModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASJumpModel.h; sourceTree = "<group>"; };
@@ -763,6 +763,30 @@
 		8810F55A2BF5EBF400346FD4 /* ASOrderListSubController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASOrderListSubController.m; sourceTree = "<group>"; };
 		8810F55B2BF5EBF400346FD4 /* ASOrderListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASOrderListViewController.h; sourceTree = "<group>"; };
 		8810F55C2BF5EBF400346FD4 /* ASOrderListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASOrderListViewController.m; sourceTree = "<group>"; };
+		8810F5682BF5F86D00346FD4 /* ASPayFailedViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASPayFailedViewController.h; sourceTree = "<group>"; };
+		8810F5692BF5F86D00346FD4 /* ASPayFailedViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASPayFailedViewController.m; sourceTree = "<group>"; };
+		8810F56B2BF5F8D800346FD4 /* ASPayFinishHeadView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASPayFinishHeadView.h; sourceTree = "<group>"; };
+		8810F56C2BF5F8D800346FD4 /* ASPayFinishHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASPayFinishHeadView.m; sourceTree = "<group>"; };
+		8810F57C2BF74A2B00346FD4 /* ASGoodsDetailsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsDetailsViewController.h; sourceTree = "<group>"; };
+		8810F57D2BF74A2B00346FD4 /* ASGoodsDetailsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsDetailsViewController.m; sourceTree = "<group>"; };
+		8810F57F2BF74A5800346FD4 /* ASGoodsDetailsTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsDetailsTableView.h; sourceTree = "<group>"; };
+		8810F5802BF74A5800346FD4 /* ASGoodsDetailsTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsDetailsTableView.m; sourceTree = "<group>"; };
+		8810F5822BF74E6400346FD4 /* ASGoodsBannerCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsBannerCell.h; sourceTree = "<group>"; };
+		8810F5832BF74E6400346FD4 /* ASGoodsBannerCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsBannerCell.m; sourceTree = "<group>"; };
+		8810F5882BF839C600346FD4 /* ASGoodsDetailsSizeCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsDetailsSizeCell.h; sourceTree = "<group>"; };
+		8810F5892BF839C600346FD4 /* ASGoodsDetailsSizeCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsDetailsSizeCell.m; sourceTree = "<group>"; };
+		8810F58E2BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASGoodsDetailsSizeSelView.m; sourceTree = "<group>"; };
+		8810F58F2BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASGoodsDetailsSizeSelView.h; sourceTree = "<group>"; };
+		8810F5912BFB250D00346FD4 /* ASGoodsTitlePriceCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsTitlePriceCell.h; sourceTree = "<group>"; };
+		8810F5922BFB250D00346FD4 /* ASGoodsTitlePriceCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsTitlePriceCell.m; sourceTree = "<group>"; };
+		8810F5942BFB291300346FD4 /* ASGoodsCouponCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsCouponCell.h; sourceTree = "<group>"; };
+		8810F5952BFB291300346FD4 /* ASGoodsCouponCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsCouponCell.m; sourceTree = "<group>"; };
+		8810F5972BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsGuaranteeInfoCell.h; sourceTree = "<group>"; };
+		8810F5982BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsGuaranteeInfoCell.m; sourceTree = "<group>"; };
+		8810F59A2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsIntrouduceWebView.h; sourceTree = "<group>"; };
+		8810F59B2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsIntrouduceWebView.m; sourceTree = "<group>"; };
+		8810F59D2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsReviewHeadCell.h; sourceTree = "<group>"; };
+		8810F59E2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsReviewHeadCell.m; sourceTree = "<group>"; };
 		9A1247922A1B082300126226 /* Fuction_Tool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Fuction_Tool.h; sourceTree = "<group>"; };
 		9A1247932A1B082300126226 /* Fuction_Tool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Fuction_Tool.m; sourceTree = "<group>"; };
 		9A1247952A1B0A2800126226 /* AS_ForgotC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_ForgotC.h; sourceTree = "<group>"; };
@@ -1905,6 +1929,8 @@
 				8810F5492BF5EBF400346FD4 /* ASOrderDetailsItemsCell.m */,
 				8810F54A2BF5EBF400346FD4 /* ASOrderDetailsPriceCell.h */,
 				8810F54B2BF5EBF400346FD4 /* ASOrderDetailsPriceCell.m */,
+				8810F56B2BF5F8D800346FD4 /* ASPayFinishHeadView.h */,
+				8810F56C2BF5F8D800346FD4 /* ASPayFinishHeadView.m */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -1938,6 +1964,8 @@
 				8810F55C2BF5EBF400346FD4 /* ASOrderListViewController.m */,
 				8810F5572BF5EBF400346FD4 /* ASOrderDetailsViewController.h */,
 				8810F5582BF5EBF400346FD4 /* ASOrderDetailsViewController.m */,
+				8810F5682BF5F86D00346FD4 /* ASPayFailedViewController.h */,
+				8810F5692BF5F86D00346FD4 /* ASPayFailedViewController.m */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -2429,6 +2457,8 @@
 				9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */,
 				9A5F52882B5F56FD007D3791 /* AS_GoodsSizeC.h */,
 				9A5F52892B5F56FD007D3791 /* AS_GoodsSizeC.m */,
+				8810F57C2BF74A2B00346FD4 /* ASGoodsDetailsViewController.h */,
+				8810F57D2BF74A2B00346FD4 /* ASGoodsDetailsViewController.m */,
 			);
 			path = VC;
 			sourceTree = "<group>";
@@ -2443,6 +2473,24 @@
 				9AD3459F2A08D55D005CA070 /* Banner */,
 				9A3F5CB92B3C192000DDB6A7 /* GoodsDetailsBottomV.h */,
 				9A3F5CBA2B3C192000DDB6A7 /* GoodsDetailsBottomV.m */,
+				8810F57F2BF74A5800346FD4 /* ASGoodsDetailsTableView.h */,
+				8810F5802BF74A5800346FD4 /* ASGoodsDetailsTableView.m */,
+				8810F5822BF74E6400346FD4 /* ASGoodsBannerCell.h */,
+				8810F5832BF74E6400346FD4 /* ASGoodsBannerCell.m */,
+				8810F5912BFB250D00346FD4 /* ASGoodsTitlePriceCell.h */,
+				8810F5922BFB250D00346FD4 /* ASGoodsTitlePriceCell.m */,
+				8810F5942BFB291300346FD4 /* ASGoodsCouponCell.h */,
+				8810F5952BFB291300346FD4 /* ASGoodsCouponCell.m */,
+				8810F59A2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.h */,
+				8810F59B2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.m */,
+				8810F5882BF839C600346FD4 /* ASGoodsDetailsSizeCell.h */,
+				8810F5892BF839C600346FD4 /* ASGoodsDetailsSizeCell.m */,
+				8810F58F2BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.h */,
+				8810F58E2BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.m */,
+				8810F5972BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.h */,
+				8810F5982BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.m */,
+				8810F59D2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.h */,
+				8810F59E2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.m */,
 			);
 			path = V;
 			sourceTree = "<group>";
@@ -2841,6 +2889,7 @@
 				81E257EE2A120756004EEF71 /* ASUserCenterTopView.m in Sources */,
 				81C326622A36B33B002EF442 /* ASHomeActiveView.m in Sources */,
 				81DFA56A2A46D82200DA708B /* ASPointDetailTableView.m in Sources */,
+				8810F57E2BF74A2B00346FD4 /* ASGoodsDetailsViewController.m in Sources */,
 				9AD346042A08D60F005CA070 /* ZFKVOController.m in Sources */,
 				81717CA12A3C0A3500648139 /* KWProductMenuFilterItemHeaderView.m in Sources */,
 				81C326662A36B794002EF442 /* VerScrollTextView.m in Sources */,
@@ -2849,6 +2898,7 @@
 				81717D372A3D322700648139 /* KWHisCollectHeaderView.m in Sources */,
 				8810F5212BEDABFA00346FD4 /* ASCheckoutCommentCell.m in Sources */,
 				9AD346132A08D60F005CA070 /* ZFLoadingView.m in Sources */,
+				8810F5902BF83D0400346FD4 /* ASGoodsDetailsSizeSelView.m in Sources */,
 				9ACBEC212A14585300A8F97A /* CTMediator+ASTargerts.m in Sources */,
 				8134C1AD2A13094F006EB0EC /* Target_userCenter.m in Sources */,
 				81E257F32A120975004EEF71 /* ASUserBaseInfoView.m in Sources */,
@@ -2918,10 +2968,13 @@
 				9AD346002A08D60F005CA070 /* ZFPresentTransition.m in Sources */,
 				81717D112A3C4AE000648139 /* KWSearchViewModel.m in Sources */,
 				9A337E3B2A04EE1A00D058A5 /* BViewController.m in Sources */,
+				8810F56A2BF5F86D00346FD4 /* ASPayFailedViewController.m in Sources */,
 				8810F52C2BF1A1CD00346FD4 /* ASAddGiftGoodsView.m in Sources */,
 				9A31EDFD2B468A55009F11EE /* RadioButton.m in Sources */,
+				8810F59C2BFB3A4500346FD4 /* ASGoodsIntrouduceWebView.m in Sources */,
 				9AD345A72A08D571005CA070 /* TYPageControl.m in Sources */,
 				81354C0A2A289C350082C93A /* KWScrollOffsetView.m in Sources */,
+				8810F5962BFB291300346FD4 /* ASGoodsCouponCell.m in Sources */,
 				81354C032A289A070082C93A /* HomeFilterModel.m in Sources */,
 				9A5F528A2B5F56FD007D3791 /* AS_GoodsSizeC.m in Sources */,
 				8131A2932B3950DA00A191BE /* ASExtraPointsModel.m in Sources */,
@@ -2952,12 +3005,14 @@
 				81E5EE942A4A760D0075695F /* ASVipCenterLineItemView.m in Sources */,
 				9A3F5CBB2B3C192000DDB6A7 /* GoodsDetailsBottomV.m in Sources */,
 				81601FFF2A2DC8E700E4A8F1 /* ASHomeBannerCell.m in Sources */,
+				8810F5992BFB2B2400346FD4 /* ASGoodsGuaranteeInfoCell.m in Sources */,
 				812021212B16CD630026B8B5 /* ASSginViewModel.m in Sources */,
 				9AF9085F2B3976F3008AC2D2 /* RYBaseVM.m in Sources */,
 				81CE28972AF4953C0012AA45 /* ASGiftCardModel.m in Sources */,
 				9AD6A5442A1218E8001DE3D9 /* PassWordSecureBtnV.m in Sources */,
 				811F42462A40533C00DA68F1 /* ASPointsHomeViewController.m in Sources */,
 				8131A2802B3687EE00A191BE /* ASCustomWindow.m in Sources */,
+				8810F58A2BF839C600346FD4 /* ASGoodsDetailsSizeCell.m in Sources */,
 				816D0C9A2AF3901C00395B5B /* ASGiftCardListViewController.m in Sources */,
 				81C796372A5517B0003083B8 /* ASSettingListCell.m in Sources */,
 				81717D392A3D322700648139 /* KWCustomLayout.m in Sources */,
@@ -2980,6 +3035,7 @@
 				81C7963F2A551FB0003083B8 /* ASInfomationSetController.m in Sources */,
 				8131A27C2B365F7700A191BE /* ASProductListCategoryModel.m in Sources */,
 				9A98E5072B5A15A500E8C5C1 /* QDSingleImagePickerPreviewViewController.m in Sources */,
+				8810F56D2BF5F8D800346FD4 /* ASPayFinishHeadView.m in Sources */,
 				9AD346062A08D60F005CA070 /* ZFReachabilityManager.m in Sources */,
 				81717CA52A3C0A5000648139 /* KWProductFilterItemCell.m in Sources */,
 				812021252B185A610026B8B5 /* ASCouponsListViewModel.m in Sources */,
@@ -3001,11 +3057,13 @@
 				81354BF52A287BED0082C93A /* KWMineHomeOrderSubView.m in Sources */,
 				9AD345A82A08D571005CA070 /* TYCyclePagerView.m in Sources */,
 				8810F55F2BF5EBF400346FD4 /* ASOrderDetailsItemsCell.m in Sources */,
+				8810F5812BF74A5800346FD4 /* ASGoodsDetailsTableView.m in Sources */,
 				9AD346202A08E30E005CA070 /* SelectVCollectionViewCell.m in Sources */,
 				81601FFB2A2DC78300E4A8F1 /* WMZBannerOverLayout.m in Sources */,
 				81354C002A2899CB0082C93A /* KWMineMoreProductModel.m in Sources */,
 				81717D362A3D322700648139 /* KWLenovoWordListView.m in Sources */,
 				8134C1BA2A1372A7006EB0EC /* ASUserCenterEnterItemV.m in Sources */,
+				8810F5932BFB250D00346FD4 /* ASGoodsTitlePriceCell.m in Sources */,
 				8127ADDB2B1193A300464D27 /* ASNetTools.m in Sources */,
 				812021152B14659A0026B8B5 /* ASUserInfoManager.m in Sources */,
 				9AD3460A2A08D60F005CA070 /* ZFUtilities.m in Sources */,
@@ -3015,6 +3073,7 @@
 				9A337E3A2A04EE1A00D058A5 /* Target_B.m in Sources */,
 				8186564D2A5BF6010049D861 /* ASCategoryViewController.m in Sources */,
 				9AD6A5452A1218E8001DE3D9 /* EamilTFmatchV.m in Sources */,
+				8810F5842BF74E6400346FD4 /* ASGoodsBannerCell.m in Sources */,
 				9AD345FF2A08D60F005CA070 /* ZFPlayerNotification.m in Sources */,
 				81717D282A3C55CC00648139 /* CTMediator+Categorys.m in Sources */,
 				9AD346092A08D60F005CA070 /* ZFAVPlayerManager.m in Sources */,
@@ -3058,6 +3117,7 @@
 				81717C9C2A3BF1F100648139 /* ASHomeAlertViewController.m in Sources */,
 				8810F5092BEB159600346FD4 /* ASCheckoutTopView.m in Sources */,
 				8810F5612BF5EBF400346FD4 /* ASOrderListCell.m in Sources */,
+				8810F59F2BFC7D7600346FD4 /* ASGoodsReviewHeadCell.m in Sources */,
 				9AD345FC2A08D60F005CA070 /* ZFPlayerLogManager.m in Sources */,
 				8193D5C82BEA299F00B9AB11 /* ASAddressListViewController.m in Sources */,
 				9A78E0142B6389FC00CA4E32 /* Cart_MyCartC.m in Sources */,

+ 22 - 0
Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_failed_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "pay_failed_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "pay_failed_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_failed_icon.imageset/pay_failed_icon@2x.png


二進制
Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_failed_icon.imageset/pay_failed_icon@3x.png


+ 22 - 0
Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_success_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "pay_success_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "pay_success_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_success_icon.imageset/pay_success_icon@2x.png


二進制
Asteria/Fuction/Cart/Cart.xcassets/Checkout/pay_success_icon.imageset/pay_success_icon@3x.png


+ 51 - 9
Asteria/Fuction/Cart/Cart_CheckoutC.m

@@ -7,6 +7,8 @@
 
 #import "Cart_CheckoutC.h"
 #import "ASAddressListViewController.h"
+#import "ASPayFailedViewController.h"
+#import "ASOrderDetailsViewController.h"
 
 #import "ASCheckoutTopView.h"
 #import "ASCheckoutBottomView.h"
@@ -130,6 +132,10 @@
                 }
             }
             [self requestSetShipMethodByAddress];
+        } else if ([data isKindOfClass:[MyCartGrandTotalCellData class]]){
+//            MyCartGrandTotalCellData *totalData = (MyCartGrandTotalCellData *)data;
+            //丢件险
+            [self requestLostExtraFee:num];
         }
     };
     
@@ -219,8 +225,6 @@
                 firstModel.isSelect = YES;
                 self.shipmethodCellM.shipMethodModel = firstModel;
                 
-                self.shipmethodCellM.shipmethodSymbol = self.totalsM.currency_symbol;
-                
                 if (self.addressCellM.addressModel) {
                     //默认设置第一个运输方式
                     [self requestSetShipMethodByAddress];
@@ -235,7 +239,8 @@
                || [mark isEqualToString:Chectout_PUT_usePoints]
                || [mark isEqualToString:Chectout_DEL_cancelusePoints]
                || [mark isEqualToString:Chectout_setShipMethod]
-               || [mark isEqualToString:Chectout_giftAddCart]){
+               || [mark isEqualToString:Chectout_giftAddCart]
+               || [mark isEqualToString:Chectout_lost_extrafee]){
         if(sucessOrFail){
             if ([mark isEqualToString:Chectout_giftAddCart]) {
                 self.index --;
@@ -272,17 +277,16 @@
 
 - (void)updateData{
     
-    [self.topView setTopViewData:self.totalsM.items_qty price:[NSString stringWithFormat:@"%@%@",self.totalsM.currency_symbol,self.totalsM.subtotal]];
+    [self.topView setTopViewData:AS_String_NotNull(self.totalsM.items_qty) price:[NSString stringWithFormat:@"%@%@",AS_String_NotNull(self.totalsM.currency_symbol),AS_String_NotNull(self.totalsM.subtotal)]];
     
     [self.TableV.infodata removeAllObjects];
     self.TableV.infodata = [NSMutableArray arrayWithArray:self.totalsM.items];
     
     //邮寄地址--邮寄方式
-    if (self.addressCellM.addressModel) {
-        [self.TableV.infodata addObject:self.addressCellM];
-    }
+    [self.TableV.infodata addObject:self.addressCellM];
     
     //运输方式
+    self.shipmethodCellM.shipmethodSymbol = self.totalsM.currency_symbol;
     [self.TableV.infodata addObject:self.shipmethodCellM];
     
     //优惠券
@@ -496,16 +500,32 @@
     
     [MBProgressHUD showHUDAddedTo:self.view animated:YES];
     NSDictionary *param = @{@"method":paymentCode};
-    
+    K_WEAK_SELF;
     [ASNetTools.shared putWithPath:Chectout_PUT_sureOrder param:@{@"paymentMethod":param} success:^(id _Nonnull json) {
+        K_STRONG_SELF;
         [MBProgressHUD hideHUDForView:self.view animated:YES];
         NSLog(@"=======%@", json);
         
+        [self paymentResultStatus:[json objectForKey:@"data"]];
+        
     } faild:^(NSString * _Nonnull code, NSString * _Nonnull msg) {
+        K_STRONG_SELF;
         [MBProgressHUD hideHUDForView:self.view animated:YES];
         NSLog(@"=======%@=====%@", code, msg);
+        [self paymentResultStatus:@""];
     }];
-    
+}
+
+- (void)paymentResultStatus:(NSString *)orderid {
+    if (AS_String_valid(orderid)) {
+        ASOrderDetailsViewController *paySuccessVC = [[ASOrderDetailsViewController alloc] init];
+        paySuccessVC.orderId = orderid;
+        paySuccessVC.isPay = YES;
+        [self.navigationController pushViewController:paySuccessVC animated:YES];
+    } else {
+        ASPayFailedViewController *payFailedVC = [[ASPayFailedViewController alloc] init];
+        [self.navigationController pushViewController:payFailedVC animated:YES];
+    }
 }
 
 //请求赠品商品详情
@@ -528,8 +548,30 @@
         self.giftShowCount = 2;
         [self.VM ry_formDataRequestPostApi:Chectout_giftAddCart param:param];
     }
+}
+
+//丢件险
+- (void)requestLostExtraFee:(BOOL)isOpen {
+    NSDictionary *address = @{@"countryId":AS_String_valid(self.addressCellM.addressModel.country_id) ? AS_String_NotNull(self.addressCellM.addressModel.country_id) : @"US",
+                              @"region":AS_String_NotNull(self.addressCellM.addressModel.region.region),
+                              @"postcode":AS_String_NotNull(self.addressCellM.addressModel.postcode),
+                              @"city":AS_String_NotNull(self.addressCellM.addressModel.city)};
+    NSDictionary *addressInformation = @{@"address":address,
+                                         @"shipping_method_code":AS_String_valid(self.shipmethodCellM.shipMethodModel.method_code) ? self.shipmethodCellM.shipMethodModel.method_code : @"bestway",
+                                         @"shipping_carrier_code":AS_String_valid(self.shipmethodCellM.shipMethodModel.carrier_code) ? self.shipmethodCellM.shipMethodModel.carrier_code : @"tablerate"};
     
+    NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithCapacity:1];
+    if(isOpen ==0){ //取消丢件险
+        NSDictionary *information = @{@"fee_id":@(1), @"options_ids":@[]};
+        [params addEntriesFromDictionary:@{@"information":information}];
+    }else if(isOpen == 1){//打开丢件险
+        NSDictionary *information = @{@"fee_id":@(1), @"options_ids":@[@"1"]};
+        [params addEntriesFromDictionary:@{@"information":information}];
+    }
+    [params setValue:addressInformation forKey:@"addressInformation"];
     
+    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
+    [self.VM ry_requestPostApi:Chectout_lost_extrafee param:params];
 }
 
 #pragma mark --- 懒加载 ---

+ 42 - 4
Asteria/Fuction/Cart/Cart_MyCartC.m

@@ -14,6 +14,8 @@
 
 #import "ASAddGiftGoodsView.h"
 
+#import "ASGoodsDetailsViewController.h"
+
 @interface Cart_MyCartC ()<RY_baseVMprotocol>
 @property (nonatomic, strong) CartVM *VM;
 @property (nonatomic, strong) UIView *topBgV;
@@ -93,14 +95,21 @@
                 default:
                     break;
             }
-        }else if ([data isKindOfClass:[MyCartCouponCellData class]]){
+        } else if ([data isKindOfClass:[MyCartCouponCellData class]]){
             MyCartCouponCellData *couponM = (MyCartCouponCellData *)data;
             if(num ==0){ //使用优惠券
                 [self reqNet_PUT_cartsMineCoupons:couponM.coupon_code];
             }else if(num == 1){//删除优惠券
                 [self reqNet_DEL_cartsMineCoupons];
             }
+        } else if ([data isKindOfClass:[MyCartGrandTotalCellData class]]){
+            MyCartGrandTotalCellData *totalData = (MyCartGrandTotalCellData *)data;
+            
+            [self requestLostExtraFee:num];
         }
+        
+        
+        
     };
 }
 - (void)ucm_bindvmmodel{
@@ -144,6 +153,30 @@
     [self.VM ry_requestDeleteApi:DEL_cartsMineCoupons paramStr:@""];
 }
 
+//丢件险
+- (void)requestLostExtraFee:(BOOL)isOpen {
+    
+    NSDictionary *address = @{@"countryId":@"US",
+                              @"postcode":@"*"};
+    NSDictionary *addressInformation = @{@"address":address,
+                                         @"shipping_method_code":@"bestway",
+                                         @"shipping_carrier_code":@"tablerate"};
+    
+    NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithCapacity:1];
+    if(isOpen ==0){ //取消丢件险
+        NSDictionary *information = @{@"fee_id":@(1), @"options_ids":@[]};
+        [params addEntriesFromDictionary:@{@"information":information}];
+    }else if(isOpen == 1){//打开丢件险
+        NSDictionary *information = @{@"fee_id":@(1), @"options_ids":@[@"1"]};
+        [params addEntriesFromDictionary:@{@"information":information}];
+    }
+    [params setValue:addressInformation forKey:@"addressInformation"];
+    
+    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
+    [self.VM ry_requestPostApi:Chectout_lost_extrafee param:params];
+}
+
+
 //请求赠品商品详情
 -(void)reqNet_GoodsDetails_productGetProduct:(NSString *)enterId{
     NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
@@ -218,7 +251,8 @@
     }else if ([mark isEqualToString:Cart_cartsMineItems_Post]
               || [mark isEqualToString:DEL_cartsMineItems]
               || [mark isEqualToString:PUT_cartsMineCoupons]
-              || [mark isEqualToString:Chectout_giftAddCart]){
+              || [mark isEqualToString:Chectout_giftAddCart]
+              || [mark isEqualToString:Chectout_lost_extrafee]){
         if(sucessOrFail){
             
             if ([mark isEqualToString:Chectout_giftAddCart]) {
@@ -264,8 +298,12 @@
         if(itemM.isGift){
             return;
         }
-        UIViewController *viewController = [[CTMediator sharedInstance] Goods_GoodsDetailsC:@{@"entity_id":itemM.product_id}];
-        [self.navigationController pushViewController:viewController animated:YES];
+//        UIViewController *viewController = [[CTMediator sharedInstance] Goods_GoodsDetailsC:@{@"entity_id":itemM.product_id}];
+//        [self.navigationController pushViewController:viewController animated:YES];
+        
+        ASGoodsDetailsViewController *goodsVC = [[ASGoodsDetailsViewController alloc] init];
+        goodsVC.entity_id = itemM.product_id;
+        [self.navigationController pushViewController:goodsVC animated:YES];
     }
 }
 

+ 2 - 0
Asteria/Fuction/Cart/Cell/MyCartGrandTotalCell.h

@@ -16,6 +16,8 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 @interface MyCartGrandTotalCell : TT_BaseCell
 
+@property (nonatomic, strong) MyCartGrandTotalCellData *totalData;
+
 @end
 
 

+ 17 - 5
Asteria/Fuction/Cart/Cell/MyCartGrandTotalCell.m

@@ -54,6 +54,7 @@
   
     [self.subLostV mas_makeConstraints:^(MASConstraintMaker *make) {
         make.height.mas_equalTo(60);
+        make.right.mas_equalTo(10);
     }];
     [self.subBottomV mas_makeConstraints:^(MASConstraintMaker *make) {
         make.height.mas_equalTo(60);
@@ -62,15 +63,24 @@
 
 - (void)configData:(id)Data{
     MyCartGrandTotalCellData *model = (MyCartGrandTotalCellData *)Data;
+    
+    self.totalData = model;
 ///当一个元素被 removeFromSuperview ,则 arrangedSubviews也会同步移除
     [self.stackSubTopV.arrangedSubviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
     for (int i=0; i<model.total_segments.count; i++) {
         NSDictionary *dic = model.total_segments[i];
         NSString *code = MM_str(dic[@"code"]);
         if([code isEqualToString:@"amasty_extrafee"]){ //subLostV
-            NSString *tips = [NSString stringWithFormat:@"%@%@%@",dic[@"title"],model.currency_symbol,dic[@"value"]];
+            
+            if ([dic[@"value"] qmui_CGFloatValue] > 0) {
+                NSString *tips = [NSString stringWithFormat:@"%@%@%@",dic[@"title"],model.currency_symbol,dic[@"value"]];
+                [self.subLostV xxx_configTips:tips isLost:YES];
+            } else {
+                [self.subLostV xxx_configTips:@"Extra Fee (insurance for lost)" isLost:NO];
+            }
+            
             //wm_todo 需要 获取丢件险状态 carts/mine/fees-information 
-            [self.subLostV xxx_configTips:tips isLost:[dic[@"value"] qmui_CGFloatValue] > 0 ? YES : NO];
+            
         }else if ([code isEqualToString:@"grand_total"]){ //subBottomV
             NSString *priceStr = [NSString stringWithFormat:@"%@%@",model.currency_symbol,dic[@"value"]];
             [self.subBottomV xxx_configTips:dic[@"title"] price:priceStr];
@@ -136,10 +146,12 @@
     if (!_subLostV) {
         _subLostV = [[SubLoastSelectItemV alloc] init];
         _subLostV.backgroundColor = [UIColor colorWithHexString:@"#FFFFFF"];
+        K_WEAK_SELF;
         _subLostV.ViewtapClose = ^(NSInteger num, id  _Nonnull data) {
-            NSLog(@"=====%ld=====%@", num, data);
-            
-            
+            K_STRONG_SELF;
+            if(self.currencyparameterClose){
+                self.currencyparameterClose(num, self.totalData);
+            }
         };
     }
     return _subLostV;

+ 4 - 8
Asteria/Fuction/Cart/Checkout/ASCheckoutAddressCell.m

@@ -80,15 +80,11 @@
     if (addressModel) {
         NSString *addressInfoStr = [NSString stringWithFormat:@"%@ %@ %@ %@,%@ tel:%@", addressModel.firstname, addressModel.lastname, [addressModel.street componentsJoinedByString:@" "], addressModel.city, addressModel.postcode, addressModel.telephone];
         
-        if (NIL(addressInfoStr)) {
-            _addressLab.textColor = [UIColor getColor:@"#E60013"];
-            _addressLab.text = @"Please fill in your address";
-        } else {
-            _addressLab.textColor = _0B0B0B;
-            _addressLab.text = addressInfoStr;
-        }
+        _addressLab.textColor = _0B0B0B;
+        _addressLab.text = addressInfoStr;
     } else {
-        _addressLab.text = @"--";
+        _addressLab.textColor = [UIColor getColor:@"#E60013"];
+        _addressLab.text = @"Please fill in your address";
     }
     
     

+ 4 - 2
Asteria/Fuction/Cart/Checkout/ASCheckoutShipMethodCell.m

@@ -58,13 +58,15 @@
     
     float floatY = 0;
     
+    [self.shipMethodView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
+    
     for (int i = 0; i < model.shipMethodArray.count; i++) {
         ASCheckoutShipMethodModel *shipModel = model.shipMethodArray[i];
         
         ASShipMethodItem *shipItem = [[ASShipMethodItem alloc] initWithFrame:CGRectMake(0, floatY, KScreenWidth - 20, 53)];
         [_shipMethodView addSubview:shipItem];
         
-        [shipItem setShipItemData:shipModel symbol:model.shipmethodSymbol];
+        [shipItem setShipItemData:shipModel symbol:AS_String_NotNull(model.shipmethodSymbol)];
         shipItem.selectBtn.tag = i;
         [shipItem.selectBtn addTarget:self action:@selector(_selectShipMethod:) forControlEvents:UIControlEventTouchUpInside];
         
@@ -150,7 +152,7 @@
 
 - (void)setShipItemData:(ASCheckoutShipMethodModel *)shipModel symbol:(NSString *)symbol {
     
-    _shipMethodLab.text = [NSString stringWithFormat:@"%@ %@", shipModel.method_title, shipModel.carrier_title];
+    _shipMethodLab.text = [NSString stringWithFormat:@"%@ %@", AS_String_NotNull(shipModel.method_title), AS_String_NotNull(shipModel.carrier_title)];
     _shipPriceLab.text = [NSString stringWithFormat:@"%@%@", symbol, shipModel.amount];
     
     _selectBtn.selected = shipModel.isSelect;

+ 1 - 1
Asteria/Fuction/Cart/Checkout/ASCheckoutTopView.m

@@ -49,7 +49,7 @@
     return self;
 }
 - (void)setTopViewData:(NSString *)itemCount price:(NSString *)priceStr {
-    _countLab.text = [NSString stringWithFormat:@"show order items (%@)", itemCount];
+    _countLab.text = [NSString stringWithFormat:@"show order items (%@)", AS_String_valid(itemCount) ? AS_String_NotNull(itemCount) : @"0"];
     
     _priceLab.text = priceStr;
 }

+ 3 - 0
Asteria/Fuction/Cart/PayManager/ASPaypalManager.h

@@ -11,6 +11,9 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface ASPaypalManager : NSObject
 
+
+- (void)checkoutPayWithMethodType:(NSString *)payType completion:(void (^ __nullable)(NSUInteger isSucess , id payData))completion;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 41 - 0
Asteria/Fuction/Cart/PayManager/ASPaypalManager.m

@@ -10,4 +10,45 @@
 
 @implementation ASPaypalManager
 
+
+- (void)checkoutPayWithMethodType:(NSString *)payType completion:(void (^ __nullable)(NSUInteger isSucess , id payData))completion {
+    if ([payType isEqualToString:@"paypal_express"]) {//paypal
+        K_WEAK_SELF;
+        [ASNetTools.shared postWithPath:postTakeExtraPoints param:@{@"type": @"123"} success:^(id _Nonnull json) {
+            
+        } faild:^(NSString * _Nonnull code, NSString * _Nonnull msg) {
+            
+        }];
+        
+    } else if ([payType isEqualToString:@"stripe_payments"]) {//visa
+        
+    } else if ([payType isEqualToString:@"afterpay_payment"]) {//afterpay
+        
+    } else if ([payType isEqualToString:@"klarna_kco"]) {//klarna
+        
+    } else {
+        
+    }
+}
+
+
+- (void)tool_gotoWebPay:(NSString *)urlStr withVC:(UIViewController *)tmpvc completion:(void (^ __nullable)(NSUInteger isSucess , id payData))completion{
+    XXX_BaseWebC *vc = [[XXX_BaseWebC alloc] init];
+    vc.isPayType = YES;
+    vc.WebViewBlock = ^(NSUInteger status, id  _Nonnull webData) {
+        if(status == 1){
+            if(completion){
+                completion(1, webData);
+            }
+        }else{
+            if(completion){
+                completion(0, webData);
+            }
+        }
+    };
+    [vc xxx_dsWebLoadUrl:urlStr];
+    vc.modalPresentationStyle = UIModalPresentationFullScreen;
+    [tmpvc presentViewController:vc animated:YES completion:nil];
+}
+
 @end

+ 4 - 0
Asteria/Fuction/Cart/VM/CartVM.h

@@ -42,6 +42,10 @@
 //赠品手动加车
 #define Chectout_giftAddCart         BaseRequestrUrl(@"addGiftProduct")
 
+//丢件险
+#define Chectout_lost_extrafee       @"rest/en/V1/amasty_extrafee/carts/mine/totals-information"
+
+
 NS_ASSUME_NONNULL_BEGIN
 
 @interface CartVM : RYBaseVM

+ 22 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_coupon_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "goods_coupon_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "goods_coupon_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_coupon_bg.imageset/goods_coupon_bg@2x.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_coupon_bg.imageset/goods_coupon_bg@3x.png


+ 8 - 0
Asteria/Fuction/Goods/M/GoodsInformationM.h

@@ -51,13 +51,21 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, strong) NSArray <OptionsValuesM *>*values;
 @property (nonatomic, assign) NSInteger optionSelectTag;
 
+@property (nonatomic, copy) NSString *is_require;
+
+@property (nonatomic, assign) BOOL isLongValue;
 
 @end
 
 @interface OptionsValuesM : NSObject
+
 @property (nonatomic, copy) NSString *title;
 @property (nonatomic, copy) NSString *option_type_id;
 @property (nonatomic, assign) double price;
 
+//@property (nonatomic, copy) NSString *price;
+@property (nonatomic, copy) NSString *price_type;
+@property (nonatomic, copy) NSString *sku;
+
 @end
 NS_ASSUME_NONNULL_END

+ 2 - 2
Asteria/Fuction/Goods/Revies/GoodsReviewsWriteC.m

@@ -6,7 +6,7 @@
 //
 
 #import "GoodsReviewsWriteC.h"
-#import "AS_GoodsDetailsC.h"
+#import "ASGoodsDetailsViewController.h"
 #import "HCSStarRatingView.h"
 #import "GoodWritUpImgV.h"
 #import <QMUIKit/QMUIImagePickerPreviewViewController.h>
@@ -296,7 +296,7 @@ RY_baseVMprotocol>
                 @strongify(self)
                 NSArray *tmpVcAry = self.navigationController.viewControllers;
                 for(UIViewController *vc in tmpVcAry){
-                    if([vc isKindOfClass:[AS_GoodsDetailsC class]]){
+                    if([vc isKindOfClass:[ASGoodsDetailsViewController class]]){
                         [self.navigationController popToViewController:vc animated:YES];
                         return;
                     }

+ 1 - 1
Asteria/Fuction/Goods/Target/Target_Goods.h

@@ -10,7 +10,7 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @interface Target_Goods : NSObject
-- (UIViewController *)Action_AS_GoodsDetailsC:(NSDictionary *)params;
+- (UIViewController *)Action_ASGoodsDetailsViewController:(NSDictionary *)params;
 - (UIViewController *)Action_AS_GoodsSizeC:(NSDictionary *)params;
 
 - (UIViewController *)Action_WriteReview:(NSDictionary *)params;

+ 3 - 3
Asteria/Fuction/Goods/Target/Target_Goods.m

@@ -6,13 +6,13 @@
 //
 
 #import "Target_Goods.h"
-#import "AS_GoodsDetailsC.h"
+#import "ASGoodsDetailsViewController.h"
 #import "AS_GoodsSizeC.h"
 #import "GoodsReviewsWriteC.h"
 
 @implementation Target_Goods
-- (UIViewController *)Action_AS_GoodsDetailsC:(NSDictionary *)params{
-    AS_GoodsDetailsC *vc = [[AS_GoodsDetailsC alloc]init];
+- (UIViewController *)Action_ASGoodsDetailsViewController:(NSDictionary *)params{
+    ASGoodsDetailsViewController *vc = [[ASGoodsDetailsViewController alloc]init];
     vc.entity_id = params[@"entity_id"];
     return vc;
 }

+ 19 - 0
Asteria/Fuction/Goods/V/ASGoodsBannerCell.h

@@ -0,0 +1,19 @@
+//
+//  ASGoodsBannerCell.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/17.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsBannerCell : TT_BaseCell
+
+@property (nonatomic, strong) GoodsInformationM *infoModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 48 - 0
Asteria/Fuction/Goods/V/ASGoodsBannerCell.m

@@ -0,0 +1,48 @@
+//
+//  ASGoodsBannerCell.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/17.
+//
+
+#import "ASGoodsBannerCell.h"
+#import "WKM_goodsBanner.h"
+
+@interface ASGoodsBannerCell()
+
+@property (nonatomic, strong) WKM_goodsBanner *goodsBanner;
+
+@end
+
+@implementation ASGoodsBannerCell
+
+- (void)setupSubviewS{
+    
+    self.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    
+    
+    [self.contentView addSubview:self.goodsBanner];
+    
+    [self.goodsBanner mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.top.mas_equalTo(0);
+        make.width.mas_equalTo(KScreenWidth);
+        make.height.mas_equalTo(KScreenWidth+112+10);
+        make.bottom.mas_equalTo(0);
+    }];
+}
+
+- (void)configData:(id)Data{
+    GoodsInformationM *model = (GoodsInformationM *)Data;
+    
+    [self.goodsBanner tt_confignewdata:model];
+}
+
+
+- (WKM_goodsBanner *)goodsBanner {
+    if (!_goodsBanner) {
+        _goodsBanner = [[WKM_goodsBanner alloc] init];
+    }
+    return _goodsBanner;
+}
+
+@end

+ 28 - 0
Asteria/Fuction/Goods/V/ASGoodsCouponCell.h

@@ -0,0 +1,28 @@
+//
+//  ASGoodsCouponCell.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsInformationM.h"
+
+@class ASGoodsCouponItemView;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsCouponCell : TT_BaseCell
+
+- (void)configData:(id)Data isSelect:(BOOL)isSelect;
+
+@end
+
+
+@interface ASGoodsCouponItemView : UIView
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 165 - 0
Asteria/Fuction/Goods/V/ASGoodsCouponCell.m

@@ -0,0 +1,165 @@
+//
+//  ASGoodsCouponCell.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import "ASGoodsCouponCell.h"
+
+@interface ASGoodsCouponCell()
+
+@property (nonatomic, strong) UIView *backView;
+@property (nonatomic, strong) UILabel *titleLab;
+@property (nonatomic, strong) UILabel *titleDescLab;
+@property (nonatomic, strong) UIButton *rTopBtn;
+
+@property (nonatomic, strong) UIView *couponView;
+
+@end
+
+@implementation ASGoodsCouponCell
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
+        _backView = [[UIView alloc] init];
+        TT_ViewRadius(_backView, 8);
+        _backView.backgroundColor = _113632;
+        [self.contentView addSubview:_backView];
+        [_backView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(10);
+            make.top.mas_equalTo(10);
+            make.right.mas_equalTo(-10);
+//            make.height.mas_equalTo(45);
+            make.bottom.mas_equalTo(0);
+        }];
+        
+        _titleLab = [UILabel labelCreateWithText:@"COUPON" font:[UIFont fontWithName:Rob_Bold size:14] textColor:Col_FFF];
+        _titleDescLab.adjustsFontSizeToFitWidth = YES;
+        [_backView addSubview:_titleLab];
+        [_titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(10);
+            make.top.mas_equalTo(12);
+            make.height.mas_equalTo(20);
+            make.width.mas_equalTo(60);
+        }];
+        
+        _titleDescLab = [UILabel labelCreateWithText:@"All wigs 10% off   code:wkwig" font:[UIFont fontWithName:Rob_Regular size:12] textColor:Col_FFF];
+        _titleDescLab.adjustsFontSizeToFitWidth = YES;
+        [_backView addSubview:_titleDescLab];
+        [_titleDescLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(_titleLab.mas_right).offset(4);
+            make.centerY.mas_equalTo(_titleLab);
+            make.right.mas_equalTo(-40);
+        }];
+        
+        _rTopBtn = [[UIButton alloc]init];
+//        _rTopBtn.selected = NO;
+        [_rTopBtn addTarget:self action:@selector(_couponEvent:) forControlEvents:UIControlEventTouchUpInside];
+        [_rTopBtn setImage:[UIImage imageNamed:@"base_add_white"] forState:UIControlStateNormal];
+        [_rTopBtn setImage:[UIImage imageNamed:@"base_subtract_white"] forState:UIControlStateSelected];
+        [_backView addSubview:_rTopBtn];
+        [_rTopBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.centerY.equalTo(_titleLab);
+            make.right.mas_equalTo(0);
+            make.width.mas_equalTo(40);
+            make.height.mas_equalTo(30);
+        }];
+        
+        _couponView = [[UIView alloc] init];
+        _couponView.backgroundColor = [UIColor clearColor];
+        [_backView addSubview:_couponView];
+        [_couponView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.bottom.mas_equalTo(0);
+            make.height.mas_equalTo(1);
+            make.top.mas_equalTo(_titleLab.mas_bottom).offset(12);
+            make.bottom.mas_equalTo(0);
+        }];
+    }
+    return self;
+}
+
+- (void)setupSubviewS {
+    
+    
+    
+}
+
+- (void)configData:(id)Data isSelect:(BOOL)isSelect{
+    GoodsInformationM *model = (GoodsInformationM *)Data;
+    
+    self.rTopBtn.selected = isSelect;
+    
+    if (self.rTopBtn.selected) {//展开
+        
+        
+        
+        NSArray *array = @[@"1", @"2",  @"3",  @"4",  @"5",  @"6"];
+        
+        float itemWidth = (KScreenWidth - 50)/2;
+        float itemX = 10;
+        float itemY = 10;
+        for (int i = 0; i < array.count; i++) {
+            ASGoodsCouponItemView *itemView = [[ASGoodsCouponItemView alloc] initWithFrame:CGRectMake(itemX, itemY, itemWidth, 100)];
+            [_couponView addSubview:itemView];
+            
+            if (i % 2 == 1) {
+                itemX = 10;
+                itemY = itemY + 100 + 10;
+            } else {
+                itemX = itemX + itemWidth + 10;
+            }
+            
+            
+        }
+        
+        if (array.count % 2 != 0) {
+            itemY = itemY + 100 + 10;
+        }
+        
+        [_couponView mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(itemY);
+        }];
+        
+    } else {//收起
+        
+        [self.couponView mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(1);
+        }];
+    }
+}
+
+- (void)_couponEvent:(UIButton *)button {
+//    button.selected = !button.selected;
+    self.rTopBtn.selected = !self.rTopBtn.selected;
+//    TT_ViewRadius(self.backView, 0);
+    if (self.currencyparameterClose) {
+        self.currencyparameterClose(self.rTopBtn.selected, nil);
+    }
+}
+
+@end
+
+@interface ASGoodsCouponItemView()
+
+@end
+
+
+@implementation ASGoodsCouponItemView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    if (self = [super initWithFrame:frame]) {
+        
+        UIImageView *bgImaegView = [[UIImageView alloc] init];
+        bgImaegView.image = [UIImage imageNamed:@"goods_coupon_bg"];
+        [self addSubview:bgImaegView];
+        [bgImaegView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.edges.mas_equalTo(0);
+        }];
+        
+        
+    }
+    return self;
+}
+
+@end

+ 21 - 0
Asteria/Fuction/Goods/V/ASGoodsDetailsSizeCell.h

@@ -0,0 +1,21 @@
+//
+//  ASGoodsDetailsSizeCell.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/18.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^ASGoodsDetailsSizeBlock)(NSArray<OptionsModel *> *optionArr, NSInteger num);
+
+@interface ASGoodsDetailsSizeCell : TT_BaseCell
+
+@property (nonatomic, copy) ASGoodsDetailsSizeBlock sizeBlock;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 114 - 0
Asteria/Fuction/Goods/V/ASGoodsDetailsSizeCell.m

@@ -0,0 +1,114 @@
+//
+//  ASGoodsDetailsSizeCell.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/18.
+//
+
+#import "ASGoodsDetailsSizeCell.h"
+#import "ASGoodsDetailsSizeSelView.h"
+
+@interface ASGoodsDetailsSizeCell()
+
+@property (nonatomic, strong) ASGoodsDetailsSizeSelView *sizeV;
+
+@property (nonatomic, strong) NSMutableArray <OptionsValuesM *>*selOptionArr;
+
+@end
+
+@implementation ASGoodsDetailsSizeCell
+
+- (void)setupSubviewS{
+        
+    [self.contentView addSubview:self.sizeV];
+    [self.sizeV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0);
+        make.width.mas_equalTo(KScreenWidth);
+        make.top.mas_equalTo(0);
+        make.height.equalTo(@300);
+        make.bottom.mas_equalTo(-10);
+    }];
+    K_WEAK_SELF;
+    self.sizeV.reloadHeight = ^(CGFloat h) {
+        K_STRONG_SELF;
+        [self.sizeV mas_remakeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(0);
+            make.width.mas_equalTo(KScreenWidth);
+            make.top.mas_equalTo(0);
+            make.height.equalTo(@(h));
+            make.bottom.mas_equalTo(-10);
+        }];
+        [self reloadInputViews];
+        [self setNeedsDisplay];
+    };
+    self.sizeV.reloadPrice = ^{
+        K_STRONG_SELF;
+        [self updatePrice];
+    };
+    
+}
+
+- (void)updatePrice {
+    NSInteger num = self.sizeV.num;
+    NSMutableArray <OptionsValuesM *>*selMArr = [NSMutableArray array];
+    for (OptionsModel *m in self.sizeV.optionArr) {
+        if (m.optionSelectTag >= 0 && m.optionSelectTag < m.values.count) {
+            [selMArr addObject:m.values[m.optionSelectTag]];
+        }
+    }
+    [self tool_changePriceModel:selMArr goodCount:num];
+}
+
+-(void)tool_changePriceModel:(NSMutableArray <OptionsValuesM *>*)valueMAry goodCount:(NSInteger )goosNum{
+    self.selOptionArr = valueMAry;
+    
+    NSMutableDictionary *optionDic = [NSMutableDictionary dictionary];
+    for (OptionsModel *optionM in self.sizeV.optionArr) {
+        OptionsValuesM *valuesM = optionM.values[optionM.optionSelectTag];
+        NSString *tempStr =[NSString stringWithFormat:@"options[%@]",optionM.option_id];
+        optionDic[tempStr] =valuesM.option_type_id;
+    }
+    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithDictionary:optionDic];
+    params[@"qty"] = [NSString stringWithFormat:@"%ld", self.sizeV.num];
+//    NSLog(@"=====%@", params);
+    if (self.currencyparameterClose) {
+        self.currencyparameterClose(100, params);
+    }
+}
+
+- (void)configData:(id)Data{
+    
+    GoodsInformationM *model = (GoodsInformationM *)Data;
+    
+    NSArray *modelAry  = model.options;
+
+    for (OptionsModel *m in modelAry) {
+        m.isLongValue = false;
+        if (m.is_require.boolValue) {
+            m.optionSelectTag = 0;
+        } else {
+            m.optionSelectTag = -1;
+        }
+        for (OptionsValuesM *val in m.values) {
+            if (val.title.length > 7) {
+                m.isLongValue = true;
+                break;
+            }
+        }
+    }
+    self.sizeV.optionArr = modelAry;
+    
+    self.sizeV.tipStr = model.description;
+}
+
+
+- (ASGoodsDetailsSizeSelView *)sizeV {
+    if(!_sizeV){
+        ASGoodsDetailsSizeSelView *v = [[ASGoodsDetailsSizeSelView alloc] initWithFrame:CGRectZero collectionViewLayout:[[UICollectionViewLayout alloc] init] ];
+        
+        _sizeV = v;
+    }
+    return _sizeV;
+}
+
+@end

+ 47 - 0
Asteria/Fuction/Goods/V/ASGoodsDetailsSizeSelView.h

@@ -0,0 +1,47 @@
+//
+//  ASGoodsDetailsSizeSelView.h
+//  westkissMob
+//
+//  Created by iOS on 2024/5/19.
+//
+
+#import <UIKit/UIKit.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsDetailsSizeSelView : UICollectionView
+
+@property (nonatomic, assign) NSInteger num;
+@property (nonatomic, copy) void(^reloadPrice)(void);
+
+
+@property (nonatomic, copy) void(^reloadHeight)(CGFloat h);
+
+@property (nonatomic, strong) NSArray<OptionsModel *> *optionArr;
+@property (nonatomic, copy) NSString *tipStr;
+
+@end
+
+@interface APProductDetailSizeCell : UICollectionViewCell
+
+- (void)setData:(OptionsValuesM *)m;
+
+- (void)setSelType:(BOOL)isSel isCat:(BOOL)isCat;
+- (void)setTip:(NSString *)tipStr;
+
+@end
+
+@interface APProductDetailNumStepCell : UICollectionViewCell
+
+@property (nonatomic, copy) void(^numBlock)(NSString *num);
+
+@end
+
+@interface APProductDetailSizeHeadV : UICollectionReusableView
+
+@property (nonatomic, strong) UILabel *titleLb;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 548 - 0
Asteria/Fuction/Goods/V/ASGoodsDetailsSizeSelView.m

@@ -0,0 +1,548 @@
+//
+//  ASGoodsDetailsSizeSelView.m
+//  westkissMob
+//
+//  Created by iOS on 2024/5/19.
+//
+
+#import "ASGoodsDetailsSizeSelView.h"
+
+@interface ASGoodsDetailsSizeSelView ()<UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
+
+@end
+
+@implementation ASGoodsDetailsSizeSelView
+
+-(void)setTipStr:(NSString *)tipStr {
+    _tipStr = tipStr;
+    CGFloat h = 72;
+    for (OptionsModel *m in self.optionArr) {
+        if (m.isLongValue) {
+            if (m.values.count > 0) {
+                NSInteger numLine = m.values.count/2 + (m.values.count%2>0 ? 1 : 0);
+                h += 40 * numLine + 10*(numLine-1) + 20 + 28;
+            }
+        } else {
+            if (m.values.count > 0) {
+                NSInteger numLine = m.values.count/4 + (m.values.count%4>0 ? 1 : 0);
+                h += 40 * numLine + 10*(numLine-1) + 20+28;
+            }
+        }
+    }
+//    if (self.tipStr != nil && self.tipStr.length > 0) {
+//        h += 60;
+//    }
+    if (self.reloadHeight) {
+        self.reloadHeight(h);
+    }
+    if (self.reloadPrice){
+        self.reloadPrice();
+    }
+    [self reloadData];
+}
+
+- (void)setOptionArr:(NSArray<OptionsModel *> *)optionArr {
+    _optionArr = optionArr;
+    CGFloat h = 72;
+    for (OptionsModel *m in optionArr) {
+        if (m.isLongValue) {
+            if (m.values.count > 0) {
+                NSInteger numLine = m.values.count/2 + (m.values.count%2>0 ? 1 : 0);
+                h += 40 * numLine + 10*(numLine-1) + 20 + 28;
+            }
+        } else {
+            if (m.values.count > 0) {
+                NSInteger numLine = m.values.count/4 + (m.values.count%4>0 ? 1 : 0);
+                h += 40 * numLine + 10*(numLine-1) + 20+28;
+            }
+        }
+    }
+//    if (self.tipStr != nil && self.tipStr.length > 0) {
+//        h += 60;
+//    }
+    if (self.reloadHeight) {
+        self.reloadHeight(h);
+    }
+    if (self.reloadPrice){
+        self.reloadPrice();
+    }
+    [self reloadData];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout {
+    UICollectionViewFlowLayout *ly = [[UICollectionViewFlowLayout alloc] init];
+    ly.scrollDirection = UICollectionViewScrollDirectionVertical;
+    self = [super initWithFrame:frame collectionViewLayout:ly];
+    if (self) {
+        self.num = 1;
+        self.showsVerticalScrollIndicator = false;
+        self.showsHorizontalScrollIndicator = false;
+        self.scrollEnabled = false;
+        self.backgroundColor = Col_FFF;
+        self.delegate = self;
+        self.dataSource = self;
+        [self registCell];
+        [self reloadData];
+    }
+    return self;
+}
+
+
+- (void)registCell {
+    [self registerClass:[APProductDetailSizeHeadV class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"APProductDetailSizeHeadV"];
+    [self registerClass:[APProductDetailSizeCell class] forCellWithReuseIdentifier:@"APProductDetailSizeCell"];
+//    [self registerClass:[APProductDetailSizeCell class] forCellWithReuseIdentifier:@"tipCell"];
+    [self registerClass:[APProductDetailNumStepCell class] forCellWithReuseIdentifier:@"APProductDetailNumStepCell"];
+}
+
+// MARK: - UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.section < self.optionArr.count) {
+        OptionsModel *m = self.optionArr[indexPath.section];
+        if ((!m.is_require.boolValue) && indexPath.row == m.optionSelectTag) {
+            m.optionSelectTag = -1;
+            if (self.reloadPrice) {
+                self.reloadPrice();
+            }
+            [collectionView reloadData];
+            return;
+        }
+        if (m.values.count > indexPath.row) {
+            m.optionSelectTag = indexPath.row;
+            if (self.reloadPrice) {
+                self.reloadPrice();
+            }
+            [collectionView reloadData];
+        }
+        
+    }
+}
+
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+//    return self.optionArr.count + 1 + (self.tipStr == nil || self.tipStr.length == 0 ? 0 : 1);
+    return self.optionArr.count + 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+    
+    if (section < self.optionArr.count) {
+        OptionsModel *m = self.optionArr[section];
+        return m.values.count;
+        
+    }
+    return 1;
+    
+}
+
+- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.section < self.optionArr.count) {
+        OptionsModel *m = self.optionArr[indexPath.section];
+        
+        APProductDetailSizeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"APProductDetailSizeCell" forIndexPath:indexPath];
+        if (indexPath.row < m.values.count) {
+            OptionsValuesM *val = m.values[indexPath.row];
+            [cell setData:val];
+        }
+        [cell setSelType:m.optionSelectTag == indexPath.row isCat:m.isLongValue];
+        return cell;
+        
+    }
+//    if (self.tipStr != nil && self.tipStr.length > 0 && indexPath.section == self.optionArr.count) {
+//        APProductDetailSizeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"APProductDetailSizeCell" forIndexPath:indexPath];
+//        [cell setTip:self.tipStr];
+//        return cell;
+//    }
+    APProductDetailNumStepCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"APProductDetailNumStepCell" forIndexPath:indexPath];
+    __weak typeof(self) weakSelf = self;
+    cell.numBlock = ^(NSString * _Nonnull num) {
+        weakSelf.num = num.integerValue;
+        if (self.reloadPrice) {
+            self.reloadPrice();
+        }
+    };
+    return cell;
+    
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
+    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
+        APProductDetailSizeHeadV *v = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"APProductDetailSizeHeadV" forIndexPath:indexPath];
+        if (indexPath.section < self.optionArr.count) {
+            OptionsModel *m = self.optionArr[indexPath.section];
+            v.titleLb.text = m.title;
+        } else {
+            v.titleLb.text = @"Category";
+        }
+        return v;
+    }
+    return [[UICollectionReusableView alloc] init];
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.section < self.optionArr.count) {
+        OptionsModel *m = self.optionArr[indexPath.section];
+        if (m.isLongValue) {
+            CGFloat w = (SCREEN_WIDTH-30-10)/2;
+            return CGSizeMake(w, 40);
+        } else {
+            CGFloat w = (SCREEN_WIDTH-30-10*3)/4;
+            return CGSizeMake(w, 40);
+        }
+        
+    } else {
+        CGFloat w = (SCREEN_WIDTH-30);
+        return CGSizeMake(w, 72);
+    }
+    
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
+    if (section >= self.optionArr.count){
+        return  CGSizeZero;
+    }
+    return CGSizeMake(SCREEN_WIDTH-30, 28);
+}
+
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
+    return 10;
+}
+
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
+    return 10;
+}
+
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
+    return UIEdgeInsetsMake(10, 15, 10, 15);
+}
+
+
+@end
+
+
+
+
+@interface APProductDetailSizeCell ()
+
+@property (nonatomic, strong) UIView *bgV;
+@property (nonatomic, strong) UIView *colorBg;
+@property (nonatomic, strong) UILabel *titleLb;
+@property (nonatomic, strong) UIImageView *selTipV;
+
+@end
+
+@implementation APProductDetailSizeCell
+
+- (void)setData:(OptionsValuesM *)m {
+    self.titleLb.text = m.title;
+}
+
+
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self loadSubV];
+    }
+    return self;
+}
+
+- (void)setSelType:(BOOL)isSel isCat:(BOOL)isCat {
+    self.colorBg.hidden = true;
+    TT_ViewRadius(self.bgV, 4);
+    self.bgV.layer.borderWidth = 1;
+    self.bgV.backgroundColor = isSel ? _32CFB0 : Col_FFF;
+    self.bgV.layer.borderColor = isSel ? _32CFB0.CGColor : [UIColor colorWithHexString:@"#E6E6E6"].CGColor;
+    self.selTipV.hidden = !isSel;
+    self.titleLb.font = [UIFont fontWithName:(isSel ? Rob_Bold : Rob_Regular ) size:(isCat ? 12 : 14)];
+}
+
+- (void)setTip:(NSString *)tipStr {
+    self.selTipV.hidden = true;
+    self.bgV.layer.borderWidth = 0;
+    self.bgV.backgroundColor = UIColor.clearColor;
+    self.colorBg.hidden = false;
+    self.titleLb.text = tipStr;
+}
+
+
+- (void)loadSubV {
+    [self.contentView addSubview:self.colorBg];
+    [self.contentView addSubview:self.bgV];
+    
+    [self.colorBg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.contentView);
+    }];
+    
+    [self.bgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.contentView);
+    }];
+    [self.bgV addSubview:self.titleLb];
+    [self.bgV addSubview:self.selTipV];
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.leading.equalTo(self.bgV).offset(4);
+        make.bottom.trailing.equalTo(self.bgV).offset(-4);
+    }];
+    [self.selTipV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.trailing.bottom.equalTo(self.bgV);
+        make.width.height.equalTo(@12);
+    }];
+    
+    
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    dispatch_async(dispatch_get_main_queue(), ^{
+//        [self.colorBg lineColor:@[(__bridge id)_FFD1B9.CGColor,(__bridge id)_FFF5F0.CGColor] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(1, 0.5) locations:@[@(0), @(1.0f)]];
+    });
+}
+
+- (UIView *)bgV {
+    if (!_bgV) {
+        UIView *v = [UIView baseV];
+        v.layer.borderWidth = 1;
+        v.backgroundColor = Col_FFF;
+        v.layer.borderColor = [UIColor colorWithHexString:@"#E6E6E6"].CGColor;
+        _bgV = v;
+    }
+    return _bgV;
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [UILabel baseLb];
+        lb.textAlignment = NSTextAlignmentCenter;
+        lb.textColor = Col_000;
+        lb.numberOfLines = 0;
+        lb.font = [UIFont fontWithName:Rob_Regular size:14];
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+- (UIImageView *)selTipV {
+    if (!_selTipV) {
+        UIImageView *imgv = [UIImageView baseImgV];
+        imgv.contentMode = UIViewContentModeScaleToFill;
+        imgv.image = [UIImage imageNamed:@"good_sizeSel"];
+        _selTipV = imgv;
+    }
+    return _selTipV;
+}
+
+- (UIView *)colorBg {
+    if (!_colorBg) {
+        UIView *v = [UIView baseV];
+        v.hidden = true;
+        _colorBg = v;
+    }
+    return _colorBg;
+}
+
+
+@end
+
+
+@interface APProductDetailNumStepCell ()
+
+@property (nonatomic, strong) UILabel *titleLb;
+@property (nonatomic, strong) UIButton *minusBt;
+@property (nonatomic, strong) UILabel *numLb;
+@property (nonatomic, strong) UIButton *addBt;
+
+@end
+
+@implementation APProductDetailNumStepCell
+
+- (void)addBtAction:(UIButton *)bt {
+//    [bt sleep:0.3];
+    NSInteger num = self.numLb.text.integerValue;
+    if (num < 1) {
+        num = 1;
+    } else {
+        num += 1;
+    }
+    NSString *numStr = [NSString stringWithFormat:@"%ld", num];
+    self.numLb.text = numStr;
+    if (self.numBlock) {
+        self.numBlock(numStr);
+    }
+    
+}
+
+- (void)minusBtAction:(UIButton *)bt {
+//    [bt sleep:0.3];
+    NSInteger num = self.numLb.text.integerValue;
+    if (num < 2) {
+        num = 1;
+    } else {
+        num -= 1;
+    }
+    NSString *numStr = [NSString stringWithFormat:@"%ld", num];
+    self.numLb.text = numStr;
+    if (self.numBlock) {
+        self.numBlock(numStr);
+    }
+    
+}
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = UIColor.whiteColor;
+        [self loadSubV];
+    }
+    return self;
+}
+
+
+
+- (void)loadSubV {
+    
+    [self.contentView addSubview:self.titleLb];
+    [self.contentView addSubview:self.addBt];
+    [self.contentView addSubview:self.minusBt];
+    [self.contentView addSubview:self.numLb];
+//    if(num >= self.goodsmaxNum){
+//        [self.addBtn setTitleColor:[UIColor colorWithHexString:@"#E6E6E6"] forState:UIControlStateNormal];
+//        self.addBtn.userInteractionEnabled = NO;
+//    }else{
+//        [self.addBtn setTitleColor:[UIColor colorWithHexString:@"#0B0B0B"] forState:UIControlStateNormal];
+//        self.addBtn.userInteractionEnabled = YES;
+//    }
+//    if(num >= 2){
+//        [self.cutBtn setTitleColor:[UIColor colorWithHexString:@"#0B0B0B"] forState:UIControlStateNormal];
+//        self.cutBtn.userInteractionEnabled = YES;
+//    }else{
+//        [self.cutBtn setTitleColor:[UIColor colorWithHexString:@"#E6E6E6"] forState:UIControlStateNormal];
+//        self.cutBtn.userInteractionEnabled = NO;
+//    }
+    
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.mas_equalTo(20);
+        make.top.equalTo(self.contentView);
+        make.leading.equalTo(self.contentView);
+    }];
+    
+    [self.minusBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.height.mas_equalTo(32);
+        make.left.mas_equalTo(0);
+        make.top.equalTo(self.titleLb.mas_bottom).offset(10);
+        make.bottom.mas_equalTo(-10);
+    }];
+    
+    [self.numLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@32);
+        make.width.equalTo(@46);
+        make.left.equalTo(self.minusBt.mas_right).offset(-1);
+        make.centerY.equalTo(self.minusBt);
+    }];
+    
+    [self.addBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.height.equalTo(@32);
+        make.left.equalTo(self.numLb.mas_right).offset(-1);
+        make.centerY.equalTo(self.minusBt);
+    }];
+    
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [UILabel baseLb];
+        lb.textColor = Col_000;
+        lb.text = @"Quantity";
+        lb.font = [UIFont fontWithName:Rob_Bold size:16];
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+- (UIButton *)addBt {
+    if (!_addBt) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt setTitle:@"+" forState:UIControlStateNormal];
+        [bt setTitleColor:Col_000 forState:UIControlStateNormal];
+        bt.titleLabel.font = [UIFont fontWithName:Rob_Bold size:14];
+//        [bt setImage:[UIImage imageNamed:@"goods_num_add"] forState:UIControlStateNormal];
+        bt.layer.borderWidth = 1;
+        bt.layer.borderColor = [UIColor colorWithHexString:@"#E6E6E6"].CGColor;
+        [bt addTarget:self action:@selector(addBtAction:) forControlEvents:UIControlEventTouchUpInside];
+        _addBt = bt;
+    }
+    return _addBt;
+}
+
+- (UILabel *)numLb {
+    if (!_numLb) {
+        UILabel *lb = [UILabel baseLb];
+        lb.textAlignment = NSTextAlignmentCenter;
+        lb.textColor = Col_000;
+        lb.layer.borderColor = [UIColor colorWithHexString:@"#E6E6E6"].CGColor;
+        lb.layer.borderWidth = 1;
+        lb.text = @"1";
+        lb.font = [UIFont fontWithName:Rob_Bold size:16];
+        _numLb = lb;
+    }
+    return _numLb;
+}
+
+- (UIButton *)minusBt {
+    if (!_minusBt) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt setTitle:@"-" forState:UIControlStateNormal];
+        [bt setTitleColor:Col_000 forState:UIControlStateNormal];
+        bt.titleLabel.font = [UIFont fontWithName:Rob_Bold size:14];
+//        [bt setImage:[UIImage imageNamed:@"goods_num_minus"] forState:UIControlStateNormal];
+        bt.layer.borderWidth = 1;
+        bt.layer.borderColor = [UIColor colorWithHexString:@"#E6E6E6"].CGColor;
+        [bt addTarget:self action:@selector(minusBtAction:) forControlEvents:UIControlEventTouchUpInside];
+        _minusBt = bt;
+    }
+    return _minusBt;
+}
+
+@end
+
+
+@interface APProductDetailSizeHeadV ()
+
+
+@end
+
+@implementation APProductDetailSizeHeadV
+
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = Col_FFF;
+        [self loadSubV];
+    }
+    return self;
+}
+
+- (void)loadSubV {
+    [self addSubview:self.titleLb];
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self).offset(10);
+        make.bottom.equalTo(self);//.offset(-5);
+        make.leading.equalTo(self).offset(15);
+        make.trailing.equalTo(self).offset(-15);
+    }];
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [UILabel baseLb];
+        lb.textColor = Col_000;
+        lb.font = [UIFont fontWithName:Rob_Bold size:16];
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+@end

+ 18 - 0
Asteria/Fuction/Goods/V/ASGoodsDetailsTableView.h

@@ -0,0 +1,18 @@
+//
+//  ASGoodsDetailsTableView.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/17.
+//
+
+#import <WMBase/WMBase.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsDetailsTableView : TT_BaseTableV
+
+@property (nonatomic, assign) BOOL isReview;//是否展示评论
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 141 - 0
Asteria/Fuction/Goods/V/ASGoodsDetailsTableView.m

@@ -0,0 +1,141 @@
+//
+//  ASGoodsDetailsTableView.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/17.
+//
+
+#import "ASGoodsDetailsTableView.h"
+
+//#import "GoodsReviewsListM.h"
+
+#import "ASGoodsBannerCell.h"
+#import "ASGoodsDetailsSizeCell.h"
+#import "ASGoodsCouponCell.h"
+#import "ASGoodsTitlePriceCell.h"
+#import "ASGoodsGuaranteeInfoCell.h"
+#import "ASGoodsReviewHeadCell.h"
+#import "GoodsReviewsCell.h"
+
+@interface ASGoodsDetailsTableView()
+
+@property (nonatomic, assign) BOOL couponSelect;
+
+@end
+
+
+@implementation ASGoodsDetailsTableView
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
+    
+    
+    NSObject *dataM = self.infodata[indexPath.row];
+    
+    NSObject *objectM = nil;
+    NSString *typeStr = @"";
+    if ([dataM isKindOfClass:[NSDictionary class]]) {
+        NSDictionary *dataDic = (NSDictionary *)dataM;
+        objectM = [dataDic objectForKey:@"data"];
+        typeStr = [dataDic objectForKey:@"type"];
+    } else if ([dataM isKindOfClass:[GoodsReviewsListM class]]) {
+        objectM = dataM;
+    }
+
+    if ([typeStr isEqualToString:@"banner"]) {
+        ASGoodsBannerCell *cell = [ASGoodsBannerCell cellWithTableView:tableView CellClass:[ASGoodsBannerCell class]];
+        
+        [cell configData:(GoodsInformationM *)objectM];
+        
+        return  cell;
+    } else if ([typeStr isEqualToString:@"titlePrice"]) {
+        ASGoodsTitlePriceCell *cell = [ASGoodsTitlePriceCell cellWithTableView:tableView CellClass:[ASGoodsTitlePriceCell class]];
+        
+        [cell configData:(GoodsInformationM *)objectM];
+        
+        @weakify(self)
+        cell.currencyparameterClose = ^(NSInteger type, id Data) {
+            @strongify(self)
+            [self generaltriggermethodType:type data:Data];
+        };
+        
+        return  cell;
+    } else if ([typeStr isEqualToString:@"coupon"]) {
+        ASGoodsCouponCell *cell = [ASGoodsCouponCell cellWithTableView:tableView CellClass:[ASGoodsCouponCell class]];
+        
+        [cell configData:(GoodsInformationM *)objectM isSelect:self.couponSelect];
+        
+        @weakify(self)
+        cell.currencyparameterClose = ^(NSInteger type, id Data) {
+            @strongify(self)
+            self.couponSelect = type;
+            [self reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
+        };
+        
+        return  cell;
+    } else if ([typeStr isEqualToString:@"size"]) {
+        ASGoodsDetailsSizeCell *cell = [ASGoodsDetailsSizeCell cellWithTableView:tableView CellClass:[ASGoodsDetailsSizeCell class]];
+        
+        [cell configData:(GoodsInformationM *)objectM];
+        
+        @weakify(self)
+        cell.currencyparameterClose = ^(NSInteger type, id Data) {
+            @strongify(self)
+            [self generaltriggermethodType:type data:Data];
+        };
+        
+        return  cell;
+    } else if ([typeStr isEqualToString:@"guarantee"]) {
+        ASGoodsGuaranteeInfoCell *cell = [ASGoodsGuaranteeInfoCell cellWithTableView:tableView CellClass:[ASGoodsGuaranteeInfoCell class]];
+        
+        [cell configData:(GoodsInformationM *)objectM];
+        
+        @weakify(self)
+        cell.currencyparameterClose = ^(NSInteger type, id Data) {
+            @strongify(self)
+            [self generaltriggermethodType:type data:Data];
+        };
+        
+        return  cell;
+    } else if ([typeStr isEqualToString:@"reviewHead"]) {
+        ASGoodsReviewHeadCell *cell = [ASGoodsReviewHeadCell cellWithTableView:tableView CellClass:[ASGoodsReviewHeadCell class]];
+        
+        [cell configData:(GoodsInformationM *)objectM];
+        
+        @weakify(self)
+        cell.currencyparameterClose = ^(NSInteger type, id Data) {
+            @strongify(self)
+            [self generaltriggermethodType:type data:Data];
+        };
+        
+        return  cell;
+    } else if ([objectM isKindOfClass:[GoodsReviewsListM class]]) {
+//        GoodsReviewsListM *objectM =  self.infodata[indexPath.row];
+        GoodsReviewsCell *cell = [GoodsReviewsCell cellWithTableView:tableView CellClass:[GoodsReviewsCell class]];
+        [cell configData:objectM];
+        @weakify(self)
+        cell.currencyparameterClose = ^(NSInteger type, id Data) {
+            @strongify(self) //图片选择器展示
+            
+        };
+        return cell;
+    }
+    
+    return  nil;
+    
+}
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+//    NSObject *objectM = self.infodata[indexPath.row];
+//    if([objectM isKindOfClass:[CartTotalsItemsM class]] && self.isFlod){
+//        return 0;
+//    }
+//    return 1;
+    
+    return UITableViewAutomaticDimension;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
+    return 200;
+}
+
+@end

+ 19 - 0
Asteria/Fuction/Goods/V/ASGoodsGuaranteeInfoCell.h

@@ -0,0 +1,19 @@
+//
+//  ASGoodsGuaranteeInfoCell.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsGuaranteeInfoCell : TT_BaseCell
+
+@property (nonatomic, strong) GoodsInformationM *infoModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 142 - 0
Asteria/Fuction/Goods/V/ASGoodsGuaranteeInfoCell.m

@@ -0,0 +1,142 @@
+//
+//  ASGoodsGuaranteeInfoCell.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import "ASGoodsGuaranteeInfoCell.h"
+#import "GoodsDetailsPayV.h"
+#import "GoodsDetailsIntroduceV.h"
+#import "RadioButton.h"
+
+@interface ASGoodsGuaranteeInfoCell()
+
+@property (nonatomic, strong) GoodsDetailsPayV *datails_payV;
+@property (nonatomic, strong) GoodsDetailsIntroduceV *datails_IntroduceV;
+@property (nonatomic, strong) NSMutableArray *radioBtnAry;
+@property (nonatomic, strong) UIButton *leftBtn;
+@property (nonatomic, strong) UIButton *rightBtn;
+
+@end
+
+@implementation ASGoodsGuaranteeInfoCell
+
+- (void)setupSubviewS{
+    
+    _radioBtnAry = [[NSMutableArray alloc] initWithCapacity:1];
+    
+    [self.contentView addSubview:self.datails_payV];
+    [self.contentView addSubview:self.datails_IntroduceV];
+    
+    [self.datails_payV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.mas_equalTo(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(78);
+    }];
+    
+    [self.datails_IntroduceV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.datails_payV.mas_bottom).offset(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(120);
+    }];
+    
+    NSArray *titleAry = @[@"PRODUCT DETAILS",@"REVIEWS"];
+    for (int i= 0; i<titleAry.count; i++) {
+        UIButton *radBtn= [UIButton buttonWithType:UIButtonTypeCustom];
+        radBtn.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+        radBtn.titleLabel.font = [UIFont fontWithName:Rob_Bold size:14];
+        radBtn.layer.cornerRadius = 4;
+        radBtn.clipsToBounds = YES;
+        radBtn.tag = i;
+        [radBtn setTitle:titleAry[i] forState:UIControlStateNormal];
+        [radBtn setTitleColor:[UIColor colorWithHexString:@"#000000"] forState:UIControlStateNormal];
+        [radBtn setTitleColor:[UIColor colorWithHexString:@"#FFFFFF"] forState:UIControlStateSelected];
+        [radBtn addTarget:self action:@selector(_onButtonClick:) forControlEvents:UIControlEventTouchUpInside];
+        [self.contentView addSubview:radBtn];
+//        [self.radioBtnAry addObject:radBtn];
+        CGFloat btnWidth = (KScreenWidth -30)/2;
+        [radBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(10+(10+btnWidth)*i);
+            make.height.mas_equalTo(40);
+            make.top.equalTo(self.datails_IntroduceV.mas_bottom).offset(20);
+            make.width.mas_equalTo(btnWidth);
+            make.bottom.mas_equalTo(-10);
+        }];
+        
+        if (i == 0) {
+            radBtn.selected = YES;
+            radBtn.backgroundColor = [UIColor colorWithHexString:@"#113632"];
+            self.leftBtn = radBtn;
+        } else {
+            radBtn.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+            self.rightBtn = radBtn;
+        }
+    }
+//    RadioButton *firstBtn = self.radioBtnAry[0];
+//    [firstBtn setGroupButtons:self.radioBtnAry];
+//    [self.radioBtnAry[0] setSelected:YES];
+//    [self xxx_onRadioButtonValueChanged:self.radioBtnAry[0]];
+    
+    
+//    self.datails_payV.titleLab.text = [NSString stringWithFormat:@"Pay in 4 interest-free payments of %@%.2f with",model.currency_symbol,[model.final_prices floatValue]/4];
+
+}
+
+- (void)configData:(id)Data{
+    GoodsInformationM *model = (GoodsInformationM *)Data;
+    
+    _infoModel = model;
+    
+    self.datails_payV.titleLab.text = [NSString stringWithFormat:@"Pay in 4 interest-free payments of %@%.2f with",model.currency_symbol,[model.final_prices floatValue]/4];
+}
+
+-(void)_onButtonClick:(UIButton *)btn{
+    
+    int tag = (int)btn.tag;
+    if (tag == 0) {
+        if (self.leftBtn.isSelected) {
+            return;
+        }
+        self.leftBtn.selected = YES;
+        self.rightBtn.selected = NO;
+        self.leftBtn.backgroundColor = [UIColor colorWithHexString:@"#113632"];
+        self.rightBtn.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    } else {
+        if (self.rightBtn.isSelected) {
+            return;
+        }
+        self.rightBtn.selected = YES;
+        self.leftBtn.selected = NO;
+        self.rightBtn.backgroundColor = [UIColor colorWithHexString:@"#113632"];
+        self.leftBtn.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    }
+
+    if (self.currencyparameterClose) {
+        self.currencyparameterClose(tag + 2, self.infoModel);
+    }
+}
+
+
+-(GoodsDetailsPayV *)datails_payV{
+    if (!_datails_payV) {
+        _datails_payV = [[GoodsDetailsPayV alloc]initWithFrame:CGRectMake(10, 0, KScreenWidth-20, 78)];
+        _datails_payV.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+        _datails_payV.layer.cornerRadius = 4;
+        _datails_payV.clipsToBounds = YES;
+    }
+    return _datails_payV;
+}
+
+- (GoodsDetailsIntroduceV *)datails_IntroduceV {
+    if (!_datails_IntroduceV) {
+        _datails_IntroduceV = [[GoodsDetailsIntroduceV alloc] initWithFrame:CGRectMake(10, 0, KScreenWidth-20, 120)];
+        _datails_IntroduceV.backgroundColor = _F5F5F5;
+        _datails_IntroduceV.clipsToBounds = YES;
+    }
+    return _datails_IntroduceV;
+}
+
+@end

+ 23 - 0
Asteria/Fuction/Goods/V/ASGoodsIntrouduceWebView.h

@@ -0,0 +1,23 @@
+//
+//  ASGoodsIntrouduceWebView.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import <UIKit/UIKit.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^ASGoodsWebInfoLoadFinishBlock)(float webHeight);
+
+@interface ASGoodsIntrouduceWebView : UIView
+
+@property (nonatomic, copy) ASGoodsWebInfoLoadFinishBlock loadFinishBlock;
+
+- (void)loadWebUrlWithData:(GoodsInformationM *)model;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 146 - 0
Asteria/Fuction/Goods/V/ASGoodsIntrouduceWebView.m

@@ -0,0 +1,146 @@
+//
+//  ASGoodsIntrouduceWebView.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import "ASGoodsIntrouduceWebView.h"
+
+@interface ASGoodsIntrouduceWebView()<WKNavigationDelegate>
+
+@property (nonatomic, strong) WKWebView *wkWebView;
+
+@end
+
+@implementation ASGoodsIntrouduceWebView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    if (self = [super initWithFrame:frame]) {
+        
+        [self addSubview:self.wkWebView];
+        [self.wkWebView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.edges.mas_equalTo(0);
+            make.top.mas_equalTo(10);
+            make.width.mas_equalTo(KScreenWidth);
+            make.height.mas_equalTo(200);
+//            make.bottom.mas_equalTo(-10);
+        }];
+    }
+    return self;
+}
+
+- (void)loadWebUrlWithData:(GoodsInformationM *)model {
+    NSString *product_details= @"";
+    for (NSDictionary *dic in model.custom_attributes) {
+        NSString *tmpStr= MM_str(dic[@"attribute_code"]);
+        if ([tmpStr isEqualToString:@"feature"]) {
+            product_details = MM_str(dic[@"value"]);
+        }
+    }
+    NSString *htmlStr = [NSString stringWithFormat:@"<html> \n"
+                         "<head> \n"
+                         "<meta charset=\"utf-8\" /> \n"
+                         "<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no\" /> \n"
+                         "<style> \n"
+                             "*{ \n"
+                                 "padding: 5; \n"
+                                 "margin: 0; \n"
+                             "} \n"
+                             "table{ \n"
+                                 "width: 100%%; \n"
+                                 "border: 1px solid #A8A8A8; \n"
+                                 "border-collapse:collapse; \n"
+                             "} \n"
+                             "th{ \n"
+                                 "width: 30.42%%; \n"
+                                 "min-height: 36px; \n"
+                                 "padding: 10px; \n"
+                                 "border: 1px solid #A8A8A8; \n"
+                                 "font-size: 12px; \n"
+                                 "font-weight: bold; \n"
+                                 "color: #000; \n"
+                             "} \n"
+                             "td{ \n"
+                                 "width: 69.58%%; \n"
+                                 "min-height: 36px; \n"
+                                 "padding: 10px; \n"
+                                 "border: 1px solid #A8A8A8; \n"
+                                 "font-size: 12px; \n"
+                                 "font-weight: 400; \n"
+                                 "color: #000; \n"
+                                 "line-height: 16px; \n"
+                                 "word-break: break-word; \n"
+                             "} \n"
+                         "</style> \n"
+                         "</head> \n"
+                         "<body style=\"font-family: -apple-system,Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',sans-serif;\">%@</body> \n"
+                         "</html>",product_details];
+    [self.wkWebView loadHTMLString:htmlStr baseURL:nil];
+}
+
+
+#pragma mark WKNavigationDelegate 计算webView
+-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
+    @weakify(self)
+    [webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
+        @strongify(self)
+        CGFloat height = [result doubleValue]+40;
+        [self tool_webChangeFrame:height];
+    }];
+}
+
+-(void)tool_webChangeFrame:(CGFloat)height{
+    [self.wkWebView mas_updateConstraints:^(MASConstraintMaker *make) {
+        make.height.mas_equalTo(height);
+    }];
+    
+    if (self.loadFinishBlock) {
+        self.loadFinishBlock(height);
+    }
+}
+
+
+- (WKWebView *)wkWebView {
+    if(!_wkWebView){
+        NSString *injectionJSString = @"var script = document.createElement('meta');"
+        "script.name = 'viewport';"
+        "script.content=\"width=device-width, user-scalable=no\";"
+        "document.getElementsByTagName('head')[0].appendChild(script);";
+        
+        // CSS选中样式取消 ---禁用web 长按菜单里的查询、学习、共享等按钮,
+        NSString *css = @"body{-webkit-user-select:none;-webkit-user-drag:none;}";
+        NSMutableString *javascript = [NSMutableString string];
+        [javascript appendString:injectionJSString];
+        [javascript appendString:@"var style = document.createElement('style');"];
+        [javascript appendString:@"style.type = 'text/css';"];
+        [javascript appendFormat:@"var cssContent = document.createTextNode('%@');", css];
+        [javascript appendString:@"style.appendChild(cssContent);"];
+        [javascript appendString:@"document.body.appendChild(style);"];
+        
+        WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
+        
+        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
+        config.selectionGranularity = WKSelectionGranularityDynamic;
+        
+        WKUserContentController * wkUController = [[WKUserContentController alloc] init];
+        
+        [wkUController addUserScript:wkUScript];
+        
+        config.userContentController= wkUController;
+        WKPreferences *wkp = [WKPreferences new];
+        wkp.minimumFontSize = 12;
+        config.preferences = wkp;
+        _wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenWidth) configuration:config];
+        _wkWebView.navigationDelegate=self;
+        _wkWebView.backgroundColor=[UIColor colorWithHexString:@"#FFFFFF"];
+        _wkWebView.scrollView.scrollEnabled=NO;
+        _wkWebView.allowsLinkPreview = NO;
+        if(@available(iOS 16.4 , *)){
+            _wkWebView.inspectable = YES;
+        }
+    }
+    return _wkWebView;
+}
+
+@end

+ 17 - 0
Asteria/Fuction/Goods/V/ASGoodsReviewHeadCell.h

@@ -0,0 +1,17 @@
+//
+//  ASGoodsReviewHeadCell.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/21.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsReviewHeadCell : TT_BaseCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 57 - 0
Asteria/Fuction/Goods/V/ASGoodsReviewHeadCell.m

@@ -0,0 +1,57 @@
+//
+//  ASGoodsReviewHeadCell.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/21.
+//
+
+#import "ASGoodsReviewHeadCell.h"
+#import "ReviewsTableHearV.h"
+
+@interface ASGoodsReviewHeadCell()
+
+@property (nonatomic, strong) ReviewsTableHearV *tableHeadV;
+
+@end
+
+@implementation ASGoodsReviewHeadCell
+
+- (void)setupSubviewS {
+    
+    [self.contentView addSubview:self.tableHeadV];
+    [self.tableHeadV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.top.mas_equalTo(0);
+        make.right.mas_equalTo(0);
+        make.height.mas_equalTo([ReviewsTableHearV xxx_viewHeight]);
+        make.bottom.mas_equalTo(-10);
+    }];
+    
+}
+
+- (void)configData:(id)Data{
+    GoodsInformationM *model = (GoodsInformationM *)Data;
+    
+    [self.tableHeadV tt_confignewdata:model];
+}
+
+- (ReviewsTableHearV *)tableHeadV {
+    if (!_tableHeadV) {
+        _tableHeadV = [[ReviewsTableHearV alloc] initWithFrame:CGRectFlatMake(0, 0, KScreenHeight, [ReviewsTableHearV xxx_viewHeight])];
+        _tableHeadV.backgroundColor = [UIColor colorWithHexString:@"#FFFFFF"];
+        @weakify(self)
+        _tableHeadV.ViewtapClose = ^(NSInteger num, id  _Nonnull data) {
+            @strongify(self)
+//            if(num == 0){
+//                GoodsReviewsWriteC *vc = [[GoodsReviewsWriteC alloc]init];
+//                vc.goodsM = self.goodsM;
+//                vc.topBgV = self.topBgV;
+//                vc.nav_title = [NSString stringWithFormat:@"REVIEWS (%@)",self.goodsM.review_nums];
+//                [self.navigationController pushViewController:vc animated:YES];
+//            }
+        };
+    }
+    return _tableHeadV;
+}
+
+
+@end

+ 19 - 0
Asteria/Fuction/Goods/V/ASGoodsTitlePriceCell.h

@@ -0,0 +1,19 @@
+//
+//  ASGoodsTitlePriceCell.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsInformationM.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsTitlePriceCell : TT_BaseCell
+
+@property (nonatomic, strong) GoodsInformationM *infoModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 166 - 0
Asteria/Fuction/Goods/V/ASGoodsTitlePriceCell.m

@@ -0,0 +1,166 @@
+//
+//  ASGoodsTitlePriceCell.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/20.
+//
+
+#import "ASGoodsTitlePriceCell.h"
+
+@interface ASGoodsTitlePriceCell()
+
+@property (nonatomic, strong) QMUILabel *titleLab;
+@property (nonatomic, strong) QMUILabel *soldLab;
+@property (nonatomic, strong) QMUILabel *reviewsLab;
+@property (nonatomic, strong) QMUILabel *priceLab;
+@property (nonatomic, strong) QMUILabel *saveLab;
+
+@end
+
+@implementation ASGoodsTitlePriceCell
+
+- (void)setupSubviewS{
+    
+//    self.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    
+    [self.contentView addSubview:self.titleLab];
+    [self.contentView addSubview:self.soldLab];
+    [self.contentView addSubview:self.reviewsLab];
+    [self.contentView addSubview:self.priceLab];
+    [self.contentView addSubview:self.saveLab];
+    
+    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.top.mas_equalTo(10);
+        make.height.mas_lessThanOrEqualTo(45);
+    }];
+    [self.soldLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.height.mas_equalTo(16);
+        make.top.equalTo(self.titleLab.mas_bottom).offset(10);
+    }];
+    [self.reviewsLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(self.titleLab.mas_right);
+        make.height.mas_equalTo(16);
+        make.top.equalTo(self.titleLab.mas_bottom).offset(10);
+    }];
+    [self.priceLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.reviewsLab.mas_bottom).offset(20);
+        make.height.mas_equalTo(24);
+        make.bottom.mas_equalTo(-10);
+    }];
+    [self.saveLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.priceLab.mas_right).offset(10);
+        make.height.mas_equalTo(20);
+        make.centerY.equalTo(self.priceLab);
+    }];
+    
+    
+}
+
+- (void)configData:(id)Data{
+    GoodsInformationM *model = (GoodsInformationM *)Data;
+    
+    _infoModel = model;
+    
+    self.titleLab.text =MM_str(model.name);
+    self.soldLab.text = [NSString stringWithFormat:@"SOLD: %@",model.sold] ;
+    NSMutableAttributedString *reviewsStr = [[NSMutableAttributedString alloc]
+                                             initWithString:[NSString stringWithFormat:@"REVIEWS:%@",model.review_nums]];
+    NSRange contentRange = {0,[reviewsStr length]};
+    [reviewsStr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:contentRange];
+    self.reviewsLab.attributedText = reviewsStr;
+    self.reviewsLab.textAlignment = NSTextAlignmentRight;
+    
+    NSMutableAttributedString *priceAtr = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@%@",model.currency_symbol,model.final_prices]];
+    [priceAtr addAttribute: NSForegroundColorAttributeName value:[UIColor colorWithHexString:@"#0B0B0B"] range:NSMakeRange(0, priceAtr.length)];
+    [priceAtr addAttribute:NSFontAttributeName value:[UIFont fontWithName:Rob_Bold size:20] range:NSMakeRange(0, priceAtr.length)];
+    NSString *saveStr = @"";
+    if(model.final_prices == model.price){
+        self.saveLab.hidden = YES;
+    }else{
+        self.saveLab.hidden = NO;
+        double savePrice = [model.price doubleValue]-[model.final_prices doubleValue];
+        saveStr = [NSString stringWithFormat:@"Save %@%.2f",model.currency_symbol,savePrice];
+        [priceAtr appendAttributedString:[[NSAttributedString alloc]initWithString:@"  "]];
+        NSMutableAttributedString *priceAtrSub1 = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@",model.price]];
+        [priceAtrSub1 addAttribute:NSForegroundColorAttributeName
+                        value:[UIColor colorWithHexString:@"#8c8c8c"]
+                        range:NSMakeRange(0, priceAtrSub1.length)];
+        [priceAtrSub1 addAttribute:NSFontAttributeName
+                        value:[UIFont fontWithName:Rob_Regular size:14]
+                        range:NSMakeRange(0, priceAtrSub1.length)];
+        [priceAtrSub1 addAttribute:NSStrikethroughStyleAttributeName
+                        value:[NSNumber numberWithInteger:NSUnderlineStyleSingle]
+                        range:NSMakeRange(0, priceAtrSub1.length)];
+        [priceAtr appendAttributedString:priceAtrSub1];
+    }
+    self.priceLab.attributedText = priceAtr;
+    self.infoModel.priceAtr = priceAtr;
+    self.saveLab.text = saveStr;
+}
+
+
+-(void)tap_reviewsClick{
+    if (self.currencyparameterClose) {
+        self.currencyparameterClose(1, self.infoModel);
+    }
+}
+
+
+- (QMUILabel *)titleLab {
+    if (!_titleLab) {
+        _titleLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _titleLab.textAlignment = NSTextAlignmentLeft;
+        _titleLab.numberOfLines = 2;
+        _titleLab.textColor = [UIColor colorWithHexString:@"#000000"];
+        _titleLab.font = [UIFont fontWithName:Rob_Bold size:16];
+    }
+    return  _titleLab;
+}
+- (QMUILabel *)soldLab {
+    if (!_soldLab) {
+        _soldLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _soldLab.textAlignment = NSTextAlignmentLeft;
+        _soldLab.textColor = [UIColor colorWithHexString:@"#666666"];
+        _soldLab.font = [UIFont systemFontOfSize:12];
+    }
+    return  _soldLab;
+}
+- (QMUILabel *)reviewsLab {
+    if (!_reviewsLab) {
+        _reviewsLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _reviewsLab.textAlignment = NSTextAlignmentRight;
+        _reviewsLab.textColor = [UIColor colorWithHexString:@"#666666"];
+        _reviewsLab.font = [UIFont fontWithName:Rob_Regular size:12];
+        _reviewsLab.userInteractionEnabled = YES;
+        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap_reviewsClick)];
+        [_reviewsLab addGestureRecognizer:tap];
+        //    reviewsStr.underlineStyle = NSUnderlineStyleSingle;
+    }
+    return  _reviewsLab;
+}
+- (QMUILabel *)priceLab {
+    if (!_priceLab) {
+        _priceLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _priceLab.textAlignment = NSTextAlignmentLeft;
+        _priceLab.textColor = [UIColor blackColor];
+        _priceLab.font = [UIFont systemFontOfSize:18];
+    }
+    return  _priceLab;
+}
+- (QMUILabel *)saveLab {
+    if (!_saveLab) {
+        _saveLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _saveLab.contentEdgeInsets= UIEdgeInsetsMake(10, 10, 10, 10);
+        _saveLab.backgroundColor = [UIColor colorWithHexString:@"#E0FFF5"];
+        _saveLab.textAlignment = NSTextAlignmentCenter;
+        _saveLab.textColor = [UIColor colorWithHexString:@"#113632"];
+        _saveLab.font = [UIFont fontWithName:Rob_Bold size:12];
+    }
+    return  _saveLab;
+}
+
+@end

+ 4 - 4
Asteria/Fuction/Goods/V/GoodsDetailsBottomV.m

@@ -13,10 +13,10 @@
 @implementation GoodsDetailsBottomV
 
 - (void)tt_setupViews{
-    UIView *lineV = [[UIView alloc]init];
-    lineV.backgroundColor = [UIColor colorWithHexString:@"#666666"];
-    lineV.frame = CGRectMake(0, 0, KScreenWidth, 0.5);
-    [self addSubview:lineV];
+//    UIView *lineV = [[UIView alloc]init];
+//    lineV.backgroundColor = [UIColor colorWithHexString:@"#666666"];
+//    lineV.frame = CGRectMake(0, 0, KScreenWidth, 0.5);
+//    [self addSubview:lineV];
     [self addSubview:self.shopBtn];
     [self addSubview:self.addCartBtn];
     [self btnSetCornRious];

+ 18 - 0
Asteria/Fuction/Goods/VC/ASGoodsDetailsViewController.h

@@ -0,0 +1,18 @@
+//
+//  ASGoodsDetailsViewController.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/17.
+//
+
+#import <WMBase/WMBase.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsDetailsViewController : UCMBaseC
+
+@property (nonatomic, copy) NSString *entity_id;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 234 - 0
Asteria/Fuction/Goods/VC/ASGoodsDetailsViewController.m

@@ -0,0 +1,234 @@
+//
+//  ASGoodsDetailsViewController.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/17.
+//
+
+#import "ASGoodsDetailsViewController.h"
+#import "AS_GoodsReviewsListC.h"
+#import "Cart_CheckoutC.h"
+
+#import "ASGoodsDetailsVM.h"
+#import "ASGoodsDetailsTableView.h"
+
+#import "ASGoodsIntrouduceWebView.h"
+#import "GoodsDetailsBottomV.h"
+
+#import "GoodsInformationM.h"
+#import "GoodsReviewsListM.h"
+
+
+
+@interface ASGoodsDetailsViewController ()<RY_baseVMprotocol>
+
+
+@property (nonatomic, strong) ASGoodsDetailsVM *VM;
+@property (nonatomic, strong) ASGoodsDetailsTableView *TableV;
+
+@property (nonatomic, strong) GoodsInformationM *model;
+
+//评论数据
+@property (nonatomic, strong) NSArray *reviewDataArray;;
+
+@property (nonatomic, strong)  UIView *footView;
+
+@property (nonatomic, strong) GoodsDetailsBottomV *bottomV;
+//尺寸数据
+@property (nonatomic, strong) NSDictionary *sizeParam;
+
+
+//底部按钮点击类型
+@property (nonatomic, assign) NSInteger bottomClickType;
+//底部按钮点击类型
+@property (nonatomic, assign) BOOL isReview;
+
+@end
+
+@implementation ASGoodsDetailsViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    [self reqNet_GoodsDetails_productGetProduct];
+    [self reqNet_Goods_productGetProductsReview];
+    
+}
+
+- (void)initSubviews {
+    [super initSubviews];
+    
+    [self.view addSubview:self.bottomV];
+    @weakify(self)
+    self.bottomV.ViewtapClose = ^(NSInteger num, id  _Nonnull data) {
+        @strongify(self)
+        self.bottomClickType = num;
+        [self reqNet_Size_rewriteCartAddProducts];
+    };
+    
+    IPhoneXHeigh
+    [self setupTableV:[ASGoodsDetailsTableView class] Frame:CGRectMake(0, securitytop_Y , KScreenWidth, KScreenHeight - securitytop_Y - securityBottom_H - 65)];
+    self.TableV.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    self.TableV.estimatedRowHeight = 0;
+    self.TableV.estimatedSectionHeaderHeight = 0;
+    self.TableV.estimatedSectionFooterHeight = 0;
+    
+    K_WEAK_SELF;
+    self.TableV.tapClose = ^(NSInteger num, id data) {
+        K_STRONG_SELF;
+        if (num == 1) {//查看评论
+            [self action_GoodsReviewsListC];
+        } else if (num == 2) {//商品web详情
+            self.isReview = NO;
+            [self updateGoodsDetailsData];
+        } else if (num == 3) {//商品评论
+            self.isReview = YES;
+            [self updateGoodsDetailsData];
+        } else if (num == 100) {
+            self.sizeParam = (NSDictionary *)data;
+        } else if (num == 1000) {
+            [self.TableV reloadData];
+        }
+    };
+    
+}
+
+-(void)reqNet_Size_rewriteCartAddProducts {
+    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithDictionary:self.sizeParam];
+    params[@"product"] =  self.model.Id;
+    NSLog(@"=====%@", params);
+    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
+    [self.VM ry_formDataRequestPostApi:Size_rewriteCartAddProducts param:params];
+}
+//商品详情信息
+-(void)reqNet_GoodsDetails_productGetProduct{
+    NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
+//    [params setObject:@"55475" forKey:@"productId"];
+    [params setObject:self.entity_id forKey:@"productId"];
+    [params setObject:@"USD" forKey:@"currencyCode"];
+    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
+    [self.VM ry_requestGetApi:Goods_productGetProductsById param:params];
+}
+//商品评论
+-(void)reqNet_Goods_productGetProductsReview{
+    NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
+    [params setObject:self.entity_id forKey:@"pid"];
+//    [params setObject:@0 forKey:@"img"];
+    [params setObject:@"Newest" forKey:@"sortreview"];
+    [params setObject:@(self.TableV.Page) forKey:@"p"];
+    [params setObject:@3 forKey:@"limit"];
+    [self.VM ry_requestGetApi:Goods_productGetProductsReview param:params];
+}
+-(void)ry_respnsData:(nullable id)data
+            parseAry:(nullable NSMutableArray *)arry
+              sucess:(BOOL)sucessOrFail
+                mark:(NSString *)mark
+          reqNetType:(ReqNetType)reqNetType{
+    [MBProgressHUD hideHUDForView:self.view animated:YES];
+    if(sucessOrFail){
+        if([mark isEqualToString:Goods_productGetProductsById]){
+            GoodsInformationM *model = (GoodsInformationM *)[arry firstObject];
+            self.model = model;
+            self.title = model.name;
+            
+            [self loadWebString];
+            [self updateGoodsDetailsData];
+        } else if([mark isEqualToString:Size_rewriteCartAddProducts]) {            
+            
+            [self.view makeToast:@"Success" duration:2 position:CSToastPositionCenter title:nil image:nil style:nil completion:^(BOOL didTap) {
+                if (self.bottomClickType == 1) {
+                    Cart_CheckoutC *vc = [[Cart_CheckoutC alloc] init];
+                    [[Current_normalTool topViewController].navigationController pushViewController:vc animated:YES];
+                }
+            }];
+        } else if ([mark isEqualToString:Goods_productGetProductsReview]) {
+            
+//            [self.TableV configDataNew:arry has_more:arry.count==10 ? YES : NO];
+            
+            self.reviewDataArray = arry;
+            
+            if (self.model) {
+                [self updateGoodsDetailsData];
+            }
+        }
+    }
+}
+
+- (void)updateGoodsDetailsData {
+        
+    [self.TableV.infodata removeAllObjects];
+    //商品图
+    NSDictionary *banner = @{@"type":@"banner", @"data":self.model};
+    [self.TableV.infodata addObject:banner];
+    //商品名、价格
+    NSDictionary *titlePrice = @{@"type":@"titlePrice", @"data":self.model};
+    [self.TableV.infodata addObject:titlePrice];
+    //优惠券
+    NSDictionary *coupon = @{@"type":@"coupon", @"data":self.model};
+    [self.TableV.infodata addObject:coupon];
+    //规格
+    NSDictionary *goodsSize = @{@"type":@"size", @"data":self.model};
+    [self.TableV.infodata addObject:goodsSize];
+    //保障信息
+    NSDictionary *guarantee = @{@"type":@"guarantee", @"data":self.model};
+    [self.TableV.infodata addObject:guarantee];
+    
+    if (self.isReview) {
+        //评论头
+        NSDictionary *reviewHead = @{@"type":@"reviewHead", @"data":self.model};
+        [self.TableV.infodata addObject:reviewHead];
+        
+        //评论数据
+        [self.TableV.infodata addObjectsFromArray:self.reviewDataArray];
+        
+        self.TableV.tableFooterView = nil;
+        
+    } else {
+        self.TableV.tableFooterView = _footView;
+    }
+    
+    [self.TableV reloadData];
+}
+
+- (void)loadWebString {
+    _footView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 0.001)];
+        
+    ASGoodsIntrouduceWebView *webInfoView = [[ASGoodsIntrouduceWebView alloc] initWithFrame:CGRectZero];
+    [_footView addSubview:webInfoView];
+    [webInfoView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.mas_equalTo(0);
+    }];
+    [webInfoView loadWebUrlWithData:self.model];
+    K_WEAK_SELF;
+    webInfoView.loadFinishBlock = ^(float webHeight) {
+        K_STRONG_SELF;
+        
+        self.footView.frame = CGRectMake(0, 0, KScreenWidth, webHeight);
+        [self.TableV reloadData];
+    };
+}
+
+#pragma mark ---- Touch Event ----
+//查看评论
+-(void)action_GoodsReviewsListC{
+    AS_GoodsReviewsListC *allPic = [[AS_GoodsReviewsListC alloc]init];
+    allPic.goodsM = self.model;
+    [self.navigationController pushViewController:allPic animated:YES];
+}
+
+- (void)ucm_bindvmmodel{
+    self.VM = [[ASGoodsDetailsVM alloc] initDelegate:self];
+}
+
+- (GoodsDetailsBottomV *)bottomV {
+    if (!_bottomV) {
+        IPhoneXHeigh
+        _bottomV = [[GoodsDetailsBottomV alloc] initWithFrame:CGRectMake(0, KScreenHeight - securityBottom_H-65, KScreenWidth, securityBottom_H+65)];
+        _bottomV.backgroundColor = Col_FFF;
+        
+    }
+    return _bottomV;
+}
+
+
+@end

+ 1 - 0
Asteria/Fuction/UserCenter/Orders/Controller/ASOrderDetailsViewController.h

@@ -11,6 +11,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface ASOrderDetailsViewController : ASBaseViewController
 
+@property (nonatomic, assign) BOOL isPay;//是否支付过来
 @property (nonatomic, copy) NSString *orderId;
 
 @end

+ 19 - 0
Asteria/Fuction/UserCenter/Orders/Controller/ASOrderDetailsViewController.m

@@ -15,6 +15,8 @@
 #import "ASOrderDetailsItemsCell.h"
 #import "ASOrderDetailsPriceCell.h"
 
+#import "ASPayFinishHeadView.h"
+
 @interface ASOrderDetailsViewController ()<UITableViewDelegate, UITableViewDataSource>
 
 @property (nonatomic, strong) UITableView *tableView;
@@ -100,11 +102,28 @@
 
 // MARK: - loadSubv
 - (void)loadSubV {
+    
+    
     [self.view addSubview:self.tableView];
     [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.top.equalTo(self.customNavBar.mas_bottom);
         make.leading.trailing.bottom.equalTo(self.view);
     }];
+    
+    if (self.isPay) {
+        ASPayFinishHeadView *payFailedView = [[ASPayFinishHeadView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 100) status:1 desc:self.orderId];
+        
+        K_WEAK_SELF;
+        payFailedView.clickBlock = ^(int type) {
+    //        K_STRONG_SELF;
+        };
+        
+        float viewHeight = [payFailedView getViewHeight];
+        payFailedView.frame = CGRectMake(0, 0, KScreenWidth, viewHeight);
+        
+        self.tableView.tableHeaderView = payFailedView;
+    }
+    
 }
 
 // MARK: - subvs

+ 18 - 0
Asteria/Fuction/UserCenter/Orders/Controller/ASPayFailedViewController.h

@@ -0,0 +1,18 @@
+//
+//  ASPayFailedViewController.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/16.
+//
+
+#import "ASBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASPayFailedViewController : ASBaseViewController
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 47 - 0
Asteria/Fuction/UserCenter/Orders/Controller/ASPayFailedViewController.m

@@ -0,0 +1,47 @@
+//
+//  ASPayFailedViewController.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/16.
+//
+
+#import "ASPayFailedViewController.h"
+#import "ASPayFinishHeadView.h"
+
+@interface ASPayFailedViewController ()
+
+@property (nonatomic, strong) UIScrollView *scrollView;
+
+@end
+
+@implementation ASPayFailedViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.statusBgV.backgroundColor = Col_FFF;
+    self.customNavBar.backgroundColor = Col_FFF;
+    
+    _scrollView = [[UIScrollView alloc] init];
+    [self.view addSubview:_scrollView];
+    [_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.customNavBar.mas_bottom);
+        make.leading.trailing.bottom.equalTo(self.view);
+    }];
+    
+    ASPayFinishHeadView *payFailedView = [[ASPayFinishHeadView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 100) status:0 desc:@""];
+    [self.scrollView addSubview:payFailedView];
+    K_WEAK_SELF;
+    payFailedView.clickBlock = ^(int type) {
+//        K_STRONG_SELF;
+    };
+    
+    float viewHeight = [payFailedView getViewHeight];
+    payFailedView.frame = CGRectMake(0, 0, KScreenWidth, viewHeight);
+    
+    self.scrollView.contentSize = CGSizeMake(KScreenWidth, viewHeight);
+    
+    
+}
+
+
+@end

+ 5 - 2
Asteria/Fuction/UserCenter/Orders/Model/ASOrderDetailsModel.h

@@ -21,10 +21,13 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, copy) NSString *status; //订单状态
 @property (nonatomic, strong) NSArray<ASOrderDetailsItemModel *> *items;
 @property (nonatomic, copy) NSString *currency_symbol; //币种符号
-
-
+//积分相关
+@property (nonatomic, copy) NSString *mw_rwrdpoints_cur_amnt; //积分抵扣金额
+@property (nonatomic, copy) NSString *mw_rwrdpoints_amnt; //使用积分数量
+@property (nonatomic, copy) NSString *amextrafee_fee_amount;//丢件险
 @property (nonatomic, copy) NSString *subtotal;//初始总价格
 @property (nonatomic, copy) NSString *discount_amount;//优惠券
+@property (nonatomic, copy) NSString *discount_description;//优惠券描述
 @property (nonatomic, copy) NSString *shipping_tax_amount;//邮费
 @property (nonatomic, copy) NSString *grand_total;//最终价格
 

+ 6 - 1
Asteria/Fuction/UserCenter/Orders/Model/ASOrderDetailsModel.m

@@ -19,7 +19,12 @@
 
 + (NSDictionary *)mj_replacedKeyFromPropertyName {
     return @{
-        @"currency_symbol":@"extension_attributes.currency_symbol"
+        @"currency_symbol":@"extension_attributes.currency_symbol",
+        @"mw_rwrdpoints_cur_amnt":@"extension_attributes.mw_rwrdpoints_cur_amnt",
+        @"mw_rwrdpoints_amnt":@"extension_attributes.mw_rwrdpoints_amnt",
+        @"amextrafee_fee_amount":@"extension_attributes.amextrafee_fee_amount"
+        
+        
         
     };
 }

+ 24 - 6
Asteria/Fuction/UserCenter/Orders/View/ASOrderDetailsPriceCell.m

@@ -41,16 +41,35 @@
     
     NSMutableArray *listArr = [[NSMutableArray alloc] initWithCapacity:1];
     
+    //subtotal
     if (AS_String_valid(_orderModel.subtotal)) {
-        NSDictionary *dic = @{@"title":@"Subtotal", @"value":_orderModel.subtotal};
+        NSDictionary *dic = @{@"title":@"Subtotal", @"value":[NSString stringWithFormat:@"%@%@", _orderModel.currency_symbol, _orderModel.subtotal]};
         [listArr addObject:dic];
     }
+    //优惠券
+    if (AS_String_valid(_orderModel.discount_amount) && ![_orderModel.discount_amount isEqualToString:@"0"]) {
+        
+        float discount_amount = fabsf([_orderModel.discount_amount floatValue]);
+        
+        NSDictionary *dic = @{@"title":@"Discount", @"value":[NSString stringWithFormat:@"-%@%.2lf", _orderModel.currency_symbol, discount_amount]};
+        [listArr addObject:dic];
+    }
+    
+    //地址
     if (AS_String_valid(_orderModel.shipping_tax_amount)) {
-        NSDictionary *dic = @{@"title":@"Shipping", @"value":_orderModel.shipping_tax_amount};
+        NSDictionary *dic = @{@"title":@"Shipping & Handling", @"value":[NSString stringWithFormat:@"%@%@", _orderModel.currency_symbol, _orderModel.shipping_tax_amount]};
         [listArr addObject:dic];
     }
-    if (AS_String_valid(_orderModel.discount_amount)) {
-        NSDictionary *dic = @{@"title":@"Gift Card", @"value":_orderModel.discount_amount};
+    
+    //丢件险
+    if (AS_String_valid(_orderModel.amextrafee_fee_amount)) {
+        NSDictionary *dic = @{@"title":@"Extra Fee (Insurance For Lost)", @"value":[NSString stringWithFormat:@"%@%@", _orderModel.currency_symbol, _orderModel.amextrafee_fee_amount]};
+        [listArr addObject:dic];
+    }
+    
+    //积分抵扣
+    if (AS_String_valid(_orderModel.mw_rwrdpoints_amnt) && [AS_String_NotNull(_orderModel.mw_rwrdpoints_amnt) floatValue] > 0) {
+        NSDictionary *dic = @{@"title":[NSString stringWithFormat:@"Reward Points(%@)", _orderModel.mw_rwrdpoints_amnt], @"value":[NSString stringWithFormat:@"-%@%@", _orderModel.currency_symbol, _orderModel.mw_rwrdpoints_cur_amnt]};
         [listArr addObject:dic];
     }
     
@@ -94,11 +113,10 @@
         make.right.mas_equalTo(-10);
         make.height.mas_equalTo(1);
         make.top.equalTo(tempLab.mas_bottom).offset(20);
-//        make.bottom.mas_equalTo(-20);
     }];
     
     
-    UILabel *grandRightLab = [UILabel labelCreateWithText:AS_String_NotNull(_orderModel.grand_total) font:[UIFont fontWithName:Rob_Bold size:24] textColor:Col_000];
+    UILabel *grandRightLab = [UILabel labelCreateWithText:[NSString stringWithFormat:@"%@%@", _orderModel.currency_symbol, _orderModel.grand_total] font:[UIFont fontWithName:Rob_Bold size:24] textColor:Col_000];
     grandRightLab.textAlignment = NSTextAlignmentRight;
     [_backView addSubview:grandRightLab];
     [grandRightLab mas_makeConstraints:^(MASConstraintMaker *make) {

+ 25 - 0
Asteria/Fuction/UserCenter/Orders/View/ASPayFinishHeadView.h

@@ -0,0 +1,25 @@
+//
+//  ASPayFinishHeadView.h
+//  Asteria
+//
+//  Created by xingyu on 2024/5/16.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^ASPayFinishClickBlock)(int type);
+
+@interface ASPayFinishHeadView : UIView
+
+@property (nonatomic, copy) ASPayFinishClickBlock clickBlock;
+
+// 0 失败 1 成功
+- (instancetype)initWithFrame:(CGRect)frame status:(int)status desc:(NSString *)desc;
+
+- (float)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 211 - 0
Asteria/Fuction/UserCenter/Orders/View/ASPayFinishHeadView.m

@@ -0,0 +1,211 @@
+//
+//  ASPayFinishHeadView.m
+//  Asteria
+//
+//  Created by xingyu on 2024/5/16.
+//
+
+#import "ASPayFinishHeadView.h"
+
+@interface ASPayFinishHeadView()
+
+@property (nonatomic, strong) UIView *topBackView;
+
+@property (nonatomic, strong) UIImageView *iconImage;
+@property (nonatomic, strong) UILabel *payStatusLab;
+@property (nonatomic, strong) UILabel *orderNumLab;
+@property (nonatomic, strong) UILabel *descLab;
+
+@property (nonatomic, strong) UIButton *topBtn;
+
+@property (nonatomic, strong) UIView *bottomBackView;
+
+@property (nonatomic, assign) float viewHeight;
+
+@end
+
+@implementation ASPayFinishHeadView
+
+- (instancetype)initWithFrame:(CGRect)frame status:(int)status desc:(NSString *)desc{
+    if (self = [super initWithFrame:frame]) {
+        
+        _topBackView = [[UIView alloc] init];
+        _topBackView.backgroundColor = Col_FFF;
+        TT_ViewRadius(_topBackView, 4);
+        [self addSubview:_topBackView];
+        [_topBackView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.top.mas_equalTo(10);
+            make.right.mas_equalTo(-10);
+        }];
+        
+        _iconImage = [[UIImageView alloc] init];
+        [_topBackView addSubview:_iconImage];
+        [_iconImage mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.centerX.equalTo(_topBackView);
+            make.top.mas_equalTo(30);
+            make.width.height.mas_equalTo(50);
+        }];
+        
+        _payStatusLab = [UILabel labelCreateWithText:@"" font:[UIFont fontWithName:Rob_Bold size:16] textColor:_0B0B0B];
+        _payStatusLab.textAlignment = NSTextAlignmentCenter;
+        [_topBackView addSubview:_payStatusLab];
+        [_payStatusLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(20);
+            make.right.mas_equalTo(-20);
+            make.top.equalTo(_iconImage.mas_bottom).offset(20);
+        }];
+        
+        
+        
+        if (status == 0) {
+            _descLab = [UILabel labelCreateWithText:@"" font:[UIFont fontWithName:Rob_Regular size:12] textColor:_0B0B0B];
+            _descLab.numberOfLines = 0;
+            [_topBackView addSubview:_descLab];
+            [_descLab mas_makeConstraints:^(MASConstraintMaker *make) {
+                make.left.mas_equalTo(20);
+                make.right.mas_equalTo(-20);
+                make.top.mas_equalTo(_payStatusLab.mas_bottom).offset(10);
+            }];
+        } else {
+            _orderNumLab = [UILabel labelCreateWithText:@"" font:[UIFont fontWithName:Rob_Bold size:12] textColor:_0B0B0B];
+            _orderNumLab.textAlignment = NSTextAlignmentCenter;
+            [_topBackView addSubview:_orderNumLab];
+            [_orderNumLab mas_makeConstraints:^(MASConstraintMaker *make) {
+                make.left.mas_equalTo(20);
+                make.right.mas_equalTo(-20);
+                make.top.mas_equalTo(_payStatusLab.mas_bottom).offset(10);
+            }];
+            
+            _descLab = [UILabel labelCreateWithText:@"" font:[UIFont fontWithName:Rob_Regular size:12] textColor:_0B0B0B];
+            _descLab.numberOfLines = 0;
+            [_topBackView addSubview:_descLab];
+            [_descLab mas_makeConstraints:^(MASConstraintMaker *make) {
+                make.left.mas_equalTo(20);
+                make.right.mas_equalTo(-20);
+                make.top.mas_equalTo(_orderNumLab.mas_bottom).offset(10);
+            }];
+        }
+        
+        _topBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        _topBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:14];
+        _topBtn.titleLabel.adjustsFontSizeToFitWidth = YES;
+        [_topBtn setTitleColor:Col_000 forState:UIControlStateNormal];
+        TT_ViewBorderRadius(_topBtn, 0, 1, Col_000);
+        [_topBtn addTarget:self action:@selector(_topClick) forControlEvents:UIControlEventTouchUpInside];
+        [_topBackView addSubview:_topBtn];
+        [_topBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.top.mas_equalTo(_descLab.mas_bottom).offset(10);
+            make.height.mas_equalTo(35);
+            make.width.mas_equalTo(200);
+            make.centerX.equalTo(_topBackView);
+            make.bottom.mas_equalTo(-30);
+        }];
+        
+        _bottomBackView = [[UIView alloc] init];
+        _bottomBackView.backgroundColor = _E0FFF5;
+        TT_ViewRadius(_bottomBackView, 4);
+        [self addSubview:_bottomBackView];
+        [_bottomBackView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.top.equalTo(_topBackView.mas_bottom).offset(20);
+            make.left.mas_equalTo(10);
+            make.right.mas_equalTo(-10);
+            make.height.mas_equalTo(80);
+        }];
+        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_bottomClick)];
+        [_bottomBackView addGestureRecognizer:tap];
+        
+        UILabel *faqsLab = [UILabel labelCreateWithText:@"Faqs" font:[UIFont fontWithName:Rob_Regular size:12] textColor:_0B0B0B];
+        [_bottomBackView addSubview:faqsLab];
+        [faqsLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(10);
+            make.top.mas_equalTo(20);
+        }];
+        
+        UILabel *faqsLab1 = [UILabel labelCreateWithText:@"Please contact customer service if need any help" font:[UIFont fontWithName:Rob_Regular size:12] textColor:_0B0B0B];
+        faqsLab1.adjustsFontSizeToFitWidth = YES;
+        [_bottomBackView addSubview:faqsLab1];
+        [faqsLab1 mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(10);
+            make.right.mas_equalTo(-30);
+            make.top.mas_equalTo(faqsLab.mas_bottom).offset(10);
+        }];
+        
+        UIImageView *arrowRightImgV = [[UIImageView alloc] init];
+        arrowRightImgV.image = [UIImage imageNamed:@"productList_more_right"];
+        [_bottomBackView addSubview:arrowRightImgV];
+        [arrowRightImgV mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.right.mas_equalTo(-10);
+            make.centerY.equalTo(_bottomBackView);
+            make.width.height.mas_equalTo(14);
+        }];
+        
+        float bottomHeight = 20;
+        if (status == 0) {
+            bottomHeight = 85;
+            
+            UIButton *contactBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+            contactBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:14];
+            [contactBtn setTitle:@"Contact Us" forState:UIControlStateNormal];
+            contactBtn.backgroundColor = Col_000;
+            [contactBtn addTarget:self action:@selector(_contactBtnClick) forControlEvents:UIControlEventTouchUpInside];
+            TT_ViewRadius(contactBtn, 4);
+            [contactBtn setTitleColor:Col_FFF forState:UIControlStateNormal];
+            [self addSubview:contactBtn];
+            [contactBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+                make.top.mas_equalTo(_bottomBackView.mas_bottom).offset(20);
+                make.height.mas_equalTo(45);
+                make.left.mas_equalTo(10);
+                make.right.mas_equalTo(-10);
+                
+            }];
+            
+            _iconImage.image = [UIImage imageNamed:@"pay_failed_icon"];
+            _payStatusLab.text = @"Payment Failed.";
+            _descLab.text = @"Please try another card or refresh browser. Paypal gateway has rejected request. The buyer cannot pay with PayPal for this transaction(#13113: buyer cannot pay).";
+            [_topBtn setTitle:@"Edit the payment information" forState:UIControlStateNormal];
+            
+            [_topBtn mas_updateConstraints:^(MASConstraintMaker *make) {
+                make.width.mas_equalTo(260);
+            }];
+            
+        } else {
+            _iconImage.image = [UIImage imageNamed:@"pay_success_icon"];
+            _payStatusLab.text = @"Your Order Has Been Received";
+            _orderNumLab.text = @"Order #123";
+            _descLab.text = @"Please try another card or refresh browser. Paypal gateway has rejected request. The buyer cannot pay with PayPal for this transaction(#13113: buyer cannot pay).";
+            [_topBtn setTitle:@"Continue Shopping" forState:UIControlStateNormal];
+        }
+        
+        [self layoutIfNeeded];
+        [_bottomBackView layoutIfNeeded];
+        
+        self.viewHeight = CGRectGetMaxY(_bottomBackView.frame) + bottomHeight;
+        
+    }
+    return self;
+}
+
+
+- (float)getViewHeight {
+    return self.viewHeight;
+}
+
+- (void)_topClick {
+    if (self.clickBlock) {
+        self.clickBlock(1);
+    }
+}
+
+- (void)_bottomClick {
+    if (self.clickBlock) {
+        self.clickBlock(2);
+    }
+}
+
+- (void)_contactBtnClick {
+    if (self.clickBlock) {
+        self.clickBlock(3);
+    }
+}
+
+@end

+ 1 - 1
Asteria/Product/CTMediatoaTargets/CTMediator+ASTargerts.m

@@ -18,7 +18,7 @@
 }
 
 -(UIViewController *)Goods_GoodsDetailsC:(NSDictionary *)params{
-    return [self performTarget:@"Goods" action:@"AS_GoodsDetailsC" params:params shouldCacheTarget:NO];
+    return [self performTarget:@"Goods" action:@"ASGoodsDetailsViewController" params:params shouldCacheTarget:NO];
 }
 -(UIViewController *)Goods_GoodsSizeC:(NSDictionary *)params{
     return [self performTarget:@"Goods" action:@"AS_GoodsSizeC" params:params shouldCacheTarget:NO];