Просмотр исходного кода

1.修改iOS Apex Mobile Result。

Pen Li 7 лет назад
Родитель
Сommit
6def9ab976
28 измененных файлов с 1273 добавлено и 9 удалено
  1. 148 2
      Apex Mobile/Apex Mobile.xcodeproj/project.pbxproj
  2. 0 2
      Apex Mobile/Apex Mobile/ApexMobileDB.m
  3. 1 1
      Apex Mobile/Apex Mobile/HomeViewController.m
  4. 1 0
      Apex Mobile/Apex Mobile/RANetwork.h
  5. 43 0
      Apex Mobile/Apex Mobile/RANetwork.m
  6. 48 0
      Apex Mobile/Apex Mobile/Result/ApexResult.storyboard
  7. 28 0
      Apex Mobile/Apex Mobile/Result/ApexResultProtocol.h
  8. 22 0
      Apex Mobile/Apex Mobile/Result/ApexResultViewController.h
  9. 127 0
      Apex Mobile/Apex Mobile/Result/ApexResultViewController.m
  10. 20 0
      Apex Mobile/Apex Mobile/Result/Cell/ApexResultDocumentCell.h
  11. 63 0
      Apex Mobile/Apex Mobile/Result/Cell/ApexResultDocumentCell.m
  12. 84 0
      Apex Mobile/Apex Mobile/Result/Cell/ApexResultDocumentCell.xib
  13. 25 0
      Apex Mobile/Apex Mobile/Result/Cell/ApexResultShipCell.h
  14. 152 0
      Apex Mobile/Apex Mobile/Result/Cell/ApexResultShipCell.m
  15. 123 0
      Apex Mobile/Apex Mobile/Result/Cell/ApexResultShipCell.xib
  16. 21 0
      Apex Mobile/Apex Mobile/Result/Model/ApexResultBaseModel.h
  17. 21 0
      Apex Mobile/Apex Mobile/Result/Model/ApexResultBaseModel.m
  18. 18 0
      Apex Mobile/Apex Mobile/Result/Model/ApexResultDocumentModel.h
  19. 17 0
      Apex Mobile/Apex Mobile/Result/Model/ApexResultDocumentModel.m
  20. 21 0
      Apex Mobile/Apex Mobile/Result/Model/ApexResultShipModel.h
  21. 17 0
      Apex Mobile/Apex Mobile/Result/Model/ApexResultShipModel.m
  22. 28 0
      Apex Mobile/Apex Mobile/Result/Presenter/ApexResultPresenter.h
  23. 137 0
      Apex Mobile/Apex Mobile/Result/Presenter/ApexResultPresenter.m
  24. 15 0
      Apex Mobile/Apex Mobile/Result/TableDataSource/ApexResultViewController+TableDataSource.h
  25. 49 0
      Apex Mobile/Apex Mobile/Result/TableDataSource/ApexResultViewController+TableDataSource.m
  26. 15 0
      Apex Mobile/Apex Mobile/Result/TableDelegate/ApexResultViewController+TableDelegate.h
  27. 20 0
      Apex Mobile/Apex Mobile/Result/TableDelegate/ApexResultViewController+TableDelegate.m
  28. 9 4
      Apex Mobile/Apex Mobile/SearchViewController.m

+ 148 - 2
Apex Mobile/Apex Mobile.xcodeproj/project.pbxproj

@@ -16,6 +16,20 @@
 		420F0CA420901C2E005C4690 /* KPIRepeatTapGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 420F0CA320901C2E005C4690 /* KPIRepeatTapGestureRecognizer.m */; };
 		42253C94209C007700879B09 /* AMMapView.m in Sources */ = {isa = PBXBuildFile; fileRef = 42253C93209C007700879B09 /* AMMapView.m */; };
 		42253C98209C3C0F00879B09 /* AMShipMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 42253C97209C3C0F00879B09 /* AMShipMap.m */; };
+		4225E42421E08502009D2364 /* ApexResultViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E42321E08502009D2364 /* ApexResultViewController.m */; };
+		4225E42621E08576009D2364 /* ApexResult.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4225E42521E08576009D2364 /* ApexResult.storyboard */; };
+		4225E42D21E08895009D2364 /* ApexResultViewController+TableDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E42C21E08895009D2364 /* ApexResultViewController+TableDelegate.m */; };
+		4225E43021E088AA009D2364 /* ApexResultViewController+TableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E42F21E088AA009D2364 /* ApexResultViewController+TableDataSource.m */; };
+		4225E43321E08A54009D2364 /* ApexResultShipCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E43221E08A54009D2364 /* ApexResultShipCell.m */; };
+		4225E43521E08A6A009D2364 /* ApexResultShipCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4225E43421E08A6A009D2364 /* ApexResultShipCell.xib */; };
+		4225E43921E08A8C009D2364 /* ApexResultDocumentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E43721E08A8C009D2364 /* ApexResultDocumentCell.m */; };
+		4225E43A21E08A8C009D2364 /* ApexResultDocumentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4225E43821E08A8C009D2364 /* ApexResultDocumentCell.xib */; };
+		4225E43D21E08ACE009D2364 /* ApexResultShipModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E43C21E08ACE009D2364 /* ApexResultShipModel.m */; };
+		4225E44021E08AEF009D2364 /* ApexResultDocumentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E43F21E08AEF009D2364 /* ApexResultDocumentModel.m */; };
+		4225E44321E08B47009D2364 /* ApexResultBaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E44221E08B47009D2364 /* ApexResultBaseModel.m */; };
+		4225E44821E099CB009D2364 /* ApexResultPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E44721E099CB009D2364 /* ApexResultPresenter.m */; };
+		4225E44F21E0A39A009D2364 /* RAProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E44B21E0A39A009D2364 /* RAProgressHUD.m */; };
+		4225E45021E0A39A009D2364 /* UIView+RAConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 4225E44D21E0A39A009D2364 /* UIView+RAConstraint.m */; };
 		4235C30320229F7200A99D04 /* Result.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4235C30220229F7200A99D04 /* Result.xib */; };
 		4235C3052022A60A00A99D04 /* ResultCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4235C3042022A60A00A99D04 /* ResultCell.xib */; };
 		4253900E2079B7C700ECF982 /* KPIPieChartCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4253900C2079B7C700ECF982 /* KPIPieChartCell.m */; };
@@ -211,6 +225,32 @@
 		42253C93209C007700879B09 /* AMMapView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AMMapView.m; sourceTree = "<group>"; };
 		42253C96209C3C0F00879B09 /* AMShipMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AMShipMap.h; sourceTree = "<group>"; };
 		42253C97209C3C0F00879B09 /* AMShipMap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AMShipMap.m; sourceTree = "<group>"; };
+		4225E42221E08502009D2364 /* ApexResultViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultViewController.h; sourceTree = "<group>"; };
+		4225E42321E08502009D2364 /* ApexResultViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultViewController.m; sourceTree = "<group>"; };
+		4225E42521E08576009D2364 /* ApexResult.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = ApexResult.storyboard; sourceTree = "<group>"; };
+		4225E42B21E08895009D2364 /* ApexResultViewController+TableDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ApexResultViewController+TableDelegate.h"; sourceTree = "<group>"; };
+		4225E42C21E08895009D2364 /* ApexResultViewController+TableDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "ApexResultViewController+TableDelegate.m"; sourceTree = "<group>"; };
+		4225E42E21E088AA009D2364 /* ApexResultViewController+TableDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ApexResultViewController+TableDataSource.h"; sourceTree = "<group>"; };
+		4225E42F21E088AA009D2364 /* ApexResultViewController+TableDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "ApexResultViewController+TableDataSource.m"; sourceTree = "<group>"; };
+		4225E43121E08A54009D2364 /* ApexResultShipCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultShipCell.h; sourceTree = "<group>"; };
+		4225E43221E08A54009D2364 /* ApexResultShipCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultShipCell.m; sourceTree = "<group>"; };
+		4225E43421E08A6A009D2364 /* ApexResultShipCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ApexResultShipCell.xib; sourceTree = "<group>"; };
+		4225E43621E08A8C009D2364 /* ApexResultDocumentCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultDocumentCell.h; sourceTree = "<group>"; };
+		4225E43721E08A8C009D2364 /* ApexResultDocumentCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultDocumentCell.m; sourceTree = "<group>"; };
+		4225E43821E08A8C009D2364 /* ApexResultDocumentCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ApexResultDocumentCell.xib; sourceTree = "<group>"; };
+		4225E43B21E08ACE009D2364 /* ApexResultShipModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultShipModel.h; sourceTree = "<group>"; };
+		4225E43C21E08ACE009D2364 /* ApexResultShipModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultShipModel.m; sourceTree = "<group>"; };
+		4225E43E21E08AEF009D2364 /* ApexResultDocumentModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultDocumentModel.h; sourceTree = "<group>"; };
+		4225E43F21E08AEF009D2364 /* ApexResultDocumentModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultDocumentModel.m; sourceTree = "<group>"; };
+		4225E44121E08B47009D2364 /* ApexResultBaseModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultBaseModel.h; sourceTree = "<group>"; };
+		4225E44221E08B47009D2364 /* ApexResultBaseModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultBaseModel.m; sourceTree = "<group>"; };
+		4225E44421E0989D009D2364 /* ApexResultProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultProtocol.h; sourceTree = "<group>"; };
+		4225E44621E099CB009D2364 /* ApexResultPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApexResultPresenter.h; sourceTree = "<group>"; };
+		4225E44721E099CB009D2364 /* ApexResultPresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ApexResultPresenter.m; sourceTree = "<group>"; };
+		4225E44A21E0A39A009D2364 /* RAProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAProgressHUD.h; sourceTree = "<group>"; };
+		4225E44B21E0A39A009D2364 /* RAProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAProgressHUD.m; sourceTree = "<group>"; };
+		4225E44D21E0A39A009D2364 /* UIView+RAConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+RAConstraint.m"; sourceTree = "<group>"; };
+		4225E44E21E0A39A009D2364 /* UIView+RAConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+RAConstraint.h"; sourceTree = "<group>"; };
 		4235C30220229F7200A99D04 /* Result.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Result.xib; path = ../../common/customUI/Result.xib; sourceTree = "<group>"; };
 		4235C3042022A60A00A99D04 /* ResultCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ResultCell.xib; path = ../../common/customUI/ResultCell.xib; sourceTree = "<group>"; };
 		4253900B2079B7C700ECF982 /* KPIPieChartCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPIPieChartCell.h; sourceTree = "<group>"; };
@@ -254,7 +294,7 @@
 		426F397E2033CEE80025C568 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
 		426F39802033D0930025C568 /* ResultCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ResultCell.h; path = ../../common/customUI/ResultCell.h; sourceTree = "<group>"; };
 		426F39812033D0930025C568 /* ResultCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ResultCell.m; path = ../../common/customUI/ResultCell.m; sourceTree = "<group>"; };
-		427994B120300E7300746EDC /* Apex Mobile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Apex Mobile.entitlements"; sourceTree = "<group>"; };
+		427994B120300E7300746EDC /* Apex Mobile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = "Apex Mobile.entitlements"; path = "Apex Mobile/Apex Mobile.entitlements"; sourceTree = "<group>"; };
 		427CF5CF2023F5560041472A /* NewImages.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = NewImages.xcassets; sourceTree = "<group>"; };
 		427CF5DF202452450041472A /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
 		42BB7400208431DA00B9B6E4 /* KPILegendCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPILegendCell.h; sourceTree = "<group>"; };
@@ -567,6 +607,95 @@
 			path = ShipMap;
 			sourceTree = "<group>";
 		};
+		4225E42121E084A4009D2364 /* Result */ = {
+			isa = PBXGroup;
+			children = (
+				4225E44421E0989D009D2364 /* ApexResultProtocol.h */,
+				4225E42221E08502009D2364 /* ApexResultViewController.h */,
+				4225E42321E08502009D2364 /* ApexResultViewController.m */,
+				4225E42521E08576009D2364 /* ApexResult.storyboard */,
+				4225E44521E099B7009D2364 /* Presenter */,
+				4225E42A21E08858009D2364 /* TableDelegate */,
+				4225E42921E0884E009D2364 /* TableDataSource */,
+				4225E42821E085E3009D2364 /* Model */,
+				4225E42721E085CE009D2364 /* Cell */,
+			);
+			path = Result;
+			sourceTree = "<group>";
+		};
+		4225E42721E085CE009D2364 /* Cell */ = {
+			isa = PBXGroup;
+			children = (
+				4225E43121E08A54009D2364 /* ApexResultShipCell.h */,
+				4225E43221E08A54009D2364 /* ApexResultShipCell.m */,
+				4225E43421E08A6A009D2364 /* ApexResultShipCell.xib */,
+				4225E43621E08A8C009D2364 /* ApexResultDocumentCell.h */,
+				4225E43721E08A8C009D2364 /* ApexResultDocumentCell.m */,
+				4225E43821E08A8C009D2364 /* ApexResultDocumentCell.xib */,
+			);
+			path = Cell;
+			sourceTree = "<group>";
+		};
+		4225E42821E085E3009D2364 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				4225E44121E08B47009D2364 /* ApexResultBaseModel.h */,
+				4225E44221E08B47009D2364 /* ApexResultBaseModel.m */,
+				4225E43B21E08ACE009D2364 /* ApexResultShipModel.h */,
+				4225E43C21E08ACE009D2364 /* ApexResultShipModel.m */,
+				4225E43E21E08AEF009D2364 /* ApexResultDocumentModel.h */,
+				4225E43F21E08AEF009D2364 /* ApexResultDocumentModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		4225E42921E0884E009D2364 /* TableDataSource */ = {
+			isa = PBXGroup;
+			children = (
+				4225E42E21E088AA009D2364 /* ApexResultViewController+TableDataSource.h */,
+				4225E42F21E088AA009D2364 /* ApexResultViewController+TableDataSource.m */,
+			);
+			path = TableDataSource;
+			sourceTree = "<group>";
+		};
+		4225E42A21E08858009D2364 /* TableDelegate */ = {
+			isa = PBXGroup;
+			children = (
+				4225E42B21E08895009D2364 /* ApexResultViewController+TableDelegate.h */,
+				4225E42C21E08895009D2364 /* ApexResultViewController+TableDelegate.m */,
+			);
+			path = TableDelegate;
+			sourceTree = "<group>";
+		};
+		4225E44521E099B7009D2364 /* Presenter */ = {
+			isa = PBXGroup;
+			children = (
+				4225E44621E099CB009D2364 /* ApexResultPresenter.h */,
+				4225E44721E099CB009D2364 /* ApexResultPresenter.m */,
+			);
+			path = Presenter;
+			sourceTree = "<group>";
+		};
+		4225E44921E0A39A009D2364 /* HUD */ = {
+			isa = PBXGroup;
+			children = (
+				4225E44A21E0A39A009D2364 /* RAProgressHUD.h */,
+				4225E44B21E0A39A009D2364 /* RAProgressHUD.m */,
+			);
+			name = HUD;
+			path = ../../common/HUD;
+			sourceTree = "<group>";
+		};
+		4225E44C21E0A39A009D2364 /* LayoutConstraint */ = {
+			isa = PBXGroup;
+			children = (
+				4225E44D21E0A39A009D2364 /* UIView+RAConstraint.m */,
+				4225E44E21E0A39A009D2364 /* UIView+RAConstraint.h */,
+			);
+			name = LayoutConstraint;
+			path = ../../common/LayoutConstraint;
+			sourceTree = "<group>";
+		};
 		425390072079B73800ECF982 /* KPI */ = {
 			isa = PBXGroup;
 			children = (
@@ -1024,6 +1153,7 @@
 			isa = PBXGroup;
 			children = (
 				425660DA202015E1002DB0CA /* Launch.storyboard */,
+				427994B120300E7300746EDC /* Apex Mobile.entitlements */,
 				719EF8E618BB839F00EFFF5F /* Apex Mobile */,
 				719EF90B18BB839F00EFFF5F /* Apex MobileTests */,
 				719EF8DF18BB839F00EFFF5F /* Frameworks */,
@@ -1070,7 +1200,9 @@
 		719EF8E618BB839F00EFFF5F /* Apex Mobile */ = {
 			isa = PBXGroup;
 			children = (
-				427994B120300E7300746EDC /* Apex Mobile.entitlements */,
+				4225E44921E0A39A009D2364 /* HUD */,
+				4225E44C21E0A39A009D2364 /* LayoutConstraint */,
+				4225E42121E084A4009D2364 /* Result */,
 				426E8AB4202163EB0073BA5D /* Alert */,
 				425CF089201EB2B500750E32 /* Refresh */,
 				715643B820198A6000B04267 /* new */,
@@ -1307,6 +1439,7 @@
 				719EF8F418BB839F00EFFF5F /* Main_iPhone.storyboard in Resources */,
 				425390212079B99B00ECF982 /* PieChart.xcassets in Resources */,
 				715709BC20215E0000EFE5C5 /* LICENSE in Resources */,
+				4225E43A21E08A8C009D2364 /* ApexResultDocumentCell.xib in Resources */,
 				4253900F2079B7C700ECF982 /* KPIPieChartCell.xib in Resources */,
 				71E0D1D92022AB7E009A08EB /* Result.storyboard in Resources */,
 				715643DE201C1AE600B04267 /* my.json in Resources */,
@@ -1315,6 +1448,7 @@
 				71DA74A818BDDFB5003B46A6 /* about.htm in Resources */,
 				714C39BF19234065004F045B /* Localizable.strings in Resources */,
 				427CF5D02023F5560041472A /* NewImages.xcassets in Resources */,
+				4225E42621E08576009D2364 /* ApexResult.storyboard in Resources */,
 				425660DB202015E1002DB0CA /* Launch.storyboard in Resources */,
 				420DEF2720A1898500720524 /* AMCommHeadCell.xib in Resources */,
 				42BB740B2084737800B9B6E4 /* KPILegendCell.xib in Resources */,
@@ -1324,6 +1458,7 @@
 				71807B9E2021ACE500E1F1DD /* fake_search.json in Resources */,
 				715643B720198A1400B04267 /* Main.storyboard in Resources */,
 				7162546D201C412E009E3A41 /* ShippingStatusCell.xib in Resources */,
+				4225E43521E08A6A009D2364 /* ApexResultShipCell.xib in Resources */,
 				420DEF2C20A1899600720524 /* AMCommContentCell.xib in Resources */,
 				42BB74092084732D00B9B6E4 /* KPICell.xib in Resources */,
 				42BB740720846B4500B9B6E4 /* KPITableCell.xib in Resources */,
@@ -1348,6 +1483,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				715709A620215B5100EFE5C5 /* unzip.c in Sources */,
+				4225E44821E099CB009D2364 /* ApexResultPresenter.m in Sources */,
 				715643D3201ACB1700B04267 /* StaticModeTableViewCell.m in Sources */,
 				718BE8B2190F9D970046EA6A /* MyAutocompleteItemsSource.m in Sources */,
 				71406DCE18C36A52000914C4 /* TableCellBool.m in Sources */,
@@ -1365,7 +1501,10 @@
 				71951E6F18C6A9A5005024BD /* TouchLabel.m in Sources */,
 				71DA6047190A00F600683003 /* FavoritesData.m in Sources */,
 				425CF099201EB2B500750E32 /* UIScrollView+JLRefresh.m in Sources */,
+				4225E44F21E0A39A009D2364 /* RAProgressHUD.m in Sources */,
 				71A01D7C18C9AE97003307A9 /* DetailCellList.m in Sources */,
+				4225E44021E08AEF009D2364 /* ApexResultDocumentModel.m in Sources */,
+				4225E45021E0A39A009D2364 /* UIView+RAConstraint.m in Sources */,
 				71807B9C2021979A00E1F1DD /* DetailCellTracking.m in Sources */,
 				42539029207A159300ECF982 /* KPIButton.m in Sources */,
 				71DA74A618BDDD31003B46A6 /* AboutViewController.m in Sources */,
@@ -1387,13 +1526,16 @@
 				715709AE20215CB000EFE5C5 /* RANetwork.m in Sources */,
 				425390222079B99B00ECF982 /* XYRotatedView.m in Sources */,
 				719EF8FD18BB839F00EFFF5F /* ApexMobileSecondViewController.m in Sources */,
+				4225E44321E08B47009D2364 /* ApexResultBaseModel.m in Sources */,
 				42253C94209C007700879B09 /* AMMapView.m in Sources */,
 				715709BA20215E0000EFE5C5 /* NSString+Base64.m in Sources */,
 				71AE427318C47AF900B8EC3D /* SearchViewController.m in Sources */,
 				715643BE2019AA9B00B04267 /* LoginViewController.m in Sources */,
+				4225E43321E08A54009D2364 /* ApexResultShipCell.m in Sources */,
 				71308AF7191E7B0E0024B2B0 /* MessageDetailItem.m in Sources */,
 				71A565D918C20F5900CDAC07 /* SearchTableAdapter.m in Sources */,
 				719EF8FA18BB839F00EFFF5F /* ApexMobileFirstViewController.m in Sources */,
+				4225E42421E08502009D2364 /* ApexResultViewController.m in Sources */,
 				719BEC1718FFAB7B00DFE987 /* ToolsPanelViewController.m in Sources */,
 				71BA502E1908ED5700D0BD31 /* CellItemHistory.m in Sources */,
 				719A51A518C5A4AF0080C075 /* SimpleGrid.m in Sources */,
@@ -1413,6 +1555,7 @@
 				420F0CA420901C2E005C4690 /* KPIRepeatTapGestureRecognizer.m in Sources */,
 				719EF8F118BB839F00EFFF5F /* AppDelegate.m in Sources */,
 				714C39B81922FEE1004F045B /* NewsDetailViewController.m in Sources */,
+				4225E43921E08A8C009D2364 /* ApexResultDocumentCell.m in Sources */,
 				425CF098201EB2B500750E32 /* JLRefreshBasis.m in Sources */,
 				715643CD2019BC6C00B04267 /* ToolslistViewController.m in Sources */,
 				712A301318CFEF550022E6E6 /* CustomizeFieldViewController.m in Sources */,
@@ -1431,6 +1574,7 @@
 				42BCACCD209AE342009DDA43 /* AMMapAnnotaion.m in Sources */,
 				711DC6B218C30A4800FB1749 /* TableCellEdit.m in Sources */,
 				716027D1204D334A003CA085 /* DetailShareItemProvider.m in Sources */,
+				4225E43021E088AA009D2364 /* ApexResultViewController+TableDataSource.m in Sources */,
 				420DEF3020A189AA00720524 /* AMCommEditCell.m in Sources */,
 				71A01D8218C9BA67003307A9 /* DetailContent.m in Sources */,
 				71A003FC18D680560057CDFD /* RetrievePasswordViewController.m in Sources */,
@@ -1439,6 +1583,7 @@
 				719A51BA18C5AB7B0080C075 /* SimpleGridComponent.m in Sources */,
 				71570996202157A600EFE5C5 /* RAUtils.m in Sources */,
 				715643BB20198A9900B04267 /* RootViewController.m in Sources */,
+				4225E42D21E08895009D2364 /* ApexResultViewController+TableDelegate.m in Sources */,
 				426E8ABA202163EC0073BA5D /* JLPresentationController.m in Sources */,
 				71B7998D2021AE7400F8685E /* MDHTMLLabel.m in Sources */,
 				71E0D1D72022AB7E009A08EB /* FullyShowViewController.m in Sources */,
@@ -1466,6 +1611,7 @@
 				425390232079B99B00ECF982 /* XYPieChartView.m in Sources */,
 				71570999202157BD00EFE5C5 /* RANetworkTaskDelegate.m in Sources */,
 				71A565DF18C212EA00CDAC07 /* Constant.m in Sources */,
+				4225E43D21E08ACE009D2364 /* ApexResultShipModel.m in Sources */,
 				718BE8B0190F9D970046EA6A /* MyAutocompleteView.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 0 - 2
Apex Mobile/Apex Mobile/ApexMobileDB.m

@@ -500,8 +500,6 @@
         }
         
         sqlite3_finalize(statement);
-    } else {
-        DebugLog(@"excute sql:%@ error: %s",sql,sqlite3_errmsg(db));
     }
     
     sqlite3_close(db);

+ 1 - 1
Apex Mobile/Apex Mobile/HomeViewController.m

@@ -442,7 +442,7 @@ typedef enum {
                     [self showMapAnnotaionWithIndexPath:self.iconSelectedIndexPath];
                     [self.shipTableView reloadData];
                     
-                    [self checkDatabase];
+//                    [self checkDatabase];
                     
                 } else {
                     NSString *msg = [json objectForKey:@"err_msg"];

+ 1 - 0
Apex Mobile/Apex Mobile/RANetwork.h

@@ -45,5 +45,6 @@
 + (NSDictionary *)sendEmail:(NSString *)email CC:(NSString *)cc SerialNo:(NSString *)serialNo;
 
 + (NSDictionary *)uploadUserSql:(NSString *)sql;
++ (NSDictionary *)fetchResultParameters:(NSMutableDictionary *)params;
 
 @end

+ 43 - 0
Apex Mobile/Apex Mobile/RANetwork.m

@@ -1389,4 +1389,47 @@
     return resultDic;
 }
 
++ (NSDictionary *)fetchResultParameters:(NSMutableDictionary *)params {
+    
+//    NSData* json=[self get_json:URL_UPLOAD_SQL parameters:params  file:nil];
+//
+//    if (json==nil)
+//    {
+//        return @{
+//                 @"result" : @RESULT_NET_ERROR,
+//                 @"err_msg" : MSG_NET_ERROR
+//                 };
+//    }
+//
+//    NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingMutableLeaves error:nil];
+
+    sleep(2);
+    
+    NSDictionary *item = @{
+                           @"type": @0,
+                           @"title": @"CN - TRANSNATIONAL FOODS LLC.",
+                           @"icon": @"status_ae",
+                           @"serial_no": @"b9a21e6d80e3b78761ecfd35d2a9d123",
+                           @"hbol": @"A1812530804",
+                           @"desc": @"A1812530804(1 containers)",
+                           @"detail": @"Loaded at Relay Port; VNCMT (CAI MEP, VN  2019-01-05)",
+                           @"date": @"12/23/2018 - 02/03/2019",
+                           @"port": @"VNHPH - USORF",
+                           @"transport_stage": @3
+                           };
+    
+    NSMutableArray *arr = [NSMutableArray array];
+    for (int i = 0; i < 20; i++) {
+        [arr addObject:item.copy];
+    }
+    
+    NSDictionary *resultDic = @{
+                                @"result" : @RESULT_TRUE,
+                                @"items" : arr
+                                };
+    
+    return resultDic;
+    
+}
+
 @end

+ 48 - 0
Apex Mobile/Apex Mobile/Result/ApexResult.storyboard

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--Apex Result View Controller-->
+        <scene sceneID="mJH-ij-ztc">
+            <objects>
+                <viewController storyboardIdentifier="ApexResultViewController" automaticallyAdjustsScrollViewInsets="NO" useStoryboardIdentifierAsRestorationIdentifier="YES" id="uCe-yF-zR4" customClass="ApexResultViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="1gR-6n-IsX">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" contentViewInsetsToSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FRa-E3-EBQ">
+                                <rect key="frame" x="0.0" y="20" width="375" height="647"/>
+                                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <connections>
+                                    <outlet property="dataSource" destination="uCe-yF-zR4" id="XIn-Ee-4Jv"/>
+                                    <outlet property="delegate" destination="uCe-yF-zR4" id="i0z-cu-Och"/>
+                                </connections>
+                            </tableView>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="Obh-UZ-tr1" firstAttribute="bottom" secondItem="FRa-E3-EBQ" secondAttribute="bottom" id="DDY-Ot-WDN"/>
+                            <constraint firstItem="FRa-E3-EBQ" firstAttribute="leading" secondItem="Obh-UZ-tr1" secondAttribute="leading" id="dJE-OG-vQj"/>
+                            <constraint firstItem="Obh-UZ-tr1" firstAttribute="trailing" secondItem="FRa-E3-EBQ" secondAttribute="trailing" id="fQ9-m7-CUF"/>
+                            <constraint firstItem="FRa-E3-EBQ" firstAttribute="top" secondItem="Obh-UZ-tr1" secondAttribute="top" id="ira-PK-3Co"/>
+                        </constraints>
+                        <viewLayoutGuide key="safeArea" id="Obh-UZ-tr1"/>
+                    </view>
+                    <connections>
+                        <outlet property="resultTableView" destination="FRa-E3-EBQ" id="tjw-4v-Lqv"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="Y36-Io-OdU" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-281" y="-102"/>
+        </scene>
+    </scenes>
+</document>

+ 28 - 0
Apex Mobile/Apex Mobile/Result/ApexResultProtocol.h

@@ -0,0 +1,28 @@
+//
+//  ApexResultProtocol.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#ifndef ApexResultProtocol_h
+#define ApexResultProtocol_h
+
+#import <Foundation/Foundation.h>
+
+@protocol ApexResultProtocol <NSObject>
+
+- (void)onStartLoading;
+
+- (void)onStopLoading;
+
+- (void)onNoMoreData;
+
+- (void)onSuccess;
+
+- (void)onFailed:(NSString *)errMsg;
+
+@end
+
+#endif /* ApexResultProtocol_h */

+ 22 - 0
Apex Mobile/Apex Mobile/Result/ApexResultViewController.h

@@ -0,0 +1,22 @@
+//
+//  ApexResultViewController.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@class ApexResultPresenter;
+@interface ApexResultViewController : UIViewController
+
+@property (nonatomic,strong) NSDictionary *params;
+
+@property (nonatomic, readonly, strong) UITableView *tableView;
+@property (nonatomic, readonly, strong) ApexResultPresenter *presenter;
+
++ (instancetype)resultViewController;
+
+@end
+

+ 127 - 0
Apex Mobile/Apex Mobile/Result/ApexResultViewController.m

@@ -0,0 +1,127 @@
+//
+//  ApexResultViewController.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultViewController.h"
+#import "ApexResultProtocol.h"
+#import "ApexResultPresenter.h"
+#import "ApexResultShipCell.h"
+#import "ApexResultDocumentCell.h"
+#import "JLRefreshHeader.h"
+#import "JLRefreshFooter.h"
+#import "RAProgressHUD.h"
+
+@interface ApexResultViewController ()<ApexResultProtocol, JLRefreshDelegate>
+
+@property (nonatomic,weak) JLRefreshBasis *curRefresh;
+@property (nonatomic,weak) RAProgressHUD *curHUD;
+
+@property (nonatomic,strong) IBOutlet UITableView *resultTableView;
+@property (nonatomic,strong) ApexResultPresenter *presenter;
+
+@end
+
+@implementation ApexResultViewController
+
++ (instancetype)resultViewController {
+    
+    ApexResultViewController *vc = [[UIStoryboard storyboardWithName:@"ApexResult" bundle:nil] instantiateViewControllerWithIdentifier:@"ApexResultViewController"];
+    return vc;
+}
+
+#pragma mark - Override
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    [self setupPresenter];
+    [self setupTableView];
+    
+    [self.presenter loadData];
+}
+
+#pragma mark - Setup
+
+- (void)setupPresenter {
+    self.presenter = [[ApexResultPresenter alloc] initWithParameters:self.params];
+    self.presenter.delegate = self;
+}
+
+- (void)setupTableView {
+    
+    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+    self.tableView.tableFooterView = [UIView new];
+    self.tableView.tableHeaderView = [UIView new];
+    
+    [self.tableView registerNib:[UINib nibWithNibName:@"ApexResultShipCell" bundle:nil] forCellReuseIdentifier:ApexResultShipCell.identifier];
+    [self.tableView registerNib:[UINib nibWithNibName:@"ApexResultDocumentCell" bundle:nil] forCellReuseIdentifier:ApexResultDocumentCell.identifier];
+    
+    JLRefreshHeader *header = [[JLRefreshHeader alloc] init];
+    header.refreshDelegate = self;
+    self.tableView.jl_header = header;
+    
+    JLRefreshFooter *footer = [[JLRefreshFooter alloc] init];
+    footer.refreshDelegate = self;
+    self.tableView.jl_footer = footer;
+}
+
+#pragma mark - Getter
+
+- (UITableView *)tableView {
+    return self.resultTableView;
+}
+
+#pragma mark - Presenter Delegate
+
+- (void)onStartLoading {
+    self.curHUD = [RAProgressHUD showHUDOnView:self.view];
+}
+
+- (void)onStopLoading {
+    [self.curHUD dismiss];
+}
+
+- (void)onNoMoreData {
+    [(JLRefreshFooter *)self.tableView.jl_footer noMoreData];
+}
+
+- (void)onSuccess {
+    [self.curRefresh endRefresh];
+    [self.tableView reloadData];
+}
+
+- (void)onFailed:(NSString *)errMsg {
+    [self.curRefresh endRefresh];
+}
+
+#pragma mark - Refresh Delegate
+
+- (void)jl_pullRefresh:(JLRefreshBasis *)refresh state:(JLRefreshState)state percentage:(float)percentage {
+    
+}
+
+- (void)jl_beginRefresh:(JLRefreshBasis *)refresh {
+    
+    self.curRefresh = refresh;
+    if (refresh == self.tableView.jl_header) {
+        
+        [self.presenter refreshData];
+        [(JLRefreshFooter *)self.tableView.jl_footer enableLoadMore];
+        
+    } else if (refresh == self.tableView.jl_footer) {
+        
+        [self.presenter loadMoreData];
+    }
+}
+
+- (void)jl_endRefresh:(JLRefreshBasis *)refresh {
+    
+}
+
+
+@end

+ 20 - 0
Apex Mobile/Apex Mobile/Result/Cell/ApexResultDocumentCell.h

@@ -0,0 +1,20 @@
+//
+//  ApexResultDocumentCell.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface ApexResultDocumentCell : UITableViewCell
+
+@property (nonatomic,class,readonly,copy) NSString *identifier;
+
+- (instancetype)setFileName:(NSString *)fileName;
+- (instancetype)setFileType:(NSString *)fileType;
+- (instancetype)setFileDescription:(NSString *)fileDescription;
+
+@end
+

+ 63 - 0
Apex Mobile/Apex Mobile/Result/Cell/ApexResultDocumentCell.m

@@ -0,0 +1,63 @@
+//
+//  ApexResultDocumentCell.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultDocumentCell.h"
+
+@interface ApexResultDocumentCell ()
+
+@property (nonatomic,strong) IBOutlet UIView *bgView;
+@property (nonatomic,strong) IBOutlet UIImageView *fileIconView;
+@property (nonatomic,strong) IBOutlet UILabel *fileNameLabel;
+@property (nonatomic,strong) IBOutlet UILabel *fileTypeLabel;
+@property (nonatomic,strong) IBOutlet UILabel *fileDescLabel;
+
+@end
+
+@implementation ApexResultDocumentCell
+
+#pragma mark - Override
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    
+    self.bgView.layer.cornerRadius = 5;
+    self.bgView.layer.borderColor = [UIColor darkGrayColor].CGColor;
+    self.bgView.layer.borderWidth = 0.3;
+}
+
+- (void)prepareForReuse {
+    [super prepareForReuse];
+    
+    [[[self setFileName:nil] setFileType:nil] setFileDescLabel:nil];
+}
+
+#pragma mark - Getter
+
++ (NSString *)identifier {
+    return NSStringFromClass(self);
+}
+
+#pragma mark - Setter
+
+- (instancetype)setFileName:(NSString *)fileName {
+    self.fileNameLabel.text = fileName;
+    return self;
+}
+
+- (instancetype)setFileType:(NSString *)fileType {
+    self.fileTypeLabel.text = fileType;
+    return self;
+}
+
+- (instancetype)setFileDescription:(NSString *)fileDescription {
+    self.fileDescLabel.text = fileDescription;
+    return self;
+}
+
+@end

+ 84 - 0
Apex Mobile/Apex Mobile/Result/Cell/ApexResultDocumentCell.xib

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="77" id="KGk-i7-Jjw" customClass="ApexResultDocumentCell">
+            <rect key="frame" x="0.0" y="0.0" width="567" height="77"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="567" height="76.5"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Svu-j8-b5X">
+                        <rect key="frame" x="5" y="15" width="557" height="61.5"/>
+                        <subviews>
+                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="HhT-58-RDI">
+                                <rect key="frame" x="10" y="10" width="48" height="48"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="48" id="OT1-ho-dUl"/>
+                                    <constraint firstAttribute="height" constant="48" id="ZYj-Zo-VVw"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="File:2018" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yj3-N6-PFN">
+                                <rect key="frame" x="66" y="10" width="69.5" height="20.5"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="desc" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xwz-QR-e6d">
+                                <rect key="frame" x="66" y="35.5" width="486" height="21"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="F/L" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cse-Lk-XCd">
+                                <rect key="frame" x="528.5" y="10" width="23.5" height="21"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="yj3-N6-PFN" firstAttribute="top" secondItem="HhT-58-RDI" secondAttribute="top" id="ETb-Fk-maQ"/>
+                            <constraint firstItem="HhT-58-RDI" firstAttribute="leading" secondItem="Svu-j8-b5X" secondAttribute="leading" constant="10" id="GRY-d1-2AW"/>
+                            <constraint firstItem="Xwz-QR-e6d" firstAttribute="top" secondItem="yj3-N6-PFN" secondAttribute="bottom" constant="5" id="Gbx-SF-0JX"/>
+                            <constraint firstItem="Xwz-QR-e6d" firstAttribute="trailing" secondItem="cse-Lk-XCd" secondAttribute="trailing" id="KRO-9i-gn2"/>
+                            <constraint firstAttribute="trailing" secondItem="cse-Lk-XCd" secondAttribute="trailing" constant="5" id="LYl-CQ-Yk4"/>
+                            <constraint firstItem="yj3-N6-PFN" firstAttribute="leading" secondItem="HhT-58-RDI" secondAttribute="trailing" constant="8" id="V44-zJ-Elx"/>
+                            <constraint firstAttribute="bottom" secondItem="Xwz-QR-e6d" secondAttribute="bottom" constant="5" id="VtG-qu-Yic"/>
+                            <constraint firstItem="Xwz-QR-e6d" firstAttribute="leading" secondItem="yj3-N6-PFN" secondAttribute="leading" id="csQ-or-l7X"/>
+                            <constraint firstItem="HhT-58-RDI" firstAttribute="top" secondItem="Svu-j8-b5X" secondAttribute="top" constant="10" id="hTL-HJ-cvG"/>
+                            <constraint firstItem="cse-Lk-XCd" firstAttribute="centerY" secondItem="yj3-N6-PFN" secondAttribute="centerY" id="xYq-7t-jSb"/>
+                        </constraints>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="Svu-j8-b5X" secondAttribute="trailing" constant="5" id="038-oe-vzS"/>
+                    <constraint firstAttribute="bottom" secondItem="Svu-j8-b5X" secondAttribute="bottom" id="FGC-lz-39l"/>
+                    <constraint firstItem="Svu-j8-b5X" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="15" id="mQO-kq-9rQ"/>
+                    <constraint firstItem="Svu-j8-b5X" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="5" id="vIH-Nc-MIV"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <connections>
+                <outlet property="bgView" destination="Svu-j8-b5X" id="3qM-ZG-hns"/>
+                <outlet property="fileDescLabel" destination="Xwz-QR-e6d" id="df1-Gl-sU4"/>
+                <outlet property="fileIconView" destination="HhT-58-RDI" id="IwC-6T-CoK"/>
+                <outlet property="fileNameLabel" destination="yj3-N6-PFN" id="yCI-Lv-Okk"/>
+                <outlet property="fileTypeLabel" destination="cse-Lk-XCd" id="DEF-t9-k60"/>
+            </connections>
+            <point key="canvasLocation" x="-178.40000000000001" y="56.221889055472268"/>
+        </tableViewCell>
+    </objects>
+</document>

+ 25 - 0
Apex Mobile/Apex Mobile/Result/Cell/ApexResultShipCell.h

@@ -0,0 +1,25 @@
+//
+//  ApexResultShipCell.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface ApexResultShipCell : UITableViewCell
+
+@property (nonatomic,class,readonly,copy) NSString *identifier;
+
+- (instancetype)setTitle:(NSString *)title;
+- (instancetype)setPort:(NSString *)port;
+- (instancetype)setTime:(NSString *)time;
+- (instancetype)setDescription:(NSString *)desc;
+- (instancetype)setDetail:(NSString *)detail;
+- (instancetype)setIcon:(NSString *)icon;
+- (instancetype)setTransportStage:(NSInteger)stage;
+- (instancetype)setIconSelect:(BOOL)select;
+
+@end
+

+ 152 - 0
Apex Mobile/Apex Mobile/Result/Cell/ApexResultShipCell.m

@@ -0,0 +1,152 @@
+//
+//  ApexResultShipCell.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultShipCell.h"
+#import "const.h"
+
+@interface ApexResultShipCell ()
+
+@property (strong, nonatomic) IBOutlet UIView *bgView;
+@property (strong, nonatomic) IBOutlet UILabel *titleLabel;
+@property (strong, nonatomic) IBOutlet UILabel *portLabel;
+@property (strong, nonatomic) IBOutlet UILabel *timeLabel;
+@property (strong, nonatomic) IBOutlet UIImageView *iconView;
+@property (strong, nonatomic) IBOutlet UILabel *descLabel;
+@property (strong, nonatomic) IBOutlet UILabel *detailLabel;
+@property (strong, nonatomic) IBOutlet UIView *transportStageView;
+
+@end
+
+@implementation ApexResultShipCell
+
+#pragma mark - Override
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    
+    self.iconView.tintColor=UIColorFromRGB(0x1e7ffb);
+    
+    self.bgView.layer.cornerRadius = 5;
+    self.bgView.layer.borderColor = [UIColor darkGrayColor].CGColor;
+    self.bgView.layer.borderWidth = 0.3;
+    
+    self.titleLabel.textColor = [UIColor colorWithRed:53 / 255.0 green:53 / 255.0 blue:55 / 255.0 alpha:1.0];
+    self.portLabel.textColor = [UIColor colorWithRed:168 / 255.0 green:9 / 255.0 blue:26 / 255.0 alpha:1.0];
+    self.timeLabel.textColor = [UIColor colorWithRed:168 / 255.0 green:9 / 255.0 blue:26 / 255.0 alpha:1.0];
+    self.descLabel.textColor = [UIColor colorWithRed:53 / 255.0 green:53 / 255.0 blue:55 / 255.0 alpha:1.0];
+}
+
+- (void)prepareForReuse {
+    [super prepareForReuse];
+    
+    [[[[[[[self setTitle:nil] setPort:nil] setTime:nil] setDescription:nil] setDetail:nil] setIcon:nil] setIconSelect:NO];
+}
+
+#pragma mark - Getter
+
++ (NSString *)identifier {
+    return NSStringFromClass(self);
+}
+
+#pragma mark - Setter
+
+- (instancetype)setTitle:(NSString *)title{
+    self.titleLabel.text = title;
+    return self;
+}
+
+- (instancetype)setPort:(NSString *)port{
+    self.portLabel.text = port;
+    return self;
+}
+
+- (instancetype)setTime:(NSString *)time {
+    self.timeLabel.text = time;
+    return self;
+}
+
+- (instancetype)setDescription:(NSString *)desc {
+    self.descLabel.text = desc;
+    return self;
+}
+
+- (instancetype)setDetail:(NSString *)detail {
+    self.detailLabel.text = detail;
+    return self;
+}
+
+- (instancetype)setIcon:(NSString *)icon {
+    
+    if (icon) {
+        self.iconView.image = [[UIImage imageNamed:icon] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    } else {
+        self.iconView.image = nil;
+    }
+    
+    return self;
+}
+
+- (instancetype)setTransportStage:(NSInteger)stage {
+    
+    UIColor *stageColor;
+    switch (stage) {
+        case 0: {
+            stageColor = [UIColor colorWithRed:0.2 green:0.14 blue:0.12 alpha:1.0];
+        }
+            break;
+        case 1: {
+            stageColor = [UIColor colorWithRed:0.13 green:0.8 blue:0.8 alpha:1.0];
+        }
+            break;
+        case 2: {
+            stageColor = [UIColor colorWithRed:0.25 green:0.13 blue:0.64 alpha:1.0];
+        }
+            break;
+        case 3: {
+            stageColor = [UIColor colorWithRed:8 / 255.0 green:115 / 255.0 blue:3 / 255.0 alpha:1.0];
+        }
+            break;
+        default: {
+            stageColor = [UIColor colorWithRed:0.2 green:0.14 blue:0.12 alpha:1.0];
+        }
+            break;
+    }
+    
+    self.transportStageView.backgroundColor = stageColor;
+    
+    return self;
+}
+
+- (instancetype)setIconSelect:(BOOL)select {
+    if (select) {
+        
+        CGFloat w = CGRectGetWidth(self.iconView.bounds);
+        CGFloat h = CGRectGetHeight(self.iconView.bounds);
+        CGFloat r = MIN(w, h) * 0.5;
+        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.iconView.bounds cornerRadius:r];
+        CAShapeLayer *mask = [CAShapeLayer layer];
+        mask.lineWidth = 1.0f;
+        mask.strokeColor = [UIColor redColor].CGColor;
+        mask.fillColor = [UIColor clearColor].CGColor;
+        mask.path = path.CGPath;
+        mask.name = @"am_mask";
+        [self.iconView.layer addSublayer:mask];
+        
+    } else {
+        NSMutableArray *mArr = [self.iconView.layer.sublayers mutableCopy];
+        for (CALayer *layer in mArr) {
+            if ([layer isKindOfClass:[CAShapeLayer class]] && [layer.name isEqualToString:@"am_mask"]) {
+                [layer removeFromSuperlayer];
+            }
+        }
+    }
+    return self;
+}
+
+@end

+ 123 - 0
Apex Mobile/Apex Mobile/Result/Cell/ApexResultShipCell.xib

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="ApexResultShipCell" rowHeight="125" id="vcS-48-yoE" customClass="ApexResultShipCell">
+            <rect key="frame" x="0.0" y="0.0" width="509" height="125"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="vcS-48-yoE" id="nD1-ge-9uU">
+                <rect key="frame" x="0.0" y="0.0" width="509" height="124.5"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jA8-fC-h7s">
+                        <rect key="frame" x="5" y="15" width="499" height="109.5"/>
+                        <subviews>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fBc-k7-nZ6">
+                                <rect key="frame" x="494" y="0.0" width="5" height="109.5"/>
+                                <color key="backgroundColor" red="0.0" green="0.56031829119999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="5" id="h51-7L-57Y"/>
+                                </constraints>
+                            </view>
+                        </subviews>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="fBc-k7-nZ6" firstAttribute="top" secondItem="jA8-fC-h7s" secondAttribute="top" id="Hej-Ll-Lrf"/>
+                            <constraint firstAttribute="bottom" secondItem="fBc-k7-nZ6" secondAttribute="bottom" id="PAf-I4-Tpk"/>
+                            <constraint firstAttribute="trailing" secondItem="fBc-k7-nZ6" secondAttribute="trailing" id="WZw-vk-WQc"/>
+                        </constraints>
+                    </view>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="315 Status" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SGR-cH-Y5N">
+                        <rect key="frame" x="15" y="25" width="474" height="21"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="21" id="0F8-MY-RjE"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                        <nil key="textColor"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9Zb-9h-ZJ4">
+                        <rect key="frame" x="15" y="68.5" width="48" height="48"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="48" id="bZp-fY-iHu"/>
+                            <constraint firstAttribute="height" constant="48" id="p76-r4-pia"/>
+                        </constraints>
+                    </imageView>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="latest update information shows here include location, status, time, etc" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2AF-jo-nwv">
+                        <rect key="frame" x="71" y="91.5" width="418" height="29"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="29" id="8WG-hY-Ry4"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                        <color key="textColor" red="0.36078431370000003" green="0.38823529410000002" blue="0.4039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="A1801380001 (5 containers)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="U0n-B3-eyH">
+                        <rect key="frame" x="71" y="68.5" width="418" height="18"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="18" id="2ZM-N2-gcr"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                        <nil key="textColor"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="12/09/2017 - 01/20/2018" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="T93-aV-Yz8">
+                        <rect key="frame" x="15" y="49" width="140" height="14.5"/>
+                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                        <nil key="textColor"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="CNTAO - USLAX" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OaR-bd-7Dx">
+                        <rect key="frame" x="395.5" y="49" width="93.5" height="14.5"/>
+                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                        <nil key="textColor"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="SGR-cH-Y5N" firstAttribute="top" secondItem="nD1-ge-9uU" secondAttribute="top" constant="25" id="ETw-1m-e0X"/>
+                    <constraint firstItem="9Zb-9h-ZJ4" firstAttribute="top" secondItem="T93-aV-Yz8" secondAttribute="bottom" constant="5" id="JDc-Xc-ZO6"/>
+                    <constraint firstItem="OaR-bd-7Dx" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="T93-aV-Yz8" secondAttribute="trailing" priority="999" constant="5" id="JLf-22-nEA"/>
+                    <constraint firstItem="jA8-fC-h7s" firstAttribute="leading" secondItem="nD1-ge-9uU" secondAttribute="leading" constant="5" id="M4C-gD-AVZ"/>
+                    <constraint firstAttribute="bottom" secondItem="jA8-fC-h7s" secondAttribute="bottom" id="QQt-at-F1R"/>
+                    <constraint firstItem="T93-aV-Yz8" firstAttribute="leading" secondItem="SGR-cH-Y5N" secondAttribute="leading" id="Rkg-85-GOO"/>
+                    <constraint firstItem="jA8-fC-h7s" firstAttribute="top" secondItem="nD1-ge-9uU" secondAttribute="top" constant="15" id="WeI-t0-0Jx"/>
+                    <constraint firstItem="OaR-bd-7Dx" firstAttribute="top" secondItem="T93-aV-Yz8" secondAttribute="top" id="YTx-T3-dqC"/>
+                    <constraint firstItem="jA8-fC-h7s" firstAttribute="trailing" secondItem="SGR-cH-Y5N" secondAttribute="trailing" constant="15" id="ZeL-X8-uUx"/>
+                    <constraint firstItem="jA8-fC-h7s" firstAttribute="trailing" secondItem="2AF-jo-nwv" secondAttribute="trailing" constant="15" id="axs-u1-k3f"/>
+                    <constraint firstItem="T93-aV-Yz8" firstAttribute="top" secondItem="SGR-cH-Y5N" secondAttribute="bottom" constant="3" id="d0F-rH-Y6e"/>
+                    <constraint firstItem="jA8-fC-h7s" firstAttribute="trailing" secondItem="U0n-B3-eyH" secondAttribute="trailing" constant="15" id="gIE-Rg-WQv"/>
+                    <constraint firstAttribute="trailing" secondItem="jA8-fC-h7s" secondAttribute="trailing" constant="5" id="hLc-0A-Bf5"/>
+                    <constraint firstItem="U0n-B3-eyH" firstAttribute="leading" secondItem="9Zb-9h-ZJ4" secondAttribute="trailing" constant="8" id="j4J-aH-RiF"/>
+                    <constraint firstItem="2AF-jo-nwv" firstAttribute="top" secondItem="U0n-B3-eyH" secondAttribute="bottom" constant="5" id="jSk-Ng-aQs"/>
+                    <constraint firstItem="SGR-cH-Y5N" firstAttribute="leading" secondItem="nD1-ge-9uU" secondAttribute="leading" constant="15" id="lGz-Gy-bbZ"/>
+                    <constraint firstItem="U0n-B3-eyH" firstAttribute="top" secondItem="9Zb-9h-ZJ4" secondAttribute="top" id="rq8-bp-387"/>
+                    <constraint firstItem="9Zb-9h-ZJ4" firstAttribute="leading" secondItem="nD1-ge-9uU" secondAttribute="leading" constant="15" id="vHR-Su-rWV"/>
+                    <constraint firstItem="2AF-jo-nwv" firstAttribute="leading" secondItem="9Zb-9h-ZJ4" secondAttribute="trailing" constant="8" id="vyS-GR-JkW"/>
+                    <constraint firstItem="jA8-fC-h7s" firstAttribute="trailing" secondItem="OaR-bd-7Dx" secondAttribute="trailing" constant="15" id="x6P-JE-qGe"/>
+                    <constraint firstItem="OaR-bd-7Dx" firstAttribute="height" secondItem="T93-aV-Yz8" secondAttribute="height" id="zcl-fL-KyD"/>
+                </constraints>
+            </tableViewCellContentView>
+            <connections>
+                <outlet property="bgView" destination="jA8-fC-h7s" id="8OX-IT-3D9"/>
+                <outlet property="descLabel" destination="U0n-B3-eyH" id="pPn-tT-L4X"/>
+                <outlet property="detailLabel" destination="2AF-jo-nwv" id="qxV-Mf-Ze5"/>
+                <outlet property="iconView" destination="9Zb-9h-ZJ4" id="Nyh-fL-eGP"/>
+                <outlet property="portLabel" destination="OaR-bd-7Dx" id="ibd-v1-IgF"/>
+                <outlet property="timeLabel" destination="T93-aV-Yz8" id="vHT-Da-cbm"/>
+                <outlet property="titleLabel" destination="SGR-cH-Y5N" id="AAH-VR-vQX"/>
+                <outlet property="transportStageView" destination="fBc-k7-nZ6" id="jYF-QJ-BUl"/>
+            </connections>
+            <point key="canvasLocation" x="271.19999999999999" y="-485.75712143928041"/>
+        </tableViewCell>
+    </objects>
+</document>

+ 21 - 0
Apex Mobile/Apex Mobile/Result/Model/ApexResultBaseModel.h

@@ -0,0 +1,21 @@
+//
+//  ApexResultBaseModel.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSUInteger, ApexResultType) {
+    ApexResultTypeShip,
+    ApexResultTypeDocument
+};
+
+@interface ApexResultBaseModel : NSObject
+
+@property (nonatomic,assign) ApexResultType type;
+@property (nonatomic, readonly, assign) CGFloat height;
+
+@end

+ 21 - 0
Apex Mobile/Apex Mobile/Result/Model/ApexResultBaseModel.m

@@ -0,0 +1,21 @@
+//
+//  ApexResultBaseModel.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultBaseModel.h"
+
+@implementation ApexResultBaseModel
+
+- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
+    
+}
+
+- (CGFloat)height {
+    return 0;
+}
+
+@end

+ 18 - 0
Apex Mobile/Apex Mobile/Result/Model/ApexResultDocumentModel.h

@@ -0,0 +1,18 @@
+//
+//  ApexResultDocumentModel.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultBaseModel.h"
+
+@interface ApexResultDocumentModel : ApexResultBaseModel
+
+@property (nonatomic,copy) NSString *fileName;
+@property (nonatomic,copy) NSString *fileType;
+@property (nonatomic,copy) NSString *fileDesc;
+
+@end
+

+ 17 - 0
Apex Mobile/Apex Mobile/Result/Model/ApexResultDocumentModel.m

@@ -0,0 +1,17 @@
+//
+//  ApexResultDocumentModel.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultDocumentModel.h"
+
+@implementation ApexResultDocumentModel
+
+- (CGFloat)height {
+    return 77.0f;
+}
+
+@end

+ 21 - 0
Apex Mobile/Apex Mobile/Result/Model/ApexResultShipModel.h

@@ -0,0 +1,21 @@
+//
+//  ApexResultShipModel.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultBaseModel.h"
+
+@interface ApexResultShipModel : ApexResultBaseModel
+
+@property (nonatomic,copy) NSString *title;
+@property (nonatomic,copy) NSString *icon;
+@property (nonatomic,copy) NSString *desc;
+@property (nonatomic,copy) NSString *detail;
+@property (nonatomic,copy) NSString *date;
+@property (nonatomic,copy) NSString *port;
+@property (nonatomic,strong) NSNumber *transport_stage;
+
+@end

+ 17 - 0
Apex Mobile/Apex Mobile/Result/Model/ApexResultShipModel.m

@@ -0,0 +1,17 @@
+//
+//  ApexResultShipModel.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultShipModel.h"
+
+@implementation ApexResultShipModel
+
+- (CGFloat)height {
+    return 125.0f;
+}
+
+@end

+ 28 - 0
Apex Mobile/Apex Mobile/Result/Presenter/ApexResultPresenter.h

@@ -0,0 +1,28 @@
+//
+//  ApexResultPresenter.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@protocol ApexResultProtocol;
+@class ApexResultBaseModel;
+@interface ApexResultPresenter : NSObject
+
+@property (nonatomic,weak) id<ApexResultProtocol> delegate;
+
+@property (nonatomic,readonly,assign) NSUInteger dataCount;
+
+- (void)loadData;
+- (void)refreshData;
+- (void)loadMoreData;
+
+- (instancetype)initWithParameters:(NSDictionary *)params;
+
+- (ApexResultBaseModel *)resultModelForIndex:(NSInteger)index;
+
+@end
+

+ 137 - 0
Apex Mobile/Apex Mobile/Result/Presenter/ApexResultPresenter.m

@@ -0,0 +1,137 @@
+//
+//  ApexResultPresenter.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultPresenter.h"
+#import "ApexResultProtocol.h"
+#import "ApexResultShipModel.h"
+#import "ApexResultDocumentModel.h"
+#import "RANetwork.h"
+
+typedef NS_ENUM(NSUInteger, ApexResultFetchDataType) {
+    ApexResultFetchDataTypeInitial,
+    ApexResultFetchDataTypeRefresh,
+    ApexResultFetchDataTypeLoadMore
+};
+
+static const NSInteger detal = 20;
+
+@interface ApexResultPresenter ()
+
+@property (nonatomic,strong) NSDictionary *params;
+@property (nonatomic,assign) NSInteger offset;
+@property (nonatomic,strong) NSArray<ApexResultBaseModel *> *dataArray;
+
+@end
+
+@implementation ApexResultPresenter
+
+- (instancetype)initWithParameters:(NSDictionary *)params {
+    if (self = [super init]) {
+        if (params == nil) {
+            params = [NSDictionary dictionary];
+        }
+        self.params = params;
+    }
+    return self;
+}
+
+#pragma mark - Data
+
+- (void)loadData:(ApexResultFetchDataType)option {
+    
+    NSInteger offset = self.offset;
+    if (self.delegate) {
+        [self.delegate onStartLoading];
+    }
+    dispatch_async(dispatch_get_global_queue(0, 0), ^{
+        
+        NSMutableDictionary *params = [self.params mutableCopy];
+        [params setObject:[NSNumber numberWithInteger:offset] forKey:@"offset"];
+        [params setObject:[NSNumber numberWithInteger:detal] forKey:@"limit"];
+        
+        NSDictionary *json = [RANetwork fetchResultParameters:params];
+        int result = [[json objectForKey:@"result"] intValue];
+        if (result == RESULT_TRUE) {
+            
+            NSMutableArray *modelsArr = [NSMutableArray array];
+            if (option == ApexResultFetchDataTypeLoadMore && self.dataArray != nil && self.dataArray.count > 0) {
+                [modelsArr addObjectsFromArray:self.dataArray];
+            }
+            
+            NSArray *items = [json objectForKey:@"items"];
+            for (NSDictionary *item in items) {
+                
+                NSInteger type = [[item objectForKey:@"type"] integerValue];
+                if (type == ApexResultTypeShip) {
+                    
+                    ApexResultShipModel *model = [ApexResultShipModel new];
+                    [model setValuesForKeysWithDictionary:item];
+                    [modelsArr addObject:model];
+                    
+                } else if (type == ApexResultTypeDocument) {
+                    
+                    ApexResultDocumentModel *model = [ApexResultDocumentModel new];
+                    [model setValuesForKeysWithDictionary:item];
+                    [modelsArr addObject:model];
+                }
+                
+            } // for
+            self.offset = modelsArr.count;
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                
+                self.dataArray = [modelsArr copy];
+                if (self.delegate) {
+                    [self.delegate onStopLoading];
+                    [self.delegate onSuccess];
+                    if (items.count < detal) {
+                        [self.delegate onNoMoreData];
+                    }
+                }
+                
+            });
+            
+        } else {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                if (self.delegate) {
+                    [self.delegate onStopLoading];
+                    [self.delegate onFailed:@"Sorry, something is wrong"];
+                }
+            });
+        }
+        
+    });
+}
+
+- (void)loadData {
+    [self loadData:ApexResultFetchDataTypeInitial];
+}
+
+- (void)refreshData {
+    [self loadData:ApexResultFetchDataTypeRefresh];
+}
+
+- (void)loadMoreData {
+    [self loadData:ApexResultFetchDataTypeLoadMore];
+}
+
+#pragma mark - Getter
+
+- (NSUInteger)dataCount {
+    return self.dataArray.count;
+}
+
+- (ApexResultBaseModel *)resultModelForIndex:(NSInteger)index {
+    
+    if (index < 0 || index >= self.dataCount) {
+        return nil;
+    }
+    return self.dataArray[index];
+}
+
+@end

+ 15 - 0
Apex Mobile/Apex Mobile/Result/TableDataSource/ApexResultViewController+TableDataSource.h

@@ -0,0 +1,15 @@
+//
+//  ApexResultViewController+TableDataSource.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultViewController.h"
+
+
+@interface ApexResultViewController (TableDataSource) <UITableViewDataSource>
+
+@end
+

+ 49 - 0
Apex Mobile/Apex Mobile/Result/TableDataSource/ApexResultViewController+TableDataSource.m

@@ -0,0 +1,49 @@
+//
+//  ApexResultViewController+TableDataSource.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultViewController+TableDataSource.h"
+#import "ApexResultShipCell.h"
+#import "ApexResultDocumentCell.h"
+#import "ApexResultShipModel.h"
+#import "ApexResultDocumentModel.h"
+#import "ApexResultPresenter.h"
+
+
+@implementation ApexResultViewController (TableDataSource)
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.presenter.dataCount;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    ApexResultBaseModel *model = [self.presenter resultModelForIndex:indexPath.row];
+    
+    switch (model.type) {
+        case ApexResultTypeShip: {
+            
+            ApexResultShipModel *shipModel = (ApexResultShipModel *)model;
+            ApexResultShipCell *cell = [tableView dequeueReusableCellWithIdentifier:ApexResultShipCell.identifier forIndexPath:indexPath];
+            [[[[[[cell setTitle:shipModel.title] setDetail:shipModel.detail] setIcon:shipModel.icon] setPort:shipModel.port] setTime:shipModel.date] setDescription:shipModel.desc];
+            return cell;
+            
+        }
+            break;
+        case ApexResultTypeDocument: {
+            
+            ApexResultDocumentModel *docModel = (ApexResultDocumentModel *)model;
+            ApexResultDocumentCell *cell = [tableView dequeueReusableCellWithIdentifier:ApexResultDocumentCell.identifier forIndexPath:indexPath];
+            [[[cell setFileName:docModel.fileName] setFileType:docModel.fileType] setFileDescription:docModel.fileDesc];
+            return cell;
+        }
+            break;
+    }
+    
+    return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"defaultCell"];
+}
+
+@end

+ 15 - 0
Apex Mobile/Apex Mobile/Result/TableDelegate/ApexResultViewController+TableDelegate.h

@@ -0,0 +1,15 @@
+//
+//  ApexResultViewController+TableDelegate.h
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultViewController.h"
+
+
+@interface ApexResultViewController (TableDelegate) <UITableViewDelegate>
+
+@end
+

+ 20 - 0
Apex Mobile/Apex Mobile/Result/TableDelegate/ApexResultViewController+TableDelegate.m

@@ -0,0 +1,20 @@
+//
+//  ApexResultViewController+TableDelegate.m
+//  Apex Mobile
+//
+//  Created by Jack on 2019/1/5.
+//  Copyright © 2019 United Software Applications, Inc. All rights reserved.
+//
+
+#import "ApexResultViewController+TableDelegate.h"
+#import "ApexResultBaseModel.h"
+#import "ApexResultPresenter.h"
+
+@implementation ApexResultViewController (TableDelegate)
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    ApexResultBaseModel *model = [self.presenter resultModelForIndex:indexPath.row];
+    return model.height;
+}
+
+@end

+ 9 - 4
Apex Mobile/Apex Mobile/SearchViewController.m

@@ -15,6 +15,7 @@
 #import "TableCellBool.h"
 #import "MyAutocompleteView.h"
 #import "AMResultViewController.h"
+#import "ApexResultViewController.h"
 
 @interface SearchViewController () <UISearchBarDelegate>
 @property (strong,nonatomic) SearchTableAdapter* adapter ;
@@ -497,11 +498,15 @@
 //    resultViewController.params =params;
 //    [self.navigationController pushViewController:resultViewController animated:YES];
     
+    // after 2019.1.5
+    ApexResultViewController *vc = [ApexResultViewController resultViewController];
+    vc.params = params;
+    [self.navigationController pushViewController:vc animated:YES];
     
-    
-    AMResultViewController *resultVC = [[AMResultViewController alloc] initWithNibName:@"Result" bundle:nil];
-    resultVC.params = params;
-    [self.navigationController pushViewController:resultVC animated:YES];
+    // before 2019.1.5
+//    AMResultViewController *resultVC = [[AMResultViewController alloc] initWithNibName:@"Result" bundle:nil];
+//    resultVC.params = params;
+//    [self.navigationController pushViewController:resultVC animated:YES];
     
 //    AMResultViewController *resultVC = [[AMResultViewController alloc] initWithNibName:@"Result" bundle:nil];
 //    [self.navigationController pushViewController:resultVC animated:YES];