Commit 1d915dfa authored by Steven杜宇's avatar Steven杜宇

Merge branch 'plan' into 'develop'

合并plan代码到dev

See merge request !7
parents e714338c 8b79a9dc
......@@ -33,11 +33,10 @@ platform :ios do
sc_105_branch = "sc-1.0.5"
main_fix = "main-fix"
jiaofei = "jiaofei"
lint = "swiftLint-develop"
plan = "plan"
#打包正使用的分支
myPack_branch = develop_branch
myPack_branch = plan
# 打adhoc包 执行命令 fastlane galaxyTest
......
......@@ -1169,6 +1169,24 @@
048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */; };
048D6AE12D5F17C400BC6F4C /* YHMembershipLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6AE02D5F17C400BC6F4C /* YHMembershipLevel.swift */; };
048D6AE32D6348F000BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6AE22D6348EF00BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift */; };
0497C7532D9BD21500A3E32A /* YHMakePlanViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0497C7522D9BD21500A3E32A /* YHMakePlanViewModel.swift */; };
0497C7552D9BD36700A3E32A /* YHMakePlanModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0497C7542D9BD36700A3E32A /* YHMakePlanModel.swift */; };
0497C7572D9D437B00A3E32A /* YHMakePlanScoreModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0497C7562D9D437B00A3E32A /* YHMakePlanScoreModel.swift */; };
0497C7592DA4CFF000A3E32A /* D-DIN-PRO-500-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0497C7582DA4CFEF00A3E32A /* D-DIN-PRO-500-Medium.otf */; };
0497C75B2DA4CFFA00A3E32A /* D-DIN-PRO-700-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0497C75A2DA4CFFA00A3E32A /* D-DIN-PRO-700-Bold.otf */; };
04A750D02D925FD400974E5F /* YHCustomerInformationQuestionnaireVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750CF2D925FD400974E5F /* YHCustomerInformationQuestionnaireVC.swift */; };
04A750D22D93ABCE00974E5F /* YHSurveyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750D12D93ABCE00974E5F /* YHSurveyTableViewCell.swift */; };
04A750D42D93DFED00974E5F /* YHSurveyQuestionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750D32D93DFED00974E5F /* YHSurveyQuestionType.swift */; };
04A750D62D94242000974E5F /* YHSurveySubmitDoneViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750D52D94242000974E5F /* YHSurveySubmitDoneViewController.swift */; };
04A750D82D94F3F400974E5F /* YHSurveyMatchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750D72D94F3F400974E5F /* YHSurveyMatchResultViewController.swift */; };
04A750DA2D94FDDF00974E5F /* YHSurveyMatchingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750D92D94FDDF00974E5F /* YHSurveyMatchingViewController.swift */; };
04A750E82D952F2E00974E5F /* survey_match_success.json in Resources */ = {isa = PBXBuildFile; fileRef = 04A750E72D952F2E00974E5F /* survey_match_success.json */; };
04A750E92D952F2E00974E5F /* survey_file_scan.json in Resources */ = {isa = PBXBuildFile; fileRef = 04A750E62D952F2E00974E5F /* survey_file_scan.json */; };
04A750EB2D963AFE00974E5F /* YHSurveyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750EA2D963AFE00974E5F /* YHSurveyViewModel.swift */; };
04A750ED2D963BE900974E5F /* YHSurveyContentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750EC2D963BE900974E5F /* YHSurveyContentModel.swift */; };
04A750EF2D9A9E8A00974E5F /* YHSurveySubmitRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750EE2D9A9E8A00974E5F /* YHSurveySubmitRequestModel.swift */; };
04A750F12D9AAD0300974E5F /* YHSurveyResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750F02D9AAD0300974E5F /* YHSurveyResponseModel.swift */; };
04A750F32D9AB95300974E5F /* YHSurveyRenewalPlanState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A750F22D9AB95300974E5F /* YHSurveyRenewalPlanState.swift */; };
04AE200F2D12CFAF00891D24 /* YHGCMineSchemeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AE1FF82D12CFAF00891D24 /* YHGCMineSchemeViewController.swift */; };
04AE20102D12CFAF00891D24 /* YHGCApplicationTypeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AE1FFD2D12CFAF00891D24 /* YHGCApplicationTypeController.swift */; };
04AE20112D12CFAF00891D24 /* YHGCApplicationTypeResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AE1FFE2D12CFAF00891D24 /* YHGCApplicationTypeResultController.swift */; };
......@@ -1216,6 +1234,39 @@
04AFEF572D6C78AA0007A011 /* YHVipLevelRightViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AFEF562D6C78AA0007A011 /* YHVipLevelRightViewController.swift */; };
04AFEF592D6C8CE00007A011 /* YHVipLevelRightHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AFEF582D6C8CDF0007A011 /* YHVipLevelRightHeaderView.swift */; };
04AFEF5B2D76DC740007A011 /* YHTravelCertificateUsageTipsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AFEF5A2D76DC740007A011 /* YHTravelCertificateUsageTipsView.swift */; };
04B00FBF2D9A420F00F640C5 /* YHMakePlanSelectAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB92D9A420F00F640C5 /* YHMakePlanSelectAlertView.swift */; };
04B00FC02D9A420F00F640C5 /* YHMakePlanBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB32D9A420F00F640C5 /* YHMakePlanBottomView.swift */; };
04B00FC12D9A420F00F640C5 /* YHMakePlanCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB52D9A420F00F640C5 /* YHMakePlanCell.swift */; };
04B00FC22D9A420F00F640C5 /* YHMakePlanCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB42D9A420F00F640C5 /* YHMakePlanCardView.swift */; };
04B00FC32D9A420F00F640C5 /* YHMakePlanShareAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FBA2D9A420F00F640C5 /* YHMakePlanShareAlertView.swift */; };
04B00FC42D9A420F00F640C5 /* YHMakePlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB02D9A420F00F640C5 /* YHMakePlanViewController.swift */; };
04B00FC52D9A420F00F640C5 /* YHMakePlanStateHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FBB2D9A420F00F640C5 /* YHMakePlanStateHeadView.swift */; };
04B00FC62D9A420F00F640C5 /* YHMakePlanHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB72D9A420F00F640C5 /* YHMakePlanHeadView.swift */; };
04B00FC72D9A420F00F640C5 /* YHMakePlanPriceAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB82D9A420F00F640C5 /* YHMakePlanPriceAlertView.swift */; };
04B00FC82D9A420F00F640C5 /* YHMakePlanCusttomHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FB62D9A420F00F640C5 /* YHMakePlanCusttomHeadView.swift */; };
04B00FCA2D9AAD6100F640C5 /* YHMakePlanTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B00FC92D9AAD6100F640C5 /* YHMakePlanTopView.swift */; };
04D8FF552D9258AA00703C75 /* YHPlanScoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF542D9258AA00703C75 /* YHPlanScoreView.swift */; };
04D8FF572D925A0800703C75 /* YHPlanScoreChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF562D925A0800703C75 /* YHPlanScoreChart.swift */; };
04D8FF592D925E6700703C75 /* YHPlanModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF582D925E6700703C75 /* YHPlanModel.swift */; };
04D8FF5B2D925E8100703C75 /* YHPlanViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF5A2D925E8100703C75 /* YHPlanViewModel.swift */; };
04D8FF5F2D93945100703C75 /* YHPlanAnalyzeInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF5E2D93945100703C75 /* YHPlanAnalyzeInfoCell.swift */; };
04D8FF612D939D2400703C75 /* YHPlanScoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF602D939D2400703C75 /* YHPlanScoreCell.swift */; };
04D8FF632D93A98200703C75 /* YHPlanProductListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF622D93A98200703C75 /* YHPlanProductListView.swift */; };
04D8FF652D93CCBA00703C75 /* YHPlanCustomerCaseListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF642D93CCBA00703C75 /* YHPlanCustomerCaseListCell.swift */; };
04D8FF672D93D15800703C75 /* YHPlanCustomerCaseCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF662D93D15800703C75 /* YHPlanCustomerCaseCollectionCell.swift */; };
04D8FF692D93D4E500703C75 /* YHPlanCustomerCaseListLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF682D93D4E500703C75 /* YHPlanCustomerCaseListLayout.swift */; };
04D8FF6B2D94EADE00703C75 /* YHPlanItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF6A2D94EADE00703C75 /* YHPlanItemView.swift */; };
04D8FF6D2D94EE1100703C75 /* YHLookPlanButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF6C2D94EE1100703C75 /* YHLookPlanButton.swift */; };
04D8FF6F2D954D9B00703C75 /* YHPlanPolicyCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF6E2D954D9B00703C75 /* YHPlanPolicyCarouselView.swift */; };
04D8FF712D9550E700703C75 /* YHPlanPolicyCarouselImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF702D9550E700703C75 /* YHPlanPolicyCarouselImageCell.swift */; };
04D8FF732D96759400703C75 /* YHPlanScoreLevelTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF722D96759400703C75 /* YHPlanScoreLevelTextView.swift */; };
04D8FF752D978CF000703C75 /* YHPlanLinkShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF742D978CF000703C75 /* YHPlanLinkShareView.swift */; };
04D8FF772D979BCC00703C75 /* YHPlanPolicyDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF762D979BCC00703C75 /* YHPlanPolicyDetailViewController.swift */; };
04D8FF792D97BDBD00703C75 /* YHPlanShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF782D97BDBD00703C75 /* YHPlanShareViewController.swift */; };
04D8FF7B2D97C29E00703C75 /* YHPlanShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FF7A2D97C29E00703C75 /* YHPlanShareView.swift */; };
04D8FFB02D9A3CF200703C75 /* YHPlanShareImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FFAF2D9A3CF200703C75 /* YHPlanShareImageCell.swift */; };
04D8FFB22DA5007A00703C75 /* YHPictureBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FFB12DA5007A00703C75 /* YHPictureBrowserViewController.swift */; };
04D8FFB42DA61DA300703C75 /* YHPlanTestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D8FFB32DA61DA200703C75 /* YHPlanTestViewController.swift */; };
04E4CF3E2D5C6D32004D4013 /* YHCountryMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E4CF3D2D5C6D32004D4013 /* YHCountryMessageView.swift */; };
04E4CF402D5C83AE004D4013 /* YHSelectPhoneCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E4CF3F2D5C83AE004D4013 /* YHSelectPhoneCountryViewController.swift */; };
04E507D62D6EE856005F758B /* YHUserLevelAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E507D52D6EE856005F758B /* YHUserLevelAlertView.swift */; };
......@@ -2426,6 +2477,24 @@
048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderBannerCell.swift; sourceTree = "<group>"; };
048D6AE02D5F17C400BC6F4C /* YHMembershipLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMembershipLevel.swift; sourceTree = "<group>"; };
048D6AE22D6348EF00BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterCurrentPrivilegeCell.swift; sourceTree = "<group>"; };
0497C7522D9BD21500A3E32A /* YHMakePlanViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanViewModel.swift; sourceTree = "<group>"; };
0497C7542D9BD36700A3E32A /* YHMakePlanModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanModel.swift; sourceTree = "<group>"; };
0497C7562D9D437B00A3E32A /* YHMakePlanScoreModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanScoreModel.swift; sourceTree = "<group>"; };
0497C7582DA4CFEF00A3E32A /* D-DIN-PRO-500-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "D-DIN-PRO-500-Medium.otf"; sourceTree = "<group>"; };
0497C75A2DA4CFFA00A3E32A /* D-DIN-PRO-700-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "D-DIN-PRO-700-Bold.otf"; sourceTree = "<group>"; };
04A750CF2D925FD400974E5F /* YHCustomerInformationQuestionnaireVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHCustomerInformationQuestionnaireVC.swift; sourceTree = "<group>"; };
04A750D12D93ABCE00974E5F /* YHSurveyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyTableViewCell.swift; sourceTree = "<group>"; };
04A750D32D93DFED00974E5F /* YHSurveyQuestionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyQuestionType.swift; sourceTree = "<group>"; };
04A750D52D94242000974E5F /* YHSurveySubmitDoneViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveySubmitDoneViewController.swift; sourceTree = "<group>"; };
04A750D72D94F3F400974E5F /* YHSurveyMatchResultViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyMatchResultViewController.swift; sourceTree = "<group>"; };
04A750D92D94FDDF00974E5F /* YHSurveyMatchingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyMatchingViewController.swift; sourceTree = "<group>"; };
04A750E62D952F2E00974E5F /* survey_file_scan.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = survey_file_scan.json; sourceTree = "<group>"; };
04A750E72D952F2E00974E5F /* survey_match_success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = survey_match_success.json; sourceTree = "<group>"; };
04A750EA2D963AFE00974E5F /* YHSurveyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyViewModel.swift; sourceTree = "<group>"; };
04A750EC2D963BE900974E5F /* YHSurveyContentModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyContentModel.swift; sourceTree = "<group>"; };
04A750EE2D9A9E8A00974E5F /* YHSurveySubmitRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveySubmitRequestModel.swift; sourceTree = "<group>"; };
04A750F02D9AAD0300974E5F /* YHSurveyResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyResponseModel.swift; sourceTree = "<group>"; };
04A750F22D9AB95300974E5F /* YHSurveyRenewalPlanState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSurveyRenewalPlanState.swift; sourceTree = "<group>"; };
04AE1FF82D12CFAF00891D24 /* YHGCMineSchemeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCMineSchemeViewController.swift; sourceTree = "<group>"; };
04AE1FFA2D12CFAF00891D24 /* YHGCSchemeTableHeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCSchemeTableHeadView.swift; sourceTree = "<group>"; };
04AE1FFD2D12CFAF00891D24 /* YHGCApplicationTypeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCApplicationTypeController.swift; sourceTree = "<group>"; };
......@@ -2471,6 +2540,42 @@
04AFEF562D6C78AA0007A011 /* YHVipLevelRightViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVipLevelRightViewController.swift; sourceTree = "<group>"; };
04AFEF582D6C8CDF0007A011 /* YHVipLevelRightHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVipLevelRightHeaderView.swift; sourceTree = "<group>"; };
04AFEF5A2D76DC740007A011 /* YHTravelCertificateUsageTipsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHTravelCertificateUsageTipsView.swift; sourceTree = "<group>"; };
04B00F8B2D97C07900F640C5 /* YHMakePlanPriceAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanPriceAlertView.swift; sourceTree = "<group>"; };
04B00F8D2D97CBD900F640C5 /* YHMakePlanSelectAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanSelectAlertView.swift; sourceTree = "<group>"; };
04B00F8F2D97D7A700F640C5 /* YHMakePlanShareAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanShareAlertView.swift; sourceTree = "<group>"; };
04B00FB02D9A420F00F640C5 /* YHMakePlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanViewController.swift; sourceTree = "<group>"; };
04B00FB32D9A420F00F640C5 /* YHMakePlanBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanBottomView.swift; sourceTree = "<group>"; };
04B00FB42D9A420F00F640C5 /* YHMakePlanCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanCardView.swift; sourceTree = "<group>"; };
04B00FB52D9A420F00F640C5 /* YHMakePlanCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanCell.swift; sourceTree = "<group>"; };
04B00FB62D9A420F00F640C5 /* YHMakePlanCusttomHeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanCusttomHeadView.swift; sourceTree = "<group>"; };
04B00FB72D9A420F00F640C5 /* YHMakePlanHeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanHeadView.swift; sourceTree = "<group>"; };
04B00FB82D9A420F00F640C5 /* YHMakePlanPriceAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanPriceAlertView.swift; sourceTree = "<group>"; };
04B00FB92D9A420F00F640C5 /* YHMakePlanSelectAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanSelectAlertView.swift; sourceTree = "<group>"; };
04B00FBA2D9A420F00F640C5 /* YHMakePlanShareAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanShareAlertView.swift; sourceTree = "<group>"; };
04B00FBB2D9A420F00F640C5 /* YHMakePlanStateHeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanStateHeadView.swift; sourceTree = "<group>"; };
04B00FC92D9AAD6100F640C5 /* YHMakePlanTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMakePlanTopView.swift; sourceTree = "<group>"; };
04D8FF542D9258AA00703C75 /* YHPlanScoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanScoreView.swift; sourceTree = "<group>"; };
04D8FF562D925A0800703C75 /* YHPlanScoreChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanScoreChart.swift; sourceTree = "<group>"; };
04D8FF582D925E6700703C75 /* YHPlanModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanModel.swift; sourceTree = "<group>"; };
04D8FF5A2D925E8100703C75 /* YHPlanViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanViewModel.swift; sourceTree = "<group>"; };
04D8FF5E2D93945100703C75 /* YHPlanAnalyzeInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanAnalyzeInfoCell.swift; sourceTree = "<group>"; };
04D8FF602D939D2400703C75 /* YHPlanScoreCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanScoreCell.swift; sourceTree = "<group>"; };
04D8FF622D93A98200703C75 /* YHPlanProductListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanProductListView.swift; sourceTree = "<group>"; };
04D8FF642D93CCBA00703C75 /* YHPlanCustomerCaseListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanCustomerCaseListCell.swift; sourceTree = "<group>"; };
04D8FF662D93D15800703C75 /* YHPlanCustomerCaseCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanCustomerCaseCollectionCell.swift; sourceTree = "<group>"; };
04D8FF682D93D4E500703C75 /* YHPlanCustomerCaseListLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanCustomerCaseListLayout.swift; sourceTree = "<group>"; };
04D8FF6A2D94EADE00703C75 /* YHPlanItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanItemView.swift; sourceTree = "<group>"; };
04D8FF6C2D94EE1100703C75 /* YHLookPlanButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHLookPlanButton.swift; sourceTree = "<group>"; };
04D8FF6E2D954D9B00703C75 /* YHPlanPolicyCarouselView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanPolicyCarouselView.swift; sourceTree = "<group>"; };
04D8FF702D9550E700703C75 /* YHPlanPolicyCarouselImageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanPolicyCarouselImageCell.swift; sourceTree = "<group>"; };
04D8FF722D96759400703C75 /* YHPlanScoreLevelTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanScoreLevelTextView.swift; sourceTree = "<group>"; };
04D8FF742D978CF000703C75 /* YHPlanLinkShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanLinkShareView.swift; sourceTree = "<group>"; };
04D8FF762D979BCC00703C75 /* YHPlanPolicyDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanPolicyDetailViewController.swift; sourceTree = "<group>"; };
04D8FF782D97BDBD00703C75 /* YHPlanShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanShareViewController.swift; sourceTree = "<group>"; };
04D8FF7A2D97C29E00703C75 /* YHPlanShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanShareView.swift; sourceTree = "<group>"; };
04D8FFAF2D9A3CF200703C75 /* YHPlanShareImageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanShareImageCell.swift; sourceTree = "<group>"; };
04D8FFB12DA5007A00703C75 /* YHPictureBrowserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPictureBrowserViewController.swift; sourceTree = "<group>"; };
04D8FFB32DA61DA200703C75 /* YHPlanTestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHPlanTestViewController.swift; sourceTree = "<group>"; };
04E4CF3D2D5C6D32004D4013 /* YHCountryMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHCountryMessageView.swift; sourceTree = "<group>"; };
04E4CF3F2D5C83AE004D4013 /* YHSelectPhoneCountryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSelectPhoneCountryViewController.swift; sourceTree = "<group>"; };
04E507D52D6EE856005F758B /* YHUserLevelAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHUserLevelAlertView.swift; sourceTree = "<group>"; };
......@@ -5883,6 +5988,7 @@
children = (
045C0EFE2D12CA5E00BD2DC0 /* YHLongtapPictureSheetView.swift */,
045C0EFF2D12CA5E00BD2DC0 /* YHPictureReviewManager.swift */,
04D8FFB12DA5007A00703C75 /* YHPictureBrowserViewController.swift */,
);
path = "PictureReview(图片预览)";
sourceTree = "<group>";
......@@ -5925,6 +6031,7 @@
045C0F0A2D12CA5E00BD2DC0 /* Modules */ = {
isa = PBXGroup;
children = (
04D8FF4F2D9257F700703C75 /* Plan(方案) */,
045C0A4E2D12CA5E00BD2DC0 /* AI */,
045C0A502D12CA5E00BD2DC0 /* AliYunLog(阿里云日志) */,
045C0A552D12CA5E00BD2DC0 /* AppleLogin(苹果登录) */,
......@@ -6103,7 +6210,9 @@
045C0F4C2D12CA5E00BD2DC0 /* Font */ = {
isa = PBXGroup;
children = (
0497C7582DA4CFEF00A3E32A /* D-DIN-PRO-500-Medium.otf */,
045C0F492D12CA5E00BD2DC0 /* AlibabaPuHuiTi-Bold.ttf */,
0497C75A2DA4CFFA00A3E32A /* D-DIN-PRO-700-Bold.otf */,
045C0F4A2D12CA5E00BD2DC0 /* AlimamaShuHeiTi-Bold.ttf */,
045C0F4B2D12CA5E00BD2DC0 /* DIN Alternate Bold.ttf */,
);
......@@ -6201,6 +6310,7 @@
045C0F6E2D12CA5E00BD2DC0 /* jsons */ = {
isa = PBXGroup;
children = (
04A750E32D952EFC00974E5F /* survey */,
045C0F522D12CA5E00BD2DC0 /* ai_chat_input_pause */,
045C0F542D12CA5E00BD2DC0 /* ai_chat_loading */,
045C0F562D12CA5E00BD2DC0 /* gangxiaobao_logo */,
......@@ -6308,6 +6418,15 @@
path = V;
sourceTree = "<group>";
};
04A750E32D952EFC00974E5F /* survey */ = {
isa = PBXGroup;
children = (
04A750E62D952F2E00974E5F /* survey_file_scan.json */,
04A750E72D952F2E00974E5F /* survey_match_success.json */,
);
path = survey;
sourceTree = "<group>";
};
04AE1FF92D12CFAF00891D24 /* C */ = {
isa = PBXGroup;
children = (
......@@ -6589,6 +6708,141 @@
path = VM;
sourceTree = "<group>";
};
04B00F912D97EC8400F640C5 /* Recovered References */ = {
isa = PBXGroup;
children = (
04B00F8D2D97CBD900F640C5 /* YHMakePlanSelectAlertView.swift */,
04B00F8F2D97D7A700F640C5 /* YHMakePlanShareAlertView.swift */,
04B00F8B2D97C07900F640C5 /* YHMakePlanPriceAlertView.swift */,
);
name = "Recovered References";
sourceTree = "<group>";
};
04B00FB12D9A420F00F640C5 /* C */ = {
isa = PBXGroup;
children = (
04B00FB02D9A420F00F640C5 /* YHMakePlanViewController.swift */,
);
path = C;
sourceTree = "<group>";
};
04B00FB22D9A420F00F640C5 /* M */ = {
isa = PBXGroup;
children = (
0497C7542D9BD36700A3E32A /* YHMakePlanModel.swift */,
0497C7562D9D437B00A3E32A /* YHMakePlanScoreModel.swift */,
);
path = M;
sourceTree = "<group>";
};
04B00FBC2D9A420F00F640C5 /* V */ = {
isa = PBXGroup;
children = (
04B00FB32D9A420F00F640C5 /* YHMakePlanBottomView.swift */,
04B00FB42D9A420F00F640C5 /* YHMakePlanCardView.swift */,
04B00FB52D9A420F00F640C5 /* YHMakePlanCell.swift */,
04B00FB62D9A420F00F640C5 /* YHMakePlanCusttomHeadView.swift */,
04B00FB72D9A420F00F640C5 /* YHMakePlanHeadView.swift */,
04B00FB82D9A420F00F640C5 /* YHMakePlanPriceAlertView.swift */,
04B00FB92D9A420F00F640C5 /* YHMakePlanSelectAlertView.swift */,
04B00FBA2D9A420F00F640C5 /* YHMakePlanShareAlertView.swift */,
04B00FBB2D9A420F00F640C5 /* YHMakePlanStateHeadView.swift */,
04B00FC92D9AAD6100F640C5 /* YHMakePlanTopView.swift */,
);
path = V;
sourceTree = "<group>";
};
04B00FBD2D9A420F00F640C5 /* VM */ = {
isa = PBXGroup;
children = (
0497C7522D9BD21500A3E32A /* YHMakePlanViewModel.swift */,
);
path = VM;
sourceTree = "<group>";
};
04B00FBE2D9A420F00F640C5 /* MakePlan */ = {
isa = PBXGroup;
children = (
04B00FB12D9A420F00F640C5 /* C */,
04B00FB22D9A420F00F640C5 /* M */,
04B00FBC2D9A420F00F640C5 /* V */,
04B00FBD2D9A420F00F640C5 /* VM */,
);
path = MakePlan;
sourceTree = "<group>";
};
04D8FF4F2D9257F700703C75 /* Plan(方案) */ = {
isa = PBXGroup;
children = (
04B00FBE2D9A420F00F640C5 /* MakePlan */,
04D8FF532D92581300703C75 /* VM */,
04D8FF522D92580F00703C75 /* M */,
04D8FF512D92580900703C75 /* V */,
04D8FF502D92580200703C75 /* C */,
);
path = "Plan(方案)";
sourceTree = "<group>";
};
04D8FF502D92580200703C75 /* C */ = {
isa = PBXGroup;
children = (
04D8FFB32DA61DA200703C75 /* YHPlanTestViewController.swift */,
04A750CF2D925FD400974E5F /* YHCustomerInformationQuestionnaireVC.swift */,
04A750D52D94242000974E5F /* YHSurveySubmitDoneViewController.swift */,
04A750D72D94F3F400974E5F /* YHSurveyMatchResultViewController.swift */,
04A750D92D94FDDF00974E5F /* YHSurveyMatchingViewController.swift */,
04D8FF762D979BCC00703C75 /* YHPlanPolicyDetailViewController.swift */,
04D8FF782D97BDBD00703C75 /* YHPlanShareViewController.swift */,
);
path = C;
sourceTree = "<group>";
};
04D8FF512D92580900703C75 /* V */ = {
isa = PBXGroup;
children = (
04D8FF542D9258AA00703C75 /* YHPlanScoreView.swift */,
04D8FF562D925A0800703C75 /* YHPlanScoreChart.swift */,
04D8FF5E2D93945100703C75 /* YHPlanAnalyzeInfoCell.swift */,
04D8FF602D939D2400703C75 /* YHPlanScoreCell.swift */,
04D8FF622D93A98200703C75 /* YHPlanProductListView.swift */,
04D8FF642D93CCBA00703C75 /* YHPlanCustomerCaseListCell.swift */,
04D8FF682D93D4E500703C75 /* YHPlanCustomerCaseListLayout.swift */,
04D8FF662D93D15800703C75 /* YHPlanCustomerCaseCollectionCell.swift */,
04D8FF6A2D94EADE00703C75 /* YHPlanItemView.swift */,
04D8FF6C2D94EE1100703C75 /* YHLookPlanButton.swift */,
04A750D12D93ABCE00974E5F /* YHSurveyTableViewCell.swift */,
04D8FF6E2D954D9B00703C75 /* YHPlanPolicyCarouselView.swift */,
04D8FF702D9550E700703C75 /* YHPlanPolicyCarouselImageCell.swift */,
04D8FF722D96759400703C75 /* YHPlanScoreLevelTextView.swift */,
04D8FF742D978CF000703C75 /* YHPlanLinkShareView.swift */,
04D8FF7A2D97C29E00703C75 /* YHPlanShareView.swift */,
04D8FFAF2D9A3CF200703C75 /* YHPlanShareImageCell.swift */,
);
path = V;
sourceTree = "<group>";
};
04D8FF522D92580F00703C75 /* M */ = {
isa = PBXGroup;
children = (
04D8FF582D925E6700703C75 /* YHPlanModel.swift */,
04A750EE2D9A9E8A00974E5F /* YHSurveySubmitRequestModel.swift */,
04A750D32D93DFED00974E5F /* YHSurveyQuestionType.swift */,
04A750EC2D963BE900974E5F /* YHSurveyContentModel.swift */,
04A750F02D9AAD0300974E5F /* YHSurveyResponseModel.swift */,
04A750F22D9AB95300974E5F /* YHSurveyRenewalPlanState.swift */,
);
path = M;
sourceTree = "<group>";
};
04D8FF532D92581300703C75 /* VM */ = {
isa = PBXGroup;
children = (
04D8FF5A2D925E8100703C75 /* YHPlanViewModel.swift */,
04A750EA2D963AFE00974E5F /* YHSurveyViewModel.swift */,
);
path = VM;
sourceTree = "<group>";
};
4758815B24BAF3CAA24EC6A8 /* Pods */ = {
isa = PBXGroup;
children = (
......@@ -6623,6 +6877,7 @@
A5573ECF2B317BFF00D98EC0 /* Products */,
4758815B24BAF3CAA24EC6A8 /* Pods */,
8D4DE9CA401A76BB1ECBE46E /* Frameworks */,
04B00F912D97EC8400F640C5 /* Recovered References */,
);
sourceTree = "<group>";
};
......@@ -6765,10 +7020,12 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0497C7592DA4CFF000A3E32A /* D-DIN-PRO-500-Medium.otf in Resources */,
04AE201A2D12D10200891D24 /* ATAuthSDK.bundle in Resources */,
045C0F7F2D12CA5F00BD2DC0 /* submit_page_scroll.gif in Resources */,
045C0F802D12CA5F00BD2DC0 /* Localizable.xcstrings in Resources */,
045C0F812D12CA5F00BD2DC0 /* img_0.png in Resources */,
0497C75B2DA4CFFA00A3E32A /* D-DIN-PRO-700-Bold.otf in Resources */,
045C0F822D12CA5F00BD2DC0 /* people_launch.json in Resources */,
045C0F832D12CA5F00BD2DC0 /* loginBkg.mov in Resources */,
045C0F842D12CA5F00BD2DC0 /* live.json in Resources */,
......@@ -6788,6 +7045,8 @@
045C0F932D12CA5F00BD2DC0 /* agconnect-services.plist in Resources */,
045C0F942D12CA5F00BD2DC0 /* galaxy_refresher.gif in Resources */,
045C0F952D12CA5F00BD2DC0 /* area.plist in Resources */,
04A750E82D952F2E00974E5F /* survey_match_success.json in Resources */,
04A750E92D952F2E00974E5F /* survey_file_scan.json in Resources */,
045C0F962D12CA5F00BD2DC0 /* Assets.xcassets in Resources */,
045C0F972D12CA5F00BD2DC0 /* YHQuestionList.plist in Resources */,
045C0F982D12CA5F00BD2DC0 /* AlibabaPuHuiTi-Bold.ttf in Resources */,
......@@ -6849,10 +7108,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-frameworks.sh\"\n";
......@@ -6866,10 +7129,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-resources-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-resources-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-resources.sh\"\n";
......@@ -6934,6 +7201,7 @@
045C0FBF2D12CA5F00BD2DC0 /* YHMyLikeViewController.swift in Sources */,
045C0FC02D12CA5F00BD2DC0 /* YHHomeCollectionLayout.swift in Sources */,
045C0FC12D12CA5F00BD2DC0 /* YHOffivialApprovalGuildLineCheckView.swift in Sources */,
04A750ED2D963BE900974E5F /* YHSurveyContentModel.swift in Sources */,
045C0FC22D12CA5F00BD2DC0 /* YHIncomeTypesCell.swift in Sources */,
045C0FC32D12CA5F00BD2DC0 /* YHIncomeRecordSummaryCell.swift in Sources */,
045C0FC42D12CA5F00BD2DC0 /* YHSheetPickerViewType.swift in Sources */,
......@@ -6944,6 +7212,7 @@
045C0FC82D12CA5F00BD2DC0 /* YHCollectionModel.swift in Sources */,
045C0FC92D12CA5F00BD2DC0 /* YHOtherLanguageSelecteView.swift in Sources */,
045C0FCA2D12CA5F00BD2DC0 /* YHAutoTextView.swift in Sources */,
04D8FF5B2D925E8100703C75 /* YHPlanViewModel.swift in Sources */,
045C0FCB2D12CA5F00BD2DC0 /* UIView+Extension.swift in Sources */,
045C0FCC2D12CA5F00BD2DC0 /* YHGalaxyManagerTipsItemView.swift in Sources */,
045C0FCD2D12CA5F00BD2DC0 /* YHFormItemDegreeInfoCell.swift in Sources */,
......@@ -7007,6 +7276,7 @@
045C10012D12CA5F00BD2DC0 /* YHCertificateAppointViewController.swift in Sources */,
045C10022D12CA5F00BD2DC0 /* YHResultBottomView.swift in Sources */,
045C10032D12CA5F00BD2DC0 /* YHWorkFileItemView.swift in Sources */,
04D8FF7B2D97C29E00703C75 /* YHPlanShareView.swift in Sources */,
045C10042D12CA5F00BD2DC0 /* YHSchemeModel.swift in Sources */,
045C10052D12CA5F00BD2DC0 /* YHPrincipleRequestModel.swift in Sources */,
045C10062D12CA5F00BD2DC0 /* YHWorkExperienceTextItemView.swift in Sources */,
......@@ -7037,6 +7307,7 @@
0411CF082D1A896800644D35 /* YHGCMySignatureListModel.swift in Sources */,
045C101D2D12CA5F00BD2DC0 /* YHHUDProgressView.swift in Sources */,
045C101E2D12CA5F00BD2DC0 /* YHFailPromptView.swift in Sources */,
04D8FF592D925E6700703C75 /* YHPlanModel.swift in Sources */,
045C101F2D12CA5F00BD2DC0 /* YHBasePlayerViewController.swift in Sources */,
0411CEFE2D1A7FFD00644D35 /* YHGCMySignatureListViewController.swift in Sources */,
045C10202D12CA5F00BD2DC0 /* YHSelectLookHeadView.swift in Sources */,
......@@ -7054,11 +7325,13 @@
045C102B2D12CA5F00BD2DC0 /* YHAppVersionForceUpdateView.swift in Sources */,
045C102C2D12CA5F00BD2DC0 /* YHMyPermissionCell.swift in Sources */,
04AFEF3F2D5D8F8A0007A011 /* YHMyNewViewController.swift in Sources */,
04D8FF6B2D94EADE00703C75 /* YHPlanItemView.swift in Sources */,
045C102D2D12CA5F00BD2DC0 /* YHHKEventModel.swift in Sources */,
045C102E2D12CA5F00BD2DC0 /* YHOfficailLetterColledtionCell.swift in Sources */,
045C102F2D12CA5F00BD2DC0 /* YHFormItemInputTextCell.swift in Sources */,
04307BAE2D1FFEA200ED8E8D /* YHLiveAppointmentViewController.swift in Sources */,
045C10302D12CA5F00BD2DC0 /* YHFamilyInfoWarmTipsView.swift in Sources */,
04D8FF632D93A98200703C75 /* YHPlanProductListView.swift in Sources */,
045C10312D12CA5F00BD2DC0 /* YHSpouseInfoContainerVC.swift in Sources */,
045C10322D12CA5F00BD2DC0 /* YHRecommendTextMessageCell.swift in Sources */,
045C10332D12CA5F00BD2DC0 /* YHBasicInfoFillModel.swift in Sources */,
......@@ -7070,6 +7343,7 @@
0411CEEB2D1512AF00644D35 /* YHGCWorkItemListViewModel.swift in Sources */,
045C10392D12CA5F00BD2DC0 /* YHHKMemberModel.swift in Sources */,
045C103A2D12CA5F00BD2DC0 /* YHCertificateUploadContentListVC.swift in Sources */,
04D8FFB02D9A3CF200703C75 /* YHPlanShareImageCell.swift in Sources */,
045C103B2D12CA5F00BD2DC0 /* YHOtherYesOrNoItemView.swift in Sources */,
045C103C2D12CA5F00BD2DC0 /* YhConstant.swift in Sources */,
045C103D2D12CA5F00BD2DC0 /* YHAdopterTravelItemTableViewCell.swift in Sources */,
......@@ -7155,6 +7429,7 @@
04AE20182D12CFAF00891D24 /* YHGCApplicationModel.swift in Sources */,
04AE20192D12CFAF00891D24 /* YHGCApplicationTypeResponseModel.swift in Sources */,
0411CF022D1A80F500644D35 /* YHGCMySignatureDetailViewController.swift in Sources */,
04D8FF552D9258AA00703C75 /* YHPlanScoreView.swift in Sources */,
045C10822D12CA5F00BD2DC0 /* YHHKPlanCell.swift in Sources */,
045C10832D12CA5F00BD2DC0 /* YHAdopterIncomeViewModel.swift in Sources */,
045C10842D12CA5F00BD2DC0 /* YHResignAppointMember.swift in Sources */,
......@@ -7163,6 +7438,7 @@
045C10872D12CA5F00BD2DC0 /* YHServiceOrderProgressTableViewCell.swift in Sources */,
045C10882D12CA5F00BD2DC0 /* YHResignUploadTravelCardDetailModel.swift in Sources */,
045C10892D12CA5F00BD2DC0 /* YHAppointHKResultModel.swift in Sources */,
04D8FF612D939D2400703C75 /* YHPlanScoreCell.swift in Sources */,
045C108A2D12CA5F00BD2DC0 /* YHPreviewInfoSectionHeaderCell.swift in Sources */,
045C108B2D12CA5F00BD2DC0 /* YHSmsCodeInputView.swift in Sources */,
045C108C2D12CA5F00BD2DC0 /* YHActivityDetailCell0.swift in Sources */,
......@@ -7209,6 +7485,7 @@
045C10AE2D12CA5F00BD2DC0 /* YHResignInfoConfirmIViewModel.swift in Sources */,
045C10AF2D12CA5F00BD2DC0 /* YHResignUploadTravelHKTableViewCell.swift in Sources */,
045C10B02D12CA5F00BD2DC0 /* YHInfoItemView.swift in Sources */,
0497C7532D9BD21500A3E32A /* YHMakePlanViewModel.swift in Sources */,
045C10B12D12CA5F00BD2DC0 /* YHHKRecordsEditContentVC.swift in Sources */,
045C10B22D12CA5F00BD2DC0 /* UIDevice+Extension.swift in Sources */,
045C10B32D12CA5F00BD2DC0 /* YHAIEvaluationAlertWebView.swift in Sources */,
......@@ -7222,6 +7499,7 @@
045C10BB2D12CA5F00BD2DC0 /* YHChildInfoContainerVC.swift in Sources */,
045C10BC2D12CA5F00BD2DC0 /* YHSignatureWebViewController.swift in Sources */,
04307BA32D1E4CA600ED8E8D /* YHGCInformationFillTipsCell.swift in Sources */,
04D8FF6F2D954D9B00703C75 /* YHPlanPolicyCarouselView.swift in Sources */,
045C10BD2D12CA5F00BD2DC0 /* YHPreviewMainViewController.swift in Sources */,
045C10BE2D12CA5F00BD2DC0 /* YHWorkExperienceViewController.swift in Sources */,
045C10BF2D12CA5F00BD2DC0 /* YHServiceOrderGuideTipsView.swift in Sources */,
......@@ -7237,6 +7515,7 @@
045C10C92D12CA5F00BD2DC0 /* YHResignUploadTravelCardListModel.swift in Sources */,
045C10CA2D12CA5F00BD2DC0 /* YHDocListBottomView.swift in Sources */,
045C10CB2D12CA5F00BD2DC0 /* YHPreviewInfoCertificatePictureItemView.swift in Sources */,
04D8FFB22DA5007A00703C75 /* YHPictureBrowserViewController.swift in Sources */,
045C10CC2D12CA5F00BD2DC0 /* YHAIChatBannerItemCell.swift in Sources */,
045C10CD2D12CA5F00BD2DC0 /* YHLoginPrivacyView.swift in Sources */,
045C10CE2D12CA5F00BD2DC0 /* YHPrincipleUploadListVC.swift in Sources */,
......@@ -7278,6 +7557,7 @@
045C10F12D12CA5F00BD2DC0 /* YHImproveSchemeCell.swift in Sources */,
045C10F22D12CA5F00BD2DC0 /* YHActivityDetailBottomView.swift in Sources */,
045C10F32D12CA5F00BD2DC0 /* YHSelectCategoryModel.swift in Sources */,
04A750D42D93DFED00974E5F /* YHSurveyQuestionType.swift in Sources */,
045C10F42D12CA5F00BD2DC0 /* YHWorkExpInfoPreviewModel.swift in Sources */,
045C10F52D12CA5F00BD2DC0 /* YHMySignatureListViewModel.swift in Sources */,
045C10F62D12CA5F00BD2DC0 /* YHUploadCertificateDetailCell.swift in Sources */,
......@@ -7332,6 +7612,7 @@
045C11202D12CA5F00BD2DC0 /* UITextField+Extension.swift in Sources */,
045C11212D12CA5F00BD2DC0 /* YHPlayer.swift in Sources */,
045C11222D12CA5F00BD2DC0 /* YHAddAdoptersViewController.swift in Sources */,
04D8FF6D2D94EE1100703C75 /* YHLookPlanButton.swift in Sources */,
045C11232D12CA5F00BD2DC0 /* YHEmploymentVerificationAvailableCell.swift in Sources */,
045C11242D12CA5F00BD2DC0 /* YHHomeIdentityListVC.swift in Sources */,
045C11252D12CA5F00BD2DC0 /* YHModifySchemeInfoCell.swift in Sources */,
......@@ -7398,6 +7679,7 @@
045C11572D12CA5F00BD2DC0 /* YHCountryHotView.swift in Sources */,
048D6ADB2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift in Sources */,
045C11582D12CA5F00BD2DC0 /* YHPreviewBaseViewController.swift in Sources */,
04D8FF692D93D4E500703C75 /* YHPlanCustomerCaseListLayout.swift in Sources */,
045C11592D12CA5F00BD2DC0 /* YHAITextMessageCell.swift in Sources */,
04307BB02D215D1C00ED8E8D /* YHRecommendedLiveHeader.swift in Sources */,
048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */,
......@@ -7435,6 +7717,7 @@
045C11752D12CA5F00BD2DC0 /* YHAIProductCell.swift in Sources */,
045C11762D12CA5F00BD2DC0 /* YHHKRecordsHeaderCell.swift in Sources */,
045C11772D12CA5F00BD2DC0 /* YHWorkMessageSelectTableViewCell.swift in Sources */,
04A750F32D9AB95300974E5F /* YHSurveyRenewalPlanState.swift in Sources */,
045C11782D12CA5F00BD2DC0 /* YHResignGuidelinesViewModel.swift in Sources */,
045C11792D12CA5F00BD2DC0 /* YHFormItemDoubleChoiceCell.swift in Sources */,
045C117A2D12CA5F00BD2DC0 /* YHEmailInputAlertView.swift in Sources */,
......@@ -7453,6 +7736,7 @@
045C11872D12CA5F00BD2DC0 /* YHProgressView.swift in Sources */,
045C11882D12CA5F00BD2DC0 /* YHAIHistoryMessage.swift in Sources */,
045C11892D12CA5F00BD2DC0 /* YHUploadCertificateViewModel.swift in Sources */,
04A750D22D93ABCE00974E5F /* YHSurveyTableViewCell.swift in Sources */,
045C118A2D12CA5F00BD2DC0 /* YHGrabNumberInfoView.swift in Sources */,
045C118B2D12CA5F00BD2DC0 /* YHPrincipleApprovedResultVC.swift in Sources */,
045C118C2D12CA5F00BD2DC0 /* YHLoginViewModel.swift in Sources */,
......@@ -7475,6 +7759,7 @@
045C119B2D12CA5F00BD2DC0 /* YHButlerServiceMessage.swift in Sources */,
045C119C2D12CA5F00BD2DC0 /* YHSubmitAllInfoCheckView.swift in Sources */,
045C119D2D12CA5F00BD2DC0 /* UIColor+Extension.swift in Sources */,
0497C7572D9D437B00A3E32A /* YHMakePlanScoreModel.swift in Sources */,
045C119E2D12CA5F00BD2DC0 /* YHCustomTextView.swift in Sources */,
04307BA52D1E54BD00ED8E8D /* YHGCInformationFillTipsAlertView.swift in Sources */,
045C119F2D12CA5F00BD2DC0 /* YHEditBaseUserInfoViewController.swift in Sources */,
......@@ -7522,8 +7807,10 @@
045C11C62D12CA5F00BD2DC0 /* YHListViewController.swift in Sources */,
045C11C72D12CA5F00BD2DC0 /* YHWorkExperiencePositionTableViewCell.swift in Sources */,
045C11C82D12CA5F00BD2DC0 /* YHOrderSearchViewController.swift in Sources */,
04A750EF2D9A9E8A00974E5F /* YHSurveySubmitRequestModel.swift in Sources */,
045C11C92D12CA5F00BD2DC0 /* YHNoDataTipsView.swift in Sources */,
045C11CA2D12CA5F00BD2DC0 /* YHHKRecordsInfoItemCell.swift in Sources */,
04D8FF792D97BDBD00703C75 /* YHPlanShareViewController.swift in Sources */,
045C11CB2D12CA5F00BD2DC0 /* YHLiveDetailModel.swift in Sources */,
045C11CC2D12CA5F00BD2DC0 /* YHMessageListVC.swift in Sources */,
045C11CD2D12CA5F00BD2DC0 /* YHCompanySelectViewController.swift in Sources */,
......@@ -7532,6 +7819,7 @@
045C11D02D12CA5F00BD2DC0 /* YHIdentityCardCell.swift in Sources */,
045C11D12D12CA5F00BD2DC0 /* UINavigationController+Extension.swift in Sources */,
04307BB42D21623300ED8E8D /* YHRecommendedAppointmentLiveView.swift in Sources */,
04D8FF772D979BCC00703C75 /* YHPlanPolicyDetailViewController.swift in Sources */,
045C11D22D12CA5F00BD2DC0 /* YHPrincipleWaitResultViewController.swift in Sources */,
045C11D32D12CA5F00BD2DC0 /* YHInvitationWithGiftsShareBottomView.swift in Sources */,
045C11D42D12CA5F00BD2DC0 /* YHPreviewInfoSingleLineTitleView.swift in Sources */,
......@@ -7586,6 +7874,7 @@
045C11FE2D12CA5F00BD2DC0 /* YHVideoPlayerControlView.swift in Sources */,
043671472D6C3ED100E8D9BA /* YHMembershipGrowthGuideView.swift in Sources */,
045C11FF2D12CA5F00BD2DC0 /* YHResignCertificateModel.swift in Sources */,
04D8FF572D925A0800703C75 /* YHPlanScoreChart.swift in Sources */,
045C12002D12CA5F00BD2DC0 /* YHPrincipleApprovedAlertView.swift in Sources */,
045C12012D12CA5F00BD2DC0 /* YHSchemeTableHeadView.swift in Sources */,
045C12022D12CA5F00BD2DC0 /* YHResignDocumentUploadStatus.swift in Sources */,
......@@ -7615,6 +7904,7 @@
045C12192D12CA5F00BD2DC0 /* YHHKRecordsSectionHeaderCell.swift in Sources */,
045C121A2D12CA5F00BD2DC0 /* YHMyInformationItemCell.swift in Sources */,
045C121B2D12CA5F00BD2DC0 /* YHActivityTwoItemView.swift in Sources */,
04A750D62D94242000974E5F /* YHSurveySubmitDoneViewController.swift in Sources */,
045C121C2D12CA5F00BD2DC0 /* YHHKImmigrationRecordsViewModel.swift in Sources */,
045C121D2D12CA5F00BD2DC0 /* YHHKRequiredItemView.swift in Sources */,
0411CEF72D15525400644D35 /* YHGCWorkExperienceModel.swift in Sources */,
......@@ -7629,12 +7919,14 @@
045C12262D12CA5F00BD2DC0 /* YHIncomeRecordViewController.swift in Sources */,
045C12272D12CA5F00BD2DC0 /* YHTravelDocsPreparationDetailVC.swift in Sources */,
045C12282D12CA5F00BD2DC0 /* YHResignDocumentUploadFileCell.swift in Sources */,
04D8FF5F2D93945100703C75 /* YHPlanAnalyzeInfoCell.swift in Sources */,
045C12292D12CA5F00BD2DC0 /* YHChoiceButtonHoldView.swift in Sources */,
045C122A2D12CA5F00BD2DC0 /* YHInformationAuthorizeViewModel.swift in Sources */,
045C122B2D12CA5F00BD2DC0 /* YHEditWorkViewController.swift in Sources */,
045C122C2D12CA5F00BD2DC0 /* YHFamilyInfoUpdateViewController.swift in Sources */,
04307BA82D1FDF5200ED8E8D /* YHGCPreviewIncomeTypeCell.swift in Sources */,
045C122D2D12CA5F00BD2DC0 /* YHVisaRenewalTipsCell.swift in Sources */,
04D8FF672D93D15800703C75 /* YHPlanCustomerCaseCollectionCell.swift in Sources */,
04307B8A2D1AB66100ED8E8D /* YHGCPreviewBasiceInformationViewController.swift in Sources */,
04307B8C2D1AB66100ED8E8D /* YHGCPreviewControllerHoldViewController.swift in Sources */,
04307B8D2D1AB66100ED8E8D /* YHGCPreviewAcademicAndProfessionalQualificationViewController.swift in Sources */,
......@@ -7667,6 +7959,16 @@
045C12432D12CA5F00BD2DC0 /* YHSignAppendStepView.swift in Sources */,
045C12442D12CA5F00BD2DC0 /* YHWebModel.swift in Sources */,
045C12452D12CA5F00BD2DC0 /* YHHUDErrorView.swift in Sources */,
04B00FBF2D9A420F00F640C5 /* YHMakePlanSelectAlertView.swift in Sources */,
04B00FC02D9A420F00F640C5 /* YHMakePlanBottomView.swift in Sources */,
04B00FC12D9A420F00F640C5 /* YHMakePlanCell.swift in Sources */,
04B00FC22D9A420F00F640C5 /* YHMakePlanCardView.swift in Sources */,
04B00FC32D9A420F00F640C5 /* YHMakePlanShareAlertView.swift in Sources */,
04B00FC42D9A420F00F640C5 /* YHMakePlanViewController.swift in Sources */,
04B00FC52D9A420F00F640C5 /* YHMakePlanStateHeadView.swift in Sources */,
04B00FC62D9A420F00F640C5 /* YHMakePlanHeadView.swift in Sources */,
04B00FC72D9A420F00F640C5 /* YHMakePlanPriceAlertView.swift in Sources */,
04B00FC82D9A420F00F640C5 /* YHMakePlanCusttomHeadView.swift in Sources */,
045C12462D12CA5F00BD2DC0 /* YHPrincleViewModel.swift in Sources */,
045C12472D12CA5F00BD2DC0 /* YHUploadCertificateListModel.swift in Sources */,
04307B9B2D1CF5EE00ED8E8D /* YHGCIncomeRecordSaveWorkModel.swift in Sources */,
......@@ -7740,6 +8042,7 @@
045C12872D12CA5F00BD2DC0 /* YHStatusAdvantageVC.swift in Sources */,
045C12882D12CA5F00BD2DC0 /* YHHKPlanDoctumentVC.swift in Sources */,
045C12892D12CA5F00BD2DC0 /* YHHomeHeadView.swift in Sources */,
04D8FF752D978CF000703C75 /* YHPlanLinkShareView.swift in Sources */,
0411CF062D1A88EA00644D35 /* YHGCDocListCell.swift in Sources */,
045C128A2D12CA5F00BD2DC0 /* YHAITextInputView.swift in Sources */,
045C128B2D12CA5F00BD2DC0 /* YHWorkExpDataModel.swift in Sources */,
......@@ -7777,6 +8080,7 @@
045C12A82D12CA5F00BD2DC0 /* YHActivityTravelitemView.swift in Sources */,
045C12A92D12CA5F00BD2DC0 /* YHAllApiName.swift in Sources */,
045C12AA2D12CA5F00BD2DC0 /* YHInfoItemSelectSheetView.swift in Sources */,
04A750D02D925FD400974E5F /* YHCustomerInformationQuestionnaireVC.swift in Sources */,
045C12AB2D12CA5F00BD2DC0 /* YHPersonInfoIdentityCardModel.swift in Sources */,
045C12AC2D12CA5F00BD2DC0 /* YHSearchInfomationVC.swift in Sources */,
045C12AD2D12CA5F00BD2DC0 /* YHResignUploadTravelCardFootViewController.swift in Sources */,
......@@ -7788,6 +8092,7 @@
045C12B22D12CA5F00BD2DC0 /* YHResignUploadDetailViewModel.swift in Sources */,
045C12B32D12CA5F00BD2DC0 /* YHFamilyInfoConfirmViewModel.swift in Sources */,
045C12B42D12CA5F00BD2DC0 /* YHLifeDetailViewController.swift in Sources */,
04A750F12D9AAD0300974E5F /* YHSurveyResponseModel.swift in Sources */,
045C12B52D12CA5F00BD2DC0 /* YHIncomeRecordWorkExperienceViewController.swift in Sources */,
045C12B62D12CA5F00BD2DC0 /* YHMyLikeViewModel.swift in Sources */,
045C12B72D12CA5F00BD2DC0 /* YHCertificateUploadSheetView.swift in Sources */,
......@@ -7821,6 +8126,7 @@
045C12D12D12CA5F00BD2DC0 /* YHOtherServiceListViewController.swift in Sources */,
045C12D22D12CA5F00BD2DC0 /* YHResignAppointTimeSettingModel.swift in Sources */,
045C12D32D12CA5F00BD2DC0 /* YHVisaRenewalPayTipsCell.swift in Sources */,
04D8FF652D93CCBA00703C75 /* YHPlanCustomerCaseListCell.swift in Sources */,
045C12D42D12CA5F00BD2DC0 /* YHRefreshHeaderAnimator.swift in Sources */,
045C12D52D12CA5F00BD2DC0 /* YHLifeSectionView.swift in Sources */,
045C12D62D12CA5F00BD2DC0 /* YHAIGreetCollectionReusableView.swift in Sources */,
......@@ -7864,20 +8170,24 @@
045C12F62D12CA5F00BD2DC0 /* YHPreviewInfoWorkExpView.swift in Sources */,
045C12F72D12CA5F00BD2DC0 /* YHHUDWariningView.swift in Sources */,
045C12F82D12CA5F00BD2DC0 /* YHHKVisaRenewalPaymentStepView.swift in Sources */,
04D8FF712D9550E700703C75 /* YHPlanPolicyCarouselImageCell.swift in Sources */,
045C12F92D12CA5F00BD2DC0 /* YHEducationCertificateConfirmCell.swift in Sources */,
045C12FA2D12CA5F00BD2DC0 /* YHAcademicPreviewModel.swift in Sources */,
045C12FB2D12CA5F00BD2DC0 /* YHHomeIdentityViewController.swift in Sources */,
04A750EB2D963AFE00974E5F /* YHSurveyViewModel.swift in Sources */,
045C12FC2D12CA5F00BD2DC0 /* YHAdopterAddModel.swift in Sources */,
045C12FD2D12CA5F00BD2DC0 /* YHOtherLoginViewController.swift in Sources */,
045C12FE2D12CA5F00BD2DC0 /* YHInformationAuthorizationStepTwoViewController.swift in Sources */,
045C12FF2D12CA5F00BD2DC0 /* YHWorkActionView.swift in Sources */,
045C13002D12CA5F00BD2DC0 /* YHImproveTargetCell.swift in Sources */,
04B00FCA2D9AAD6100F640C5 /* YHMakePlanTopView.swift in Sources */,
045C13012D12CA5F00BD2DC0 /* YHPreviewFamilyMemberViewController.swift in Sources */,
0411CF102D1C055100644D35 /* YHGCSignatureAddViewController.swift in Sources */,
045C13022D12CA5F00BD2DC0 /* YHPictureReviewManager.swift in Sources */,
045C13032D12CA5F00BD2DC0 /* YHBasicInfoFillViewController.swift in Sources */,
045C13042D12CA5F00BD2DC0 /* YHImproveSchemeTemplateListCell.swift in Sources */,
0411CEE92D15123B00644D35 /* YHGCWorkExperienceListViewController.swift in Sources */,
04D8FF732D96759400703C75 /* YHPlanScoreLevelTextView.swift in Sources */,
04AE202E2D13B5EB00891D24 /* YHGCCertificateUploadVC.swift in Sources */,
045C13052D12CA5F00BD2DC0 /* YHActivityModel.swift in Sources */,
045C13062D12CA5F00BD2DC0 /* YHInterestTopicLayout.swift in Sources */,
......@@ -7887,6 +8197,7 @@
045C130A2D12CA5F00BD2DC0 /* YHInformationPerfectModel.swift in Sources */,
045C130B2D12CA5F00BD2DC0 /* YHFixProductMessageCell.swift in Sources */,
045C130C2D12CA5F00BD2DC0 /* YHBaseViewModel.swift in Sources */,
04A750D82D94F3F400974E5F /* YHSurveyMatchResultViewController.swift in Sources */,
045C130D2D12CA5F00BD2DC0 /* YHAppleLoginManager.swift in Sources */,
045C130E2D12CA5F00BD2DC0 /* YHHKCardTemplateView.swift in Sources */,
045C130F2D12CA5F00BD2DC0 /* YHOtherInfoFillViewModel.swift in Sources */,
......@@ -7942,6 +8253,7 @@
045C133D2D12CA5F00BD2DC0 /* YHBannerModel.swift in Sources */,
045C133E2D12CA5F00BD2DC0 /* YHLiveModel.swift in Sources */,
045C133F2D12CA5F00BD2DC0 /* YHResignCertificateDetailPassPortViewController.swift in Sources */,
0497C7552D9BD36700A3E32A /* YHMakePlanModel.swift in Sources */,
045C13402D12CA5F00BD2DC0 /* YHVideoPlaySettingVC.swift in Sources */,
045C13412D12CA5F00BD2DC0 /* YHResignAppointTimeViewController.swift in Sources */,
045C13422D12CA5F00BD2DC0 /* YHHeadView.swift in Sources */,
......@@ -8036,6 +8348,7 @@
0411CEF32D153FB700644D35 /* YHGCWorkExperienceViewModel.swift in Sources */,
045C13932D12CA5F00BD2DC0 /* YHOtherInfoFillViewController.swift in Sources */,
045C13942D12CA5F00BD2DC0 /* YHSelectHKPlaceListView.swift in Sources */,
04A750DA2D94FDDF00974E5F /* YHSurveyMatchingViewController.swift in Sources */,
045C13952D12CA5F00BD2DC0 /* YHResignUploadDocListViewModel.swift in Sources */,
045C13962D12CA5F00BD2DC0 /* YHAnalyticsUnit.swift in Sources */,
045C13972D12CA5F00BD2DC0 /* YHForwardArriveHKAlertView.swift in Sources */,
......@@ -8043,6 +8356,7 @@
045C13992D12CA5F00BD2DC0 /* YHActivityDetailViewController.swift in Sources */,
045C139A2D12CA5F00BD2DC0 /* YHAdopterCardExplainTableViewCell.swift in Sources */,
045C139B2D12CA5F00BD2DC0 /* YHPreviewInfoQuestionAndAnswerItemView2.swift in Sources */,
04D8FFB42DA61DA300703C75 /* YHPlanTestViewController.swift in Sources */,
045C139C2D12CA5F00BD2DC0 /* YHPreviewInfoNameAndDetailCell.swift in Sources */,
045C139D2D12CA5F00BD2DC0 /* YHTestViewController.swift in Sources */,
045C139E2D12CA5F00BD2DC0 /* YHMajorSearchViewController.swift in Sources */,
......@@ -8176,7 +8490,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyTestEnv.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -8203,7 +8517,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2.1.8;
MARKETING_VERSION = 2.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -8322,7 +8636,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -8349,7 +8663,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2.1.8;
MARKETING_VERSION = 2.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -8530,7 +8844,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyDebug.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -8557,7 +8871,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2.1.8;
MARKETING_VERSION = 2.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -8578,7 +8892,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -8605,7 +8919,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2.1.8;
MARKETING_VERSION = 2.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......
......@@ -146,6 +146,56 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
UIViewController.current?.navigationController?.pushViewController(vc, animated: true)
}
}
} else if iType == 5 {
// 跳转商品详情
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
if !YHLoginManager.shared.isLogin() {
printLog("需要登录")
return
}
let surveyViewModel = YHSurveyViewModel()
// 跳转分析
surveyViewModel.getRenewalPlanGenerated { state, error in
guard let state = state else {
if let msg = error?.errorMsg, !msg.isEmpty {
YHHUD.flash(message: msg)
}
return
}
if state.isGeneratePlan == true {
let vc = YHPlanTestViewController()
UIViewController.current?.navigationController?.pushViewController(vc)
} else {
let vc = YHCustomerInformationQuestionnaireVC()
UIViewController.current?.navigationController?.pushViewController(vc)
}
}
}
} else if iType == 6 {
// 跳转方案商品
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
// - 获取它对应的参数
if !YHLoginManager.shared.isLogin() {
printLog("需要登录")
return
}
let surveyViewModel = YHSurveyViewModel()
surveyViewModel.getRenewalPlanGenerated { state, error in
guard let state = state else {
if let msg = error?.errorMsg, !msg.isEmpty {
YHHUD.flash(message: msg)
}
return
}
if state.isGeneratePlan == true {
let vc = YHMakePlanViewController()
UIViewController.current?.navigationController?.pushViewController(vc, animated: true)
} else {
let vc = YHCustomerInformationQuestionnaireVC()
UIViewController.current?.navigationController?.pushViewController(vc)
}
}
}
} else {
printLog("未处理的类型 \(iType)")
}
......
......@@ -20,6 +20,8 @@ let kEmptyOrderBgName = "no_data_bg_order"
let kNotNetWorkBgName = "no_network_bg"
// 人脉无好友空视图
let kNoFriendsBgName = "people_no_friend_bg"
// 方案空
let kNoPlanBgName = "no_data_bg_plan"
class YHEmptyDataView: UIView {
......
......@@ -42,7 +42,8 @@ class YHHomeBannerView: UIView {
}
}
private let viewModel = YHLiveSalesViewModel()
private lazy var viewModel = YHLiveSalesViewModel()
private lazy var surveyViewModel = YHSurveyViewModel()
override init(frame: CGRect) {
super.init(frame: frame)
......@@ -113,6 +114,30 @@ private extension YHHomeBannerView {
YHOneKeyLoginManager.shared.oneKeyLogin()
}
} else if tabBarName.contains("renewal_plan", caseSensitive: false) {
if YHLoginManager.shared.isLogin() {
YHHUD.show(.progress(message: "加载中..."))
surveyViewModel.getRenewalPlanGenerated { state, error in
YHHUD.hide()
guard let state = state else {
if let msg = error?.errorMsg, !msg.isEmpty {
YHHUD.flash(message: msg)
}
return
}
if state.isGeneratePlan == true {
let vc = YHPlanTestViewController()
UIViewController.current?.navigationController?.pushViewController(vc)
} else {
let vc = YHCustomerInformationQuestionnaireVC()
UIViewController.current?.navigationController?.pushViewController(vc)
}
}
} else {
YHOneKeyLoginManager.shared.oneKeyLogin()
}
} else {
}
......@@ -163,22 +188,6 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
YHHUD.flash(message: "error:skip_url不能为空")
return
}
// for test hjl 建明机器IP
// var url = "http://192.168.23.66:10300/superAppBridge.html#/schoolEvaluation"
// for test hjl 梁辉机器IP
// model.skip_url = "http://192.168.23.75:10300/superAppBridge.html#/double11-home"
// for test hjl steve机器IP
// model.skip_url = "http://192.168.52.158:10300/superAppBridge.html#/double11-home"
// for test hjl 测试环境
// model.skip_url = "https://test-hkdiy-h5.galaxy-immi.com/superAppBridge.html#/double11-home"
// for test hjl 贤宇IP
// model.skip_url = "http://192.168.23.35:10300/signatureQrcode/EcqtQYs%2Bxey7t6jLbn6JkQ%3D%3D"
// model.skip_url = "http://192.168.23.71:10300/superAppBridge.html#/double11-home"
// 1.增加app token
var url = ""
......
......@@ -285,9 +285,9 @@ class YHSelectLookTableViewCell: UITableViewCell {
if dataSource.catAttr == 2 {
flagLabel.isHidden = false
}
let a: ASAttributedString = .init("¥", .font(UIFont(name: "DINAlternate-Bold", size: 14) ?? UIFont()), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("\(dataSource.linePrice) ", .font(UIFont(name: "DINAlternate-Bold", size: 20) ?? UIFont()), .foreground(UIColor.mainTextColor))
let c: ASAttributedString = .init(\(dataSource.price)", .font(UIFont(name: "DINAlternate-Bold", size: 14) ?? UIFont()), .foreground(UIColor(hex: 0x8993a2)), .strikethrough(.single))
let a: ASAttributedString = .init("¥", .font(UIFont(name: "D-DIN-PRO-Bold", size: 14) ?? UIFont()), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("\(dataSource.linePrice.formattedPrice()) ", .font(UIFont(name: "D-DIN-PRO-Bold", size: 20) ?? UIFont()), .foreground(UIColor.mainTextColor))
let c: ASAttributedString = .init(\(dataSource.price.formattedPrice())", .font(UIFont(name: "D-DIN-PRO-Bold", size: 14) ?? UIFont()), .foreground(UIColor(hex: 0x8993a2)), .strikethrough(.single))
if dataSource.linePrice == dataSource.price {
self.subTitleLabel.attributed.text = a + b
} else {
......
//
// YHPictureBrowserViewController.swift
// galaxy
//
// Created by Dufet on 2025/4/8.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import JXPhotoBrowser
import Photos
import PhotosUI
class YHPictureBrowserViewController: JXPhotoBrowser {
var getImgUrlBlock: ((Int) -> (String))?
lazy var navBar: UIView = {
let v = UIView()
let backBtn = UIButton()
backBtn.setImage(UIImage(named: "nav_back_white"), for: .normal)
backBtn.addTarget(self, action: #selector(didBackBtnClicked), for: .touchUpInside)
v.addSubview(backBtn)
let saveBtn = UIButton()
let img = UIImage(named: "photo_brower_save")
let templateImage = img?.withRenderingMode(.alwaysTemplate)
saveBtn.setImage(templateImage, for: .normal)
saveBtn.imageView?.tintColor = .white
saveBtn.addTarget(self, action: #selector(didSaveBtnClicked), for: .touchUpInside)
v.addSubview(saveBtn)
backBtn.snp.makeConstraints { make in
make.width.height.equalTo(44)
make.left.equalToSuperview()
make.bottom.equalToSuperview()
}
saveBtn.snp.makeConstraints { make in
make.width.height.equalTo(44)
make.right.equalToSuperview()
make.bottom.equalToSuperview()
}
return v
}()
@objc func didBackBtnClicked() {
dismiss()
}
@objc func didSaveBtnClicked() {
let index = self.browserView.pageIndex
if let block = self.getImgUrlBlock {
let url = block(self.pageIndex)
saveLocalPictureSyn(url)
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(navBar)
navBar.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.height.equalTo(k_Height_NavigationtBarAndStatuBar)
}
}
func saveLocalPictureSyn(_ picUrl: String) {
let imageView = UIImageView()
imageView.kf.setImage(with: URL(string: picUrl)) { result in
switch result {
case .success(let value):
self.saveImage(value.image)
case .failure:
YHHUD.flash(message: "保存失败")
}
}
}
func saveImage(_ image: UIImage) {
// 确保应用有权访问相册
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
// 保存图片到相册
DispatchQueue.main.async {
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
YHHUD.flash(message: "保存成功")
}
} else {
DispatchQueue.main.async {
YHHUD.flash(message: "保存失败,请检查系统权限")
}
}
}
}
}
......@@ -30,7 +30,7 @@ extension YHPictureReviewManager {
self.curIndex = curIndex
self.arrPics = arrPicturs
let browser = JXPhotoBrowser()
let browser = YHPictureBrowserViewController()
browser.numberOfItems = {
self.arrPics.count
}
......@@ -54,6 +54,14 @@ extension YHPictureReviewManager {
}
}
browser.getImgUrlBlock = { [weak self] index in
guard let self = self else { return "" }
if 0 <= index, index < self.arrPics.count {
return self.arrPics[index]
}
return ""
}
// 数字样式的页码指示器
browser.pageIndicator = JXPhotoBrowserNumberPageIndicator()
browser.pageIndex = self.curIndex
......
//
// YHCustomerInformationQuestionnaireVC.swift
// galaxy
//
// Created by alexzzw on 2025/3/25.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
// import AttributedString
import UIKit
// 问卷页
class YHCustomerInformationQuestionnaireVC: YHBaseViewController {
private lazy var tableView: UITableView = {
let view = UITableView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight), style: .grouped)
view.estimatedSectionHeaderHeight = 0.01
view.estimatedSectionFooterHeight = 16
view.contentInsetAdjustmentBehavior = .never
view.backgroundColor = .clear
view.separatorStyle = .none
view.dataSource = self
view.delegate = self
view.showsVerticalScrollIndicator = false
view.register(YHSurveyTableViewCell.self, forCellReuseIdentifier: YHSurveyTableViewCell.cellReuseIdentifier)
return view
}()
private var imageHeight: CGFloat {
return KScreenWidth
}
private lazy var topImageView: UIImageView = {
let view = UIImageView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: imageHeight))
return view
}()
private lazy var submitButton: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
let buttonName = "提交"
button.setTitle(buttonName, for: .normal)
button.setTitle(buttonName, for: .highlighted)
button.setTitleColor(UIColor(hex: 0xFFFFFF), for: .normal)
button.setTitleColor(UIColor(hex: 0xFFFFFF), for: .highlighted)
button.addTarget(self, action: #selector(submitButtonClick), for: .touchUpInside)
button.layer.cornerRadius = kCornerRadius3
button.clipsToBounds = true
button.backgroundColor = UIColor(hexString: "#121A26")
return button
}()
private lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .white
return view
}()
/*
private lazy var privacyButton: UIButton = {
let button = UIButton(type: .custom)
button.setImage(UIImage(named: "plan_privacy_unchecked"), for: .normal)
button.setImage(UIImage(named: "plan_privacy_checked"), for: .selected)
button.addTarget(self, action: #selector(privacyButtonClicked), for: .touchUpInside)
return button
}()
private lazy var privacyLabel: UILabel = {
let label = UILabel()
let normal: ASAttributedString = .init("同意用户隐私信息收集协议《 ", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor.withAlphaComponent(0.5))).add(attributes: .action { [weak self] in
self?.privacyButtonClicked()
})
let attributed: ASAttributedString = .init("隐私协议", .font(UIFont.PFSC_M(ofSize: 13)), .foreground(UIColor.mainTextColor), .action { [weak self] in
self?.gotoPrivacyPage()
})
let end: ASAttributedString = .init(" 》", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor.withAlphaComponent(0.5)))
let content = normal + attributed + end
label.attributed.text = content
return label
}()
*/
private var sections: [YHSurveyQuestionType] {
return YHSurveyQuestionType.allCases
}
private lazy var viewModel = YHSurveyViewModel()
private var allQuestions: [YHSurveyQuestionItem] = []
private var displayedQuestions: [YHSurveyQuestionItem] = []
/// key: 问题Id, value: 答案
private var answerDic: [String: [YHSurveyConditionOptionExtra]] = [:]
private var needShowFail: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
fetchData()
}
private func setupUI() {
gk_navBarAlpha = 0
gk_navBackgroundColor = .clear
gk_backImage = UIImage(named: "back_icon_white")
updateRightBarButtonItem(true)
view.backgroundColor = UIColor.contentBkgColor
view.addSubview(bottomView)
bottomView.addSubview(submitButton)
// bottomView.addSubview(privacyButton)
// bottomView.addSubview(privacyLabel)
view.addSubview(tableView)
view.addSubview(topImageView)
view.bringSubviewToFront(tableView)
bottomView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalTo(view.safeAreaLayoutGuide.snp.bottom).offset(-64)
}
/*
privacyButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.width.height.equalTo(13)
make.centerY.equalTo(privacyLabel)
}
privacyLabel.snp.makeConstraints { make in
make.left.equalTo(privacyButton.snp.right).offset(6)
make.top.equalToSuperview().offset(12)
make.right.lessThanOrEqualToSuperview().offset(-16)
}
*/
submitButton.snp.makeConstraints { make in
make.top.equalToSuperview().offset(8)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(48)
}
tableView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.top.equalToSuperview()
make.bottom.equalTo(bottomView.snp.top).offset(-8)
}
tableView.contentInset = UIEdgeInsets(top: imageHeight - 115, left: 0, bottom: 0, right: 0)
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 0.01))
}
@objc private func share() {
let url = YHBaseUrlManager.shared.curH5URL() + "superAppBridge.html#/renewal-evaluation"
YHShareManager.shared.sendLinkContent("香港身份方案评估", "您的朋友邀请您进行香港身份申请到永居一站式解决方案评估,来试试吧", UIImage(named: "survey_share_icon") ?? UIImage(), link: url)
}
@objc private func submitButtonClick() {
guard let surveyContent = viewModel.surveyContainerModel?.surveyContent else {
return
}
if let lastQuestion = displayedQuestions.last, lastQuestion.isRequired == 1, answerDic[lastQuestion.id] == nil {
needShowFail = true
let sections = tableView.numberOfSections
if sections > 0 {
tableView.reloadSections(IndexSet(integer: sections - 1), with: .automatic)
}
needShowFail = false
return
}
YHHUD.show(.progress(message: "加载中..."))
var answers: [YHSurveyArticleAnswerItem] = []
displayedQuestions.forEach { [weak self] question in
guard let self = self else {
return
}
let ans = self.answerDic[question.id] ?? []
let extras: [YHSurveyAnswerItemOptionExtra] = ans.compactMap { optionExtra in
YHSurveyAnswerItemOptionExtra.init(extra: optionExtra.extra, optionId: optionExtra.optionId, optionKey: "", title: optionExtra.title)
}
let answer = YHSurveyArticleAnswerItem.init(fileList: [], optionExtra: extras, questionId: question.id, questionKey: question.businessKey, questionType: question.type, text: "", title: question.title)
answers.append(answer)
}
let requestModel = YHSurveySubmitRequestModel(answerDetails: answers, surveyId: surveyContent.id)
viewModel.submitSurveyAnswer(requestModel: requestModel) { [weak self] responseModel, error in
YHHUD.hide()
guard let self = self else {
return
}
guard let responseModel = responseModel else {
var errorMsg: String = "提交失败,请重试"
if let msg = error?.errorMsg, !msg.isEmpty {
errorMsg = msg
}
YHHUD.flash(message: errorMsg)
return
}
if responseModel.hasHkIdentity {
self.gotoMatchingVC()
} else {
self.gotoSubmitDoneVC()
}
}
}
private func gotoSubmitDoneVC() {
let ctl = YHSurveySubmitDoneViewController()
navigationController?.pushViewController(ctl)
}
private func gotoMatchingVC() {
let ctl = YHSurveyMatchingViewController()
navigationController?.pushViewController(ctl)
}
/*
@objc private func privacyButtonClicked() {
privacyButton.isSelected.toggle()
}
private func gotoPrivacyPage() {
let vc = YHWebViewViewController()
vc.url = YHBaseUrlManager.shared.curPrivacyAgreementUrl()
vc.navTitle = "银河港生活隐私协议"
navigationController?.pushViewController(vc)
}
*/
private func updateRightBarButtonItem(_ isWhite: Bool) {
let rightButtonItem = UIBarButtonItem(image: UIImage(named: isWhite ? "video_share" : "share_item")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(share))
gk_navRightBarButtonItem = rightButtonItem
gk_navItemRightSpace = 16
}
private func fetchData() {
YHHUD.show(.progress(message: "加载中..."))
viewModel.getSurveyContent { [weak self] _, _ in
YHHUD.hide()
self?.configureQuestions()
}
}
private func configureQuestions() {
guard let surveyContainerModel = viewModel.surveyContainerModel else {
tableView.reloadData()
return
}
let questions = surveyContainerModel.surveyContent.questions
allQuestions = questions
displayedQuestions.removeAll()
let isNew = surveyContainerModel.isNewCustomer
if isNew {
topImageView.image = UIImage(named: "plan_question_top_new")
for question in questions where question.showWhenV1.conditions.isEmpty {
displayedQuestions.append(question)
}
} else {
topImageView.image = UIImage(named: "plan_question_top_old")
if let first = questions.first, surveyContainerModel.defaultAnswers.contains(where: { answer in
answer.questionKey == first.businessKey
}) {
/*
for answer in surveyContainerModel.defaultAnswers {
if let question = questions.first(where: { item in
item.businessKey == answer.questionKey
}) {
displayedQuestions.append(question)
let options = answer.optionKey.compactMap { optionKey in
let option = question.options.first { optionItem in
optionItem.businessKey == optionKey
}
return YHSurveyConditionOptionExtra(extra: "", optionId: option?.id ?? "", title: option?.title ?? "", optionKey: answer.questionKey)
}
self.answerDic[question.id] = options
}
}
*/
for (index, answer) in surveyContainerModel.defaultAnswers.enumerated() {
if let question = questions.first(where: { item in
item.businessKey == answer.questionKey
}) {
displayedQuestions.append(question)
let options = answer.optionKey.compactMap { optionKey in
let option = question.options.first { optionItem in
optionItem.businessKey == optionKey
}
return YHSurveyConditionOptionExtra(extra: "", optionId: option?.id ?? "", title: option?.title ?? "", optionKey: answer.questionKey)
}
self.answerDic[question.id] = options
}
if surveyContainerModel.defaultAnswers.count > index + 1, let lastModel = displayedQuestions.last, let nextQuestion = self.findNextQuestion(allQuestions: self.allQuestions, displayedQuestions: self.displayedQuestions, answerDic: self.answerDic, currentIndex: displayedQuestions.count - 1, currentOptionId: lastModel.id), nextQuestion.businessKey != surveyContainerModel.defaultAnswers[index + 1].questionKey {
self.displayedQuestions.append(nextQuestion)
break
}
}
if let lastModel = displayedQuestions.last, let nextQuestion = self.findNextQuestion(allQuestions: self.allQuestions, displayedQuestions: self.displayedQuestions, answerDic: self.answerDic, currentIndex: displayedQuestions.count - 1, currentOptionId: lastModel.id) {
self.displayedQuestions.append(nextQuestion)
}
} else {
for question in questions where question.showWhenV1.conditions.isEmpty {
displayedQuestions.append(question)
}
}
}
tableView.reloadData()
}
private func scrollToBottom(_ animated: Bool = true) {
guard displayedQuestions.count > 0 else {
return
}
let sections = tableView.numberOfSections
let count = tableView.numberOfRows(inSection: sections - 1)
if count > 0 {
tableView.scrollToRow(at: IndexPath(row: count - 1, section: sections - 1), at: .bottom, animated: animated)
}
}
}
extension YHCustomerInformationQuestionnaireVC: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return displayedQuestions.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard displayedQuestions.count > section else {
return 0
}
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard displayedQuestions.count > indexPath.section else {
return UITableViewCell()
}
let model = displayedQuestions[indexPath.section]
if let cell = tableView.dequeueReusableCell(withIdentifier: YHSurveyTableViewCell.cellReuseIdentifier) as? YHSurveyTableViewCell {
var selectedIndices: [Int] = []
if let options = answerDic[model.id] {
options.forEach { outerOption in
if let index = model.options.firstIndex(where: { innerOption in
innerOption.id == outerOption.optionId
}) {
selectedIndices.append(index)
}
}
}
var needShowFailButton = false
if needShowFail, model.isRequired == 1, answerDic[model.id] == nil {
needShowFailButton = true
}
cell.configure(with: "\(indexPath.section + 1). " + model.title, isRequired: model.isRequired == 1, options: model.options.compactMap { $0.title }, selectedIndices: selectedIndices, needShowFailButton: needShowFailButton)
cell.optionSelected = { [weak self] index in
guard let self = self else {
return
}
let option = model.options.count > index ? model.options[index] : nil
if let option = option {
self.answerDic[model.id] = [YHSurveyConditionOptionExtra(extra: "", optionId: option.id, title: option.title, optionKey: option.businessKey)]
if let currentIndex = self.displayedQuestions.firstIndex(where: { $0.id == model.id }) {
self.tableView.reloadSections(IndexSet(integer: currentIndex), with: .automatic)
if self.displayedQuestions.count > currentIndex + 1 {
let nextQuestion = self.displayedQuestions[currentIndex + 1]
if option.jumpQuestionId.count > 0, option.jumpQuestionId != nextQuestion.id {
var questionIds: [String] = []
self.displayedQuestions.enumerated().forEach { index, item in
if index > currentIndex {
questionIds.append(item.id)
}
}
self.answerDic.removeAll(keys: questionIds)
self.displayedQuestions.removeSubrange((currentIndex + 1)...)
if let nextQuestion = self.findNextQuestion(allQuestions: self.allQuestions, displayedQuestions: self.displayedQuestions, answerDic: self.answerDic, currentIndex: currentIndex, currentOptionId: model.id) {
self.displayedQuestions.append(nextQuestion)
}
self.tableView.reloadData()
UIView.performWithoutAnimation {
self.scrollToBottom(false)
}
}
} else {
if let nextQuestion = self.findNextQuestion(allQuestions: self.allQuestions, displayedQuestions: self.displayedQuestions, answerDic: self.answerDic, currentIndex: currentIndex, currentOptionId: model.id) {
self.tableView.performBatchUpdates { [weak self] in
guard let self = self else {
return
}
self.displayedQuestions.append(nextQuestion)
self.tableView.insertSections(IndexSet(integer: currentIndex + 1), with: .bottom)
} completion: { [weak self] _ in
self?.scrollToBottom()
}
}
}
}
} else {
self.answerDic[model.id] = nil
}
}
return cell
}
return UITableViewCell()
}
private func findNextQuestion(allQuestions: [YHSurveyQuestionItem], displayedQuestions: [YHSurveyQuestionItem], answerDic: [String: [YHSurveyConditionOptionExtra]], currentIndex: Int, currentOptionId: String) -> YHSurveyQuestionItem? {
let currentQuestion = displayedQuestions[currentIndex]
let prefixQuestions = displayedQuestions.prefix(currentIndex + 1)
guard let currentAnswer = answerDic[currentQuestion.id] else {
return nil
}
let currentAnswerIds = currentAnswer.compactMap { $0.optionId }
let currentSelction = YHSurveyQuestionAndOptions(questionsId: currentQuestion.id, optionIds: Set(currentAnswerIds))
var retItem: YHSurveyQuestionItem?
for allItem in allQuestions {
if !prefixQuestions.contains(where: { prefixItem in
allItem.id == prefixItem.id
}) {
let showWhenV1 = allItem.showWhenV1
if showWhenV1.relation == "or" {
if showWhenV1.orArray.contains(where: { item in
item == currentSelction || (item.optionIds.count == 0 && currentSelction.questionsId == item.questionsId)
}) {
retItem = allItem
break
}
} else if showWhenV1.relation == "and" {
if showWhenV1.andArray.count == 0 {
continue
} else if showWhenV1.andArray.count == 1 {
if showWhenV1.andArray.contains(where: { item in
item == currentSelction || (item.optionIds.count == 0 && currentSelction.questionsId == item.questionsId)
}) {
retItem = allItem
break
}
} else {
let prefixItems = prefixQuestions.compactMap { prefixItem in
let options = answerDic[prefixItem.id] ?? []
let optionIds = options.compactMap { $0.optionId }
return YHSurveyQuestionAndOptions(questionsId: prefixItem.id, optionIds: Set(optionIds))
}
let isAllSubset = showWhenV1.andArray.allSatisfy { outterItem in
prefixItems.contains { innerItem in
outterItem == innerItem || (outterItem.optionIds.count == 0 && innerItem.questionsId == outterItem.questionsId)
}
}
if isAllSubset {
retItem = allItem
break
}
}
}
}
}
return retItem
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
if section == sections.count - 1 {
return 0.01
}
return 16
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y + scrollView.contentInset.top
topImageView.frame.origin.y = -offsetY
if offsetY > 0 {
var alpha = offsetY / k_Height_NavigationtBarAndStatuBar
if alpha > 1.0 {
alpha = 1.0
}
gk_navBarAlpha = alpha
gk_navBackgroundColor = .white
gk_navTitle = "香港身份方案评估"
gk_backImage = UIImage(named: "nav_black_24")
gk_navRightBarButtonItem?.image = UIImage(named: "share_item")
updateRightBarButtonItem(false)
} else {
gk_navBarAlpha = 0.0
gk_navBackgroundColor = .clear
gk_navTitle = nil
updateRightBarButtonItem(true)
gk_backImage = UIImage(named: "back_icon_white")
}
}
}
//
// YHPlanPolicyDetailViewController.swift
// galaxy
//
// Created by Dufet on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import Photos
import VisualEffectView
class YHPlanPolicyImageInfo {
var model: YHPlanCaseModel = YHPlanCaseModel()
var imgView: UIImageView = UIImageView()
let height: CGFloat = 520.0
var width: CGFloat = 520.0
}
class YHPlanPolicyDetailViewController: YHBaseViewController {
var firstAppear: Bool = true
var arr: [YHPlanCaseModel] = [] {
didSet {
imgs.removeAll()
for item in arr {
let model = YHPlanPolicyImageInfo()
model.model = item
imgs.append(model)
}
self.collectionView.reloadData()
}
}
var currentIndex: Int = 0
var imgs: [YHPlanPolicyImageInfo] = []
lazy var bgImgView: UIImageView = {
let v = UIImageView()
v.clipsToBounds = true
return v
}()
lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.minimumInteritemSpacing = 0.0
layout.minimumLineSpacing = 0.0
layout.scrollDirection = .horizontal
let collectView = UICollectionView(frame: CGRect(x: 0, y: k_Height_NavigationtBarAndStatuBar+24.0, width: KScreenWidth, height: 520), collectionViewLayout: layout)
collectView.backgroundColor = .clear
collectView.delegate = self
collectView.dataSource = self
collectView.register(YHPlanShareImageCell.self, forCellWithReuseIdentifier: YHPlanShareImageCell.cellReuseIdentifier)
collectView.isPagingEnabled = true
collectView.showsHorizontalScrollIndicator = false
return collectView
}()
lazy var blurView: VisualEffectView = {
let blurView = VisualEffectView()
blurView.colorTint = UIColor(hex: 0xAFAFAF).withAlphaComponent(0.15)
blurView.blurRadius = 16
blurView.scale = 1
return blurView
}()
lazy var shareBtn: UIButton = {
let btn = UIButton()
btn.backgroundColor = .white
btn.setTitle("分享", for: .normal)
btn.setTitleColor(.mainTextColor, for: .normal)
btn.titleLabel?.font = .PFSC_M(ofSize: 16)
btn.layer.cornerRadius = 3.0
btn.addTarget(self, action: #selector(didShareBtnClicked), for: .touchUpInside)
return btn
}()
@objc func didShareBtnClicked() {
let view = YHPlanLinkShareView.alertView()
view.clickBlock = { [weak self] type in
guard let self = self else { return }
if 0 <= currentIndex, currentIndex < arr.count {
let model = arr[currentIndex]
if type == .wechat {
sendImageToWechat(model.image_poster)
} else if type == .copyLink {
let pasteBoard = UIPasteboard.general
pasteBoard.string = model.image_poster
YHHUD.flash(message: "复制成功")
} else if type == .saveImg {
saveImgFromUrl(model.image_poster)
}
}
}
view.show()
}
override func viewDidLoad() {
super.viewDidLoad()
gk_backImage = UIImage(named: "nav_back_white")
gk_navTitle = "\(currentIndex+1)/\(arr.count)"
gk_navTitleColor = .white
view.backgroundColor = .init(hex: 0x000000, alpha: 1.0)
view.addSubview(bgImgView)
view.addSubview(blurView)
view.addSubview(collectionView)
view.addSubview(shareBtn)
bgImgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
blurView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
collectionView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar+24.0)
make.height.equalTo(520)
}
shareBtn.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.height.equalTo(46)
make.top.equalTo(collectionView.snp.bottom).offset(32)
}
loadImgs()
showBgImage(index: currentIndex)
}
func showBgImage(index: Int) {
if 0 <= index, index < arr.count {
let model = arr[index]
if let url = URL(string: model.image_poster) {
bgImgView.kf.setImage(with: url)
}
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if firstAppear {
collectionView.scrollToItem(at: IndexPath(row: currentIndex, section: 0), at: .top, animated: false)
firstAppear = false
}
}
func loadImgs() {
let ossGroup = DispatchGroup()
for item in imgs {
ossGroup.enter()
item.imgView.kf.setImage(with: URL(string: item.model.image_poster)) { result in
switch result {
case let .success(value):
let size = value.image.size
let scale = size.height > 0 ? Double(size.width / size.height) : 1.0
if scale > 0 {
item.width = scale * item.height
printLog("IMG_SIZE: \(item.width), \(item.height)")
}
case let .failure(error):
print("Job failed: \(error.localizedDescription)")
}
ossGroup.leave()
}
}
ossGroup.notify(queue: .main) {
self.collectionView.reloadData()
}
}
}
extension YHPlanPolicyDetailViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
// 返回单元格数量
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imgs.count
}
// 返回每个单元格的大小
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: KScreenWidth, height: 520)
}
// 返回自定义单元格
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: YHPlanShareImageCell.cellReuseIdentifier, for: indexPath) as? YHPlanShareImageCell else {
return UICollectionViewCell()
}
if 0 <= indexPath.item && indexPath.item < imgs.count {
let model = imgs[indexPath.item]
cell.model = model
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if 0 <= indexPath.item && indexPath.item < imgs.count {
let model = imgs[indexPath.item]
YHPictureReviewManager.shared.showNetWorkPicturs(curIndex: 0, arrPicturs: [model.model.image_poster])
}
}
}
extension YHPlanPolicyDetailViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
currentIndex = Int(scrollView.contentOffset.x/KScreenWidth)
gk_navTitle = "\(currentIndex+1)/\(arr.count)"
showBgImage(index: currentIndex)
}
}
extension YHPlanPolicyDetailViewController {
func saveImgFromUrl(_ urlString: String) {
guard let url = URL(string: urlString) else {
YHHUD.flash(message: "保存失败")
return
}
YHHUD.show(.progress(message: "下载中..."))
let task = URLSession.shared.dataTask(with: url) { data, _, error in
DispatchQueue.main.async {
YHHUD.hide()
guard let data = data, error == nil else { return YHHUD.flash(message: "保存成功") }
let image = UIImage(data: data)
if let image = image {
// 保存图片到图库
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAsset(from: image)
}, completionHandler: { success, error in
if success {
// 图片保存成功
DispatchQueue.main.async {
YHHUD.flash(message: "保存成功")
}
} else if let error = error {
// 保存失败
DispatchQueue.main.async {
YHHUD.flash(message: "保存失败")
}
print("保存图片出错: \(error.localizedDescription)")
}
})
}
}
}
task.resume()
}
func sendImageToWechat(_ urlString: String) {
guard let url = URL(string: urlString) else {
return
}
let task = URLSession.shared.dataTask(with: url) { data, _, error in
DispatchQueue.main.async {
guard let data = data, error == nil else { return }
let image = UIImage(data: data)
if let image = image {
YHShareManager.shared.sendImageContent(image)
}
}
}
task.resume()
}
}
//
// YHPlanShareViewController.swift
// galaxy
//
// Created by Dufet on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import JXSegmentedView
enum YHPlanShareBgType: Int {
case link = 1
case pdf = 2
}
class YHPlanShareBgView: UIView, JXSegmentedListContainerViewListDelegate {
let bgWidth = 293.0
let bgHeight = 380.0
var type: YHPlanShareBgType = .link {
didSet {
imgV.image = type == .link ? UIImage(named: "plan_share_link_bg") : UIImage(named: "plan_share_pdf_bg")
imgV.snp.remakeConstraints { make in
make.width.equalTo( type == .link ? bgWidth : 217)
make.height.equalTo(bgHeight)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
}
self.setNeedsLayout()
self.layoutIfNeeded()
}
}
lazy var imgV: UIImageView = {
let imgV = UIImageView()
imgV.image = UIImage(named: "plan_share_link_bg")
return imgV
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.addSubview(imgV)
imgV.snp.makeConstraints { make in
make.width.equalTo(bgWidth)
make.height.equalTo(bgHeight)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
}
}
func listView() -> UIView {
return self
}
}
class YHPlanShareViewController: YHBaseViewController {
var type: YHPlanShareBgType = .link
var shareUrl: String = ""
var pdfCreateUrl: String = ""
var pdfDownloadUrl: String = ""
let viewModel = YHPlanViewModel()
let segmentTitles = ["分享链接", "分享PDF"]
let bgWidth = 293.0
let bgHeight = 380.0
lazy var segmentedView: JXSegmentedView = {
let view = JXSegmentedView(frame: CGRect(x: 0, y: k_Height_safeAreaInsetsTop(), width: KScreenWidth, height: 30))
view.backgroundColor = .clear
view.delegate = self
// 配置指示器
let indicator = JXSegmentedIndicatorLineView()
indicator.indicatorWidth = 16
indicator.indicatorHeight = 2
indicator.indicatorCornerRadius = 0.0
indicator.indicatorColor = UIColor.mainTextColor
view.indicators = [indicator]
view.dataSource = segmentedDataSource
view.listContainer = listContainerView
return view
}()
lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
let dataSource = JXSegmentedTitleDataSource()
dataSource.titles = segmentTitles
dataSource.titleNormalFont = UIFont.PFSC_R(ofSize: 16)
dataSource.titleNormalColor = UIColor.init(hex: 0x94A3B8)
dataSource.titleSelectedFont = UIFont.PFSC_M(ofSize: 16)
dataSource.titleSelectedColor = .mainTextColor
dataSource.isItemSpacingAverageEnabled = false
dataSource.itemWidth = 64
dataSource.itemSpacing = 22
return dataSource
}()
lazy var listContainerView: JXSegmentedListContainerView! = {
let view = JXSegmentedListContainerView(dataSource: self, type: .scrollView)
view.backgroundColor = .clear
return view
}()
lazy var bottomShareView: YHPlanShareView = {
let v = YHPlanShareView(frame: .zero)
v.type = .link
v.clickBlock = { [weak self] type, eventType in
guard let self = self else { return }
if eventType == .cancel {
self.navigationController?.popViewController(animated: true)
return
}
if type == .link {
if eventType == .wechat {
let iconImg = UIImage(named: "plan_share_icon") ?? UIImage()
YHShareManager.shared.sendLinkContent("香港续签至永居方案分析", "具体方案您可以联系专属顾问和生活管家深入咨询", iconImg, link: shareUrl)
} else if eventType == .copyLink {
let pasteBoard = UIPasteboard.general
pasteBoard.string = shareUrl
YHHUD.flash(message: "复制成功")
}
} else if type == .pdf {
if let sourceUrl = URL(string: pdfDownloadUrl) {
let fileName = getPDFFileName()
let destinationURL = self.planDocumentFileUrl.appendingPathComponent(fileName)
if eventType == .wechat {
if FileManager.default.fileExists(atPath: destinationURL.path) {
let fileName = destinationURL.lastPathComponent
let fileExtension = destinationURL.pathExtension
YHShareManager.shared.shareFileToWeChat(fileUrl: destinationURL, filename: fileName, ext: fileExtension)
return
}
YHHUD.flash(message: "请先点击保存PDF")
} else if eventType == .saveImg {
// if FileManager.default.fileExists(atPath: destinationURL.path) {
// YHHUD.flash(message: "已下载PDF")
// return
// }
//
if pdfDownloadUrl.isEmpty {
requestPDF(isShowLoading: true)
} else {
downloadPDF(pdfDownloadUrl, isShowLoading: true)
}
}
}
}
}
return v
}()
lazy var shareLinkBgView: YHPlanShareBgView = {
let v = YHPlanShareBgView()
v.type = .link
return v
}()
lazy var sharePdfBgView: YHPlanShareBgView = {
let v = YHPlanShareBgView()
v.type = .pdf
return v
}()
lazy var planDocumentFileUrl: URL = {
let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
// let planDirectoryURL = documentsURL.appendingPathComponent("plan")
return documentsURL
}()
override func viewDidLoad() {
super.viewDidLoad()
gk_navigationBar.backgroundColor = .clear
view.backgroundColor = .init(hex: 0xF5F6F8)
view.addSubview(segmentedView)
view.addSubview(listContainerView)
view.addSubview(bottomShareView)
segmentedView.snp.makeConstraints { make in
make.top.equalTo(8+k_Height_NavigationtBarAndStatuBar)
make.height.equalTo(34)
make.width.equalTo(64.0*2.0 + 24.0 + 22*2)
make.centerX.equalToSuperview()
}
listContainerView.snp.makeConstraints { make in
make.top.equalTo(segmentedView.snp.bottom).offset(20)
make.centerX.equalToSuperview()
make.width.equalTo(bgWidth)
make.height.equalTo(bgHeight)
}
bottomShareView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(216)
}
if pdfDownloadUrl.isEmpty {
requestPDF(isShowLoading: false)
} else {
downloadPDF(pdfDownloadUrl, isShowLoading: false)
}
}
func requestPDF(isShowLoading: Bool) {
if isShowLoading {
YHHUD.show(.progress(message: "加载中..."))
}
self.viewModel.requetPDFUrl(self.pdfCreateUrl) { [weak self] url in
YHHUD.hide()
guard let self = self else { return }
self.pdfDownloadUrl = url
self.downloadPDF(url, isShowLoading: isShowLoading)
}
}
func downloadPDF(_ urlString: String, isShowLoading: Bool) {
guard let url = URL(string: urlString) else {
YHHUD.flash(message: "下载PDF失败")
return
}
if isShowLoading {
YHHUD.show(.progress(message: "下载中..."))
}
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)
let task = session.downloadTask(with: url) { [weak self] (locationUrl, response, error) in
DispatchQueue.main.async {
YHHUD.hide()
guard let self = self else { return }
guard let locationUrl = locationUrl, error == nil else {
print("下载失败: \(error?.localizedDescription ?? "未知错误")")
YHHUD.flash(message: "下载PDF失败")
return
}
if let res = response {
printLog(res.suggestedFilename)
}
self.savePDF(sourceUrl: url, locationUrl: locationUrl, isShowLoading: isShowLoading)
}
}
task.resume()
}
func getPDFFileName() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd" // HH:mm:ss
let dateString = dateFormatter.string(from: Date())
return "香港续签至永居方案" + dateString + ".pdf"
}
func savePDF(sourceUrl: URL, locationUrl: URL, isShowLoading: Bool) {
let fileManager = FileManager.default
// 保存文件到 plan 目录
let fileName = getPDFFileName()
let destinationURL = self.planDocumentFileUrl.appendingPathComponent(fileName)
do {
// 如果文件已存在,先移除
if fileManager.fileExists(atPath: destinationURL.path) {
try fileManager.removeItem(at: destinationURL)
}
try fileManager.moveItem(at: locationUrl, to: destinationURL)
print("文件已保存到: \(destinationURL.path)")
print("文件源地址: \(locationUrl.path)")
if isShowLoading {
YHHUD.flash(message: "下载PDF成功")
}
} catch {
print("保存文件失败: \(error.localizedDescription)")
if isShowLoading {
YHHUD.flash(message: "下载PDF失败")
}
}
}
}
extension YHPlanShareViewController: JXSegmentedViewDelegate {
func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
if index == 1 {
self.type = .pdf
} else {
self.type = .link
}
bottomShareView.type = self.type
}
}
extension YHPlanShareViewController: JXSegmentedListContainerViewDataSource {
func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
return segmentTitles.count
}
func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
if index == 0 {
return shareLinkBgView
}
return sharePdfBgView
}
}
//
// YHPlanTestViewController.swift
// galaxy
//
// Created by Dufet on 2025/3/25.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import JXSegmentedView
class YHPlanTestViewController: YHBaseViewController {
let viewModel = YHPlanViewModel()
var shareUrl: String = ""
var pdfCreateUrl: String = ""
var pdfDownloadUrl: String = ""
var infoArr: [String] = ["", "", "", "", "", ""]
var analyzeArr: [YHPlanAnalyzeModel] = [YHPlanAnalyzeModel(),
YHPlanAnalyzeModel(),
YHPlanAnalyzeModel(),
YHPlanAnalyzeModel()]
var policyArr: [YHPlanCaseModel] = []
var caseArr: [YHPlanCaseModel] = []
let headerViewHeight = 146.0
let topScrollHeight = 146.0-44.0
var contentOffSetChangeBig = false
lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .grouped)
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
tableView.bounces = false
tableView.showsVerticalScrollIndicator = false
tableView.estimatedSectionHeaderHeight = 1.0
tableView.estimatedSectionFooterHeight = 1.0
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.register(YHPlanAnalyzeInfoCell.self, forCellReuseIdentifier: YHPlanAnalyzeInfoCell.cellReuseIdentifier)
tableView.register(YHPlanScoreCell.self, forCellReuseIdentifier: YHPlanScoreCell.cellReuseIdentifier)
tableView.register(YHPlanCustomerCaseListCell.self, forCellReuseIdentifier: YHPlanCustomerCaseListCell.cellReuseIdentifier)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.tableHeaderView = headerView
return tableView
}()
lazy var whiteBackBtn: UIButton = {
let v = UIButton()
v.setImage(UIImage(named: "nav_back_white"), for: .normal)
v.addTarget(self, action: #selector(backItemClick(_:)), for: .touchUpInside)
return v
}()
// lazy var shareBtn: UIButton = {
// let v = UIButton()
// v.setImage(UIImage(named: "plan_nav_share"), for: .normal)
// v.addTarget(self, action: #selector(didShareBtnClicked), for: .touchUpInside)
// return v
// }()
@objc func didShareBtnClicked() {
let vc = YHPlanShareViewController()
vc.shareUrl = self.shareUrl
vc.pdfCreateUrl = self.pdfCreateUrl
vc.pdfDownloadUrl = self.pdfDownloadUrl
self.navigationController?.pushViewController(vc)
}
lazy var headerView: UIView = {
let v = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: headerViewHeight))
v.addSubview(titleImgView)
v.addSubview(descLabel)
v.addSubview(revalueBtn)
segmented1View.dataSource = segmented1DataSource
v.addSubview(segmented1View)
titleImgView.snp.makeConstraints { make in
make.left.equalTo(16)
make.width.equalTo(268)
make.height.equalTo(42)
make.top.equalTo(16)
}
descLabel.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(titleImgView.snp.bottom).offset(4)
make.height.equalTo(16)
}
revalueBtn.snp.makeConstraints { make in
make.top.equalTo(titleImgView).offset(16)
make.right.equalTo(-16)
make.width.equalTo(68)
make.height.equalTo(28)
}
segmented1View.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(30)
make.bottom.equalTo(-10)
}
return v
}()
lazy var bgImgView: UIImageView = {
let v = UIImageView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenWidth))
v.image = UIImage(named: "plan_list_head_bg")
return v
}()
lazy var titleImgView: UIImageView = {
let v = UIImageView()
v.image = UIImage(named: "plan_list_title")
return v
}()
lazy var descLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0xFFFFFF, alpha: 0.6)
lable.textAlignment = .left
lable.font = UIFont.PFSC_R(ofSize: 12)
lable.text = "具体方案您可以联系专属顾问和生活管家深入咨询"
return lable
}()
lazy var revalueBtn: UIButton = {
let btn = UIButton()
btn.backgroundColor = .clear
btn.setTitle("重新评估", for: .normal)
btn.setTitleColor(.white, for: .normal)
btn.titleLabel?.font = UIFont.PFSC_M(ofSize: 11)
btn.addTarget(self, action: #selector(didRevalueBtnClicked), for: .touchUpInside)
btn.layer.cornerRadius = kCornerRadius3
btn.layer.borderWidth = 0.5
btn.layer.borderColor = UIColor.init(hex: 0xFFFFFF, alpha: 0.2).cgColor
btn.YH_clickEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
return btn
}()
let segmentTitles = ["综合", "工作", "生活", "投资", "逗留"]
lazy var segmented1View: JXSegmentedView = {
let view = JXSegmentedView(frame: CGRect(x: 0, y: k_Height_safeAreaInsetsTop(), width: KScreenWidth, height: 30))
view.backgroundColor = .clear
view.delegate = self
// 配置指示器
let indicator = JXSegmentedIndicatorLineView()
indicator.indicatorWidth = 16
indicator.indicatorHeight = 2
indicator.indicatorCornerRadius = 0.0
indicator.indicatorColor = UIColor.white
view.indicators = [indicator]
return view
}()
lazy var segmented1DataSource: JXSegmentedTitleDataSource = {
let dataSource = JXSegmentedTitleDataSource()
dataSource.titles = segmentTitles
dataSource.titleNormalFont = UIFont.PFSC_R(ofSize: 16)
dataSource.titleNormalColor = UIColor.init(hex: 0xFFFFFF, alpha: 0.6)
dataSource.titleSelectedFont = UIFont.PFSC_M(ofSize: 16)
dataSource.titleSelectedColor = .white
dataSource.isItemSpacingAverageEnabled = false
dataSource.itemWidth = (KScreenWidth-16.0*2.0)/Double(segmentTitles.count)
dataSource.itemSpacing = 0.0
return dataSource
}()
lazy var segmented2View: JXSegmentedView = {
let view = JXSegmentedView(frame: CGRect(x: 0, y: k_Height_safeAreaInsetsTop(), width: KScreenWidth, height: 48))
view.backgroundColor = .clear
view.delegate = self
// 配置指示器
let indicator = JXSegmentedIndicatorLineView()
indicator.indicatorWidth = 16
indicator.indicatorHeight = 2
indicator.indicatorCornerRadius = 0.0
indicator.indicatorColor = .mainTextColor
view.indicators = [indicator]
view.dataSource = segmented2DataSource
return view
}()
lazy var segmented2DataSource: JXSegmentedTitleDataSource = {
let dataSource = JXSegmentedTitleDataSource()
dataSource.titles = segmentTitles
dataSource.titleNormalFont = UIFont.PFSC_R(ofSize: 16)
dataSource.titleNormalColor = UIColor.init(hex: 0x6A7586)
dataSource.titleSelectedFont = UIFont.PFSC_M(ofSize: 16)
dataSource.titleSelectedColor = .mainTextColor
dataSource.isItemSpacingAverageEnabled = false
dataSource.itemWidth = (KScreenWidth-16.0*2.0)/Double(segmentTitles.count)
dataSource.itemSpacing = 0.0
return dataSource
}()
lazy var fixedSegmentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.alpha = 0.0
v.addSubview(segmented2View)
segmented2View.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(30)
make.bottom.equalTo(-6)
make.top.equalTo(8)
}
return v
}()
lazy var bottomView: UIView = {
let v = UIView()
v.backgroundColor = .white
let listView = YHPlanItemsView(frame: .zero)
v.addSubview(listView)
let button = YHLookPlanButton(frame: .zero)
button.addTarget(self, action: #selector(didBottomBtnClicked), for: .touchUpInside)
v.addSubview(button)
listView.snp.makeConstraints { make in
make.left.equalTo(0)
make.right.equalTo(0)
make.height.equalTo(17)
make.top.equalTo(12)
}
button.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(60)
make.top.equalTo(listView.snp.bottom).offset(8)
}
return v
}()
lazy var policyVieiw: YHPlanPolicyCarouselView = {
let v = YHPlanPolicyCarouselView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 268))
v.clickBlock = { [weak self] arr, index in
guard let self = self else { return }
let vc = YHPlanPolicyDetailViewController()
vc.arr = arr
vc.currentIndex = index
self.navigationController?.pushViewController(vc, animated: true)
}
return v
}()
@objc func didRevalueBtnClicked() {
let vc = YHCustomerInformationQuestionnaireVC()
self.navigationController?.pushViewController(vc)
}
@objc func didBottomBtnClicked() {
self.enterMakePlanPage()
}
func enterMakePlanPage() {
let vc = YHMakePlanViewController()
self.navigationController?.pushViewController(vc)
}
func updateRightBarButtonItemWhite(_ isWhite: Bool) {
let rightButtonItem = UIBarButtonItem(image: UIImage(named: isWhite ? "plan_nav_share" : "share_item")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(didShareBtnClicked))
gk_navRightBarButtonItem = rightButtonItem
gk_navItemRightSpace = 16
}
override func viewDidLoad() {
super.viewDidLoad()
gk_navBarAlpha = 0.0
gk_navBackgroundColor = .clear
gk_backImage = UIImage(named: "back_icon_white")
gk_navTitleColor = .mainTextColor
gk_navTitle = "续签至永居方案分析"
self.view.backgroundColor = .init(hex: 0xF8F9FB)
self.view.addSubview(bgImgView)
self.view.addSubview(tableView)
self.view.addSubview(fixedSegmentView)
self.view.addSubview(bottomView)
tableView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.bottom.equalTo(bottomView.snp.top)
}
fixedSegmentView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.height.equalTo(44)
}
bottomView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(102 + k_Height_safeAreaInsetsBottom())
}
requestData()
}
func requestData() {
viewModel.requetResignPlanInfo { [weak self] _, _ in
guard let self = self else { return }
var workModel = YHPlanAnalyzeModel()
workModel.name = "work"
var liveModel = YHPlanAnalyzeModel()
liveModel.name = "live"
var investModel = YHPlanAnalyzeModel()
investModel.name = "invest"
var stayModel = YHPlanAnalyzeModel()
stayModel.name = "stay"
for item in self.viewModel.planListModel.list {
if item.name == "work" {
workModel = item
} else if item.name == "live" {
liveModel = item
} else if item.name == "invest" {
investModel = item
} else if item.name == "stay" {
stayModel = item
}
}
workModel.score = self.viewModel.planListModel.basic.work_score
liveModel.score = self.viewModel.planListModel.basic.live_score
investModel.score = self.viewModel.planListModel.basic.invest_score
stayModel.score = self.viewModel.planListModel.basic.stay_time_score
analyzeArr.removeAll()
analyzeArr.append(contentsOf: [workModel, liveModel, investModel, stayModel])
policyArr.removeAll()
policyArr.append(contentsOf: self.viewModel.planListModel.plan_article_policy)
caseArr.removeAll()
caseArr.append(contentsOf: self.viewModel.planListModel.plan_article_case)
policyVieiw.bannerArr = policyArr
let url = "https://test-hklife.galaxy-immi.com/superAppBridge.html#/plan-analysis?code="
pdfCreateUrl = url + self.viewModel.planListModel.code
pdfDownloadUrl = self.viewModel.planListModel.pdf_url
shareUrl = self.viewModel.planListModel.share_url
self.tableView.reloadData()
UIView.performWithoutAnimation {
self.tableView.scrollToRow(at: IndexPath(row: NSNotFound, section: self.infoArr.count-2), at: .top, animated: false)
self.tableView.setContentOffset(.zero, animated: false)
}
}
}
}
extension YHPlanTestViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return self.infoArr.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if 0 <= indexPath.section && indexPath.section < self.infoArr.count {
if indexPath.section == 0 {
guard let cell1 = tableView.dequeueReusableCell(withIdentifier: YHPlanScoreCell.cellReuseIdentifier, for: indexPath) as? YHPlanScoreCell else {
return UITableViewCell()
}
cell1.model = self.viewModel.planListModel.basic
return cell1
} else if indexPath.section < 5 {
guard let cell2 = tableView.dequeueReusableCell(withIdentifier: YHPlanAnalyzeInfoCell.cellReuseIdentifier, for: indexPath) as? YHPlanAnalyzeInfoCell else {
return UITableViewCell()
}
cell2.model = analyzeArr[indexPath.section-1]
cell2.clickBlock = { [weak self] _ in
guard let self = self else { return }
self.enterMakePlanPage()
}
return cell2
} else if indexPath.section == 5 {
if caseArr.count > 0 {
guard let cell3 = tableView.dequeueReusableCell(withIdentifier: YHPlanCustomerCaseListCell.cellReuseIdentifier, for: indexPath) as? YHPlanCustomerCaseListCell else {
return UITableViewCell()
}
cell3.cases = self.caseArr
cell3.clickBlock = { [weak self] arr, index in
guard let self = self else { return }
let vc = YHPlanPolicyDetailViewController()
vc.arr = arr
vc.currentIndex = index
self.navigationController?.pushViewController(vc, animated: true)
}
return cell3
}
}
}
let defaultCell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell", for: indexPath)
defaultCell.backgroundColor = .clear
defaultCell.contentView.backgroundColor = .clear
return defaultCell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 5 {
if caseArr.count > 0 {
return getCaseListHeight()
}
return 1.0
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
if section == 4 {
if policyArr.count > 0 {
return 268.0
}
return 1.0
}
return 1.0
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
if section == 4 {
if policyArr.count > 0 {
return self.policyVieiw
}
}
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 1.0
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
// 计算文字宽度大小
func getHeigt(font: UIFont, width: CGFloat, string: String) -> CGFloat {
let size = CGSize.init(width: width, height: CGFloat(MAXFLOAT))
let dic = [NSAttributedString.Key.font: font] // swift 4.2
let strSize = string.boundingRect(with: size, options: [.usesLineFragmentOrigin], attributes: dic, context: nil).size
return ceil(strSize.height)
}
func getCaseListHeight() -> CGFloat {
let cellWidth = floor((KScreenWidth-16.0*2.0-10.0)/2.0)
var yOffset1 = 0.0
var yOffset2 = 0.0
for (index, item) in caseArr.enumerated() {
let textHeight = self.getHeigt(font: UIFont.PFSC_R(ofSize: 14), width: cellWidth-8.0*2.0, string: item.title)
let caseCellHeight = textHeight + (cellWidth*(200.0/166.0) + 8.0+12.0+10.0)
if index % 2 == 0 {
yOffset1 += caseCellHeight
} else {
yOffset2 += caseCellHeight
}
}
let contentHeight = max(yOffset1, yOffset2) + 20.0 + 12.0
return contentHeight
}
}
extension YHPlanTestViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y > 0 {
var alpha = scrollView.contentOffset.y/20.0
if alpha > 1.0 {
alpha = 1.0
} else if alpha < 0.0 {
alpha = 0.0
}
gk_navBarAlpha = alpha
gk_navBackgroundColor = .white
gk_navTitle = "续签至永居方案分析"
gk_backImage = UIImage(named: "nav_black_24")
updateRightBarButtonItemWhite(false)
} else {
gk_navBarAlpha = 0.0
gk_navBackgroundColor = .clear
gk_navTitle = nil
gk_backImage = UIImage(named: "back_icon_white")
updateRightBarButtonItemWhite(true)
}
fixedSegmentView.alpha = scrollView.contentOffset.y >= topScrollHeight ? 1.0 : 0.0
bgImgView.y = -tableView.contentOffset.y
printLog("tableView: \(tableView.contentOffset.y)")
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
var find = false
for index in 0...infoArr.count-1 {
let rect = self.tableView.rectForRow(at: IndexPath(row: 0, section: index))
let conditon = tableView.contentOffset.y <= rect.origin.y-44.0
if conditon, index < infoArr.count-1 {
find = true
let targetIndex = index-1 >= 0 ? index-1 : 0
self.segmented2View.defaultSelectedIndex = targetIndex
self.segmented2View.reloadDataWithoutListContainer()
self.segmented1View.defaultSelectedIndex = targetIndex
self.segmented1View.reloadDataWithoutListContainer()
printLog("TargetIndex: \(targetIndex)")
break
}
}
if !find {
printLog("TargetIndex: \(segmentTitles.count-1)")
self.segmented2View.defaultSelectedIndex = segmentTitles.count-1
self.segmented2View.reloadDataWithoutListContainer()
self.segmented1View.defaultSelectedIndex = segmentTitles.count-1
self.segmented1View.reloadDataWithoutListContainer()
}
}
}
extension YHPlanTestViewController: JXSegmentedViewDelegate {
func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
self.tableView.setContentOffset(CGPoint(x: 0, y: self.tableView.contentOffset.y+2), animated: true)
DispatchQueue.main.asyncAfter(deadline: .now()+0.15, execute: {
let index = segmentedView.selectedIndex
let rect = self.tableView.rectForHeader(inSection: index)
let gap = index > 0 ? 8.0 : 0.0
self.tableView.setContentOffset(CGPoint(x: 0, y: rect.origin.y-44.0-gap), animated: true)
})
if segmentedView == segmented1View {
self.segmented2View.defaultSelectedIndex = index
self.segmented2View.reloadDataWithoutListContainer()
}
if segmentedView == segmented2View {
self.segmented1View.defaultSelectedIndex = index
self.segmented1View.reloadDataWithoutListContainer()
}
}
}
//
// YHSurveyMatchResultViewController.swift
// galaxy
//
// Created by alexzzw on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Lottie
import UIKit
class YHSurveyMatchResultViewController: YHBaseViewController {
enum MatchResult {
case failure
case success
func iconTitle() -> String {
switch self {
case .failure:
return "plan_survey_match_failure"
case .success:
return "plan_survey_match_success"
}
}
func title() -> String {
switch self {
case .failure:
return "匹配失败"
case .success:
return "匹配完成"
}
}
func content() -> String {
switch self {
case .failure:
return "出了点问题,重试一下吧"
case .success:
return "请您查阅【香港身份续签至永居方案】,\n如需进一步咨询,请联系专属顾问和生活管家"
}
}
func buttonTitle() -> String {
switch self {
case .failure:
return "重新匹配"
case .success:
return "香港身份续签至永居方案"
}
}
}
private lazy var topImageView: UIImageView = {
let view = UIImageView()
return view
}()
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.textColor = .mainTextColor
label.font = .PFSC_B(ofSize: 26)
label.textAlignment = .center
return label
}()
private lazy var infoContentLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor(hex: 0x6A7586)
label.font = .PFSC_R(ofSize: 15)
label.textAlignment = .center
label.numberOfLines = 0
return label
}()
private lazy var matchButton: UIButton = {
let button = UIButton(type: .custom)
button.addTarget(self, action: #selector(matchButtonClicked), for: .touchUpInside)
button.backgroundColor = .mainTextColor
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = .PFSC_M(ofSize: 16)
button.layer.cornerRadius = 3
button.clipsToBounds = true
return button
}()
var matchAgainEvent: (() -> Void)?
private let pageType: MatchResult
init(_ pageType: MatchResult) {
self.pageType = pageType
super.init(nibName: nil, bundle: nil)
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func backItemClick(_ sender: Any) {
backEvent()
}
/// 是否可以返回,包括点击返回和手势返回,默认YES
override func navigationShouldPop() -> Bool {
backEvent()
return false
}
private func backEvent() {
if pageType == .success {
navigationController?.popToRootViewController(animated: true)
} else {
matchAgainEvent?()
navigationController?.popViewController()
}
}
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
gk_navTitle = "香港身份方案评估"
gk_navBarAlpha = 1.0
gk_navBackgroundColor = .white
view.backgroundColor = UIColor.white
view.addSubview(topImageView)
view.addSubview(infoTitleLabel)
view.addSubview(infoContentLabel)
view.addSubview(matchButton)
topImageView.snp.makeConstraints { make in
make.width.equalTo(200)
make.height.equalTo(200)
make.top.equalToSuperview().offset(90 + k_Height_NavigationtBarAndStatuBar)
make.centerX.equalToSuperview()
}
infoTitleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(topImageView.snp.bottom).offset(8)
}
infoContentLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(infoTitleLabel.snp.bottom).offset(8)
make.left.greaterThanOrEqualToSuperview().offset(16)
make.right.lessThanOrEqualToSuperview().offset(-16)
}
matchButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(38)
make.right.equalToSuperview().offset(-38)
make.bottom.equalTo(view.layoutMarginsGuide.snp.bottom).offset(-68)
make.height.equalTo(48)
}
topImageView.image = UIImage(named: pageType.iconTitle())
infoTitleLabel.text = pageType.title()
infoContentLabel.text = pageType.content()
matchButton.setTitle(pageType.buttonTitle(), for: .normal)
if pageType == .success {
playMatchSuccessAnimation()
}
}
@objc private func matchButtonClicked() {
if pageType == .success {
guard let navigationController = self.navigationController else {
return
}
let ctl = YHPlanTestViewController()
ctl.hidesBottomBarWhenPushed = true
var viewControllers = Array(navigationController.viewControllers.prefix(1))
viewControllers.append(ctl)
navigationController.setViewControllers(viewControllers, animated: true)
} else {
matchAgainEvent?()
navigationController?.popViewController()
}
}
/// 播放匹配成功
private func playMatchSuccessAnimation() {
let aniView = LottieAnimationView(name: "survey_match_success")
aniView.isUserInteractionEnabled = false
aniView.frame = CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenWidth)
aniView.contentMode = .scaleAspectFit
aniView.loopMode = .playOnce
view.addSubview(aniView)
aniView.play(completion: { _ in
aniView.removeFromSuperview()
})
}
}
//
// YHSurveyMatchingViewController.swift
// galaxy
//
// Created by alexzzw on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Lottie
import UIKit
class YHSurveyMatchingViewController: YHBaseViewController {
private lazy var viewModel = YHSurveyViewModel()
private var timer: Timer?
private var startTime: Date?
private var isRequestCompleted = false
private lazy var lottieView: LottieAnimationView = {
let aniView = LottieAnimationView(name: "survey_file_scan")
aniView.isUserInteractionEnabled = false
aniView.frame = CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenWidth)
aniView.contentMode = .scaleAspectFit
aniView.loopMode = .loop
return aniView
}()
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.text = "智能匹配中"
label.textColor = .mainTextColor
label.font = .PFSC_B(ofSize: 26)
label.textAlignment = .center
return label
}()
private lazy var infoContentLabel: UILabel = {
let label = UILabel()
label.text = "正在为您制定香港身份续签至永居方案"
label.textColor = UIColor(hex: 0x6A7586)
label.font = .PFSC_R(ofSize: 15)
label.textAlignment = .center
label.numberOfLines = 0
return label
}()
private lazy var progressView: UIProgressView = {
let view = UIProgressView()
view.progressTintColor = .mainTextColor
view.trackTintColor = UIColor(hexString: "#F5F6F8")
view.progress = 0.6
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
startLoading()
}
private func setupUI() {
gk_navTitle = "香港身份方案评估"
gk_navBarAlpha = 1.0
gk_navBackgroundColor = .white
view.backgroundColor = UIColor.white
view.addSubview(lottieView)
view.addSubview(infoTitleLabel)
view.addSubview(infoContentLabel)
view.addSubview(progressView)
lottieView.snp.makeConstraints { make in
make.width.equalTo(248)
make.height.equalTo(248)
make.top.equalToSuperview().offset(32 + k_Height_NavigationtBarAndStatuBar)
make.centerX.equalToSuperview()
}
infoTitleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(lottieView.snp.bottom).offset(18)
}
infoContentLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(infoTitleLabel.snp.bottom).offset(8)
make.left.greaterThanOrEqualToSuperview().offset(16)
make.right.lessThanOrEqualToSuperview().offset(-16)
}
progressView.snp.makeConstraints { make in
make.width.equalTo(220)
make.height.equalTo(4)
make.centerX.equalToSuperview()
make.bottom.equalTo(view.layoutMarginsGuide.snp.bottom).offset(-90)
}
}
private func startLoading() {
startAnimation()
// 重置状态
progressView.progress = 0
isRequestCompleted = false
startTime = Date()
timer = Timer.scheduledTimer(withTimeInterval: 0.016, repeats: true, block: { [weak self] _ in
guard let self = self else { return }
guard let startTime = self.startTime else { return }
let elapsed = Date().timeIntervalSince(startTime)
let totalDuration: TimeInterval = 4.0 // 总时长4秒
if elapsed < totalDuration {
// 前4秒内,进度条从0%到90%
let progress = Float(elapsed / totalDuration) * 0.9
self.progressView.progress = progress
} else {
// 4秒后
self.timer?.invalidate()
self.timer = nil
if self.isRequestCompleted {
// 如果请求已完成,直接到100%
self.progressView.progress = 1.0
self.loadingCompleted()
} else {
// 如果请求未完成,保持90%,等待请求完成
self.progressView.progress = 0.9
}
self.requestState()
}
})
// requestState()
}
private func requestState() {
viewModel.getRenewalPlanState { [weak self] _, _ in
guard let self = self else {
return
}
self.isRequestCompleted = true
if self.timer == nil {
// 如果计时器已经结束(超过4秒),直接完成进度条
self.progressView.progress = 1.0
self.loadingCompleted()
}
}
}
private func loadingCompleted() {
stopAnimation()
if let state = viewModel.planState, state.isGeneratePlan {
gotoMatchResultVC(true)
} else {
gotoMatchResultVC(false)
}
}
private func gotoMatchResultVC(_ isSucess: Bool) {
let ctl = YHSurveyMatchResultViewController(isSucess ? .success : .failure)
if !isSucess {
ctl.matchAgainEvent = { [weak self] in
self?.startLoading()
}
}
navigationController?.pushViewController(ctl)
}
private func startAnimation() {
lottieView.play(completion: { _ in
//
})
}
private func stopAnimation() {
lottieView.stop()
}
}
//
// YHSurveySubmitDoneViewController.swift
// galaxy
//
// Created by alexzzw on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHSurveySubmitDoneViewController: YHBaseViewController {
private lazy var topImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "plan_question_submitted")
return view
}()
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.text = "问卷提交成功"
label.textColor = .mainTextColor
label.font = .PFSC_B(ofSize: 17)
label.textAlignment = .center
return label
}()
private lazy var infoContentLabel: UILabel = {
let label = UILabel()
label.text = "专属顾问将在24小时内与您联系,\n为您提供详细方案"
label.textColor = UIColor(hex: 0x6A7586)
label.font = .PFSC_R(ofSize: 14)
label.textAlignment = .center
label.numberOfLines = 0
return label
}()
private lazy var backHomeButton: UIButton = {
let button = UIButton(type: .custom)
button.setTitle("返回首页", for: .normal)
button.addTarget(self, action: #selector(backHomeClicked), for: .touchUpInside)
button.backgroundColor = .mainTextColor
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = .PFSC_R(ofSize: 14)
button.layer.cornerRadius = 3
button.clipsToBounds = true
return button
}()
override func backItemClick(_ sender: Any) {
backEvent()
}
/// 是否可以返回,包括点击返回和手势返回,默认YES
override func navigationShouldPop() -> Bool {
backEvent()
return false
}
private func backEvent() {
navigationController?.popToRootViewController(animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
gk_navTitle = "香港身份方案评估"
gk_navBarAlpha = 1.0
gk_navBackgroundColor = .white
view.backgroundColor = UIColor.white
view.addSubview(topImageView)
view.addSubview(infoTitleLabel)
view.addSubview(infoContentLabel)
view.addSubview(backHomeButton)
topImageView.snp.makeConstraints { make in
make.width.equalTo(127)
make.height.equalTo(127)
make.top.equalToSuperview().offset(129 + k_Height_NavigationtBarAndStatuBar)
make.centerX.equalToSuperview()
}
infoTitleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(topImageView.snp.bottom).offset(8)
}
infoContentLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(infoTitleLabel.snp.bottom).offset(8)
make.left.greaterThanOrEqualToSuperview().offset(16)
make.right.lessThanOrEqualToSuperview().offset(-16)
}
backHomeButton.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(infoContentLabel.snp.bottom).offset(24)
make.width.equalTo(100)
make.height.equalTo(40)
}
}
@objc private func backHomeClicked() {
UIViewController.current?.navigationController?.popToRootViewController(animated: false)
goTabBarBy(tabType: .home)
}
}
//
// YHPlanModel.swift
// galaxy
//
// Created by Dufet on 2025/3/25.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import SmartCodable
class YHPlanListModel: SmartCodable {
var basic: YHPlanValueChartInfo = YHPlanValueChartInfo()
var list: [YHPlanAnalyzeModel] = []
var plan_article_case: [YHPlanCaseModel] = []
var plan_article_policy: [YHPlanCaseModel] = []
var code: String = ""
var share_url: String = ""
var pdf_url: String = ""
required init() {
}
}
class YHPlanCaseModel: SmartCodable {
var title: String = ""
var img_url: String = ""
var image_poster: String = ""
required init() {
}
}
class YHPlanValueChartInfo: SmartCodable {
var work_score: String = ""
var live_score: String = ""
var invest_score: String = ""
var stay_time_score: String = ""
var result: String = ""
var level_name: String = ""
required init() {
}
}
class YHPlanProductModel: SmartCodable {
var title: String = ""
var description: String = ""
var img_url: String = ""
var recommend_product_ids: [Int] = []
required init() {
}
}
class YHPlanAnalyzeModel: SmartCodable {
var name: String = ""
var score: String = "0.0"
var current_state: String = ""
var suggest: String = ""
var hong_kong_policy: String = ""
var solution_plan: [YHPlanProductModel] = []
func getTitle() -> String {
if name == "work" {
return "工作"
}
if name == "live" {
return "生活"
}
if name == "invest" {
return "投资"
}
if name == "stay" {
return "逗留"
}
return ""
}
required init() {
}
}
//
// YHSurveyContentModel.swift
// galaxy
//
// Created by alexzzw on 2025/3/28.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
import SmartCodable
// MARK: - YHSurveyContainerModel
class YHSurveyContainerModel: SmartCodable {
var surveyContent: YHSurveyContentModel = YHSurveyContentModel()
// 0老用户1新用户
var type: Int = 0
var defaultAnswers: [YHSurveyDefaultAnswers] = []
var isNewCustomer: Bool {
return type == 1
}
enum CodingKeys: String, CodingKey {
case surveyContent = "survey_content"
case type
case defaultAnswers = "default_answers"
}
required init() {
}
}
// MARK: - YHSurveyDefaultAnswers
class YHSurveyDefaultAnswers: SmartCodable {
var questionKey: String = ""
var optionKey: [String] = []
enum CodingKeys: String, CodingKey {
case questionKey = "question_key"
case optionKey = "option_key"
}
required init() {
}
}
// MARK: - YHSurveyContentModel
class YHSurveyContentModel: SmartCodable {
/// 问卷ID
var id: String = ""
/// 问题列表
var questions: [YHSurveyQuestionItem] = []
/// 问卷备注
var remark: String = ""
/// 问卷标题
var title: String = ""
required init() {
}
}
// MARK: - YHSurveyQuestionItem
class YHSurveyQuestionItem: SmartCodable {
/// 业务key,唯一标识一个问券的一个问题
var businessKey: String = ""
/// 问题ID
var id: String = ""
/// 是否必须回答 0:否 1:是
var isRequired: Int = 0
/// 最多允许上传的文件数量 仅对文件上传题有效
var maxFileCount: Int = 0
/// 问题序号
var number: Int = 0
/// repeated article.AnswerItem show_when = 8 [json_name = "show_when"]; //
/// 旧版show_when,即将废弃,请转用show_when_v1 仅当某个或某几个问题答案为XXX时才展示 不同项之间是且关系,选项列表
var options: [YHSurveyQuestionOptionItem] = []
/// 问题备注
var remark: String = ""
var showWhenV1: YHSurveyQuestionItemShowWhenV1 = YHSurveyQuestionItemShowWhenV1()
/// 问题标题
var title: String = ""
/// 问题类型:1:单选 2:多选 3:文本输入 4:文件上传
var type: Int = 0
enum CodingKeys: String, CodingKey {
case id
case number
case options
case remark
case title
case type
case isRequired = "is_required"
case maxFileCount = "max_file_count"
case showWhenV1 = "show_when_v1"
case businessKey = "business_key"
}
required init() {
}
}
// MARK: - YHSurveyQuestionOptionItem
class YHSurveyQuestionOptionItem: SmartCodable {
/// 业务key,唯一标识一个问题的一个选项
var businessKey: String = ""
/// 选项ID
var id: String = ""
/// 跳转的目标问题id,仅当 jump_type=2 时有效
var jumpQuestionId: String = ""
/// 跳转逻辑 0:无需特殊跳转 1:结束问卷 2:跳到某题
var jumpType: Int = 0
/// 选中该选项后是否需要额外填写说明 0:无需 1:选填 2:必填
var needExtra: Int = 0
/// 选项序号
var number: Int = 0
/// 选项备注
var remark: String = ""
/// 该选项对应得分,业务有需要时可用
var score: Int = 0
/// 选项标题
var title: String = ""
enum CodingKeys: String, CodingKey {
case id
case number
case remark
case score
case title
case needExtra = "need_extra"
case jumpType = "jump_type"
case jumpQuestionId = "jump_question_id"
case businessKey = "business_key"
}
required init() {
}
}
// MARK: - YHSurveyQuestionItemShowWhenV1
class YHSurveyQuestionItemShowWhenV1: SmartCodable {
var conditions: [YHSurveyQuestionConditionItem] = []
/// 关系 and/or
var relation: String = ""
var orArray: [YHSurveyQuestionAndOptions] = []
var andArray: [YHSurveyQuestionAndOptions] = []
required init() {
}
func getConitionArray() -> [YHSurveyQuestionAndOptions] {
var questionAndOptions: [YHSurveyQuestionAndOptions] = []
conditions.forEach { conditionItem in
var optionIds: Set<String> = []
let options = conditionItem.options
/// 选项为空,任意选一个即可
if conditionItem.isAnyAnswerAllowed {
let questionAndOption = YHSurveyQuestionAndOptions.init(questionsId: conditionItem.questionId, optionIds: [])
questionAndOptions.append(questionAndOption)
} else {
if options.relation == "and" {
optionIds.formUnion(options.list.compactMap {
$0.optionId
})
let questionAndOption = YHSurveyQuestionAndOptions.init(questionsId: conditionItem.questionId, optionIds: optionIds)
questionAndOptions.append(questionAndOption)
} else if options.relation == "or" {
questionAndOptions.append(contentsOf: options.list.compactMap {
return YHSurveyQuestionAndOptions.init(questionsId: conditionItem.questionId, optionIds: [$0.optionId])
})
}
}
}
return questionAndOptions
}
func didFinishMapping() {
if relation == "or" {
orArray = getConitionArray()
} else if relation == "and" {
andArray = getConitionArray()
}
}
}
// MARK: - YHSurveyQuestionConditionItem
class YHSurveyQuestionConditionItem: SmartCodable {
/// 选中的选项ID与额外说明 仅对单选/多选有效且必需,单选时此项长度为1 兼容旧版 todo 去除
var optionExtra: [YHSurveyConditionOptionExtra] = []
var options: YHSurveyConditionOptions = YHSurveyConditionOptions()
/// 问题ID
var questionId: String = ""
/// 问题类型:1:单选 2:多选 3:文本输入 4:文件上传
var questionType: Int = 0
var isAnyAnswerAllowed: Bool = false
enum CodingKeys: String, CodingKey {
case options
case optionExtra = "option_extra"
case questionId = "question_id"
case questionType = "question_type"
case isAnyAnswerAllowed = "is_any_answer_allowed"
}
required init() {
}
}
// MARK: - YHSurveyConditionOptionExtra
class YHSurveyConditionOptionExtra: SmartCodable {
/// 问题选项额外说明 选中该选项后必需填写额外说明时必需
var extra: String = ""
/// 选项ID 必需
var optionId: String = ""
/// 选项标题 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var title: String = ""
/// 选项key 必需
var optionKey: String = ""
init(extra: String, optionId: String, title: String, optionKey: String) {
self.extra = extra
self.optionId = optionId
self.title = title
self.optionKey = optionKey
}
enum CodingKeys: String, CodingKey {
case extra
case title
case optionId = "option_id"
case optionKey = "option_key"
}
required init() {
}
}
// MARK: - YHSurveyConditionOptions
class YHSurveyConditionOptions: SmartCodable {
/// 选项ID与额外说明的列表 单选时此项长度为1
var list: [YHSurveyConditionOptionsItem] = []
/// 关系 and/or
var relation: String = ""
required init() {
}
}
// MARK: - YHSurveyConditionOptionsItem
class YHSurveyConditionOptionsItem: SmartCodable {
var extra: YHSurveyOptionsItemExtra = YHSurveyOptionsItemExtra()
/// 选项ID
var optionId: String = ""
enum CodingKeys: String, CodingKey {
case extra
case optionId = "option_id"
}
required init() {
}
}
// MARK: - YHSurveyOptionsItemExtra
class YHSurveyOptionsItemExtra: SmartCodable {
/// 选项额外说明的内容 仅当 额外说明的判断方式为2时才有效
var content: String = ""
/// 选项额外说明的判断方式 0:无需判断 1:必须非空,不管具体值 2:必须为特定值
var verifyType: Int = 0
enum CodingKeys: String, CodingKey {
case content
case verifyType = "verify_type"
}
required init() {
}
}
struct YHSurveyQuestionAndOptions: SmartCodable, Equatable {
var questionsId: String = ""
var optionIds: Set<String> = []
static func == (lhs: YHSurveyQuestionAndOptions, rhs: YHSurveyQuestionAndOptions) -> Bool {
return lhs.questionsId == rhs.questionsId && lhs.optionIds == rhs.optionIds
}
}
//
// YHSurveyQuestionType.swift
// galaxy
//
// Created by alexzzw on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
enum YHSurveyQuestionType: String, CaseIterable {
case hasHKId = "是否香港身份"
case hasPR = "是否有永居服务"
case isEmployed = "是否受雇香港"
case hasHKCompany = "是否有香港公司"
case isHKCompanyOpen = "香港公司是否运营"
case isMainlandCompanyToHK = "是否有内地公司业务转到香港"
case isHKOffice = "是否香港办公室"
case hkResidence = "在港居住情况"
case hasChildrenEduPlan = "是否子女在港读书计划"
case hasHKInsurance = "是否香港保险"
case hasPRLicense = "是否香港驾照"
case isHKHolder = "是否香港个户"
case hkStayRate = "在港逗留频率"
func selections() -> [String] {
switch self {
case .hasHKId:
return ["是", "否"]
case .hasPR:
return ["是", "否"]
case .isEmployed:
return ["是", "否"]
case .hasHKCompany:
return ["是", "否"]
case .isHKCompanyOpen:
return ["是", "否"]
case .isMainlandCompanyToHK:
return ["是", "否"]
case .isHKOffice:
return ["是", "否"]
case .hkResidence:
return ["枚举值已购房", "已租房", "考虑购房", "考虑租房", "暂不考虑"]
case .hasChildrenEduPlan:
return ["是", "否"]
case .hasHKInsurance:
return ["是", "否"]
case .hasPRLicense:
return ["是", "否"]
case .isHKHolder:
return ["是", "否"]
case .hkStayRate:
return ["枚举值长期在港", "每周赴港至少一次", "每月去一次", "每季度去一次", "半年去一次", "超过半年去一次"]
}
}
}
//
// YHSurveyRenewalPlanState.swift
// galaxy
//
// Created by alexzzw on 2025/3/31.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
import SmartCodable
// MARK: - YHSurveyRenewalPlanState
class YHSurveyRenewalPlanState: SmartCodable {
var isGeneratePlan: Bool = false
enum CodingKeys: String, CodingKey {
case isGeneratePlan = "is_generate_plan"
}
required init() {
}
}
//
// YHSurveyResponseModel.swift
// galaxy
//
// Created by alexzzw on 2025/3/31.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
import SmartCodable
// MARK: - YHSurveyResponseModel
class YHSurveyResponseModel: SmartCodable {
var hasHkIdentity: Bool = false
enum CodingKeys: String, CodingKey {
case hasHkIdentity = "has_hk_identity"
}
required init() {
}
}
//
// YHSurveySubmitRequestModel.swift
// galaxy
//
// Created by alexzzw on 2025/3/31.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
// MARK: - YHSurveySubmitRequestModel
class YHSurveySubmitRequestModel {
/// 答案详情
var answerDetails: [YHSurveyArticleAnswerItem] = []
/// 问卷id
var surveyId: String = ""
init(answerDetails: [YHSurveyArticleAnswerItem], surveyId: String) {
self.answerDetails = answerDetails
self.surveyId = surveyId
}
}
// MARK: - YHSurveyArticleAnswerItem
class YHSurveyArticleAnswerItem {
/// 文件列表 仅对文件上传题有效且必需
var fileList: [YHSurveyAnswerItemFileItem] = []
/// 选中的选项ID与额外说明 仅对单选/多选有效且必需,单选时此项长度为1
var optionExtra: [YHSurveyAnswerItemOptionExtra] = []
/// 问题ID 必需
var questionId: String = ""
/// 问题key 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var questionKey: String = ""
/// 问题类型:1:单选 2:多选 3:文本输入 4:文件上传 必需
var questionType: Int = 0
/// 文本输入内容 仅对文本输入题有效且必需
var text: String = ""
/// 问题标题 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var title: String = ""
init(fileList: [YHSurveyAnswerItemFileItem], optionExtra: [YHSurveyAnswerItemOptionExtra], questionId: String, questionKey: String, questionType: Int, text: String, title: String) {
self.fileList = fileList
self.optionExtra = optionExtra
self.questionId = questionId
self.questionKey = questionKey
self.questionType = questionType
self.text = text
self.title = title
}
}
// MARK: - YHSurveyAnswerItemFileItem
class YHSurveyAnswerItemFileItem {
/// 文件名称 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var name: String = ""
/// 文件大小 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var size: Int = 0
/// 文件类型 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var type: String = ""
/// 上传时间(格式:YYYY-MM-DD HH:mm:ss) 可选 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var uploadAt: String = ""
/// 文件url 必需
var url: String = ""
init(name: String, size: Int, type: String, uploadAt: String, url: String) {
self.name = name
self.size = size
self.type = type
self.uploadAt = uploadAt
self.url = url
}
}
// MARK: - YHSurveyAnswerItemOptionExtra
class YHSurveyAnswerItemOptionExtra {
/// 问题选项额外说明 选中该选项后必需填写额外说明时必需
var extra: String = ""
/// 选项ID 必需
var optionId: String = ""
/// 选项key 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var optionKey: String = ""
/// 选项标题 可选 提交答案时,建议设置该字段,会作为提交记录留底;show_when场景下,忽略该字段
var title: String = ""
init(extra: String, optionId: String, optionKey: String, title: String) {
self.extra = extra
self.optionId = optionId
self.optionKey = optionKey
self.title = title
}
}
//
// YHMakePlanViewController.swift
// galaxy
//
// Created by EDY on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanViewController: YHBaseViewController {
var items: [[Int]] = []
let viewModel = YHMakePlanViewModel()
lazy var headView: YHMakePlanHeadView = {
let view = YHMakePlanHeadView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 333.fix + 44))
view.block = { tag in
self.topView.custtomView.updataData(tag)
let indexPath = IndexPath(row: tag, section: 0)
let cellRect: CGRect = self.tableView.rectForRow(at: indexPath)
let targetY = cellRect.origin.y - 104 - k_Height_NavigationtBarAndStatuBar
self.tableView.setContentOffset(CGPoint(x: 0, y: targetY), animated: true)
}
return view
}()
lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .grouped)
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
tableView.showsVerticalScrollIndicator = false
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.register(cellWithClass: YHMakePlanCell.self)
tableView.tableHeaderView = headView
return tableView
}()
lazy var priceView: YHMakePlanBottomView = {
let view = YHMakePlanBottomView()
return view
}()
lazy var topView: YHMakePlanTopView = {
let view = YHMakePlanTopView()
view.isHidden = true
view.block = { tag in
self.headView.custtomView.updataData(tag)
let indexPath = IndexPath(row: tag, section: 0)
let cellRect: CGRect = self.tableView.rectForRow(at: indexPath)
let targetY = cellRect.origin.y - 104 - k_Height_NavigationtBarAndStatuBar
self.tableView.setContentOffset(CGPoint(x: 0, y: targetY), animated: true)
}
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
// gk_navTitle = "续签至永居方案私人订制"
gk_navTitleColor = .white
gk_navBarAlpha = 1
// gk_navBackgroundImage = UIImage(named: "my_scheme_nav")
gk_backImage = UIImage(named: "back_icon_white")
addRightItems()
// Create and add to your view
view.addSubview(priceView)
priceView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(98)
}
self.view.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.top.left.right.equalToSuperview()
make.bottom.equalTo(-98)
}
view.addSubview(topView)
topView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.height.equalTo(104)
}
requestData()
}
func updataPrice() {
let totalPrice = viewModel.makePlanModel.calculateTotalPrice()
priceView.configure(price: totalPrice, actionText: "去办理") {
if totalPrice.double() ?? 0 > 0 {
YHMakePlanPriceAlertView.show(dataSource: self.viewModel.makePlanModel) { _ in
self.addShopCard()
}
}
} nextHandler: {
self.addShopCard()
}
}
func addShopCard() {
self.viewModel.addShopCard(model: self.viewModel.makePlanModel) { success, _ in
if success {
// 跳转购物车
if let token = YHLoginManager.shared.userModel?.token, token.count > 5 {
var url = YHBaseUrlManager.shared.curH5URL() + "superAppBridge.html#/goods/cart"
url = url + "?param=" + YHLoginManager.shared.h5Token
printLog("URL: \(url)")
var tUrl = url
if !url.contains("navigationH=") {
tUrl = url + "?navigationH=\(k_Height_NavigationtBarAndStatuBar)"
if url.contains("?") {
tUrl = url + "&navigationH=\(k_Height_NavigationtBarAndStatuBar)"
}
}
let vc = YHH5WebViewVC()
vc.url = tUrl
vc.isFullScreenFlag = false
vc.navTitle = "购物车"
vc.isSupportWebviewInterBackFlag = true
UIViewController.current?.navigationController?.pushViewController(vc)
}
}
}
}
func addRightItems() {
let rightButtonItem = UIBarButtonItem(image: UIImage(named: "share_item_white")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(share))
gk_navRightBarButtonItem = rightButtonItem
gk_navItemRightSpace = 16
}
func addRightWhiteItems() {
let rightButtonItem = UIBarButtonItem(image: UIImage(named: "share_item")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(share))
gk_navRightBarButtonItem = rightButtonItem
gk_navItemRightSpace = 16
}
@objc func share() {
YHMakePlanShareAlertView.show(url: viewModel.score.share_url) { _ in
}
}
func requestData() {
viewModel.getProductList {[weak self] _, _ in
guard let self = self else { return }
tableView.reloadData()
updataPrice()
getScore()
}
}
func getScore() {
viewModel.getRate(model: viewModel.makePlanModel) {[weak self] _, _ in
guard let self = self else { return }
self.headView.dataSource = viewModel.score
self.topView.dataSource = viewModel.score
}
}
func submitTargets() {
}
}
extension YHMakePlanViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// return items.count
return 4
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withClass: YHMakePlanCell.self) as? YHMakePlanCell else {
return UITableViewCell()
}
var dataSource: [YHMakePlanMainModel] = []
if indexPath.row == 0 {
dataSource = viewModel.makePlanModel.basic
cell.titleLabel.text = "基础身份续签"
} else if indexPath.row == 1 {
dataSource = viewModel.makePlanModel.work
cell.titleLabel.text = "工作联系提升"
} else if indexPath.row == 2 {
dataSource = viewModel.makePlanModel.live
cell.titleLabel.text = "生活联系提升"
} else if indexPath.row == 3 {
dataSource = viewModel.makePlanModel.invest
cell.titleLabel.text = "投资联系提升"
}
cell.dataSource = dataSource
cell.index = indexPath.row
cell.actionHandler = { product in
self.viewModel.makePlanModel.toggleAddCartStatus(for: product)
self.updataPrice()
self.getScore()
self.tableView.reloadData()
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var count = 0
if indexPath.row == 0 {
count = viewModel.makePlanModel.basic.count
} else if indexPath.row == 1 {
count = viewModel.makePlanModel.work.count
} else if indexPath.row == 2 {
count = viewModel.makePlanModel.live.count
} else if indexPath.row == 3 {
count = viewModel.makePlanModel.invest.count
}
if count == 0 {
if indexPath.row == 0 {
return 168 + 32
} else {
return 188 + 32
}
}
return CGFloat(36 + 16 + 118 * count)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.01
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0.01
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y + scrollView.contentInset.top
if offsetY > 0 {
var alpha = offsetY / k_Height_NavigationtBarAndStatuBar
if alpha > 1.0 {
alpha = 1.0
}
gk_navBarAlpha = alpha
gk_navBackgroundColor = .white
gk_navTitle = "续签至永居方案私人订制"
gk_navTitleColor = .black
gk_backImage = UIImage(named: "nav_black_24")
// gk_navRightBarButtonItem?.image = UIImage(named: "share_item")
addRightWhiteItems()
} else {
gk_navBarAlpha = 0.0
gk_navBackgroundColor = .clear
gk_navTitle = nil
gk_backImage = UIImage(named: "back_icon_white")
addRightItems()
}
if offsetY > 333.fix - k_Height_NavigationtBarAndStatuBar - 44 - scrollView.contentInset.top {
topView.isHidden = false
} else {
topView.isHidden = true
}
if let topRow = tableView.topVisibleRowIndex() {
self.topView.custtomView.updataData(topRow)
self.headView.custtomView.updataData(topRow)
}
}
}
extension UITableView {
/// 获取当前显示在最顶部的行索引
func topVisibleRowIndex() -> Int? {
// 获取所有可见行的indexPath(按从上到下的顺序排列)
let visibleRect = CGRect(
x: self.contentOffset.x,
y: self.contentOffset.y + 104 + k_Height_NavigationtBarAndStatuBar, // 向下偏移 187px
width: self.bounds.width,
height: self.bounds.height
)
// 获取该区域内的所有行
guard let indexPaths = self.indexPathsForRows(in: visibleRect) else {
return 0
}
return indexPaths.first?.row
}
/// 获取当前显示在最顶部的单元格
func topVisibleCell() -> UITableViewCell? {
guard let topRow = topVisibleRowIndex() else {
return nil
}
return self.cellForRow(at: IndexPath(row: topRow, section: 0))
}
}
//
// YHMakePlanModel.swift
// galaxy
//
// Created by EDY on 2025/4/1.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import SmartCodable
struct YHMakePlanModel: SmartCodable {
var basic: [YHMakePlanMainModel] = []
var work: [YHMakePlanMainModel] = []
var live: [YHMakePlanMainModel] = []
var invest: [YHMakePlanMainModel] = []
// 修改所有子元素的 is_add_cart 值
mutating func updateAddCartStatus() {
basic = basic.map { $0.updatedModel() }
work = work.map { $0.updatedModel() }
live = live.map { $0.updatedModel() }
invest = invest.map { $0.updatedModel() }
}
}
struct YHMakePlanMainModel: SmartCodable {
var product_id: Int = -1
var cover_img: String = ""
var product_name: String = ""
var product_desc: String = ""
var price: String = ""
var is_add_cart: Bool = true
var sub_product: [YHMakePlanSubModel] = []
// 更新当前模型及其子模型的 is_add_cart 状态
func updatedModel() -> YHMakePlanMainModel {
var updatedModel = self
updatedModel.is_add_cart = true
// 处理子产品,找到最便宜的一个
if !sub_product.isEmpty {
// 找到最便宜的子产品
let cheapestSubProduct = sub_product
.sorted { ($0.price.toDouble() ?? 0) < ($1.price.toDouble() ?? 0) }
.first
// 更新所有子产品的 is_add_cart 状态
updatedModel.sub_product = sub_product.map {
var sub = $0
sub.is_add_cart = ($0.product_id == cheapestSubProduct?.product_id)
return sub
}
}
return updatedModel
}
}
struct YHMakePlanSubModel: SmartCodable {
var product_id: Int = -1
var cover_img: String = ""
var product_name: String = ""
var product_desc: String = ""
var price: String = ""
var is_add_cart: Bool = true
}
// 扩展 String 用于价格转换
extension String {
func toDouble() -> Double? {
// 移除可能存在的货币符号、千位分隔符等
let numericString = self
.replacingOccurrences(of: "$", with: "")
.replacingOccurrences(of: ",", with: "")
.trimmingCharacters(in: .whitespacesAndNewlines)
return Double(numericString)
}
}
extension YHMakePlanModel {
mutating func toggleAddCartStatus(for productId: Int) {
var localBasic = basic
var localWork = work
var localLive = live
var localInvest = invest
for i in 0..<localBasic.count {
if localBasic[i].product_id != 0 && localBasic[i].product_id == productId {
localBasic[i].is_add_cart = !localBasic[i].is_add_cart
updateSubProducts(for: &localBasic[i])
// Update the original arrays and return
basic = localBasic
work = localWork
live = localLive
invest = localInvest
return
}
}
for i in 0..<localWork.count {
if localWork[i].product_id != 0 && localWork[i].product_id == productId {
localWork[i].is_add_cart = !localWork[i].is_add_cart
updateSubProducts(for: &localWork[i])
// Update the original arrays and return
basic = localBasic
work = localWork
live = localLive
invest = localInvest
return
}
}
for i in 0..<localLive.count {
if localLive[i].product_id != 0 && localLive[i].product_id == productId {
localLive[i].is_add_cart = !localLive[i].is_add_cart
updateSubProducts(for: &localLive[i])
// Update the original arrays and return
basic = localBasic
work = localWork
live = localLive
invest = localInvest
return
}
}
for i in 0..<localInvest.count {
if localInvest[i].product_id != 0 && localInvest[i].product_id == productId {
localInvest[i].is_add_cart = !localInvest[i].is_add_cart
updateSubProducts(for: &localInvest[i])
// Update the original arrays and return
basic = localBasic
work = localWork
live = localLive
invest = localInvest
return
}
}
// If we get here, we need to check sub_products (product_id == 0 cases)
checkSubProducts(in: &localBasic, for: productId)
checkSubProducts(in: &localWork, for: productId)
checkSubProducts(in: &localLive, for: productId)
checkSubProducts(in: &localInvest, for: productId)
basic = localBasic
work = localWork
live = localLive
invest = localInvest
}
private mutating func updateSubProducts(for mainModel: inout YHMakePlanMainModel) {
if mainModel.is_add_cart {
// Find the subproduct with the lowest price
if let cheapestIndex = mainModel.sub_product.enumerated().min(by: {
let price1 = Double($0.element.price) ?? 0
let price2 = Double($1.element.price) ?? 0
return price1 < price2
})?.offset {
// Set only the cheapest to true, others to false
for i in 0..<mainModel.sub_product.count {
mainModel.sub_product[i].is_add_cart = (i == cheapestIndex)
}
}
} else {
// If main model is not in cart, set all subproducts to false
for i in 0..<mainModel.sub_product.count {
mainModel.sub_product[i].is_add_cart = false
}
}
}
private mutating func checkSubProducts(in models: inout [YHMakePlanMainModel], for productId: Int) {
for i in 0..<models.count {
var hasFind = false
for j in 0..<models[i].sub_product.count {
if models[i].sub_product[j].product_id == productId {
if models[i].sub_product[j].is_add_cart {
models[i].sub_product[j].is_add_cart = false
models[i].is_add_cart = false
} else {
models[i].sub_product[j].is_add_cart = true
models[i].is_add_cart = true
}
hasFind = true
}
}
if hasFind {
for j in 0..<models[i].sub_product.count {
if models[i].sub_product[j].product_id == productId {
} else {
models[i].sub_product[j].is_add_cart = false
}
}
}
}
}
func calculateTotalPrice() -> String {
let allCategories = [basic, work, live, invest]
var total: Double = 0
for category in allCategories {
for mainModel in category {
// Check main product
if mainModel.is_add_cart, let price = Double(mainModel.price), mainModel.sub_product.count == 0 {
total += price
}
// Check sub products
for subModel in mainModel.sub_product {
if subModel.is_add_cart, let price = Double(subModel.price) {
total += price
}
}
}
}
return "\(total)"
}
}
extension YHMakePlanMainModel {
/// Returns a filtered version of the model, keeping only `is_add_cart == true` for itself and its sub-products.
func filteredByCartStatus() -> YHMakePlanMainModel? {
guard is_add_cart else { return nil }
var filteredModel = self
filteredModel.sub_product = sub_product.filter { $0.is_add_cart }
return filteredModel
}
}
extension Array where Element == YHMakePlanMainModel {
/// Filters out models where `is_add_cart == false` and also filters their sub-products.
func filteredByCartStatus() -> [YHMakePlanMainModel] {
self.compactMap { $0.filteredByCartStatus() }
}
}
extension Array where Element == YHMakePlanSubModel {
/// Filters out sub-models where `is_add_cart == false`.
func filteredByCartStatus() -> [YHMakePlanSubModel] {
self.filter { $0.is_add_cart }
}
}
extension Array where Element == YHMakePlanSubModel {
func indexOfLowestPrice() -> Int? {
return self.enumerated().reduce(into: (index: 0, price: Double.infinity)) { result, current in
let (currentIndex, model) = current
if let currentPrice = Double(model.price), currentPrice < result.price {
result = (currentIndex, currentPrice)
}
}.index
}
}
//
// YHMakePlanScoreModel.swift
// galaxy
//
// Created by EDY on 2025/4/2.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import SmartCodable
struct YHMakePlanScoreModel: SmartCodable {
var year: Int = -1
var pass_rate: String = ""
var share_url: String = ""
}
//
// YHMakePlanBottomView.swift
// galaxy
//
// Created by EDY on 2025/3/28.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHMakePlanBottomView: UIView {
// MARK: - UI Elements
private lazy var priceLabel: UILabel = {
let label = UILabel()
let a: ASAttributedString = .init("¥", .font(UIFont.PFSC_M(ofSize: 20)), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("58999.00", .font(UIFont.PFSC_M(ofSize: 28)), .foreground(UIColor.mainTextColor))
label.attributed.text = a + b
return label
}()
lazy var priceButton: UIButton = {
let label = UIButton()
label.setImage(UIImage(named: "make_plan_up"), for: .normal)
label.addTarget(self, action: #selector(handleAction), for: .touchUpInside)
return label
}()
private lazy var actionButton: YHImageTextButton = {
let button = YHImageTextButton(title: "去办理", image: UIImage(named: "make_plan_next"))
button.setTitleColor(UIColor(hex: 0xffffff), for: .normal)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
button.layer.cornerRadius = 2
button.backgroundColor = UIColor.mainTextColor
button.addTarget(self, action: #selector(nextAction), for: .touchUpInside)
return button
}()
// MARK: - Properties
var price: String = "" {
didSet {
let a: ASAttributedString = .init("¥", .font(UIFont(name: "D-DIN-PRO-Bold", size: 20) ?? UIFont()), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("\(price.formattedPrice())", .font(UIFont(name: "D-DIN-PRO-Bold", size: 28) ?? UIFont()), .foreground(UIColor.mainTextColor))
priceLabel.attributed.text = a + b
}
}
var actionHandler: (() -> Void)?
var nextHandler: (() -> Void)?
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
setupConstraints()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Setup
private func setupUI() {
backgroundColor = .white
addSubview(priceLabel)
addSubview(priceButton)
addSubview(actionButton)
}
private func setupConstraints() {
priceLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(16)
make.height.equalTo(28)
}
priceButton.snp.makeConstraints { make in
make.left.equalTo(priceLabel.snp.right)
make.width.height.equalTo(16)
make.centerY.equalTo(priceLabel.snp.centerY)
}
actionButton.snp.makeConstraints { make in
make.top.equalToSuperview().offset(9)
make.right.equalToSuperview().offset(-16)
make.width.equalTo(120)
make.height.equalTo(46)
}
priceButton.YH_clickEdgeInsets = UIEdgeInsets(top: 10, left: 100, bottom: 10, right: 10)
}
// MARK: - Action
@objc private func handleAction() {
actionHandler?()
}
@objc private func nextAction() {
nextHandler?()
}
// MARK: - Configuration
func configure(price: String, actionText: String? = nil, actionHandler: (() -> Void)? = nil, nextHandler: (() -> Void)? = nil) {
self.price = price
if let actionText = actionText {
actionButton.setTitle(actionText, for: .normal)
}
self.actionHandler = actionHandler
self.nextHandler = nextHandler
}
}
//
// YHMakePlanCardView.swift
// galaxy
//
// Created by EDY on 2025/3/28.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHMakePlanCardView: UIView {
var actionHandler: ((Int) -> Void)?
// MARK: - UI Elements
var data: YHMakePlanMainModel?
lazy var containerView: UIButton = {
let view = UIButton()
view.backgroundColor = .white
view.addTarget(self, action: #selector(gotoDetail), for: .touchUpInside)
return view
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 16)
label.textColor = .mainTextColor
label.numberOfLines = 1
return label
}()
private lazy var subtitleLabel: UILabel = {
let label = UILabel()
label.font = UIFont.PFSC_R(ofSize: 12)
label.textColor = UIColor(hex: 0x8993a2)
label.numberOfLines = 1
return label
}()
private lazy var companyImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "global_default_image")
return view
}()
private lazy var storeButton: YHImageTextButton = {
let button = YHImageTextButton(title: "星企航(7年)", image: UIImage(named: "make_plan_left"))
button.layer.cornerRadius = 2
button.backgroundColor = UIColor(hex: 0xf5f6f8)
button.addTarget(self, action: #selector(selectAction), for: .touchUpInside)
return button
}()
private lazy var priceTagView: UILabel = {
let label = UILabel()
let a: ASAttributedString = .init("¥", .font(UIFont(name: "D-DIN-PRO-Bold", size: 14) ?? UIFont()), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("58999.00", .font(UIFont(name: "D-DIN-PRO-Bold", size: 20) ?? UIFont()), .foreground(UIColor.mainTextColor))
label.attributed.text = a + b
return label
}()
private lazy var selectButton: UIButton = {
let button = UIButton()
button.setImage(UIImage(named: "make_plan_select"), for: .selected)
button.setImage(UIImage(named: "make_plan_normal"), for: .normal)
button.addTarget(self, action: #selector(handleAction), for: .touchUpInside)
return button
}()
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
setupConstraints()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Setup
private func setupUI() {
addSubview(containerView)
containerView.addSubview(titleLabel)
containerView.addSubview(subtitleLabel)
containerView.addSubview(companyImageView)
containerView.addSubview(priceTagView)
containerView.addSubview(storeButton)
containerView.addSubview(selectButton)
}
private func setupConstraints() {
containerView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(16)
make.left.equalToSuperview().offset(110)
make.right.equalToSuperview().offset(-16)
}
subtitleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(40)
make.left.equalToSuperview().offset(110)
make.right.equalToSuperview().offset(-16)
}
companyImageView.snp.makeConstraints { make in
make.top.equalTo(18)
make.left.equalTo(16)
make.height.width.equalTo(86)
}
storeButton.translatesAutoresizingMaskIntoConstraints = false
storeButton.snp.makeConstraints { make in
make.top.equalToSuperview().offset(60)
make.left.equalToSuperview().offset(110)
// make.width.equalTo(97)
make.height.equalTo(22)
}
priceTagView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(86)
make.left.equalToSuperview().offset(110)
make.right.equalToSuperview().offset(-16)
}
selectButton.snp.makeConstraints { make in
make.right.bottom.equalTo(-18)
make.height.width.equalTo(16)
}
}
@objc func gotoDetail() {
if selectButton.isHidden {
return
}
var id = self.data?.product_id ?? 0
if self.data?.price == "" {
let count = self.data?.sub_product.count ?? 0
var index = 0
for i in 0 ..< count {
let flag = self.data?.sub_product[i].is_add_cart ?? false
if flag {
index = i
}
}
if count > 0 {
let subModel = data?.sub_product[index]
id = subModel?.product_id ?? 0
}
}
var url = YHBaseUrlManager.shared.curH5URL() + "superAppBridge.html#/goods/sales-detail" + "?id=\(id)" + "&source=renewal_customize&hidelive=1"
if YHLoginManager.shared.isLogin() {
let token = YHLoginManager.shared.h5Token
let urlHasParam = String.hasQueryParameters(urlString: url)
if urlHasParam {
url = url + "&param=" + token
} else {
url = url + "?param=" + token
}
}
// 2.增加导航栏高度 https://test-hklife.galaxy-immi.com/superAppBridge.html#/goods/sales-detail?id=
var tUrl = url
if !url.contains("navigationH=") {
tUrl = url + "?navigationH=\(k_Height_NavigationtBarAndStatuBar)"
if url.contains("?") {
tUrl = url + "&navigationH=\(k_Height_NavigationtBarAndStatuBar)"
}
}
let vc = YHH5WebViewVC()
vc.url = tUrl
vc.isHideNavigationBar = false
UIViewController.current?.navigationController?.pushViewController(vc)
}
@objc func selectAction() {
YHMakePlanSelectAlertView.show(dataSource: data ?? YHMakePlanMainModel()) { tag in
self.actionHandler?(tag)
self.selectButton.isSelected = true
let count = self.data?.sub_product.count ?? 0
for i in 0 ..< count {
if tag == self.data?.sub_product[i].product_id {
self.data?.sub_product[i].is_add_cart = true
} else {
self.data?.sub_product[i].is_add_cart = false
}
}
self.configure(with: self.data ?? YHMakePlanMainModel())
}
}
@objc func handleAction() {
selectButton.isSelected = !selectButton.isSelected
var product = self.data?.product_id ?? 0
let count = self.data?.sub_product.count ?? 0
if count != 0 {
var index = self.data?.sub_product.indexOfLowestPrice() ?? 0
for i in 0 ..< count {
let flag = self.data?.sub_product[i].is_add_cart ?? false
if flag {
index = i
}
}
if count > 0 {
let subModel = data?.sub_product[index]
product = subModel?.product_id ?? 0
}
}
self.actionHandler?(product)
}
// MARK: - Configuration
func configure(with data: YHMakePlanMainModel) {
self.data = data
titleLabel.text = data.product_name
subtitleLabel.text = data.product_desc
var price = data.price
if data.price == "" {
storeButton.isHidden = false
let count = self.data?.sub_product.count ?? 0
var index = self.data?.sub_product.indexOfLowestPrice() ?? 0
for i in 0 ..< count {
let flag = self.data?.sub_product[i].is_add_cart ?? false
if flag {
index = i
}
}
if count > 0 {
let subModel = data.sub_product[index]
price = subModel.price
storeButton.setTitle(subModel.product_name, for: .normal)
}
} else {
storeButton.isHidden = true
}
let a: ASAttributedString = .init("¥", .font(UIFont(name: "D-DIN-PRO-Bold", size: 14) ?? UIFont()), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("\(price.formattedPrice())", .font(UIFont(name: "D-DIN-PRO-Bold", size: 20) ?? UIFont()), .foreground(UIColor.mainTextColor))
priceTagView.attributed.text = a + b
if let url = URL(string: data.cover_img) {
companyImageView.kf.setImage(with: url, placeholder: UIImage(named: "global_default_image"))
}
if data.is_add_cart {
selectButton.isSelected = true
} else {
selectButton.isSelected = false
}
storeButton.updateContent()
}
func configureSub(with data: YHMakePlanSubModel) {
titleLabel.text = data.product_name
subtitleLabel.text = data.product_desc
let a: ASAttributedString = .init("¥", .font(UIFont(name: "D-DIN-PRO-Bold", size: 14) ?? UIFont()), .foreground(UIColor.mainTextColor))
let b: ASAttributedString = .init("\(data.price.formattedPrice())", .font(UIFont(name: "D-DIN-PRO-Bold", size: 20) ?? UIFont()), .foreground(UIColor.mainTextColor))
priceTagView.attributed.text = a + b
selectButton.isHidden = true
storeButton.isHidden = true
if let url = URL(string: data.cover_img) {
companyImageView.kf.setImage(with: url, placeholder: UIImage(named: "global_default_image"))
}
storeButton.updateContent()
}
}
class YHImageTextButton: UIButton {
var spacing: CGFloat = 4 // 文字和图片之间的间距
var horizontalPadding: CGFloat = 8 // 左右边距
init(title: String, image: UIImage?) {
super.init(frame: .zero)
// 基础配置
setTitle(title, for: .normal)
setImage(image, for: .normal)
setTitleColor(UIColor(hex: 0x6a7586), for: .normal)
titleLabel?.font = UIFont.PFSC_R(ofSize: 12)
// 关键配置:图片在右侧
semanticContentAttribute = .forceRightToLeft
contentHorizontalAlignment = .center
// 禁用系统默认的inset调整
adjustsImageWhenHighlighted = false
imageView?.translatesAutoresizingMaskIntoConstraints = false
titleLabel?.translatesAutoresizingMaskIntoConstraints = false
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 关键:正确计算固有内容大小
override var intrinsicContentSize: CGSize {
let titleSize = titleLabel?.intrinsicContentSize ?? .zero
let imageSize = imageView?.intrinsicContentSize ?? .zero
// 总宽度 = 文字宽度 + 图片宽度 + 间距 + 左右边距×2
let totalWidth = titleSize.width + imageSize.width + spacing + 2 * horizontalPadding
let maxHeight = max(titleSize.height, imageSize.height)
return CGSize(width: totalWidth, height: maxHeight)
}
// 关键:手动布局子视图
override func layoutSubviews() {
super.layoutSubviews()
guard let titleLabel = titleLabel, let imageView = imageView else { return }
// 手动计算布局
let totalContentWidth = titleLabel.intrinsicContentSize.width + spacing + imageView.intrinsicContentSize.width
let startX = (bounds.width - totalContentWidth) / 2
// 定位文字和图片
titleLabel.frame = CGRect(
x: startX,
y: (bounds.height - titleLabel.intrinsicContentSize.height) / 2,
width: titleLabel.intrinsicContentSize.width,
height: titleLabel.intrinsicContentSize.height
)
imageView.frame = CGRect(
x: titleLabel.frame.maxX + spacing,
y: (bounds.height - imageView.intrinsicContentSize.height) / 2,
width: imageView.intrinsicContentSize.width,
height: imageView.intrinsicContentSize.height
)
}
// 在文本或图片变化时调用
func updateContent() {
invalidateIntrinsicContentSize()
setNeedsLayout()
}
}
extension String {
func formattedPrice() -> String {
// 检查是否包含小数点
guard let number = Double(self) else { return self }
// 2. 检查小数点后两位是否为 0
let isInteger = (number * 100).truncatingRemainder(dividingBy: 100) == 0
// 3. 使用 NumberFormatter 控制显示格式
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = isInteger ? 0 : 2 // 整数部分不显示小数,否则保留 2 位
formatter.maximumFractionDigits = 2
return formatter.string(from: NSNumber(value: number)) ?? self
}
}
//
// YHMakePlanCell.swift
// galaxy
//
// Created by EDY on 2025/3/28.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanCell: UITableViewCell {
var actionHandler: ((Int) -> Void)?
var centerView: UIView!
var titleLabel: UILabel!
var mainItemView: UIView!
var country: String = ""
var index: Int = 0 {
didSet {
if index == 0 {
noDataView.tipsLabel.text = "您已满足续签至永居服务~"
} else if index == 1 {
noDataView.tipsLabel.text = "暂未推荐香港工作相关产品,详情请咨询您的专属顾问"
} else if index == 2 {
noDataView.tipsLabel.text = "暂未推荐香港工作相关产品,详情请咨询您的专属顾问"
} else if index == 3 {
noDataView.tipsLabel.text = "暂未推荐投资相关产品,详情请咨询您的专属顾问"
}
}
}
lazy var noDataView: YHEmptyDataView = {
let view = YHEmptyDataView.createView("您已满足续签至永居服务~", kNoPlanBgName)
view.frame = CGRect(x: 0, y: 36, width: KScreenWidth - 32, height: 116)
view.backgroundColor = .clear
view.isHidden = true
view.emptyBgImgV.snp.remakeConstraints { make in
make.top.equalToSuperview().offset(0)
make.width.height.equalTo(96)
make.centerX.equalTo(view)
}
view.tipsLabel.snp.remakeConstraints { make in
make.top.equalTo(view.emptyBgImgV.snp.bottom)
make.left.equalTo(20)
make.right.equalTo(-20)
}
view.tipsLabel.numberOfLines = 2
return view
}()
var dataSource: [YHMakePlanMainModel]? {
didSet {
updateAllViews()
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = .none
setupUI()
}
func setupUI() {
contentView.backgroundColor = .clear
backgroundColor = .clear
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
view.layer.masksToBounds = true
return view
}()
contentView.addSubview(centerView)
centerView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(7)
make.bottom.equalTo(-7)
}
centerView.addSubview(noDataView)
titleLabel = {
let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 15)
label.textColor = UIColor.mainTextColor
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(16)
make.height.equalTo(20)
make.right.equalTo(-18)
}
mainItemView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
centerView.addSubview(mainItemView)
mainItemView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalTo(36)
}
}
func updateAllViews() {
mainItemView.removeSubviews()
if dataSource?.count == 0 {
noDataView.isHidden = false
mainItemView.isHidden = true
} else {
noDataView.isHidden = true
mainItemView.isHidden = false
}
var y = 0
for i in 0 ..< (dataSource?.count ?? 0) {
if i != 0 || i != (dataSource?.count ?? 0) - 1 {
let line = UIView()
line.backgroundColor = UIColor.separatorColor
mainItemView.addSubview(line)
line.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(y)
make.height.equalTo(1)
make.right.equalTo(-18)
}
y += 1
}
var h = 121
let itemView = YHMakePlanCardView()
itemView.actionHandler = { product in
self.actionHandler?(product)
}
itemView.configure(with: dataSource?[i] ?? YHMakePlanMainModel())
mainItemView.addSubview(itemView)
itemView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(y)
make.height.equalTo(h)
}
y += h
}
}
}
//
// YHMakePlanCusttomHeadView.swift
// galaxy
//
// Created by EDY on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanCusttomHeadView: UIView {
typealias Block = (Int) -> Void
var block: Block?
private let tabs = ["基础身份", "工作联系", "生活联系", "投资联系"]
private var buttons: [UIButton] = []
private var selectedIndex: Int = 0
// UI Components
private lazy var stackView: UIStackView = {
let stack = UIStackView()
stack.axis = .horizontal
stack.distribution = .fillEqually
return stack
}()
private let underlineView: UIView = {
let view = UIView()
view.backgroundColor = UIColor.mainTextColor
return view
}()
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
setupConstraints()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupUI()
setupConstraints()
}
// MARK: - Setup
private func setupUI() {
backgroundColor = .systemBackground
// Create buttons
tabs.enumerated().forEach { index, title in
let button = UIButton(type: .system)
button.setTitle(title, for: .normal)
if index == 0 {
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
} else {
button.titleLabel?.font = UIFont.PFSC_R(ofSize: 16)
}
button.setTitleColor(index == 0 ? UIColor.mainTextColor: UIColor(hex: 0x6a7586), for: .normal)
button.tag = index
button.addTarget(self, action: #selector(tabTapped(_:)), for: .touchUpInside)
buttons.append(button)
stackView.addArrangedSubview(button)
}
addSubview(stackView)
addSubview(underlineView)
}
private func setupConstraints() {
stackView.snp.makeConstraints { make in
make.top.equalToSuperview()
make.leading.trailing.equalToSuperview()
make.height.equalTo(40)
}
underlineView.snp.makeConstraints { make in
make.top.equalTo(stackView.snp.bottom)
make.height.equalTo(2)
make.width.equalTo(16)
make.centerX.equalTo(buttons[0].snp.centerX)
}
}
// MARK: - Actions
@objc private func tabTapped(_ sender: UIButton) {
let newIndex = sender.tag
guard newIndex != selectedIndex else { return }
// Update colors
buttons[selectedIndex].setTitleColor(UIColor(hex: 0x6a7586), for: .normal)
buttons[selectedIndex].titleLabel?.font = UIFont.PFSC_R(ofSize: 16)
buttons[newIndex].titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
buttons[newIndex].setTitleColor(UIColor.mainTextColor, for: .normal)
// Animate underline
UIView.animate(withDuration: 0.3) {
self.underlineView.snp.remakeConstraints { make in
make.top.equalTo(self.stackView.snp.bottom)
make.height.equalTo(2)
make.width.equalTo(16)
make.centerX.equalTo(self.buttons[newIndex].snp.centerX)
}
self.layoutIfNeeded()
}
selectedIndex = newIndex
self.block?(selectedIndex)
}
func updataData(_ tag: Int) {
let newIndex = tag
guard newIndex != selectedIndex else { return }
// Update colors
buttons[selectedIndex].setTitleColor(UIColor(hex: 0x6a7586), for: .normal)
buttons[selectedIndex].titleLabel?.font = UIFont.PFSC_R(ofSize: 16)
buttons[newIndex].titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
buttons[newIndex].setTitleColor(UIColor.mainTextColor, for: .normal)
// Animate underline
UIView.animate(withDuration: 0.3) {
self.underlineView.snp.remakeConstraints { make in
make.top.equalTo(self.stackView.snp.bottom)
make.height.equalTo(2)
make.width.equalTo(16)
make.centerX.equalTo(self.buttons[newIndex].snp.centerX)
}
self.layoutIfNeeded()
}
selectedIndex = newIndex
}
}
//
// YHMakePlanHeadView.swift
// galaxy
//
// Created by EDY on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanHeadView: UIView {
typealias Block = (Int) -> Void
var block: Block?
private lazy var centerImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "plan_head_bg")
return view
}()
private lazy var centerView: YHMakePlanStateHeadView = {
let view = YHMakePlanStateHeadView()
view.backgroundColor = .white
view.layer.cornerRadius = 4
return view
}()
private lazy var logoImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "plan_head_logo")
return view
}()
lazy var custtomView: YHMakePlanCusttomHeadView = {
let view = YHMakePlanCusttomHeadView()
view.backgroundColor = .clear
view.block = { tag in
self.block?(tag)
}
return view
}()
var dataSource: YHMakePlanScoreModel? {
didSet {
centerView.dataSource = dataSource
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setUpView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(type: YHGCApplicationType, name: String) {
}
private func setUpView() {
addSubview(centerImageView)
addSubview(centerView)
addSubview(logoImageView)
addSubview(custtomView)
centerImageView.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.height.equalTo(333.fix)
}
centerView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(88)
make.bottom.equalTo(centerImageView.snp.bottom).offset(-16)
}
logoImageView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.height.equalTo(109)
make.width.equalTo(272)
make.top.equalTo(96)
}
custtomView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(44)
}
}
}
//
// YHMakePlanPriceAlertView.swift
// galaxy
//
// Created by EDY on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanPriceAlertView: UIView {
typealias Block = (Int) -> Void
var block: Block?
var centerView: UIView!
var titleLabel: UILabel!
var closeButton: UIButton!
var lineView: UIView!
lazy var priceView: YHMakePlanBottomView = {
let view = YHMakePlanBottomView()
return view
}()
lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .grouped)
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 50
tableView.showsVerticalScrollIndicator = false
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.register(cellWithClass: YHMakePlanLabelCell.self)
return tableView
}()
var dataSource: YHMakePlanModel = YHMakePlanModel() {
didSet {
tableView.reloadData()
let totalPrice = dataSource.calculateTotalPrice()
priceView.priceButton.setImage(UIImage(named: "make_plan_down"), for: .normal)
priceView.configure(price: totalPrice, actionText: "去办理") {
self.dismiss()
} nextHandler: {
self.block?(1)
}
}
}
static func show(dataSource: YHMakePlanModel, callBack: @escaping ((Int) -> Void)) {
let view = YHMakePlanPriceAlertView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight))
view.block = callBack
view.dataSource = dataSource
let window = UIApplication.shared.yhKeyWindow()
window?.addSubview(view)
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor(white: 0.5, alpha: 0.1)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tap.delegate = self
addGestureRecognizer(tap)
setView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setView() {
backgroundColor = UIColor(hex: 0x0000, alpha: 0.5)
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
addSubview(centerView)
centerView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(554)
}
titleLabel = {
let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 17)
label.textColor = UIColor.mainTextColor
label.textAlignment = .center
label.text = "价格明细"
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(16)
make.height.equalTo(20)
make.right.equalTo(-18)
}
closeButton = {
let button = UIButton(type: .custom)
button.setImage(UIImage(named: "address_close"), for: .normal)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
centerView.addSubview(closeButton)
closeButton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.height.width.equalTo(24)
make.top.equalTo(18)
}
closeButton.YH_clickEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
lineView = {
let view = UIView()
view.backgroundColor = UIColor.separatorColor
return view
}()
centerView.addSubview(lineView)
lineView.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(52)
make.height.equalTo(1)
make.right.equalTo(-18)
}
centerView.addSubview(priceView)
priceView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(98)
}
priceView.configure(price: "489800", actionText: "去办理") {
self.dismiss()
} nextHandler: {
self.block?(1)
}
centerView.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(52)
make.bottom.equalTo(-98)
}
}
@objc private func handleTap(_ sender: AnyObject?) {
dismiss()
}
@objc func dismiss() {
removeFromSuperview()
}
@objc func orderButtonClick() {
if let block = block {
block(1)
}
dismiss()
}
@objc func guideButtonClick() {
if let block = block {
block(2)
}
dismiss()
}
}
extension YHMakePlanPriceAlertView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if touch.view == self {
return true
}
return false
}
}
extension YHMakePlanPriceAlertView: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// return items.count
return 4
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withClass: YHMakePlanLabelCell.self) as? YHMakePlanLabelCell else {
return UITableViewCell()
}
var data: [YHMakePlanMainModel] = []
if indexPath.row == 0 {
cell.titleLabel.text = "基础身份续签"
data = dataSource.basic
} else if indexPath.row == 1 {
cell.titleLabel.text = "工作联系提升"
data = dataSource.work
} else if indexPath.row == 2 {
cell.titleLabel.text = "生活联系提升"
data = dataSource.live
} else if indexPath.row == 3 {
cell.titleLabel.text = "投资联系提升"
data = dataSource.invest
}
cell.dataSource = data
let filteredModel = data.filteredByCartStatus()
if filteredModel.count == 0 {
cell.isHidden = true
} else {
cell.isHidden = false
}
if indexPath.row == 3 {
cell.lineView.isHidden = true
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var data: [YHMakePlanMainModel] = []
if indexPath.row == 0 {
data = dataSource.basic
} else if indexPath.row == 1 {
data = dataSource.work
} else if indexPath.row == 2 {
data = dataSource.live
} else if indexPath.row == 3 {
data = dataSource.invest
}
let filteredModel = data.filteredByCartStatus()
if filteredModel.count == 0 {
return 0
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.01
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0.01
}
}
class YHMakePlanLabelCell: UITableViewCell {
// typealias InformationBlock = (_ model: YHItemModel) -> Void
var centerView: UIView!
var titleLabel: UILabel!
var mainItemView: UIView!
var country: String = ""
var lineView: UIView!
var dataSource: [YHMakePlanMainModel]? {
didSet {
updateAllViews()
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = .none
setupUI()
}
func setupUI() {
contentView.backgroundColor = .clear
backgroundColor = .clear
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
contentView.addSubview(centerView)
centerView.snp.makeConstraints { make in
make.left.equalTo(18)
make.right.equalTo(-18)
make.top.equalTo(7)
make.bottom.equalTo(-7)
}
titleLabel = {
let label = UILabel()
label.font = UIFont.PFSC_R(ofSize: 14)
label.textColor = UIColor(hex: 0x8993a2)
label.text = "价格明细"
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(16)
make.height.equalTo(20)
}
mainItemView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
centerView.addSubview(mainItemView)
mainItemView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalTo(36)
}
lineView = {
let view = UIView()
view.backgroundColor = UIColor.separatorColor
return view
}()
centerView.addSubview(lineView)
lineView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(1)
}
}
func updateAllViews() {
mainItemView.removeSubviews()
let filteredModel = dataSource?.filteredByCartStatus() ?? []
var lastView: UIView?
for (i, model) in filteredModel.enumerated() {
let name = model.sub_product.first?.product_name ?? ""
let titleLabel = UILabel()
titleLabel.font = UIFont.PFSC_M(ofSize: 14)
titleLabel.textColor = UIColor.mainTextColor
if name == "" {
titleLabel.text = model.product_name
} else {
titleLabel.text = model.product_name + " | " + name
}
titleLabel.numberOfLines = 0
mainItemView.addSubview(titleLabel)
let price = model.sub_product.first?.price ?? model.price
let valueLabel = UILabel()
valueLabel.font = UIFont.PFSC_M(ofSize: 14)
valueLabel.textColor = UIColor.mainTextColor
valueLabel.textAlignment = .right
valueLabel.text = "¥" + price.formattedPrice()
mainItemView.addSubview(valueLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalTo(valueLabel.snp.left).offset(-8)
if let lastView = lastView {
make.top.equalTo(lastView.snp.bottom).offset(12)
} else {
make.top.equalToSuperview().offset(12)
}
}
valueLabel.snp.makeConstraints { make in
make.right.equalToSuperview()
make.width.equalTo(100)
make.top.equalTo(titleLabel)
}
lastView = titleLabel
// 如果是最后一个元素,连接到底部
if i == filteredModel.count - 1 {
titleLabel.snp.makeConstraints { make in
make.bottom.equalToSuperview().offset(-12)
}
}
}
}
}
//
// YHMakePlanSelectAlertView.swift
// galaxy
//
// Created by EDY on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHMakePlanSelectAlertView: UIView {
typealias Block = (Int) -> Void
var block: Block?
var centerView: UIView!
var titleLabel: UILabel!
var closeButton: UIButton!
var sureButton: UIButton!
var hasSelectLabel: UILabel!
var cardView: YHMakePlanCardView!
var lineView: UIView!
var selectIndex: Int = 0
var selectProductId: Int = 0
var firstData: YHMakePlanMainModel?
var dataSource: YHMakePlanMainModel? {
didSet {
updata()
}
}
lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .grouped)
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
tableView.showsVerticalScrollIndicator = false
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
let view = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 20))
let label = UILabel()
label.text = "产品类型"
label.textColor = UIColor(hex: 0x8993a2)
label.font = UIFont.PFSC_M(ofSize: 15)
label.frame = CGRect(x: 20, y: 0, width: KScreenWidth, height: 20)
view.addSubview(label)
tableView.tableHeaderView = view
tableView.register(cellWithClass: YHMakePlanCardCell.self)
return tableView
}()
static func show(dataSource: YHMakePlanMainModel, callBack: @escaping ((Int) -> Void)) {
let view = YHMakePlanSelectAlertView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight))
view.dataSource = dataSource
view.firstData = dataSource
view.block = callBack
let window = UIApplication.shared.yhKeyWindow()
window?.addSubview(view)
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor(white: 0.5, alpha: 0.1)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tap.delegate = self
addGestureRecognizer(tap)
setView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setView() {
backgroundColor = UIColor(hex: 0x0000, alpha: 0.5)
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius3
return view
}()
addSubview(centerView)
centerView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(720)
}
titleLabel = {
let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 17)
label.textColor = UIColor.mainTextColor
label.textAlignment = .center
label.text = "公司经营套餐选择"
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(16)
make.height.equalTo(20)
make.right.equalTo(-18)
}
closeButton = {
let button = UIButton(type: .custom)
button.setImage(UIImage(named: "address_close"), for: .normal)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
centerView.addSubview(closeButton)
closeButton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.height.width.equalTo(24)
make.top.equalTo(18)
}
closeButton.YH_clickEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
lineView = {
let view = UIView()
view.backgroundColor = UIColor.separatorColor
return view
}()
centerView.addSubview(lineView)
lineView.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(52)
make.height.equalTo(1)
make.right.equalTo(-18)
}
let bottomLineView = {
let view = UIView()
view.backgroundColor = UIColor.separatorColor
return view
}()
centerView.addSubview(bottomLineView)
bottomLineView.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(214)
make.height.equalTo(1)
make.right.equalTo(-18)
}
hasSelectLabel = {
let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 15)
label.textColor = UIColor(hex: 0x8993a2)
label.text = "已选产品"
return label
}()
centerView.addSubview(hasSelectLabel)
hasSelectLabel.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(72)
make.height.equalTo(20)
make.right.equalTo(-18)
}
cardView = {
let label = YHMakePlanCardView()
label.containerView.backgroundColor = .clear
return label
}()
centerView.addSubview(cardView)
cardView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.bottom.equalTo(bottomLineView.snp.top).offset(-6.5)
make.height.equalTo(121)
}
sureButton = {
let button = UIButton(type: .custom)
button.backgroundColor = .black
button.setTitleColor(UIColor(hex: 0xffffff), for: .normal)
button.setTitle("确认", for: .normal)
button.layer.cornerRadius = 4
button.addTarget(self, action: #selector(orderButtonClick), for: .touchUpInside)
return button
}()
centerView.addSubview(sureButton)
sureButton.snp.makeConstraints { make in
make.bottom.equalTo(-42)
make.left.equalTo(20)
make.right.equalTo(-20)
make.height.equalTo(46)
}
centerView.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(bottomLineView.snp.bottom).offset(24)
make.bottom.equalTo(-96)
}
}
func updata() {
guard let data = dataSource else { return }
for i in 0 ..< data.sub_product.count {
if data.sub_product[i].is_add_cart == true {
selectIndex = i
}
}
if data.sub_product.count > 0 {
cardView.configureSub(with: data.sub_product[selectIndex])
selectProductId = data.sub_product[selectIndex].product_id
}
tableView.reloadData()
}
@objc private func handleTap(_ sender: AnyObject?) {
dismiss()
}
@objc func dismiss() {
removeFromSuperview()
}
@objc func orderButtonClick() {
if let block = block {
if dataSource?.sub_product[selectIndex].is_add_cart == firstData?.sub_product[selectIndex].is_add_cart {
dismiss()
return
}
block(dataSource?.sub_product[selectIndex].product_id ?? 0)
}
dismiss()
}
}
extension YHMakePlanSelectAlertView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if touch.view == self {
return true
}
return false
}
}
extension YHMakePlanSelectAlertView: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// return items.count
return dataSource?.sub_product.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withClass: YHMakePlanCardCell.self) as? YHMakePlanCardCell else {
return UITableViewCell()
}
guard let model = dataSource?.sub_product[indexPath.row] else { return UITableViewCell()}
cell.configure(with: model)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 94
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectIndex = indexPath.row
let count = dataSource?.sub_product.count ?? 0
for i in 0 ..< count {
if i == indexPath.row {
dataSource?.sub_product[i].is_add_cart = true
guard let model = dataSource?.sub_product[i] else { return }
cardView.configureSub(with: model)
} else {
dataSource?.sub_product[i].is_add_cart = false
}
}
tableView.reloadData()
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.01
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0.01
}
}
class YHMakePlanCardCell: UITableViewCell {
// MARK: - UI Elements
private let containerView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.layer.borderWidth = 1
view.layer.borderColor = UIColor.mainTextColor.cgColor
return view
}()
private let bgImageView: UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage(named: "global_default_image")
return imageView
}()
private let titleLabel: UILabel = {
let label = UILabel()
label.text = "星企航6年服务"
label.font = UIFont.PFSC_M(ofSize: 14)
label.textColor = .mainTextColor
return label
}()
private let priceLabel: UILabel = {
let label = UILabel()
label.text = "¥129980"
label.font = UIFont.PFSC_R(ofSize: 14)
label.textColor = .mainTextColor
return label
}()
// MARK: - Initialization
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
setupConstraints()
selectionStyle = .none
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Setup
private func setupUI() {
backgroundColor = .clear
contentView.backgroundColor = .clear
contentView.addSubview(containerView)
containerView.addSubview(bgImageView)
containerView.addSubview(titleLabel)
containerView.addSubview(priceLabel)
}
private func setupConstraints() {
containerView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(8)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.bottom.equalToSuperview().offset(-8)
}
bgImageView.snp.makeConstraints { make in
make.height.width.equalTo(46)
make.left.equalToSuperview().offset(16)
make.centerY.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(12)
make.left.equalToSuperview().offset(72)
make.right.equalToSuperview().offset(-16)
}
priceLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(72)
make.right.equalToSuperview().offset(-16)
make.bottom.equalToSuperview().offset(-12)
}
}
// MARK: - Configuration
func configure(with service: YHMakePlanSubModel) {
titleLabel.text = service.product_name
priceLabel.text = "¥" + service.price.formattedPrice()
if service.is_add_cart {
containerView.layer.borderWidth = 1
containerView.layer.borderColor = UIColor.mainTextColor.cgColor
} else {
containerView.layer.borderWidth = 1
containerView.layer.borderColor = UIColor(hex: 0xe9ecf0).cgColor
}
if let url = URL(string: service.cover_img) {
bgImageView.kf.setImage(with: url, placeholder: UIImage(named: "global_default_image"))
}
}
}
//
// YHMakePlanShareAlertView.swift
// galaxy
//
// Created by EDY on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanShareAlertView: UIView {
typealias Block = (Int) -> Void
var block: Block?
var centerView: UIView!
var sureButton: UIButton!
var leftButton: YHShareButton!
var rightButton: YHShareButton!
var url: String = ""
static func show(url: String, callBack: @escaping ((Int) -> Void)) {
let view = YHMakePlanShareAlertView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight))
view.block = callBack
view.url = url
let window = UIApplication.shared.yhKeyWindow()
window?.addSubview(view)
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor(white: 0.5, alpha: 0.1)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tap.delegate = self
addGestureRecognizer(tap)
setView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setView() {
backgroundColor = UIColor(hex: 0x0000, alpha: 0.5)
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
addSubview(centerView)
centerView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(216)
}
sureButton = {
let button = UIButton(type: .custom)
button.backgroundColor = UIColor(hex: 0xf5f6f8)
button.setTitleColor(.mainTextColor, for: .normal)
button.setTitle("取消", for: .normal)
button.layer.cornerRadius = 4
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
centerView.addSubview(sureButton)
sureButton.snp.makeConstraints { make in
make.bottom.equalTo(-54)
make.left.equalTo(20)
make.right.equalTo(-20)
make.height.equalTo(46)
}
leftButton = {
let button = YHShareButton()
button.setContent("invitation_with_gifts_share_center", "微信好友")
button.bottomTitleLabel.font = UIFont.PFSC_R(ofSize: 13)
button.addTarget(self, action: #selector(peopleClick), for: .touchUpInside)
return button
}()
centerView.addSubview(leftButton)
leftButton.snp.makeConstraints { make in
make.top.equalTo(20)
make.right.equalTo(centerView.snp.centerX).offset(-33)
make.height.equalTo(74)
make.width.equalTo(52)
}
rightButton = {
let button = YHShareButton()
button.setContent("invitation_with_gifts_share_link", "复制链接")
button.bottomTitleLabel.font = UIFont.PFSC_R(ofSize: 13)
button.addTarget(self, action: #selector(wxClick), for: .touchUpInside)
return button
}()
centerView.addSubview(rightButton)
rightButton.snp.makeConstraints { make in
make.top.equalTo(20)
make.left.equalTo(centerView.snp.centerX).offset(33)
make.height.equalTo(74)
make.width.equalTo(52)
}
}
@objc func wxClick() {
if let url = URL(string: url) {
UIPasteboard.general.url = url
YHHUD.flash(message: "复制成功")
}
}
@objc func peopleClick() {
YHShareManager.shared.sendLinkContent("香港续签至永居方案定制", "银河为您私人定制全套方案,快来试试吧~", UIImage(named: "invitation_with_gifts_share_plan") ?? UIImage(), link: url)
}
@objc private func handleTap(_ sender: AnyObject?) {
dismiss()
}
@objc func dismiss() {
removeFromSuperview()
}
@objc func orderButtonClick() {
if let block = block {
block(1)
}
dismiss()
}
@objc func guideButtonClick() {
if let block = block {
block(2)
}
dismiss()
}
}
extension YHMakePlanShareAlertView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if touch.view == self {
return true
}
return false
}
}
//
// YHMakePlanStateHeadView.swift
// galaxy
//
// Created by EDY on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanStateHeadView: UIView {
var dataSource: YHMakePlanScoreModel? {
didSet {
guard let dataSource = dataSource else { return }
configure(model: dataSource)
}
}
// MARK: - UI Components
private let yearsLabel: UILabel = {
let label = UILabel()
label.text = "5"
label.font = UIFont(name: "D-DIN-PRO-Bold", size: 32)
label.textColor = .mainTextColor
label.textAlignment = .center
return label
}()
private let yearsDescriptionLabel: UILabel = {
let label = UILabel()
label.text = "预计可续期(年)"
label.font = UIFont.PFSC_R(ofSize: 14)
label.textColor = UIColor(hex: 0x8893a2)
label.textAlignment = .center
return label
}()
private let percentageLabel: UILabel = {
let label = UILabel()
label.text = "90%"
label.font = UIFont(name: "D-DIN-PRO-Bold", size: 32)
label.textColor = .mainTextColor
label.textAlignment = .center
return label
}()
private let progressDescriptionLabel: UILabel = {
let label = UILabel()
label.text = "续签综合通过率"
label.font = UIFont.PFSC_R(ofSize: 14)
label.textColor = UIColor(hex: 0x8893a2)
label.textAlignment = .center
return label
}()
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
setupConstraints()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
setupConstraints()
}
// MARK: - Setup
private func setupView() {
addSubview(yearsLabel)
addSubview(yearsDescriptionLabel)
addSubview(percentageLabel)
addSubview(progressDescriptionLabel)
}
private func setupConstraints() {
yearsLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(16)
make.left.equalToSuperview().offset(16)
make.right.equalTo(self.snp.centerX)
}
yearsDescriptionLabel.snp.makeConstraints { make in
make.top.equalTo(yearsLabel.snp.bottom).offset(4)
make.left.equalToSuperview().offset(16)
make.right.equalTo(self.snp.centerX)
}
percentageLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.left.equalTo(self.snp.centerX)
}
progressDescriptionLabel.snp.makeConstraints { make in
make.top.equalTo(percentageLabel.snp.bottom).offset(4)
make.right.equalToSuperview().offset(-16)
make.left.equalTo(self.snp.centerX)
}
}
// MARK: - Configuration
func configure(model: YHMakePlanScoreModel) {
yearsLabel.text = "\(model.year)"
percentageLabel.text = model.pass_rate
}
}
//
// YHMakePlanTopView.swift
// galaxy
//
// Created by EDY on 2025/3/31.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHMakePlanTopView: UIView {
typealias Block = (Int) -> Void
var block: Block?
var dataSource: YHMakePlanScoreModel? {
didSet {
let year = dataSource?.year ?? 0
let rate = dataSource?.pass_rate ?? ""
let a: ASAttributedString = .init("预计可续期(年) ", .font(UIFont.PFSC_R(ofSize: 14)), .foreground(UIColor(hex: 0x6a7586)))
let b: ASAttributedString = .init("\(year)", .font(UIFont.PFSC_M(ofSize: 24)), .foreground(UIColor.mainTextColor))
yearsLabel.attributed.text = a + b
let aa: ASAttributedString = .init("续签综合通过率 ", .font(UIFont.PFSC_R(ofSize: 14)), .foreground(UIColor(hex: 0x6a7586)))
let bb: ASAttributedString = .init("\(rate)", .font(UIFont.PFSC_M(ofSize: 24)), .foreground(UIColor.mainTextColor))
// let c: ASAttributedString = .init("%", .font(UIFont.PFSC_M(ofSize: 16)), .foreground(UIColor.mainTextColor))
percentageLabel.attributed.text = aa + bb
}
}
private let yearsLabel: UILabel = {
let label = UILabel()
return label
}()
private let percentageLabel: UILabel = {
let label = UILabel()
return label
}()
lazy var custtomView: YHMakePlanCusttomHeadView = {
let view = YHMakePlanCusttomHeadView()
view.block = { tag in
self.block?(tag)
}
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
setUpView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUpView() {
backgroundColor = .white
let bgView = {
let view = UIView()
view.backgroundColor = UIColor(hex: 0xf8f9fb)
view.layer.cornerRadius = 6
return view
}()
addSubview(bgView)
addSubview(yearsLabel)
addSubview(percentageLabel)
addSubview(custtomView)
bgView.snp.makeConstraints { make in
make.left.equalTo(18)
make.right.equalTo(-18)
make.height.equalTo(42)
make.top.equalTo(9)
}
yearsLabel.snp.makeConstraints { make in
make.left.equalTo(34)
make.height.equalTo(24)
make.top.equalTo(18)
}
percentageLabel.snp.makeConstraints { make in
make.left.equalTo(self.snp.centerX)
make.height.equalTo(24)
make.top.equalTo(18)
}
custtomView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(44)
}
}
}
//
// YHMakePlanViewModel.swift
// galaxy
//
// Created by EDY on 2025/4/1.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMakePlanViewModel: YHBaseViewModel {
var makePlanModel: YHMakePlanModel = YHMakePlanModel()
var score: YHMakePlanScoreModel = YHMakePlanScoreModel()
// 请求产品列表
func getProductList(callBackBlock: @escaping (_ success: Bool, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.ResignPlan.productListApi
_ = YHNetRequest.getRequest(url: strUrl) { [weak self] json, _ in
// 1. json字符串 转 对象
guard self != nil else { return }
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let result = YHMakePlanModel.deserialize(from: dic) else {
callBackBlock(false, nil)
return
}
self?.makePlanModel = result
self?.makePlanModel.updateAddCartStatus()
callBackBlock(true, nil)
} else {
let error: YHErrorModel = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.count > 0 ? json.msg : "数据错误")
callBackBlock(false, error)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
// 请求产品列表
func getRate(model: YHMakePlanModel, callBackBlock: @escaping (_ success: Bool, _ error: YHErrorModel?) -> Void) {
var basic: [Int] = []
var work: [Int] = []
var live: [Int] = []
var invest: [Int] = []
let basicArray = makePlanModel.basic
let workArray = makePlanModel.work
let liveArray = makePlanModel.live
let investArray = makePlanModel.invest
for item in basicArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
basic.append(subItem.product_id)
}
}
} else {
basic.append(item.product_id)
}
}
}
for item in workArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
work.append(subItem.product_id)
}
}
} else {
work.append(item.product_id)
}
}
}
for item in liveArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
live.append(subItem.product_id)
}
}
} else {
live.append(item.product_id)
}
}
}
for item in investArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
invest.append(subItem.product_id)
}
}
} else {
invest.append(item.product_id)
}
}
}
var params: [String: Any] = ["work_product_ids": work,
"live_product_ids": live,
"invest_product_ids": invest,
"basic_product_ids": basic]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.ResignPlan.getRate
_ = YHNetRequest.postRequest(url: strUrl, params: params) { [weak self] json, _ in
// 1. json字符串 转 对象
guard self != nil else { return }
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let result = YHMakePlanScoreModel.deserialize(from: dic) else {
callBackBlock(false, nil)
return
}
self?.score = result
callBackBlock(true, nil)
} else {
let error: YHErrorModel = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.count > 0 ? json.msg : "数据错误")
callBackBlock(false, error)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
func addShopCard(model: YHMakePlanModel, callBackBlock: @escaping (_ success: Bool, _ error: YHErrorModel?) -> Void) {
var basic: [Int] = []
let basicArray = makePlanModel.basic
let workArray = makePlanModel.work
let liveArray = makePlanModel.live
let investArray = makePlanModel.invest
for item in basicArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
basic.append(subItem.product_id)
}
}
} else {
basic.append(item.product_id)
}
}
}
for item in workArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
basic.append(subItem.product_id)
}
}
} else {
basic.append(item.product_id)
}
}
}
for item in liveArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
basic.append(subItem.product_id)
}
}
} else {
basic.append(item.product_id)
}
}
}
for item in investArray {
if item.is_add_cart == true {
if item.sub_product.count > 0 {
for subItem in item.sub_product {
if subItem.is_add_cart == true {
basic.append(subItem.product_id)
}
}
} else {
basic.append(item.product_id)
}
}
}
let params: [String: Any] = ["ids": basic,
"create_source": 2]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.ResignPlan.store
_ = YHNetRequest.postRequest(url: strUrl, params: params) { [weak self] json, _ in
// 1. json字符串 转 对象
guard self != nil else { return }
if json.code == 200 {
callBackBlock(true, nil)
} else {
let error: YHErrorModel = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.count > 0 ? json.msg : "数据错误")
callBackBlock(false, error)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
}
//
// YHLookPlanButton.swift
// galaxy
//
// Created by Dufet on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHLookPlanButton: UIButton {
lazy var title1Label: UILabel = {
let lable = UILabel()
lable.textColor = .white
lable.textAlignment = .center
lable.font = UIFont.PFSC_M(ofSize: 16)
lable.text = "查看定制方案"
return lable
}()
lazy var title2Label: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0xFFFFFF, alpha: 0.6)
lable.textAlignment = .center
lable.font = UIFont.PFSC_R(ofSize: 11)
lable.text = "银河创世纪专业团队为您服务"
return lable
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
backgroundColor = .mainTextColor
self.layer.cornerRadius = 3.0
self.addSubview(title1Label)
self.addSubview(title2Label)
title1Label.snp.makeConstraints { make in
make.top.equalTo(12)
make.height.equalTo(22)
make.centerX.equalToSuperview()
}
title2Label.snp.makeConstraints { make in
make.top.equalTo(title1Label.snp.bottom).offset(0)
make.height.equalTo(14)
make.centerX.equalToSuperview()
}
}
}
//
// YHPlanAnalyzeInfoCell.swift
// galaxy
//
// Created by Dufet on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHPlanAnalyzeInfoView: UIView {
var desc: String = "" {
didSet {
if desc.isEmpty {
descLabel.text = "—"
} else {
descLabel.text = desc
}
}
}
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.mainTextColor
lable.textAlignment = .left
lable.font = UIFont.PFSC_M(ofSize: 15)
lable.text = "当前情况"
return lable
}()
lazy var descLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0x6A7586)
lable.textAlignment = .left
lable.font = UIFont.PFSC_R(ofSize: 13)
lable.numberOfLines = 0
return lable
}()
lazy var lineView: UIView = {
let v = UIView()
v.backgroundColor = .init(hex: 0xF1E8E0)
v.backgroundColor = .init(hex: 0xE9ECF0)
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
backgroundColor = .clear
self.addSubview(lineView)
self.addSubview(titleLabel)
self.addSubview(descLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(0)
make.right.equalTo(-0)
make.top.equalTo(0)
make.height.equalTo(20)
}
lineView.snp.makeConstraints { make in
make.height.equalTo(6)
make.width.equalTo(60)
make.left.equalTo(titleLabel)
make.bottom.equalTo(titleLabel).offset(-2)
}
descLabel.snp.makeConstraints { make in
make.left.equalTo(0)
make.right.equalTo(-0)
make.top.equalTo(titleLabel.snp.bottom).offset(4)
make.bottom.equalToSuperview()
}
}
}
class YHPlanAnalyzeInfoCell: UITableViewCell {
static let cellReuseIdentifier = "YHPlanAnalyzeInfoCell"
var clickBlock: ((YHPlanProductModel) -> Void)?
var model = YHPlanAnalyzeModel() {
didSet {
titleLabel.text = "\(model.getTitle())分析"
let aa: ASAttributedString = .init("\(model.score)", .font(UIFont(name: "DINAlternate-Bold", size: 24)!), .foreground(UIColor.mainTextColor))
let bb: ASAttributedString = .init("/5.0", .font(UIFont(name: "DINAlternate-Bold", size: 14)!), .foreground(UIColor.init(hex: 0x8993A2)))
scoreLabel.attributed.text = aa+bb
currentStateVeiw.desc = model.current_state
requireVeiw.desc = model.hong_kong_policy
suggestVeiw.desc = model.suggest
products = model.solution_plan
}
}
var products: [YHPlanProductModel] = [] {
didSet {
let isShowList = products.count > 0
productListView.isHidden = !isShowList
productListView.snp.remakeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(suggestVeiw.snp.bottom).offset(isShowList ? 16 : 0)
if !isShowList {
make.height.equalTo(0)
}
make.right.equalTo(-16)
make.bottom.equalTo(-16)
}
productListView.products = products
productListView.titleLabel.text = "增购以下产品可提升\(model.getTitle())联系"
self.setNeedsLayout()
self.layoutIfNeeded()
}
}
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 6.0
v.clipsToBounds = true
return v
}()
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.mainTextColor
lable.textAlignment = .left
lable.font = UIFont.PFSC_B(ofSize: 18)
lable.text = "分析"
return lable
}()
lazy var scoreLabel: UILabel = {
let lable = UILabel()
lable.textAlignment = .right
lable.font = UIFont.PFSC_M(ofSize: 15)
let aa: ASAttributedString = .init("0.0", .font(UIFont(name: "DINAlternate-Bold", size: 24)!), .foreground(UIColor.mainTextColor))
let bb: ASAttributedString = .init("/5.0", .font(UIFont(name: "DINAlternate-Bold", size: 14)!), .foreground(UIColor.init(hex: 0x8993A2)))
lable.attributed.text = aa+bb
return lable
}()
lazy var lineView: UIView = {
let v = UIView()
v.backgroundColor = UIColor.init(hex: 0xE9ECF0)
return v
}()
lazy var currentStateVeiw: YHPlanAnalyzeInfoView = {
let v = YHPlanAnalyzeInfoView(frame: .zero)
v.titleLabel.text = "当前情况"
return v
}()
lazy var requireVeiw: YHPlanAnalyzeInfoView = {
let v = YHPlanAnalyzeInfoView(frame: .zero)
v.titleLabel.text = "港府要求"
return v
}()
lazy var suggestVeiw: YHPlanAnalyzeInfoView = {
let v = YHPlanAnalyzeInfoView(frame: .zero)
v.titleLabel.textColor = .init(hex: 0xAE6C32)
v.lineView.backgroundColor = .init(hex: 0xF1E8E0)
v.titleLabel.text = "银河建议"
return v
}()
lazy var productListView: YHPlanProductListView = {
let v = YHPlanProductListView(frame: .zero)
v.clickBlock = { [weak self] model in
guard let self = self else { return }
self.clickBlock?(model)
}
v.isHidden = true
return v
}()
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
func setupUI() {
selectionStyle = .none
backgroundColor = .clear
contentView.backgroundColor = .clear
contentView.addSubview(whiteContentView)
whiteContentView.addSubview(titleLabel)
whiteContentView.addSubview(scoreLabel)
whiteContentView.addSubview(lineView)
whiteContentView.addSubview(currentStateVeiw)
whiteContentView.addSubview(requireVeiw)
whiteContentView.addSubview(suggestVeiw)
whiteContentView.addSubview(productListView)
whiteContentView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(0)
make.bottom.equalTo(-16)
}
titleLabel.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(20)
make.height.equalTo(25)
}
scoreLabel.snp.makeConstraints { make in
make.right.equalTo(-16)
make.top.equalTo(20)
make.height.equalTo(25)
}
lineView.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(12)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(0.5)
}
currentStateVeiw.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(lineView.snp.bottom).offset(16)
make.right.equalTo(-16)
}
requireVeiw.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(currentStateVeiw.snp.bottom).offset(16)
make.right.equalTo(-16)
}
suggestVeiw.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(requireVeiw.snp.bottom).offset(16)
make.right.equalTo(-16)
}
productListView.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(suggestVeiw.snp.bottom).offset(0)
make.height.equalTo(0)
make.right.equalTo(-16)
make.bottom.equalTo(-16)
}
}
}
//
// YHPlanCustomerCaseCollectionCell.swift
// galaxy
//
// Created by Dufet on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanCustomerCaseCollectionCell: UICollectionViewCell {
static let cellReuseIdentifier = "YHPlanCustomerCaseCollectionCell"
var model = YHPlanCaseModel() {
didSet {
descLabel.text = model.title
if let url = URL(string: model.img_url) {
iconImgV.sd_setImage(with: url, placeholderImage: UIImage(named: "global_default_image"))
} else {
iconImgV.image = UIImage(named: "global_default_image")
}
}
}
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 6.0
v.clipsToBounds = true
return v
}()
lazy var iconImgV: UIImageView = {
let v = UIImageView()
v.backgroundColor = .red
return v
}()
lazy var descLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.mainTextColor
lable.textAlignment = .left
lable.font = UIFont.PFSC_R(ofSize: 14)
lable.numberOfLines = 0
lable.text = "啊所发生的发生的法师打发三大发啥打法是都发啥打法是打发撒打发三大发啥打法啊所发生的发生的法师打发三大发啥打法是都发啥打法是打发撒打发三大发啥打法"
return lable
}()
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
private func setupUI() {
contentView.addSubview(whiteContentView)
whiteContentView.addSubview(iconImgV)
whiteContentView.addSubview(descLabel)
whiteContentView.snp.makeConstraints { make in
make.top.left.right.equalToSuperview()
make.bottom.equalTo(-10)
}
iconImgV.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.height.equalTo(iconImgV.snp.width).multipliedBy(200.0/166.0)
}
descLabel.snp.makeConstraints { make in
make.top.equalTo(iconImgV.snp.bottom).offset(8)
make.bottom.equalTo(-12)
make.left.equalTo(8)
make.right.equalTo(-8)
}
}
}
//
// YHPlanCustomerCaseListCell.swift
// galaxy
//
// Created by Dufet on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanCustomerCaseListCell: UITableViewCell {
static let cellReuseIdentifier = "YHPlanCustomerCaseListCell"
var clickBlock: (([YHPlanCaseModel], Int) -> Void)?
var cases: [YHPlanCaseModel] = [] {
didSet {
collectionView.reloadData()
}
}
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0x8993A2)
lable.textAlignment = .center
lable.font = UIFont.PFSC_R(ofSize: 14)
lable.text = "客户案例"
return lable
}()
lazy var collectionView: UICollectionView = {
let layout = YHPlanCustomerCaseListLayout()
let collectView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectView.backgroundColor = .clear
collectView.delegate = self
collectView.dataSource = self
collectView.register(YHPlanCustomerCaseCollectionCell.self, forCellWithReuseIdentifier: YHPlanCustomerCaseCollectionCell.cellReuseIdentifier)
collectView.isScrollEnabled = false
return collectView
}()
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
func setupUI() {
selectionStyle = .none
backgroundColor = .clear
contentView.backgroundColor = .clear
let leftLine = UIView()
leftLine.backgroundColor = .init(hex: 0xD5DAE1)
contentView.addSubview(leftLine)
let rightLine = UIView()
rightLine.backgroundColor = .init(hex: 0xD5DAE1)
contentView.addSubview(rightLine)
contentView.addSubview(titleLabel)
contentView.addSubview(collectionView)
titleLabel.snp.makeConstraints { make in
make.top.equalTo(0)
make.centerX.equalToSuperview()
make.width.equalTo(70)
make.height.equalTo(20)
}
leftLine.snp.makeConstraints { make in
make.width.equalTo(50)
make.height.equalTo(0.5)
make.right.equalTo(titleLabel.snp.left)
make.centerY.equalTo(titleLabel)
}
rightLine.snp.makeConstraints { make in
make.width.equalTo(50)
make.height.equalTo(0.5)
make.left.equalTo(titleLabel.snp.right)
make.centerY.equalTo(titleLabel)
}
collectionView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(titleLabel.snp.bottom).offset(12)
make.bottom.equalToSuperview()
}
}
}
extension YHPlanCustomerCaseListCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, YHPlanCustomerCaseListLayoutDelegate {
// 返回单元格数量
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return cases.count
}
// 返回每个单元格的大小
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let cellWidth = floor((KScreenWidth-16.0*2.0-10.0)/2.0)
var height = 0.0
if indexPath.item < cases.count {
let model = cases[indexPath.item]
height = self.getHeigt(font: UIFont.PFSC_R(ofSize: 14), width: cellWidth-8.0*2.0, string: model.title)
}
height += (cellWidth*(200.0/166.0) + 8.0+12.0+10.0)
return CGSize(width: cellWidth, height: height)
}
// 返回自定义单元格
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: YHPlanCustomerCaseCollectionCell.cellReuseIdentifier, for: indexPath) as? YHPlanCustomerCaseCollectionCell else {
return UICollectionViewCell()
}
if 0 <= indexPath.item && indexPath.item < cases.count {
let model = cases[indexPath.item]
cell.model = model
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if 0 <= indexPath.item && indexPath.item < cases.count {
// let text = topicArr[indexPath.item]
clickBlock?(cases, indexPath.item)
}
}
// 计算文字宽度大小
func getHeigt(font: UIFont, width: CGFloat, string: String) -> CGFloat {
let size = CGSize.init(width: width, height: CGFloat(MAXFLOAT))
let dic = [NSAttributedString.Key.font: font] // swift 4.2
let strSize = string.boundingRect(with: size, options: [.usesLineFragmentOrigin], attributes: dic, context: nil).size
return ceil(strSize.height)
}
}
//
// YHPlanCustomerCaseListLayout.swift
// galaxy
//
// Created by Dufet on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanCustomerCaseListLayout: UICollectionViewLayout {
// MARK: - 配置属性
let cellWidth = floor((KScreenWidth-16.0*2.0-10.0)/2.0)
let cellPadding = 10.0
let cellGap = 10.0
private var contentHeight: CGFloat = 0
// MARK: - 缓存布局属性
private var cachedAttributes = [UICollectionViewLayoutAttributes]()
// MARK: - 布局计算
override func prepare() {
super.prepare()
guard let collectionView = collectionView else { return }
// 重置缓存和内容高度
cachedAttributes.removeAll()
contentHeight = 0.0
var yOffset1: CGFloat = 0.0
var yOffset2: CGFloat = 0.0
// 计算每个item的布局属性
for item in 0..<collectionView.numberOfItems(inSection: 0) {
let indexPath = IndexPath(item: item, section: 0)
// 获取item高度(通过委托)
let height: CGFloat
if let delegate = collectionView.delegate as? YHPlanCustomerCaseListLayoutDelegate {
height = delegate.collectionView(collectionView, layout: self, sizeForItemAt: indexPath).height
} else {
height = 240 // 默认高度
}
// 计算frame
let x = item % 2 == 0 ? 0.0 : cellWidth + cellPadding
let y = item % 2 == 0 ? yOffset1 : yOffset2
let frame = CGRect(x: x, y: y, width: cellWidth, height: height)
// 创建布局属性
let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
attributes.frame = frame
cachedAttributes.append(attributes)
// 更新内容高度和yOffset
if item % 2 == 0 {
yOffset1 = y + height
} else {
yOffset2 = y + height
}
}
contentHeight = max(yOffset1, yOffset2)
}
// MARK: - 布局属性提供
override var collectionViewContentSize: CGSize {
return CGSize(width: (KScreenWidth-16.0*2.0-10.0), height: contentHeight)
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
return cachedAttributes.filter { $0.frame.intersects(rect) }
}
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
return cachedAttributes[indexPath.item]
}
// MARK: - 支持动态高度变化
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
guard let collectionView = collectionView else { return false }
return !newBounds.size.equalTo(collectionView.bounds.size)
}
}
// MARK: - 高度计算协议
protocol YHPlanCustomerCaseListLayoutDelegate: AnyObject {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
}
//
// YHPlanItemView.swift
// galaxy
//
// Created by Dufet on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanItemView: UIView {
lazy var iconImgV: UIImageView = {
let v = UIImageView()
v.image = UIImage(named: "plan_item_icon")
v.contentMode = .scaleAspectFit
return v
}()
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = .mainTextColor
lable.textAlignment = .center
lable.font = UIFont.PFSC_R(ofSize: 12)
return lable
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
backgroundColor = .clear
self.addSubview(iconImgV)
self.addSubview(titleLabel)
iconImgV.snp.makeConstraints { make in
make.width.height.equalTo(12)
make.left.equalToSuperview()
make.centerY.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.left.equalTo(iconImgV.snp.right).offset(4)
make.right.equalToSuperview()
make.centerY.equalToSuperview()
make.height.equalTo(17)
}
}
}
class YHPlanItemsView: UIView {
lazy var item1View: YHPlanItemView = {
let v = YHPlanItemView()
v.titleLabel.text = "私人定制"
return v
}()
lazy var item2View: YHPlanItemView = {
let v = YHPlanItemView()
v.titleLabel.text = "官方计划"
return v
}()
lazy var item3View: YHPlanItemView = {
let v = YHPlanItemView()
v.titleLabel.text = "模块化配置"
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
backgroundColor = .clear
self.addSubview(item1View)
self.addSubview(item2View)
self.addSubview(item3View)
item1View.snp.makeConstraints { make in
make.right.equalTo(item2View.snp.left).offset(-24)
make.height.equalTo(17)
make.centerY.equalToSuperview()
}
item3View.snp.makeConstraints { make in
make.left.equalTo(item2View.snp.right).offset(24)
make.height.equalTo(17)
make.centerY.equalToSuperview()
}
item2View.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
make.height.equalTo(17)
}
}
}
//
// YHPlanLinkShareView.swift
// galaxy
//
// Created by Dufet on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
enum YHPlanShareItemButtonType: Int {
case wechat = 1
case copyLink = 2
case saveImg = 3
case cancel = 4
}
class YHPlanShareItemButton: UIButton {
lazy var iconImgV: UIImageView = {
let v = UIImageView()
return v
}()
lazy var textLabel: UILabel = {
let lable = UILabel()
lable.textColor = .init(hex: 0x666666)
lable.textAlignment = .center
lable.font = UIFont.PFSC_R(ofSize: 13)
return lable
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.addSubview(iconImgV)
self.addSubview(textLabel)
iconImgV.snp.makeConstraints { make in
make.width.height.equalTo(48)
make.top.equalTo(0)
make.centerX.equalToSuperview()
}
textLabel.snp.makeConstraints { make in
make.top.equalTo(iconImgV.snp.bottom).offset(8)
make.centerX.equalToSuperview()
make.height.equalTo(18)
}
}
}
class YHPlanLinkShareView: UIView {
let wechatBtnTag = 9527
let copyLinkTag = 9528
let saveImgTag = 9529
let cancelTag = 9530
var clickBlock: ((YHPlanShareItemButtonType) -> Void)?
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 12.0
v.clipsToBounds = true
return v
}()
lazy var cancelBtn: UIButton = {
let btn = UIButton()
btn.tag = cancelTag
btn.backgroundColor = .init(hex: 0xF5F6F8)
btn.setTitle("取消", for: .normal)
btn.setTitleColor(.mainTextColor, for: .normal)
btn.titleLabel?.font = .PFSC_M(ofSize: 16)
btn.layer.cornerRadius = 3.0
btn.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return btn
}()
lazy var wechatBtn: YHPlanShareItemButton = {
let v = YHPlanShareItemButton()
v.tag = wechatBtnTag
v.textLabel.text = "微信"
v.iconImgV.image = UIImage(named: "plan_share_wechat")
v.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return v
}()
lazy var copyLinkBtn: YHPlanShareItemButton = {
let v = YHPlanShareItemButton()
v.tag = copyLinkTag
v.textLabel.text = "复制链接"
v.iconImgV.image = UIImage(named: "plan_share_copy")
v.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return v
}()
lazy var saveImgBtn: YHPlanShareItemButton = {
let v = YHPlanShareItemButton()
v.tag = saveImgTag
v.textLabel.text = "保存图片"
v.iconImgV.image = UIImage(named: "plan_share_save")
v.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return v
}()
static func alertView() -> YHPlanLinkShareView {
let v = YHPlanLinkShareView(frame: UIScreen.main.bounds)
return v
}
@objc func didFunctionBtnClicked(_ sender: UIButton) {
if sender.tag == wechatBtnTag {
clickBlock?(.wechat)
} else if sender.tag == copyLinkTag {
clickBlock?(.copyLink)
} else if sender.tag == saveImgTag {
clickBlock?(.saveImg)
} else if sender.tag == cancelTag {
}
dismiss()
}
@objc func show() {
UIApplication.shared.yhKeyWindow()?.addSubview(self)
}
@objc func dismiss() {
DispatchQueue.main.async {
self.removeFromSuperview()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.backgroundColor = .init(hex: 0x000000, alpha: 0.7)
self.addSubview(whiteContentView)
whiteContentView.addSubview(wechatBtn)
whiteContentView.addSubview(copyLinkBtn)
whiteContentView.addSubview(saveImgBtn)
whiteContentView.addSubview(cancelBtn)
whiteContentView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(216)
}
copyLinkBtn.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(74)
make.top.equalTo(20)
make.centerX.equalToSuperview()
}
wechatBtn.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(74)
make.top.equalTo(20)
make.right.equalTo(copyLinkBtn.snp.left).offset(-70)
}
saveImgBtn.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(74)
make.top.equalTo(20)
make.left.equalTo(copyLinkBtn.snp.right).offset(70)
}
cancelBtn.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(46)
make.top.equalTo(copyLinkBtn.snp.bottom).offset(24)
}
}
}
//
// YHPlanPolicyCarouselImageCell.swift
// galaxy
//
// Created by Dufet on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import FSPagerView
class YHPlanPolicyCarouselImageCell: FSPagerViewCell {
static let cellReuseIdentifier = "YHPlanPolicyCarouselImageCell"
var model = YHPlanCaseModel() {
didSet {
if let url = URL(string: model.img_url) {
imageV.sd_setImage(with: url, placeholderImage: UIImage(named: "global_default_image"))
} else {
imageV.image = UIImage(named: "global_default_image")
}
}
}
lazy var imageV: UIImageView = {
let v = UIImageView()
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
initView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func initView() {
self.addSubview(imageV)
imageV.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
}
//
// YHPlanPolicyCarouselView.swift
// galaxy
//
// Created by Dufet on 2025/3/27.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import FSPagerView
class YHPlanPolicyCarouselView: UIView {
var clickBlock: (([YHPlanCaseModel], Int) -> Void)?
var bannerArr: [YHPlanCaseModel] = [] {
didSet {
// 设置为0是先停掉自动滑动定时器
bannerView.automaticSlidingInterval = 0
self.indicatorView.numberOfPages = self.bannerArr.count
self.indicatorView.isHidden = self.bannerArr.count <= 1
bannerView.reloadData()
// 指定指示器为第一个
self.indicatorView.currentPage = 0
// 指定显示图片为第一个
// bannerView.selectItem(at: 0, animated: false)
// 开启定时器开始滚动
bannerView.automaticSlidingInterval = bannerSildingInterval
bannerView.removesInfiniteLoopForSingleItem = true
bannerView.alwaysBounceHorizontal = true
}
}
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 6.0
v.clipsToBounds = true
return v
}()
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = .mainTextColor
lable.textAlignment = .left
lable.font = UIFont.PFSC_B(ofSize: 18)
lable.text = "香港政策解读"
return lable
}()
lazy var bannerView: FSPagerView = {
let view = FSPagerView()
view.delegate = self
view.dataSource = self
view.bounces = false
view.isInfinite = true
view.automaticSlidingInterval = bannerSildingInterval
view.register(YHPlanPolicyCarouselImageCell.self, forCellWithReuseIdentifier: YHPlanPolicyCarouselImageCell.cellReuseIdentifier)
view.itemSize = CGSize(width: KScreenWidth-16.0*4.0, height: 175.0)// FSPagerView.automaticSize
return view
}()
lazy var indicatorView: YHPageControl = {
let pageControl = YHPageControl(frame: .zero)
let dotHeight = 3.0
pageControl.spacing = 2.0
pageControl.dotSize = CGSize(width: 5, height: dotHeight)
pageControl.selectedDotSize = CGSize(width: 12, height: dotHeight)
pageControl.numberOfPages = 0
pageControl.currentPage = 0
pageControl.dotColor = .init(hex: 0xD5DAE1)
pageControl.selectedDotColor = .mainTextColor
return pageControl
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
backgroundColor = .clear
self.addSubview(whiteContentView)
whiteContentView.addSubview(titleLabel)
whiteContentView.addSubview(bannerView)
whiteContentView.addSubview(indicatorView)
whiteContentView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(0)
make.bottom.equalTo(-16)
}
titleLabel.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(20)
make.height.equalTo(25)
}
bannerView.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(12)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(175)
}
indicatorView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.bottom.equalTo(-10)
make.height.equalTo(3)
}
}
}
extension YHPlanPolicyCarouselView: FSPagerViewDataSource, FSPagerViewDelegate {
public func numberOfItems(in pagerView: FSPagerView) -> Int {
return self.bannerArr.count
}
public func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell {
guard let cell = pagerView.dequeueReusableCell(withReuseIdentifier: YHPlanPolicyCarouselImageCell.cellReuseIdentifier, at: index) as? YHPlanPolicyCarouselImageCell else {
return FSPagerViewCell()
}
if index < bannerArr.count {
let model = bannerArr[index]
cell.model = model
}
return cell
}
// MARK: - FSPagerView Delegate
func pagerView(_ pagerView: FSPagerView, didSelectItemAt index: Int) {
pagerView.deselectItem(at: index, animated: true)
pagerView.scrollToItem(at: index, animated: true)
if 0 <= index, index < bannerArr.count {
let model = bannerArr[index]
clickBlock?(bannerArr, index)
return
}
}
func pagerViewWillEndDragging(_ pagerView: FSPagerView, targetIndex: Int) {
self.indicatorView.currentPage = targetIndex
}
func pagerViewDidEndScrollAnimation(_ pagerView: FSPagerView) {
self.indicatorView.currentPage = pagerView.currentIndex
}
}
//
// YHPlanProductListView.swift
// galaxy
//
// Created by Dufet on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanProductItemView: UIView {
var clickBlock: ((YHPlanProductModel) -> Void)?
var product: YHPlanProductModel = YHPlanProductModel() {
didSet {
titleLabel.text = product.title
descLabel.text = product.description
if let url = URL(string: product.img_url) {
iconImgV.sd_setImage(with: url, placeholderImage: UIImage(named: "plan_product_default"))
} else {
iconImgV.image = UIImage(named: "plan_product_default")
}
}
}
lazy var iconImgV: UIImageView = {
let v = UIImageView()
v.backgroundColor = .red
return v
}()
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.mainTextColor
lable.textAlignment = .left
lable.font = UIFont.PFSC_M(ofSize: 15)
lable.text = "XXXXXXXX"
return lable
}()
lazy var descLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0x8993A2)
lable.textAlignment = .left
lable.font = UIFont.PFSC_R(ofSize: 12)
lable.numberOfLines = 0
lable.text = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
return lable
}()
lazy var rightArrowIcon: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "form_right_arrow"))
return imageView
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func didItemViewClicked() {
clickBlock?(self.product)
}
func createUI() {
backgroundColor = .init(hex: 0xF8F9FB)
let tap = UITapGestureRecognizer(target: self, action: #selector(didItemViewClicked))
self.addGestureRecognizer(tap)
self.addSubview(iconImgV)
self.addSubview(titleLabel)
self.addSubview(descLabel)
self.addSubview(rightArrowIcon)
iconImgV.snp.makeConstraints { make in
make.left.top.bottom.equalToSuperview()
make.width.equalTo(iconImgV.snp.height)
}
titleLabel.snp.makeConstraints { make in
make.left.equalTo(iconImgV.snp.right).offset(8)
make.top.equalTo(8)
make.height.equalTo(22)
make.right.equalTo(rightArrowIcon.snp.left).offset(-8)
}
descLabel.snp.makeConstraints { make in
make.left.equalTo(iconImgV.snp.right).offset(8)
make.top.equalTo(titleLabel.snp.bottom).offset(2)
make.height.equalTo(18)
make.right.equalTo(rightArrowIcon.snp.left).offset(-8)
}
rightArrowIcon.snp.makeConstraints { make in
make.width.height.equalTo(16)
make.centerY.equalToSuperview()
make.right.equalTo(-8)
}
}
}
class YHPlanProductListView: UIView {
var clickBlock: ((YHPlanProductModel) -> Void)?
var products: [YHPlanProductModel] = [] {
didSet {
listView.removeSubviews()
var lastItemView: YHPlanProductItemView?
for (index, item) in products.enumerated() {
let v = YHPlanProductItemView(frame: .zero)
v.product = item
v.clickBlock = self.clickBlock
listView.addSubview(v)
v.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.height.equalTo(58.0)
if let last = lastItemView {
make.top.equalTo(last.snp.bottom).offset(8)
} else {
make.top.equalToSuperview()
}
if index == products.count-1 {
make.bottom.equalToSuperview()
}
}
lastItemView = v
}
self.setNeedsLayout()
self.layoutIfNeeded()
}
}
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0xAE6C32)
lable.textAlignment = .left
lable.font = UIFont.PFSC_M(ofSize: 13)
lable.text = "增购以下产品可提升生活联系"
return lable
}()
lazy var listView: UIView = {
let v = UIView()
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
backgroundColor = .clear
self.addSubview(titleLabel)
self.addSubview(listView)
titleLabel.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.height.equalTo(18)
}
listView.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(8)
make.left.right.bottom.equalToSuperview()
}
}
}
//
// YHPlanScoreCell.swift
// galaxy
//
// Created by Dufet on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanScoreCell: UITableViewCell {
static let cellReuseIdentifier = "YHPlanScoreCell"
var model = YHPlanValueChartInfo() {
didSet {
scoreView.model = model
}
}
lazy var scoreView: YHPlanScoreView = {
let v = YHPlanScoreView(frame: .zero)
return v
}()
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
func setupUI() {
selectionStyle = .none
backgroundColor = .clear
contentView.backgroundColor = .clear
self.contentView.addSubview(scoreView)
scoreView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
}
//
// YHPlanScoreChart.swift
// galaxy
//
// Created by Dufet on 2025/3/25.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanScoreDrawView: UIView {
let squareWidth = 180.0
var points: [CGPoint] = []
// 定义四个坐标点
var scores: [CGFloat] = [] {
didSet {
guard scores.count == 4 else { return } // 确保有四个点
let point1 = CGPoint(x: squareWidth/2.0, y: (1.0 - scores[0]/5.0)*squareWidth/2.0)
let point2 = CGPoint(x: (1.0 + scores[1]/5.0)*squareWidth/2.0, y: squareWidth/2.0)
let point3 = CGPoint(x: squareWidth/2.0, y: (1.0 + scores[2]/5.0)*squareWidth/2.0)
let point4 = CGPoint(x: (1.0 - scores[3]/5.0)*squareWidth/2.0, y: squareWidth/2.0)
self.points = [point1, point2, point3, point4]
setNeedsDisplay() // 坐标变化时触发重绘
if self.pointViews.count == points.count {
for (index, view) in self.pointViews.enumerated() {
view.removeFromSuperview()
// 微调点的位置
var point = self.points[index]
var gap = 1.0
if index == 0 || index == 3 {
gap = 1.0
} else {
gap = -1.0
}
if !isInteger(scores[index]) {
if index % 2 == 0 { // 垂直的两个点
point.y += gap
} else { // 水平的两个点
point.x += gap
}
}
view.center = point
self.addSubview(view)
}
}
}
}
func isInteger(_ value: CGFloat) -> Bool {
return value.truncatingRemainder(dividingBy: 1) == 0
}
lazy var pointViews: [YHPlanScorePointView] = {
let v1 = YHPlanScorePointView(frame: CGRect(x: 0, y: 0, width: 8, height: 8))
let v2 = YHPlanScorePointView(frame: CGRect(x: 0, y: 0, width: 8, height: 8))
let v3 = YHPlanScorePointView(frame: CGRect(x: 0, y: 0, width: 8, height: 8))
let v4 = YHPlanScorePointView(frame: CGRect(x: 0, y: 0, width: 8, height: 8))
return [v1, v2, v3, v4]
}()
override func draw(_ rect: CGRect) {
guard points.count == 4 else { return } // 确保有四个点
// 创建一个路径
let path = UIBezierPath()
// 移动到第一个点
path.move(to: points[0])
path.addLine(to: points[1])
path.addLine(to: points[2])
path.addLine(to: points[3])
path.close()
// 设置填充颜色为黑色,透明度50%
UIColor.init(hex: 0xAE6C32).withAlphaComponent(0.1).setFill()
path.fill()
// 设置线条颜色为红色
UIColor.init(hex: 0xAE6C32).setStroke()
path.lineWidth = 1.0
path.stroke()
}
}
class YHPlanScoreItemView: UIView {
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0x604127)
lable.textAlignment = .center
lable.font = UIFont.PFSC_B(ofSize: 14)
return lable
}()
lazy var scoreLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0xAE6C32)
lable.textAlignment = .center
lable.font = UIFont(name: "DINAlternate-Bold", size: 16)
return lable
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.addSubview(titleLabel)
self.addSubview(scoreLabel)
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.height.equalTo(20)
}
scoreLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.height.equalTo(16)
make.top.equalTo(titleLabel.snp.bottom).offset(2)
}
}
}
class YHPlanScorePointView: UIView {
lazy var bigCircleView: UIView = {
let v = UIView()
v.backgroundColor = UIColor.init(hex: 0xAE6C32, alpha: 0.2)
v.layer.cornerRadius = 4.0
return v
}()
lazy var smallCircleView: UIView = {
let v = UIView()
v.backgroundColor = UIColor.init(hex: 0xAE6C32)
v.layer.cornerRadius = 2.0
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.addSubview(bigCircleView)
self.addSubview(smallCircleView)
bigCircleView.snp.makeConstraints { make in
make.width.height.equalTo(8)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
}
smallCircleView.snp.makeConstraints { make in
make.width.height.equalTo(4)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
}
}
}
class YHPlanScoreChart: UIView {
let squareWidth = 180.0
lazy var squareImgV: UIImageView = {
let v = UIImageView()
v.image = UIImage(named: "plan_score_square")
return v
}()
lazy var circleBgImgV: UIImageView = {
let v = UIImageView()
v.image = UIImage(named: "plan_score_circle_bg")
return v
}()
lazy var drawView: YHPlanScoreDrawView = {
let v = YHPlanScoreDrawView(frame: .zero)
v.backgroundColor = .clear
return v
}()
lazy var careerItemView: YHPlanScoreItemView = {
let v = YHPlanScoreItemView(frame: .zero)
v.titleLabel.text = "工作"
v.scoreLabel.text = "0"
return v
}()
lazy var lifeItemView: YHPlanScoreItemView = {
let v = YHPlanScoreItemView(frame: .zero)
v.titleLabel.text = "生活"
v.scoreLabel.text = "0"
return v
}()
lazy var investItemView: YHPlanScoreItemView = {
let v = YHPlanScoreItemView(frame: .zero)
v.titleLabel.text = "投资"
v.scoreLabel.text = "0"
return v
}()
lazy var stayItemView: YHPlanScoreItemView = {
let v = YHPlanScoreItemView(frame: .zero)
v.titleLabel.text = "逗留"
v.scoreLabel.text = "0"
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func updateScores(_ scores: [CGFloat]) {
guard scores.count == 4 else { return } // 确保有四个点
self.drawView.scores = scores
careerItemView.scoreLabel.text = "\(scores[0])"
lifeItemView.scoreLabel.text = "\(scores[1])"
investItemView.scoreLabel.text = "\(scores[2])"
stayItemView.scoreLabel.text = "\(scores[3])"
}
func createUI() {
self.addSubview(circleBgImgV)
self.addSubview(squareImgV)
self.addSubview(careerItemView)
self.addSubview(lifeItemView)
self.addSubview(investItemView)
self.addSubview(stayItemView)
squareImgV.addSubview(drawView)
squareImgV.snp.makeConstraints { make in
make.height.width.equalTo(squareWidth)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
}
circleBgImgV.snp.makeConstraints { make in
make.height.width.equalTo(228)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview()
}
drawView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
careerItemView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.bottom.equalTo(squareImgV.snp.top).offset(-5)
make.height.equalTo(38)
make.width.equalTo(40)
}
lifeItemView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(squareImgV.snp.right).offset(5)
make.height.equalTo(38)
make.width.equalTo(40)
}
investItemView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(squareImgV.snp.bottom).offset(5)
make.height.equalTo(38)
make.width.equalTo(40)
}
stayItemView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalTo(squareImgV.snp.left).offset(-5)
make.height.equalTo(38)
make.width.equalTo(40)
}
}
}
//
// YHPlanScoreLevelTextView.swift
// galaxy
//
// Created by Dufet on 2025/3/28.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanScoreLevelTextItemView: UIView {
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = .mainTextColor
lable.textAlignment = .left
lable.font = UIFont.PFSC_M(ofSize: 15)
lable.text = ""
return lable
}()
lazy var descLabel: UILabel = {
let lable = UILabel()
lable.textColor = .init(hex: 0x6A7586)
lable.textAlignment = .left
lable.font = UIFont.PFSC_R(ofSize: 13)
lable.numberOfLines = 0
lable.text = ""
return lable
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
// self.backgroundColor = .init(hex: 0x000000, alpha: 0.7)
self.addSubview(titleLabel)
self.addSubview(descLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(20)
make.top.equalTo(24)
make.height.equalTo(20)
}
descLabel.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.top.equalTo(titleLabel.snp.bottom).offset(4)
make.bottom.equalTo(0)
}
}
}
class YHPlanScoreLevelTextView: UIView {
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 6.0
v.clipsToBounds = true
return v
}()
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = .mainTextColor
lable.textAlignment = .center
lable.font = UIFont.PFSC_M(ofSize: 17)
lable.text = "续签评估等级说明"
return lable
}()
lazy var lineView: UIView = {
let v = UIView()
v.backgroundColor = .init(hex: 0xE9ECF0)
return v
}()
lazy var closeBtn: UIButton = {
let btn = UIButton()
btn.setImage(UIImage(named: "plan_score_level_close"), for: .normal)
btn.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
btn.YH_clickEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
return btn
}()
lazy var item1View: YHPlanScoreLevelTextItemView = {
let v = YHPlanScoreLevelTextItemView(frame: .zero)
v.titleLabel.text = "强"
v.descLabel.text = "与香港有强联系(长期居住、稳定工作/业务、家庭在港、子女本地就读等,续期资料完整度高) "
return v
}()
lazy var item2View: YHPlanScoreLevelTextItemView = {
let v = YHPlanScoreLevelTextItemView(frame: .zero)
v.titleLabel.text = "中"
v.descLabel.text = "与香港有一定联系(有生活/工作联系但关联不是非常强,能提供个别续期所需的资料)"
return v
}()
lazy var item3View: YHPlanScoreLevelTextItemView = {
let v = YHPlanScoreLevelTextItemView(frame: .zero)
v.titleLabel.text = "弱"
v.descLabel.text = "与香港联系较弱(极少在港居住、无稳定工作或工作关联弱、无法证明贡献等,基本无法提供相应的续期资料) "
return v
}()
static func alertView() -> YHPlanScoreLevelTextView {
let v = YHPlanScoreLevelTextView(frame: UIScreen.main.bounds)
return v
}
@objc func show() {
UIApplication.shared.yhKeyWindow()?.addSubview(self)
}
@objc func dismiss() {
DispatchQueue.main.async {
self.removeFromSuperview()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.backgroundColor = .init(hex: 0x000000, alpha: 0.7)
self.addSubview(whiteContentView)
whiteContentView.addSubview(titleLabel)
whiteContentView.addSubview(lineView)
whiteContentView.addSubview(closeBtn)
whiteContentView.addSubview(item1View)
whiteContentView.addSubview(item2View)
whiteContentView.addSubview(item3View)
whiteContentView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.bottom.equalTo(6)
make.height.equalTo(450)
}
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(16)
make.height.equalTo(24)
}
lineView.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.top.equalTo(titleLabel.snp.bottom).offset(12)
make.height.equalTo(0.5)
}
closeBtn.snp.makeConstraints { make in
make.width.height.equalTo(24)
make.centerY.equalTo(titleLabel)
make.right.equalTo(-20)
}
item1View.snp.makeConstraints { make in
make.top.equalTo(lineView.snp.bottom).offset(0)
make.left.right.equalToSuperview()
}
item2View.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(item1View.snp.bottom).offset(3)
}
item3View.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(item2View.snp.bottom).offset(3)
}
}
}
//
// YHPlanScoreView.swift
// galaxy
//
// Created by Dufet on 2025/3/25.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanScoreView: UIView {
var model = YHPlanValueChartInfo() {
didSet {
let score1 = CGFloat(Double(model.work_score) ?? 0.0)
let score2 = CGFloat(Double(model.live_score) ?? 0.0)
let score3 = CGFloat(Double(model.invest_score) ?? 0.0)
let score4 = CGFloat(Double(model.stay_time_score) ?? 0.0)
chartView.updateScores([score1, score2, score3, score4])
statusLabel.text = model.level_name
descLabel.text = model.result
}
}
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 6.0
v.clipsToBounds = true
return v
}()
lazy var titleLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0x6A7586)
lable.textAlignment = .center
lable.font = UIFont.PFSC_R(ofSize: 13)
lable.text = "您的续签评估等级为"
return lable
}()
lazy var questionBtn: UIButton = {
let btn = UIButton()
btn.setImage(UIImage(named: "plan_score_level_question"), for: .normal)
btn.YH_clickEdgeInsets = UIEdgeInsets(top: 30, left: 30, bottom: 30, right: 30)
btn.addTarget(self, action: #selector(didQuestionBtnClicked), for: .touchUpInside)
return btn
}()
lazy var statusLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.mainTextColor
lable.textAlignment = .center
lable.font = UIFont(name: "AlibabaPuHuiTi_3_95_ExtraBold", size: 24)
lable.text = ""
return lable
}()
lazy var statusLineView: UIView = {
let v = UIView()
v.backgroundColor = .init(hex: 0xE9ECF0)
return v
}()
lazy var chartView: YHPlanScoreChart = {
let v = YHPlanScoreChart(frame: .zero)
return v
}()
lazy var descLabel: UILabel = {
let lable = UILabel()
lable.textColor = UIColor.init(hex: 0x6A7586)
lable.textAlignment = .left
lable.font = UIFont.PFSC_R(ofSize: 13)
lable.numberOfLines = 0
return lable
}()
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func didQuestionBtnClicked() {
YHPlanScoreLevelTextView.alertView().show()
}
func createUI() {
backgroundColor = .clear
self.addSubview(whiteContentView)
whiteContentView.addSubview(titleLabel)
whiteContentView.addSubview(questionBtn)
whiteContentView.addSubview(statusLineView)
whiteContentView.addSubview(statusLabel)
whiteContentView.addSubview(chartView)
whiteContentView.addSubview(descLabel)
whiteContentView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(0)
make.bottom.equalTo(-16)
}
titleLabel.snp.makeConstraints { make in
make.height.equalTo(18)
make.top.equalTo(20)
make.centerX.equalToSuperview().offset(-8)
}
questionBtn.snp.makeConstraints { make in
make.width.height.equalTo(14)
make.centerY.equalTo(titleLabel)
make.left.equalTo(titleLabel.snp.right).offset(2)
}
statusLineView.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(8)
make.bottom.equalTo(statusLabel.snp.bottom).offset(-2)
make.centerX.equalToSuperview()
}
statusLabel.snp.makeConstraints { make in
make.height.equalTo(34)
make.top.equalTo(titleLabel.snp.bottom).offset(8)
make.centerX.equalToSuperview()
}
chartView.snp.makeConstraints { make in
make.top.equalTo(statusLineView.snp.bottom).offset(20)
make.left.right.equalToSuperview()
make.height.equalTo(268)
}
descLabel.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(chartView.snp.bottom).offset(20)
make.bottom.equalTo(-20)
}
}
}
//
// YHPlanShareImageCellCollectionViewCell.swift
// galaxy
//
// Created by Dufet on 2025/3/31.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanShareImageCell: UICollectionViewCell {
static let cellReuseIdentifier = "YHPlanShareImageCell"
var model: YHPlanPolicyImageInfo = YHPlanPolicyImageInfo() {
didSet {
if let url = URL(string: model.model.image_poster) {
imgView.kf.setImage(with: url, placeholder: UIImage(named: "global_default_image"))
} else {
imgView.image = UIImage(named: "global_default_image")
}
imgView.snp.remakeConstraints { make in
make.top.bottom.equalToSuperview()
make.centerX.equalToSuperview()
make.width.equalTo(imgView.snp.height).multipliedBy(model.width/model.height)
}
self.setNeedsLayout()
self.layoutIfNeeded()
}
}
lazy var imgContentView: UIView = {
let v = UIView()
v.backgroundColor = .clear
v.clipsToBounds = true
return v
}()
lazy var imgView: UIImageView = {
let v = UIImageView()
v.contentMode = .scaleAspectFit
return v
}()
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
private func setupUI() {
contentView.addSubview(imgContentView)
imgContentView.addSubview(imgView)
imgContentView.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.top.bottom.equalToSuperview()
}
imgView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.centerX.equalToSuperview()
make.width.equalTo(imgView.snp.height).multipliedBy(1.0)
}
}
}
//
// YHPlanShareView.swift
// galaxy
//
// Created by Dufet on 2025/3/29.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanShareView: UIView {
let wechatBtnTag = 9527
let copyLinkTag = 9528
let saveImgTag = 9529
let cancelTag = 9530
var type: YHPlanShareBgType = .link {
didSet {
if type == .link {
copyLinkBtn.isHidden = false
saveBtn.isHidden = true
} else if type == .pdf {
copyLinkBtn.isHidden = true
saveBtn.isHidden = false
}
}
}
var clickBlock: ((YHPlanShareBgType, YHPlanShareItemButtonType) -> Void)?
lazy var whiteContentView: UIView = {
let v = UIView()
v.backgroundColor = .white
v.layer.cornerRadius = 12.0
v.clipsToBounds = true
return v
}()
lazy var cancelBtn: UIButton = {
let btn = UIButton()
btn.tag = cancelTag
btn.backgroundColor = .init(hex: 0xF5F6F8)
btn.setTitle("取消", for: .normal)
btn.setTitleColor(.mainTextColor, for: .normal)
btn.titleLabel?.font = .PFSC_M(ofSize: 16)
btn.layer.cornerRadius = 3.0
btn.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return btn
}()
lazy var wechatBtn: YHPlanShareItemButton = {
let v = YHPlanShareItemButton()
v.tag = wechatBtnTag
v.textLabel.text = "微信"
v.iconImgV.image = UIImage(named: "plan_share_wechat")
v.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return v
}()
lazy var copyLinkBtn: YHPlanShareItemButton = {
let v = YHPlanShareItemButton()
v.tag = copyLinkTag
v.textLabel.text = "复制链接"
v.iconImgV.image = UIImage(named: "plan_share_copy")
v.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return v
}()
lazy var saveBtn: YHPlanShareItemButton = {
let v = YHPlanShareItemButton()
v.tag = saveImgTag
v.textLabel.text = "保存PDF"
v.iconImgV.image = UIImage(named: "plan_share_save")
v.isHidden = true
v.addTarget(self, action: #selector(didFunctionBtnClicked(_:)), for: .touchUpInside)
return v
}()
@objc func didFunctionBtnClicked(_ sender: UIButton) {
if sender.tag == wechatBtnTag {
clickBlock?(type, .wechat)
} else if sender.tag == copyLinkTag {
clickBlock?(type, .copyLink)
} else if sender.tag == saveImgTag {
clickBlock?(type, .saveImg)
} else if sender.tag == cancelTag {
clickBlock?(type, .cancel)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createUI() {
self.addSubview(whiteContentView)
whiteContentView.addSubview(wechatBtn)
whiteContentView.addSubview(copyLinkBtn)
whiteContentView.addSubview(saveBtn)
whiteContentView.addSubview(cancelBtn)
whiteContentView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
copyLinkBtn.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(74)
make.top.equalTo(20)
make.left.equalTo(self.snp.centerX).offset(35)
}
saveBtn.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(74)
make.center.equalTo(copyLinkBtn)
}
wechatBtn.snp.makeConstraints { make in
make.width.equalTo(64)
make.height.equalTo(74)
make.top.equalTo(20)
make.right.equalTo(self.snp.centerX).offset(-35)
}
cancelBtn.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(46)
make.top.equalTo(copyLinkBtn.snp.bottom).offset(20)
}
}
}
//
// YHSurveyTableViewCell.swift
// galaxy
//
// Created by alexzzw on 2025/3/26.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import AttributedString
import UIKit
class YHSurveyTableViewCell: YHResignDocumentCell {
static let cellReuseIdentifier = "YHSurveyTableViewCell"
// MARK: - Question Type
enum QuestionType {
case singleChoice // 单选 (圆形按钮)
case multipleChoice // 多选 (方框按钮)
}
// MARK: - UI Elements
private lazy var questionLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_M(ofSize: 15)
label.numberOfLines = 0
label.textColor = .mainTextColor
return label
}()
private lazy var optionsStackView: UIStackView = {
let stack = UIStackView()
stack.axis = .vertical
stack.spacing = 16
stack.distribution = .fillProportionally
return stack
}()
private lazy var infoFailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 12)
label.textColor = .failColor
label.text = "请选择"
label.isHidden = true
return label
}()
// MARK: - Properties
var optionSelected: ((Int) -> Void)?
private var questionType: QuestionType = .singleChoice
// MARK: - Lifecycle
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Setup
private func setupUI() {
updateCellCorner(.single)
subContainerView.addSubview(questionLabel)
subContainerView.addSubview(optionsStackView)
subContainerView.addSubview(infoFailLabel)
questionLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(24)
make.left.equalToSuperview().offset(18)
make.right.equalToSuperview().offset(-18)
}
optionsStackView.snp.makeConstraints { make in
make.top.equalTo(questionLabel.snp.bottom).offset(16)
make.left.equalToSuperview().offset(28)
make.right.equalToSuperview().offset(-18)
make.bottom.equalToSuperview().offset(-24).priority(.high)
}
infoFailLabel.snp.makeConstraints { make in
make.left.equalTo(questionLabel)
make.right.lessThanOrEqualToSuperview().offset(-18)
make.bottom.equalToSuperview().offset(-24).priority(.high)
}
infoFailLabel.isHidden = true
}
// MARK: - Configuration
func configure(with question: String, isRequired: Bool = true, options: [String], selectedIndices: [Int], type: QuestionType = .singleChoice, needShowFailButton: Bool = false) {
let questionAttr: ASAttributedString = .init("\(question)", .font(UIFont.PFSC_M(ofSize: 15)), .foreground(UIColor.mainTextColor))
if isRequired {
let starAttr: ASAttributedString = .init("*", .font(UIFont.PFSC_M(ofSize: 15)), .foreground(UIColor.failColor))
questionLabel.attributed.text = starAttr + questionAttr
} else {
questionLabel.attributed.text = questionAttr
}
questionType = type
// Clear previous options
optionsStackView.arrangedSubviews.forEach { $0.removeFromSuperview() }
// Add new options
for (index, option) in options.enumerated() {
let optionView = createOptionView(text: option, isSelected: selectedIndices.contains(index), index: index)
optionsStackView.addArrangedSubview(optionView)
}
updateFailState(needShowFailButton)
}
private func updateFailState(_ needShowFailButton: Bool = false) {
if needShowFailButton {
optionsStackView.snp.remakeConstraints { make in
make.top.equalTo(questionLabel.snp.bottom).offset(16)
make.left.equalToSuperview().offset(28)
make.right.equalToSuperview().offset(-18)
}
infoFailLabel.snp.remakeConstraints { make in
make.top.equalTo(optionsStackView.snp.bottom).offset(8)
make.left.equalTo(questionLabel)
make.right.lessThanOrEqualToSuperview().offset(-18)
make.bottom.equalToSuperview().offset(-24).priority(.high)
}
infoFailLabel.isHidden = false
} else {
optionsStackView.snp.remakeConstraints { make in
make.top.equalTo(questionLabel.snp.bottom).offset(16)
make.left.equalToSuperview().offset(28)
make.right.equalToSuperview().offset(-18)
make.bottom.equalToSuperview().offset(-24).priority(.high)
}
infoFailLabel.snp.remakeConstraints { make in
make.left.equalTo(questionLabel)
make.right.lessThanOrEqualToSuperview().offset(-18)
make.bottom.equalToSuperview().offset(-24).priority(.high)
}
infoFailLabel.isHidden = true
}
}
private func createOptionView(text: String, isSelected: Bool, index: Int) -> UIView {
let item = YHSurveyQuestionItemView()
item.tag = index
item.addTarget(self, action: #selector(optionButtonTapped(_:)), for: .touchUpInside)
item.setup(text: text, isSelected: isSelected)
return item
}
// MARK: - Actions
@objc private func optionButtonTapped(_ sender: UIControl) {
optionsStackView.arrangedSubviews.enumerated().forEach { index, subView in
guard let item = subView as? YHSurveyQuestionItemView else {
return
}
item.updateState(isSelected: sender.tag == index)
}
optionSelected?(sender.tag)
}
}
class YHSurveyQuestionItemView: UIControl {
private lazy var iconView: UIImageView = {
let imageView = UIImageView()
return imageView
}()
private lazy var contentLabel: UILabel = {
let label = UILabel()
label.textColor = .mainTextColor
label.font = .PFSC_R(ofSize: 14)
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(iconView)
addSubview(contentLabel)
iconView.snp.makeConstraints { make in
make.left.centerY.equalToSuperview()
make.width.height.equalTo(14)
}
contentLabel.snp.makeConstraints { make in
make.left.equalTo(iconView.snp.right).offset(8)
make.right.top.bottom.equalToSuperview()
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup(text: String, isSelected: Bool) {
updateState(isSelected: isSelected)
contentLabel.text = text
}
func updateState(isSelected: Bool) {
iconView.image = isSelected ? UIImage(named: "plan_question_checked") : UIImage(named: "plan_question_unchecked")
}
}
//
// YHPlanViewModel.swift
// galaxy
//
// Created by Dufet on 2025/3/25.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHPlanViewModel: YHBaseViewModel {
var planListModel: YHPlanListModel = YHPlanListModel()
func requetResignPlanInfo(callBackBlock: @escaping (_ success: Bool, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.ResignPlan.planlistApi
_ = YHNetRequest.getRequest(url: strUrl) { [weak self] json, _ in
guard let self = self else { return }
// 1. json字符串 转 对象
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let result = YHPlanListModel.deserialize(from: dic) else {
callBackBlock(false, nil)
return
}
self.planListModel = result
callBackBlock(true, nil)
} else {
// self.activityTravelModel = nil
let error: YHErrorModel = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg)
callBackBlock(false, error)
}
} failBlock: { err in
// self.activityTravelModel = nil
callBackBlock(false, err)
}
}
func requetPDFUrl(_ sourceUrl: String, callBackBlock: @escaping ((String) -> Void)) {
let strUrl = YHBaseUrlManager.shared.curOssURL() + "htmlToPdf/create"
let params: [String: Any] = ["url": sourceUrl]
_ = YHNetRequest.postRequest(url: strUrl, params: params) { [weak self] json, _ in
// 1. json字符串 转 对象
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let url = dic["pdf_url"] as? String else {
callBackBlock("")
return
}
callBackBlock(url)
} else {
let error: YHErrorModel = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg)
callBackBlock("")
}
} failBlock: { _ in
callBackBlock("")
}
}
}
//
// YHSurveyViewModel.swift
// galaxy
//
// Created by alexzzw on 2025/3/28.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHSurveyViewModel: YHBaseViewModel {
var surveyContainerModel: YHSurveyContainerModel?
var responseModel: YHSurveyResponseModel?
var planState: YHSurveyRenewalPlanState?
}
extension YHSurveyViewModel {
/*
问卷内容
*/
func getSurveyContent(callback: @escaping (_ contentModel: YHSurveyContainerModel?, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.Survey.surveyContent
_ = YHNetRequest.getRequest(url: strUrl, params: [:]) { [weak self] json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let resultModel = YHSurveyContainerModel.deserialize(from: dic) else {
let err = YHErrorModel(errorCode: YHErrorCode.dictParseError.rawValue, errorMsg: YHErrorCode.dictParseError.description())
callback(nil, err)
return
}
self?.surveyContainerModel = resultModel
callback(resultModel, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callback(nil, err)
}
} failBlock: { err in
callback(nil, err)
}
}
/*
问卷提交
*/
func submitSurveyAnswer(requestModel: YHSurveySubmitRequestModel, callBackBlock: @escaping (_ responseModel: YHSurveyResponseModel?, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.Survey.submitSurveyAnswer
let answerDetails: [[String: Any]] = requestModel.answerDetails.compactMap({ item in
let optionExtra: [[String: Any]] = item.optionExtra.compactMap { extra in
["option_id": extra.optionId, "extra": extra.extra, "title": extra.title, "option_key": extra.optionKey]
}
return ["question_id": item.questionId, "question_type": item.questionType, "text": "", "title": item.title, "question_key": item.questionKey, "option_extra": optionExtra, "file_list": []]
})
let params: [String: Any] = ["survey_id": requestModel.surveyId, "answer_details": answerDetails]
_ = YHNetRequest.postRequest(url: strUrl, params: params) { [weak self] json, _ in
// 1. json字符串 转 对象
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let resultModel = YHSurveyResponseModel.deserialize(from: dic) else {
let err = YHErrorModel(errorCode: YHErrorCode.dictParseError.rawValue, errorMsg: YHErrorCode.dictParseError.description())
callBackBlock(nil, err)
return
}
self?.responseModel = resultModel
callBackBlock(resultModel, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callBackBlock(nil, err)
}
} failBlock: { err in
callBackBlock(nil, err)
}
}
/*
问卷是否生成方案
*/
func getRenewalPlanState(callback: @escaping (_ planState: YHSurveyRenewalPlanState?, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.Survey.getRenewalPlanState
_ = YHNetRequest.getRequest(url: strUrl, params: [:]) { [weak self] json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let resultModel = YHSurveyRenewalPlanState.deserialize(from: dic) else {
let err = YHErrorModel(errorCode: YHErrorCode.dictParseError.rawValue, errorMsg: YHErrorCode.dictParseError.description())
callback(nil, err)
return
}
self?.planState = resultModel
callback(resultModel, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callback(nil, err)
}
} failBlock: { err in
callback(nil, err)
}
}
/*
问卷首页是否生成方案
*/
func getRenewalPlanGenerated(callback: @escaping (_ planState: YHSurveyRenewalPlanState?, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.Survey.getRenewalPlanGenerated
_ = YHNetRequest.getRequest(url: strUrl, params: [:]) { [weak self] json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let resultModel = YHSurveyRenewalPlanState.deserialize(from: dic) else {
let err = YHErrorModel(errorCode: YHErrorCode.dictParseError.rawValue, errorMsg: YHErrorCode.dictParseError.description())
callback(nil, err)
return
}
self?.planState = resultModel
callback(resultModel, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callback(nil, err)
}
} failBlock: { err in
callback(nil, err)
}
}
}
......@@ -123,4 +123,11 @@ extension UIColor {
UIGraphicsEndImageContext()
return image!
}
static func randomColor() -> UIColor {
let red = CGFloat(arc4random_uniform(256)) / 255.0
let green = CGFloat(arc4random_uniform(256)) / 255.0
let blue = CGFloat(arc4random_uniform(256)) / 255.0
return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
}
......@@ -752,4 +752,20 @@ class YHAllApiName {
}
// 续签方案
struct ResignPlan {
static let planlistApi = "super-app/renewal/advice/get-renewal-plan"
static let productListApi = "super-app/renewal/advice/get-renewal-product-list"
static let getRate = "super-app/renewal/advice/get-year-and-pass-rate"
static let store = "super-app/presale/app/shop-cart/store"
}
// 问卷
struct Survey {
static let surveyContent = "super-app/renewal/advice/survey-content"
static let submitSurveyAnswer = "super-app/renewal/advice/submit-survey-answer"
static let getRenewalPlanState = "super-app/renewal/advice/get-renewal-plan-is-generate"
static let getRenewalPlanGenerated = "super-app/renewal/advice/get-renewal-plan-is-generated"
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "下保存图片@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "下保存图片@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "no_data_bg_plan@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "no_data_bg_plan@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "invitation_with_gifts_share_link@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "invitation_with_gifts_share_link@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "invitation_with_gifts_share_plan@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "invitation_with_gifts_share_plan@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "share_item_white@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "share_item_white@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "24pt导航栏@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "24pt导航栏@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "make_plan_down@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "make_plan_down@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "make_plan_left@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "make_plan_left@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "make_plan_next@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "make_plan_next@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "make_plan_normal@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "make_plan_normal@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "make_plan_select@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "make_plan_select@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "make_plan_up@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "make_plan_up@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nav_black_24@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nav_black_24@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "头部背景@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "头部背景@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "plan_head_logo@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "plan_head_logo@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "radio_on(2).png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "radio_on(2) 1.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "BG@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "BG@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "标题.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "24pt导航栏@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "24pt导航栏@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "plan_privacy_checked@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "plan_privacy_checked@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "plan_privacy_unchecked@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "plan_privacy_unchecked@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "缺省图@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "缺省图@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "plan_question_checked@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "plan_question_checked@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "提交成功@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "提交成功@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "问卷头图-新客户@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "问卷头图-新客户@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "问卷头图-老客户@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "问卷头图-老客户@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "plan_question_unchecked@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "plan_question_unchecked@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "背景颜色@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "背景颜色@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame 2033196960@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame 2033196960@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "16pt@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "16pt@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "中间图形@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "中间图形@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "复制链接@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "复制链接@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "BG@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "BG@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "分享链接@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "分享链接@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "分享PDF@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "分享PDF@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "保存图片@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "保存图片@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_wxhy@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_wxhy@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "plan_survey_match_failure@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "plan_survey_match_failure@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "匹配完成@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "匹配完成@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "survey_share_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "survey_share_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
......@@ -118,6 +118,8 @@
<string>DIN Alternate Bold</string>
<string>AlimamaShuHeiTi-Bold.ttf</string>
<string>AlibabaPuHuiTi-Bold.ttf</string>
<string>D-DIN-PRO-500-Medium.otf</string>
<string>D-DIN-PRO-700-Bold.otf</string>
</array>
<key>UIBackgroundModes</key>
<array>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
{"v":"5.6.10","fr":25,"ip":0,"op":43,"w":1000,"h":680,"nm":"撒花效果","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":0,"s":[530.465,373.055,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23,"s":[561.465,63.055,0]}],"ix":2},"a":{"a":0,"k":[601.465,263.055,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"t":21,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.522,0.21],[-1.075,-3.337],[-3.103,0.154],[-1.242,2.116]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-12.688,1.516],[-6.154,10.492],[12.689,-1.323],[6.201,-10.492]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[601.465,263.055],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":452,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":5,"s":[529.009,372.252,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28,"s":[658.009,77.252,0]}],"ix":2},"a":{"a":0,"k":[698.009,277.252,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"t":26,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.896,-1.402],[-6.557,-6.075],[-4.309,10.038],[1.132,4.029]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-19.986,-1.771],[-12.873,20.688],[19.985,-3.549],[5.947,-20.688]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[698.009,277.252],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":457,"st":5,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[528.858,374.143,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[527.858,95.143,0]}],"ix":2},"a":{"a":0,"k":[567.858,295.143,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.115,-0.799],[-0.275,-1.986],[-1.951,1.007],[1.819,-0.426]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.706,0.62],[-2.357,4.999],[5.707,-0.356],[1.128,-4.573]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.839215755463,0.713725507259,0.223529428244,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[567.858,294.943],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":3,"s":[530.501,372.464,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[504.501,131.464,0]}],"ix":2},"a":{"a":0,"k":[544.501,331.464,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"t":24,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.045,6.753],[5.622,-0.982],[-7.326,-0.553],[-0.865,3.543]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.811,-8.174],[-12.756,-1.994],[3.515,8.174],[12.757,-0.252]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[544.501,331.464],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 8 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[531.457,374.575,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[577.457,193.575,0]}],"ix":2},"a":{"a":0,"k":[617.457,393.575,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-11.391,12.056],[-24.8,-9.092],[11.965,-1.29],[5.028,15.834]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.853,-22.546],[27.175,5.699],[2.023,22.546],[-27.175,-11.811]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[617.457,393.575],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 9 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[530.397,375.618,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[662.397,162.618,0]}],"ix":2},"a":{"a":0,"k":[702.397,362.618,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.601,-0.354],[-1.263,-1.365],[0.316,0.709],[0.588,1.696]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.385,0.176],[-1.684,4.73],[4.069,-1.544],[0.167,-4.73]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.282352954149,0.796078503132,0.854902029037,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[702.549,362.618],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 10 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":1,"s":[532.488,375.344,0],"to":[0,0,0],"ti":[0,0,0]},{"t":24,"s":[682.488,114.344,0]}],"ix":2},"a":{"a":0,"k":[722.488,314.344,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":1,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"t":22,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.501,-1.762],[-0.729,0.387],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.261,1.322],[-1.076,3.213],[3.261,-1.595],[0.585,-3.213]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.282352954149,0.796078503132,0.854902029037,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[722.488,314.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":453,"st":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 11 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":6,"s":[531.07,376.353,0],"to":[0,0,0],"ti":[0,0,0]},{"t":29,"s":[520.07,180.353,0]}],"ix":2},"a":{"a":0,"k":[560.07,380.353,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":27,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.392,-1.677],[-0.376,-2.728],[7.676,-3.363],[-5.214,2.358]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.975,-2.81],[8.817,4.487],[-10.958,3.852],[-5.761,-4.339]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[560.061,380.281],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":458,"st":6,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 12 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[530.795,372.09,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[488.795,161.09,0]}],"ix":2},"a":{"a":0,"k":[528.795,361.09,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.884,-0.842],[-0.316,-3.28],[-5.201,-3.033],[-1.273,1.35]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.816,-1.962],[-5.624,2.557],[4.796,2.803],[5.94,-1.162]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.839215755463,0.713725507259,0.223529428244,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[528.648,360.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 13 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":9,"s":[531.407,376.454,0],"to":[0,0,0],"ti":[0,0,0]},{"t":32,"s":[445.407,156.454,0]}],"ix":2},"a":{"a":0,"k":[485.407,356.454,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":26,"s":[100,100,100]},{"t":30,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.416,-0.484],[1.183,-0.813],[-1.687,-1.762],[-0.525,1.811]],"o":[[0,0],[0.208,-0.579],[0.296,0.371],[0,0]],"v":[[-2.783,-2.783],[-4.016,1.063],[1.462,2.896],[4.016,-0.488]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[485.407,356.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9,"op":461,"st":9,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 14 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":7,"s":[532.641,374.231,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30,"s":[430.641,196.231,0]}],"ix":2},"a":{"a":0,"k":[470.641,396.231,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"t":28,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.721,-0.534],[0,0],[1.987,-1.418]],"o":[[0,0],[0,0],[0,0],[-0.595,0.027]],"v":[[-7.902,-4.74],[0.671,-7.653],[7.902,5.594],[3.205,8.159]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[470.641,396.006],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":459,"st":7,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Layer 15 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":5,"s":[532.854,375.051,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28,"s":[425.854,244.051,0]}],"ix":2},"a":{"a":0,"k":[465.854,444.051,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"t":26,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.28,-4.682],[-4.782,-2.623],[-3.339,7.673],[1.064,3.035]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-13.797,0.999],[-5.734,15.954],[13.798,-5.749],[1.504,-15.954]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[465.854,444.051],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":457,"st":5,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 16 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":8,"s":[532.479,376.824,0],"to":[0,0,0],"ti":[0,0,0]},{"t":31,"s":[352.479,275.824,0]}],"ix":2},"a":{"a":0,"k":[392.479,475.824,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"t":29,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-9.123,0.288],[0,0],[1.49,-3.119]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-21.372,-13.376],[2.079,-21.254],[21.371,15.608],[8.518,21.254]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176470588,0.823529411765,0.705882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[392.479,475.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":460,"st":8,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Layer 17 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":6,"s":[534.422,374.131,0],"to":[0,0,0],"ti":[0,0,0]},{"t":29,"s":[275.422,186.131,0]}],"ix":2},"a":{"a":0,"k":[315.422,386.131,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":27,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.281,12.135],[-6.153,6.955],[-15.23,-5.485],[7.853,0.054]],"o":[[-0.134,-0.379],[0,0],[0,0],[0,0]],"v":[[-20.091,-8.788],[-1.307,-16.752],[20.225,4.201],[1.569,16.698]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[315.355,386.158],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":458,"st":6,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 18 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[530.565,375.904,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[276.565,222.904,0]}],"ix":2},"a":{"a":0,"k":[316.565,422.904,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.982,4.817],[-2.33,3.337],[-2.297,-1.655],[3.033,-4.872]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.296,1.411],[2.697,-7.026],[8.296,-0.888],[-1.68,7.026]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039215686,0.494117647059,0.462745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[316.565,422.904],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Layer 19 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[533.048,374.573,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[392.048,163.573,0]}],"ix":2},"a":{"a":0,"k":[432.048,363.573,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.677,4.066],[-8.688,-2.696],[5.251,-2.275],[2.679,0.772]],"o":[[0,0],[-0.196,0.595],[0,0],[0,0]],"v":[[-3.12,-10.821],[10.107,0.791],[3.818,10.821],[-10.107,-2.404]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898046875,0.493605041504,0.462768225576,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[432.048,363.573],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Layer 20 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":6,"s":[529.97,373.262,0],"to":[0,0,0],"ti":[0,0,0]},{"t":29,"s":[202.97,219.262,0]}],"ix":2},"a":{"a":0,"k":[242.97,419.262,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":27,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.315,2.728],[-4.815,9.397],[-1.556,-6.458],[1.417,-2.909]],"o":[[0,0],[0.64,0.343],[0,0],[0,0]],"v":[[-13.066,1.572],[2.849,-11.238],[13.066,-2.049],[-4.834,11.238]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[242.97,419.262],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":458,"st":6,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Layer 21 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[532.556,374.122,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[32.556,207.122,0]}],"ix":2},"a":{"a":0,"k":[72.556,407.122,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.757,-3.782],[-2.049,-5.655],[-4.899,-1.034],[3.048,3.165]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.999,1.637],[-3.456,6.721],[8.999,0.21],[4.423,-6.721]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.556,407.122],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Layer 22 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[531.15,374.131,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[231.15,591.131,0]}],"ix":2},"a":{"a":0,"k":[271.15,791.131,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.51,-5.151],[-10.189,6.098],[1.831,2.651],[3.914,-1.655]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.547,26.709],[22.167,-14.913],[11.926,-26.709],[-22.167,3.769]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[271.15,791.131],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Layer 23 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":6,"s":[532.417,368.53,0],"to":[0,0,0],"ti":[0,0,0]},{"t":29,"s":[206.417,491.53,0]}],"ix":2},"a":{"a":0,"k":[246.417,691.53,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":27,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.473,3.051],[-6.11,0.88],[0,0],[0,0],[-1.773,-1.129],[3.167,-2.228]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.616,-4.623],[2.28,-9.577],[2.28,-9.577],[2.28,-9.577],[6.616,6.501],[-2.357,9.577]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[246.417,691.53],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":458,"st":6,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Layer 24 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[529.771,374.51,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[200.771,478.51,0]}],"ix":2},"a":{"a":0,"k":[240.771,678.51,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.146,2.71],[0,0],[-2.782,-1.392],[0.845,-4.573]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.862,1.098],[5.248,-10.513],[9.862,-5.786],[-4.597,10.513]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.905882352941,0.76862745098,0.635294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[240.771,678.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Layer 25 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[528.62,371.308,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[203.62,421.308,0]}],"ix":2},"a":{"a":0,"k":[243.62,621.308,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.083,-1.656],[1.086,-3.652],[-0.948,-1.497],[1.995,4.799]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.737,-4.121],[-1.951,5.014],[2.971,5.777],[1.741,-4.622]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[243.931,620.926],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Layer 26 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":0,"s":[529.195,374.027,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23,"s":[267.195,363.027,0]}],"ix":2},"a":{"a":0,"k":[307.195,563.027,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"t":21,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.53,-3.666],[-3.731,2.694],[4.834,2.714],[-0.02,-7.021]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.138,14.202],[12.068,-4.482],[-0.238,-14.201],[-12.048,9.454]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[307.185,563.027],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":452,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Layer 27 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":5,"s":[531.161,372.26,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28,"s":[254.161,420.26,0]}],"ix":2},"a":{"a":0,"k":[294.161,620.26,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"t":26,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.02,-0.638],[1.139,-3.97],[-1.229,-1.286],[1.455,3.197]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.549,-3.58],[-0.647,4.218],[2.549,4.121],[1.061,-2.529]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176470588,0.823529411765,0.705882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[294.161,620.013],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":457,"st":5,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Layer 28 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[527.353,375.527,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[291.353,462.527,0]}],"ix":2},"a":{"a":0,"k":[331.353,662.527,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.734,-2.731],[2.259,-0.407],[0,0]],"o":[[0.055,0.509],[0,0],[0,0],[0,0]],"v":[[-2.859,-9.79],[8.767,7.466],[-1.937,9.79],[-8.767,-7.487]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176470588,0.823529411765,0.705882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[331.353,662.527],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Layer 29 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":3,"s":[531.667,373.998,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[300.667,411.998,0]}],"ix":2},"a":{"a":0,"k":[340.667,611.998,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"t":24,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.816,-0.596],[3.462,-6.519],[-1.452,-1.164],[-4.272,1.829]],"o":[[0,0],[0,0],[0,0],[0.099,-0.438]],"v":[[1.78,-7.766],[-8.704,4.398],[0.296,8.363],[8.605,-1.167]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.843137254902,0.662745098039,0.525490196078,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[340.716,611.719],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Layer 30 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[531.518,373.264,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[330.518,407.264,0]}],"ix":2},"a":{"a":0,"k":[370.518,607.264,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.662,1.074],[2.662,-2.892],[-4.311,2.155],[2.195,4.149]],"o":[[0,0],[0,0],[-0.137,-0.627],[0,0]],"v":[[-6.43,-1.697],[-6.43,4.078],[4.96,2.031],[4.234,-4.187]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529481888,0.698039233685,0.400000035763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[371.034,607.318],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Layer 31 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":6,"s":[532.201,371.32,0],"to":[0,0,0],"ti":[0,0,0]},{"t":29,"s":[350.201,411.32,0]}],"ix":2},"a":{"a":0,"k":[390.201,611.32,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":27,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.9,6.443],[-3.123,7.389],[-6.209,-0.695],[5.304,-2.194]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-15.62,2.454],[-0.772,-14.688],[15.62,-7.468],[-3.477,14.688]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[390.201,611.32],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":458,"st":6,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"Layer 32 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[530.63,371.626,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[341.63,478.626,0]}],"ix":2},"a":{"a":0,"k":[381.63,678.626,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.264,-2.354],[-5.92,2.324],[6.028,1.636],[2.162,-0.809]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,7.049],[7.785,-0.795],[0.253,-7.049],[-7.786,1.638]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[381.63,678.626],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Layer 33 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":3,"s":[531.297,372.656,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[415.297,569.656,0]}],"ix":2},"a":{"a":0,"k":[455.297,769.656,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"t":24,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.621,-8.265],[1.25,-5.491],[2.302,-3.169],[7.202,9.261]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.832,-8.851],[8.921,16.185],[-2.55,17.116],[-10.171,-12.195]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[455.84,767.922],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"Layer 34 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[528.416,372.234,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[512.416,528.234,0]}],"ix":2},"a":{"a":0,"k":[552.416,728.234,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.391,0],[0,0],[-1.676,1.106],[1.565,0.275]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.032,1.536],[-0.113,5.147],[4.032,-2.923],[1.707,-5.147]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[552.416,728.234],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"Layer 35 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":5,"s":[529.648,370.553,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28,"s":[648.648,550.553,0]}],"ix":2},"a":{"a":0,"k":[688.648,750.553,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"t":26,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.165,1.75],[0.226,1.104],[0,0],[-2.478,-1.758]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.845,-3.053],[2.778,-5.728],[-4.846,0.682],[-1.844,5.729]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[688.648,750.553],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":457,"st":5,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"Layer 36 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[529.704,372.02,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[608.704,584.02,0]}],"ix":2},"a":{"a":0,"k":[648.704,784.02,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.65,3.558],[1.119,0.138],[0,0],[-2.456,1.788]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.498,-5.464],[-4.693,-4.358],[-1.048,4.912],[4.693,3.676]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[648.704,784.256],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"Layer 37 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[527.884,371.62,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[516.884,447.62,0]}],"ix":2},"a":{"a":0,"k":[556.884,647.62,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.987,-0.162],[0.789,-2.689],[0,0],[3.396,6.743]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.151,1.613],[-12.724,9.893],[11.475,4.682],[10.755,-9.893]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.956862745098,0.862745098039,0.772549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[557.721,647.62],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"Layer 38 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":1,"s":[531.578,373.427,0],"to":[0,0,0],"ti":[0,0,0]},{"t":24,"s":[634.578,265.427,0]}],"ix":2},"a":{"a":0,"k":[588.578,572.427,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":1,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"t":22,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.704,9.592],[-18.955,-8.413],[8.303,-0.09],[6.122,13.381]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.375,-16.725],[20.159,4.228],[1.5,16.724],[-20.159,-8.761]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.956862745098,0.862745098039,0.772549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[588.578,572.427],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":453,"st":1,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"Layer 39 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":0,"s":[530.869,378.542,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23,"s":[654.869,298.542,0]}],"ix":2},"a":{"a":0,"k":[694.869,498.542,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"t":21,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.563,-3.329],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.083,-9.456],[10.386,2.497],[3.952,9.456],[-10.387,-2.792]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.956862745098,0.862745098039,0.772549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[694.869,498.542],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":452,"st":0,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"Layer 40 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":5,"s":[531.36,376.523,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28,"s":[623.36,546.523,0]}],"ix":2},"a":{"a":0,"k":[663.36,746.523,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"t":26,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.853,1.721],[2.297,-3.589],[-0.699,-1.546],[-3.008,0.804]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.474,-7.825],[-7.449,2.533],[-1.964,7.824],[7.449,-0.276]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[663.36,746.523],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":457,"st":5,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"Layer 41 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":3,"s":[536.1,378.913,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[872.1,602.913,0]}],"ix":2},"a":{"a":0,"k":[912.1,802.913,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"t":24,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.444,-3.732],[-8.121,-9.568],[-4.956,0.632],[-0.335,9.164]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-19.251,-19.392],[-0.382,23.123],[19.252,12.247],[4.574,-21.252]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.843137254902,0.662745098039,0.525490196078,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[912.1,802.212],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"Layer 42 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[533.079,374.226,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[795.079,562.226,0]}],"ix":2},"a":{"a":0,"k":[835.079,762.226,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.481,-2.016],[-4.387,-5.169],[-2.677,0.342],[-0.181,4.951]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.4,-10.476],[-0.207,12.492],[10.4,6.616],[2.471,-11.481]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.843137254902,0.662745098039,0.525490196078,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[835.079,761.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"Layer 43 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":3,"s":[530.925,377.129,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[596.925,513.129,0]}],"ix":2},"a":{"a":0,"k":[636.925,713.129,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"t":24,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.948,2.737],[3.655,-5.71],[-1.111,-2.459],[-4.786,1.278]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.118,-12.449],[-11.852,4.03],[-3.125,12.448],[11.852,-0.438]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[636.925,713.129],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"Layer 44 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[535.881,378.689,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[635.881,294.689,0]}],"ix":2},"a":{"a":0,"k":[675.881,494.689,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.677,-3.949],[-7.65,-4.913],[-3.301,1.486],[1.705,6.421]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.686,-9.572],[5.379,15.9],[16.686,4.211],[-0.569,-15.9]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[675.881,494.689],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"Layer 45 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":0,"s":[522.176,377.224,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23,"s":[678.176,381.224,0]}],"ix":2},"a":{"a":0,"k":[718.176,581.224,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"t":21,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.637,-0.434],[0,0],[-0.114,0.228],[0.015,0.252],[1.042,2.2],[2.552,-1.842],[-0.392,-2.013]],"o":[[0,0],[0.211,-0.143],[0.113,-0.225],[-0.147,-2.43],[-1.859,2.56],[-1.71,1.234],[0.123,0.634]],"v":[[-3.973,7.017],[4.458,1.279],[5.002,0.755],[5.092,0.014],[3.287,-7.016],[-3.405,-0.569],[-4.547,2.295]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[718.03,581.224],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":452,"st":0,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"Layer 46 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":5,"s":[530.977,375.176,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28,"s":[824.977,473.176,0]}],"ix":2},"a":{"a":0,"k":[864.977,673.176,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"t":26,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.1,-0.149],[1.296,4.189],[1.546,-1.756],[2.281,-0.519],[0.093,-0.548],[-0.06,-0.195],[-4.069,1.117]],"o":[[-2.439,-3.644],[-1.107,2.061],[-1.547,1.756],[-0.542,0.123],[-0.034,0.2],[1.005,3.248],[1.109,-0.304]],"v":[[8.303,2.511],[2.661,-9.322],[-1.144,-3.444],[-6.959,0.279],[-8.269,1.134],[-8.182,1.732],[-2.948,8.205]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[864.965,673.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":457,"st":5,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"Layer 47 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":4,"s":[529.427,377.665,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[765.427,385.665,0]}],"ix":2},"a":{"a":0,"k":[805.427,585.665,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.135,-0.118],[-3.992,1.813],[1.937,1.312],[0.802,2.198],[0.555,0.023],[0.186,-0.085],[-1.62,-3.896]],"o":[[3.308,-2.878],[-2.184,-0.84],[-1.936,-1.313],[-0.19,-0.522],[-0.203,-0.008],[-3.096,1.406],[0.441,1.062]],"v":[[-1.171,8.311],[9.857,1.224],[3.546,-1.812],[-0.879,-7.111],[-1.892,-8.302],[-2.475,-8.141],[-8.237,-2.133]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.843137254902,0.662745098039,0.525490196078,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[804.794,585.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"Layer 48 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":2,"s":[533.236,376.688,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[775.236,360.688,0]}],"ix":2},"a":{"a":0,"k":[815.236,560.688,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"t":23,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.707,3.207],[-2.572,-2.828],[-5.765,-1.228],[-0.34,-0.309],[0.506,-0.956],[-1.148,-4.701],[0.821,0.397],[2.146,1.37],[3.423,3.489],[-1.65,4.096]],"o":[[-0.168,3.782],[3.922,4.313],[0.453,0.096],[0.807,0.731],[-2.273,4.291],[-0.142,-0.584],[-2.296,-1.11],[-4.14,-2.643],[-2.814,-2.869],[1.847,-4.586]],"v":[[-4.874,-18.751],[0.261,-8.899],[14.265,1.19],[15.542,1.682],[15.304,4.661],[13.542,18.752],[6.981,16.015],[0.311,12.289],[-11.082,3.052],[-14.699,-6.632]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039215686,0.494117647059,0.462745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[814.875,560.688],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":"Layer 49 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.174,"y":1},"o":{"x":0.183,"y":0},"t":0,"s":[531,378.522,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23,"s":[907,360.522,0]}],"ix":2},"a":{"a":0,"k":[947,560.522,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"t":21,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.956,12.203],[-6.444,-5.269],[0,0]],"o":[[0.528,-0.525],[0,0],[0,0],[0,0]],"v":[[-20,2.115],[5.571,-22.383],[20,-3.68],[-5.577,22.383]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.905882352941,0.850980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[947,560.522],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":452,"st":0,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":"Layer 50 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.882},"o":{"x":0.167,"y":0.118},"t":4,"s":[558.676,314.286,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27,"s":[634.676,238.286,0]}],"ix":2},"a":{"a":0,"k":[674.676,438.286,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.501,7.793],[-7.735,1.777],[-3.859,0.297],[-1.715,3.47],[0.049,1.799],[-1.709,6.313],[-1.859,1.096],[-2.139,-0.023],[-4.663,-0.05],[-0.586,0.519],[0.311,1.056],[1.035,7.102],[-5.728,2.192]],"o":[[-1.852,-7.717],[1.501,-7.792],[3.772,-0.866],[3.858,-0.297],[0.798,-1.613],[-0.177,-6.538],[0.564,-2.084],[1.843,-1.086],[4.663,0.05],[0.783,0.009],[0.825,-0.729],[-2.027,-6.885],[-0.885,-6.069],[0,0]],"v":[[-28.522,57.464],[-30.492,33.926],[-15.903,16.798],[-4.33,16.188],[5.434,10.932],[6.343,5.664],[5.157,-13.789],[8.706,-19.01],[14.948,-20.081],[28.937,-19.931],[31.169,-20.461],[31.546,-23.56],[22.137,-42.769],[30.752,-57.464]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9.74,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[674.324,438.286],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14.823,"s":[0]},{"t":27,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.576],"y":[0]},"t":4,"s":[0]},{"t":27,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":4,"op":456,"st":4,"bm":0},{"ddd":0,"ind":48,"ty":4,"nm":"Layer 51 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[504.119,329.839,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[398.119,112.839,0]}],"ix":2},"a":{"a":0,"k":[438.119,312.839,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.07,4.239],[3.567,5.737],[6.33,4.638],[-0.588,4.455],[-1.023,3.303],[2.569,2.313],[4.416,3.509],[-0.311,2.703],[-1.188,2.447]],"o":[[-2.922,-3.071],[-0.11,-6.754],[-4.144,-6.664],[-3.626,-2.656],[0.452,-3.428],[1.023,-3.303],[-4.193,-3.773],[-2.13,-1.694],[0.31,-2.704],[0,0]],"v":[[23.871,45.677],[19.164,34.177],[19.224,14.32],[-1.583,4.347],[-6.63,-7.469],[-3.328,-17.276],[-4.865,-26.965],[-20.99,-30.638],[-23.56,-38.02],[-20.855,-45.677]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705882353,0.772549019608,0.709803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9.74,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[437.997,312.839],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13.823,"s":[0]},{"t":26,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.576],"y":[0]},"t":3,"s":[0]},{"t":26,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":49,"ty":4,"nm":"Layer 52 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[419.532,304.86,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26,"s":[178.532,272.86,0]}],"ix":2},"a":{"a":0,"k":[218.532,472.86,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[11.222,8.497],[3.003,8.579],[8.923,1.732],[4.873,-2.674],[5.738,-2.152],[4.966,3.592],[0.8,4.686],[0.117,4.753],[2.822,8.137],[3.388,1.756],[5.222,-4.436],[6.427,-2.244],[5.837,3.504],[2.3,5.175],[-1.303,10.718]],"o":[[-11.551,-8.045],[-7.247,-5.487],[-3.003,-8.579],[-5.456,-1.059],[-5.372,2.948],[-5.738,2.151],[-3.852,-2.787],[-0.801,-4.686],[-0.211,-8.61],[-1.25,-3.605],[-6.083,-3.153],[-5.188,4.408],[-6.427,2.244],[-4.855,-2.915],[-4.386,-9.865],[0,0]],"v":[[104.737,66.336],[64.583,55.095],[51.879,31.462],[34.738,11.906],[18.833,15.619],[2.725,24.43],[-14.883,23.329],[-21.594,11.152],[-22.225,-3.081],[-26.811,-28.405],[-33.192,-37.564],[-51.414,-31.229],[-68.588,-20.4],[-88.324,-21.574],[-98.694,-34.691],[-103.434,-66.336]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.843137254902,0.662745098039,0.525490196078,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9.74,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[218.096,472.86],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13.823,"s":[0]},{"t":26,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.576],"y":[0]},"t":3,"s":[0]},{"t":26,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":3,"op":455,"st":3,"bm":0},{"ddd":0,"ind":50,"ty":4,"nm":"Layer 53 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":2,"s":[478.924,410.357,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[363.924,548.357,0]}],"ix":2},"a":{"a":0,"k":[403.924,748.357,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.889,-5.399],[6.017,-1.142],[4.813,0.561],[3.178,-3.658],[1.85,-4.22],[6.566,1.224],[5.716,-1.753],[1.438,-3.117],[2.688,-7.247]],"o":[[-1.181,6.009],[-2.89,5.4],[-4.76,0.903],[-4.813,-0.561],[-3.022,3.478],[-2.682,6.117],[-5.877,-1.096],[-3.282,1.007],[-3.238,7.018],[0,0]],"v":[[48.99,-39.221],[43.704,-21.702],[29.932,-10.48],[15.504,-11.502],[2.023,-7.89],[-2.798,4.948],[-19.209,13.631],[-36.388,9.695],[-43.451,16.765],[-48.99,39.221]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.898039215686,0.494117647059,0.462745098039,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9.74,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[403.924,748.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11.883,"s":[0]},{"t":23,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.576],"y":[0]},"t":2,"s":[0]},{"t":23,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":"Layer 54 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":2,"s":[622.747,421.787,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25,"s":[739.747,485.787,0]}],"ix":2},"a":{"a":0,"k":[779.747,685.787,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-15.287,-2.965],[-3.168,-3.605],[-0.789,-6.541],[-1.312,-5.397],[-2.967,-1.991],[-3.832,0.947],[-7.774,1.328],[-4.281,-3.379],[-1.488,-3.745],[-3.467,-5.034],[-5.858,-1.746],[-7.423,2.33]],"o":[[13.242,8.195],[4.712,0.914],[4.351,4.948],[0.665,5.515],[0.845,3.472],[3.278,2.2],[7.657,-1.893],[5.376,-0.919],[3.164,2.497],[2.258,5.681],[3.468,5.034],[7.456,2.222],[0,0]],"v":[[-86.692,-46.736],[-40.887,-40.79],[-28.264,-34.427],[-22.589,-15.833],[-19.62,0.554],[-14.629,9.75],[-3.158,10.357],[19.724,4.377],[35.415,6.774],[41.687,16.938],[49.694,33.391],[63.829,44.513],[86.692,42.202]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.882352941176,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9.74,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[779.747,686.437],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.823,"s":[0]},{"t":25,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.576],"y":[0]},"t":2,"s":[0]},{"t":25,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":2,"op":454,"st":2,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":"Layer 55 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[588.1,320.315,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23,"s":[845.1,226.315,0]}],"ix":2},"a":{"a":0,"k":[885.1,426.315,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.065,3.506],[-0.903,5.292],[2.633,9.474],[2.079,0.645],[0.943,-1.683],[-0.059,-1.928],[-12.632,-3.579],[-3.688,1.388],[-2.089,2.16],[0.175,12.224],[1.982,3.96],[4.424,0.199],[1.229,-1.685],[0.112,-1.652],[-4.324,-6.623],[-7.663,1.957],[-3.075,7.41],[-3.94,8.846],[-9.026,3.508]],"o":[[4.95,2.079],[4.065,-3.506],[1.654,-9.694],[-0.582,-2.097],[-1.842,-0.572],[-0.944,1.682],[0.401,13.124],[3.791,1.074],[2.812,-1.058],[8.498,-8.789],[-0.063,-4.428],[-1.983,-3.96],[-2.084,-0.094],[-0.976,1.338],[-0.535,7.891],[4.324,6.622],[7.773,-1.986],[3.713,-8.944],[3.94,-8.846],[0,0]],"v":[[-55.151,48.28],[-40.144,45.352],[-32.871,31.342],[-36.506,2.321],[-40.037,-2.829],[-44.853,-0.504],[-45.829,5.125],[-25.04,35.496],[-13.419,35.296],[-6.075,30.197],[4.903,-3.807],[2.441,-16.746],[-7.812,-24.186],[-13.368,-21.902],[-14.66,-17.177],[-9.907,5.645],[10.367,14.751],[26.166,-2.223],[35.94,-29.569],[55.151,-50.358]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.941176470588,0.823529411765,0.705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9.74,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[885.1,426.88],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.705,"s":[0]},{"t":27,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.576],"y":[0]},"t":0,"s":[0]},{"t":27,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":452,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment